@alchemy.run/daytona 0.0.0-stage → 2.0.0-beta.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +80 -2
- package/lib/ApiKey.d.ts +99 -0
- package/lib/ApiKey.d.ts.map +1 -0
- package/lib/ApiKey.js +152 -0
- package/lib/ApiKey.js.map +1 -0
- package/lib/AuthProvider.d.ts +55 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +280 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/Bootstrap.d.ts +8 -0
- package/lib/Bootstrap.d.ts.map +1 -0
- package/lib/Bootstrap.js +28 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/ConnectSandbox.d.ts +72 -0
- package/lib/ConnectSandbox.d.ts.map +1 -0
- package/lib/ConnectSandbox.js +3 -0
- package/lib/ConnectSandbox.js.map +1 -0
- package/lib/ConnectSandboxHttp.d.ts +5 -0
- package/lib/ConnectSandboxHttp.d.ts.map +1 -0
- package/lib/ConnectSandboxHttp.js +22 -0
- package/lib/ConnectSandboxHttp.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/CreateSandbox.d.ts +86 -0
- package/lib/CreateSandbox.d.ts.map +1 -0
- package/lib/CreateSandbox.js +3 -0
- package/lib/CreateSandbox.js.map +1 -0
- package/lib/CreateSandboxHttp.d.ts +5 -0
- package/lib/CreateSandboxHttp.d.ts.map +1 -0
- package/lib/CreateSandboxHttp.js +65 -0
- package/lib/CreateSandboxHttp.js.map +1 -0
- package/lib/CreateSecret.d.ts +56 -0
- package/lib/CreateSecret.d.ts.map +1 -0
- package/lib/CreateSecret.js +3 -0
- package/lib/CreateSecret.js.map +1 -0
- package/lib/CreateSecretHttp.d.ts +5 -0
- package/lib/CreateSecretHttp.d.ts.map +1 -0
- package/lib/CreateSecretHttp.js +39 -0
- package/lib/CreateSecretHttp.js.map +1 -0
- package/lib/CreateSnapshot.d.ts +80 -0
- package/lib/CreateSnapshot.d.ts.map +1 -0
- package/lib/CreateSnapshot.js +3 -0
- package/lib/CreateSnapshot.js.map +1 -0
- package/lib/CreateSnapshotHttp.d.ts +5 -0
- package/lib/CreateSnapshotHttp.d.ts.map +1 -0
- package/lib/CreateSnapshotHttp.js +47 -0
- package/lib/CreateSnapshotHttp.js.map +1 -0
- package/lib/CreateVolume.d.ts +81 -0
- package/lib/CreateVolume.d.ts.map +1 -0
- package/lib/CreateVolume.js +10 -0
- package/lib/CreateVolume.js.map +1 -0
- package/lib/CreateVolumeHttp.d.ts +5 -0
- package/lib/CreateVolumeHttp.d.ts.map +1 -0
- package/lib/CreateVolumeHttp.js +31 -0
- package/lib/CreateVolumeHttp.js.map +1 -0
- package/lib/Credentials.d.ts +9 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +18 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/DaytonaBindings.d.ts +51 -0
- package/lib/DaytonaBindings.d.ts.map +1 -0
- package/lib/DaytonaBindings.js +61 -0
- package/lib/DaytonaBindings.js.map +1 -0
- package/lib/IdentityProvider.d.ts +80 -0
- package/lib/IdentityProvider.d.ts.map +1 -0
- package/lib/IdentityProvider.js +111 -0
- package/lib/IdentityProvider.js.map +1 -0
- package/lib/MountVolume.d.ts +86 -0
- package/lib/MountVolume.d.ts.map +1 -0
- package/lib/MountVolume.js +27 -0
- package/lib/MountVolume.js.map +1 -0
- package/lib/OAuthClient.d.ts +14 -0
- package/lib/OAuthClient.d.ts.map +1 -0
- package/lib/OAuthClient.js +23 -0
- package/lib/OAuthClient.js.map +1 -0
- package/lib/Organization.d.ts +40 -0
- package/lib/Organization.d.ts.map +1 -0
- package/lib/Organization.js +80 -0
- package/lib/Organization.js.map +1 -0
- package/lib/OrganizationInvitation.d.ts +70 -0
- package/lib/OrganizationInvitation.d.ts.map +1 -0
- package/lib/OrganizationInvitation.js +109 -0
- package/lib/OrganizationInvitation.js.map +1 -0
- package/lib/OrganizationMember.d.ts +86 -0
- package/lib/OrganizationMember.d.ts.map +1 -0
- package/lib/OrganizationMember.js +109 -0
- package/lib/OrganizationMember.js.map +1 -0
- package/lib/OrganizationOtelConfig.d.ts +59 -0
- package/lib/OrganizationOtelConfig.d.ts.map +1 -0
- package/lib/OrganizationOtelConfig.js +87 -0
- package/lib/OrganizationOtelConfig.js.map +1 -0
- package/lib/OrganizationRole.d.ts +66 -0
- package/lib/OrganizationRole.d.ts.map +1 -0
- package/lib/OrganizationRole.js +106 -0
- package/lib/OrganizationRole.js.map +1 -0
- package/lib/OrganizationSettings.d.ts +76 -0
- package/lib/OrganizationSettings.d.ts.map +1 -0
- package/lib/OrganizationSettings.js +107 -0
- package/lib/OrganizationSettings.js.map +1 -0
- package/lib/Providers.d.ts +14 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +53 -0
- package/lib/Providers.js.map +1 -0
- package/lib/ReadAuditLogs.d.ts +30 -0
- package/lib/ReadAuditLogs.d.ts.map +1 -0
- package/lib/ReadAuditLogs.js +17 -0
- package/lib/ReadAuditLogs.js.map +1 -0
- package/lib/ReadOrganization.d.ts +39 -0
- package/lib/ReadOrganization.d.ts.map +1 -0
- package/lib/ReadOrganization.js +39 -0
- package/lib/ReadOrganization.js.map +1 -0
- package/lib/ReadUsage.d.ts +31 -0
- package/lib/ReadUsage.d.ts.map +1 -0
- package/lib/ReadUsage.js +17 -0
- package/lib/ReadUsage.js.map +1 -0
- package/lib/Region.d.ts +78 -0
- package/lib/Region.d.ts.map +1 -0
- package/lib/Region.js +169 -0
- package/lib/Region.js.map +1 -0
- package/lib/Registry.d.ts +84 -0
- package/lib/Registry.d.ts.map +1 -0
- package/lib/Registry.js +97 -0
- package/lib/Registry.js.map +1 -0
- package/lib/Runner.d.ts +66 -0
- package/lib/Runner.d.ts.map +1 -0
- package/lib/Runner.js +116 -0
- package/lib/Runner.js.map +1 -0
- package/lib/Sandbox.d.ts +376 -0
- package/lib/Sandbox.d.ts.map +1 -0
- package/lib/Sandbox.js +565 -0
- package/lib/Sandbox.js.map +1 -0
- package/lib/SandboxClient.d.ts +258 -0
- package/lib/SandboxClient.d.ts.map +1 -0
- package/lib/SandboxClient.js +233 -0
- package/lib/SandboxClient.js.map +1 -0
- package/lib/Secret.d.ts +93 -0
- package/lib/Secret.d.ts.map +1 -0
- package/lib/Secret.js +130 -0
- package/lib/Secret.js.map +1 -0
- package/lib/Snapshot.d.ts +327 -0
- package/lib/Snapshot.d.ts.map +1 -0
- package/lib/Snapshot.js +447 -0
- package/lib/Snapshot.js.map +1 -0
- package/lib/Volume.d.ts +99 -0
- package/lib/Volume.d.ts.map +1 -0
- package/lib/Volume.js +152 -0
- package/lib/Volume.js.map +1 -0
- package/lib/WarmPool.d.ts +61 -0
- package/lib/WarmPool.d.ts.map +1 -0
- package/lib/WarmPool.js +81 -0
- package/lib/WarmPool.js.map +1 -0
- package/lib/Webhooks.d.ts +58 -0
- package/lib/Webhooks.d.ts.map +1 -0
- package/lib/Webhooks.js +75 -0
- package/lib/Webhooks.js.map +1 -0
- package/lib/index.d.ts +37 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +36 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/BuildContext.d.ts +16 -0
- package/lib/internal/BuildContext.d.ts.map +1 -0
- package/lib/internal/BuildContext.js +50 -0
- package/lib/internal/BuildContext.js.map +1 -0
- package/lib/internal/Declared.d.ts +29 -0
- package/lib/internal/Declared.d.ts.map +1 -0
- package/lib/internal/Declared.js +31 -0
- package/lib/internal/Declared.js.map +1 -0
- package/lib/internal/Derived.d.ts +40 -0
- package/lib/internal/Derived.d.ts.map +1 -0
- package/lib/internal/Derived.js +64 -0
- package/lib/internal/Derived.js.map +1 -0
- package/lib/internal/Errors.d.ts +4 -0
- package/lib/internal/Errors.d.ts.map +1 -0
- package/lib/internal/Errors.js +1 -0
- package/lib/internal/Errors.js.map +1 -0
- package/lib/internal/Labels.d.ts +20 -0
- package/lib/internal/Labels.d.ts.map +1 -0
- package/lib/internal/Labels.js +22 -0
- package/lib/internal/Labels.js.map +1 -0
- package/lib/internal/Names.d.ts +18 -0
- package/lib/internal/Names.d.ts.map +1 -0
- package/lib/internal/Names.js +25 -0
- package/lib/internal/Names.js.map +1 -0
- package/lib/internal/Organization.d.ts +27 -0
- package/lib/internal/Organization.d.ts.map +1 -0
- package/lib/internal/Organization.js +32 -0
- package/lib/internal/Organization.js.map +1 -0
- package/lib/internal/Process.d.ts +14 -0
- package/lib/internal/Process.d.ts.map +1 -0
- package/lib/internal/Process.js +15 -0
- package/lib/internal/Process.js.map +1 -0
- package/lib/internal/Program.d.ts +83 -0
- package/lib/internal/Program.d.ts.map +1 -0
- package/lib/internal/Program.js +169 -0
- package/lib/internal/Program.js.map +1 -0
- package/lib/internal/Ref.d.ts +14 -0
- package/lib/internal/Ref.d.ts.map +1 -0
- package/lib/internal/Ref.js +7 -0
- package/lib/internal/Ref.js.map +1 -0
- package/lib/internal/Scoped.d.ts +31 -0
- package/lib/internal/Scoped.d.ts.map +1 -0
- package/lib/internal/Scoped.js +48 -0
- package/lib/internal/Scoped.js.map +1 -0
- package/lib/internal/Tar.d.ts +13 -0
- package/lib/internal/Tar.d.ts.map +1 -0
- package/lib/internal/Tar.js +62 -0
- package/lib/internal/Tar.js.map +1 -0
- package/lib/internal/Toolbox.d.ts +11 -0
- package/lib/internal/Toolbox.d.ts.map +1 -0
- package/lib/internal/Toolbox.js +20 -0
- package/lib/internal/Toolbox.js.map +1 -0
- package/lib/internal/Wait.d.ts +49 -0
- package/lib/internal/Wait.d.ts.map +1 -0
- package/lib/internal/Wait.js +57 -0
- package/lib/internal/Wait.js.map +1 -0
- package/package.json +79 -3
- package/src/ApiKey.ts +221 -0
- package/src/AuthProvider.ts +406 -0
- package/src/Bootstrap.ts +55 -0
- package/src/ConnectSandbox.ts +76 -0
- package/src/ConnectSandboxHttp.ts +26 -0
- package/src/Contributions.ts +9 -0
- package/src/CreateSandbox.ts +107 -0
- package/src/CreateSandboxHttp.ts +97 -0
- package/src/CreateSecret.ts +73 -0
- package/src/CreateSecretHttp.ts +58 -0
- package/src/CreateSnapshot.ts +133 -0
- package/src/CreateSnapshotHttp.ts +77 -0
- package/src/CreateVolume.ts +104 -0
- package/src/CreateVolumeHttp.ts +50 -0
- package/src/Credentials.ts +37 -0
- package/src/DaytonaBindings.ts +111 -0
- package/src/IdentityProvider.ts +181 -0
- package/src/MountVolume.ts +122 -0
- package/src/OAuthClient.ts +27 -0
- package/src/Organization.ts +121 -0
- package/src/OrganizationInvitation.ts +174 -0
- package/src/OrganizationMember.ts +174 -0
- package/src/OrganizationOtelConfig.ts +138 -0
- package/src/OrganizationRole.ts +167 -0
- package/src/OrganizationSettings.ts +187 -0
- package/src/Providers.ts +93 -0
- package/src/ReadAuditLogs.ts +50 -0
- package/src/ReadOrganization.ts +83 -0
- package/src/ReadUsage.ts +51 -0
- package/src/Region.ts +226 -0
- package/src/Registry.ts +164 -0
- package/src/Runner.ts +166 -0
- package/src/Sandbox.ts +927 -0
- package/src/SandboxClient.ts +625 -0
- package/src/Secret.ts +203 -0
- package/src/Snapshot.ts +685 -0
- package/src/Volume.ts +229 -0
- package/src/WarmPool.ts +128 -0
- package/src/Webhooks.ts +121 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +46 -0
- package/src/internal/BuildContext.ts +62 -0
- package/src/internal/Declared.ts +80 -0
- package/src/internal/Derived.ts +97 -0
- package/src/internal/Errors.ts +4 -0
- package/src/internal/Labels.ts +39 -0
- package/src/internal/Names.ts +37 -0
- package/src/internal/Organization.ts +40 -0
- package/src/internal/Process.ts +25 -0
- package/src/internal/Program.ts +239 -0
- package/src/internal/Ref.ts +15 -0
- package/src/internal/Scoped.ts +102 -0
- package/src/internal/Tar.ts +72 -0
- package/src/internal/Toolbox.ts +27 -0
- 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":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAY,MAAM,mBAAmB,CAAC;AAiDvD,+DAA+D;AAC/D,MAAM,OAAO,uBAAwB,SAAQ,IAAI,CAAC,WAAW,CAAC,iCAAiC,CAE7F;IACA,IAAa,OAAO;QAClB,OAAO,GAAG,IAAI,CAAC,IAAI,+FAA+F,CAAC;IACrH,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,EAAsB,CAChE,QAAQ,CAAqB,4BAA4B,CAAC,CAC3D,CAAC;AAEF,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAsB,EAAE,IAAY;IAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,uBAAuB,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;IACjF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CACnB,CAAiC,EACjC,QAAkD,EAClD,eAAwB,EACM,EAAE,CAAC,CAAC;IAClC,cAAc,EAAE,CAAC,CAAC,cAAc;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;IAChD,QAAQ;IACR,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,EAAE,CAC7C,QAAQ,CAAC,MAAM,CACb,kBAAkB,EAClB,MAAM,CAAC,OAAO,CAAC;IACb,OAAO,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,UAAU,CAAC;IACjD,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IACpB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;YACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAW,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK;YAC3D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAW,CAAC;IAC1C,CAAC,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,CAAC,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,IAAI,uBAAuB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACzF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;SACtD,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,IACE,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YACzB,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,EACjE,CAAC;YACD,KAAK,CAAC,CAAC,aAAa,CAAC,iCAAiC,CAAC;gBACrD,cAAc;gBACd,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,YAAY,CAAC,OAAO,IAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,CAAC;IAClF,CAAC,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE;QACrC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,KAAK,CAAC,CAAC,aAAa;iBACjB,wBAAwB,CAAC;gBACxB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;iBACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,KAAK,CAAC,CAAC,aAAa,CAAC,iCAAiC,CAAC;YACrD,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC1B,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;SACzC,CAAC,CAAC;IACL,CAAC,CAAC;CACH,CAAC,CACH,CAAC"}
|
|
@@ -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"}
|