@paperclipai/plugin-modal 0.1.0 → 2026.518.0-canary.7

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Paperclip AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -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,yBA6Ff,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,87 @@
1
+ const PLUGIN_ID = "paperclip.modal-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: "Modal Sandbox Provider",
8
+ description: "First-party sandbox provider plugin that provisions Modal sandboxes 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: "modal",
18
+ kind: "sandbox_provider",
19
+ displayName: "Modal Sandbox",
20
+ description: "Provisions Modal sandboxes with configurable image, app, auth, timeouts, and network controls.",
21
+ configSchema: {
22
+ type: "object",
23
+ required: ["appName", "image"],
24
+ properties: {
25
+ appName: {
26
+ type: "string",
27
+ description: "Modal App name used as the parent for sandboxes. The plugin calls `modal.apps.fromName(appName, { createIfMissing: true })`, so the App is created on first acquire if it does not already exist.",
28
+ },
29
+ image: {
30
+ type: "string",
31
+ description: "Container image reference passed to `modal.images.fromRegistry()`, e.g. `python:3.13` or `node:20`.",
32
+ },
33
+ tokenId: {
34
+ type: "string",
35
+ format: "secret-ref",
36
+ description: "Modal token ID. Paste a token or an existing Paperclip secret reference; saved environments store pasted values as company secrets. Required.",
37
+ },
38
+ tokenSecret: {
39
+ type: "string",
40
+ format: "secret-ref",
41
+ description: "Modal token secret paired with tokenId. Required.",
42
+ },
43
+ environment: {
44
+ type: "string",
45
+ description: "Optional Modal environment name. Falls back to the SDK profile default.",
46
+ },
47
+ workdir: {
48
+ type: "string",
49
+ description: "Remote working directory inside the sandbox.",
50
+ default: "/workspace/paperclip",
51
+ },
52
+ sandboxTimeoutMs: {
53
+ type: "number",
54
+ description: "Maximum sandbox lifetime in milliseconds. Must be a positive multiple of 1000 between 1000 and 86400000 (24 hours).",
55
+ default: 3_600_000,
56
+ },
57
+ idleTimeoutMs: {
58
+ type: "number",
59
+ description: "Optional idle timeout in milliseconds. When set, Modal terminates the sandbox if no exec is active for this duration. Must be a positive multiple of 1000.",
60
+ },
61
+ execTimeoutMs: {
62
+ type: "number",
63
+ description: "Default per-exec timeout in milliseconds when the caller does not provide one. Must be a positive multiple of 1000.",
64
+ default: 300_000,
65
+ },
66
+ blockNetwork: {
67
+ type: "boolean",
68
+ description: "Whether to block all egress network access from the sandbox.",
69
+ default: false,
70
+ },
71
+ cidrAllowlist: {
72
+ type: "array",
73
+ items: { type: "string" },
74
+ description: "Optional list of CIDRs the sandbox is allowed to reach. Cannot be combined with blockNetwork.",
75
+ },
76
+ reuseLease: {
77
+ type: "boolean",
78
+ description: "When true, the sandbox is detached (not terminated) on release and resumed by id later. Reuse relies on Modal's sandbox lifetime and idle timeout because Modal has no separate pause primitive.",
79
+ default: false,
80
+ },
81
+ },
82
+ },
83
+ },
84
+ ],
85
+ };
86
+ export default manifest;
87
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,kCAAkC,CAAC;AACrD,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,QAAQ,GAA8B;IAC1C,EAAE,EAAE,SAAS;IACb,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,wBAAwB;IACrC,WAAW,EACT,0GAA0G;IAC5G,MAAM,EAAE,WAAW;IACnB,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,OAAO;YAClB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,eAAe;YAC5B,WAAW,EACT,gGAAgG;YAClG,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;gBAC9B,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,mMAAmM;qBACtM;oBACD,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,qGAAqG;qBACxG;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EACT,+IAA+I;qBAClJ;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EAAE,mDAAmD;qBACjE;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,yEAAyE;qBAC5E;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8CAA8C;wBAC3D,OAAO,EAAE,sBAAsB;qBAChC;oBACD,gBAAgB,EAAE;wBAChB,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,qHAAqH;wBACvH,OAAO,EAAE,SAAS;qBACnB;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,4JAA4J;qBAC/J;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,QAAQ;wBACd,WAAW,EACT,qHAAqH;wBACvH,OAAO,EAAE,OAAO;qBACjB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,8DAA8D;wBAC3E,OAAO,EAAE,KAAK;qBACf;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACzB,WAAW,EACT,+FAA+F;qBAClG;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,kMAAkM;wBACpM,OAAO,EAAE,KAAK;qBACf;iBACF;aACF;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,18 @@
1
+ interface ModalDriverConfig {
2
+ appName: string;
3
+ image: string;
4
+ tokenId: string | null;
5
+ tokenSecret: string | null;
6
+ environment: string | null;
7
+ workdir: string;
8
+ sandboxTimeoutMs: number;
9
+ idleTimeoutMs: number | null;
10
+ execTimeoutMs: number;
11
+ blockNetwork: boolean;
12
+ cidrAllowlist: string[] | null;
13
+ reuseLease: boolean;
14
+ }
15
+ export declare function parseDriverConfig(raw: Record<string, unknown>): ModalDriverConfig;
16
+ declare const plugin: import("@paperclipai/plugin-sdk").PaperclipPlugin;
17
+ export default plugin;
18
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAgCA,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;CACrB;AAqBD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAoBjF;AAuPD,QAAA,MAAM,MAAM,mDAoUV,CAAC;AAEH,eAAe,MAAM,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,552 @@
1
+ import { ModalClient, NotFoundError, SandboxTimeoutError, TimeoutError, } from "modal";
2
+ import { definePlugin } from "@paperclipai/plugin-sdk";
3
+ const DEFAULT_WORKDIR = "/workspace/paperclip";
4
+ const DEFAULT_SANDBOX_TIMEOUT_MS = 3_600_000;
5
+ const DEFAULT_EXEC_TIMEOUT_MS = 300_000;
6
+ const MAX_SANDBOX_TIMEOUT_MS = 86_400_000;
7
+ function parseOptionalString(value) {
8
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
9
+ }
10
+ function parseOptionalNumber(value) {
11
+ if (value == null || value === "")
12
+ return null;
13
+ const parsed = Number(value);
14
+ return Number.isFinite(parsed) ? parsed : null;
15
+ }
16
+ function parseStringArray(value) {
17
+ if (!Array.isArray(value))
18
+ return null;
19
+ const trimmed = value
20
+ .filter((entry) => typeof entry === "string")
21
+ .map((entry) => entry.trim())
22
+ .filter((entry) => entry.length > 0);
23
+ return trimmed.length > 0 ? trimmed : null;
24
+ }
25
+ export function parseDriverConfig(raw) {
26
+ const sandboxTimeoutMsRaw = parseOptionalNumber(raw.sandboxTimeoutMs);
27
+ const execTimeoutMsRaw = parseOptionalNumber(raw.execTimeoutMs);
28
+ const idleTimeoutMsRaw = parseOptionalNumber(raw.idleTimeoutMs);
29
+ return {
30
+ appName: parseOptionalString(raw.appName) ?? "",
31
+ image: parseOptionalString(raw.image) ?? "",
32
+ tokenId: parseOptionalString(raw.tokenId),
33
+ tokenSecret: parseOptionalString(raw.tokenSecret),
34
+ environment: parseOptionalString(raw.environment),
35
+ workdir: parseOptionalString(raw.workdir) ?? DEFAULT_WORKDIR,
36
+ sandboxTimeoutMs: sandboxTimeoutMsRaw != null ? Math.trunc(sandboxTimeoutMsRaw) : DEFAULT_SANDBOX_TIMEOUT_MS,
37
+ idleTimeoutMs: idleTimeoutMsRaw != null ? Math.trunc(idleTimeoutMsRaw) : null,
38
+ execTimeoutMs: execTimeoutMsRaw != null ? Math.trunc(execTimeoutMsRaw) : DEFAULT_EXEC_TIMEOUT_MS,
39
+ blockNetwork: raw.blockNetwork === true,
40
+ cidrAllowlist: parseStringArray(raw.cidrAllowlist),
41
+ reuseLease: raw.reuseLease === true,
42
+ };
43
+ }
44
+ function isMultipleOf1000(value) {
45
+ return value > 0 && value % 1000 === 0;
46
+ }
47
+ function resolveAuth(config) {
48
+ // The plugin worker runs in a child process that does not inherit host env
49
+ // vars (see PluginWorkerManager.spawnProcess), so MODAL_TOKEN_ID /
50
+ // MODAL_TOKEN_SECRET cannot be read here. Credentials must come from the
51
+ // environment config, which Paperclip stores as company secrets.
52
+ const tokenId = config.tokenId ?? "";
53
+ const tokenSecret = config.tokenSecret ?? "";
54
+ if (!tokenId && !tokenSecret)
55
+ return null;
56
+ if (!tokenId || !tokenSecret) {
57
+ throw new Error("Modal sandbox environments require both tokenId and tokenSecret to be configured.");
58
+ }
59
+ return { tokenId, tokenSecret };
60
+ }
61
+ function createModalClient(config) {
62
+ const auth = resolveAuth(config);
63
+ const params = {};
64
+ if (auth) {
65
+ params.tokenId = auth.tokenId;
66
+ params.tokenSecret = auth.tokenSecret;
67
+ }
68
+ if (config.environment) {
69
+ params.environment = config.environment;
70
+ }
71
+ return new ModalClient(params);
72
+ }
73
+ async function resolveApp(client, config) {
74
+ return await client.apps.fromName(config.appName, {
75
+ createIfMissing: true,
76
+ environment: config.environment ?? undefined,
77
+ });
78
+ }
79
+ function buildSandboxCreateParams(input) {
80
+ const params = {
81
+ workdir: input.config.workdir,
82
+ timeoutMs: input.config.sandboxTimeoutMs,
83
+ blockNetwork: input.config.blockNetwork,
84
+ };
85
+ if (input.config.idleTimeoutMs != null) {
86
+ params.idleTimeoutMs = input.config.idleTimeoutMs;
87
+ }
88
+ if (input.config.cidrAllowlist && input.config.cidrAllowlist.length > 0) {
89
+ params.cidrAllowlist = input.config.cidrAllowlist;
90
+ }
91
+ // Modal sandboxes accept tag metadata via setTags after creation; the create
92
+ // RPC does not take tags directly. We pass them through input so the caller
93
+ // can apply them after `create` resolves.
94
+ void input.tags;
95
+ return params;
96
+ }
97
+ function buildSandboxTags(input) {
98
+ return {
99
+ "paperclip-provider": "modal",
100
+ "paperclip-company-id": input.companyId,
101
+ "paperclip-environment-id": input.environmentId,
102
+ "paperclip-reuse-lease": input.reuseLease ? "true" : "false",
103
+ ...(input.runId ? { "paperclip-run-id": input.runId } : {}),
104
+ };
105
+ }
106
+ async function createSandboxFor(client, app, config, tags) {
107
+ const image = client.images.fromRegistry(config.image);
108
+ const params = buildSandboxCreateParams({ config, tags });
109
+ const sandbox = await client.sandboxes.create(app, image, params);
110
+ try {
111
+ await sandbox.setTags(tags);
112
+ }
113
+ catch (error) {
114
+ // setTags is best-effort metadata; surface but do not block lease creation.
115
+ console.warn(`Failed to set tags on Modal sandbox ${sandbox.sandboxId}: ${formatErrorMessage(error)}`);
116
+ }
117
+ return sandbox;
118
+ }
119
+ function leaseMetadata(input) {
120
+ return {
121
+ provider: "modal",
122
+ shellCommand: "sh",
123
+ sandboxId: input.sandbox.sandboxId,
124
+ appName: input.config.appName,
125
+ image: input.config.image,
126
+ sandboxTimeoutMs: input.config.sandboxTimeoutMs,
127
+ idleTimeoutMs: input.config.idleTimeoutMs,
128
+ reuseLease: input.config.reuseLease,
129
+ remoteCwd: input.remoteCwd,
130
+ resumedLease: input.resumedLease,
131
+ };
132
+ }
133
+ function formatErrorMessage(error) {
134
+ return error instanceof Error ? error.message : String(error);
135
+ }
136
+ function shellQuote(value) {
137
+ return `'${value.replace(/'/g, `'"'"'`)}'`;
138
+ }
139
+ function isValidShellEnvKey(value) {
140
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
141
+ }
142
+ // Modal's `sandbox.exec` takes an argv array and bypasses the shell entirely,
143
+ // so adapter probes that rely on PATH mutations from /etc/profile or ~/.bashrc
144
+ // do not work without an explicit login shell. Mirroring the Daytona / E2B
145
+ // providers, wrap the user command in a `sh -lc` script that sources common
146
+ // login profiles plus nvm before invoking it. Env is set after profile sourcing
147
+ // so caller env wins; stdin is staged to a temp file and shell-redirected so
148
+ // fast-failing commands do not race a streaming stdin writer.
149
+ function buildLoginShellScript(input) {
150
+ const env = input.env ?? {};
151
+ for (const key of Object.keys(env)) {
152
+ if (!isValidShellEnvKey(key)) {
153
+ throw new Error(`Invalid sandbox environment variable key: ${key}`);
154
+ }
155
+ }
156
+ const envArgs = Object.entries(env)
157
+ .filter((entry) => typeof entry[1] === "string")
158
+ .map(([key, value]) => `${key}=${shellQuote(value)}`);
159
+ const commandParts = [shellQuote(input.command), ...input.args.map(shellQuote)].join(" ");
160
+ const redirected = input.stdinPath
161
+ ? `${commandParts} < ${shellQuote(input.stdinPath)}`
162
+ : commandParts;
163
+ const finalLine = envArgs.length > 0 ? `exec env ${envArgs.join(" ")} ${redirected}` : `exec ${redirected}`;
164
+ const lines = [
165
+ 'if [ -f /etc/profile ]; then . /etc/profile >/dev/null 2>&1 || true; fi',
166
+ 'if [ -f "$HOME/.profile" ]; then . "$HOME/.profile" >/dev/null 2>&1 || true; fi',
167
+ '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',
168
+ 'if [ -f "$HOME/.zprofile" ]; then . "$HOME/.zprofile" >/dev/null 2>&1 || true; fi',
169
+ 'export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"',
170
+ '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" >/dev/null 2>&1 || true',
171
+ ];
172
+ if (input.cwd) {
173
+ lines.push(`cd ${shellQuote(input.cwd)}`);
174
+ }
175
+ lines.push(finalLine);
176
+ return lines.join(" && ");
177
+ }
178
+ async function ensureRemoteWorkspace(sandbox, remoteCwd) {
179
+ // Use a one-shot exec to mkdir -p; Modal does not expose a direct
180
+ // filesystem mkdir helper and creating a file via `open()` does not create
181
+ // intermediate directories.
182
+ const proc = await sandbox.exec(["sh", "-lc", `mkdir -p ${shellQuote(remoteCwd)}`]);
183
+ const exitCode = await proc.wait();
184
+ if (exitCode !== 0) {
185
+ throw new Error(`Failed to create remote workspace directory '${remoteCwd}': mkdir exited with code ${exitCode}`);
186
+ }
187
+ }
188
+ async function stageStdin(sandbox, stdin, remotePath) {
189
+ const file = await sandbox.open(remotePath, "w");
190
+ try {
191
+ await file.write(new TextEncoder().encode(stdin));
192
+ await file.flush();
193
+ }
194
+ finally {
195
+ await file.close().catch(() => undefined);
196
+ }
197
+ }
198
+ async function deleteStdinPath(sandbox, remotePath) {
199
+ // Best-effort cleanup of the staged stdin file. We swallow errors because
200
+ // it is fine for the file to outlive the sandbox if it is going to be
201
+ // terminated, and a missing rm tool would otherwise mask the real result.
202
+ try {
203
+ const proc = await sandbox.exec(["sh", "-lc", `rm -f ${shellQuote(remotePath)}`]);
204
+ await proc.wait();
205
+ }
206
+ catch {
207
+ // ignore
208
+ }
209
+ }
210
+ async function readProcessStreams(proc) {
211
+ const [stdout, stderr, exitCode] = await Promise.all([
212
+ proc.stdout.readText(),
213
+ proc.stderr.readText(),
214
+ proc.wait(),
215
+ ]);
216
+ return { stdout, stderr, exitCode };
217
+ }
218
+ function isModalNotFound(error) {
219
+ return error instanceof NotFoundError;
220
+ }
221
+ async function getSandboxOrNull(client, providerLeaseId) {
222
+ try {
223
+ return await client.sandboxes.fromId(providerLeaseId);
224
+ }
225
+ catch (error) {
226
+ if (isModalNotFound(error))
227
+ return null;
228
+ throw error;
229
+ }
230
+ }
231
+ function warnIfUnsupportedNode(logger) {
232
+ const major = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
233
+ if (Number.isFinite(major) && major < 22) {
234
+ const message = `Modal sandbox provider is running on Node ${process.versions.node}; Modal officially supports Node 22+. The plugin will attempt to operate but vendor support is not guaranteed below Node 22.`;
235
+ logger?.warn(message);
236
+ }
237
+ }
238
+ function leaseRemoteCwd(metadata, fallback) {
239
+ if (metadata && typeof metadata.remoteCwd === "string" && metadata.remoteCwd.trim().length > 0) {
240
+ return metadata.remoteCwd.trim();
241
+ }
242
+ return fallback;
243
+ }
244
+ const plugin = definePlugin({
245
+ async setup(ctx) {
246
+ warnIfUnsupportedNode(ctx.logger);
247
+ ctx.logger.info("Modal sandbox provider plugin ready");
248
+ },
249
+ async onHealth() {
250
+ return { status: "ok", message: "Modal sandbox provider plugin healthy" };
251
+ },
252
+ async onEnvironmentValidateConfig(params) {
253
+ const config = parseDriverConfig(params.config);
254
+ const errors = [];
255
+ if (!config.appName) {
256
+ errors.push("Modal sandbox environments require an appName.");
257
+ }
258
+ if (!config.image) {
259
+ errors.push("Modal sandbox environments require an image reference.");
260
+ }
261
+ if (config.sandboxTimeoutMs < 1000 ||
262
+ config.sandboxTimeoutMs > MAX_SANDBOX_TIMEOUT_MS ||
263
+ !isMultipleOf1000(config.sandboxTimeoutMs)) {
264
+ errors.push("sandboxTimeoutMs must be a positive multiple of 1000 between 1000 and 86400000.");
265
+ }
266
+ if (config.idleTimeoutMs != null &&
267
+ (config.idleTimeoutMs < 1000 || !isMultipleOf1000(config.idleTimeoutMs))) {
268
+ errors.push("idleTimeoutMs must be a positive multiple of 1000 when provided.");
269
+ }
270
+ if (config.execTimeoutMs < 1000 || !isMultipleOf1000(config.execTimeoutMs)) {
271
+ errors.push("execTimeoutMs must be a positive multiple of 1000.");
272
+ }
273
+ if (config.blockNetwork && config.cidrAllowlist && config.cidrAllowlist.length > 0) {
274
+ errors.push("cidrAllowlist cannot be combined with blockNetwork.");
275
+ }
276
+ const hasTokenId = Boolean(config.tokenId);
277
+ const hasTokenSecret = Boolean(config.tokenSecret);
278
+ if (hasTokenId !== hasTokenSecret) {
279
+ errors.push("tokenId and tokenSecret must both be provided when either is set.");
280
+ }
281
+ else if (!hasTokenId) {
282
+ errors.push("Modal sandbox environments require tokenId and tokenSecret.");
283
+ }
284
+ if (errors.length > 0) {
285
+ return { ok: false, errors };
286
+ }
287
+ return { ok: true, normalizedConfig: { ...config } };
288
+ },
289
+ async onEnvironmentProbe(params) {
290
+ const config = parseDriverConfig(params.config);
291
+ const tags = buildSandboxTags({
292
+ companyId: params.companyId,
293
+ environmentId: params.environmentId,
294
+ reuseLease: false,
295
+ });
296
+ const client = createModalClient(config);
297
+ try {
298
+ const app = await resolveApp(client, config);
299
+ const sandbox = await createSandboxFor(client, app, config, tags);
300
+ try {
301
+ await ensureRemoteWorkspace(sandbox, config.workdir);
302
+ const proc = await sandbox.exec(["sh", "-lc", "printf paperclip-probe"]);
303
+ const { stdout, exitCode } = await readProcessStreams(proc);
304
+ if (exitCode !== 0 || stdout.trim() !== "paperclip-probe") {
305
+ return {
306
+ ok: false,
307
+ summary: `Modal sandbox probe failed: exit ${exitCode}, stdout=${JSON.stringify(stdout)}`,
308
+ metadata: {
309
+ provider: "modal",
310
+ sandboxId: sandbox.sandboxId,
311
+ appName: config.appName,
312
+ image: config.image,
313
+ },
314
+ };
315
+ }
316
+ return {
317
+ ok: true,
318
+ summary: `Connected to Modal sandbox in app ${config.appName}.`,
319
+ metadata: {
320
+ provider: "modal",
321
+ sandboxId: sandbox.sandboxId,
322
+ appName: config.appName,
323
+ image: config.image,
324
+ workdir: config.workdir,
325
+ sandboxTimeoutMs: config.sandboxTimeoutMs,
326
+ idleTimeoutMs: config.idleTimeoutMs,
327
+ reuseLease: config.reuseLease,
328
+ remoteCwd: config.workdir,
329
+ },
330
+ };
331
+ }
332
+ finally {
333
+ await sandbox.terminate().catch(() => undefined);
334
+ }
335
+ }
336
+ catch (error) {
337
+ return {
338
+ ok: false,
339
+ summary: "Modal sandbox probe failed.",
340
+ metadata: {
341
+ provider: "modal",
342
+ appName: config.appName,
343
+ image: config.image,
344
+ reuseLease: config.reuseLease,
345
+ error: formatErrorMessage(error),
346
+ },
347
+ };
348
+ }
349
+ finally {
350
+ client.close();
351
+ }
352
+ },
353
+ async onEnvironmentAcquireLease(params) {
354
+ const config = parseDriverConfig(params.config);
355
+ const client = createModalClient(config);
356
+ try {
357
+ const app = await resolveApp(client, config);
358
+ const tags = buildSandboxTags({
359
+ companyId: params.companyId,
360
+ environmentId: params.environmentId,
361
+ runId: params.runId,
362
+ reuseLease: config.reuseLease,
363
+ });
364
+ const sandbox = await createSandboxFor(client, app, config, tags);
365
+ try {
366
+ await ensureRemoteWorkspace(sandbox, config.workdir);
367
+ return {
368
+ providerLeaseId: sandbox.sandboxId,
369
+ metadata: leaseMetadata({
370
+ config,
371
+ sandbox,
372
+ remoteCwd: config.workdir,
373
+ resumedLease: false,
374
+ }),
375
+ };
376
+ }
377
+ catch (error) {
378
+ await sandbox.terminate().catch(() => undefined);
379
+ throw error;
380
+ }
381
+ }
382
+ finally {
383
+ // Keep the client open for the lease lifetime is unnecessary; subsequent
384
+ // calls construct their own client. Close the local handle to free
385
+ // grpc resources.
386
+ client.close();
387
+ }
388
+ },
389
+ async onEnvironmentResumeLease(params) {
390
+ const config = parseDriverConfig(params.config);
391
+ const client = createModalClient(config);
392
+ try {
393
+ const sandbox = await getSandboxOrNull(client, params.providerLeaseId);
394
+ if (!sandbox) {
395
+ return { providerLeaseId: null, metadata: { expired: true } };
396
+ }
397
+ try {
398
+ await ensureRemoteWorkspace(sandbox, config.workdir);
399
+ return {
400
+ providerLeaseId: sandbox.sandboxId,
401
+ metadata: leaseMetadata({ config, sandbox, remoteCwd: config.workdir, resumedLease: true }),
402
+ };
403
+ }
404
+ catch (error) {
405
+ // If we just resumed and workspace setup blew up, treat as a lease
406
+ // failure rather than silently terminating the user's reusable
407
+ // sandbox. Detach so the sandbox is not killed for a transient setup
408
+ // error.
409
+ void sandbox.detach();
410
+ throw error;
411
+ }
412
+ }
413
+ finally {
414
+ client.close();
415
+ }
416
+ },
417
+ async onEnvironmentReleaseLease(params) {
418
+ if (!params.providerLeaseId)
419
+ return;
420
+ const config = parseDriverConfig(params.config);
421
+ const client = createModalClient(config);
422
+ try {
423
+ const sandbox = await getSandboxOrNull(client, params.providerLeaseId);
424
+ if (!sandbox)
425
+ return;
426
+ if (config.reuseLease) {
427
+ // Modal has no separate pause primitive. Detaching releases the local
428
+ // grpc connection but leaves the sandbox running on Modal until its
429
+ // configured sandboxTimeoutMs or idleTimeoutMs expires. The next
430
+ // acquire/resume reconnects via sandboxes.fromId(providerLeaseId).
431
+ void sandbox.detach();
432
+ return;
433
+ }
434
+ await sandbox.terminate();
435
+ }
436
+ finally {
437
+ client.close();
438
+ }
439
+ },
440
+ async onEnvironmentDestroyLease(params) {
441
+ if (!params.providerLeaseId)
442
+ return;
443
+ const config = parseDriverConfig(params.config);
444
+ const client = createModalClient(config);
445
+ try {
446
+ const sandbox = await getSandboxOrNull(client, params.providerLeaseId);
447
+ if (!sandbox)
448
+ return;
449
+ await sandbox.terminate();
450
+ }
451
+ finally {
452
+ client.close();
453
+ }
454
+ },
455
+ async onEnvironmentRealizeWorkspace(params) {
456
+ const config = parseDriverConfig(params.config);
457
+ const fallback = params.workspace.remotePath ??
458
+ params.workspace.localPath ??
459
+ config.workdir;
460
+ const remoteCwd = leaseRemoteCwd(params.lease.metadata, fallback);
461
+ if (params.lease.providerLeaseId) {
462
+ const client = createModalClient(config);
463
+ try {
464
+ const sandbox = await getSandboxOrNull(client, params.lease.providerLeaseId);
465
+ if (sandbox) {
466
+ await ensureRemoteWorkspace(sandbox, remoteCwd);
467
+ }
468
+ }
469
+ finally {
470
+ client.close();
471
+ }
472
+ }
473
+ return {
474
+ cwd: remoteCwd,
475
+ metadata: { provider: "modal", remoteCwd },
476
+ };
477
+ },
478
+ async onEnvironmentExecute(params) {
479
+ if (!params.lease.providerLeaseId) {
480
+ return {
481
+ exitCode: 1,
482
+ timedOut: false,
483
+ stdout: "",
484
+ stderr: "No provider lease ID available for execution.",
485
+ };
486
+ }
487
+ const config = parseDriverConfig(params.config);
488
+ const client = createModalClient(config);
489
+ const callerTimeoutMs = params.timeoutMs != null && Number.isFinite(params.timeoutMs) && params.timeoutMs > 0
490
+ ? Math.max(1000, Math.trunc(params.timeoutMs / 1000) * 1000)
491
+ : config.execTimeoutMs;
492
+ try {
493
+ const sandbox = await getSandboxOrNull(client, params.lease.providerLeaseId);
494
+ if (!sandbox) {
495
+ return {
496
+ exitCode: 1,
497
+ timedOut: false,
498
+ stdout: "",
499
+ stderr: "Modal sandbox lease is no longer available.\n",
500
+ };
501
+ }
502
+ const stdinPath = params.stdin != null
503
+ ? `/tmp/paperclip-stdin-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`
504
+ : null;
505
+ try {
506
+ if (stdinPath && params.stdin != null) {
507
+ await stageStdin(sandbox, params.stdin, stdinPath);
508
+ }
509
+ const script = buildLoginShellScript({
510
+ command: params.command,
511
+ args: params.args ?? [],
512
+ cwd: params.cwd ?? config.workdir,
513
+ env: params.env,
514
+ stdinPath: stdinPath ?? undefined,
515
+ });
516
+ const proc = await sandbox.exec(["sh", "-lc", script], {
517
+ timeoutMs: callerTimeoutMs,
518
+ stdout: "pipe",
519
+ stderr: "pipe",
520
+ });
521
+ const { stdout, stderr, exitCode } = await readProcessStreams(proc);
522
+ return {
523
+ exitCode,
524
+ timedOut: false,
525
+ stdout,
526
+ stderr,
527
+ };
528
+ }
529
+ catch (error) {
530
+ if (error instanceof TimeoutError || error instanceof SandboxTimeoutError) {
531
+ return {
532
+ exitCode: null,
533
+ timedOut: true,
534
+ stdout: "",
535
+ stderr: `${formatErrorMessage(error)}\n`,
536
+ };
537
+ }
538
+ throw error;
539
+ }
540
+ finally {
541
+ if (stdinPath) {
542
+ await deleteStdinPath(sandbox, stdinPath);
543
+ }
544
+ }
545
+ }
546
+ finally {
547
+ client.close();
548
+ }
549
+ },
550
+ });
551
+ export default plugin;
552
+ //# 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paperclipai/plugin-modal",
3
- "version": "0.1.0",
3
+ "version": "2026.518.0-canary.7",
4
4
  "description": "Modal sandbox provider plugin for Paperclip environments",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/paperclipai/paperclip",
@@ -22,15 +22,7 @@
22
22
  "main": "./dist/index.js",
23
23
  "types": "./dist/index.d.ts",
24
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"
25
+ "access": "public"
34
26
  },
35
27
  "files": [
36
28
  "dist"
@@ -47,6 +39,6 @@
47
39
  ],
48
40
  "dependencies": {
49
41
  "modal": "^0.7.4",
50
- "@paperclipai/plugin-sdk": "1.0.0"
42
+ "@paperclipai/plugin-sdk": "2026.518.0-canary.7"
51
43
  }
52
- }
44
+ }