@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,106 @@
|
|
|
1
|
+
import * as organizations from "@distilled.cloud/daytona/organizations";
|
|
2
|
+
import { Unowned } from "alchemy/AdoptPolicy";
|
|
3
|
+
import { deepEqual, isResolved } from "alchemy/Diff";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import { Resource } from "alchemy/Resource";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import { declarable } from "./internal/Declared.js";
|
|
8
|
+
import { isOwnedName, resolveName } from "./internal/Names.js";
|
|
9
|
+
import { currentOrganizationId, movesOrganization, organizationIdFor, } from "./internal/Organization.js";
|
|
10
|
+
/**
|
|
11
|
+
* A custom role in the Daytona organization: a named set of permissions to
|
|
12
|
+
* give members, through {@link OrganizationInvitation} or
|
|
13
|
+
* {@link OrganizationMember}.
|
|
14
|
+
* @see https://www.daytona.io/docs/en/organizations/
|
|
15
|
+
*
|
|
16
|
+
* ### Creating a Role
|
|
17
|
+
* **Example:** A role that can run sandboxes but not manage images
|
|
18
|
+
* ```typescript
|
|
19
|
+
* export const Developer = Daytona.OrganizationRole("Developer", {
|
|
20
|
+
* description: "Run sandboxes",
|
|
21
|
+
* permissions: ["write:sandboxes", "delete:sandboxes", "read:volumes"],
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @resource
|
|
26
|
+
* @product Organization
|
|
27
|
+
*/
|
|
28
|
+
export const OrganizationRole = declarable()(Resource("Daytona.OrganizationRole"));
|
|
29
|
+
const toAttributes = (organizationId, r) => ({
|
|
30
|
+
roleId: r.id,
|
|
31
|
+
organizationId,
|
|
32
|
+
name: r.name,
|
|
33
|
+
description: r.description,
|
|
34
|
+
permissions: r.permissions,
|
|
35
|
+
});
|
|
36
|
+
const listRoles = (organizationId) => organizations.listOrganizationRoles({ organizationId });
|
|
37
|
+
const sorted = (permissions) => [...permissions].sort();
|
|
38
|
+
export const OrganizationRoleProvider = () => Provider.effect(OrganizationRole, Effect.succeed({
|
|
39
|
+
stables: ["roleId", "organizationId"],
|
|
40
|
+
list: Effect.fn(function* () {
|
|
41
|
+
const organizationId = yield* currentOrganizationId;
|
|
42
|
+
const roles = yield* listRoles(organizationId);
|
|
43
|
+
return roles.filter((r) => !r.isGlobal).map((r) => toAttributes(organizationId, r));
|
|
44
|
+
}),
|
|
45
|
+
diff: Effect.fn(function* ({ news, output }) {
|
|
46
|
+
if (!isResolved(news) || output === undefined)
|
|
47
|
+
return undefined;
|
|
48
|
+
if (yield* movesOrganization(news.organization, output))
|
|
49
|
+
return { action: "replace" };
|
|
50
|
+
}),
|
|
51
|
+
read: Effect.fn(function* ({ id, olds, output }) {
|
|
52
|
+
const organizationId = output?.organizationId ?? (yield* currentOrganizationId);
|
|
53
|
+
const name = yield* resolveName(id, olds?.name, output?.name);
|
|
54
|
+
const roles = yield* listRoles(organizationId);
|
|
55
|
+
const found = roles.find((r) => r.id === output?.roleId) ?? roles.find((r) => r.name === name);
|
|
56
|
+
if (found === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const attrs = toAttributes(organizationId, found);
|
|
59
|
+
return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
|
|
60
|
+
}),
|
|
61
|
+
reconcile: Effect.fn(function* ({ id, news, output }) {
|
|
62
|
+
const organizationId = yield* organizationIdFor(news.organization);
|
|
63
|
+
const name = yield* resolveName(id, news.name, output?.name);
|
|
64
|
+
const description = news.description ?? "";
|
|
65
|
+
// Observe
|
|
66
|
+
const roles = yield* listRoles(organizationId);
|
|
67
|
+
const current = roles.find((r) => r.id === output?.roleId) ?? roles.find((r) => r.name === name);
|
|
68
|
+
// Ensure
|
|
69
|
+
if (current === undefined) {
|
|
70
|
+
const created = yield* organizations
|
|
71
|
+
.createOrganizationRole({
|
|
72
|
+
organizationId,
|
|
73
|
+
name,
|
|
74
|
+
description,
|
|
75
|
+
permissions: news.permissions,
|
|
76
|
+
})
|
|
77
|
+
.pipe(Effect.catchTag("OrganizationRoleAlreadyExists", () => Effect.undefined));
|
|
78
|
+
if (created)
|
|
79
|
+
return toAttributes(organizationId, created);
|
|
80
|
+
}
|
|
81
|
+
const existing = current ?? (yield* listRoles(organizationId)).find((r) => r.name === name);
|
|
82
|
+
if (existing === undefined) {
|
|
83
|
+
return yield* Effect.die(`Daytona role ${name} vanished during create`);
|
|
84
|
+
}
|
|
85
|
+
// Sync against observed state.
|
|
86
|
+
if (existing.name === name &&
|
|
87
|
+
existing.description === description &&
|
|
88
|
+
deepEqual(sorted(existing.permissions), sorted(news.permissions))) {
|
|
89
|
+
return toAttributes(organizationId, existing);
|
|
90
|
+
}
|
|
91
|
+
const updated = yield* organizations.updateOrganizationRole({
|
|
92
|
+
organizationId,
|
|
93
|
+
roleId: existing.id,
|
|
94
|
+
name,
|
|
95
|
+
description,
|
|
96
|
+
permissions: news.permissions,
|
|
97
|
+
});
|
|
98
|
+
return toAttributes(organizationId, updated);
|
|
99
|
+
}),
|
|
100
|
+
delete: Effect.fn(function* ({ output }) {
|
|
101
|
+
yield* organizations
|
|
102
|
+
.deleteOrganizationRole({ organizationId: output.organizationId, roleId: output.roleId })
|
|
103
|
+
.pipe(Effect.catchTag("OrganizationRoleNotFound", () => Effect.void));
|
|
104
|
+
}),
|
|
105
|
+
}));
|
|
106
|
+
//# sourceMappingURL=OrganizationRole.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationRole.js","sources":["../src/OrganizationRole.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
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 Duration from "effect/Duration";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
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 OrganizationSettingsProps {
|
|
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
|
+
/** Region new sandboxes go to when they don't name one. */
|
|
16
|
+
defaultRegionId?: string;
|
|
17
|
+
/**
|
|
18
|
+
* How long a sandbox create may wait in the queue for capacity before it
|
|
19
|
+
* fails. `null` waits indefinitely.
|
|
20
|
+
*/
|
|
21
|
+
defaultQueueTimeout?: Duration.Input | null;
|
|
22
|
+
/** Experimental feature flags, as Daytona names them. */
|
|
23
|
+
experimentalConfig?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
interface Captured {
|
|
26
|
+
defaultRegionId: string | undefined;
|
|
27
|
+
defaultQueueTimeout: number | null;
|
|
28
|
+
experimentalConfig: unknown;
|
|
29
|
+
}
|
|
30
|
+
export interface OrganizationSettingsAttributes {
|
|
31
|
+
/** Organization ID. */
|
|
32
|
+
organizationId: string;
|
|
33
|
+
/** Organization name. */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Default region. */
|
|
36
|
+
defaultRegionId: string | undefined;
|
|
37
|
+
/** Default queue timeout in seconds, or `null`. */
|
|
38
|
+
defaultQueueTimeout: number | null;
|
|
39
|
+
/** Experimental flags. */
|
|
40
|
+
experimentalConfig: unknown;
|
|
41
|
+
/** The settings before alchemy first changed them; restored on destroy. */
|
|
42
|
+
original: Captured;
|
|
43
|
+
}
|
|
44
|
+
export type OrganizationSettings = Resource<"Daytona.OrganizationSettings", OrganizationSettingsProps, OrganizationSettingsAttributes, never, Providers>;
|
|
45
|
+
/**
|
|
46
|
+
* Settings of the Daytona organization the credentials belong to: the
|
|
47
|
+
* default region, the queue timeout for creates waiting on capacity, and
|
|
48
|
+
* experimental flags. Only the settings you declare are changed.
|
|
49
|
+
*
|
|
50
|
+
* The organization always exists, so this resource captures the settings
|
|
51
|
+
* it finds on first deploy and puts them back on destroy.
|
|
52
|
+
*
|
|
53
|
+
* ### Configuring the Organization
|
|
54
|
+
* **Example:** Default region and a one-minute queue timeout
|
|
55
|
+
* ```typescript
|
|
56
|
+
* export const Settings = Daytona.OrganizationSettings("Settings", {
|
|
57
|
+
* defaultRegionId: "eu",
|
|
58
|
+
* defaultQueueTimeout: "1 minute",
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @resource
|
|
63
|
+
* @product Organization
|
|
64
|
+
*/
|
|
65
|
+
export declare const OrganizationSettings: import("alchemy/Resource").ResourceConstructor<OrganizationSettings, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<OrganizationSettings, never>, never, never> & {
|
|
66
|
+
Self: import("alchemy/Self").Self<OrganizationSettings>;
|
|
67
|
+
Provider: Provider.Provider<OrganizationSettings>;
|
|
68
|
+
Aliases: readonly string[] | undefined;
|
|
69
|
+
ref(id: string, options?: {
|
|
70
|
+
stage?: string;
|
|
71
|
+
stack?: string;
|
|
72
|
+
}): Effect.Effect<OrganizationSettings, never, never>;
|
|
73
|
+
} & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<OrganizationSettingsProps>) => Effect.Effect<OrganizationSettings, never, Providers>);
|
|
74
|
+
export declare const OrganizationSettingsProvider: () => import("effect/Layer").Layer<Provider.Provider<OrganizationSettings>, never, organizations.DaytonaOpContext>;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=OrganizationSettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSettings.d.ts","sources":["../src/OrganizationSettings.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,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,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,yBAAyB;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;IAC5C,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED,UAAU,QAAQ;IAChB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,0BAA0B;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CACzC,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;6JAEhC,CAAC;AAmDF,eAAO,MAAM,4BAA4B,oHAmDtC,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
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 Duration from "effect/Duration";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import { declarable } from "./internal/Declared.js";
|
|
8
|
+
import { currentOrganizationId, movesOrganization, organizationIdFor, } from "./internal/Organization.js";
|
|
9
|
+
/**
|
|
10
|
+
* Settings of the Daytona organization the credentials belong to: the
|
|
11
|
+
* default region, the queue timeout for creates waiting on capacity, and
|
|
12
|
+
* experimental flags. Only the settings you declare are changed.
|
|
13
|
+
*
|
|
14
|
+
* The organization always exists, so this resource captures the settings
|
|
15
|
+
* it finds on first deploy and puts them back on destroy.
|
|
16
|
+
*
|
|
17
|
+
* ### Configuring the Organization
|
|
18
|
+
* **Example:** Default region and a one-minute queue timeout
|
|
19
|
+
* ```typescript
|
|
20
|
+
* export const Settings = Daytona.OrganizationSettings("Settings", {
|
|
21
|
+
* defaultRegionId: "eu",
|
|
22
|
+
* defaultQueueTimeout: "1 minute",
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @resource
|
|
27
|
+
* @product Organization
|
|
28
|
+
*/
|
|
29
|
+
export const OrganizationSettings = declarable()(Resource("Daytona.OrganizationSettings"));
|
|
30
|
+
const seconds = (d) => d === null ? null : Math.round(Duration.toSeconds(d));
|
|
31
|
+
const toAttributes = (org, original) => ({
|
|
32
|
+
organizationId: org.id,
|
|
33
|
+
name: org.name,
|
|
34
|
+
defaultRegionId: org.defaultRegionId,
|
|
35
|
+
defaultQueueTimeout: org.defaultQueueTimeout,
|
|
36
|
+
experimentalConfig: org.experimentalConfig,
|
|
37
|
+
original,
|
|
38
|
+
});
|
|
39
|
+
const apply = Effect.fn(function* (org, want) {
|
|
40
|
+
if (want.defaultRegionId !== undefined && want.defaultRegionId !== org.defaultRegionId) {
|
|
41
|
+
yield* organizations.setOrganizationDefaultRegion({
|
|
42
|
+
organizationId: org.id,
|
|
43
|
+
defaultRegionId: want.defaultRegionId,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (want.defaultQueueTimeout !== undefined &&
|
|
47
|
+
want.defaultQueueTimeout !== org.defaultQueueTimeout) {
|
|
48
|
+
yield* organizations.updateOrganizationDefaultQueueTimeout({
|
|
49
|
+
organizationId: org.id,
|
|
50
|
+
defaultQueueTimeout: want.defaultQueueTimeout,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (want.experimentalConfig !== undefined &&
|
|
54
|
+
!deepEqual(want.experimentalConfig, org.experimentalConfig)) {
|
|
55
|
+
yield* organizations.updateExperimentalConfig({
|
|
56
|
+
organizationId: org.id,
|
|
57
|
+
body: want.experimentalConfig,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
export const OrganizationSettingsProvider = () => Provider.effect(OrganizationSettings, Effect.succeed({
|
|
62
|
+
stables: ["organizationId", "original"],
|
|
63
|
+
nuke: { singleton: true },
|
|
64
|
+
list: () => Effect.succeed([]),
|
|
65
|
+
diff: Effect.fn(function* ({ news, output }) {
|
|
66
|
+
if (!isResolved(news) || output === undefined)
|
|
67
|
+
return undefined;
|
|
68
|
+
if (yield* movesOrganization(news.organization, output))
|
|
69
|
+
return { action: "replace" };
|
|
70
|
+
}),
|
|
71
|
+
read: Effect.fn(function* ({ output }) {
|
|
72
|
+
const org = yield* organizations.getOrganization({
|
|
73
|
+
organizationId: output?.organizationId ?? (yield* currentOrganizationId),
|
|
74
|
+
});
|
|
75
|
+
return toAttributes(org, output?.original ?? {
|
|
76
|
+
defaultRegionId: org.defaultRegionId,
|
|
77
|
+
defaultQueueTimeout: org.defaultQueueTimeout,
|
|
78
|
+
experimentalConfig: org.experimentalConfig,
|
|
79
|
+
});
|
|
80
|
+
}),
|
|
81
|
+
reconcile: Effect.fn(function* ({ news, output }) {
|
|
82
|
+
const organizationId = yield* organizationIdFor(news.organization);
|
|
83
|
+
// Observe
|
|
84
|
+
const org = yield* organizations.getOrganization({ organizationId });
|
|
85
|
+
const original = output?.original ?? {
|
|
86
|
+
defaultRegionId: org.defaultRegionId,
|
|
87
|
+
defaultQueueTimeout: org.defaultQueueTimeout,
|
|
88
|
+
experimentalConfig: org.experimentalConfig,
|
|
89
|
+
};
|
|
90
|
+
// Sync only what is declared, against observed settings.
|
|
91
|
+
yield* apply(org, {
|
|
92
|
+
defaultRegionId: news.defaultRegionId,
|
|
93
|
+
defaultQueueTimeout: news.defaultQueueTimeout === undefined ? undefined : seconds(news.defaultQueueTimeout),
|
|
94
|
+
experimentalConfig: news.experimentalConfig,
|
|
95
|
+
});
|
|
96
|
+
return toAttributes(yield* organizations.getOrganization({ organizationId }), original);
|
|
97
|
+
}),
|
|
98
|
+
delete: Effect.fn(function* ({ output }) {
|
|
99
|
+
const org = yield* organizations
|
|
100
|
+
.getOrganization({ organizationId: output.organizationId })
|
|
101
|
+
.pipe(Effect.catchTag("OrganizationNotFound", () => Effect.undefined));
|
|
102
|
+
if (org === undefined)
|
|
103
|
+
return;
|
|
104
|
+
yield* apply(org, output.original);
|
|
105
|
+
}),
|
|
106
|
+
}));
|
|
107
|
+
//# sourceMappingURL=OrganizationSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrganizationSettings.js","sources":["../src/OrganizationSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as Provider from "alchemy/Provider";
|
|
2
|
+
import * as Layer from "effect/Layer";
|
|
3
|
+
import * as Credentials from "./Credentials.ts";
|
|
4
|
+
declare const Providers_base: Provider.ProviderCollection<Providers, "Daytona">;
|
|
5
|
+
export declare class Providers extends Providers_base {
|
|
6
|
+
}
|
|
7
|
+
export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
|
|
8
|
+
/**
|
|
9
|
+
* Daytona providers and credentials: every Daytona resource, and the
|
|
10
|
+
* Daytona AuthProvider so `alchemy profile edit` can configure it.
|
|
11
|
+
*/
|
|
12
|
+
export declare const providers: () => Layer.Layer<Credentials.Credentials | import("alchemy/Auth/Credentials").CredentialsStore | import("@alchemy.run/docker/Docker").Docker | import("effect/http/HttpClient").HttpClient | import("alchemy/Auth/Profile").ProfileStore | Providers, never, import("alchemy/AlchemyContext").AlchemyContext | import("alchemy/Auth/Registry").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=Providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.d.ts","sources":["../src/Providers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;;AAwBhD,qBAAa,SAAU,SAAQ,cAAmD;CAAG;AAErF,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;AAEhF;;;GAGG;AACH,eAAO,MAAM,SAAS,6lBAoDnB,CAAC"}
|
package/lib/Providers.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DockerLive } from "@alchemy.run/docker/Docker";
|
|
2
|
+
import { CredentialsStoreLive } from "alchemy/Auth/Credentials";
|
|
3
|
+
import { ProfileStoreLive } from "alchemy/Auth/Profile";
|
|
4
|
+
import * as Provider from "alchemy/Provider";
|
|
5
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import { ApiKey, ApiKeyProvider } from "./ApiKey.js";
|
|
8
|
+
import { DaytonaAuth } from "./AuthProvider.js";
|
|
9
|
+
import * as Credentials from "./Credentials.js";
|
|
10
|
+
import { IdentityProvider, IdentityProviderProvider } from "./IdentityProvider.js";
|
|
11
|
+
import { Organization, OrganizationProvider } from "./Organization.js";
|
|
12
|
+
import { OrganizationInvitation, OrganizationInvitationProvider, } from "./OrganizationInvitation.js";
|
|
13
|
+
import { OrganizationMember, OrganizationMemberProvider } from "./OrganizationMember.js";
|
|
14
|
+
import { OrganizationOtelConfig, OrganizationOtelConfigProvider, } from "./OrganizationOtelConfig.js";
|
|
15
|
+
import { OrganizationRole, OrganizationRoleProvider } from "./OrganizationRole.js";
|
|
16
|
+
import { OrganizationSettings, OrganizationSettingsProvider } from "./OrganizationSettings.js";
|
|
17
|
+
import { Region, RegionProvider } from "./Region.js";
|
|
18
|
+
import { Registry, RegistryProvider } from "./Registry.js";
|
|
19
|
+
import { Runner, RunnerProvider } from "./Runner.js";
|
|
20
|
+
import { Sandbox, SandboxProvider } from "./Sandbox.js";
|
|
21
|
+
import { Secret, SecretProvider } from "./Secret.js";
|
|
22
|
+
import { Snapshot, SnapshotProvider } from "./Snapshot.js";
|
|
23
|
+
import { Volume, VolumeProvider } from "./Volume.js";
|
|
24
|
+
import { WarmPool, WarmPoolProvider } from "./WarmPool.js";
|
|
25
|
+
import { Webhooks, WebhooksProvider } from "./Webhooks.js";
|
|
26
|
+
export class Providers extends Provider.ProviderCollection()("Daytona") {
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Daytona providers and credentials: every Daytona resource, and the
|
|
30
|
+
* Daytona AuthProvider so `alchemy profile edit` can configure it.
|
|
31
|
+
*/
|
|
32
|
+
export const providers = () => Layer.effect(Providers, Provider.collection([
|
|
33
|
+
ApiKey,
|
|
34
|
+
IdentityProvider,
|
|
35
|
+
Organization,
|
|
36
|
+
OrganizationInvitation,
|
|
37
|
+
OrganizationMember,
|
|
38
|
+
OrganizationOtelConfig,
|
|
39
|
+
OrganizationRole,
|
|
40
|
+
OrganizationSettings,
|
|
41
|
+
Region,
|
|
42
|
+
Registry,
|
|
43
|
+
Runner,
|
|
44
|
+
Sandbox,
|
|
45
|
+
Secret,
|
|
46
|
+
Snapshot,
|
|
47
|
+
Volume,
|
|
48
|
+
WarmPool,
|
|
49
|
+
Webhooks,
|
|
50
|
+
])).pipe(Layer.provide(Layer.mergeAll(ApiKeyProvider(), IdentityProviderProvider(), OrganizationProvider(), OrganizationInvitationProvider(), OrganizationMemberProvider(), OrganizationOtelConfigProvider(), OrganizationRoleProvider(), OrganizationSettingsProvider(), RegionProvider(), RegistryProvider(), RunnerProvider(), SandboxProvider(), SecretProvider(), SnapshotProvider(), VolumeProvider(), WarmPoolProvider(), WebhooksProvider())),
|
|
51
|
+
// Snapshots Daytona can't build are built with local Docker.
|
|
52
|
+
Layer.provideMerge(DockerLive), Layer.provideMerge(Credentials.fromAuthProvider()), Layer.provideMerge(FetchHttpClient.layer), Layer.provideMerge(DaytonaAuth), Layer.provideMerge(ProfileStoreLive), Layer.provideMerge(CredentialsStoreLive), Layer.orDie);
|
|
53
|
+
//# sourceMappingURL=Providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Providers.js","sources":["../src/Providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as audit from "@distilled.cloud/daytona/audit";
|
|
2
|
+
import * as Binding from "alchemy/Binding";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { type OrganizationFixed, type ScopedModule } from "./internal/Scoped.ts";
|
|
6
|
+
/** The organization's audit log. */
|
|
7
|
+
export interface ReadAuditLogsClient extends ScopedModule<typeof audit, OrganizationFixed> {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Read the organization's audit log at runtime: who created, started,
|
|
11
|
+
* deleted or changed what, and with which API key.
|
|
12
|
+
*
|
|
13
|
+
* The host gets its own Daytona API key with `read:audit_logs`.
|
|
14
|
+
*
|
|
15
|
+
* ### Reading the Audit Log
|
|
16
|
+
* **Example:** The latest entries
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const audit = yield* Daytona.ReadAuditLogs();
|
|
19
|
+
* const page = yield* audit.getOrganizationAuditLogs({ limit: 50 });
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @binding
|
|
23
|
+
* @product Organization
|
|
24
|
+
*/
|
|
25
|
+
export interface ReadAuditLogs extends Binding.Service<ReadAuditLogs, "Daytona.ReadAuditLogs", () => Effect.Effect<ReadAuditLogsClient>> {
|
|
26
|
+
}
|
|
27
|
+
export declare const ReadAuditLogs: ReadAuditLogs;
|
|
28
|
+
/** {@link ReadAuditLogs} over Daytona's HTTP API; works on any host. */
|
|
29
|
+
export declare const ReadAuditLogsHttp: Layer.Layer<ReadAuditLogs, never, never>;
|
|
30
|
+
//# sourceMappingURL=ReadAuditLogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadAuditLogs.d.ts","sources":["../src/ReadAuditLogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAe,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG9F,oCAAoC;AACpC,MAAM,WAAW,mBAAoB,SAAQ,YAAY,CAAC,OAAO,KAAK,EAAE,iBAAiB,CAAC;CAAG;AAE7F;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,aAAc,SAAQ,OAAO,CAAC,OAAO,CACpD,aAAa,EACb,uBAAuB,EACvB,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACzC;CAAG;AAEJ,eAAO,MAAM,aAAa,eAA0D,CAAC;AAErF,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,0CAa7B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as audit from "@distilled.cloud/daytona/audit";
|
|
2
|
+
import * as Binding from "alchemy/Binding";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { makeAccess } from "./DaytonaBindings.js";
|
|
6
|
+
import { scopeModule } from "./internal/Scoped.js";
|
|
7
|
+
import { lazyScoped } from "./ReadOrganization.js";
|
|
8
|
+
export const ReadAuditLogs = Binding.Service("Daytona.ReadAuditLogs");
|
|
9
|
+
/** {@link ReadAuditLogs} over Daytona's HTTP API; works on any host. */
|
|
10
|
+
export const ReadAuditLogsHttp = Layer.effect(ReadAuditLogs, Effect.gen(function* () {
|
|
11
|
+
const access = yield* makeAccess;
|
|
12
|
+
return Effect.fn(function* () {
|
|
13
|
+
const { authorize, organizationId } = yield* access("AuditLogs", ["read:audit_logs"]);
|
|
14
|
+
return lazyScoped(organizationId, (id) => scopeModule(audit, { organizationId: id }, (effect) => authorize(effect)));
|
|
15
|
+
});
|
|
16
|
+
}));
|
|
17
|
+
//# sourceMappingURL=ReadAuditLogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadAuditLogs.js","sources":["../src/ReadAuditLogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAA6C,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA2BnD,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAgB,uBAAuB,CAAC,CAAC;AAErF,wEAAwE;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAC3C,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACjC,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACxB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACtF,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CACvC,WAAW,CAAkC,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CACrF,SAAS,CAAC,MAAM,CAAC,CAClB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as organizations from "@distilled.cloud/daytona/organizations";
|
|
2
|
+
import * as regions from "@distilled.cloud/daytona/regions";
|
|
3
|
+
import * as webhooks from "@distilled.cloud/daytona/webhooks";
|
|
4
|
+
import * as Binding from "alchemy/Binding";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import { type ScopedModule } from "./internal/Scoped.ts";
|
|
8
|
+
declare const ORGANIZATION_READS: readonly ["getGpuCapacity", "listAvailableSandboxClasses", "getOrganizationUsageOverview"];
|
|
9
|
+
declare const WEBHOOK_READS: readonly ["getWebhookControllerAppPortalAccess", "getWebhookControllerInitializationStatus"];
|
|
10
|
+
/** Read-only views of the organization: quotas, usage, GPU capacity, regions and the webhook portal. */
|
|
11
|
+
export interface ReadOrganizationClient extends ScopedModule<Pick<typeof organizations, (typeof ORGANIZATION_READS)[number]>>, ScopedModule<typeof regions>, ScopedModule<Pick<typeof webhooks, (typeof WEBHOOK_READS)[number]>> {
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read the organization's limits and usage at runtime: current usage
|
|
15
|
+
* against quotas, which sandbox classes and GPUs are available, and the
|
|
16
|
+
* shared regions. Use it to pick a region or refuse work before hitting a
|
|
17
|
+
* quota.
|
|
18
|
+
*
|
|
19
|
+
* The host gets its own Daytona API key with `read:limits`.
|
|
20
|
+
*
|
|
21
|
+
* ### Checking Capacity
|
|
22
|
+
* **Example:** Refuse a GPU job when no GPUs are free
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const org = yield* Daytona.ReadOrganization();
|
|
25
|
+
* const capacity = yield* org.getGpuCapacity();
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @binding
|
|
29
|
+
* @product Organization
|
|
30
|
+
*/
|
|
31
|
+
export interface ReadOrganization extends Binding.Service<ReadOrganization, "Daytona.ReadOrganization", () => Effect.Effect<ReadOrganizationClient>> {
|
|
32
|
+
}
|
|
33
|
+
export declare const ReadOrganization: ReadOrganization;
|
|
34
|
+
/** {@link ReadOrganization} over Daytona's HTTP API; works on any host. */
|
|
35
|
+
export declare const ReadOrganizationHttp: Layer.Layer<ReadOrganization, never, never>;
|
|
36
|
+
/** Build a scoped client whose organization id resolves at runtime. */
|
|
37
|
+
export declare const lazyScoped: <C extends object>(organizationId: Effect.Effect<string, never, any>, make: (organizationId: string) => C) => C;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=ReadOrganization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadOrganization.d.ts","sources":["../src/ReadOrganization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,QAAQ,MAAM,mCAAmC,CAAC;AAC9D,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE5E,QAAA,MAAM,kBAAkB,YACtB,gBAAgB,EAChB,6BAA6B,EAC7B,8BAA8B,CACtB,CAAC;AAEX,QAAA,MAAM,aAAa,YACjB,qCAAqC,EACrC,0CAA0C,CAClC,CAAC;AAEX,wGAAwG;AACxG,MAAM,WAAW,sBACf,SACE,YAAY,CAAC,IAAI,CAAC,OAAO,aAAa,EAAE,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAC7E,YAAY,CAAC,OAAO,OAAO,CAAC,EAC5B,YAAY,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;CAAG;AAE1E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,gBAAiB,SAAQ,OAAO,CAAC,OAAO,CACvD,gBAAgB,EAChB,0BAA0B,EAC1B,MAAM,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAC5C;CAAG;AAEJ,eAAO,MAAM,gBAAgB,kBAAgE,CAAC;AAE9F,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,6CAchC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,kBACzB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAC3C,CAAC,cAAc,EAAE,MAAM,KAAK,CAAC,KAClC,CAQC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as organizations from "@distilled.cloud/daytona/organizations";
|
|
2
|
+
import * as regions from "@distilled.cloud/daytona/regions";
|
|
3
|
+
import * as webhooks from "@distilled.cloud/daytona/webhooks";
|
|
4
|
+
import * as Binding from "alchemy/Binding";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import { makeAccess } from "./DaytonaBindings.js";
|
|
8
|
+
import { pick, scopeModule } from "./internal/Scoped.js";
|
|
9
|
+
const ORGANIZATION_READS = [
|
|
10
|
+
"getGpuCapacity",
|
|
11
|
+
"listAvailableSandboxClasses",
|
|
12
|
+
"getOrganizationUsageOverview",
|
|
13
|
+
];
|
|
14
|
+
const WEBHOOK_READS = [
|
|
15
|
+
"getWebhookControllerAppPortalAccess",
|
|
16
|
+
"getWebhookControllerInitializationStatus",
|
|
17
|
+
];
|
|
18
|
+
export const ReadOrganization = Binding.Service("Daytona.ReadOrganization");
|
|
19
|
+
/** {@link ReadOrganization} over Daytona's HTTP API; works on any host. */
|
|
20
|
+
export const ReadOrganizationHttp = Layer.effect(ReadOrganization, Effect.gen(function* () {
|
|
21
|
+
const access = yield* makeAccess;
|
|
22
|
+
return Effect.fn(function* () {
|
|
23
|
+
const { authorize, organizationId } = yield* access("Organization", ["read:limits"]);
|
|
24
|
+
const run = (effect) => authorize(effect);
|
|
25
|
+
return lazyScoped(organizationId, (id) => ({
|
|
26
|
+
...scopeModule(pick(organizations, ORGANIZATION_READS), { organizationId: id }, run),
|
|
27
|
+
...scopeModule(regions, {}, run),
|
|
28
|
+
...scopeModule(pick(webhooks, WEBHOOK_READS), { organizationId: id }, run),
|
|
29
|
+
}));
|
|
30
|
+
});
|
|
31
|
+
}));
|
|
32
|
+
/** Build a scoped client whose organization id resolves at runtime. */
|
|
33
|
+
export const lazyScoped = (organizationId, make) => new Proxy({}, {
|
|
34
|
+
get: (_t, key) => (...args) =>
|
|
35
|
+
// `key` is a property of C (the Proxy only sees C's members), but a
|
|
36
|
+
// Proxy trap types it as string, so the lookup is untyped here.
|
|
37
|
+
Effect.flatMap(organizationId, (id) => make(id)[key](...args)),
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=ReadOrganization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadOrganization.js","sources":["../src/ReadOrganization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAC5D,OAAO,KAAK,QAAQ,MAAM,mCAAmC,CAAC;AAC9D,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAqB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,kBAAkB,GAAG;IACzB,gBAAgB;IAChB,6BAA6B;IAC7B,8BAA8B;CACtB,CAAC;AAEX,MAAM,aAAa,GAAG;IACpB,qCAAqC;IACrC,0CAA0C;CAClC,CAAC;AAiCX,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAmB,0BAA0B,CAAC,CAAC;AAE9F,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAC9C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACjC,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACxB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;QACrF,MAAM,GAAG,GAAG,CAAU,MAA8B,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;YACpF,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC;YAChC,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;SAC3E,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,cAAiD,EACjD,IAAmC,EAChC,EAAE,CACL,IAAI,KAAK,CAAC,EAAO,EAAE;IACjB,GAAG,EACD,CAAC,EAAE,EAAE,GAAW,EAAE,EAAE,CACpB,CAAC,GAAG,IAAe,EAAE,EAAE;IACrB,oEAAoE;IACpE,gEAAgE;IAChE,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAE,IAAI,CAAC,EAAE,CAAS,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC5E,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as usage from "@distilled.cloud/daytona/usage";
|
|
2
|
+
import * as Binding from "alchemy/Binding";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { type OrganizationFixed, type ScopedModule } from "./internal/Scoped.ts";
|
|
6
|
+
/** Usage from Daytona's analytics API: totals, charts and per-sandbox usage. */
|
|
7
|
+
export interface ReadUsageClient extends ScopedModule<typeof usage, OrganizationFixed> {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Read the organization's compute usage at runtime: aggregated totals, a
|
|
11
|
+
* chart over time, and usage per sandbox. Use it to bill your own users
|
|
12
|
+
* for the sandboxes you run for them.
|
|
13
|
+
*
|
|
14
|
+
* The host gets its own Daytona API key with `read:billing`.
|
|
15
|
+
*
|
|
16
|
+
* ### Usage per Sandbox
|
|
17
|
+
* **Example:** Usage over the last day
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const usage = yield* Daytona.ReadUsage();
|
|
20
|
+
* const rows = yield* usage.listOrganizationUsageSandbox({ from, to });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @binding
|
|
24
|
+
* @product Organization
|
|
25
|
+
*/
|
|
26
|
+
export interface ReadUsage extends Binding.Service<ReadUsage, "Daytona.ReadUsage", () => Effect.Effect<ReadUsageClient>> {
|
|
27
|
+
}
|
|
28
|
+
export declare const ReadUsage: ReadUsage;
|
|
29
|
+
/** {@link ReadUsage} over Daytona's analytics API; works on any host. */
|
|
30
|
+
export declare const ReadUsageHttp: Layer.Layer<ReadUsage, never, never>;
|
|
31
|
+
//# sourceMappingURL=ReadUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadUsage.d.ts","sources":["../src/ReadUsage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAe,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG9F,gFAAgF;AAChF,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,KAAK,EAAE,iBAAiB,CAAC;CAAG;AAEzF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,SAAU,SAAQ,OAAO,CAAC,OAAO,CAChD,SAAS,EACT,mBAAmB,EACnB,MAAM,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CACrC;CAAG;AAEJ,eAAO,MAAM,SAAS,WAAkD,CAAC;AAEzE,yEAAyE;AACzE,eAAO,MAAM,aAAa,sCAazB,CAAC"}
|
package/lib/ReadUsage.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as usage from "@distilled.cloud/daytona/usage";
|
|
2
|
+
import * as Binding from "alchemy/Binding";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { makeAccess } from "./DaytonaBindings.js";
|
|
6
|
+
import { scopeModule } from "./internal/Scoped.js";
|
|
7
|
+
import { lazyScoped } from "./ReadOrganization.js";
|
|
8
|
+
export const ReadUsage = Binding.Service("Daytona.ReadUsage");
|
|
9
|
+
/** {@link ReadUsage} over Daytona's analytics API; works on any host. */
|
|
10
|
+
export const ReadUsageHttp = Layer.effect(ReadUsage, Effect.gen(function* () {
|
|
11
|
+
const access = yield* makeAccess;
|
|
12
|
+
return Effect.fn(function* () {
|
|
13
|
+
const { authorize, organizationId } = yield* access("Usage", ["read:billing"]);
|
|
14
|
+
return lazyScoped(organizationId, (id) => scopeModule(usage, { organizationId: id }, (effect) => authorize(effect)));
|
|
15
|
+
});
|
|
16
|
+
}));
|
|
17
|
+
//# sourceMappingURL=ReadUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadUsage.js","sources":["../src/ReadUsage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAA6C,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4BnD,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAY,mBAAmB,CAAC,CAAC;AAEzE,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CACvC,SAAS,EACT,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACjC,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACxB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;QAC/E,OAAO,UAAU,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CACvC,WAAW,CAAkC,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CACrF,SAAS,CAAC,MAAM,CAAC,CAClB,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
|