@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,61 @@
1
+ import { Credentials, DEFAULT_ANALYTICS_BASE_URL, DEFAULT_TOOLBOX_BASE_URL, } from "@distilled.cloud/daytona/Credentials";
2
+ import * as Binding from "alchemy/Binding";
3
+ import * as Output from "alchemy/Output";
4
+ import { createInternalTags } from "alchemy/Tags";
5
+ import * as Effect from "effect/Effect";
6
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
7
+ import * as Layer from "effect/Layer";
8
+ import { ApiKey } from "./ApiKey.js";
9
+ import { toLabels } from "./internal/Labels.js";
10
+ /**
11
+ * Resolve once, when a binding's layer is built: returns a function that
12
+ * mints (at deploy) and reads back (at runtime) an API key for the current
13
+ * host, named after the host and `purpose`, with `permissions`.
14
+ */
15
+ export const makeAccess = Effect.gen(function* () {
16
+ const Key = yield* ApiKey;
17
+ return Effect.fn(function* (purpose, permissions) {
18
+ const host = yield* Binding.Host;
19
+ const key = yield* Key(`${host?.LogicalId ?? ""}${purpose}ApiKey`, { permissions });
20
+ const value = yield* key.value;
21
+ const apiBaseUrl = yield* key.apiBaseUrl;
22
+ const organizationId = yield* key.organizationId;
23
+ const authorize = (effect) => Effect.gen(function* () {
24
+ const config = {
25
+ apiKey: yield* value,
26
+ apiBaseUrl: yield* apiBaseUrl,
27
+ analyticsBaseUrl: DEFAULT_ANALYTICS_BASE_URL,
28
+ toolboxBaseUrl: DEFAULT_TOOLBOX_BASE_URL,
29
+ organizationId: yield* organizationId,
30
+ };
31
+ return yield* effect.pipe(Effect.provide(Layer.mergeAll(Layer.succeed(Credentials, Effect.succeed(config)), FetchHttpClient.layer)));
32
+ });
33
+ return {
34
+ authorize,
35
+ organizationId,
36
+ };
37
+ });
38
+ });
39
+ /**
40
+ * The labels a runtime binding puts on what it creates: the host's
41
+ * `alchemy::stack`, `alchemy::stage` and `alchemy::id`, as Daytona label
42
+ * keys (`alchemy.stack`, `alchemy.stage`, `alchemy.id`; Daytona doesn't
43
+ * accept `::` in a key). Computed at deploy from the host's identity and
44
+ * bound into the host, so the runtime reads them back rather than
45
+ * computing them.
46
+ */
47
+ export const makeOwnerLabels = Effect.gen(function* () {
48
+ const host = yield* Binding.Host;
49
+ const id = host?.LogicalId ?? "";
50
+ const owner = Output.fromEffect(createInternalTags(id));
51
+ const tags = yield* owner.bind(`${id}DaytonaOwner`);
52
+ return Effect.map(tags, (owner) => toLabels(owner));
53
+ });
54
+ /** The owner labels as a description, for objects that only have one. */
55
+ export const ownerDescription = (labels) => `${labels["alchemy.stack"]}/${labels["alchemy.stage"]}/${labels["alchemy.id"]}`;
56
+ /** User labels with the owner labels on top: a user label never overwrites `alchemy.*`. */
57
+ export const withOwnerLabels = (user, owner) => ({
58
+ ...Object.fromEntries(Object.entries(user ?? {}).filter(([k]) => !k.startsWith("alchemy."))),
59
+ ...owner,
60
+ });
61
+ //# sourceMappingURL=DaytonaBindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DaytonaBindings.js","sources":["../src/DaytonaBindings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
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 Effect from "effect/Effect";
5
+ import type * as Redacted from "effect/Redacted";
6
+ import { type OrganizationRef } from "./internal/Organization.ts";
7
+ import { type Ref } from "./internal/Ref.ts";
8
+ import type { RoleRef } from "./OrganizationInvitation.ts";
9
+ import type { Providers } from "./Providers.ts";
10
+ export interface IdentityProviderProps {
11
+ /**
12
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
13
+ * credentials' organization. Changing it replaces the resource.
14
+ */
15
+ organization?: Ref<OrganizationRef>;
16
+ /** Display name. If omitted, generated from the stack, stage and logical ID. */
17
+ name?: string;
18
+ /** OIDC issuer URL. */
19
+ issuerUrl: string;
20
+ /** OIDC client ID. */
21
+ clientId: string;
22
+ /** OIDC client secret. Updated in place. */
23
+ clientSecret: string | Redacted.Redacted<string>;
24
+ /** Scopes to request. @default "openid email profile" */
25
+ scope?: string;
26
+ /** Email domains that sign in through this provider. */
27
+ emailDomains: string[];
28
+ /** Accept any email domain. @default false */
29
+ allowAnyDomain?: boolean;
30
+ /** Trust the provider's `email_verified` claim. @default false */
31
+ trustEmailVerified?: boolean;
32
+ /** Custom roles new members get. */
33
+ defaultRoles?: Ref<RoleRef>[];
34
+ /** Whether sign-in through it is enabled. @default true */
35
+ enabled?: boolean;
36
+ }
37
+ export interface IdentityProviderAttributes {
38
+ /** Identity provider ID. */
39
+ identityProviderId: string;
40
+ /** Organization ID. */
41
+ organizationId: string;
42
+ /** Display name. */
43
+ name: string;
44
+ /** Email domains. */
45
+ emailDomains: string[];
46
+ /** Whether it is enabled. */
47
+ enabled: boolean;
48
+ }
49
+ export type IdentityProvider = Resource<"Daytona.IdentityProvider", IdentityProviderProps, IdentityProviderAttributes, never, Providers>;
50
+ /**
51
+ * An OIDC identity provider for single sign-on into the Daytona
52
+ * organization. Needs an organization with SSO enabled (an enterprise
53
+ * plan); other organizations reject it.
54
+ *
55
+ * ### Single Sign-On
56
+ * **Example:** Sign in with your company's OIDC provider
57
+ * ```typescript
58
+ * export const Sso = Daytona.IdentityProvider("Sso", {
59
+ * issuerUrl: "https://login.example.com",
60
+ * clientId: "daytona",
61
+ * clientSecret: Config.Redacted("OIDC_CLIENT_SECRET"),
62
+ * emailDomains: ["example.com"],
63
+ * defaultRoles: [Developer],
64
+ * });
65
+ * ```
66
+ *
67
+ * @resource
68
+ * @product Organization
69
+ */
70
+ export declare const IdentityProvider: import("alchemy/Resource").ResourceConstructor<IdentityProvider, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<IdentityProvider, never>, never, never> & {
71
+ Self: import("alchemy/Self").Self<IdentityProvider>;
72
+ Provider: Provider.Provider<IdentityProvider>;
73
+ Aliases: readonly string[] | undefined;
74
+ ref(id: string, options?: {
75
+ stage?: string;
76
+ stack?: string;
77
+ }): Effect.Effect<IdentityProvider, never, never>;
78
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<IdentityProviderProps>) => Effect.Effect<IdentityProvider, never, Providers>);
79
+ export declare const IdentityProviderProvider: () => import("effect/Layer").Layer<Provider.Provider<IdentityProvider>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | organizations.DaytonaOpContext>;
80
+ //# sourceMappingURL=IdentityProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProvider.d.ts","sources":["../src/IdentityProvider.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;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjD,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,oCAAoC;IACpC,YAAY,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,4BAA4B;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACrC,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;qJAE5B,CAAC;AAgBF,eAAO,MAAM,wBAAwB,gLA0ElC,CAAC"}
@@ -0,0 +1,111 @@
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 { declarable } from "./internal/Declared.js";
8
+ import { isOwnedName, resolveName } from "./internal/Names.js";
9
+ import { currentOrganizationId, movesOrganization, organizationIdFor, } from "./internal/Organization.js";
10
+ import { resolved } from "./internal/Ref.js";
11
+ /**
12
+ * An OIDC identity provider for single sign-on into the Daytona
13
+ * organization. Needs an organization with SSO enabled (an enterprise
14
+ * plan); other organizations reject it.
15
+ *
16
+ * ### Single Sign-On
17
+ * **Example:** Sign in with your company's OIDC provider
18
+ * ```typescript
19
+ * export const Sso = Daytona.IdentityProvider("Sso", {
20
+ * issuerUrl: "https://login.example.com",
21
+ * clientId: "daytona",
22
+ * clientSecret: Config.Redacted("OIDC_CLIENT_SECRET"),
23
+ * emailDomains: ["example.com"],
24
+ * defaultRoles: [Developer],
25
+ * });
26
+ * ```
27
+ *
28
+ * @resource
29
+ * @product Organization
30
+ */
31
+ export const IdentityProvider = declarable()(Resource("Daytona.IdentityProvider"));
32
+ const toAttributes = (organizationId, p) => ({
33
+ identityProviderId: p.id,
34
+ organizationId,
35
+ name: p.name,
36
+ emailDomains: p.emailDomains,
37
+ enabled: p.enabled,
38
+ });
39
+ const roleIds = (roles) => Effect.succeed((roles ?? []).map((r) => resolved(r).roleId));
40
+ export const IdentityProviderProvider = () => Provider.effect(IdentityProvider, Effect.succeed({
41
+ stables: ["identityProviderId", "organizationId"],
42
+ list: Effect.fn(function* () {
43
+ const organizationId = yield* currentOrganizationId;
44
+ const all = yield* organizations.listOrganizationIdentityProviders({ organizationId });
45
+ return all.map((p) => toAttributes(organizationId, p));
46
+ }),
47
+ diff: Effect.fn(function* ({ news, output }) {
48
+ if (!isResolved(news) || output === undefined)
49
+ return undefined;
50
+ if (yield* movesOrganization(news.organization, output))
51
+ return { action: "replace" };
52
+ }),
53
+ read: Effect.fn(function* ({ id, olds, output }) {
54
+ const organizationId = output?.organizationId ?? (yield* currentOrganizationId);
55
+ const name = yield* resolveName(id, olds?.name, output?.name);
56
+ const all = yield* organizations.listOrganizationIdentityProviders({ organizationId });
57
+ const found = all.find((p) => p.id === output?.identityProviderId) ?? all.find((p) => p.name === name);
58
+ if (found === undefined)
59
+ return undefined;
60
+ const attrs = toAttributes(organizationId, found);
61
+ return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
62
+ }),
63
+ reconcile: Effect.fn(function* ({ id, news, output }) {
64
+ const organizationId = yield* organizationIdFor(news.organization);
65
+ const name = yield* resolveName(id, news.name, output?.name);
66
+ const desired = {
67
+ name,
68
+ emailDomains: news.emailDomains,
69
+ allowAnyDomain: news.allowAnyDomain ?? false,
70
+ trustEmailVerified: news.trustEmailVerified ?? false,
71
+ defaultAssignedRoleIds: yield* roleIds(news.defaultRoles),
72
+ enabled: news.enabled ?? true,
73
+ };
74
+ const oidcConfig = {
75
+ issuerUrl: news.issuerUrl,
76
+ clientId: news.clientId,
77
+ clientSecret: news.clientSecret,
78
+ scope: news.scope,
79
+ };
80
+ // Observe
81
+ const all = yield* organizations.listOrganizationIdentityProviders({ organizationId });
82
+ const current = all.find((p) => p.id === output?.identityProviderId) ?? all.find((p) => p.name === name);
83
+ // Ensure
84
+ if (current === undefined) {
85
+ const created = yield* organizations.createOrganizationIdentityProvider({
86
+ organizationId,
87
+ oidcConfig,
88
+ ...desired,
89
+ });
90
+ return toAttributes(organizationId, created);
91
+ }
92
+ // Sync — the client secret can't be read back, so the full
93
+ // configuration is written on every deploy.
94
+ const updated = yield* organizations.updateOrganizationIdentityProvider({
95
+ organizationId,
96
+ id: current.id,
97
+ oidcConfig,
98
+ ...desired,
99
+ });
100
+ return toAttributes(organizationId, updated);
101
+ }),
102
+ delete: Effect.fn(function* ({ output }) {
103
+ yield* organizations
104
+ .deleteOrganizationIdentityProvider({
105
+ organizationId: output.organizationId,
106
+ id: output.identityProviderId,
107
+ })
108
+ .pipe(Effect.catchTag("IdentityProviderNotFound", () => Effect.void));
109
+ }),
110
+ }));
111
+ //# sourceMappingURL=IdentityProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentityProvider.js","sources":["../src/IdentityProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Layer from "effect/Layer";
5
+ import type { Volume } from "./Volume.ts";
6
+ /**
7
+ * A volume a mount names: a `Daytona.Volume` (or the reference
8
+ * `MountVolume` returns), or a runtime handle from `CreateVolume`.
9
+ */
10
+ export interface MountableVolume {
11
+ readonly volumeId: string | Effect.Effect<string, never, RuntimeContext>;
12
+ }
13
+ /** A volume mounted at a path: an entry of `mounts`. */
14
+ export interface VolumeMount {
15
+ /** The volume. */
16
+ readonly volume: MountableVolume;
17
+ /** Absolute path in the sandbox. */
18
+ readonly path: string;
19
+ /** Mount only this directory of the volume. */
20
+ readonly subpath?: string;
21
+ }
22
+ export interface MountVolumeOptions {
23
+ /** Absolute path in the sandbox. */
24
+ readonly path: string;
25
+ /** Mount only this directory of the volume. */
26
+ readonly subpath?: string;
27
+ }
28
+ /** The volume ID behind a mount entry. */
29
+ export declare const volumeIdOf: (volume: MountableVolume) => Effect.Effect<string, never, RuntimeContext>;
30
+ /**
31
+ * Mount a {@link Volume} at a path.
32
+ *
33
+ * Inside a sandbox's program, the volume is mounted into that sandbox:
34
+ * it joins the sandbox's `mounts`. A mount change replaces the sandbox,
35
+ * since Daytona only mounts volumes when it creates one. Inside any other
36
+ * host (a Worker, a Lambda), the binding resolves the volume and returns a
37
+ * mount reference to pass to `CreateSandbox`'s `create({ mounts })`.
38
+ *
39
+ * The reference has the same fields as a `mounts` entry: `volume`,
40
+ * `path` and `subpath`. Daytona has no per-volume access control, so the
41
+ * binding mints no credentials.
42
+ *
43
+ * ### Mounting a Volume in a Program
44
+ * **Example:** Serve the files of a volume
45
+ * ```typescript
46
+ * export default class Agent extends Daytona.Sandbox<Agent>()(
47
+ * "Agent",
48
+ * { main: import.meta.url, public: true },
49
+ * Effect.gen(function* () {
50
+ * const data = yield* Daytona.MountVolume(Data, { path: "/data" });
51
+ * const fs = yield* FileSystem.FileSystem;
52
+ * return {
53
+ * fetch: Effect.gen(function* () {
54
+ * return yield* HttpServerResponse.json(yield* fs.readDirectory(data.path));
55
+ * }),
56
+ * };
57
+ * }).pipe(Effect.provide(Daytona.MountVolumeLive)),
58
+ * ) {}
59
+ * ```
60
+ *
61
+ * ### Mounting a Volume in Sandboxes You Create
62
+ * **Example:** A shared cache plus each user's home
63
+ * ```typescript
64
+ * const cache = yield* Daytona.MountVolume(Cache, { path: "/cache" });
65
+ * const sandboxes = yield* Daytona.CreateSandbox(Base);
66
+ * const volumes = yield* Daytona.CreateVolume({ prefix: "user-" });
67
+ * return {
68
+ * fetch: Effect.gen(function* () {
69
+ * const home = yield* volumes.getOrCreate({ name: `user-${user}` });
70
+ * const sandbox = yield* sandboxes.create({
71
+ * mounts: [cache, { volume: home, path: "/home/daytona/work" }],
72
+ * });
73
+ * return yield* HttpServerResponse.json(yield* sandbox.exec("ls /cache"));
74
+ * }),
75
+ * };
76
+ * ```
77
+ *
78
+ * @binding
79
+ * @product Volume
80
+ */
81
+ export interface MountVolume extends Binding.Service<MountVolume, "Daytona.MountVolume", (volume: Volume, options: MountVolumeOptions) => Effect.Effect<VolumeMount>> {
82
+ }
83
+ export declare const MountVolume: MountVolume;
84
+ /** {@link MountVolume}; works on any host. */
85
+ export declare const MountVolumeLive: Layer.Layer<MountVolume, never, never>;
86
+ //# sourceMappingURL=MountVolume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MountVolume.d.ts","sources":["../src/MountVolume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAC1E;AAED,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,kBAAkB;IAClB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0CAA0C;AAC1C,eAAO,MAAM,UAAU,WAAY,eAAe,iDACuC,CAAC;AAO1F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,WAAW,WAAY,SAAQ,OAAO,CAAC,OAAO,CAClD,WAAW,EACX,qBAAqB,EACrB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAC5E;CAAG;AAEJ,eAAO,MAAM,WAAW,aAAsD,CAAC;AAE/E,8CAA8C;AAC9C,eAAO,MAAM,eAAe,wCAoB3B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ /** The volume ID behind a mount entry. */
5
+ export const volumeIdOf = (volume) => typeof volume.volumeId === "string" ? Effect.succeed(volume.volumeId) : volume.volumeId;
6
+ const isSandboxHost = (value) => typeof value === "object" &&
7
+ value !== null &&
8
+ value.Type === "Daytona.Sandbox";
9
+ export const MountVolume = Binding.Service("Daytona.MountVolume");
10
+ /** {@link MountVolume}; works on any host. */
11
+ export const MountVolumeLive = Layer.effect(MountVolume, Effect.succeed(Effect.fn(function* (volume, options) {
12
+ const volumeId = yield* volume.volumeId;
13
+ if (!globalThis.__ALCHEMY_RUNTIME__) {
14
+ const host = yield* Binding.Host;
15
+ if (isSandboxHost(host)) {
16
+ yield* host.bind `Daytona.MountVolume(${volume})`({
17
+ mounts: [{ volumeId: volume.volumeId, path: options.path, subpath: options.subpath }],
18
+ });
19
+ }
20
+ }
21
+ return {
22
+ volume: { volumeId },
23
+ path: options.path,
24
+ subpath: options.subpath,
25
+ };
26
+ })));
27
+ //# sourceMappingURL=MountVolume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MountVolume.js","sources":["../src/MountVolume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AA6BtC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAuB,EAAE,EAAE,CACpD,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AAE1F,MAAM,aAAa,GAAG,CAAC,KAAc,EAAoB,EAAE,CACzD,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACb,KAA2B,CAAC,IAAI,KAAK,iBAAiB,CAAC;AA2D1D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAc,qBAAqB,CAAC,CAAC;AAE/E,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CACzC,WAAW,EACX,MAAM,CAAC,OAAO,CACZ,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAc,EAAE,OAA2B;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA,uBAAuB,MAAM,GAAG,CAAC;gBAC/C,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;aACtF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,EAAE,QAAQ,EAAE;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACH,CAAC;AAC1B,CAAC,CAAC,CACH,CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { OAuthCredentials, OAuthError, type DeviceAuthorization } from "alchemy/Auth/OAuthFlow";
2
+ /**
3
+ * The Daytona CLI's public WorkOS client (no secret), published by Daytona's
4
+ * `GET /api/config` under `oidc.cli`. `daytona login` uses the same device
5
+ * flow. A user session can call what an organization API key can't: the
6
+ * organization, role, invitation and API key endpoints.
7
+ */
8
+ export declare const OAUTH_CLIENT_ID = "client_01M392QZWMYD01SA05BPEYQ84V";
9
+ export declare const OAUTH_ENDPOINTS: {
10
+ deviceAuthorization: string;
11
+ token: string;
12
+ };
13
+ export declare const { deviceAuthorize, deviceToken, refresh, usesCurrentClient }: import("alchemy/Auth/OAuthFlow").OAuthClient;
14
+ //# sourceMappingURL=OAuthClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthClient.d.ts","sources":["../src/OAuthClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEhG;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sCAAsC,CAAC;AAEnE,eAAO,MAAM,eAAe;IAC1B,mBAAmB;IACnB,KAAK;CACN,CAAC;AAWF,eAAO,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,8CAAS,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { makeOAuthClient } from "alchemy/Auth/OAuthFlow";
2
+ export { OAuthCredentials, OAuthError } from "alchemy/Auth/OAuthFlow";
3
+ /**
4
+ * The Daytona CLI's public WorkOS client (no secret), published by Daytona's
5
+ * `GET /api/config` under `oidc.cli`. `daytona login` uses the same device
6
+ * flow. A user session can call what an organization API key can't: the
7
+ * organization, role, invitation and API key endpoints.
8
+ */
9
+ export const OAUTH_CLIENT_ID = "client_01M392QZWMYD01SA05BPEYQ84V";
10
+ export const OAUTH_ENDPOINTS = {
11
+ deviceAuthorization: "https://api.auth.daytona.io/user_management/authorize/device",
12
+ token: "https://api.auth.daytona.io/user_management/authenticate",
13
+ };
14
+ const client = makeOAuthClient({
15
+ clientId: OAUTH_CLIENT_ID,
16
+ endpoints: OAUTH_ENDPOINTS,
17
+ auth: { kind: "pkce" },
18
+ // WorkOS answers on api.auth.daytona.io but serves the device page on
19
+ // auth.daytona.io.
20
+ verificationHosts: ["auth.daytona.io"],
21
+ });
22
+ export const { deviceAuthorize, deviceToken, refresh, usesCurrentClient } = client;
23
+ //# sourceMappingURL=OAuthClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthClient.js","sources":["../src/OAuthClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAA4B,MAAM,wBAAwB,CAAC;AAEhG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAEnE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,mBAAmB,EAAE,8DAA8D;IACnF,KAAK,EAAE,0DAA0D;CAClE,CAAC;AAEF,MAAM,MAAM,GAAG,eAAe,CAAC;IAC7B,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACtB,sEAAsE;IACtE,mBAAmB;IACnB,iBAAiB,EAAE,CAAC,iBAAiB,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC"}
@@ -0,0 +1,40 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import type { Providers } from "./Providers.ts";
5
+ export interface OrganizationProps {
6
+ /** Organization name. If omitted, generated from the stack, stage and logical ID. */
7
+ name?: string;
8
+ /**
9
+ * Region new sandboxes go to by default. Daytona sets it once, so changing
10
+ * it replaces the organization.
11
+ */
12
+ defaultRegionId: string;
13
+ }
14
+ export interface OrganizationAttributes {
15
+ /** Organization ID. */
16
+ organizationId: string;
17
+ /** Name. */
18
+ name: string;
19
+ /** Default region. */
20
+ defaultRegionId: string | undefined;
21
+ }
22
+ export type Organization = Resource<"Daytona.Organization", OrganizationProps, OrganizationAttributes, never, Providers>;
23
+ /**
24
+ * A new Daytona organization, owned by the signed-in user. Creating
25
+ * organizations needs a user login, not an organization API key: an API
26
+ * key already belongs to exactly one organization. To configure the
27
+ * organization your key belongs to, use {@link OrganizationSettings}.
28
+ *
29
+ * ### Creating an Organization
30
+ * **Example:** A separate organization for a team
31
+ * ```typescript
32
+ * export const Team = Daytona.Organization("Team", { defaultRegionId: "us" });
33
+ * ```
34
+ *
35
+ * @resource
36
+ * @product Organization
37
+ */
38
+ export declare const Organization: import("alchemy/Resource").ResourceClass<Organization>;
39
+ export declare const OrganizationProvider: () => import("effect/Layer").Layer<Provider.Provider<Organization>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | organizations.DaytonaOpContext>;
40
+ //# sourceMappingURL=Organization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Organization.d.ts","sources":["../src/Organization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AAExE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,CACjC,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,wDAAiD,CAAC;AAQ3E,eAAO,MAAM,oBAAoB,4KA8D9B,CAAC"}
@@ -0,0 +1,80 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
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 { resolveName } from "./internal/Names.js";
7
+ /**
8
+ * A new Daytona organization, owned by the signed-in user. Creating
9
+ * organizations needs a user login, not an organization API key: an API
10
+ * key already belongs to exactly one organization. To configure the
11
+ * organization your key belongs to, use {@link OrganizationSettings}.
12
+ *
13
+ * ### Creating an Organization
14
+ * **Example:** A separate organization for a team
15
+ * ```typescript
16
+ * export const Team = Daytona.Organization("Team", { defaultRegionId: "us" });
17
+ * ```
18
+ *
19
+ * @resource
20
+ * @product Organization
21
+ */
22
+ export const Organization = Resource("Daytona.Organization");
23
+ const toAttributes = (o) => ({
24
+ organizationId: o.id,
25
+ name: o.name,
26
+ defaultRegionId: o.defaultRegionId,
27
+ });
28
+ export const OrganizationProvider = () => Provider.effect(Organization, Effect.succeed({
29
+ stables: ["organizationId"],
30
+ nuke: { skip: true },
31
+ list: () => Effect.succeed([]),
32
+ diff: Effect.fn(function* ({ id, news, output }) {
33
+ if (!isResolved(news) || output === undefined)
34
+ return undefined;
35
+ const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
36
+ // Reconcile finds an organization by name, so the old one must go
37
+ // first or the replacement would adopt it.
38
+ if (name !== output.name ||
39
+ (output.defaultRegionId !== undefined && news.defaultRegionId !== output.defaultRegionId)) {
40
+ return { action: "replace", deleteFirst: true };
41
+ }
42
+ }),
43
+ read: Effect.fn(function* ({ output }) {
44
+ if (output === undefined)
45
+ return undefined;
46
+ return yield* organizations.getOrganization({ organizationId: output.organizationId }).pipe(Effect.map(toAttributes), Effect.catchTag("OrganizationNotFound", () => Effect.undefined));
47
+ }),
48
+ reconcile: Effect.fn(function* ({ id, news, output }) {
49
+ const name = yield* resolveName(id, news.name, output?.name);
50
+ // Observe
51
+ let current = output
52
+ ? yield* organizations
53
+ .getOrganization({ organizationId: output.organizationId })
54
+ .pipe(Effect.catchTag("OrganizationNotFound", () => Effect.undefined))
55
+ : (yield* organizations.listOrganizations({})).find((o) => o.name === name);
56
+ // Ensure
57
+ if (current === undefined) {
58
+ current = yield* organizations.createOrganization({
59
+ name,
60
+ defaultRegionId: news.defaultRegionId,
61
+ });
62
+ }
63
+ // Sync: Daytona only accepts a default region while none is set
64
+ // (an adopted organization); changing one replaces (see diff).
65
+ if (current.defaultRegionId === undefined) {
66
+ yield* organizations.setOrganizationDefaultRegion({
67
+ organizationId: current.id,
68
+ defaultRegionId: news.defaultRegionId,
69
+ });
70
+ current = yield* organizations.getOrganization({ organizationId: current.id });
71
+ }
72
+ return toAttributes(current);
73
+ }),
74
+ delete: Effect.fn(function* ({ output }) {
75
+ yield* organizations
76
+ .deleteOrganization({ organizationId: output.organizationId })
77
+ .pipe(Effect.catchTag("OrganizationNotFound", () => Effect.void));
78
+ }),
79
+ }));
80
+ //# sourceMappingURL=Organization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Organization.js","sources":["../src/Organization.ts"],"names":[],"mappings":"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"}