@paperclipai/plugin-exe-dev 0.1.0

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/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # `@paperclipai/plugin-exe-dev`
2
+
3
+ Published exe.dev sandbox provider plugin for Paperclip.
4
+
5
+ This package lives in the Paperclip 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.
6
+
7
+ ## Install
8
+
9
+ From a Paperclip instance, install:
10
+
11
+ ```text
12
+ @paperclipai/plugin-exe-dev
13
+ ```
14
+
15
+ ## Configuration
16
+
17
+ Configure exe.dev from `Company Settings -> Environments`, not from the plugin's instance settings page.
18
+
19
+ - Put the exe.dev API token on the sandbox environment itself.
20
+ - When you save an environment, Paperclip stores pasted API keys and pasted SSH private keys as company secrets.
21
+ - `EXE_API_KEY` remains an optional host-level fallback when an environment omits the API token.
22
+ - The current implementation provisions VMs through exe.dev's HTTPS API and runs commands through direct SSH to the created VM.
23
+
24
+ To use the provider successfully, the environment/host needs all of the following:
25
+
26
+ - An exe.dev API token that allows the lifecycle commands the provider uses: `new`, `ls`, and `rm`. `whoami` and `help` are recommended for manual debugging. `restart` is only needed if you extend the provider to restart retained VMs.
27
+ - SSH access from the Paperclip host to the resulting `*.exe.xyz` VMs.
28
+ - An SSH private key that exe.dev already recognizes. You can either:
29
+ - paste the private key into the environment config via `sshPrivateKey`
30
+ - point `sshIdentityFile` at an absolute host path
31
+ - or leave both blank and rely on the host's default SSH agent/keychain
32
+ - The matching public key must already be registered with exe.dev before the provider can execute commands inside the VM.
33
+
34
+ Operational notes:
35
+
36
+ - If exe.dev replies `Please complete registration by running: ssh exe.dev`, the host key has not finished exe.dev onboarding yet.
37
+ - Reusable leases keep the VM alive between runs. exe.dev does not expose a documented "stop and later resume" command in the public CLI docs, so `reuseLease: true` means "retain the VM" rather than "suspend it."
38
+ - The provisioning path uses `https://exe.dev/exec`, which exe.dev documents as a command-style HTTPS API with a 30-second request timeout. Typical `new` calls are expected to fit inside that limit; command execution itself does not use `/exec`.
39
+ - Probes still create and delete a real exe.dev VM through `/exec`, and so do the `new`/`rm` calls inside the normal acquire/release lifecycle. Treat all of those as real provisioning cost, not just probes.
40
+ - exe.dev runs `--setup-script` as the unprivileged `exedev` user, not as root. That user has passwordless `sudo`, so any system-level steps in a custom `setupScript` must invoke `sudo` explicitly (for example `sudo apt-get install -y …`). When you omit `setupScript`, the plugin supplies a default that installs Node 20 via the official nodesource script — Paperclip's sandbox callback bridge is a Node program, so the VM needs `node` on `PATH` before the bridge can launch.
41
+
42
+ ## Local development
43
+
44
+ ```bash
45
+ cd packages/plugins/sandbox-providers/exe-dev
46
+ pnpm install --ignore-workspace --no-lockfile
47
+ pnpm build
48
+ pnpm test
49
+ pnpm typecheck
50
+ ```
51
+
52
+ These commands assume the repo root has already been installed once so the local `@paperclipai/plugin-sdk` workspace package is available to the compiler during development.
53
+
54
+ ## Package layout
55
+
56
+ - `src/manifest.ts` declares the sandbox-provider driver metadata
57
+ - `src/plugin.ts` implements the environment lifecycle hooks
58
+ - `paperclipPlugin.manifest` and `paperclipPlugin.worker` point the host at the built plugin entrypoints in `dist/`
@@ -0,0 +1,3 @@
1
+ export { default as manifest } from "./manifest.js";
2
+ export { default as plugin } from "./plugin.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { default as manifest } from "./manifest.js";
2
+ export { default as plugin } from "./plugin.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,4 @@
1
+ import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
2
+ declare const manifest: PaperclipPluginManifestV1;
3
+ export default manifest;
4
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAKzE,QAAA,MAAM,QAAQ,EAAE,yBAyHf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,119 @@
1
+ const PLUGIN_ID = "paperclip.exe-dev-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: "exe.dev Sandbox Provider",
8
+ description: "Sandbox provider plugin that provisions exe.dev VMs as Paperclip execution environments.",
9
+ author: "Paperclip",
10
+ categories: ["automation"],
11
+ capabilities: ["environment.drivers.register"],
12
+ entrypoints: {
13
+ worker: "./dist/worker.js",
14
+ },
15
+ environmentDrivers: [
16
+ {
17
+ driverKey: "exe-dev",
18
+ kind: "sandbox_provider",
19
+ displayName: "exe.dev VM",
20
+ description: "Provisions exe.dev VMs through the HTTPS API, then runs commands over direct SSH for long-lived Paperclip workloads.",
21
+ configSchema: {
22
+ type: "object",
23
+ properties: {
24
+ apiKey: {
25
+ type: "string",
26
+ format: "secret-ref",
27
+ description: "Environment-specific exe.dev API token. Paste a token or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Falls back to EXE_API_KEY if omitted.",
28
+ },
29
+ apiUrl: {
30
+ type: "string",
31
+ description: "Optional exe.dev HTTPS API base URL or /exec endpoint. Defaults to https://exe.dev/exec.",
32
+ },
33
+ namePrefix: {
34
+ type: "string",
35
+ description: "Optional prefix used when generating VM names.",
36
+ default: "paperclip",
37
+ },
38
+ image: {
39
+ type: "string",
40
+ description: "Optional container image to use when creating the VM.",
41
+ },
42
+ command: {
43
+ type: "string",
44
+ description: "Optional container command passed to `exe.dev new --command`.",
45
+ },
46
+ cpu: {
47
+ type: "number",
48
+ description: "Optional CPU count passed to `exe.dev new --cpu`.",
49
+ },
50
+ memory: {
51
+ type: "string",
52
+ description: "Optional memory size such as `4GB`.",
53
+ },
54
+ disk: {
55
+ type: "string",
56
+ description: "Optional disk size such as `20GB`.",
57
+ },
58
+ comment: {
59
+ type: "string",
60
+ description: "Optional short note attached to created VMs.",
61
+ },
62
+ env: {
63
+ type: "object",
64
+ description: "Optional environment variables applied at VM creation time.",
65
+ additionalProperties: { type: "string" },
66
+ },
67
+ integrations: {
68
+ type: "array",
69
+ description: "Optional exe.dev integrations to attach during VM creation.",
70
+ items: { type: "string" },
71
+ },
72
+ tags: {
73
+ type: "array",
74
+ description: "Optional tags to apply during VM creation.",
75
+ items: { type: "string" },
76
+ },
77
+ setupScript: {
78
+ type: "string",
79
+ description: "Optional first-boot setup script passed to `exe.dev new --setup-script`.",
80
+ },
81
+ prompt: {
82
+ type: "string",
83
+ description: "Optional Shelley prompt passed to `exe.dev new --prompt`.",
84
+ },
85
+ timeoutMs: {
86
+ type: "number",
87
+ description: "Timeout for VM lifecycle and SSH operations in milliseconds.",
88
+ default: 300000,
89
+ },
90
+ reuseLease: {
91
+ type: "boolean",
92
+ description: "Whether to keep the VM alive between runs instead of deleting it on release.",
93
+ default: false,
94
+ },
95
+ sshUser: {
96
+ type: "string",
97
+ description: "Optional SSH username for direct VM access.",
98
+ },
99
+ sshIdentityFile: {
100
+ type: "string",
101
+ description: "Optional absolute path to the SSH private key the Paperclip host should use for VM access.",
102
+ },
103
+ sshPort: {
104
+ type: "number",
105
+ description: "SSH port for direct VM access.",
106
+ default: 22,
107
+ },
108
+ strictHostKeyChecking: {
109
+ type: "string",
110
+ description: "Host key policy passed to ssh via StrictHostKeyChecking. Typical values are `accept-new`, `yes`, or `no`.",
111
+ default: "accept-new",
112
+ },
113
+ },
114
+ },
115
+ },
116
+ ],
117
+ };
118
+ export default manifest;
119
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const plugin: import("@paperclipai/plugin-sdk").PaperclipPlugin;
2
+ export default plugin;
3
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAmhBA,QAAA,MAAM,MAAM,mDAgOV,CAAC;AAEH,eAAe,MAAM,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,597 @@
1
+ import path from "node:path";
2
+ import { randomUUID } from "node:crypto";
3
+ import { spawn } from "node:child_process";
4
+ import { definePlugin } from "@paperclipai/plugin-sdk";
5
+ const DEFAULT_API_URL = "https://exe.dev/exec";
6
+ const DEFAULT_TIMEOUT_MS = 300_000;
7
+ const EXE_DEV_API_MAX_TIMEOUT_MS = 29_000;
8
+ const SSH_SIGKILL_GRACE_MS = 250;
9
+ class ExeDevApiError extends Error {
10
+ status;
11
+ body;
12
+ constructor(message, status, body) {
13
+ super(message);
14
+ this.name = "ExeDevApiError";
15
+ this.status = status;
16
+ this.body = body;
17
+ }
18
+ }
19
+ function parseOptionalString(value) {
20
+ if (typeof value === "number" && Number.isFinite(value))
21
+ return String(value);
22
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
23
+ }
24
+ function parseOptionalInteger(value) {
25
+ if (value == null || value === "")
26
+ return null;
27
+ const parsed = Number(value);
28
+ return Number.isFinite(parsed) ? Math.trunc(parsed) : null;
29
+ }
30
+ function parseStringArray(value) {
31
+ if (Array.isArray(value)) {
32
+ return value
33
+ .map((entry) => parseOptionalString(entry))
34
+ .filter((entry) => entry != null);
35
+ }
36
+ if (typeof value === "string") {
37
+ return value
38
+ .split(",")
39
+ .map((entry) => entry.trim())
40
+ .filter((entry) => entry.length > 0);
41
+ }
42
+ return [];
43
+ }
44
+ function parseEnvMap(value) {
45
+ if (!value || typeof value !== "object" || Array.isArray(value))
46
+ return {};
47
+ const env = {};
48
+ for (const [key, raw] of Object.entries(value)) {
49
+ const normalizedKey = key.trim();
50
+ const normalizedValue = parseOptionalString(raw);
51
+ if (normalizedKey.length > 0 && normalizedValue != null) {
52
+ env[normalizedKey] = normalizedValue;
53
+ }
54
+ }
55
+ return env;
56
+ }
57
+ function isValidUrl(value) {
58
+ try {
59
+ new URL(value);
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ function normalizeApiUrl(value) {
67
+ if (!value)
68
+ return DEFAULT_API_URL;
69
+ const trimmed = value.trim();
70
+ if (!trimmed)
71
+ return DEFAULT_API_URL;
72
+ try {
73
+ const parsed = new URL(trimmed);
74
+ const normalizedPath = parsed.pathname.replace(/\/+$/, "") || "/";
75
+ if (normalizedPath === "/exec") {
76
+ parsed.pathname = "/exec";
77
+ return parsed.toString();
78
+ }
79
+ parsed.pathname = `${normalizedPath === "/" ? "" : normalizedPath}/exec`.replace(/\/{2,}/g, "/");
80
+ return parsed.toString();
81
+ }
82
+ catch {
83
+ return trimmed;
84
+ }
85
+ }
86
+ function normalizeNamePrefix(value) {
87
+ const normalized = (value ?? "paperclip")
88
+ .toLowerCase()
89
+ .replace(/[^a-z0-9-]+/g, "-")
90
+ .replace(/^-+|-+$/g, "")
91
+ .replace(/-{2,}/g, "-");
92
+ return normalized.length > 0 ? normalized.slice(0, 24) : "paperclip";
93
+ }
94
+ function parseDriverConfig(raw) {
95
+ const timeoutMs = Number(raw.timeoutMs ?? DEFAULT_TIMEOUT_MS);
96
+ const sshPort = Number(raw.sshPort ?? 22);
97
+ return {
98
+ apiKey: parseOptionalString(raw.apiKey),
99
+ apiUrl: normalizeApiUrl(parseOptionalString(raw.apiUrl)),
100
+ namePrefix: normalizeNamePrefix(parseOptionalString(raw.namePrefix)),
101
+ image: parseOptionalString(raw.image),
102
+ command: parseOptionalString(raw.command),
103
+ cpu: parseOptionalInteger(raw.cpu),
104
+ memory: parseOptionalString(raw.memory),
105
+ disk: parseOptionalString(raw.disk),
106
+ comment: parseOptionalString(raw.comment),
107
+ env: parseEnvMap(raw.env),
108
+ integrations: parseStringArray(raw.integrations),
109
+ tags: parseStringArray(raw.tags),
110
+ setupScript: parseOptionalString(raw.setupScript),
111
+ prompt: parseOptionalString(raw.prompt),
112
+ timeoutMs: Number.isFinite(timeoutMs) ? Math.trunc(timeoutMs) : DEFAULT_TIMEOUT_MS,
113
+ reuseLease: raw.reuseLease === true,
114
+ sshUser: parseOptionalString(raw.sshUser),
115
+ sshIdentityFile: parseOptionalString(raw.sshIdentityFile),
116
+ sshPort: Number.isFinite(sshPort) ? Math.trunc(sshPort) : 22,
117
+ strictHostKeyChecking: parseOptionalString(raw.strictHostKeyChecking) ?? "accept-new",
118
+ };
119
+ }
120
+ function resolveApiKey(config) {
121
+ if (config.apiKey)
122
+ return config.apiKey;
123
+ const envApiKey = process.env.EXE_API_KEY?.trim() ?? "";
124
+ if (!envApiKey) {
125
+ throw new Error("exe.dev environments require an API key in config or EXE_API_KEY.");
126
+ }
127
+ return envApiKey;
128
+ }
129
+ function isValidShellEnvKey(value) {
130
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
131
+ }
132
+ function shellQuote(value) {
133
+ return `'${value.replace(/'/g, `'"'"'`)}'`;
134
+ }
135
+ function formatErrorMessage(error) {
136
+ return error instanceof Error ? error.message : String(error);
137
+ }
138
+ function summarizeLifecycleCommand(command) {
139
+ const [name] = command.trim().split(/\s+/, 1);
140
+ return name && name.length > 0 ? name : "command";
141
+ }
142
+ function buildVmName(config, params) {
143
+ const envPart = params.environmentId.replace(/[^a-z0-9]+/gi, "").slice(0, 8).toLowerCase() || "env";
144
+ const runPart = params.runId.replace(/[^a-z0-9]+/gi, "").slice(0, 8).toLowerCase() || randomUUID().slice(0, 8);
145
+ return `${config.namePrefix}-${envPart}-${runPart}`.slice(0, 63);
146
+ }
147
+ function buildFlag(name, value) {
148
+ if (value == null)
149
+ return [];
150
+ return [`--${name}=${shellQuote(String(value))}`];
151
+ }
152
+ function buildRepeatedFlag(name, values) {
153
+ return values.flatMap((value) => buildFlag(name, value));
154
+ }
155
+ function buildEnvFlags(env) {
156
+ return Object.entries(env).flatMap(([key, value]) => buildFlag("env", `${key}=${value}`));
157
+ }
158
+ function buildCreateCommand(config, vmName) {
159
+ return [
160
+ "new",
161
+ "--json",
162
+ "--no-email",
163
+ ...buildFlag("name", vmName),
164
+ ...buildFlag("image", config.image),
165
+ ...buildFlag("command", config.command),
166
+ ...buildFlag("cpu", config.cpu),
167
+ ...buildFlag("memory", config.memory),
168
+ ...buildFlag("disk", config.disk),
169
+ ...buildFlag("comment", config.comment),
170
+ ...buildEnvFlags(config.env),
171
+ ...buildRepeatedFlag("integration", config.integrations),
172
+ ...buildRepeatedFlag("tag", config.tags),
173
+ ...buildFlag("setup-script", config.setupScript),
174
+ ...buildFlag("prompt", config.prompt),
175
+ ].join(" ");
176
+ }
177
+ async function runLifecycleCommand(config, command) {
178
+ const response = await fetch(config.apiUrl, {
179
+ method: "POST",
180
+ headers: {
181
+ Authorization: `Bearer ${resolveApiKey(config)}`,
182
+ "Content-Type": "text/plain; charset=utf-8",
183
+ },
184
+ body: command,
185
+ signal: AbortSignal.timeout(Math.min(config.timeoutMs, EXE_DEV_API_MAX_TIMEOUT_MS)),
186
+ });
187
+ const body = await response.text();
188
+ if (!response.ok) {
189
+ throw new ExeDevApiError(`exe.dev API command failed (${response.status}) for: ${summarizeLifecycleCommand(command)}`, response.status, body);
190
+ }
191
+ const trimmed = body.trim();
192
+ if (!trimmed)
193
+ return null;
194
+ try {
195
+ return JSON.parse(trimmed);
196
+ }
197
+ catch {
198
+ return body;
199
+ }
200
+ }
201
+ function parseVmRecord(value, seen = new WeakSet()) {
202
+ if (!value || typeof value !== "object" || Array.isArray(value))
203
+ return null;
204
+ if (seen.has(value))
205
+ return null;
206
+ seen.add(value);
207
+ const record = value;
208
+ const nested = parseVmRecord(record.vm, seen) ?? parseVmRecord(record.data, seen);
209
+ if (nested)
210
+ return nested;
211
+ const name = parseOptionalString(record.vm_name ?? record.name ?? record.vmName);
212
+ const sshDest = parseOptionalString(record.ssh_dest ?? record.sshDest)
213
+ ?? (name ? `${name}.exe.xyz` : null);
214
+ if (!name || !sshDest)
215
+ return null;
216
+ return {
217
+ name,
218
+ sshDest,
219
+ httpsUrl: parseOptionalString(record.https_url ?? record.httpsUrl),
220
+ status: parseOptionalString(record.status),
221
+ region: parseOptionalString(record.region),
222
+ regionDisplay: parseOptionalString(record.region_display ?? record.regionDisplay),
223
+ };
224
+ }
225
+ async function lookupVm(config, vmName) {
226
+ const response = await runLifecycleCommand(config, `ls --json ${shellQuote(vmName)}`);
227
+ const list = Array.isArray(response?.vms)
228
+ ? response.vms
229
+ : Array.isArray(response)
230
+ ? response
231
+ : response
232
+ ? [response]
233
+ : [];
234
+ for (const candidate of list) {
235
+ const parsed = parseVmRecord(candidate);
236
+ if (parsed?.name === vmName || parsed?.sshDest === vmName) {
237
+ return parsed;
238
+ }
239
+ }
240
+ return null;
241
+ }
242
+ async function createVm(config, params) {
243
+ const vmName = "runId" in params
244
+ ? buildVmName(config, params)
245
+ : `${config.namePrefix}-probe-${randomUUID().slice(0, 8)}`.slice(0, 63);
246
+ const response = await runLifecycleCommand(config, buildCreateCommand(config, vmName));
247
+ const created = parseVmRecord(response) ?? await lookupVm(config, vmName);
248
+ if (!created) {
249
+ throw new Error(`exe.dev did not return VM metadata for ${vmName}.`);
250
+ }
251
+ return created;
252
+ }
253
+ async function deleteVm(config, vmName) {
254
+ await runLifecycleCommand(config, `rm --json ${shellQuote(vmName)}`);
255
+ }
256
+ function buildSshDestination(config, vm) {
257
+ return config.sshUser ? `${config.sshUser}@${vm.sshDest}` : vm.sshDest;
258
+ }
259
+ function buildSshArgs(config, vm, remoteCommand) {
260
+ const args = [
261
+ "-T",
262
+ "-o",
263
+ "BatchMode=yes",
264
+ "-o",
265
+ `StrictHostKeyChecking=${config.strictHostKeyChecking}`,
266
+ "-o",
267
+ "ConnectTimeout=15",
268
+ "-p",
269
+ String(config.sshPort),
270
+ ];
271
+ if (config.sshIdentityFile) {
272
+ args.push("-i", config.sshIdentityFile, "-o", "IdentitiesOnly=yes");
273
+ }
274
+ args.push(buildSshDestination(config, vm), remoteCommand);
275
+ return args;
276
+ }
277
+ function buildLoginShellScript(input) {
278
+ const env = input.env ?? {};
279
+ for (const key of Object.keys(env)) {
280
+ if (!isValidShellEnvKey(key)) {
281
+ throw new Error(`Invalid exe.dev environment variable key: ${key}`);
282
+ }
283
+ }
284
+ const envArgs = Object.entries(env)
285
+ .filter((entry) => typeof entry[1] === "string")
286
+ .map(([key, value]) => `${key}=${shellQuote(value)}`);
287
+ const commandParts = [shellQuote(input.command), ...input.args.map(shellQuote)].join(" ");
288
+ const finalLine = envArgs.length > 0
289
+ ? `exec env ${envArgs.join(" ")} ${commandParts}`
290
+ : `exec ${commandParts}`;
291
+ const lines = [
292
+ 'if [ -f /etc/profile ]; then . /etc/profile >/dev/null 2>&1 || true; fi',
293
+ 'if [ -f "$HOME/.profile" ]; then . "$HOME/.profile" >/dev/null 2>&1 || true; fi',
294
+ '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',
295
+ 'if [ -f "$HOME/.zprofile" ]; then . "$HOME/.zprofile" >/dev/null 2>&1 || true; fi',
296
+ 'export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"',
297
+ '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" >/dev/null 2>&1 || true',
298
+ ];
299
+ if (input.cwd) {
300
+ lines.push(`cd ${shellQuote(input.cwd)}`);
301
+ }
302
+ lines.push(finalLine);
303
+ return lines.join(" && ");
304
+ }
305
+ async function runSshCommand(config, vm, remoteCommand, options = {}) {
306
+ const timeoutMs = options.timeoutMs ?? config.timeoutMs;
307
+ return await new Promise((resolve, reject) => {
308
+ const child = spawn("ssh", buildSshArgs(config, vm, remoteCommand), {
309
+ stdio: [options.stdin != null ? "pipe" : "ignore", "pipe", "pipe"],
310
+ });
311
+ let stdout = "";
312
+ let stderr = "";
313
+ let timedOut = false;
314
+ let killTimer = null;
315
+ const timer = timeoutMs > 0
316
+ ? setTimeout(() => {
317
+ timedOut = true;
318
+ child.kill("SIGTERM");
319
+ killTimer = setTimeout(() => {
320
+ child.kill("SIGKILL");
321
+ }, SSH_SIGKILL_GRACE_MS);
322
+ }, timeoutMs)
323
+ : null;
324
+ child.stdout?.on("data", (chunk) => {
325
+ stdout += String(chunk);
326
+ });
327
+ child.stderr?.on("data", (chunk) => {
328
+ stderr += String(chunk);
329
+ });
330
+ child.on("error", (error) => {
331
+ if (timer)
332
+ clearTimeout(timer);
333
+ if (killTimer)
334
+ clearTimeout(killTimer);
335
+ reject(error);
336
+ });
337
+ child.on("close", (code, signal) => {
338
+ if (timer)
339
+ clearTimeout(timer);
340
+ if (killTimer)
341
+ clearTimeout(killTimer);
342
+ resolve({
343
+ exitCode: timedOut ? null : code,
344
+ signal,
345
+ timedOut,
346
+ stdout,
347
+ stderr,
348
+ });
349
+ });
350
+ if (options.stdin != null && child.stdin) {
351
+ child.stdin.write(options.stdin);
352
+ child.stdin.end();
353
+ }
354
+ });
355
+ }
356
+ async function prepareRemoteLeaseContext(config, vm, requestedCwd) {
357
+ const requested = requestedCwd?.trim() ?? "";
358
+ const result = await runSshCommand(config, vm, `sh -lc ${shellQuote([
359
+ `requested_cwd=${shellQuote(requested)}`,
360
+ 'home="${HOME:-}"',
361
+ 'if [ -z "$home" ]; then home="$(pwd)"; fi',
362
+ 'if command -v bash >/dev/null 2>&1; then shell=bash; else shell=sh; fi',
363
+ 'if [ -n "$requested_cwd" ]; then remote_cwd="$requested_cwd"; else remote_cwd="$home/paperclip-workspace"; fi',
364
+ 'mkdir -p "$remote_cwd"',
365
+ 'printf "%s\\n%s\\n%s\\n" "$home" "$shell" "$remote_cwd"',
366
+ ].join("; "))}`);
367
+ if (result.timedOut || result.exitCode !== 0) {
368
+ throw new Error(`Failed to prepare exe.dev VM ${vm.name}: ${result.stderr.trim() || result.stdout.trim() || "unknown error"}`);
369
+ }
370
+ const [homeDirRaw, shellRaw, remoteCwdRaw] = result.stdout.split(/\r?\n/);
371
+ const homeDir = homeDirRaw?.trim() || "/tmp";
372
+ return {
373
+ homeDir,
374
+ shellCommand: shellRaw?.trim() === "bash" ? "bash" : "sh",
375
+ remoteCwd: remoteCwdRaw?.trim() || path.posix.join(homeDir, "paperclip-workspace"),
376
+ };
377
+ }
378
+ async function buildLease(config, vm, requestedCwd, resumedLease) {
379
+ const remote = await prepareRemoteLeaseContext(config, vm, requestedCwd);
380
+ return {
381
+ providerLeaseId: vm.name,
382
+ metadata: {
383
+ provider: "exe-dev",
384
+ vmName: vm.name,
385
+ sshDest: vm.sshDest,
386
+ httpsUrl: vm.httpsUrl,
387
+ region: vm.region,
388
+ regionDisplay: vm.regionDisplay,
389
+ shellCommand: remote.shellCommand,
390
+ remoteCwd: remote.remoteCwd,
391
+ timeoutMs: config.timeoutMs,
392
+ reuseLease: config.reuseLease,
393
+ resumedLease,
394
+ },
395
+ };
396
+ }
397
+ function metadataVmRecord(params) {
398
+ if (!params.providerLeaseId)
399
+ return null;
400
+ const sshDest = parseOptionalString(params.leaseMetadata?.sshDest) ?? `${params.providerLeaseId}.exe.xyz`;
401
+ return {
402
+ name: params.providerLeaseId,
403
+ sshDest,
404
+ httpsUrl: parseOptionalString(params.leaseMetadata?.httpsUrl),
405
+ status: parseOptionalString(params.leaseMetadata?.status),
406
+ region: parseOptionalString(params.leaseMetadata?.region),
407
+ regionDisplay: parseOptionalString(params.leaseMetadata?.regionDisplay),
408
+ };
409
+ }
410
+ const plugin = definePlugin({
411
+ async setup(ctx) {
412
+ ctx.logger.info("exe.dev sandbox provider plugin ready");
413
+ },
414
+ async onHealth() {
415
+ return { status: "ok", message: "exe.dev sandbox provider plugin healthy" };
416
+ },
417
+ async onEnvironmentValidateConfig(params) {
418
+ const config = parseDriverConfig(params.config);
419
+ const errors = [];
420
+ const warnings = [];
421
+ if (config.apiUrl && !isValidUrl(config.apiUrl)) {
422
+ errors.push("apiUrl must be a valid URL.");
423
+ }
424
+ if (config.timeoutMs < 1 || config.timeoutMs > 86_400_000) {
425
+ errors.push("timeoutMs must be between 1 and 86400000.");
426
+ }
427
+ if (config.cpu != null && config.cpu <= 0) {
428
+ errors.push("cpu must be greater than 0 when provided.");
429
+ }
430
+ if (config.sshPort < 1 || config.sshPort > 65_535) {
431
+ errors.push("sshPort must be between 1 and 65535.");
432
+ }
433
+ if (!config.apiKey && !(process.env.EXE_API_KEY?.trim())) {
434
+ errors.push("exe.dev environments require an API key in config or EXE_API_KEY.");
435
+ }
436
+ for (const key of Object.keys(config.env)) {
437
+ if (!isValidShellEnvKey(key)) {
438
+ errors.push(`env contains an invalid key: ${key}`);
439
+ }
440
+ }
441
+ if (typeof params.config.strictHostKeyChecking === "string" &&
442
+ params.config.strictHostKeyChecking.trim().length === 0) {
443
+ errors.push("strictHostKeyChecking cannot be empty.");
444
+ }
445
+ warnings.push("The Paperclip host must have SSH access to the created exe.dev VM. The API token only covers provisioning.");
446
+ if (config.reuseLease) {
447
+ warnings.push("reuseLease keeps the VM alive between runs; this provider does not suspend retained VMs.");
448
+ }
449
+ if (errors.length > 0) {
450
+ return { ok: false, errors, warnings };
451
+ }
452
+ return {
453
+ ok: true,
454
+ warnings,
455
+ normalizedConfig: { ...config },
456
+ };
457
+ },
458
+ async onEnvironmentProbe(params) {
459
+ const config = parseDriverConfig(params.config);
460
+ let vm = null;
461
+ try {
462
+ vm = await createVm(config, params);
463
+ const lease = await buildLease(config, vm, undefined, false);
464
+ return {
465
+ ok: true,
466
+ summary: `Connected to exe.dev VM ${vm.name}.`,
467
+ metadata: {
468
+ provider: "exe-dev",
469
+ vmName: vm.name,
470
+ sshDest: vm.sshDest,
471
+ timeoutMs: config.timeoutMs,
472
+ reuseLease: config.reuseLease,
473
+ remoteCwd: lease.metadata?.remoteCwd,
474
+ shellCommand: lease.metadata?.shellCommand,
475
+ },
476
+ };
477
+ }
478
+ catch (error) {
479
+ return {
480
+ ok: false,
481
+ summary: "exe.dev environment probe failed.",
482
+ metadata: {
483
+ provider: "exe-dev",
484
+ timeoutMs: config.timeoutMs,
485
+ reuseLease: config.reuseLease,
486
+ error: formatErrorMessage(error),
487
+ },
488
+ };
489
+ }
490
+ finally {
491
+ if (vm) {
492
+ await deleteVm(config, vm.name).catch(() => undefined);
493
+ }
494
+ }
495
+ },
496
+ async onEnvironmentAcquireLease(params) {
497
+ const config = parseDriverConfig(params.config);
498
+ const vm = await createVm(config, params);
499
+ try {
500
+ return await buildLease(config, vm, params.requestedCwd, false);
501
+ }
502
+ catch (error) {
503
+ await deleteVm(config, vm.name).catch(() => undefined);
504
+ throw error;
505
+ }
506
+ },
507
+ async onEnvironmentResumeLease(params) {
508
+ const config = parseDriverConfig(params.config);
509
+ const vm = await lookupVm(config, params.providerLeaseId);
510
+ if (!vm) {
511
+ return { providerLeaseId: null, metadata: { expired: true } };
512
+ }
513
+ const requestedCwd = parseOptionalString(params.leaseMetadata?.remoteCwd);
514
+ return await buildLease(config, vm, requestedCwd ?? undefined, true);
515
+ },
516
+ async onEnvironmentReleaseLease(params) {
517
+ if (!params.providerLeaseId)
518
+ return;
519
+ const config = parseDriverConfig(params.config);
520
+ if (config.reuseLease)
521
+ return;
522
+ await deleteVm(config, params.providerLeaseId);
523
+ },
524
+ async onEnvironmentDestroyLease(params) {
525
+ if (!params.providerLeaseId)
526
+ return;
527
+ const config = parseDriverConfig(params.config);
528
+ await deleteVm(config, params.providerLeaseId);
529
+ },
530
+ async onEnvironmentRealizeWorkspace(params) {
531
+ const config = parseDriverConfig(params.config);
532
+ const remoteCwd = parseOptionalString(params.lease.metadata?.remoteCwd)
533
+ ?? params.workspace.remotePath
534
+ ?? params.workspace.localPath
535
+ ?? "/tmp/paperclip-workspace";
536
+ const vm = metadataVmRecord({
537
+ providerLeaseId: params.lease.providerLeaseId,
538
+ leaseMetadata: params.lease.metadata,
539
+ });
540
+ if (vm) {
541
+ await prepareRemoteLeaseContext(config, vm, remoteCwd);
542
+ }
543
+ return {
544
+ cwd: remoteCwd,
545
+ metadata: {
546
+ provider: "exe-dev",
547
+ remoteCwd,
548
+ },
549
+ };
550
+ },
551
+ async onEnvironmentExecute(params) {
552
+ if (!params.lease.providerLeaseId) {
553
+ return {
554
+ exitCode: 1,
555
+ signal: null,
556
+ timedOut: false,
557
+ stdout: "",
558
+ stderr: "No provider lease ID available for execution.",
559
+ };
560
+ }
561
+ const config = parseDriverConfig(params.config);
562
+ const vm = metadataVmRecord({
563
+ providerLeaseId: params.lease.providerLeaseId,
564
+ leaseMetadata: params.lease.metadata,
565
+ });
566
+ if (!vm) {
567
+ return {
568
+ exitCode: 1,
569
+ signal: null,
570
+ timedOut: false,
571
+ stdout: "",
572
+ stderr: "No exe.dev VM metadata available for execution.",
573
+ };
574
+ }
575
+ const command = buildLoginShellScript({
576
+ command: params.command,
577
+ args: params.args ?? [],
578
+ cwd: params.cwd ?? parseOptionalString(params.lease.metadata?.remoteCwd) ?? undefined,
579
+ env: params.env,
580
+ });
581
+ const result = await runSshCommand(config, vm, `sh -lc ${shellQuote(command)}`, { stdin: params.stdin, timeoutMs: params.timeoutMs ?? config.timeoutMs });
582
+ return {
583
+ exitCode: result.exitCode,
584
+ signal: result.signal,
585
+ timedOut: result.timedOut,
586
+ stdout: result.stdout,
587
+ stderr: result.stderr,
588
+ metadata: {
589
+ provider: "exe-dev",
590
+ vmName: vm.name,
591
+ sshDest: vm.sshDest,
592
+ },
593
+ };
594
+ },
595
+ });
596
+ export default plugin;
597
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import plugin from "./plugin.js";
2
+ export default plugin;
3
+ //# sourceMappingURL=worker.d.ts.map
@@ -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,5 @@
1
+ import { runWorker } from "@paperclipai/plugin-sdk";
2
+ import plugin from "./plugin.js";
3
+ export default plugin;
4
+ runWorker(plugin, import.meta.url);
5
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,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,51 @@
1
+ {
2
+ "name": "@paperclipai/plugin-exe-dev",
3
+ "version": "0.1.0",
4
+ "description": "exe.dev sandbox provider plugin for Paperclip environments",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/paperclipai/paperclip",
7
+ "bugs": {
8
+ "url": "https://github.com/paperclipai/paperclip/issues"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/paperclipai/paperclip",
13
+ "directory": "packages/plugins/sandbox-providers/exe-dev"
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
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ }
31
+ },
32
+ "main": "./dist/index.js",
33
+ "types": "./dist/index.d.ts"
34
+ },
35
+ "files": [
36
+ "dist"
37
+ ],
38
+ "paperclipPlugin": {
39
+ "manifest": "./dist/manifest.js",
40
+ "worker": "./dist/worker.js"
41
+ },
42
+ "keywords": [
43
+ "paperclip",
44
+ "plugin",
45
+ "sandbox",
46
+ "exe.dev"
47
+ ],
48
+ "dependencies": {
49
+ "@paperclipai/plugin-sdk": "1.0.0"
50
+ }
51
+ }