@evermore.work/plugin-cloudflare-sandbox 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.
Files changed (47) hide show
  1. package/README.md +48 -0
  2. package/bridge-template/Dockerfile +14 -0
  3. package/bridge-template/README.md +50 -0
  4. package/bridge-template/package.json +21 -0
  5. package/bridge-template/src/auth.test.ts +30 -0
  6. package/bridge-template/src/auth.ts +40 -0
  7. package/bridge-template/src/exec.test.ts +151 -0
  8. package/bridge-template/src/exec.ts +147 -0
  9. package/bridge-template/src/helpers.ts +39 -0
  10. package/bridge-template/src/index.ts +25 -0
  11. package/bridge-template/src/routes.test.ts +143 -0
  12. package/bridge-template/src/routes.ts +468 -0
  13. package/bridge-template/src/sandboxes.test.ts +32 -0
  14. package/bridge-template/src/sandboxes.ts +57 -0
  15. package/bridge-template/src/sessions.ts +84 -0
  16. package/bridge-template/tsconfig.json +11 -0
  17. package/bridge-template/vitest.config.ts +8 -0
  18. package/bridge-template/wrangler.jsonc +28 -0
  19. package/dist/bridge-client.d.ts +39 -0
  20. package/dist/bridge-client.d.ts.map +1 -0
  21. package/dist/bridge-client.js +232 -0
  22. package/dist/bridge-client.js.map +1 -0
  23. package/dist/config.d.ts +4 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +71 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest.d.ts +4 -0
  32. package/dist/manifest.d.ts.map +1 -0
  33. package/dist/manifest.js +91 -0
  34. package/dist/manifest.js.map +1 -0
  35. package/dist/plugin.d.ts +3 -0
  36. package/dist/plugin.d.ts.map +1 -0
  37. package/dist/plugin.js +267 -0
  38. package/dist/plugin.js.map +1 -0
  39. package/dist/types.d.ts +91 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/worker.d.ts +3 -0
  44. package/dist/worker.d.ts.map +1 -0
  45. package/dist/worker.js +5 -0
  46. package/dist/worker.js.map +1 -0
  47. package/package.json +51 -0
package/dist/plugin.js ADDED
@@ -0,0 +1,267 @@
1
+ import { definePlugin } from "@evermore.work/plugin-sdk";
2
+ import { CloudflareBridgeError, createCloudflareBridgeClient } from "./bridge-client.js";
3
+ import { parseCloudflareDriverConfig, validateCloudflareDriverConfig, } from "./config.js";
4
+ const SANDBOX_EXEC_CHANNEL_ENV = "EVERMORE_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 : "evermore";
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":"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"}
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 "@evermore.work/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,2BAA2B,CAAC;AACtD,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": "@evermore.work/plugin-cloudflare-sandbox",
3
+ "version": "0.1.0",
4
+ "description": "Cloudflare sandbox provider plugin for Evermore environments",
5
+ "homepage": "https://github.com/phuctm97/evermore",
6
+ "bugs": {
7
+ "url": "https://github.com/phuctm97/evermore/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/phuctm97/evermore",
12
+ "directory": "packages/plugins/sandbox-providers/cloudflare"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ }
20
+ },
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "main": "./dist/index.js",
32
+ "types": "./dist/index.d.ts"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "bridge-template"
37
+ ],
38
+ "evermorePlugin": {
39
+ "manifest": "./dist/manifest.js",
40
+ "worker": "./dist/worker.js"
41
+ },
42
+ "keywords": [
43
+ "evermore",
44
+ "plugin",
45
+ "sandbox",
46
+ "cloudflare"
47
+ ],
48
+ "dependencies": {
49
+ "@evermore.work/plugin-sdk": "1.0.0"
50
+ }
51
+ }