@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,70 @@
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 OrganizationRef } from "./internal/Organization.ts";
6
+ import { type Ref } from "./internal/Ref.ts";
7
+ import type { Providers } from "./Providers.ts";
8
+ /** A role, by id. Accepts a `Daytona.OrganizationRole` or `{ roleId }`. */
9
+ export type RoleRef = {
10
+ readonly roleId: string;
11
+ };
12
+ /** `owner` manages the organization; `member` gets only the assigned roles. */
13
+ export type MemberRole = "owner" | "member";
14
+ export interface OrganizationInvitationProps {
15
+ /**
16
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
17
+ * credentials' organization. Changing it replaces the resource.
18
+ */
19
+ organization?: Ref<OrganizationRef>;
20
+ /** Email to invite. Changing it replaces the invitation. */
21
+ email: string;
22
+ /** Base role. @default "member" */
23
+ role?: MemberRole;
24
+ /** Custom roles to assign. Updated in place. */
25
+ roles?: Ref<RoleRef>[];
26
+ /** When the invitation expires, as an ISO 8601 timestamp. */
27
+ expiresAt?: string;
28
+ }
29
+ export interface OrganizationInvitationAttributes {
30
+ /** Invitation ID. */
31
+ invitationId: string;
32
+ /** Organization ID. */
33
+ organizationId: string;
34
+ /** Invited email. */
35
+ email: string;
36
+ /** `pending`, `accepted`, `declined`, `cancelled`. */
37
+ status: string;
38
+ /** When it expires. */
39
+ expiresAt: string;
40
+ }
41
+ export type OrganizationInvitation = Resource<"Daytona.OrganizationInvitation", OrganizationInvitationProps, OrganizationInvitationAttributes, never, Providers>;
42
+ /**
43
+ * Invite someone to the Daytona organization by email, with a base role
44
+ * and custom {@link OrganizationRole}s. Destroying it cancels the
45
+ * invitation if it hasn't been accepted; an accepted invitation leaves the
46
+ * member in place.
47
+ *
48
+ * ### Inviting a Developer
49
+ * **Example:** A member with a custom role
50
+ * ```typescript
51
+ * export const Alice = Daytona.OrganizationInvitation("Alice", {
52
+ * email: "alice@example.com",
53
+ * roles: [Developer],
54
+ * });
55
+ * ```
56
+ *
57
+ * @resource
58
+ * @product Organization
59
+ */
60
+ export declare const OrganizationInvitation: import("alchemy/Resource").ResourceConstructor<OrganizationInvitation, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<OrganizationInvitation, never>, never, never> & {
61
+ Self: import("alchemy/Self").Self<OrganizationInvitation>;
62
+ Provider: Provider.Provider<OrganizationInvitation>;
63
+ Aliases: readonly string[] | undefined;
64
+ ref(id: string, options?: {
65
+ stage?: string;
66
+ stack?: string;
67
+ }): Effect.Effect<OrganizationInvitation, never, never>;
68
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<OrganizationInvitationProps>) => Effect.Effect<OrganizationInvitation, never, Providers>);
69
+ export declare const OrganizationInvitationProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationInvitation>, never, organizations.DaytonaOpContext>;
70
+ //# sourceMappingURL=OrganizationInvitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationInvitation.d.ts","sources":["../src/OrganizationInvitation.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;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IACvB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,gCAAgC,EAChC,2BAA2B,EAC3B,gCAAgC,EAChC,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;iKAElC,CAAC;AAeF,eAAO,MAAM,8BAA8B,sHAgFxC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
2
+ import { deepEqual, 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 { currentOrganizationId, movesOrganization, organizationIdFor, } from "./internal/Organization.js";
8
+ import { resolved } from "./internal/Ref.js";
9
+ /**
10
+ * Invite someone to the Daytona organization by email, with a base role
11
+ * and custom {@link OrganizationRole}s. Destroying it cancels the
12
+ * invitation if it hasn't been accepted; an accepted invitation leaves the
13
+ * member in place.
14
+ *
15
+ * ### Inviting a Developer
16
+ * **Example:** A member with a custom role
17
+ * ```typescript
18
+ * export const Alice = Daytona.OrganizationInvitation("Alice", {
19
+ * email: "alice@example.com",
20
+ * roles: [Developer],
21
+ * });
22
+ * ```
23
+ *
24
+ * @resource
25
+ * @product Organization
26
+ */
27
+ export const OrganizationInvitation = declarable()(Resource("Daytona.OrganizationInvitation"));
28
+ const resolveRoles = (roles) => Effect.succeed((roles ?? []).map((r) => resolved(r).roleId));
29
+ const toAttributes = (i) => ({
30
+ invitationId: i.id,
31
+ organizationId: i.organizationId,
32
+ email: i.email,
33
+ status: i.status,
34
+ expiresAt: i.expiresAt,
35
+ });
36
+ export const OrganizationInvitationProvider = () => Provider.effect(OrganizationInvitation, Effect.succeed({
37
+ stables: ["invitationId", "organizationId"],
38
+ list: Effect.fn(function* () {
39
+ const organizationId = yield* currentOrganizationId;
40
+ return (yield* organizations.listOrganizationInvitations({ organizationId })).map(toAttributes);
41
+ }),
42
+ diff: Effect.fn(function* ({ news, output }) {
43
+ if (!isResolved(news) || output === undefined)
44
+ return undefined;
45
+ if (yield* movesOrganization(news.organization, output))
46
+ return { action: "replace" };
47
+ if (news.email !== output.email)
48
+ return { action: "replace" };
49
+ }),
50
+ read: Effect.fn(function* ({ output }) {
51
+ if (output === undefined)
52
+ return undefined;
53
+ const all = yield* organizations.listOrganizationInvitations({
54
+ organizationId: output.organizationId,
55
+ });
56
+ const found = all.find((i) => i.id === output.invitationId);
57
+ return found ? toAttributes(found) : undefined;
58
+ }),
59
+ reconcile: Effect.fn(function* ({ news, output }) {
60
+ const organizationId = yield* organizationIdFor(news.organization);
61
+ const assignedRoleIds = yield* resolveRoles(news.roles);
62
+ const role = news.role ?? "member";
63
+ // Observe the pending invitation for this email.
64
+ const all = yield* organizations.listOrganizationInvitations({ organizationId });
65
+ const current = all.find((i) => i.id === output?.invitationId) ??
66
+ all.find((i) => i.email === news.email && i.status === "pending");
67
+ // Ensure
68
+ if (current === undefined || current.status !== "pending") {
69
+ if (current?.status === "accepted")
70
+ return toAttributes(current);
71
+ return toAttributes(yield* organizations.createOrganizationInvitation({
72
+ organizationId,
73
+ email: news.email,
74
+ role,
75
+ assignedRoleIds,
76
+ expiresAt: news.expiresAt,
77
+ }));
78
+ }
79
+ // Sync
80
+ const observedRoles = current.assignedRoles.map((r) => r.id).sort();
81
+ if (current.role === role &&
82
+ deepEqual(observedRoles, [...assignedRoleIds].sort()) &&
83
+ (news.expiresAt === undefined || news.expiresAt === current.expiresAt)) {
84
+ return toAttributes(current);
85
+ }
86
+ return toAttributes(yield* organizations.updateOrganizationInvitation({
87
+ organizationId,
88
+ invitationId: current.id,
89
+ role,
90
+ assignedRoleIds,
91
+ expiresAt: news.expiresAt,
92
+ }));
93
+ }),
94
+ delete: Effect.fn(function* ({ output }) {
95
+ const all = yield* organizations.listOrganizationInvitations({
96
+ organizationId: output.organizationId,
97
+ });
98
+ const found = all.find((i) => i.id === output.invitationId);
99
+ if (found?.status !== "pending")
100
+ return;
101
+ yield* organizations
102
+ .cancelOrganizationInvitation({
103
+ organizationId: output.organizationId,
104
+ invitationId: output.invitationId,
105
+ })
106
+ .pipe(Effect.catchTag("OrganizationInvitationNotFound", () => Effect.void));
107
+ }),
108
+ }));
109
+ //# sourceMappingURL=OrganizationInvitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationInvitation.js","sources":["../src/OrganizationInvitation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
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 OrganizationRef } from "./internal/Organization.ts";
6
+ import { type Ref } from "./internal/Ref.ts";
7
+ import type { MemberRole, RoleRef } from "./OrganizationInvitation.ts";
8
+ import type { Providers } from "./Providers.ts";
9
+ export interface OrganizationMemberProps {
10
+ /**
11
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
12
+ * credentials' organization. Changing it replaces the resource.
13
+ */
14
+ organization?: Ref<OrganizationRef>;
15
+ /** The member, by user ID or email. Changing it replaces the resource. */
16
+ user: string;
17
+ /** Base role. */
18
+ role: MemberRole;
19
+ /** Custom roles. Updated in place. */
20
+ roles?: Ref<RoleRef>[];
21
+ /**
22
+ * Remove the member from the organization on destroy. By default destroy
23
+ * only puts back the access the member had before alchemy changed it.
24
+ * @default false
25
+ */
26
+ removeOnDestroy?: boolean;
27
+ }
28
+ export interface OrganizationMemberAttributes {
29
+ /** Organization ID. */
30
+ organizationId: string;
31
+ /** User ID. */
32
+ userId: string;
33
+ /** Email. */
34
+ email: string;
35
+ /** Base role. */
36
+ role: string;
37
+ /** Assigned custom role IDs. */
38
+ roleIds: string[];
39
+ /** Access before alchemy first changed it; restored on destroy. */
40
+ original: {
41
+ role: string;
42
+ roleIds: string[];
43
+ };
44
+ /** Whether destroy removes the member. */
45
+ removeOnDestroy: boolean;
46
+ }
47
+ export type OrganizationMember = Resource<"Daytona.OrganizationMember", OrganizationMemberProps, OrganizationMemberAttributes, never, Providers>;
48
+ declare const MemberNotInOrganization_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
49
+ readonly _tag: "Daytona.MemberNotInOrganization";
50
+ } & Readonly<A>;
51
+ /** No member of the organization has that user ID or email. */
52
+ export declare class MemberNotInOrganization extends MemberNotInOrganization_base<{
53
+ readonly user: string;
54
+ }> {
55
+ get message(): string;
56
+ }
57
+ /**
58
+ * The access of an existing member of the Daytona organization: their
59
+ * base role and custom {@link OrganizationRole}s. Use it to manage who can
60
+ * do what as code. To add someone, use {@link OrganizationInvitation}.
61
+ *
62
+ * ### Granting a Role
63
+ * **Example:** Make a member a developer
64
+ * ```typescript
65
+ * export const Bob = Daytona.OrganizationMember("Bob", {
66
+ * user: "bob@example.com",
67
+ * role: "member",
68
+ * roles: [Developer],
69
+ * });
70
+ * ```
71
+ *
72
+ * @resource
73
+ * @product Organization
74
+ */
75
+ export declare const OrganizationMember: import("alchemy/Resource").ResourceConstructor<OrganizationMember, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<OrganizationMember, never>, never, never> & {
76
+ Self: import("alchemy/Self").Self<OrganizationMember>;
77
+ Provider: Provider.Provider<OrganizationMember>;
78
+ Aliases: readonly string[] | undefined;
79
+ ref(id: string, options?: {
80
+ stage?: string;
81
+ stack?: string;
82
+ }): Effect.Effect<OrganizationMember, never, never>;
83
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<OrganizationMemberProps>) => Effect.Effect<OrganizationMember, never, Providers>);
84
+ export declare const OrganizationMemberProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationMember>, never, organizations.DaytonaOpContext>;
85
+ export {};
86
+ //# sourceMappingURL=OrganizationMember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationMember.d.ts","sources":["../src/OrganizationMember.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;AAE5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IACvB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CACvC,4BAA4B,EAC5B,uBAAuB,EACvB,4BAA4B,EAC5B,KAAK,EACL,SAAS,CACV,CAAC;;;;AAEF,+DAA+D;AAC/D,qBAAa,uBAAwB,SAAQ,6BAAoD;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,WAEnB;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;yJAE9B,CAAC;AAqBF,eAAO,MAAM,0BAA0B,kHA8DpC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
2
+ import { deepEqual, isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Data from "effect/Data";
6
+ import * as Effect from "effect/Effect";
7
+ import { declarable } from "./internal/Declared.js";
8
+ import { movesOrganization, organizationIdFor, } from "./internal/Organization.js";
9
+ import { resolved } from "./internal/Ref.js";
10
+ /** No member of the organization has that user ID or email. */
11
+ export class MemberNotInOrganization extends Data.TaggedError("Daytona.MemberNotInOrganization") {
12
+ get message() {
13
+ return `${this.user} is not a member of the Daytona organization; invite them with Daytona.OrganizationInvitation`;
14
+ }
15
+ }
16
+ /**
17
+ * The access of an existing member of the Daytona organization: their
18
+ * base role and custom {@link OrganizationRole}s. Use it to manage who can
19
+ * do what as code. To add someone, use {@link OrganizationInvitation}.
20
+ *
21
+ * ### Granting a Role
22
+ * **Example:** Make a member a developer
23
+ * ```typescript
24
+ * export const Bob = Daytona.OrganizationMember("Bob", {
25
+ * user: "bob@example.com",
26
+ * role: "member",
27
+ * roles: [Developer],
28
+ * });
29
+ * ```
30
+ *
31
+ * @resource
32
+ * @product Organization
33
+ */
34
+ export const OrganizationMember = declarable()(Resource("Daytona.OrganizationMember"));
35
+ const findMember = Effect.fn(function* (organizationId, user) {
36
+ const members = yield* organizations.listOrganizationMembers({ organizationId });
37
+ return members.find((m) => m.userId === user || m.email === user);
38
+ });
39
+ const toAttributes = (m, original, removeOnDestroy) => ({
40
+ organizationId: m.organizationId,
41
+ userId: m.userId,
42
+ email: m.email,
43
+ role: m.role,
44
+ roleIds: m.assignedRoles.map((r) => r.id).sort(),
45
+ original,
46
+ removeOnDestroy,
47
+ });
48
+ export const OrganizationMemberProvider = () => Provider.effect(OrganizationMember, Effect.succeed({
49
+ stables: ["organizationId", "userId", "original"],
50
+ nuke: { skip: true },
51
+ list: () => Effect.succeed([]),
52
+ diff: Effect.fn(function* ({ news, output }) {
53
+ if (!isResolved(news) || output === undefined)
54
+ return undefined;
55
+ if (yield* movesOrganization(news.organization, output))
56
+ return { action: "replace" };
57
+ if (news.user !== output.userId && news.user !== output.email)
58
+ return { action: "replace" };
59
+ }),
60
+ read: Effect.fn(function* ({ output }) {
61
+ if (output === undefined)
62
+ return undefined;
63
+ const found = yield* findMember(output.organizationId, output.userId);
64
+ return found ? toAttributes(found, output.original, output.removeOnDestroy) : undefined;
65
+ }),
66
+ reconcile: Effect.fn(function* ({ news, output }) {
67
+ const organizationId = yield* organizationIdFor(news.organization);
68
+ const member = yield* findMember(organizationId, output?.userId ?? news.user);
69
+ if (member === undefined)
70
+ return yield* new MemberNotInOrganization({ user: news.user });
71
+ const original = output?.original ?? {
72
+ role: member.role,
73
+ roleIds: member.assignedRoles.map((r) => r.id).sort(),
74
+ };
75
+ const roleIds = (news.roles ?? []).map((r) => resolved(r).roleId).sort();
76
+ if (member.role !== news.role ||
77
+ !deepEqual(member.assignedRoles.map((r) => r.id).sort(), roleIds)) {
78
+ yield* organizations.updateAccessForOrganizationMember({
79
+ organizationId,
80
+ userId: member.userId,
81
+ role: news.role,
82
+ assignedRoleIds: roleIds,
83
+ });
84
+ }
85
+ const updated = yield* findMember(organizationId, member.userId);
86
+ return toAttributes(updated ?? member, original, news.removeOnDestroy ?? false);
87
+ }),
88
+ delete: Effect.fn(function* ({ output }) {
89
+ if (output.removeOnDestroy) {
90
+ yield* organizations
91
+ .deleteOrganizationMember({
92
+ organizationId: output.organizationId,
93
+ userId: output.userId,
94
+ })
95
+ .pipe(Effect.catchTag("OrganizationMemberNotFound", () => Effect.void));
96
+ return;
97
+ }
98
+ const member = yield* findMember(output.organizationId, output.userId);
99
+ if (member === undefined)
100
+ return;
101
+ yield* organizations.updateAccessForOrganizationMember({
102
+ organizationId: output.organizationId,
103
+ userId: output.userId,
104
+ role: output.original.role,
105
+ assignedRoleIds: output.original.roleIds,
106
+ });
107
+ }),
108
+ }));
109
+ //# sourceMappingURL=OrganizationMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationMember.js","sources":["../src/OrganizationMember.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
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 * as Redacted from "effect/Redacted";
6
+ import { type OrganizationRef } from "./internal/Organization.ts";
7
+ import type { Ref } from "./internal/Ref.ts";
8
+ import type { Providers } from "./Providers.ts";
9
+ export interface OrganizationOtelConfigProps {
10
+ /**
11
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
12
+ * credentials' organization. Changing it replaces the resource.
13
+ */
14
+ organization?: Ref<OrganizationRef>;
15
+ /** OTLP/HTTP endpoint sandboxes export telemetry to. */
16
+ endpoint: string;
17
+ /** Headers sent with every export, e.g. an API key. */
18
+ headers?: Record<string, string | Redacted.Redacted<string>>;
19
+ }
20
+ export interface OrganizationOtelConfigAttributes {
21
+ /** Organization ID. */
22
+ organizationId: string;
23
+ /** OTLP endpoint. */
24
+ endpoint: string;
25
+ /** Header names configured (values are not returned). */
26
+ headerNames: string[];
27
+ }
28
+ export type OrganizationOtelConfig = Resource<"Daytona.OrganizationOtelConfig", OrganizationOtelConfigProps, OrganizationOtelConfigAttributes, never, Providers>;
29
+ /**
30
+ * Export the organization's sandbox telemetry (logs, traces, metrics) to
31
+ * your own OpenTelemetry backend. One per organization; destroying it
32
+ * stops the export.
33
+ *
34
+ * ### Exporting Telemetry
35
+ * **Example:** Send sandbox telemetry to Axiom
36
+ * ```typescript
37
+ * export const Telemetry = Daytona.OrganizationOtelConfig("Telemetry", {
38
+ * endpoint: "https://api.axiom.co",
39
+ * headers: {
40
+ * Authorization: Config.Redacted("AXIOM_TOKEN"),
41
+ * "X-Axiom-Dataset": "daytona",
42
+ * },
43
+ * });
44
+ * ```
45
+ *
46
+ * @resource
47
+ * @product Organization
48
+ */
49
+ export declare const OrganizationOtelConfig: import("alchemy/Resource").ResourceConstructor<OrganizationOtelConfig, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<OrganizationOtelConfig, never>, never, never> & {
50
+ Self: import("alchemy/Self").Self<OrganizationOtelConfig>;
51
+ Provider: Provider.Provider<OrganizationOtelConfig>;
52
+ Aliases: readonly string[] | undefined;
53
+ ref(id: string, options?: {
54
+ stage?: string;
55
+ stack?: string;
56
+ }): Effect.Effect<OrganizationOtelConfig, never, never>;
57
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<OrganizationOtelConfigProps>) => Effect.Effect<OrganizationOtelConfig, never, Providers>);
58
+ export declare const OrganizationOtelConfigProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationOtelConfig>, never, organizations.DaytonaOpContext>;
59
+ //# sourceMappingURL=OrganizationOtelConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationOtelConfig.d.ts","sources":["../src/OrganizationOtelConfig.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;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,gCAAgC;IAC/C,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAC3C,gCAAgC,EAChC,2BAA2B,EAC3B,gCAAgC,EAChC,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;iKAElC,CAAC;AAuBF,eAAO,MAAM,8BAA8B,sHA+CxC,CAAC"}
@@ -0,0 +1,87 @@
1
+ import * as organizations from "@distilled.cloud/daytona/organizations";
2
+ import { deepEqual, 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 * as Redacted from "effect/Redacted";
7
+ import { declarable } from "./internal/Declared.js";
8
+ import { currentOrganizationId, movesOrganization, organizationIdFor, } from "./internal/Organization.js";
9
+ /**
10
+ * Export the organization's sandbox telemetry (logs, traces, metrics) to
11
+ * your own OpenTelemetry backend. One per organization; destroying it
12
+ * stops the export.
13
+ *
14
+ * ### Exporting Telemetry
15
+ * **Example:** Send sandbox telemetry to Axiom
16
+ * ```typescript
17
+ * export const Telemetry = Daytona.OrganizationOtelConfig("Telemetry", {
18
+ * endpoint: "https://api.axiom.co",
19
+ * headers: {
20
+ * Authorization: Config.Redacted("AXIOM_TOKEN"),
21
+ * "X-Axiom-Dataset": "daytona",
22
+ * },
23
+ * });
24
+ * ```
25
+ *
26
+ * @resource
27
+ * @product Organization
28
+ */
29
+ export const OrganizationOtelConfig = declarable()(Resource("Daytona.OrganizationOtelConfig"));
30
+ const plainHeaders = (headers) => headers === undefined
31
+ ? undefined
32
+ : Object.fromEntries(Object.entries(headers).map(([k, v]) => [
33
+ k,
34
+ Redacted.isRedacted(v) ? Redacted.value(v) : v,
35
+ ]));
36
+ // Daytona stores the endpoint normalized (`https://host` -> `https://host/`).
37
+ const sameEndpoint = (observed, desired) => observed !== undefined && URL.canParse(observed) && URL.canParse(desired)
38
+ ? new URL(observed).href === new URL(desired).href
39
+ : observed === desired;
40
+ // getOrganizationOtelConfig is for Daytona's runners and proxy (users get
41
+ // 401); the organization itself carries the config.
42
+ const observeOtelConfig = (organizationId) => Effect.map(organizations.getOrganization({ organizationId }), (o) => o.otelConfig);
43
+ export const OrganizationOtelConfigProvider = () => Provider.effect(OrganizationOtelConfig, Effect.succeed({
44
+ stables: ["organizationId"],
45
+ nuke: { singleton: true },
46
+ list: () => Effect.succeed([]),
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* ({ output }) {
54
+ const organizationId = output?.organizationId ?? (yield* currentOrganizationId);
55
+ const config = yield* observeOtelConfig(organizationId);
56
+ if (!config?.endpoint)
57
+ return undefined;
58
+ return {
59
+ organizationId,
60
+ endpoint: config.endpoint,
61
+ headerNames: Object.keys(config.headers ?? {}),
62
+ };
63
+ }),
64
+ reconcile: Effect.fn(function* ({ news, olds }) {
65
+ const organizationId = yield* organizationIdFor(news.organization);
66
+ // Observe — header values aren't returned, so they are written
67
+ // whenever they changed since the last deploy (or on first deploy).
68
+ const current = yield* observeOtelConfig(organizationId);
69
+ const headers = plainHeaders(news.headers);
70
+ if (!sameEndpoint(current?.endpoint, news.endpoint) ||
71
+ olds === undefined ||
72
+ !deepEqual(plainHeaders(olds.headers), headers)) {
73
+ yield* organizations.updateOrganizationOtelConfig({
74
+ organizationId,
75
+ endpoint: news.endpoint,
76
+ headers,
77
+ });
78
+ }
79
+ return { organizationId, endpoint: news.endpoint, headerNames: Object.keys(headers ?? {}) };
80
+ }),
81
+ delete: Effect.fn(function* ({ output }) {
82
+ yield* organizations
83
+ .deleteOrganizationOtelConfig({ organizationId: output.organizationId })
84
+ .pipe(Effect.catchTag("OrganizationNotFound", () => Effect.void));
85
+ }),
86
+ }));
87
+ //# sourceMappingURL=OrganizationOtelConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationOtelConfig.js","sources":["../src/OrganizationOtelConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
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 { Permission } from "./ApiKey.ts";
6
+ import { type OrganizationRef } from "./internal/Organization.ts";
7
+ import type { Ref } from "./internal/Ref.ts";
8
+ import type { Providers } from "./Providers.ts";
9
+ export interface OrganizationRoleProps {
10
+ /**
11
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
12
+ * credentials' organization. Changing it replaces the resource.
13
+ */
14
+ organization?: Ref<OrganizationRef>;
15
+ /**
16
+ * Role name. If omitted, a unique name is generated from the stack,
17
+ * stage and logical ID. Renames update in place.
18
+ */
19
+ name?: string;
20
+ /** What the role is for. */
21
+ description?: string;
22
+ /** Permissions members with this role get. Updated in place. */
23
+ permissions: Permission[];
24
+ }
25
+ export interface OrganizationRoleAttributes {
26
+ /** Role ID; what invitations and member access take. */
27
+ roleId: string;
28
+ /** Organization the role belongs to. */
29
+ organizationId: string;
30
+ /** Role name. */
31
+ name: string;
32
+ /** Description. */
33
+ description: string;
34
+ /** Permissions the role grants. */
35
+ permissions: Permission[];
36
+ }
37
+ export type OrganizationRole = Resource<"Daytona.OrganizationRole", OrganizationRoleProps, OrganizationRoleAttributes, never, Providers>;
38
+ /**
39
+ * A custom role in the Daytona organization: a named set of permissions to
40
+ * give members, through {@link OrganizationInvitation} or
41
+ * {@link OrganizationMember}.
42
+ * @see https://www.daytona.io/docs/en/organizations/
43
+ *
44
+ * ### Creating a Role
45
+ * **Example:** A role that can run sandboxes but not manage images
46
+ * ```typescript
47
+ * export const Developer = Daytona.OrganizationRole("Developer", {
48
+ * description: "Run sandboxes",
49
+ * permissions: ["write:sandboxes", "delete:sandboxes", "read:volumes"],
50
+ * });
51
+ * ```
52
+ *
53
+ * @resource
54
+ * @product Organization
55
+ */
56
+ export declare const OrganizationRole: import("alchemy/Resource").ResourceConstructor<OrganizationRole, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<OrganizationRole, never>, never, never> & {
57
+ Self: import("alchemy/Self").Self<OrganizationRole>;
58
+ Provider: Provider.Provider<OrganizationRole>;
59
+ Aliases: readonly string[] | undefined;
60
+ ref(id: string, options?: {
61
+ stage?: string;
62
+ stack?: string;
63
+ }): Effect.Effect<OrganizationRole, never, never>;
64
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<OrganizationRoleProps>) => Effect.Effect<OrganizationRole, never, Providers>);
65
+ export declare const OrganizationRoleProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationRole>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | organizations.DaytonaOpContext>;
66
+ //# sourceMappingURL=OrganizationRole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationRole.d.ts","sources":["../src/OrganizationRole.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,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACrC,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;qJAE5B,CAAC;AAkBF,eAAO,MAAM,wBAAwB,gLAwElC,CAAC"}