@paperclipai/plugin-cloudflare-sandbox 0.1.0 → 2026.511.0-canary.9

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,39 @@
1
+ import type { CloudflareBridgeAcquireLeaseRequest, CloudflareBridgeExecuteRequest, CloudflareBridgeExecuteResponse, CloudflareBridgeHealthResponse, CloudflareBridgeLeaseResponse, CloudflareBridgeProbeRequest, CloudflareBridgeProbeResponse, CloudflareBridgeReleaseLeaseRequest, CloudflareBridgeResumeLeaseRequest, CloudflareDriverConfig } from "./types.js";
2
+ interface BridgeClientHeaders {
3
+ environmentId?: string;
4
+ runId?: string;
5
+ issueId?: string | null;
6
+ }
7
+ interface BridgeClientOptions {
8
+ config: CloudflareDriverConfig;
9
+ }
10
+ interface BridgeExecuteOptions {
11
+ onOutput?: (stream: "stdout" | "stderr", chunk: string) => void | Promise<void>;
12
+ }
13
+ export declare class CloudflareBridgeError extends Error {
14
+ readonly status: number;
15
+ readonly code: string | null;
16
+ readonly details: unknown;
17
+ constructor(input: {
18
+ status: number;
19
+ code?: string | null;
20
+ message: string;
21
+ details?: unknown;
22
+ });
23
+ }
24
+ export declare function resolveRequestTimeoutMs(config: CloudflareDriverConfig, path: string, init: RequestInit): number;
25
+ export declare function createCloudflareBridgeClient(options: BridgeClientOptions): {
26
+ health(extraHeaders?: BridgeClientHeaders): Promise<CloudflareBridgeHealthResponse>;
27
+ probe(body: CloudflareBridgeProbeRequest, extraHeaders?: BridgeClientHeaders): Promise<CloudflareBridgeProbeResponse>;
28
+ acquireLease(body: CloudflareBridgeAcquireLeaseRequest, extraHeaders?: BridgeClientHeaders): Promise<CloudflareBridgeLeaseResponse>;
29
+ resumeLease(body: CloudflareBridgeResumeLeaseRequest, extraHeaders?: BridgeClientHeaders): Promise<CloudflareBridgeLeaseResponse>;
30
+ releaseLease(body: CloudflareBridgeReleaseLeaseRequest, extraHeaders?: BridgeClientHeaders): Promise<{
31
+ ok: true;
32
+ }>;
33
+ destroyLease(providerLeaseId: string, extraHeaders?: BridgeClientHeaders): Promise<{
34
+ ok: true;
35
+ }>;
36
+ execute(body: CloudflareBridgeExecuteRequest, extraHeaders?: BridgeClientHeaders, options?: BridgeExecuteOptions): Promise<CloudflareBridgeExecuteResponse>;
37
+ };
38
+ export {};
39
+ //# sourceMappingURL=bridge-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-client.d.ts","sourceRoot":"","sources":["../src/bridge-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mCAAmC,EACnC,8BAA8B,EAC9B,+BAA+B,EAC/B,8BAA8B,EAC9B,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,mCAAmC,EACnC,kCAAkC,EAClC,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,UAAU,mBAAmB;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,UAAU,mBAAmB;IAC3B,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAYD,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;CAOhG;AAsCD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,WAAW,GAChB,MAAM,CAQR;AA4KD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mBAAmB;0BAK/C,mBAAmB,GAAG,OAAO,CAAC,8BAA8B,CAAC;gBAIvE,4BAA4B,iBAAiB,mBAAmB,GAAG,OAAO,CAAC,6BAA6B,CAAC;uBAU7G,mCAAmC,iBAC1B,mBAAmB,GACjC,OAAO,CAAC,6BAA6B,CAAC;sBAUjC,kCAAkC,iBACzB,mBAAmB,GACjC,OAAO,CAAC,6BAA6B,CAAC;uBAUjC,mCAAmC,iBAC1B,mBAAmB,GACjC,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;kCASM,MAAM,iBAAiB,mBAAmB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;kBAUxF,8BAA8B,iBACrB,mBAAmB,YACxB,oBAAoB,GAC7B,OAAO,CAAC,+BAA+B,CAAC;EAkB9C"}
@@ -0,0 +1,232 @@
1
+ function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export class CloudflareBridgeError extends Error {
5
+ status;
6
+ code;
7
+ details;
8
+ constructor(input) {
9
+ super(input.message);
10
+ this.name = "CloudflareBridgeError";
11
+ this.status = input.status;
12
+ this.code = input.code ?? null;
13
+ this.details = input.details;
14
+ }
15
+ }
16
+ function buildHeaders(config, extra = {}) {
17
+ const headers = new Headers();
18
+ headers.set("Authorization", `Bearer ${config.bridgeAuthToken}`);
19
+ headers.set("Content-Type", "application/json");
20
+ if (extra.environmentId)
21
+ headers.set("X-Paperclip-Environment-Id", extra.environmentId);
22
+ if (extra.runId)
23
+ headers.set("X-Paperclip-Run-Id", extra.runId);
24
+ if (extra.issueId)
25
+ headers.set("X-Paperclip-Issue-Id", extra.issueId);
26
+ return headers;
27
+ }
28
+ async function parseJson(response) {
29
+ const contentType = response.headers.get("content-type") ?? "";
30
+ if (!contentType.toLowerCase().includes("application/json")) {
31
+ return null;
32
+ }
33
+ return await response.json();
34
+ }
35
+ function encodeExecuteRequestBody(body, options) {
36
+ return JSON.stringify({
37
+ ...body,
38
+ streamOutput: typeof options?.onOutput === "function",
39
+ });
40
+ }
41
+ function parseExecuteTimeoutMs(body) {
42
+ if (typeof body !== "string")
43
+ return null;
44
+ try {
45
+ const parsed = JSON.parse(body);
46
+ const timeoutMs = Number(parsed.timeoutMs);
47
+ return Number.isFinite(timeoutMs) && timeoutMs > 0 ? Math.trunc(timeoutMs) : null;
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ export function resolveRequestTimeoutMs(config, path, init) {
54
+ if (!path.endsWith("/exec")) {
55
+ return config.bridgeRequestTimeoutMs;
56
+ }
57
+ const requestedTimeoutMs = parseExecuteTimeoutMs(init.body);
58
+ return requestedTimeoutMs === null
59
+ ? config.bridgeRequestTimeoutMs
60
+ : Math.max(config.bridgeRequestTimeoutMs, requestedTimeoutMs);
61
+ }
62
+ async function requestJson(config, path, init, extraHeaders = {}) {
63
+ const controller = new AbortController();
64
+ const requestTimeoutMs = resolveRequestTimeoutMs(config, path, init);
65
+ const timeout = setTimeout(() => controller.abort(), requestTimeoutMs);
66
+ const baseUrl = config.bridgeBaseUrl.replace(/\/+$/, "");
67
+ try {
68
+ const response = await fetch(`${baseUrl}${path}`, {
69
+ ...init,
70
+ headers: buildHeaders(config, extraHeaders),
71
+ signal: controller.signal,
72
+ });
73
+ const body = await parseJson(response);
74
+ if (!response.ok) {
75
+ const errorBody = isRecord(body) ? body : {};
76
+ throw new CloudflareBridgeError({
77
+ status: response.status,
78
+ code: typeof errorBody.error === "string" ? errorBody.error : null,
79
+ message: typeof errorBody.message === "string" && errorBody.message.trim().length > 0
80
+ ? errorBody.message
81
+ : `Cloudflare sandbox bridge request failed with HTTP ${response.status}.`,
82
+ details: errorBody.details,
83
+ });
84
+ }
85
+ return body;
86
+ }
87
+ catch (error) {
88
+ if (error instanceof CloudflareBridgeError)
89
+ throw error;
90
+ if (error?.name === "AbortError") {
91
+ throw new Error(`Cloudflare sandbox bridge request timed out after ${requestTimeoutMs}ms.`);
92
+ }
93
+ throw error;
94
+ }
95
+ finally {
96
+ clearTimeout(timeout);
97
+ }
98
+ }
99
+ async function requestResponse(config, path, init, extraHeaders = {}) {
100
+ const controller = new AbortController();
101
+ const requestTimeoutMs = resolveRequestTimeoutMs(config, path, init);
102
+ const timeout = setTimeout(() => controller.abort(), requestTimeoutMs);
103
+ const baseUrl = config.bridgeBaseUrl.replace(/\/+$/, "");
104
+ try {
105
+ const response = await fetch(`${baseUrl}${path}`, {
106
+ ...init,
107
+ headers: buildHeaders(config, extraHeaders),
108
+ signal: controller.signal,
109
+ });
110
+ if (!response.ok) {
111
+ const body = await parseJson(response);
112
+ const errorBody = isRecord(body) ? body : {};
113
+ throw new CloudflareBridgeError({
114
+ status: response.status,
115
+ code: typeof errorBody.error === "string" ? errorBody.error : null,
116
+ message: typeof errorBody.message === "string" && errorBody.message.trim().length > 0
117
+ ? errorBody.message
118
+ : `Cloudflare sandbox bridge request failed with HTTP ${response.status}.`,
119
+ details: errorBody.details,
120
+ });
121
+ }
122
+ return response;
123
+ }
124
+ catch (error) {
125
+ if (error instanceof CloudflareBridgeError)
126
+ throw error;
127
+ if (error?.name === "AbortError") {
128
+ throw new Error(`Cloudflare sandbox bridge request timed out after ${requestTimeoutMs}ms.`);
129
+ }
130
+ throw error;
131
+ }
132
+ finally {
133
+ clearTimeout(timeout);
134
+ }
135
+ }
136
+ function parseSseChunk(buffer) {
137
+ const normalized = buffer.replace(/\r\n/g, "\n");
138
+ const frames = normalized.split("\n\n");
139
+ const rest = frames.pop() ?? "";
140
+ const events = [];
141
+ for (const frame of frames) {
142
+ let event = "message";
143
+ const dataLines = [];
144
+ for (const line of frame.split("\n")) {
145
+ if (line.startsWith("event:")) {
146
+ event = line.slice("event:".length).trim() || "message";
147
+ continue;
148
+ }
149
+ if (line.startsWith("data:")) {
150
+ dataLines.push(line.slice("data:".length).trimStart());
151
+ }
152
+ }
153
+ events.push({
154
+ event,
155
+ data: dataLines.join("\n"),
156
+ });
157
+ }
158
+ return { events, rest };
159
+ }
160
+ async function consumeExecuteEventStream(response, options) {
161
+ if (!response.body) {
162
+ throw new Error("Cloudflare sandbox bridge streaming response had no body.");
163
+ }
164
+ const reader = response.body.getReader();
165
+ const decoder = new TextDecoder();
166
+ let buffer = "";
167
+ let result = null;
168
+ while (true) {
169
+ const { done, value } = await reader.read();
170
+ buffer += decoder.decode(value ?? new Uint8Array(), { stream: !done });
171
+ const parsed = parseSseChunk(done && buffer.length > 0 ? `${buffer}\n\n` : buffer);
172
+ buffer = parsed.rest;
173
+ for (const event of parsed.events) {
174
+ if (event.event === "stdout" || event.event === "stderr") {
175
+ const payload = JSON.parse(event.data);
176
+ const chunk = typeof payload.data === "string" ? payload.data : "";
177
+ if (chunk) {
178
+ await options.onOutput?.(event.event, chunk);
179
+ }
180
+ continue;
181
+ }
182
+ if (event.event === "complete") {
183
+ result = JSON.parse(event.data);
184
+ continue;
185
+ }
186
+ if (event.event === "error") {
187
+ const payload = JSON.parse(event.data);
188
+ const message = typeof payload.error === "string" && payload.error.trim().length > 0
189
+ ? payload.error
190
+ : "Cloudflare sandbox bridge streaming command failed.";
191
+ throw new Error(message);
192
+ }
193
+ }
194
+ if (done)
195
+ break;
196
+ }
197
+ if (result)
198
+ return result;
199
+ throw new Error("Cloudflare sandbox bridge streaming response ended without a completion event.");
200
+ }
201
+ export function createCloudflareBridgeClient(options) {
202
+ const { config } = options;
203
+ const apiPrefix = "/api/paperclip-sandbox/v1";
204
+ return {
205
+ health(extraHeaders) {
206
+ return requestJson(config, `${apiPrefix}/health`, { method: "GET" }, extraHeaders);
207
+ },
208
+ probe(body, extraHeaders) {
209
+ return requestJson(config, `${apiPrefix}/probe`, { method: "POST", body: JSON.stringify(body) }, extraHeaders);
210
+ },
211
+ acquireLease(body, extraHeaders) {
212
+ return requestJson(config, `${apiPrefix}/leases/acquire`, { method: "POST", body: JSON.stringify(body) }, extraHeaders);
213
+ },
214
+ resumeLease(body, extraHeaders) {
215
+ return requestJson(config, `${apiPrefix}/leases/resume`, { method: "POST", body: JSON.stringify(body) }, extraHeaders);
216
+ },
217
+ releaseLease(body, extraHeaders) {
218
+ return requestJson(config, `${apiPrefix}/leases/release`, { method: "POST", body: JSON.stringify(body) }, extraHeaders);
219
+ },
220
+ destroyLease(providerLeaseId, extraHeaders) {
221
+ return requestJson(config, `${apiPrefix}/leases/${encodeURIComponent(providerLeaseId)}`, { method: "DELETE" }, extraHeaders);
222
+ },
223
+ execute(body, extraHeaders, options) {
224
+ const encodedBody = encodeExecuteRequestBody(body, options);
225
+ if (typeof options?.onOutput === "function") {
226
+ return requestResponse(config, `${apiPrefix}/exec`, { method: "POST", body: encodedBody }, extraHeaders).then((response) => consumeExecuteEventStream(response, options));
227
+ }
228
+ return requestJson(config, `${apiPrefix}/exec`, { method: "POST", body: encodedBody }, extraHeaders);
229
+ },
230
+ };
231
+ }
232
+ //# sourceMappingURL=bridge-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-client.js","sourceRoot":"","sources":["../src/bridge-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CloudflareDriverConfig } from "./types.js";
2
+ export declare function parseCloudflareDriverConfig(raw: Record<string, unknown>): CloudflareDriverConfig;
3
+ export declare function validateCloudflareDriverConfig(config: CloudflareDriverConfig): string[];
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAyBzD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAehG;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,EAAE,CAyCvF"}
package/dist/config.js ADDED
@@ -0,0 +1,71 @@
1
+ const DEFAULT_REQUESTED_CWD = "/workspace/paperclip";
2
+ const DEFAULT_SLEEP_AFTER = "10m";
3
+ const DEFAULT_TIMEOUT_MS = 300_000;
4
+ const DEFAULT_BRIDGE_REQUEST_TIMEOUT_MS = 30_000;
5
+ const LOCALHOST_HOSTNAMES = new Set(["localhost", "127.0.0.1", "::1"]);
6
+ function readTrimmedString(value) {
7
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
8
+ }
9
+ function readBoolean(value, fallback) {
10
+ return value === undefined ? fallback : value === true;
11
+ }
12
+ function readInteger(value, fallback) {
13
+ const parsed = Number(value);
14
+ return Number.isFinite(parsed) ? Math.trunc(parsed) : fallback;
15
+ }
16
+ function isLocalBridgeHost(url) {
17
+ return LOCALHOST_HOSTNAMES.has(url.hostname);
18
+ }
19
+ export function parseCloudflareDriverConfig(raw) {
20
+ return {
21
+ bridgeBaseUrl: readTrimmedString(raw.bridgeBaseUrl) ?? "",
22
+ bridgeAuthToken: readTrimmedString(raw.bridgeAuthToken) ?? "",
23
+ reuseLease: readBoolean(raw.reuseLease, false),
24
+ keepAlive: readBoolean(raw.keepAlive, false),
25
+ sleepAfter: readTrimmedString(raw.sleepAfter) ?? DEFAULT_SLEEP_AFTER,
26
+ normalizeId: readBoolean(raw.normalizeId, true),
27
+ requestedCwd: readTrimmedString(raw.requestedCwd) ?? DEFAULT_REQUESTED_CWD,
28
+ sessionStrategy: raw.sessionStrategy === "default" ? "default" : "named",
29
+ sessionId: readTrimmedString(raw.sessionId) ?? "paperclip",
30
+ timeoutMs: readInteger(raw.timeoutMs, DEFAULT_TIMEOUT_MS),
31
+ bridgeRequestTimeoutMs: readInteger(raw.bridgeRequestTimeoutMs, DEFAULT_BRIDGE_REQUEST_TIMEOUT_MS),
32
+ previewHostname: readTrimmedString(raw.previewHostname),
33
+ };
34
+ }
35
+ export function validateCloudflareDriverConfig(config) {
36
+ const errors = [];
37
+ if (!config.bridgeBaseUrl) {
38
+ errors.push("Cloudflare sandbox environments require bridgeBaseUrl.");
39
+ }
40
+ else {
41
+ try {
42
+ const url = new URL(config.bridgeBaseUrl);
43
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && isLocalBridgeHost(url))) {
44
+ errors.push("bridgeBaseUrl must use HTTPS unless it points at localhost.");
45
+ }
46
+ }
47
+ catch {
48
+ errors.push("bridgeBaseUrl must be a valid URL.");
49
+ }
50
+ }
51
+ if (!config.bridgeAuthToken) {
52
+ errors.push("Cloudflare sandbox environments require bridgeAuthToken.");
53
+ }
54
+ if (config.reuseLease && !config.keepAlive) {
55
+ errors.push("reuseLease requires keepAlive for Cloudflare sandboxes.");
56
+ }
57
+ if (config.timeoutMs < 1 || config.timeoutMs > 86_400_000) {
58
+ errors.push("timeoutMs must be between 1 and 86400000.");
59
+ }
60
+ if (config.bridgeRequestTimeoutMs < 1 || config.bridgeRequestTimeoutMs > 86_400_000) {
61
+ errors.push("bridgeRequestTimeoutMs must be between 1 and 86400000.");
62
+ }
63
+ if (!config.requestedCwd.startsWith("/")) {
64
+ errors.push("requestedCwd must be an absolute POSIX path.");
65
+ }
66
+ if (config.sessionStrategy === "named" && config.sessionId.trim().length === 0) {
67
+ errors.push("sessionId is required when sessionStrategy is named.");
68
+ }
69
+ return errors;
70
+ }
71
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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,yBAyFf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,91 @@
1
+ const PLUGIN_ID = "paperclip.cloudflare-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: "Cloudflare Sandbox Provider",
8
+ description: "First-party sandbox provider plugin that provisions Cloudflare sandboxes through an operator-deployed Worker bridge.",
9
+ author: "Paperclip",
10
+ categories: ["automation"],
11
+ capabilities: ["environment.drivers.register"],
12
+ entrypoints: {
13
+ worker: "./dist/worker.js",
14
+ },
15
+ environmentDrivers: [
16
+ {
17
+ driverKey: "cloudflare",
18
+ kind: "sandbox_provider",
19
+ displayName: "Cloudflare Sandbox",
20
+ description: "Runs Paperclip sandbox environments through a Cloudflare Worker bridge backed by the Sandbox SDK and Durable Objects.",
21
+ configSchema: {
22
+ type: "object",
23
+ properties: {
24
+ bridgeBaseUrl: {
25
+ type: "string",
26
+ format: "uri",
27
+ description: "Base URL of the operator-deployed Cloudflare Worker bridge.",
28
+ },
29
+ bridgeAuthToken: {
30
+ type: "string",
31
+ format: "secret-ref",
32
+ description: "Bearer token used by the provider plugin when calling the Cloudflare bridge. Pasted values are stored as company secrets.",
33
+ },
34
+ reuseLease: {
35
+ type: "boolean",
36
+ default: false,
37
+ description: "Reuse a sandbox by environment ID instead of creating one per run.",
38
+ },
39
+ keepAlive: {
40
+ type: "boolean",
41
+ default: false,
42
+ description: "Prevent Cloudflare from idling the container between requests.",
43
+ },
44
+ sleepAfter: {
45
+ type: "string",
46
+ default: "10m",
47
+ description: "Idle timeout passed to getSandbox(). Ignored when keepAlive is true.",
48
+ },
49
+ normalizeId: {
50
+ type: "boolean",
51
+ default: true,
52
+ description: "Lowercase and normalize sandbox IDs for operator-friendly naming.",
53
+ },
54
+ requestedCwd: {
55
+ type: "string",
56
+ default: "/workspace/paperclip",
57
+ description: "Workspace directory to create inside the sandbox lease.",
58
+ },
59
+ sessionStrategy: {
60
+ type: "string",
61
+ enum: ["named", "default"],
62
+ default: "named",
63
+ description: "Whether to run commands in a stable named session or the default session.",
64
+ },
65
+ sessionId: {
66
+ type: "string",
67
+ default: "paperclip",
68
+ description: "Named Cloudflare session ID used when sessionStrategy is named.",
69
+ },
70
+ timeoutMs: {
71
+ type: "number",
72
+ default: 300000,
73
+ description: "Default per-command timeout passed through to the bridge.",
74
+ },
75
+ bridgeRequestTimeoutMs: {
76
+ type: "number",
77
+ default: 30000,
78
+ description: "HTTP timeout for plugin-to-bridge requests.",
79
+ },
80
+ previewHostname: {
81
+ type: "string",
82
+ description: "Optional hostname reserved for future preview URL support.",
83
+ },
84
+ },
85
+ required: ["bridgeBaseUrl", "bridgeAuthToken"],
86
+ },
87
+ },
88
+ ],
89
+ };
90
+ export default manifest;
91
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,uCAAuC,CAAC;AAC1D,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,6BAA6B;IAC1C,WAAW,EACT,sHAAsH;IACxH,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,YAAY;YACvB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,oBAAoB;YACjC,WAAW,EACT,uHAAuH;YACzH,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,aAAa,EAAE;wBACb,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,KAAK;wBACb,WAAW,EAAE,6DAA6D;qBAC3E;oBACD,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,YAAY;wBACpB,WAAW,EACT,2HAA2H;qBAC9H;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,oEAAoE;qBAClF;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,gEAAgE;qBAC9E;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,sEAAsE;qBACpF;oBACD,WAAW,EAAE;wBACX,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI;wBACb,WAAW,EAAE,mEAAmE;qBACjF;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,sBAAsB;wBAC/B,WAAW,EAAE,yDAAyD;qBACvE;oBACD,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;wBAC1B,OAAO,EAAE,OAAO;wBAChB,WAAW,EAAE,2EAA2E;qBACzF;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,WAAW;wBACpB,WAAW,EAAE,iEAAiE;qBAC/E;oBACD,SAAS,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,MAAM;wBACf,WAAW,EAAE,2DAA2D;qBACzE;oBACD,sBAAsB,EAAE;wBACtB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,KAAK;wBACd,WAAW,EAAE,6CAA6C;qBAC3D;oBACD,eAAe,EAAE;wBACf,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4DAA4D;qBAC1E;iBACF;gBACD,QAAQ,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC;aAC/C;SACF;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -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":"AAkIA,QAAA,MAAM,MAAM,mDA0NV,CAAC;AAEH,eAAe,MAAM,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,267 @@
1
+ import { definePlugin } from "@paperclipai/plugin-sdk";
2
+ import { CloudflareBridgeError, createCloudflareBridgeClient } from "./bridge-client.js";
3
+ import { parseCloudflareDriverConfig, validateCloudflareDriverConfig, } from "./config.js";
4
+ const SANDBOX_EXEC_CHANNEL_ENV = "PAPERCLIP_SANDBOX_EXEC_CHANNEL";
5
+ const SANDBOX_EXEC_CHANNEL_BRIDGE = "bridge";
6
+ const CLOUDFLARE_EXEC_STDOUT_PREFIX = "[cloudflare exec stdout]";
7
+ const CLOUDFLARE_EXEC_STDERR_PREFIX = "[cloudflare exec stderr]";
8
+ function isLostLeaseError(error) {
9
+ return error instanceof CloudflareBridgeError && (error.status === 404 || error.status === 409);
10
+ }
11
+ function bridgeClientFor(rawConfig) {
12
+ const config = parseCloudflareDriverConfig(rawConfig);
13
+ return {
14
+ config,
15
+ client: createCloudflareBridgeClient({ config }),
16
+ };
17
+ }
18
+ function lostLeaseExecuteResult(error) {
19
+ return {
20
+ exitCode: 1,
21
+ timedOut: false,
22
+ signal: null,
23
+ stdout: "",
24
+ stderr: error.message.trim().length > 0
25
+ ? `${error.message}\n`
26
+ : "Cloudflare sandbox lease is no longer available.\n",
27
+ };
28
+ }
29
+ function readIssueId(value) {
30
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
31
+ }
32
+ function resolveWorkspaceIssueId(params) {
33
+ const directIssueId = readIssueId(params.issueId);
34
+ if (directIssueId)
35
+ return directIssueId;
36
+ const request = params.workspace.metadata?.workspaceRealizationRequest;
37
+ if (!request || typeof request !== "object" || Array.isArray(request))
38
+ return null;
39
+ return readIssueId(request.issueId);
40
+ }
41
+ function wrapWorkspacePreparationError(remoteCwd, error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ return new Error(`Failed to prepare Cloudflare sandbox workspace at ${remoteCwd}: ${message}`);
44
+ }
45
+ function resolveRemoteCwd(config, params) {
46
+ const leaseRemoteCwd = typeof params.lease.metadata?.remoteCwd === "string" && params.lease.metadata.remoteCwd.trim().length > 0
47
+ ? params.lease.metadata.remoteCwd.trim()
48
+ : null;
49
+ return leaseRemoteCwd ?? params.workspace.remotePath ?? params.workspace.localPath ?? config.requestedCwd;
50
+ }
51
+ function resolveExecuteSession(config, env) {
52
+ if (env?.[SANDBOX_EXEC_CHANNEL_ENV] !== SANDBOX_EXEC_CHANNEL_BRIDGE) {
53
+ return {
54
+ sessionStrategy: config.sessionStrategy,
55
+ sessionId: config.sessionId,
56
+ };
57
+ }
58
+ const baseSessionId = config.sessionId.trim().length > 0 ? config.sessionId : "paperclip";
59
+ return {
60
+ sessionStrategy: "named",
61
+ sessionId: `${baseSessionId}-bridge`,
62
+ };
63
+ }
64
+ function sanitizeExecuteEnv(env) {
65
+ if (!env || !(SANDBOX_EXEC_CHANNEL_ENV in env)) {
66
+ return env;
67
+ }
68
+ const nextEnv = { ...env };
69
+ delete nextEnv[SANDBOX_EXEC_CHANNEL_ENV];
70
+ return nextEnv;
71
+ }
72
+ function logCloudflareExecChunk(logger, stream, chunk) {
73
+ if (!logger || chunk.length === 0)
74
+ return;
75
+ const lines = chunk
76
+ .replace(/\r\n/g, "\n")
77
+ .split("\n")
78
+ .filter((line) => line.trim().length > 0);
79
+ for (const line of lines) {
80
+ if (stream === "stderr") {
81
+ logger.warn(`${CLOUDFLARE_EXEC_STDERR_PREFIX} ${line}`);
82
+ }
83
+ else {
84
+ logger.info(`${CLOUDFLARE_EXEC_STDOUT_PREFIX} ${line}`);
85
+ }
86
+ }
87
+ }
88
+ let pluginLogger = null;
89
+ const plugin = definePlugin({
90
+ async setup(ctx) {
91
+ pluginLogger = ctx.logger;
92
+ ctx.logger.info("Cloudflare sandbox provider plugin ready");
93
+ },
94
+ async onHealth() {
95
+ return { status: "ok", message: "Cloudflare sandbox provider plugin healthy" };
96
+ },
97
+ async onEnvironmentValidateConfig(params) {
98
+ const config = parseCloudflareDriverConfig(params.config);
99
+ const errors = validateCloudflareDriverConfig(config);
100
+ if (errors.length > 0) {
101
+ return { ok: false, errors };
102
+ }
103
+ return {
104
+ ok: true,
105
+ normalizedConfig: { ...config },
106
+ };
107
+ },
108
+ async onEnvironmentProbe(params) {
109
+ const { config, client } = bridgeClientFor(params.config);
110
+ try {
111
+ const result = await client.probe({
112
+ requestedCwd: config.requestedCwd,
113
+ keepAlive: config.keepAlive,
114
+ sleepAfter: config.sleepAfter,
115
+ normalizeId: config.normalizeId,
116
+ sessionStrategy: config.sessionStrategy,
117
+ sessionId: config.sessionId,
118
+ timeoutMs: config.timeoutMs,
119
+ }, { environmentId: params.environmentId, issueId: params.issueId });
120
+ return result;
121
+ }
122
+ catch (error) {
123
+ const message = error instanceof Error ? error.message : String(error);
124
+ return {
125
+ ok: false,
126
+ summary: "Cloudflare sandbox bridge probe failed.",
127
+ metadata: {
128
+ provider: "cloudflare",
129
+ error: message,
130
+ },
131
+ };
132
+ }
133
+ },
134
+ async onEnvironmentAcquireLease(params) {
135
+ const { config, client } = bridgeClientFor(params.config);
136
+ return await client.acquireLease({
137
+ environmentId: params.environmentId,
138
+ runId: params.runId,
139
+ issueId: params.issueId,
140
+ reuseLease: config.reuseLease,
141
+ keepAlive: config.keepAlive,
142
+ sleepAfter: config.sleepAfter,
143
+ normalizeId: config.normalizeId,
144
+ requestedCwd: params.requestedCwd?.trim() || config.requestedCwd,
145
+ sessionStrategy: config.sessionStrategy,
146
+ sessionId: config.sessionId,
147
+ timeoutMs: config.timeoutMs,
148
+ }, { environmentId: params.environmentId, runId: params.runId, issueId: params.issueId });
149
+ },
150
+ async onEnvironmentResumeLease(params) {
151
+ const { config, client } = bridgeClientFor(params.config);
152
+ try {
153
+ return await client.resumeLease({
154
+ providerLeaseId: params.providerLeaseId,
155
+ requestedCwd: typeof params.leaseMetadata?.remoteCwd === "string" && params.leaseMetadata.remoteCwd.trim().length > 0
156
+ ? params.leaseMetadata.remoteCwd.trim()
157
+ : config.requestedCwd,
158
+ sessionStrategy: config.sessionStrategy,
159
+ sessionId: config.sessionId,
160
+ keepAlive: config.keepAlive,
161
+ sleepAfter: config.sleepAfter,
162
+ normalizeId: config.normalizeId,
163
+ timeoutMs: config.timeoutMs,
164
+ }, { environmentId: params.environmentId, issueId: params.issueId });
165
+ }
166
+ catch (error) {
167
+ if (isLostLeaseError(error)) {
168
+ return {
169
+ providerLeaseId: null,
170
+ metadata: {
171
+ provider: "cloudflare",
172
+ expired: true,
173
+ },
174
+ };
175
+ }
176
+ throw error;
177
+ }
178
+ },
179
+ async onEnvironmentReleaseLease(params) {
180
+ if (!params.providerLeaseId)
181
+ return;
182
+ const { config, client } = bridgeClientFor(params.config);
183
+ await client.releaseLease({
184
+ providerLeaseId: params.providerLeaseId,
185
+ reuseLease: config.reuseLease,
186
+ keepAlive: config.keepAlive,
187
+ }, { environmentId: params.environmentId, issueId: params.issueId });
188
+ },
189
+ async onEnvironmentDestroyLease(params) {
190
+ if (!params.providerLeaseId)
191
+ return;
192
+ const { client } = bridgeClientFor(params.config);
193
+ await client.destroyLease(params.providerLeaseId, {
194
+ environmentId: params.environmentId,
195
+ issueId: params.issueId,
196
+ });
197
+ },
198
+ async onEnvironmentRealizeWorkspace(params) {
199
+ const { config, client } = bridgeClientFor(params.config);
200
+ const remoteCwd = resolveRemoteCwd(config, params);
201
+ const issueId = resolveWorkspaceIssueId(params);
202
+ if (params.lease.providerLeaseId) {
203
+ try {
204
+ await client.execute({
205
+ providerLeaseId: params.lease.providerLeaseId,
206
+ command: "mkdir",
207
+ args: ["-p", remoteCwd],
208
+ cwd: "/",
209
+ timeoutMs: config.timeoutMs,
210
+ sessionStrategy: config.sessionStrategy,
211
+ sessionId: config.sessionId,
212
+ }, { environmentId: params.environmentId, issueId });
213
+ }
214
+ catch (error) {
215
+ throw wrapWorkspacePreparationError(remoteCwd, error);
216
+ }
217
+ }
218
+ return {
219
+ cwd: remoteCwd,
220
+ metadata: {
221
+ provider: "cloudflare",
222
+ remoteCwd,
223
+ },
224
+ };
225
+ },
226
+ async onEnvironmentExecute(params) {
227
+ if (!params.lease.providerLeaseId) {
228
+ return {
229
+ exitCode: 1,
230
+ timedOut: false,
231
+ signal: null,
232
+ stdout: "",
233
+ stderr: "No provider lease ID available for execution.\n",
234
+ };
235
+ }
236
+ const { config, client } = bridgeClientFor(params.config);
237
+ const session = resolveExecuteSession(config, params.env);
238
+ try {
239
+ const streamingOptions = pluginLogger
240
+ ? {
241
+ onOutput: async (stream, chunk) => {
242
+ logCloudflareExecChunk(pluginLogger, stream, chunk);
243
+ },
244
+ }
245
+ : undefined;
246
+ return await client.execute({
247
+ providerLeaseId: params.lease.providerLeaseId,
248
+ command: params.command,
249
+ args: params.args,
250
+ cwd: params.cwd,
251
+ env: sanitizeExecuteEnv(params.env),
252
+ stdin: params.stdin ?? null,
253
+ timeoutMs: params.timeoutMs ?? config.timeoutMs,
254
+ sessionStrategy: session.sessionStrategy,
255
+ sessionId: session.sessionId,
256
+ }, { environmentId: params.environmentId, issueId: params.issueId }, streamingOptions);
257
+ }
258
+ catch (error) {
259
+ if (error instanceof CloudflareBridgeError && isLostLeaseError(error)) {
260
+ return lostLeaseExecuteResult(error);
261
+ }
262
+ throw error;
263
+ }
264
+ },
265
+ });
266
+ export default plugin;
267
+ //# 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,91 @@
1
+ export interface CloudflareDriverConfig {
2
+ bridgeBaseUrl: string;
3
+ bridgeAuthToken: string;
4
+ reuseLease: boolean;
5
+ keepAlive: boolean;
6
+ sleepAfter: string;
7
+ normalizeId: boolean;
8
+ requestedCwd: string;
9
+ sessionStrategy: "named" | "default";
10
+ sessionId: string;
11
+ timeoutMs: number;
12
+ bridgeRequestTimeoutMs: number;
13
+ previewHostname: string | null;
14
+ }
15
+ export interface CloudflareBridgeHealthResponse {
16
+ ok: boolean;
17
+ provider: "cloudflare";
18
+ bridgeVersion: string;
19
+ capabilities: {
20
+ reuseLease: boolean;
21
+ namedSessions: boolean;
22
+ previewUrls: boolean;
23
+ };
24
+ }
25
+ export interface CloudflareBridgeProbeRequest {
26
+ requestedCwd: string;
27
+ keepAlive: boolean;
28
+ sleepAfter: string;
29
+ normalizeId: boolean;
30
+ sessionStrategy: CloudflareDriverConfig["sessionStrategy"];
31
+ sessionId: string;
32
+ timeoutMs: number;
33
+ }
34
+ export interface CloudflareBridgeProbeResponse {
35
+ ok: boolean;
36
+ summary: string;
37
+ metadata?: Record<string, unknown>;
38
+ }
39
+ export interface CloudflareBridgeAcquireLeaseRequest {
40
+ environmentId: string;
41
+ runId: string;
42
+ issueId?: string | null;
43
+ reuseLease: boolean;
44
+ keepAlive: boolean;
45
+ sleepAfter: string;
46
+ normalizeId: boolean;
47
+ requestedCwd: string;
48
+ sessionStrategy: CloudflareDriverConfig["sessionStrategy"];
49
+ sessionId: string;
50
+ timeoutMs: number;
51
+ }
52
+ export interface CloudflareBridgeResumeLeaseRequest {
53
+ providerLeaseId: string;
54
+ requestedCwd: string;
55
+ sessionStrategy: CloudflareDriverConfig["sessionStrategy"];
56
+ sessionId: string;
57
+ keepAlive: boolean;
58
+ sleepAfter: string;
59
+ normalizeId: boolean;
60
+ timeoutMs: number;
61
+ }
62
+ export interface CloudflareBridgeReleaseLeaseRequest {
63
+ providerLeaseId: string;
64
+ reuseLease: boolean;
65
+ keepAlive: boolean;
66
+ }
67
+ export interface CloudflareBridgeLeaseResponse {
68
+ providerLeaseId: string;
69
+ metadata?: Record<string, unknown>;
70
+ }
71
+ export interface CloudflareBridgeExecuteRequest {
72
+ providerLeaseId: string;
73
+ command: string;
74
+ args?: string[];
75
+ cwd?: string;
76
+ env?: Record<string, string>;
77
+ stdin?: string | null;
78
+ timeoutMs?: number;
79
+ streamOutput?: boolean;
80
+ sessionStrategy: CloudflareDriverConfig["sessionStrategy"];
81
+ sessionId: string;
82
+ }
83
+ export interface CloudflareBridgeExecuteResponse {
84
+ exitCode: number | null;
85
+ signal?: string | null;
86
+ timedOut: boolean;
87
+ stdout: string;
88
+ stderr: string;
89
+ metadata?: Record<string, unknown>;
90
+ }
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,YAAY,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE;QACZ,UAAU,EAAE,OAAO,CAAC;QACpB,aAAa,EAAE,OAAO,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mCAAmC;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kCAAkC;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mCAAmC;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,8BAA8B;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -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-cloudflare-sandbox",
3
- "version": "0.1.0",
3
+ "version": "2026.511.0-canary.9",
4
4
  "description": "Cloudflare 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
  "cloudflare"
48
40
  ],
49
41
  "dependencies": {
50
- "@paperclipai/plugin-sdk": "1.0.0"
42
+ "@paperclipai/plugin-sdk": "2026.511.0-canary.9"
51
43
  }
52
- }
44
+ }