@slaw-ai/plugin-daytona 2026.611.1
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 +26 -0
- package/README.md +48 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +4 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +93 -0
- package/dist/manifest.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +496 -0
- package/dist/plugin.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +5 -0
- package/dist/worker.js.map +1 -0
- package/package.json +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Slaw AI
|
|
4
|
+
Copyright (c) 2025 Paperclip AI
|
|
5
|
+
|
|
6
|
+
SLAW is derived from Paperclip (https://github.com/paperclipai/paperclip),
|
|
7
|
+
which is licensed under the MIT License. The original copyright notice is
|
|
8
|
+
retained above as required by that license.
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# `@slaw-ai/plugin-daytona`
|
|
2
|
+
|
|
3
|
+
Published Daytona sandbox provider plugin for Slaw.
|
|
4
|
+
|
|
5
|
+
This package lives in the Slaw monorepo, but it is intentionally excluded from the root `pnpm` workspace and shaped to publish and install like a standalone npm package. That lets operators install it from the Plugins page by package name without introducing root lockfile churn for Daytona's SDK dependencies.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
From a Slaw instance, install:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
@slaw-ai/plugin-daytona
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The host plugin installer runs `npm install` into the managed plugin directory, so transitive dependencies such as `@daytonaio/sdk` are pulled in during installation.
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
Configure Daytona from `Squad Settings -> Environments`, not from the plugin's instance settings page.
|
|
20
|
+
|
|
21
|
+
- Put the Daytona API key on the sandbox environment itself.
|
|
22
|
+
- When you save an environment, Slaw stores pasted API keys as squad secrets.
|
|
23
|
+
- `DAYTONA_API_KEY` remains an optional host-level fallback when an environment omits the key.
|
|
24
|
+
- Optional `apiUrl` and `target` settings map directly to the Daytona SDK/client configuration. If `apiUrl` is omitted, the Daytona SDK uses its default endpoint.
|
|
25
|
+
|
|
26
|
+
Notes:
|
|
27
|
+
|
|
28
|
+
- The current published Daytona SDK package is `@daytonaio/sdk`.
|
|
29
|
+
- The driver supports both `snapshot`-based and `image`-based sandbox creation. If both are set, validation rejects the config as ambiguous.
|
|
30
|
+
- Reusable leases map to Daytona stop/start semantics. Non-reusable leases are deleted on release.
|
|
31
|
+
|
|
32
|
+
## Local development
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
cd packages/plugins/sandbox-providers/daytona
|
|
36
|
+
pnpm install --ignore-workspace --no-lockfile
|
|
37
|
+
pnpm build
|
|
38
|
+
pnpm test
|
|
39
|
+
pnpm typecheck
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
These commands assume the repo root has already been installed once so the local `@slaw-ai/plugin-sdk` workspace package is available to the compiler during development.
|
|
43
|
+
|
|
44
|
+
## Package layout
|
|
45
|
+
|
|
46
|
+
- `src/manifest.ts` declares the sandbox-provider driver metadata
|
|
47
|
+
- `src/plugin.ts` implements the environment lifecycle hooks
|
|
48
|
+
- `slawPlugin.manifest` and `slawPlugin.worker` point the host at the built plugin entrypoints in `dist/`
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAKhE,QAAA,MAAM,QAAQ,EAAE,oBAgGf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const PLUGIN_ID = "slaw.daytona-sandbox-provider";
|
|
2
|
+
const PLUGIN_VERSION = "0.1.0";
|
|
3
|
+
const manifest = {
|
|
4
|
+
id: PLUGIN_ID,
|
|
5
|
+
apiVersion: 1,
|
|
6
|
+
version: PLUGIN_VERSION,
|
|
7
|
+
displayName: "Daytona Sandbox Provider",
|
|
8
|
+
description: "First-party sandbox provider plugin that provisions Daytona sandboxes as Slaw execution environments.",
|
|
9
|
+
author: "Slaw",
|
|
10
|
+
categories: ["automation"],
|
|
11
|
+
capabilities: ["environment.drivers.register"],
|
|
12
|
+
entrypoints: {
|
|
13
|
+
worker: "./dist/worker.js",
|
|
14
|
+
},
|
|
15
|
+
environmentDrivers: [
|
|
16
|
+
{
|
|
17
|
+
driverKey: "daytona",
|
|
18
|
+
kind: "sandbox_provider",
|
|
19
|
+
displayName: "Daytona Sandbox",
|
|
20
|
+
description: "Provisions Daytona sandboxes with configurable image or snapshot selection, startup timeouts, and lease reuse.",
|
|
21
|
+
configSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
apiKey: {
|
|
25
|
+
type: "string",
|
|
26
|
+
format: "secret-ref",
|
|
27
|
+
description: "Environment-specific Daytona API key. Paste a key or an existing Slaw secret reference; saved environments store pasted values as squad secrets. Falls back to DAYTONA_API_KEY if omitted.",
|
|
28
|
+
},
|
|
29
|
+
apiUrl: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Optional Daytona API base URL. If omitted, the Daytona SDK uses its configured default endpoint.",
|
|
32
|
+
},
|
|
33
|
+
target: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Optional Daytona target/region identifier.",
|
|
36
|
+
},
|
|
37
|
+
snapshot: {
|
|
38
|
+
type: "string",
|
|
39
|
+
description: "Optional Daytona snapshot name to start from.",
|
|
40
|
+
},
|
|
41
|
+
image: {
|
|
42
|
+
type: "string",
|
|
43
|
+
description: "Optional base image or Daytona Image reference. If set, the sandbox is created from this image instead of a snapshot.",
|
|
44
|
+
},
|
|
45
|
+
language: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "Optional Daytona language hint for direct code execution. If omitted, Daytona uses its default runtime.",
|
|
48
|
+
},
|
|
49
|
+
cpu: {
|
|
50
|
+
type: "number",
|
|
51
|
+
description: "Optional CPU allocation in cores.",
|
|
52
|
+
},
|
|
53
|
+
memory: {
|
|
54
|
+
type: "number",
|
|
55
|
+
description: "Optional memory allocation in GiB.",
|
|
56
|
+
},
|
|
57
|
+
disk: {
|
|
58
|
+
type: "number",
|
|
59
|
+
description: "Optional disk allocation in GiB.",
|
|
60
|
+
},
|
|
61
|
+
gpu: {
|
|
62
|
+
type: "number",
|
|
63
|
+
description: "Optional GPU allocation in units.",
|
|
64
|
+
},
|
|
65
|
+
timeoutMs: {
|
|
66
|
+
type: "number",
|
|
67
|
+
description: "Timeout for Daytona create/start/stop/execute operations in milliseconds.",
|
|
68
|
+
default: 300000,
|
|
69
|
+
},
|
|
70
|
+
autoStopInterval: {
|
|
71
|
+
type: "number",
|
|
72
|
+
description: "Optional Daytona auto-stop interval in minutes. `0` disables auto-stop.",
|
|
73
|
+
},
|
|
74
|
+
autoArchiveInterval: {
|
|
75
|
+
type: "number",
|
|
76
|
+
description: "Optional Daytona auto-archive interval in minutes. `0` uses Daytona's max interval.",
|
|
77
|
+
},
|
|
78
|
+
autoDeleteInterval: {
|
|
79
|
+
type: "number",
|
|
80
|
+
description: "Optional Daytona auto-delete interval in minutes. `-1` disables auto-delete and `0` deletes immediately after stop.",
|
|
81
|
+
},
|
|
82
|
+
reuseLease: {
|
|
83
|
+
type: "boolean",
|
|
84
|
+
description: "Whether to stop and later resume the sandbox across runs instead of deleting it on release.",
|
|
85
|
+
default: false,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
export default manifest;
|
|
93
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,+BAA+B,CAAC;AAClD,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,QAAQ,GAAyB;IACrC,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,0BAA0B;IACvC,WAAW,EACT,uGAAuG;IACzG,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,CAAC,YAAY,CAAC;IAC1B,YAAY,EAAE,CAAC,8BAA8B,CAAC;IAC9C,WAAW,EAAE;QACX,MAAM,EAAE,kBAAkB;KAC3B;IACD,kBAAkB,EAAE;QAClB;YACE,SAAS,EAAE,SAAS;YACpB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,iBAAiB;YAC9B,WAAW,EACT,gHAAgH;YAClH,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EACT,4LAA4L;qBAC/L;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,kGAAkG;qBACrG;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4CAA4C;qBAC1D;oBACD,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+CAA+C;qBAC7D;oBACD,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,uHAAuH;qBAC1H;oBACD,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,yGAAyG;qBAC5G;oBACD,GAAG,EAAE;wBACH,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mCAAmC;qBACjD;oBACD,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,oCAAoC;qBAClD;oBACD,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,kCAAkC;qBAChD;oBACD,GAAG,EAAE;wBACH,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mCAAmC;qBACjD;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,2EAA2E;wBACxF,OAAO,EAAE,MAAM;qBAChB;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yEAAyE;qBACvF;oBACD,mBAAmB,EAAE;wBACnB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,qFAAqF;qBACnG;oBACD,kBAAkB,EAAE;wBAClB,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,qHAAqH;qBACxH;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,6FAA6F;wBAC/F,OAAO,EAAE,KAAK;qBACf;iBACF;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAkYA,QAAA,MAAM,MAAM,0CAqOV,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { Daytona, DaytonaNotFoundError, DaytonaTimeoutError } from "@daytonaio/sdk";
|
|
4
|
+
import { definePlugin } from "@slaw-ai/plugin-sdk";
|
|
5
|
+
function parseOptionalString(value) {
|
|
6
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
7
|
+
}
|
|
8
|
+
function parseOptionalInteger(value) {
|
|
9
|
+
if (value == null || value === "")
|
|
10
|
+
return null;
|
|
11
|
+
const parsed = Number(value);
|
|
12
|
+
return Number.isFinite(parsed) ? Math.trunc(parsed) : null;
|
|
13
|
+
}
|
|
14
|
+
function parseOptionalNumber(value) {
|
|
15
|
+
if (value == null || value === "")
|
|
16
|
+
return null;
|
|
17
|
+
const parsed = Number(value);
|
|
18
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
19
|
+
}
|
|
20
|
+
function parseDriverConfig(raw) {
|
|
21
|
+
const timeoutMs = Number(raw.timeoutMs ?? 300_000);
|
|
22
|
+
return {
|
|
23
|
+
apiKey: parseOptionalString(raw.apiKey),
|
|
24
|
+
apiUrl: parseOptionalString(raw.apiUrl),
|
|
25
|
+
target: parseOptionalString(raw.target),
|
|
26
|
+
snapshot: parseOptionalString(raw.snapshot),
|
|
27
|
+
image: parseOptionalString(raw.image),
|
|
28
|
+
language: parseOptionalString(raw.language),
|
|
29
|
+
timeoutMs: Number.isFinite(timeoutMs) ? Math.trunc(timeoutMs) : 300_000,
|
|
30
|
+
cpu: parseOptionalNumber(raw.cpu),
|
|
31
|
+
memory: parseOptionalNumber(raw.memory),
|
|
32
|
+
disk: parseOptionalNumber(raw.disk),
|
|
33
|
+
gpu: parseOptionalNumber(raw.gpu),
|
|
34
|
+
autoStopInterval: parseOptionalInteger(raw.autoStopInterval),
|
|
35
|
+
autoArchiveInterval: parseOptionalInteger(raw.autoArchiveInterval),
|
|
36
|
+
autoDeleteInterval: parseOptionalInteger(raw.autoDeleteInterval),
|
|
37
|
+
reuseLease: raw.reuseLease === true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function resolveApiKey(config) {
|
|
41
|
+
if (config.apiKey) {
|
|
42
|
+
return config.apiKey;
|
|
43
|
+
}
|
|
44
|
+
const envApiKey = process.env.DAYTONA_API_KEY?.trim() ?? "";
|
|
45
|
+
if (!envApiKey) {
|
|
46
|
+
throw new Error("Daytona sandbox environments require an API key in config or DAYTONA_API_KEY.");
|
|
47
|
+
}
|
|
48
|
+
return envApiKey;
|
|
49
|
+
}
|
|
50
|
+
function createDaytonaClient(config) {
|
|
51
|
+
const clientConfig = {
|
|
52
|
+
apiKey: resolveApiKey(config),
|
|
53
|
+
};
|
|
54
|
+
if (config.apiUrl)
|
|
55
|
+
clientConfig.apiUrl = config.apiUrl;
|
|
56
|
+
if (config.target)
|
|
57
|
+
clientConfig.target = config.target;
|
|
58
|
+
return new Daytona(clientConfig);
|
|
59
|
+
}
|
|
60
|
+
function buildResources(config) {
|
|
61
|
+
if (config.cpu == null && config.memory == null && config.disk == null && config.gpu == null) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
cpu: config.cpu ?? undefined,
|
|
66
|
+
memory: config.memory ?? undefined,
|
|
67
|
+
disk: config.disk ?? undefined,
|
|
68
|
+
gpu: config.gpu ?? undefined,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function buildCreateParams(config, labels) {
|
|
72
|
+
const base = {
|
|
73
|
+
labels,
|
|
74
|
+
language: config.language ?? undefined,
|
|
75
|
+
autoStopInterval: config.autoStopInterval ?? undefined,
|
|
76
|
+
autoArchiveInterval: config.autoArchiveInterval ?? undefined,
|
|
77
|
+
autoDeleteInterval: config.autoDeleteInterval ?? undefined,
|
|
78
|
+
};
|
|
79
|
+
if (config.image) {
|
|
80
|
+
return {
|
|
81
|
+
...base,
|
|
82
|
+
image: config.image,
|
|
83
|
+
resources: buildResources(config),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
...base,
|
|
88
|
+
snapshot: config.snapshot ?? undefined,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function buildSandboxLabels(input) {
|
|
92
|
+
return {
|
|
93
|
+
"slaw-provider": "daytona",
|
|
94
|
+
"slaw-squad-id": input.squadId,
|
|
95
|
+
"slaw-environment-id": input.environmentId,
|
|
96
|
+
"slaw-reuse-lease": input.reuseLease ? "true" : "false",
|
|
97
|
+
...(input.runId ? { "slaw-run-id": input.runId } : {}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function toTimeoutSeconds(timeoutMs) {
|
|
101
|
+
return Math.max(1, Math.ceil(timeoutMs / 1000));
|
|
102
|
+
}
|
|
103
|
+
function resolveTimeoutMs(paramsTimeoutMs, config) {
|
|
104
|
+
return paramsTimeoutMs != null && Number.isFinite(paramsTimeoutMs) && paramsTimeoutMs > 0
|
|
105
|
+
? Math.trunc(paramsTimeoutMs)
|
|
106
|
+
: config.timeoutMs;
|
|
107
|
+
}
|
|
108
|
+
function formatErrorMessage(error) {
|
|
109
|
+
return error instanceof Error ? error.message : String(error);
|
|
110
|
+
}
|
|
111
|
+
function isValidUrl(value) {
|
|
112
|
+
try {
|
|
113
|
+
new URL(value);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function ensureSandboxStarted(sandbox, timeoutSeconds) {
|
|
121
|
+
if (sandbox.state === "started")
|
|
122
|
+
return;
|
|
123
|
+
if (sandbox.state === "error") {
|
|
124
|
+
if (sandbox.recoverable) {
|
|
125
|
+
await sandbox.recover(timeoutSeconds);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
throw new Error(`Daytona sandbox ${sandbox.id} is in an unrecoverable error state: ${sandbox.errorReason ?? "unknown error"}`);
|
|
129
|
+
}
|
|
130
|
+
await sandbox.start(timeoutSeconds);
|
|
131
|
+
}
|
|
132
|
+
async function resolveSandboxWorkingDirectory(sandbox) {
|
|
133
|
+
const root = (await sandbox.getWorkDir())?.trim()
|
|
134
|
+
|| (await sandbox.getUserHomeDir())?.trim()
|
|
135
|
+
|| "/home/daytona";
|
|
136
|
+
const remoteCwd = path.posix.join(root, "slaw-workspace");
|
|
137
|
+
await sandbox.fs.createFolder(remoteCwd, "755");
|
|
138
|
+
return remoteCwd;
|
|
139
|
+
}
|
|
140
|
+
async function detectSandboxShellCommand(sandbox, timeoutSeconds) {
|
|
141
|
+
try {
|
|
142
|
+
const result = await sandbox.process.executeCommand("if command -v bash >/dev/null 2>&1; then printf bash; else printf sh; fi", undefined, undefined, timeoutSeconds);
|
|
143
|
+
return result.result?.trim() === "bash" ? "bash" : "sh";
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return "sh";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function leaseMetadata(input) {
|
|
150
|
+
return {
|
|
151
|
+
provider: "daytona",
|
|
152
|
+
shellCommand: input.shellCommand,
|
|
153
|
+
sandboxId: input.sandbox.id,
|
|
154
|
+
sandboxName: input.sandbox.name,
|
|
155
|
+
sandboxState: input.sandbox.state ?? null,
|
|
156
|
+
image: input.config.image,
|
|
157
|
+
snapshot: input.config.snapshot,
|
|
158
|
+
target: input.sandbox.target,
|
|
159
|
+
timeoutMs: input.config.timeoutMs,
|
|
160
|
+
reuseLease: input.config.reuseLease,
|
|
161
|
+
remoteCwd: input.remoteCwd,
|
|
162
|
+
resumedLease: input.resumedLease,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function shellQuote(value) {
|
|
166
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
167
|
+
}
|
|
168
|
+
function isValidShellEnvKey(value) {
|
|
169
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
170
|
+
}
|
|
171
|
+
// Mirror the E2B sandbox executor: source common login profiles (and nvm)
|
|
172
|
+
// before running the command so Daytona one-shot calls see the same PATH an
|
|
173
|
+
// interactive shell would. Without this, adapter probes can fail to resolve
|
|
174
|
+
// CLIs that are installed via profile-driven PATH mutations inside the
|
|
175
|
+
// sandbox image.
|
|
176
|
+
function buildLoginShellScript(input) {
|
|
177
|
+
const env = input.env ?? {};
|
|
178
|
+
for (const key of Object.keys(env)) {
|
|
179
|
+
if (!isValidShellEnvKey(key)) {
|
|
180
|
+
throw new Error(`Invalid sandbox environment variable key: ${key}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const envArgs = Object.entries(env)
|
|
184
|
+
.filter((entry) => typeof entry[1] === "string")
|
|
185
|
+
.map(([key, value]) => `${key}=${shellQuote(value)}`);
|
|
186
|
+
const commandParts = [shellQuote(input.command), ...input.args.map(shellQuote)].join(" ");
|
|
187
|
+
const redirectedCommand = input.stdinPath
|
|
188
|
+
? `${commandParts} < ${shellQuote(input.stdinPath)}`
|
|
189
|
+
: commandParts;
|
|
190
|
+
// Each `executeCommand` call runs in its own shell, so we don't `exec`-
|
|
191
|
+
// replace it; running the command as the last `&&`-chained line is enough to
|
|
192
|
+
// surface the right exit code. Env is interpolated after profile sourcing so
|
|
193
|
+
// the caller's env wins over any defaults the profile exports.
|
|
194
|
+
const finalLine = envArgs.length > 0
|
|
195
|
+
? `env ${envArgs.join(" ")} ${redirectedCommand}`
|
|
196
|
+
: redirectedCommand;
|
|
197
|
+
const lines = [
|
|
198
|
+
'if [ -f /etc/profile ]; then . /etc/profile >/dev/null 2>&1 || true; fi',
|
|
199
|
+
'if [ -f "$HOME/.profile" ]; then . "$HOME/.profile" >/dev/null 2>&1 || true; fi',
|
|
200
|
+
// .bash_profile typically sources .bashrc itself; only source .bashrc
|
|
201
|
+
// directly when no .bash_profile exists to avoid double-running setup.
|
|
202
|
+
'if [ -f "$HOME/.bash_profile" ]; then . "$HOME/.bash_profile" >/dev/null 2>&1 || true; elif [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" >/dev/null 2>&1 || true; fi',
|
|
203
|
+
'if [ -f "$HOME/.zprofile" ]; then . "$HOME/.zprofile" >/dev/null 2>&1 || true; fi',
|
|
204
|
+
'export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"',
|
|
205
|
+
'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" >/dev/null 2>&1 || true',
|
|
206
|
+
];
|
|
207
|
+
if (input.cwd) {
|
|
208
|
+
lines.push(`cd ${shellQuote(input.cwd)}`);
|
|
209
|
+
}
|
|
210
|
+
lines.push(finalLine);
|
|
211
|
+
return lines.join(" && ");
|
|
212
|
+
}
|
|
213
|
+
async function createSandbox(params, config) {
|
|
214
|
+
const client = createDaytonaClient(config);
|
|
215
|
+
const createParams = buildCreateParams(config, buildSandboxLabels({
|
|
216
|
+
squadId: params.squadId,
|
|
217
|
+
environmentId: params.environmentId,
|
|
218
|
+
runId: "runId" in params ? params.runId : undefined,
|
|
219
|
+
reuseLease: config.reuseLease,
|
|
220
|
+
}));
|
|
221
|
+
return await client.create(createParams, {
|
|
222
|
+
timeout: toTimeoutSeconds(config.timeoutMs),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async function getSandbox(config, sandboxId) {
|
|
226
|
+
const client = createDaytonaClient(config);
|
|
227
|
+
return await client.get(sandboxId);
|
|
228
|
+
}
|
|
229
|
+
async function getSandboxOrNull(config, sandboxId) {
|
|
230
|
+
try {
|
|
231
|
+
return await getSandbox(config, sandboxId);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
if (error instanceof DaytonaNotFoundError) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// One-shot command execution via Daytona's `process.executeCommand`. The
|
|
241
|
+
// session-based API (`createSession` + `executeSessionCommand` with
|
|
242
|
+
// `runAsync: false`) hangs indefinitely when the supplied command ends with
|
|
243
|
+
// `exec <something>`, which `buildLoginShellScript` always produces. Reproduced
|
|
244
|
+
// directly against the Daytona SDK: identical login-shell wrapper returns in
|
|
245
|
+
// ~600 ms via `executeCommand` but times out via `executeSessionCommand`. So we
|
|
246
|
+
// use the one-shot path, mirroring e2b's `sandbox.commands.run` model.
|
|
247
|
+
//
|
|
248
|
+
// `executeCommand` returns combined stdout+stderr in `result`. We surface that
|
|
249
|
+
// as `stdout` and leave `stderr` empty; callers that grep for error messages
|
|
250
|
+
// still see them in `stdout`.
|
|
251
|
+
async function executeOneShot(sandbox, params, config) {
|
|
252
|
+
const timeoutMs = resolveTimeoutMs(params.timeoutMs, config);
|
|
253
|
+
const timeoutSeconds = toTimeoutSeconds(timeoutMs);
|
|
254
|
+
const stdinPath = params.stdin != null ? `/tmp/slaw-stdin-${randomUUID()}` : null;
|
|
255
|
+
try {
|
|
256
|
+
if (stdinPath) {
|
|
257
|
+
await sandbox.fs.uploadFile(Buffer.from(params.stdin ?? "", "utf8"), stdinPath, timeoutSeconds);
|
|
258
|
+
}
|
|
259
|
+
const command = buildLoginShellScript({
|
|
260
|
+
command: params.command,
|
|
261
|
+
args: params.args ?? [],
|
|
262
|
+
cwd: params.cwd,
|
|
263
|
+
env: params.env,
|
|
264
|
+
stdinPath: stdinPath ?? undefined,
|
|
265
|
+
});
|
|
266
|
+
// Pass cwd undefined: `buildLoginShellScript` already injects `cd` after
|
|
267
|
+
// profile sourcing when params.cwd is set, and the Daytona executor's own
|
|
268
|
+
// cwd argument runs before our login-shell init, which is the wrong order
|
|
269
|
+
// (env from .bashrc would override caller env).
|
|
270
|
+
const result = await sandbox.process.executeCommand(command, undefined, undefined, timeoutSeconds);
|
|
271
|
+
return {
|
|
272
|
+
exitCode: typeof result.exitCode === "number" ? result.exitCode : 1,
|
|
273
|
+
timedOut: false,
|
|
274
|
+
stdout: result.result ?? result.artifacts?.stdout ?? "",
|
|
275
|
+
stderr: "",
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
if (error instanceof DaytonaTimeoutError) {
|
|
280
|
+
return {
|
|
281
|
+
exitCode: null,
|
|
282
|
+
timedOut: true,
|
|
283
|
+
stdout: "",
|
|
284
|
+
stderr: `${error.message.trim()}\n`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
if (stdinPath) {
|
|
291
|
+
await sandbox.fs.deleteFile(stdinPath).catch(() => undefined);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const plugin = definePlugin({
|
|
296
|
+
async setup(ctx) {
|
|
297
|
+
ctx.logger.info("Daytona sandbox provider plugin ready");
|
|
298
|
+
},
|
|
299
|
+
async onHealth() {
|
|
300
|
+
return { status: "ok", message: "Daytona sandbox provider plugin healthy" };
|
|
301
|
+
},
|
|
302
|
+
async onEnvironmentValidateConfig(params) {
|
|
303
|
+
const config = parseDriverConfig(params.config);
|
|
304
|
+
const errors = [];
|
|
305
|
+
if (typeof params.config.image === "string" && params.config.image.trim().length === 0) {
|
|
306
|
+
errors.push("Daytona image cannot be empty.");
|
|
307
|
+
}
|
|
308
|
+
if (typeof params.config.snapshot === "string" && params.config.snapshot.trim().length === 0) {
|
|
309
|
+
errors.push("Daytona snapshot cannot be empty.");
|
|
310
|
+
}
|
|
311
|
+
if (config.image && config.snapshot) {
|
|
312
|
+
errors.push("Daytona sandbox environments must set either image or snapshot, not both.");
|
|
313
|
+
}
|
|
314
|
+
if (config.apiUrl && !isValidUrl(config.apiUrl)) {
|
|
315
|
+
errors.push("apiUrl must be a valid URL.");
|
|
316
|
+
}
|
|
317
|
+
if (config.timeoutMs < 1 || config.timeoutMs > 86_400_000) {
|
|
318
|
+
errors.push("timeoutMs must be between 1 and 86400000.");
|
|
319
|
+
}
|
|
320
|
+
if (config.autoStopInterval != null && config.autoStopInterval < 0) {
|
|
321
|
+
errors.push("autoStopInterval must be greater than or equal to 0.");
|
|
322
|
+
}
|
|
323
|
+
if (config.autoArchiveInterval != null && config.autoArchiveInterval < 0) {
|
|
324
|
+
errors.push("autoArchiveInterval must be greater than or equal to 0.");
|
|
325
|
+
}
|
|
326
|
+
if (config.autoDeleteInterval != null && config.autoDeleteInterval < -1) {
|
|
327
|
+
errors.push("autoDeleteInterval must be greater than or equal to -1.");
|
|
328
|
+
}
|
|
329
|
+
if (!config.apiKey && !(process.env.DAYTONA_API_KEY?.trim())) {
|
|
330
|
+
errors.push("Daytona sandbox environments require an API key in config or DAYTONA_API_KEY.");
|
|
331
|
+
}
|
|
332
|
+
for (const [key, value] of Object.entries({
|
|
333
|
+
cpu: config.cpu,
|
|
334
|
+
memory: config.memory,
|
|
335
|
+
disk: config.disk,
|
|
336
|
+
gpu: config.gpu,
|
|
337
|
+
})) {
|
|
338
|
+
if (value != null && value <= 0) {
|
|
339
|
+
errors.push(`${key} must be greater than 0 when provided.`);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (errors.length > 0) {
|
|
343
|
+
return { ok: false, errors };
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
ok: true,
|
|
347
|
+
normalizedConfig: { ...config },
|
|
348
|
+
};
|
|
349
|
+
},
|
|
350
|
+
async onEnvironmentProbe(params) {
|
|
351
|
+
const config = parseDriverConfig(params.config);
|
|
352
|
+
try {
|
|
353
|
+
const sandbox = await createSandbox(params, config);
|
|
354
|
+
try {
|
|
355
|
+
const remoteCwd = await resolveSandboxWorkingDirectory(sandbox);
|
|
356
|
+
const shellCommand = await detectSandboxShellCommand(sandbox, toTimeoutSeconds(config.timeoutMs));
|
|
357
|
+
return {
|
|
358
|
+
ok: true,
|
|
359
|
+
summary: `Connected to Daytona sandbox ${sandbox.name}.`,
|
|
360
|
+
metadata: {
|
|
361
|
+
provider: "daytona",
|
|
362
|
+
shellCommand,
|
|
363
|
+
sandboxId: sandbox.id,
|
|
364
|
+
sandboxName: sandbox.name,
|
|
365
|
+
target: sandbox.target,
|
|
366
|
+
image: config.image,
|
|
367
|
+
snapshot: config.snapshot,
|
|
368
|
+
timeoutMs: config.timeoutMs,
|
|
369
|
+
reuseLease: config.reuseLease,
|
|
370
|
+
remoteCwd,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs)).catch(() => undefined);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
return {
|
|
380
|
+
ok: false,
|
|
381
|
+
summary: "Daytona sandbox probe failed.",
|
|
382
|
+
metadata: {
|
|
383
|
+
provider: "daytona",
|
|
384
|
+
image: config.image,
|
|
385
|
+
snapshot: config.snapshot,
|
|
386
|
+
timeoutMs: config.timeoutMs,
|
|
387
|
+
reuseLease: config.reuseLease,
|
|
388
|
+
error: formatErrorMessage(error),
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
async onEnvironmentAcquireLease(params) {
|
|
394
|
+
const config = parseDriverConfig(params.config);
|
|
395
|
+
const sandbox = await createSandbox(params, config);
|
|
396
|
+
try {
|
|
397
|
+
const remoteCwd = await resolveSandboxWorkingDirectory(sandbox);
|
|
398
|
+
const shellCommand = await detectSandboxShellCommand(sandbox, toTimeoutSeconds(config.timeoutMs));
|
|
399
|
+
return {
|
|
400
|
+
providerLeaseId: sandbox.id,
|
|
401
|
+
metadata: leaseMetadata({ config, sandbox, shellCommand, remoteCwd, resumedLease: false }),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs)).catch(() => undefined);
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
async onEnvironmentResumeLease(params) {
|
|
410
|
+
const config = parseDriverConfig(params.config);
|
|
411
|
+
const sandbox = await getSandboxOrNull(config, params.providerLeaseId);
|
|
412
|
+
if (!sandbox) {
|
|
413
|
+
return { providerLeaseId: null, metadata: { expired: true } };
|
|
414
|
+
}
|
|
415
|
+
await ensureSandboxStarted(sandbox, toTimeoutSeconds(config.timeoutMs));
|
|
416
|
+
try {
|
|
417
|
+
const remoteCwd = await resolveSandboxWorkingDirectory(sandbox);
|
|
418
|
+
const shellCommand = await detectSandboxShellCommand(sandbox, toTimeoutSeconds(config.timeoutMs));
|
|
419
|
+
return {
|
|
420
|
+
providerLeaseId: sandbox.id,
|
|
421
|
+
metadata: leaseMetadata({ config, sandbox, shellCommand, remoteCwd, resumedLease: true }),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs)).catch(() => undefined);
|
|
426
|
+
throw error;
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
async onEnvironmentReleaseLease(params) {
|
|
430
|
+
if (!params.providerLeaseId)
|
|
431
|
+
return;
|
|
432
|
+
const config = parseDriverConfig(params.config);
|
|
433
|
+
const sandbox = await getSandboxOrNull(config, params.providerLeaseId);
|
|
434
|
+
if (!sandbox)
|
|
435
|
+
return;
|
|
436
|
+
if (config.reuseLease) {
|
|
437
|
+
if (sandbox.state !== "stopped") {
|
|
438
|
+
try {
|
|
439
|
+
await sandbox.stop(toTimeoutSeconds(config.timeoutMs));
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
console.warn(`Failed to stop Daytona sandbox during lease release: ${formatErrorMessage(error)}. Attempting delete instead.`);
|
|
443
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs)).catch((deleteError) => {
|
|
444
|
+
console.warn(`Failed to delete Daytona sandbox after stop failure: ${formatErrorMessage(deleteError)}`);
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs));
|
|
451
|
+
},
|
|
452
|
+
async onEnvironmentDestroyLease(params) {
|
|
453
|
+
if (!params.providerLeaseId)
|
|
454
|
+
return;
|
|
455
|
+
const config = parseDriverConfig(params.config);
|
|
456
|
+
const sandbox = await getSandboxOrNull(config, params.providerLeaseId);
|
|
457
|
+
if (!sandbox)
|
|
458
|
+
return;
|
|
459
|
+
await sandbox.delete(toTimeoutSeconds(config.timeoutMs));
|
|
460
|
+
},
|
|
461
|
+
async onEnvironmentRealizeWorkspace(params) {
|
|
462
|
+
const config = parseDriverConfig(params.config);
|
|
463
|
+
const remoteCwd = typeof params.lease.metadata?.remoteCwd === "string" &&
|
|
464
|
+
params.lease.metadata.remoteCwd.trim().length > 0
|
|
465
|
+
? params.lease.metadata.remoteCwd.trim()
|
|
466
|
+
: params.workspace.remotePath ?? params.workspace.localPath ?? "/slaw-workspace";
|
|
467
|
+
if (params.lease.providerLeaseId) {
|
|
468
|
+
const sandbox = await getSandbox(config, params.lease.providerLeaseId);
|
|
469
|
+
await ensureSandboxStarted(sandbox, toTimeoutSeconds(config.timeoutMs));
|
|
470
|
+
await sandbox.fs.createFolder(remoteCwd, "755");
|
|
471
|
+
}
|
|
472
|
+
return {
|
|
473
|
+
cwd: remoteCwd,
|
|
474
|
+
metadata: {
|
|
475
|
+
provider: "daytona",
|
|
476
|
+
remoteCwd,
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
},
|
|
480
|
+
async onEnvironmentExecute(params) {
|
|
481
|
+
if (!params.lease.providerLeaseId) {
|
|
482
|
+
return {
|
|
483
|
+
exitCode: 1,
|
|
484
|
+
timedOut: false,
|
|
485
|
+
stdout: "",
|
|
486
|
+
stderr: "No provider lease ID available for execution.",
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
const config = parseDriverConfig(params.config);
|
|
490
|
+
const sandbox = await getSandbox(config, params.lease.providerLeaseId);
|
|
491
|
+
await ensureSandboxStarted(sandbox, toTimeoutSeconds(resolveTimeoutMs(params.timeoutMs, config)));
|
|
492
|
+
return await executeOneShot(sandbox, params, config);
|
|
493
|
+
},
|
|
494
|
+
});
|
|
495
|
+
export default plugin;
|
|
496
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,eAAe,MAAM,CAAC"}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,eAAe,MAAM,CAAC;AACtB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@slaw-ai/plugin-daytona",
|
|
3
|
+
"version": "2026.611.1",
|
|
4
|
+
"description": "Daytona sandbox provider plugin for Slaw environments",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/slaw-ai/slaw",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/slaw-ai/slaw/issues"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/slaw-ai/slaw",
|
|
13
|
+
"directory": "packages/plugins/sandbox-providers/daytona"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"slawPlugin": {
|
|
31
|
+
"manifest": "./dist/manifest.js",
|
|
32
|
+
"worker": "./dist/worker.js"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"slaw",
|
|
36
|
+
"plugin",
|
|
37
|
+
"sandbox",
|
|
38
|
+
"daytona"
|
|
39
|
+
],
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@daytonaio/sdk": "^0.171.0",
|
|
42
|
+
"@slaw-ai/plugin-sdk": "2026.611.1"
|
|
43
|
+
}
|
|
44
|
+
}
|