@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,78 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Redacted from "effect/Redacted";
5
+ import type { Providers } from "./Providers.ts";
6
+ export interface RegionProps {
7
+ /** Region name. If omitted, generated from the stack, stage and logical ID. Changing it replaces the region. */
8
+ name?: string;
9
+ /** URL of the region's sandbox proxy. */
10
+ proxyUrl?: string;
11
+ /** URL of the region's SSH gateway. */
12
+ sshGatewayUrl?: string;
13
+ /** URL of the region's snapshot manager (image registry). */
14
+ snapshotManagerUrl?: string;
15
+ /** OTLP endpoint the region's runners export to. */
16
+ otelEndpoint?: string;
17
+ /** S3 bucket for Dockerfile build contexts. */
18
+ buildContextBucket?: string;
19
+ /** Region of that bucket. */
20
+ buildContextBucketRegion?: string;
21
+ /** IAM role Daytona assumes to use the bucket. */
22
+ buildContextRoleArn?: string;
23
+ /**
24
+ * Bump a counter to rotate that credential on the next deploy.
25
+ */
26
+ rotate?: {
27
+ proxyApiKey?: number;
28
+ sshGatewayApiKey?: number;
29
+ snapshotManagerCredentials?: number;
30
+ };
31
+ }
32
+ export interface RegionAttributes {
33
+ /** Region ID; what runners, snapshots and sandboxes take. */
34
+ regionId: string;
35
+ /** Region name. */
36
+ name: string;
37
+ /** API key the region's proxy authenticates with. */
38
+ proxyApiKey: Redacted.Redacted<string> | undefined;
39
+ /** API key the region's SSH gateway authenticates with. */
40
+ sshGatewayApiKey: Redacted.Redacted<string> | undefined;
41
+ /** Snapshot manager user name. */
42
+ snapshotManagerUsername: string | undefined;
43
+ /** Snapshot manager password. */
44
+ snapshotManagerPassword: Redacted.Redacted<string> | undefined;
45
+ /** Rotation counters applied. */
46
+ rotated: {
47
+ proxyApiKey: number;
48
+ sshGatewayApiKey: number;
49
+ snapshotManagerCredentials: number;
50
+ };
51
+ }
52
+ export type Region = Resource<"Daytona.Region", RegionProps, RegionAttributes, never, Providers>;
53
+ /**
54
+ * A custom region: your own compute (see {@link Runner}) registered with
55
+ * Daytona, so sandboxes run on machines you operate while Daytona runs
56
+ * the control plane. Needs an organization allowed to bring its own
57
+ * compute.
58
+ *
59
+ * Daytona shows the region's API keys only when they are created or
60
+ * rotated, so alchemy keeps them in state as `Redacted` values. Bump a
61
+ * `rotate` counter to rotate one.
62
+ * @see https://www.daytona.io/docs/en/regions/
63
+ *
64
+ * ### Bringing Your Own Compute
65
+ * **Example:** A region with its own proxy and SSH gateway
66
+ * ```typescript
67
+ * export const Home = Daytona.Region("Home", {
68
+ * proxyUrl: "https://proxy.daytona.example.com",
69
+ * sshGatewayUrl: "ssh.daytona.example.com:2222",
70
+ * });
71
+ * ```
72
+ *
73
+ * @resource
74
+ * @product Region
75
+ */
76
+ export declare const Region: import("alchemy/Resource").ResourceClass<Region>;
77
+ export declare const RegionProvider: () => import("effect/Layer").Layer<Provider.Provider<Region>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | organizations.DaytonaOpContext>;
78
+ //# sourceMappingURL=Region.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Region.d.ts","sources":["../src/Region.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AAGxE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6BAA6B;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnG;AAED,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnD,2DAA2D;IAC3D,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACxD,kCAAkC;IAClC,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,iCAAiC;IACjC,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,iCAAiC;IACjC,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,0BAA0B,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,MAAM,kDAAqC,CAAC;AAiBzD,eAAO,MAAM,cAAc,sKAqIxB,CAAC"}
package/lib/Region.js ADDED
@@ -0,0 +1,169 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
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 Redacted from "effect/Redacted";
8
+ import { isOwnedName, resolveName } from "./internal/Names.js";
9
+ /**
10
+ * A custom region: your own compute (see {@link Runner}) registered with
11
+ * Daytona, so sandboxes run on machines you operate while Daytona runs
12
+ * the control plane. Needs an organization allowed to bring its own
13
+ * compute.
14
+ *
15
+ * Daytona shows the region's API keys only when they are created or
16
+ * rotated, so alchemy keeps them in state as `Redacted` values. Bump a
17
+ * `rotate` counter to rotate one.
18
+ * @see https://www.daytona.io/docs/en/regions/
19
+ *
20
+ * ### Bringing Your Own Compute
21
+ * **Example:** A region with its own proxy and SSH gateway
22
+ * ```typescript
23
+ * export const Home = Daytona.Region("Home", {
24
+ * proxyUrl: "https://proxy.daytona.example.com",
25
+ * sshGatewayUrl: "ssh.daytona.example.com:2222",
26
+ * });
27
+ * ```
28
+ *
29
+ * @resource
30
+ * @product Region
31
+ */
32
+ export const Region = Resource("Daytona.Region");
33
+ const redact = (value) => value === null || value === undefined
34
+ ? undefined
35
+ : Redacted.isRedacted(value)
36
+ ? value
37
+ : Redacted.make(value);
38
+ const getById = (id) => organizations.getRegion({ id }).pipe(Effect.catchTag("RegionNotFound", () => Effect.undefined));
39
+ const findByName = (name) => organizations
40
+ .listAvailableRegions({})
41
+ .pipe(Effect.map((all) => all.find((r) => r.name === name)));
42
+ export const RegionProvider = () => Provider.effect(Region, Effect.succeed({
43
+ stables: ["regionId"],
44
+ list: Effect.fn(function* () {
45
+ const all = yield* organizations.listAvailableRegions({});
46
+ return all
47
+ .filter((r) => r.organizationId)
48
+ .map((r) => ({
49
+ regionId: r.id,
50
+ name: r.name,
51
+ proxyApiKey: undefined,
52
+ sshGatewayApiKey: undefined,
53
+ snapshotManagerUsername: undefined,
54
+ snapshotManagerPassword: undefined,
55
+ rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
56
+ }));
57
+ }),
58
+ diff: Effect.fn(function* ({ id, news, output }) {
59
+ if (!isResolved(news) || output === undefined)
60
+ return undefined;
61
+ const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
62
+ if (name !== output.name)
63
+ return { action: "replace", deleteFirst: true };
64
+ }),
65
+ read: Effect.fn(function* ({ id, olds, output }) {
66
+ const name = yield* resolveName(id, olds?.name, output?.name);
67
+ const found = (output ? yield* getById(output.regionId) : undefined) ?? (yield* findByName(name));
68
+ if (found === undefined)
69
+ return undefined;
70
+ const attrs = output ?? {
71
+ regionId: found.id,
72
+ name: found.name,
73
+ proxyApiKey: undefined,
74
+ sshGatewayApiKey: undefined,
75
+ snapshotManagerUsername: undefined,
76
+ snapshotManagerPassword: undefined,
77
+ rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
78
+ };
79
+ return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
80
+ }),
81
+ reconcile: Effect.fn(function* ({ id, news, output }) {
82
+ const name = yield* resolveName(id, news.name, output?.name);
83
+ const settings = {
84
+ proxyUrl: news.proxyUrl ?? null,
85
+ sshGatewayUrl: news.sshGatewayUrl ?? null,
86
+ snapshotManagerUrl: news.snapshotManagerUrl ?? null,
87
+ otelEndpoint: news.otelEndpoint ?? null,
88
+ buildContextBucket: news.buildContextBucket ?? null,
89
+ buildContextBucketRegion: news.buildContextBucketRegion ?? null,
90
+ buildContextRoleArn: news.buildContextRoleArn ?? null,
91
+ };
92
+ // Observe
93
+ const current = (output ? yield* getById(output.regionId) : undefined) ?? (yield* findByName(name));
94
+ let attrs;
95
+ // Ensure
96
+ if (current === undefined) {
97
+ const created = yield* organizations.createRegion({ name, ...settings });
98
+ attrs = {
99
+ regionId: created.id,
100
+ name,
101
+ proxyApiKey: redact(created.proxyApiKey),
102
+ sshGatewayApiKey: redact(created.sshGatewayApiKey),
103
+ snapshotManagerUsername: created.snapshotManagerUsername ?? undefined,
104
+ snapshotManagerPassword: redact(created.snapshotManagerPassword),
105
+ rotated: {
106
+ proxyApiKey: news.rotate?.proxyApiKey ?? 0,
107
+ sshGatewayApiKey: news.rotate?.sshGatewayApiKey ?? 0,
108
+ snapshotManagerCredentials: news.rotate?.snapshotManagerCredentials ?? 0,
109
+ },
110
+ };
111
+ }
112
+ else {
113
+ attrs = output ?? {
114
+ regionId: current.id,
115
+ name,
116
+ proxyApiKey: undefined,
117
+ sshGatewayApiKey: undefined,
118
+ snapshotManagerUsername: undefined,
119
+ snapshotManagerPassword: undefined,
120
+ rotated: { proxyApiKey: 0, sshGatewayApiKey: 0, snapshotManagerCredentials: 0 },
121
+ };
122
+ // Sync settings against the observed region.
123
+ const drift = Object.keys(settings).some((k) => (current[k] ?? null) !== settings[k]);
124
+ if (drift)
125
+ yield* organizations.updateRegion({ id: current.id, ...settings });
126
+ }
127
+ // Sync rotations.
128
+ const want = news.rotate ?? {};
129
+ if ((want.proxyApiKey ?? 0) !== attrs.rotated.proxyApiKey) {
130
+ const { apiKey } = yield* organizations.regenerateProxyApiKey({ id: attrs.regionId });
131
+ attrs = {
132
+ ...attrs,
133
+ proxyApiKey: redact(apiKey),
134
+ rotated: { ...attrs.rotated, proxyApiKey: want.proxyApiKey ?? 0 },
135
+ };
136
+ }
137
+ if ((want.sshGatewayApiKey ?? 0) !== attrs.rotated.sshGatewayApiKey) {
138
+ const { apiKey } = yield* organizations.regenerateSshGatewayApiKey({
139
+ id: attrs.regionId,
140
+ });
141
+ attrs = {
142
+ ...attrs,
143
+ sshGatewayApiKey: redact(apiKey),
144
+ rotated: { ...attrs.rotated, sshGatewayApiKey: want.sshGatewayApiKey ?? 0 },
145
+ };
146
+ }
147
+ if ((want.snapshotManagerCredentials ?? 0) !== attrs.rotated.snapshotManagerCredentials) {
148
+ const creds = yield* organizations.regenerateSnapshotManagerCredentials({
149
+ id: attrs.regionId,
150
+ });
151
+ attrs = {
152
+ ...attrs,
153
+ snapshotManagerUsername: creds.username,
154
+ snapshotManagerPassword: redact(creds.password),
155
+ rotated: {
156
+ ...attrs.rotated,
157
+ snapshotManagerCredentials: want.snapshotManagerCredentials ?? 0,
158
+ },
159
+ };
160
+ }
161
+ return attrs;
162
+ }),
163
+ delete: Effect.fn(function* ({ output }) {
164
+ yield* organizations
165
+ .deleteRegion({ id: output.regionId })
166
+ .pipe(Effect.catchTag("RegionNotFound", () => Effect.void));
167
+ }),
168
+ }));
169
+ //# sourceMappingURL=Region.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Region.js","sources":["../src/Region.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import * as registries from "@distilled.cloud/daytona/docker_registry";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import type * as Redacted from "effect/Redacted";
5
+ import type { Providers } from "./Providers.ts";
6
+ export interface RegistryProps {
7
+ /**
8
+ * Registry name in Daytona. If omitted, a unique name is generated from
9
+ * the stack, stage and logical ID.
10
+ */
11
+ name?: string;
12
+ /** Registry host, e.g. `ghcr.io`, `docker.io` or an ECR host. */
13
+ url: string;
14
+ /** User name for the registry. */
15
+ username: string;
16
+ /** Password or access token for the registry. Updated in place. */
17
+ password: string | Redacted.Redacted<string>;
18
+ /** Project or namespace within the registry, if it has them. */
19
+ project?: string;
20
+ /** IAM role Daytona assumes for mTLS to the registry (ECR). */
21
+ mtlsRoleArn?: string;
22
+ /** Secrets Manager ARN holding the mTLS client certificate. */
23
+ mtlsSecretArn?: string;
24
+ }
25
+ export interface RegistryAttributes {
26
+ /** Registry ID. */
27
+ registryId: string;
28
+ /** Registry name. */
29
+ name: string;
30
+ /** Registry host. */
31
+ url: string;
32
+ /** User name. */
33
+ username: string;
34
+ /** Project or namespace. */
35
+ project: string;
36
+ /** `organization`, `internal`, … */
37
+ registryType: string;
38
+ }
39
+ export type Registry = Resource<"Daytona.Registry", RegistryProps, RegistryAttributes, never, Providers, RegistryLookup>;
40
+ /**
41
+ * Props for {@link Registry.lookup}: find a container registry this
42
+ * stack doesn't manage by its name.
43
+ */
44
+ export interface RegistryLookup {
45
+ /** Registry name. */
46
+ name: string;
47
+ }
48
+ /**
49
+ * Credentials for a private container registry, so Daytona can pull
50
+ * private images into a {@link Snapshot}. Daytona picks the registry whose
51
+ * `url` matches the image's host.
52
+ * @see https://www.daytona.io/docs/en/snapshots/#images-from-private-registries
53
+ *
54
+ * ### Pulling a Private Image
55
+ * **Example:** GitHub Container Registry
56
+ * ```typescript
57
+ * export const Ghcr = Daytona.Registry("Ghcr", {
58
+ * url: "ghcr.io",
59
+ * username: "alchemy-run",
60
+ * password: Config.Redacted("GHCR_TOKEN"),
61
+ * });
62
+ *
63
+ * export const Base = Daytona.Snapshot("Base", {
64
+ * image: "ghcr.io/alchemy-run/base:1.0.0",
65
+ * registry: Ghcr,
66
+ * });
67
+ * ```
68
+ *
69
+ * ### Looking up an existing registry
70
+ * `Registry.lookup` references a registry Alchemy doesn't manage (created in
71
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
72
+ * never created, updated or deleted.
73
+ *
74
+ * **Example:** Reference an existing registry
75
+ * ```typescript
76
+ * const ghcr = Daytona.Registry.lookup({ name: "ghcr" });
77
+ * ```
78
+ *
79
+ * @resource
80
+ * @product Registry
81
+ */
82
+ export declare const Registry: import("alchemy/Resource").ResourceClass<Registry>;
83
+ export declare const RegistryProvider: () => import("effect/Layer").Layer<Provider.Provider<Registry>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | registries.DaytonaOpContext>;
84
+ //# sourceMappingURL=Registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.d.ts","sources":["../src/Registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,0CAA0C,CAAC;AAEvE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,mBAAmB;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAC7B,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,SAAS,EACT,cAAc,CACf,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,QAAQ,oDAAyC,CAAC;AAiB/D,eAAO,MAAM,gBAAgB,qKAkD1B,CAAC"}
@@ -0,0 +1,97 @@
1
+ import * as registries from "@distilled.cloud/daytona/docker_registry";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import { isOwnedName, resolveName } from "./internal/Names.js";
7
+ /**
8
+ * Credentials for a private container registry, so Daytona can pull
9
+ * private images into a {@link Snapshot}. Daytona picks the registry whose
10
+ * `url` matches the image's host.
11
+ * @see https://www.daytona.io/docs/en/snapshots/#images-from-private-registries
12
+ *
13
+ * ### Pulling a Private Image
14
+ * **Example:** GitHub Container Registry
15
+ * ```typescript
16
+ * export const Ghcr = Daytona.Registry("Ghcr", {
17
+ * url: "ghcr.io",
18
+ * username: "alchemy-run",
19
+ * password: Config.Redacted("GHCR_TOKEN"),
20
+ * });
21
+ *
22
+ * export const Base = Daytona.Snapshot("Base", {
23
+ * image: "ghcr.io/alchemy-run/base:1.0.0",
24
+ * registry: Ghcr,
25
+ * });
26
+ * ```
27
+ *
28
+ * ### Looking up an existing registry
29
+ * `Registry.lookup` references a registry Alchemy doesn't manage (created in
30
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
31
+ * never created, updated or deleted.
32
+ *
33
+ * **Example:** Reference an existing registry
34
+ * ```typescript
35
+ * const ghcr = Daytona.Registry.lookup({ name: "ghcr" });
36
+ * ```
37
+ *
38
+ * @resource
39
+ * @product Registry
40
+ */
41
+ export const Registry = Resource("Daytona.Registry");
42
+ const toAttributes = (r) => ({
43
+ registryId: r.id,
44
+ name: r.name,
45
+ url: r.url,
46
+ username: r.username,
47
+ project: r.project,
48
+ registryType: r.registryType,
49
+ });
50
+ const getById = (id) => registries.getRegistry({ id }).pipe(Effect.catchTag("RegistryNotFound", () => Effect.undefined));
51
+ const findByName = (name) => registries.listRegistries({}).pipe(Effect.map((all) => all.find((r) => r.name === name)));
52
+ export const RegistryProvider = () => Provider.effect(Registry, Effect.succeed({
53
+ stables: ["registryId"],
54
+ list: Effect.fn(function* () {
55
+ const all = yield* registries.listRegistries({});
56
+ return all.filter((r) => r.registryType === "organization").map(toAttributes);
57
+ }),
58
+ lookup: Effect.fn(function* ({ name }) {
59
+ const found = yield* findByName(name);
60
+ return found === undefined ? undefined : toAttributes(found);
61
+ }),
62
+ read: Effect.fn(function* ({ id, olds, output }) {
63
+ const name = yield* resolveName(id, olds?.name, output?.name);
64
+ const found = (output ? yield* getById(output.registryId) : undefined) ?? (yield* findByName(name));
65
+ if (found === undefined)
66
+ return undefined;
67
+ const attrs = toAttributes(found);
68
+ return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
69
+ }),
70
+ reconcile: Effect.fn(function* ({ id, news, output }) {
71
+ const name = yield* resolveName(id, news.name, output?.name);
72
+ // Observe
73
+ const current = (output ? yield* getById(output.registryId) : undefined) ?? (yield* findByName(name));
74
+ const desired = {
75
+ name,
76
+ url: news.url,
77
+ username: news.username,
78
+ password: news.password,
79
+ project: news.project,
80
+ mtlsRoleArn: news.mtlsRoleArn ?? null,
81
+ mtlsSecretArn: news.mtlsSecretArn ?? null,
82
+ };
83
+ // Ensure
84
+ if (current === undefined) {
85
+ return toAttributes(yield* registries.createRegistry(desired));
86
+ }
87
+ // Sync — the password can't be read back, so every reconcile
88
+ // writes the full registry (updateRegistry is a PATCH of all fields).
89
+ return toAttributes(yield* registries.updateRegistry({ id: current.id, ...desired }));
90
+ }),
91
+ delete: Effect.fn(function* ({ output }) {
92
+ yield* registries
93
+ .deleteRegistry({ id: output.registryId })
94
+ .pipe(Effect.catchTag("RegistryNotFound", () => Effect.void));
95
+ }),
96
+ }));
97
+ //# sourceMappingURL=Registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Registry.js","sources":["../src/Registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import * as runners from "@distilled.cloud/daytona/runners";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Redacted from "effect/Redacted";
6
+ import { type Ref } from "./internal/Ref.ts";
7
+ import type { Providers } from "./Providers.ts";
8
+ /** A region, by id. Accepts a `Daytona.Region` or `{ regionId }`. */
9
+ export type RunnerRegion = {
10
+ readonly regionId: string;
11
+ };
12
+ export interface RunnerProps {
13
+ /** Runner name. If omitted, generated from the stack, stage and logical ID. Changing it replaces the runner. */
14
+ name?: string;
15
+ /** Region the runner serves. Changing it replaces the runner. */
16
+ region: Ref<RunnerRegion>;
17
+ /** Tags the scheduler matches sandboxes against. Changing them replaces the runner. */
18
+ tags?: string[];
19
+ /** Sandbox class the runner hosts. Changing it replaces the runner. */
20
+ sandboxClass?: runners.CreateRunnerSandboxClass;
21
+ /** Stop scheduling new sandboxes on it. Updated in place. @default false */
22
+ unschedulable?: boolean;
23
+ /** Drain it: no new sandboxes, and existing ones move off. Updated in place. @default false */
24
+ draining?: boolean;
25
+ }
26
+ export interface RunnerAttributes {
27
+ /** Runner ID. */
28
+ runnerId: string;
29
+ /** Runner name. */
30
+ name: string;
31
+ /** Region. */
32
+ region: string;
33
+ /** State. */
34
+ state: string;
35
+ /**
36
+ * The key the runner daemon authenticates with. Daytona shows it only at
37
+ * creation, so alchemy keeps it in state as a `Redacted` value.
38
+ */
39
+ apiKey: Redacted.Redacted<string>;
40
+ }
41
+ export type Runner = Resource<"Daytona.Runner", RunnerProps, RunnerAttributes, never, Providers>;
42
+ /**
43
+ * A runner: a machine you operate that hosts sandboxes for a custom
44
+ * {@link Region}. Declaring it registers the runner and mints the API key
45
+ * its daemon uses; you then start the daemon on the machine with that key.
46
+ *
47
+ * ### Registering a Runner
48
+ * **Example:** A runner for a custom region
49
+ * ```typescript
50
+ * export const Box1 = Daytona.Runner("Box1", { region: Home });
51
+ * ```
52
+ *
53
+ * @resource
54
+ * @product Region
55
+ */
56
+ export declare const Runner: import("alchemy/Resource").ResourceConstructor<Runner, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<Runner, never>, never, never> & {
57
+ Self: import("alchemy/Self").Self<Runner>;
58
+ Provider: Provider.Provider<Runner>;
59
+ Aliases: readonly string[] | undefined;
60
+ ref(id: string, options?: {
61
+ stage?: string;
62
+ stack?: string;
63
+ }): Effect.Effect<Runner, never, never>;
64
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<RunnerProps>) => Effect.Effect<Runner, never, Providers>);
65
+ export declare const RunnerProvider: () => import("effect/Layer").Layer<Provider.Provider<Runner>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | runners.DaytonaOpContext>;
66
+ //# sourceMappingURL=Runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Runner.d.ts","sources":["../src/Runner.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;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAChD,4EAA4E;IAC5E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAEjG;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,MAAM;;;;;;;;iIAA2D,CAAC;AAO/E,eAAO,MAAM,cAAc,gKAgGxB,CAAC"}
package/lib/Runner.js ADDED
@@ -0,0 +1,116 @@
1
+ import * as runners from "@distilled.cloud/daytona/runners";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import { deepEqual, 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 Redacted from "effect/Redacted";
8
+ import { declarable } from "./internal/Declared.js";
9
+ import { isOwnedName, resolveName } from "./internal/Names.js";
10
+ import { resolved } from "./internal/Ref.js";
11
+ /**
12
+ * A runner: a machine you operate that hosts sandboxes for a custom
13
+ * {@link Region}. Declaring it registers the runner and mints the API key
14
+ * its daemon uses; you then start the daemon on the machine with that key.
15
+ *
16
+ * ### Registering a Runner
17
+ * **Example:** A runner for a custom region
18
+ * ```typescript
19
+ * export const Box1 = Daytona.Runner("Box1", { region: Home });
20
+ * ```
21
+ *
22
+ * @resource
23
+ * @product Region
24
+ */
25
+ export const Runner = declarable()(Resource("Daytona.Runner"));
26
+ const regionId = (region) => Effect.succeed(resolved(region).regionId);
27
+ const getById = (id) => runners.getRunner({ id }).pipe(Effect.catchTag("RunnerNotFound", () => Effect.undefined));
28
+ export const RunnerProvider = () => Provider.effect(Runner, Effect.succeed({
29
+ stables: ["runnerId", "apiKey"],
30
+ nuke: { dependsOn: [] },
31
+ list: Effect.fn(function* () {
32
+ // Organizations without custom regions aren't served runners at all.
33
+ const all = yield* runners
34
+ .listRunners({})
35
+ .pipe(Effect.catchTag("RunnersUnavailable", () => Effect.succeed([])));
36
+ return all.map((r) => ({
37
+ runnerId: r.id,
38
+ name: r.name,
39
+ region: r.region,
40
+ state: r.state,
41
+ apiKey: Redacted.make(""),
42
+ }));
43
+ }),
44
+ diff: Effect.fn(function* ({ id, olds, news, output }) {
45
+ if (!isResolved(news) || output === undefined)
46
+ return undefined;
47
+ const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
48
+ if (name !== output.name ||
49
+ (yield* regionId(news.region)) !== output.region ||
50
+ !deepEqual(news.tags ?? [], olds?.tags ?? []) ||
51
+ news.sandboxClass !== olds?.sandboxClass) {
52
+ return { action: "replace", deleteFirst: name === output.name };
53
+ }
54
+ }),
55
+ read: Effect.fn(function* ({ id, olds, output }) {
56
+ const name = yield* resolveName(id, olds?.name, output?.name);
57
+ const found = (output ? yield* getById(output.runnerId) : undefined) ??
58
+ (yield* runners.listRunners({})).find((r) => r.name === name);
59
+ if (found === undefined)
60
+ return undefined;
61
+ const attrs = {
62
+ runnerId: found.id,
63
+ name: found.name,
64
+ region: found.region,
65
+ state: found.state,
66
+ apiKey: output?.apiKey ?? Redacted.make(""),
67
+ };
68
+ return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
69
+ }),
70
+ reconcile: Effect.fn(function* ({ id, news, output }) {
71
+ const name = yield* resolveName(id, news.name, output?.name);
72
+ const region = yield* regionId(news.region);
73
+ // Observe
74
+ let current = output ? yield* getById(output.runnerId) : undefined;
75
+ let apiKey = output?.apiKey;
76
+ // Ensure
77
+ if (current === undefined) {
78
+ const created = yield* runners.createRunner({
79
+ regionId: region,
80
+ name,
81
+ tags: news.tags,
82
+ sandboxClass: news.sandboxClass,
83
+ });
84
+ apiKey = Redacted.isRedacted(created.apiKey)
85
+ ? created.apiKey
86
+ : Redacted.make(created.apiKey);
87
+ current = yield* runners.getRunner({ id: created.id });
88
+ }
89
+ // Sync scheduling flags.
90
+ if ((news.unschedulable ?? false) !== current.unschedulable) {
91
+ current = yield* runners.updateRunnerScheduling({
92
+ id: current.id,
93
+ unschedulable: news.unschedulable ?? false,
94
+ });
95
+ }
96
+ if ((news.draining ?? false) !== (current.draining ?? false)) {
97
+ current = yield* runners.updateRunnerDraining({
98
+ id: current.id,
99
+ draining: news.draining ?? false,
100
+ });
101
+ }
102
+ return {
103
+ runnerId: current.id,
104
+ name: current.name,
105
+ region: current.region,
106
+ state: current.state,
107
+ apiKey: apiKey ?? Redacted.make(""),
108
+ };
109
+ }),
110
+ delete: Effect.fn(function* ({ output }) {
111
+ yield* runners
112
+ .deleteRunner({ id: output.runnerId })
113
+ .pipe(Effect.catchTag("RunnerNotFound", () => Effect.void));
114
+ }),
115
+ }));
116
+ //# sourceMappingURL=Runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Runner.js","sources":["../src/Runner.ts"],"names":[],"mappings":"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"}