@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.
Files changed (274) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +80 -2
  3. package/lib/ApiKey.d.ts +99 -0
  4. package/lib/ApiKey.d.ts.map +1 -0
  5. package/lib/ApiKey.js +152 -0
  6. package/lib/ApiKey.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +55 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +280 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/Bootstrap.d.ts +8 -0
  12. package/lib/Bootstrap.d.ts.map +1 -0
  13. package/lib/Bootstrap.js +28 -0
  14. package/lib/Bootstrap.js.map +1 -0
  15. package/lib/ConnectSandbox.d.ts +72 -0
  16. package/lib/ConnectSandbox.d.ts.map +1 -0
  17. package/lib/ConnectSandbox.js +3 -0
  18. package/lib/ConnectSandbox.js.map +1 -0
  19. package/lib/ConnectSandboxHttp.d.ts +5 -0
  20. package/lib/ConnectSandboxHttp.d.ts.map +1 -0
  21. package/lib/ConnectSandboxHttp.js +22 -0
  22. package/lib/ConnectSandboxHttp.js.map +1 -0
  23. package/lib/Contributions.d.ts +7 -0
  24. package/lib/Contributions.d.ts.map +1 -0
  25. package/lib/Contributions.js +6 -0
  26. package/lib/Contributions.js.map +1 -0
  27. package/lib/CreateSandbox.d.ts +86 -0
  28. package/lib/CreateSandbox.d.ts.map +1 -0
  29. package/lib/CreateSandbox.js +3 -0
  30. package/lib/CreateSandbox.js.map +1 -0
  31. package/lib/CreateSandboxHttp.d.ts +5 -0
  32. package/lib/CreateSandboxHttp.d.ts.map +1 -0
  33. package/lib/CreateSandboxHttp.js +65 -0
  34. package/lib/CreateSandboxHttp.js.map +1 -0
  35. package/lib/CreateSecret.d.ts +56 -0
  36. package/lib/CreateSecret.d.ts.map +1 -0
  37. package/lib/CreateSecret.js +3 -0
  38. package/lib/CreateSecret.js.map +1 -0
  39. package/lib/CreateSecretHttp.d.ts +5 -0
  40. package/lib/CreateSecretHttp.d.ts.map +1 -0
  41. package/lib/CreateSecretHttp.js +39 -0
  42. package/lib/CreateSecretHttp.js.map +1 -0
  43. package/lib/CreateSnapshot.d.ts +80 -0
  44. package/lib/CreateSnapshot.d.ts.map +1 -0
  45. package/lib/CreateSnapshot.js +3 -0
  46. package/lib/CreateSnapshot.js.map +1 -0
  47. package/lib/CreateSnapshotHttp.d.ts +5 -0
  48. package/lib/CreateSnapshotHttp.d.ts.map +1 -0
  49. package/lib/CreateSnapshotHttp.js +47 -0
  50. package/lib/CreateSnapshotHttp.js.map +1 -0
  51. package/lib/CreateVolume.d.ts +81 -0
  52. package/lib/CreateVolume.d.ts.map +1 -0
  53. package/lib/CreateVolume.js +10 -0
  54. package/lib/CreateVolume.js.map +1 -0
  55. package/lib/CreateVolumeHttp.d.ts +5 -0
  56. package/lib/CreateVolumeHttp.d.ts.map +1 -0
  57. package/lib/CreateVolumeHttp.js +31 -0
  58. package/lib/CreateVolumeHttp.js.map +1 -0
  59. package/lib/Credentials.d.ts +9 -0
  60. package/lib/Credentials.d.ts.map +1 -0
  61. package/lib/Credentials.js +18 -0
  62. package/lib/Credentials.js.map +1 -0
  63. package/lib/DaytonaBindings.d.ts +51 -0
  64. package/lib/DaytonaBindings.d.ts.map +1 -0
  65. package/lib/DaytonaBindings.js +61 -0
  66. package/lib/DaytonaBindings.js.map +1 -0
  67. package/lib/IdentityProvider.d.ts +80 -0
  68. package/lib/IdentityProvider.d.ts.map +1 -0
  69. package/lib/IdentityProvider.js +111 -0
  70. package/lib/IdentityProvider.js.map +1 -0
  71. package/lib/MountVolume.d.ts +86 -0
  72. package/lib/MountVolume.d.ts.map +1 -0
  73. package/lib/MountVolume.js +27 -0
  74. package/lib/MountVolume.js.map +1 -0
  75. package/lib/OAuthClient.d.ts +14 -0
  76. package/lib/OAuthClient.d.ts.map +1 -0
  77. package/lib/OAuthClient.js +23 -0
  78. package/lib/OAuthClient.js.map +1 -0
  79. package/lib/Organization.d.ts +40 -0
  80. package/lib/Organization.d.ts.map +1 -0
  81. package/lib/Organization.js +80 -0
  82. package/lib/Organization.js.map +1 -0
  83. package/lib/OrganizationInvitation.d.ts +70 -0
  84. package/lib/OrganizationInvitation.d.ts.map +1 -0
  85. package/lib/OrganizationInvitation.js +109 -0
  86. package/lib/OrganizationInvitation.js.map +1 -0
  87. package/lib/OrganizationMember.d.ts +86 -0
  88. package/lib/OrganizationMember.d.ts.map +1 -0
  89. package/lib/OrganizationMember.js +109 -0
  90. package/lib/OrganizationMember.js.map +1 -0
  91. package/lib/OrganizationOtelConfig.d.ts +59 -0
  92. package/lib/OrganizationOtelConfig.d.ts.map +1 -0
  93. package/lib/OrganizationOtelConfig.js +87 -0
  94. package/lib/OrganizationOtelConfig.js.map +1 -0
  95. package/lib/OrganizationRole.d.ts +66 -0
  96. package/lib/OrganizationRole.d.ts.map +1 -0
  97. package/lib/OrganizationRole.js +106 -0
  98. package/lib/OrganizationRole.js.map +1 -0
  99. package/lib/OrganizationSettings.d.ts +76 -0
  100. package/lib/OrganizationSettings.d.ts.map +1 -0
  101. package/lib/OrganizationSettings.js +107 -0
  102. package/lib/OrganizationSettings.js.map +1 -0
  103. package/lib/Providers.d.ts +14 -0
  104. package/lib/Providers.d.ts.map +1 -0
  105. package/lib/Providers.js +53 -0
  106. package/lib/Providers.js.map +1 -0
  107. package/lib/ReadAuditLogs.d.ts +30 -0
  108. package/lib/ReadAuditLogs.d.ts.map +1 -0
  109. package/lib/ReadAuditLogs.js +17 -0
  110. package/lib/ReadAuditLogs.js.map +1 -0
  111. package/lib/ReadOrganization.d.ts +39 -0
  112. package/lib/ReadOrganization.d.ts.map +1 -0
  113. package/lib/ReadOrganization.js +39 -0
  114. package/lib/ReadOrganization.js.map +1 -0
  115. package/lib/ReadUsage.d.ts +31 -0
  116. package/lib/ReadUsage.d.ts.map +1 -0
  117. package/lib/ReadUsage.js +17 -0
  118. package/lib/ReadUsage.js.map +1 -0
  119. package/lib/Region.d.ts +78 -0
  120. package/lib/Region.d.ts.map +1 -0
  121. package/lib/Region.js +169 -0
  122. package/lib/Region.js.map +1 -0
  123. package/lib/Registry.d.ts +84 -0
  124. package/lib/Registry.d.ts.map +1 -0
  125. package/lib/Registry.js +97 -0
  126. package/lib/Registry.js.map +1 -0
  127. package/lib/Runner.d.ts +66 -0
  128. package/lib/Runner.d.ts.map +1 -0
  129. package/lib/Runner.js +116 -0
  130. package/lib/Runner.js.map +1 -0
  131. package/lib/Sandbox.d.ts +376 -0
  132. package/lib/Sandbox.d.ts.map +1 -0
  133. package/lib/Sandbox.js +565 -0
  134. package/lib/Sandbox.js.map +1 -0
  135. package/lib/SandboxClient.d.ts +258 -0
  136. package/lib/SandboxClient.d.ts.map +1 -0
  137. package/lib/SandboxClient.js +233 -0
  138. package/lib/SandboxClient.js.map +1 -0
  139. package/lib/Secret.d.ts +93 -0
  140. package/lib/Secret.d.ts.map +1 -0
  141. package/lib/Secret.js +130 -0
  142. package/lib/Secret.js.map +1 -0
  143. package/lib/Snapshot.d.ts +327 -0
  144. package/lib/Snapshot.d.ts.map +1 -0
  145. package/lib/Snapshot.js +447 -0
  146. package/lib/Snapshot.js.map +1 -0
  147. package/lib/Volume.d.ts +99 -0
  148. package/lib/Volume.d.ts.map +1 -0
  149. package/lib/Volume.js +152 -0
  150. package/lib/Volume.js.map +1 -0
  151. package/lib/WarmPool.d.ts +61 -0
  152. package/lib/WarmPool.d.ts.map +1 -0
  153. package/lib/WarmPool.js +81 -0
  154. package/lib/WarmPool.js.map +1 -0
  155. package/lib/Webhooks.d.ts +58 -0
  156. package/lib/Webhooks.d.ts.map +1 -0
  157. package/lib/Webhooks.js +75 -0
  158. package/lib/Webhooks.js.map +1 -0
  159. package/lib/index.d.ts +37 -0
  160. package/lib/index.d.ts.map +1 -0
  161. package/lib/index.js +36 -0
  162. package/lib/index.js.map +1 -0
  163. package/lib/internal/BuildContext.d.ts +16 -0
  164. package/lib/internal/BuildContext.d.ts.map +1 -0
  165. package/lib/internal/BuildContext.js +50 -0
  166. package/lib/internal/BuildContext.js.map +1 -0
  167. package/lib/internal/Declared.d.ts +29 -0
  168. package/lib/internal/Declared.d.ts.map +1 -0
  169. package/lib/internal/Declared.js +31 -0
  170. package/lib/internal/Declared.js.map +1 -0
  171. package/lib/internal/Derived.d.ts +40 -0
  172. package/lib/internal/Derived.d.ts.map +1 -0
  173. package/lib/internal/Derived.js +64 -0
  174. package/lib/internal/Derived.js.map +1 -0
  175. package/lib/internal/Errors.d.ts +4 -0
  176. package/lib/internal/Errors.d.ts.map +1 -0
  177. package/lib/internal/Errors.js +1 -0
  178. package/lib/internal/Errors.js.map +1 -0
  179. package/lib/internal/Labels.d.ts +20 -0
  180. package/lib/internal/Labels.d.ts.map +1 -0
  181. package/lib/internal/Labels.js +22 -0
  182. package/lib/internal/Labels.js.map +1 -0
  183. package/lib/internal/Names.d.ts +18 -0
  184. package/lib/internal/Names.d.ts.map +1 -0
  185. package/lib/internal/Names.js +25 -0
  186. package/lib/internal/Names.js.map +1 -0
  187. package/lib/internal/Organization.d.ts +27 -0
  188. package/lib/internal/Organization.d.ts.map +1 -0
  189. package/lib/internal/Organization.js +32 -0
  190. package/lib/internal/Organization.js.map +1 -0
  191. package/lib/internal/Process.d.ts +14 -0
  192. package/lib/internal/Process.d.ts.map +1 -0
  193. package/lib/internal/Process.js +15 -0
  194. package/lib/internal/Process.js.map +1 -0
  195. package/lib/internal/Program.d.ts +83 -0
  196. package/lib/internal/Program.d.ts.map +1 -0
  197. package/lib/internal/Program.js +169 -0
  198. package/lib/internal/Program.js.map +1 -0
  199. package/lib/internal/Ref.d.ts +14 -0
  200. package/lib/internal/Ref.d.ts.map +1 -0
  201. package/lib/internal/Ref.js +7 -0
  202. package/lib/internal/Ref.js.map +1 -0
  203. package/lib/internal/Scoped.d.ts +31 -0
  204. package/lib/internal/Scoped.d.ts.map +1 -0
  205. package/lib/internal/Scoped.js +48 -0
  206. package/lib/internal/Scoped.js.map +1 -0
  207. package/lib/internal/Tar.d.ts +13 -0
  208. package/lib/internal/Tar.d.ts.map +1 -0
  209. package/lib/internal/Tar.js +62 -0
  210. package/lib/internal/Tar.js.map +1 -0
  211. package/lib/internal/Toolbox.d.ts +11 -0
  212. package/lib/internal/Toolbox.d.ts.map +1 -0
  213. package/lib/internal/Toolbox.js +20 -0
  214. package/lib/internal/Toolbox.js.map +1 -0
  215. package/lib/internal/Wait.d.ts +49 -0
  216. package/lib/internal/Wait.d.ts.map +1 -0
  217. package/lib/internal/Wait.js +57 -0
  218. package/lib/internal/Wait.js.map +1 -0
  219. package/package.json +79 -3
  220. package/src/ApiKey.ts +221 -0
  221. package/src/AuthProvider.ts +406 -0
  222. package/src/Bootstrap.ts +55 -0
  223. package/src/ConnectSandbox.ts +76 -0
  224. package/src/ConnectSandboxHttp.ts +26 -0
  225. package/src/Contributions.ts +9 -0
  226. package/src/CreateSandbox.ts +107 -0
  227. package/src/CreateSandboxHttp.ts +97 -0
  228. package/src/CreateSecret.ts +73 -0
  229. package/src/CreateSecretHttp.ts +58 -0
  230. package/src/CreateSnapshot.ts +133 -0
  231. package/src/CreateSnapshotHttp.ts +77 -0
  232. package/src/CreateVolume.ts +104 -0
  233. package/src/CreateVolumeHttp.ts +50 -0
  234. package/src/Credentials.ts +37 -0
  235. package/src/DaytonaBindings.ts +111 -0
  236. package/src/IdentityProvider.ts +181 -0
  237. package/src/MountVolume.ts +122 -0
  238. package/src/OAuthClient.ts +27 -0
  239. package/src/Organization.ts +121 -0
  240. package/src/OrganizationInvitation.ts +174 -0
  241. package/src/OrganizationMember.ts +174 -0
  242. package/src/OrganizationOtelConfig.ts +138 -0
  243. package/src/OrganizationRole.ts +167 -0
  244. package/src/OrganizationSettings.ts +187 -0
  245. package/src/Providers.ts +93 -0
  246. package/src/ReadAuditLogs.ts +50 -0
  247. package/src/ReadOrganization.ts +83 -0
  248. package/src/ReadUsage.ts +51 -0
  249. package/src/Region.ts +226 -0
  250. package/src/Registry.ts +164 -0
  251. package/src/Runner.ts +166 -0
  252. package/src/Sandbox.ts +927 -0
  253. package/src/SandboxClient.ts +625 -0
  254. package/src/Secret.ts +203 -0
  255. package/src/Snapshot.ts +685 -0
  256. package/src/Volume.ts +229 -0
  257. package/src/WarmPool.ts +128 -0
  258. package/src/Webhooks.ts +121 -0
  259. package/src/globals.d.ts +2 -0
  260. package/src/index.ts +46 -0
  261. package/src/internal/BuildContext.ts +62 -0
  262. package/src/internal/Declared.ts +80 -0
  263. package/src/internal/Derived.ts +97 -0
  264. package/src/internal/Errors.ts +4 -0
  265. package/src/internal/Labels.ts +39 -0
  266. package/src/internal/Names.ts +37 -0
  267. package/src/internal/Organization.ts +40 -0
  268. package/src/internal/Process.ts +25 -0
  269. package/src/internal/Program.ts +239 -0
  270. package/src/internal/Ref.ts +15 -0
  271. package/src/internal/Scoped.ts +102 -0
  272. package/src/internal/Tar.ts +72 -0
  273. package/src/internal/Toolbox.ts +27 -0
  274. package/src/internal/Wait.ts +105 -0
@@ -0,0 +1,280 @@
1
+ import { credentials, DEFAULT_API_BASE_URL } from "@distilled.cloud/daytona/Credentials";
2
+ import { listOrganizations } from "@distilled.cloud/daytona/organizations";
3
+ import { AuthError, AuthProviderLayer, NeedsReauth, refreshHint, } from "alchemy/Auth/AuthProvider";
4
+ import { deviceOAuth } from "alchemy/Auth/BrowserOAuth";
5
+ import { displayRedacted } from "alchemy/Auth/Credentials";
6
+ import { getEnv, getEnvRedacted, mapPromptCancellation } from "alchemy/Auth/Env";
7
+ import { withProfileCredentialsLock } from "alchemy/Auth/Lock";
8
+ import { collectFieldValues, storedSecret, storedValueText, validateFieldValues, } from "alchemy/Auth/StoredAuthProvider";
9
+ import * as Interaction from "alchemy/Interaction";
10
+ import * as Clock from "effect/Clock";
11
+ import * as Duration from "effect/Duration";
12
+ import * as Effect from "effect/Effect";
13
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
14
+ import * as Layer from "effect/Layer";
15
+ import * as Match from "effect/Match";
16
+ import * as Redacted from "effect/Redacted";
17
+ import * as Schema from "effect/Schema";
18
+ import * as OAuthClient from "./OAuthClient.js";
19
+ export const DAYTONA_AUTH_PROVIDER_NAME = "Daytona";
20
+ /**
21
+ * Values stored in a Daytona profile: an organization API key, or a user
22
+ * session from `alchemy profile login` (Daytona's device login).
23
+ */
24
+ export const DaytonaAuthConfigSchema = Schema.Union([
25
+ Schema.Struct({
26
+ method: Schema.Literal("stored"),
27
+ apiKey: Schema.String,
28
+ apiBaseUrl: Schema.optional(Schema.String),
29
+ organizationId: Schema.optional(Schema.String),
30
+ }),
31
+ Schema.Struct({
32
+ method: Schema.Literal("oauth"),
33
+ organizationId: Schema.String,
34
+ apiBaseUrl: Schema.optional(Schema.String),
35
+ clientId: Schema.optional(Schema.String),
36
+ access: Schema.String,
37
+ refresh: Schema.String,
38
+ expires: Schema.Number,
39
+ scopes: Schema.String.pipe(Schema.Array, Schema.mutable),
40
+ }),
41
+ ]);
42
+ const apiKeyFields = [
43
+ {
44
+ name: "apiKey",
45
+ label: "Daytona API key (https://app.daytona.io/dashboard/keys)",
46
+ secret: true,
47
+ },
48
+ {
49
+ name: "apiBaseUrl",
50
+ label: "Daytona API URL",
51
+ optional: true,
52
+ placeholder: DEFAULT_API_BASE_URL,
53
+ },
54
+ ];
55
+ const storedConfig = (values) => ({
56
+ method: "stored",
57
+ apiKey: Redacted.value(storedSecret(values.apiKey) ?? Redacted.make("")),
58
+ apiBaseUrl: storedValueText(values.apiBaseUrl),
59
+ });
60
+ const toOAuthCredentials = (config) => ({
61
+ type: "oauth",
62
+ clientId: config.clientId,
63
+ access: Redacted.make(config.access),
64
+ refresh: Redacted.make(config.refresh),
65
+ expires: config.expires,
66
+ scopes: config.scopes,
67
+ });
68
+ const fromOAuthCredentials = (fresh) => ({
69
+ clientId: fresh.clientId,
70
+ access: Redacted.value(fresh.access),
71
+ refresh: Redacted.value(fresh.refresh),
72
+ expires: fresh.expires,
73
+ scopes: fresh.scopes,
74
+ });
75
+ /** List the user's organizations and pick one (prompting when there are several). */
76
+ const selectOrganization = (accessToken) => Effect.gen(function* () {
77
+ const organizations = yield* listOrganizations({});
78
+ const [only] = organizations;
79
+ if (only === undefined) {
80
+ return yield* AuthError.make({ message: "Daytona: this user belongs to no organization." });
81
+ }
82
+ if (organizations.length === 1) {
83
+ yield* Interaction.info(`Daytona: using organization ${only.name} (${only.id})`);
84
+ return only.id;
85
+ }
86
+ return yield* Interaction.select({
87
+ message: "Select a Daytona organization",
88
+ options: organizations.map((o) => ({ value: o.id, label: o.name, description: o.id })),
89
+ }).pipe(mapPromptCancellation);
90
+ }).pipe(Effect.provide(Layer.mergeAll(credentials({ apiKey: accessToken }), FetchHttpClient.layer)));
91
+ /**
92
+ * Layer that registers the Daytona {@link AuthProvider} into the
93
+ * {@link AuthProviders} registry when built, so `alchemy profile edit` can
94
+ * configure it.
95
+ *
96
+ * Supported methods:
97
+ * - `oauth`: Daytona's device login (the same as `daytona login`); the
98
+ * session refreshes itself and can manage the organization.
99
+ * - `stored`: an organization API key stored inline.
100
+ */
101
+ export const DaytonaAuth = AuthProviderLayer()(DAYTONA_AUTH_PROVIDER_NAME, Effect.gen(function* () {
102
+ const configureOAuth = Effect.fn(function* (_profileName) {
103
+ const authorization = yield* OAuthClient.deviceAuthorize();
104
+ const session = yield* deviceOAuth({
105
+ provider: "Daytona",
106
+ authorization,
107
+ token: OAuthClient.deviceToken(authorization),
108
+ });
109
+ const organizationId = yield* selectOrganization(session.access);
110
+ yield* Interaction.success("Daytona: signed in.");
111
+ return {
112
+ method: "oauth",
113
+ organizationId,
114
+ ...fromOAuthCredentials(session),
115
+ };
116
+ });
117
+ const configureApiKey = (_profileName) => collectFieldValues(apiKeyFields).pipe(Effect.map(storedConfig), Effect.tap(() => Interaction.success("Daytona: credentials saved.")));
118
+ const configure = (profileName) => Interaction.select({
119
+ message: "Daytona authentication method",
120
+ options: [
121
+ {
122
+ value: "oauth",
123
+ label: "Sign in",
124
+ description: "recommended — device login; can also manage the organization",
125
+ },
126
+ {
127
+ value: "stored",
128
+ label: "API key",
129
+ description: "an organization API key stored inline",
130
+ },
131
+ ],
132
+ }).pipe(mapPromptCancellation, Effect.flatMap((method) => Match.value(method).pipe(Match.when("oauth", () => configureOAuth(profileName)), Match.when("stored", () => configureApiKey(profileName)), Match.exhaustive)), Effect.mapError((e) => AuthError.make({ message: "failed to configure credentials", cause: e })));
133
+ // Sign-in needs a browser, so only the API key has a flag-driven form.
134
+ const configureMethods = [
135
+ { method: "stored", fields: apiKeyFields },
136
+ ];
137
+ const configureWith = (_profileName, input) => input.method === "stored"
138
+ ? validateFieldValues(DAYTONA_AUTH_PROVIDER_NAME, apiKeyFields, input.values).pipe(Effect.map(storedConfig), Effect.tap(() => Interaction.success("Daytona: credentials saved.")))
139
+ : Effect.fail(AuthError.make({
140
+ message: `Daytona: unknown method '${input.method}'. Valid methods: stored. (Sign-in is interactive-only.)`,
141
+ }));
142
+ const read = (profileName, config, updateConfig) => Match.value(config).pipe(Match.when({ method: "stored" }, (stored) => Effect.succeed({
143
+ type: "apiKey",
144
+ token: Redacted.make(stored.apiKey),
145
+ apiBaseUrl: stored.apiBaseUrl ?? DEFAULT_API_BASE_URL,
146
+ organizationId: stored.organizationId,
147
+ source: { type: "stored" },
148
+ })), Match.when({ method: "oauth" }, (oauth) => Effect.gen(function* () {
149
+ const reauth = refreshHint(DAYTONA_AUTH_PROVIDER_NAME, profileName);
150
+ const session = toOAuthCredentials(oauth);
151
+ if (!OAuthClient.usesCurrentClient(session)) {
152
+ return yield* NeedsReauth.make({
153
+ provider: DAYTONA_AUTH_PROVIDER_NAME,
154
+ profile: profileName,
155
+ message: `Daytona credentials for profile '${profileName}' were issued to another OAuth client. ${reauth}`,
156
+ });
157
+ }
158
+ // Refresh within a minute of expiry and persist it: WorkOS
159
+ // refresh tokens are single-use.
160
+ const now = yield* Clock.currentTimeMillis;
161
+ const fresh = session.expires > now + 60_000
162
+ ? session
163
+ : yield* OAuthClient.refresh(session).pipe(Effect.mapError((e) => NeedsReauth.make({
164
+ provider: DAYTONA_AUTH_PROVIDER_NAME,
165
+ profile: profileName,
166
+ message: `Daytona session refresh failed. ${reauth}`,
167
+ cause: e,
168
+ })));
169
+ if (fresh !== session) {
170
+ yield* updateConfig?.({ ...oauth, ...fromOAuthCredentials(fresh) }) ?? Effect.void;
171
+ }
172
+ return {
173
+ type: "oauth",
174
+ token: fresh.access,
175
+ apiBaseUrl: oauth.apiBaseUrl ?? DEFAULT_API_BASE_URL,
176
+ organizationId: oauth.organizationId,
177
+ expires: fresh.expires,
178
+ source: { type: "oauth" },
179
+ };
180
+ })), Match.exhaustive);
181
+ const login = (profileName, config, updateConfig, reload) => Match.value(config).pipe(Match.when({ method: "stored" }, (stored) => Effect.succeed(stored)), Match.when({ method: "oauth" }, (oauth) => Effect.gen(function* () {
182
+ if (!OAuthClient.usesCurrentClient(toOAuthCredentials(oauth))) {
183
+ return yield* configureOAuth(profileName);
184
+ }
185
+ // Refresh with the token stored now, read under the lock.
186
+ const outcome = yield* withProfileCredentialsLock(profileName, Effect.gen(function* () {
187
+ const current = yield* reload ?? Effect.succeed(oauth);
188
+ if (current.method !== "oauth")
189
+ return { type: "signIn" };
190
+ const session = toOAuthCredentials(current);
191
+ if (!OAuthClient.usesCurrentClient(session))
192
+ return { type: "signIn" };
193
+ const fresh = yield* OAuthClient.refresh(session);
194
+ const config = { ...current, ...fromOAuthCredentials(fresh) };
195
+ if (updateConfig === undefined)
196
+ return { type: "refreshed", config };
197
+ yield* updateConfig(config);
198
+ return { type: "refreshed", config: undefined };
199
+ })).pipe(Effect.catchTag([
200
+ "OAuthError",
201
+ "OAuthNetworkError",
202
+ "OAuthServerUnavailable",
203
+ "OAuthInvalidResponse",
204
+ ], () => Effect.succeed({ type: "signIn" })));
205
+ if (outcome.type === "signIn")
206
+ return yield* configureOAuth(profileName);
207
+ yield* Interaction.success("Daytona: session refreshed.");
208
+ return outcome.config;
209
+ })), Match.exhaustive, Effect.mapError((e) => AuthError.make({ message: "login failed", cause: e })));
210
+ const logout = (_profileName, _config) => Effect.void;
211
+ const details = (profileName, config, updateConfig) => Effect.all([read(profileName, config, updateConfig), Clock.currentTimeMillis]).pipe(Effect.map(([creds, now]) => {
212
+ const lines = [
213
+ {
214
+ key: creds.type === "oauth" ? "accessToken" : "apiKey",
215
+ value: displayRedacted(creds.token),
216
+ },
217
+ { key: "apiBaseUrl", value: creds.apiBaseUrl },
218
+ ];
219
+ if (creds.organizationId !== undefined) {
220
+ lines.push({ key: "organizationId", value: creds.organizationId });
221
+ }
222
+ if (creds.expires !== undefined) {
223
+ const remaining = creds.expires - now;
224
+ const at = new Date(creds.expires).toISOString();
225
+ lines.push({
226
+ key: "expires",
227
+ value: remaining <= 0
228
+ ? `expired (${at})`
229
+ : `in ${Duration.format(Duration.millis(remaining))} (${at})`,
230
+ });
231
+ }
232
+ lines.push({ key: "source", value: creds.source.type });
233
+ return { lines };
234
+ }));
235
+ const readEnvironment = Effect.gen(function* () {
236
+ const apiKey = yield* getEnvRedacted("DAYTONA_API_KEY");
237
+ if (!apiKey) {
238
+ return yield* AuthError.make({
239
+ message: "Daytona CI credentials not found. Set DAYTONA_API_KEY.",
240
+ });
241
+ }
242
+ return {
243
+ type: "apiKey",
244
+ token: apiKey,
245
+ apiBaseUrl: (yield* getEnv("DAYTONA_API_URL")) ?? DEFAULT_API_BASE_URL,
246
+ organizationId: yield* getEnv("DAYTONA_ORGANIZATION_ID"),
247
+ source: { type: "env" },
248
+ };
249
+ });
250
+ return {
251
+ configSchema: DaytonaAuthConfigSchema,
252
+ configure,
253
+ configureWith,
254
+ configureMethods,
255
+ login,
256
+ logout,
257
+ details,
258
+ read,
259
+ readEnvironment,
260
+ environment: [
261
+ {
262
+ name: "DAYTONA_API_KEY",
263
+ required: true,
264
+ secret: true,
265
+ description: "Organization API key.",
266
+ },
267
+ {
268
+ name: "DAYTONA_API_URL",
269
+ required: false,
270
+ description: "API root for a self-hosted Daytona.",
271
+ },
272
+ {
273
+ name: "DAYTONA_ORGANIZATION_ID",
274
+ required: false,
275
+ description: "Organization id; only needed with a user token.",
276
+ },
277
+ ],
278
+ };
279
+ }));
280
+ //# sourceMappingURL=AuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.js","sources":["../src/AuthProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolve the bundled program (the runners registered via `host.run` /
3
+ * serve) and run it with a Node HTTP server bound to `PORT` on every
4
+ * interface, so the sandbox's preview proxy reaches the `{ fetch }`
5
+ * handler and `host.run` loops stay alive.
6
+ */
7
+ export declare const bootstrap: (entrypoint: unknown) => Promise<void>;
8
+ //# sourceMappingURL=Bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bootstrap.d.ts","sources":["../src/Bootstrap.ts"],"names":[],"mappings":"AAsBA;;;;;GAKG;AACH,eAAO,MAAM,SAAS,eAAgB,OAAO,KAAG,OAAO,CAAC,IAAI,CA0B3D,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Process bootstrap for a `Daytona.Sandbox` with `main` (a Node process in
3
+ * the sandbox serving the bundled program). The generated entry imports this module
4
+ * and the user's `main`, nothing else — see `alchemy/Runtime/Bootstrap`
5
+ * for why.
6
+ */
7
+ import { NodeServices } from "@effect/platform-node";
8
+ import { NodeHttpServer } from "alchemy/Http";
9
+ import { reifyBoundConfigProvider } from "alchemy/Runtime";
10
+ import { entrypointLayer, resolveProgram, runProcess, stackFromEnv, } from "alchemy/Runtime/Bootstrap";
11
+ import * as ConfigProvider from "effect/ConfigProvider";
12
+ import * as SecureRandom from "effect/crypto/SecureRandom";
13
+ import * as Effect from "effect/Effect";
14
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
15
+ import * as Layer from "effect/Layer";
16
+ import * as Logger from "effect/Logger";
17
+ /**
18
+ * Resolve the bundled program (the runners registered via `host.run` /
19
+ * serve) and run it with a Node HTTP server bound to `PORT` on every
20
+ * interface, so the sandbox's preview proxy reaches the `{ fetch }`
21
+ * handler and `host.run` loops stay alive.
22
+ */
23
+ export const bootstrap = (entrypoint) => {
24
+ const platform = Layer.mergeAll(NodeServices.layer, FetchHttpClient.layer, SecureRandom.layerWebCrypto, Logger.layer([Logger.consolePretty()]));
25
+ const program = resolveProgram("program").pipe(Effect.provide(entrypointLayer(entrypoint).pipe(Layer.provideMerge(stackFromEnv), Layer.provideMerge(NodeHttpServer({ hostname: "0.0.0.0" })), Layer.provideMerge(platform), Layer.provideMerge(Layer.succeed(ConfigProvider.ConfigProvider, reifyBoundConfigProvider(ConfigProvider.fromEnv(), process.env))))), Effect.scoped);
26
+ return runProcess("Daytona service", program);
27
+ };
28
+ //# sourceMappingURL=Bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Bootstrap.js","sources":["../src/Bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EACL,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,GACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,YAAY,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,eAAe,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,UAAmB,EAAiB,EAAE;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAC7B,YAAY,CAAC,KAAK,EAClB,eAAe,CAAC,KAAK,EACrB,YAAY,CAAC,cAAc,EAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CACvC,CAAC;IAEF,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,CAC5C,MAAM,CAAC,OAAO,CACZ,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9B,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,EAChC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAC3D,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,EAC5B,KAAK,CAAC,YAAY,CAChB,KAAK,CAAC,OAAO,CACX,cAAc,CAAC,cAAc,EAC7B,wBAAwB,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAChE,CACF,CACF,CACF,EACD,MAAM,CAAC,MAAM,CACd,CAAC;IAEF,OAAO,UAAU,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC,CAAC"}
@@ -0,0 +1,72 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ import type * as Effect from "effect/Effect";
3
+ import type { Sandbox } from "./Sandbox.ts";
4
+ import type { ConnectedSandbox } from "./SandboxClient.ts";
5
+ /**
6
+ * Work with one {@link Sandbox} declared at deploy, from any host: run
7
+ * commands, read and write files, use git, open previews, fork it or
8
+ * snapshot it. The handle has the same methods as the
9
+ * {@link DaytonaSandbox} that {@link CreateSandbox} returns; its
10
+ * `sandboxId`, `name` and `toolboxProxyUrl` are Effects, resolved at
11
+ * runtime.
12
+ *
13
+ * The host gets its own Daytona API key with `write:sandboxes` and
14
+ * `delete:sandboxes`; Daytona checks permissions per kind of object, so
15
+ * the key can reach other sandboxes in the organization too.
16
+ *
17
+ * ### Running Commands in a Dev Box
18
+ * **Example:** Pull and test on request
19
+ * ```typescript
20
+ * const devBox = yield* Daytona.ConnectSandbox(DevBox);
21
+ * return {
22
+ * fetch: Effect.gen(function* () {
23
+ * yield* devBox.startSandbox();
24
+ * const test = yield* devBox.exec("git pull && pnpm test", { cwd: "/home/daytona/repo" });
25
+ * return yield* HttpServerResponse.json(test);
26
+ * }),
27
+ * };
28
+ * ```
29
+ *
30
+ * ### Putting a Worker in Front of a Port
31
+ * **Example:** Proxy every request to the dev server on port 3000
32
+ * ```typescript
33
+ * const devBox = yield* Daytona.ConnectSandbox(DevBox);
34
+ * return {
35
+ * fetch: Effect.gen(function* () {
36
+ * const port = yield* devBox.getTcpPort(3000);
37
+ * return yield* port.fetch(yield* HttpServerRequest);
38
+ * }),
39
+ * };
40
+ * ```
41
+ *
42
+ * ### Streaming a Terminal
43
+ * Terminals, code interpreter runs and followed logs stream over a
44
+ * WebSocket, so they work from a Worker too.
45
+ *
46
+ * **Example:** Run a script in a terminal and stream its output
47
+ * ```typescript
48
+ * const output = yield* Effect.scoped(
49
+ * Effect.gen(function* () {
50
+ * const pty = yield* devBox.process.createPty({ id: "build" });
51
+ * yield* pty.write("pnpm build; exit\n");
52
+ * return yield* pty.output.pipe(Stream.decodeText(), Stream.mkString);
53
+ * }),
54
+ * );
55
+ * ```
56
+ *
57
+ * ### Forking a Dev Box
58
+ * Daytona forks `linux-vm` sandboxes; a container's fork fails with
59
+ * `ForkNotSupported`.
60
+ *
61
+ * **Example:** Fork it per pull request
62
+ * ```typescript
63
+ * const fork = yield* devBox.forkSandbox({ name: `pr-${number}` });
64
+ * ```
65
+ *
66
+ * @binding
67
+ * @product Sandbox
68
+ */
69
+ export interface ConnectSandbox extends Binding.Service<ConnectSandbox, "Daytona.ConnectSandbox", (sandbox: Sandbox) => Effect.Effect<ConnectedSandbox>> {
70
+ }
71
+ export declare const ConnectSandbox: ConnectSandbox;
72
+ //# sourceMappingURL=ConnectSandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectSandbox.d.ts","sources":["../src/ConnectSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO,CAAC,OAAO,CACrD,cAAc,EACd,wBAAwB,EACxB,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACtD;CAAG;AAEJ,eAAO,MAAM,cAAc,gBAA4D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ export const ConnectSandbox = Binding.Service("Daytona.ConnectSandbox");
3
+ //# sourceMappingURL=ConnectSandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectSandbox.js","sources":["../src/ConnectSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AA2E3C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAiB,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import * as Layer from "effect/Layer";
2
+ import { ConnectSandbox } from "./ConnectSandbox.ts";
3
+ /** {@link ConnectSandbox} over Daytona's HTTP API; works on any host. */
4
+ export declare const ConnectSandboxHttp: Layer.Layer<ConnectSandbox, never, never>;
5
+ //# sourceMappingURL=ConnectSandboxHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectSandboxHttp.d.ts","sources":["../src/ConnectSandboxHttp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAKrD,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,2CAiB9B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Layer from "effect/Layer";
3
+ import { ConnectSandbox } from "./ConnectSandbox.js";
4
+ import { makeAccess } from "./DaytonaBindings.js";
5
+ import { makeConnectedSandbox } from "./SandboxClient.js";
6
+ /** {@link ConnectSandbox} over Daytona's HTTP API; works on any host. */
7
+ export const ConnectSandboxHttp = Layer.effect(ConnectSandbox, Effect.gen(function* () {
8
+ const access = yield* makeAccess;
9
+ return Effect.fn(function* (sandbox) {
10
+ const { authorize, organizationId } = yield* access(`${sandbox.LogicalId}Connect`, [
11
+ "write:sandboxes",
12
+ "delete:sandboxes",
13
+ ]);
14
+ const sandboxId = yield* sandbox.sandboxId;
15
+ const name = yield* sandbox.name;
16
+ const toolboxProxyUrl = yield* sandbox.toolboxProxyUrl;
17
+ // The sandbox's identity resolves at runtime, on each call.
18
+ const identity = Effect.all({ id: sandboxId, name, toolboxProxyUrl });
19
+ return makeConnectedSandbox(identity, organizationId, authorize);
20
+ });
21
+ }));
22
+ //# sourceMappingURL=ConnectSandboxHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectSandboxHttp.js","sources":["../src/ConnectSandboxHttp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACjC,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAgB;QAC1C,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE;YACjF,iBAAiB;YACjB,kBAAkB;SACnB,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QACvD,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACtE,OAAO,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import * as Contributions from "alchemy/Contributions";
2
+ declare const _default: {
3
+ readonly name: "daytona";
4
+ readonly auth: Contributions.Lazy<import("effect/Layer").Layer<never, never, import("alchemy/Auth/Registry").AuthProviders | import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom>>;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=Contributions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Contributions.d.ts","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;;;;;AAEvD,wBAMG"}
@@ -0,0 +1,6 @@
1
+ import * as Contributions from "alchemy/Contributions";
2
+ export default Contributions.make({
3
+ name: "daytona",
4
+ auth: Contributions.lazy(() => import("./AuthProvider.js"), (module) => module.DaytonaAuth),
5
+ });
6
+ //# sourceMappingURL=Contributions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Contributions.js","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AAEvD,eAAe,aAAa,CAAC,IAAI,CAAC;IAChC,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,aAAa,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EACjC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAC/B;CACF,CAAC,CAAC"}
@@ -0,0 +1,86 @@
1
+ import type * as sandboxes from "@distilled.cloud/daytona/sandbox";
2
+ import * as Binding from "alchemy/Binding";
3
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
4
+ import type * as Effect from "effect/Effect";
5
+ import type { StateFailed, StateTimeout } from "./internal/Wait.ts";
6
+ import type { VolumeMount } from "./MountVolume.ts";
7
+ import type { SandboxInfo } from "./Sandbox.ts";
8
+ import type { DaytonaSandbox } from "./SandboxClient.ts";
9
+ import type { Snapshot } from "./Snapshot.ts";
10
+ /**
11
+ * `create` input: Daytona's own create request, with volumes as `mounts`.
12
+ * `snapshot` defaults to the binding's base; labels are merged with the
13
+ * binding's owner label.
14
+ */
15
+ export type CreateSandboxInput = Omit<sandboxes.CreateSandboxRequest, "xDaytonaOrganizationID" | "volumes"> & {
16
+ /**
17
+ * Volumes to mount: `MountVolume` references, or entries naming a
18
+ * `CreateVolume` handle (`{ volume: home, path: "/home/daytona/work" }`).
19
+ */
20
+ readonly mounts?: ReadonlyArray<VolumeMount>;
21
+ };
22
+ /** `list` filters: Daytona's own, with `labels` as an object. */
23
+ export type ListSandboxesInput = Omit<sandboxes.ListSandboxesRequest, "xDaytonaOrganizationID" | "labels" | "cursor"> & {
24
+ labels?: Record<string, string>;
25
+ };
26
+ export interface CreateSandboxClient {
27
+ /**
28
+ * Create a sandbox and wait until it has started. Returns its handle.
29
+ */
30
+ create(input?: CreateSandboxInput): Effect.Effect<DaytonaSandbox, sandboxes.CreateSandboxError | sandboxes.GetSandboxError | StateTimeout | StateFailed, RuntimeContext>;
31
+ /** The sandbox with this id or name, or `undefined`. */
32
+ get(idOrName: string): Effect.Effect<DaytonaSandbox | undefined, sandboxes.GetSandboxError, RuntimeContext>;
33
+ /** Sandboxes matching the filters (by default, the ones from the binding's base). */
34
+ list(input?: ListSandboxesInput): Effect.Effect<SandboxInfo[], sandboxes.ListSandboxesError, RuntimeContext>;
35
+ /** Delete a sandbox. Deleting a missing one succeeds. */
36
+ delete(idOrName: string): Effect.Effect<void, sandboxes.DeleteSandboxError, RuntimeContext>;
37
+ }
38
+ /**
39
+ * Create, find and delete Daytona sandboxes at runtime, from a Worker,
40
+ * Lambda or any other host: a sandbox per request, per user or per task.
41
+ * Pass a {@link Snapshot} to create every sandbox from it (a warm base),
42
+ * or nothing to pick the snapshot per call.
43
+ *
44
+ * The host gets its own Daytona API key, with only `write:sandboxes` and
45
+ * `delete:sandboxes`. Every sandbox it creates is labeled with the
46
+ * stack, stage and host as Daytona labels (`alchemy.stack`,
47
+ * `alchemy.stage`, `alchemy.id`; Daytona doesn't allow `::` in a label
48
+ * key), on top of your own labels. They are not deleted when the stack is
49
+ * destroyed: list them by those labels to clean them up, e.g.
50
+ * `sandboxes.list({ labels: { "alchemy.id": "Api" } })`.
51
+ * Each sandbox comes back as a {@link DaytonaSandbox} handle with the whole
52
+ * toolbox: processes, files, git, LSP, previews, forks and snapshots.
53
+ *
54
+ * ### Sandbox per Request
55
+ * **Example:** Run a command in a fresh sandbox and delete it
56
+ * ```typescript
57
+ * const sandboxes = yield* Daytona.CreateSandbox(Base);
58
+ * return {
59
+ * fetch: Effect.gen(function* () {
60
+ * const sandbox = yield* Effect.acquireRelease(
61
+ * sandboxes.create({ autoDeleteInterval: 0 }),
62
+ * (s) => sandboxes.delete(s.sandboxId).pipe(Effect.ignore),
63
+ * );
64
+ * const ls = yield* sandbox.exec("ls -la");
65
+ * return yield* HttpServerResponse.json(ls);
66
+ * }),
67
+ * };
68
+ * ```
69
+ *
70
+ * ### Sandbox per User
71
+ * **Example:** Find the user's sandbox by name, or create it
72
+ * ```typescript
73
+ * const sandbox =
74
+ * (yield* sandboxes.get(`dev-${user}`)) ??
75
+ * (yield* sandboxes.create({ name: `dev-${user}`, labels: { user } }));
76
+ * yield* sandbox.startSandbox();
77
+ * yield* sandbox.git.cloneRepository({ url: repoUrl, path: "/home/daytona/repo" });
78
+ * ```
79
+ *
80
+ * @binding
81
+ * @product Sandbox
82
+ */
83
+ export interface CreateSandbox extends Binding.Service<CreateSandbox, "Daytona.CreateSandbox", (base?: Snapshot) => Effect.Effect<CreateSandboxClient>> {
84
+ }
85
+ export declare const CreateSandbox: CreateSandbox;
86
+ //# sourceMappingURL=CreateSandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandbox.d.ts","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,SAAS,MAAM,kCAAkC,CAAC;AACnE,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,SAAS,CAAC,oBAAoB,EAC9B,wBAAwB,GAAG,SAAS,CACrC,GAAG;IACF;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC9C,CAAC;AAEF,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,SAAS,CAAC,oBAAoB,EAC9B,wBAAwB,GAAG,QAAQ,GAAG,QAAQ,CAC/C,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,MAAM,CACJ,KAAK,CAAC,EAAE,kBAAkB,GACzB,MAAM,CAAC,MAAM,CACd,cAAc,EACd,SAAS,CAAC,kBAAkB,GAAG,SAAS,CAAC,eAAe,GAAG,YAAY,GAAG,WAAW,EACrF,cAAc,CACf,CAAC;IACF,wDAAwD;IACxD,GAAG,CACD,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IACxF,qFAAqF;IACrF,IAAI,CACF,KAAK,CAAC,EAAE,kBAAkB,GACzB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAC9E,yDAAyD;IACzD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;CAC7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,WAAW,aAAc,SAAQ,OAAO,CAAC,OAAO,CACpD,aAAa,EACb,uBAAuB,EACvB,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACxD;CAAG;AAEJ,eAAO,MAAM,aAAa,eAA0D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import * as Binding from "alchemy/Binding";
2
+ export const CreateSandbox = Binding.Service("Daytona.CreateSandbox");
3
+ //# sourceMappingURL=CreateSandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandbox.js","sources":["../src/CreateSandbox.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAyG3C,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAgB,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import * as Layer from "effect/Layer";
2
+ import { CreateSandbox } from "./CreateSandbox.ts";
3
+ /** {@link CreateSandbox} over Daytona's HTTP API; works on any host. */
4
+ export declare const CreateSandboxHttp: Layer.Layer<CreateSandbox, never, never>;
5
+ //# sourceMappingURL=CreateSandboxHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateSandboxHttp.d.ts","sources":["../src/CreateSandboxHttp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAA4B,MAAM,oBAAoB,CAAC;AAQ7E,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,0CAoF7B,CAAC"}