@codeworksh/harness 0.1.0-dev.20261007133219 → 0.2.0-canary.10.1.g462f34f6

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.
@@ -44,6 +44,7 @@ declare const CreateConfig: Schema.Struct<{
44
44
  type CreateConfig = typeof CreateConfig.Type;
45
45
  declare const RuntimeConfig: Schema.Struct<{
46
46
  readonly defaultCwd: Schema.brand<Schema.String, "SandboxDriver.AbsolutePath">;
47
+ readonly spillPath: Schema.optional<Schema.brand<Schema.String, "SandboxDriver.AbsolutePath">>;
47
48
  readonly execTimeout: Schema.optional<Schema.Finite>;
48
49
  }>;
49
50
  type RuntimeConfig = typeof RuntimeConfig.Type;
@@ -78,4 +79,4 @@ declare const config: (value: CreateConfig) => {
78
79
  };
79
80
  //#endregion
80
81
  export { Source as a, sandbox as c, RuntimeConfig as i, CreateConfig as n, config as o, Options as r, make as s, ClientOptions as t };
81
- //# sourceMappingURL=index-DIP2u0Pr.d.mts.map
82
+ //# sourceMappingURL=index-BEZ8eL--.d.mts.map
@@ -39,6 +39,7 @@ declare const CreateConfig: Schema.Struct<{
39
39
  type CreateConfig = typeof CreateConfig.Type;
40
40
  declare const RuntimeConfig: Schema.Struct<{
41
41
  readonly defaultCwd: Schema.brand<Schema.String, "SandboxDriver.AbsolutePath">;
42
+ readonly spillPath: Schema.optional<Schema.brand<Schema.String, "SandboxDriver.AbsolutePath">>;
42
43
  readonly user: Schema.optional<Schema.String>;
43
44
  readonly execTimeout: Schema.optional<Schema.Finite>;
44
45
  }>;
@@ -72,4 +73,4 @@ declare const config: (value: CreateConfig) => {
72
73
  };
73
74
  //#endregion
74
75
  export { RuntimeConfig as a, sandbox as c, ResourcesConfig as i, CreateConfig as n, config as o, Options as r, make as s, ClientOptions as t };
75
- //# sourceMappingURL=index-DjPzwUHF.d.mts.map
76
+ //# sourceMappingURL=index-BlvIgEtU.d.mts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codeworksh/harness",
3
- "version": "0.1.0-dev.20261007133219",
3
+ "version": "0.2.0-canary.10.1.g462f34f6",
4
4
  "description": "AI agent harness — agent loop, tools, plugins, sandbox, and more.",
5
5
  "keywords": [
6
6
  "agent",
@@ -66,13 +66,15 @@
66
66
  "node": ">=24.14.1"
67
67
  },
68
68
  "dependencies": {
69
- "@codeworksh/aikit": "^0.10.0-dev.20261007132549",
70
- "@codeworksh/plugin": "0.0.1-dev.20260925150557",
69
+ "@codeworksh/aikit": "0.11.0-canary.10.1.g462f34f6",
70
+ "@codeworksh/plugin": "0.2.0-canary.10.1.g462f34f6",
71
71
  "@effect/platform-node": "4.0.1",
72
72
  "@effect/sql-sqlite-node": "4.0.1",
73
73
  "@npmcli/arborist": "^10.0.2",
74
74
  "@npmcli/config": "^11.0.1",
75
75
  "@platformatic/vfs": "^0.4.0",
76
+ "@silvia-odwyer/photon-node": "0.3.4",
77
+ "diff": "9.0.0",
76
78
  "jsonc-parser": "3.3.1",
77
79
  "just-bash": "^3.4.2",
78
80
  "npm-package-arg": "^14.0.0",
@@ -0,0 +1,263 @@
1
+ import { Effect, Schema } from "effect";
2
+ import { Worker } from "node:worker_threads";
3
+ //#region src/tool/image/exif.ts
4
+ /**
5
+ * EXIF orientation for JPEG and WebP. Photon decodes pixels as stored, so a phone
6
+ * photo taken sideways would reach the model sideways without this.
7
+ */
8
+ const readOrientationFromTiff = (bytes, tiffStart) => {
9
+ if (tiffStart + 8 > bytes.length) return 1;
10
+ const le = (byte(bytes, tiffStart) << 8 | byte(bytes, tiffStart + 1)) === 18761;
11
+ const read16 = (pos) => le ? byte(bytes, pos) | byte(bytes, pos + 1) << 8 : byte(bytes, pos) << 8 | byte(bytes, pos + 1);
12
+ const read32 = (pos) => le ? (byte(bytes, pos) | byte(bytes, pos + 1) << 8 | byte(bytes, pos + 2) << 16 | byte(bytes, pos + 3) << 24) >>> 0 : (byte(bytes, pos) << 24 | byte(bytes, pos + 1) << 16 | byte(bytes, pos + 2) << 8 | byte(bytes, pos + 3)) >>> 0;
13
+ const ifdStart = tiffStart + read32(tiffStart + 4);
14
+ if (ifdStart + 2 > bytes.length) return 1;
15
+ const entryCount = read16(ifdStart);
16
+ for (let index = 0; index < entryCount; index++) {
17
+ const entryPos = ifdStart + 2 + index * 12;
18
+ if (entryPos + 12 > bytes.length) return 1;
19
+ if (read16(entryPos) === 274) {
20
+ const value = read16(entryPos + 8);
21
+ return value >= 1 && value <= 8 ? value : 1;
22
+ }
23
+ }
24
+ return 1;
25
+ };
26
+ const findJpegTiffOffset = (bytes) => {
27
+ let offset = 2;
28
+ while (offset < bytes.length - 1) {
29
+ if (bytes[offset] !== 255) return -1;
30
+ const marker = bytes[offset + 1];
31
+ if (marker === 255) {
32
+ offset++;
33
+ continue;
34
+ }
35
+ if (marker === 225) {
36
+ const segmentStart = offset + 4;
37
+ if (segmentStart + 6 > bytes.length) return -1;
38
+ if (hasExifHeader(bytes, segmentStart)) return segmentStart + 6;
39
+ }
40
+ if (offset + 4 > bytes.length) return -1;
41
+ offset += 2 + (byte(bytes, offset + 2) << 8 | byte(bytes, offset + 3));
42
+ }
43
+ return -1;
44
+ };
45
+ const findWebpTiffOffset = (bytes) => {
46
+ let offset = 12;
47
+ while (offset + 8 <= bytes.length) {
48
+ const chunkId = String.fromCharCode(...bytes.subarray(offset, offset + 4));
49
+ const chunkSize = byte(bytes, offset + 4) | byte(bytes, offset + 5) << 8 | byte(bytes, offset + 6) << 16 | byte(bytes, offset + 7) << 24;
50
+ const dataStart = offset + 8;
51
+ if (chunkId === "EXIF") {
52
+ if (dataStart + chunkSize > bytes.length) return -1;
53
+ return chunkSize >= 6 && hasExifHeader(bytes, dataStart) ? dataStart + 6 : dataStart;
54
+ }
55
+ offset = dataStart + chunkSize + chunkSize % 2;
56
+ }
57
+ return -1;
58
+ };
59
+ const hasExifHeader = (bytes, offset) => [
60
+ 69,
61
+ 120,
62
+ 105,
63
+ 102,
64
+ 0,
65
+ 0
66
+ ].every((value, index) => bytes[offset + index] === value);
67
+ const orientationOf = (bytes) => {
68
+ let tiffOffset = -1;
69
+ if (bytes[0] === 255 && bytes[1] === 216) tiffOffset = findJpegTiffOffset(bytes);
70
+ else if (String.fromCharCode(...bytes.subarray(0, 4)) === "RIFF" && String.fromCharCode(...bytes.subarray(8, 12)) === "WEBP") tiffOffset = findWebpTiffOffset(bytes);
71
+ return tiffOffset === -1 ? 1 : readOrientationFromTiff(bytes, tiffOffset);
72
+ };
73
+ const byte = (bytes, index) => bytes[index] ?? 0;
74
+ const rotate90 = (photon, image, dstIndex) => {
75
+ const w = image.get_width();
76
+ const h = image.get_height();
77
+ const src = image.get_raw_pixels();
78
+ const dst = new Uint8Array(src.length);
79
+ for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) dst.set(src.subarray((y * w + x) * 4, (y * w + x) * 4 + 4), dstIndex(x, y, w, h) * 4);
80
+ return new photon.PhotonImage(dst, h, w);
81
+ };
82
+ const clockwise = (x, y, _w, h) => x * h + (h - 1 - y);
83
+ const counterClockwise = (x, y, w, h) => (w - 1 - x) * h + y;
84
+ /** Flips mutate `image`; rotations return a new image, which the caller frees alongside the old one. */
85
+ const applyOrientation = (photon, image, originalBytes) => {
86
+ switch (orientationOf(originalBytes)) {
87
+ case 2:
88
+ photon.fliph(image);
89
+ return image;
90
+ case 3:
91
+ photon.fliph(image);
92
+ photon.flipv(image);
93
+ return image;
94
+ case 4:
95
+ photon.flipv(image);
96
+ return image;
97
+ case 5: {
98
+ const rotated = rotate90(photon, image, clockwise);
99
+ photon.fliph(rotated);
100
+ return rotated;
101
+ }
102
+ case 6: return rotate90(photon, image, clockwise);
103
+ case 7: {
104
+ const rotated = rotate90(photon, image, counterClockwise);
105
+ photon.fliph(rotated);
106
+ return rotated;
107
+ }
108
+ case 8: return rotate90(photon, image, counterClockwise);
109
+ default: return image;
110
+ }
111
+ };
112
+ //#endregion
113
+ //#region src/tool/image/photon.ts
114
+ let loading;
115
+ /** Photon, loaded once on first use; `undefined` when its WASM cannot load, so images degrade instead of failing reads. */
116
+ const load = Effect.promise(() => {
117
+ loading ??= import("@silvia-odwyer/photon-node").then((module) => module, () => void 0);
118
+ return loading;
119
+ });
120
+ /** Decode with EXIF orientation applied. The caller frees the result. */
121
+ const decode = (photon, bytes) => {
122
+ const raw = photon.PhotonImage.new_from_byteslice(bytes);
123
+ const oriented = applyOrientation(photon, raw, bytes);
124
+ if (oriented !== raw) raw.free();
125
+ return oriented;
126
+ };
127
+ //#endregion
128
+ //#region src/tool/image/resize.ts
129
+ const defaults = {
130
+ maxWidth: 2e3,
131
+ maxHeight: 2e3,
132
+ maxBytes: 4718592,
133
+ jpegQuality: 80
134
+ };
135
+ /** Tags worker replies: Node posts its own messages on the worker channel too (e.g. under `--watch`). */
136
+ const REPLY = "codework:photon-image-resize";
137
+ const base64 = (bytes) => {
138
+ const data = Buffer.from(bytes).toString("base64");
139
+ return {
140
+ data,
141
+ size: data.length
142
+ };
143
+ };
144
+ /**
145
+ * Fit an image within the dimensions and encoded size, in this thread. `null`
146
+ * when Photon is unavailable or nothing fits. Fits by: scaling to the max
147
+ * dimensions, keeping the smaller of PNG and JPEG, lowering JPEG quality, then
148
+ * shrinking by a quarter at a time down to 1x1.
149
+ */
150
+ const resizeInProcess = (input, mimeType, options = defaults) => Effect.map(load, (photon) => {
151
+ if (photon === void 0) return null;
152
+ let image;
153
+ try {
154
+ image = decode(photon, input);
155
+ const originalWidth = image.get_width();
156
+ const originalHeight = image.get_height();
157
+ const inputSize = Math.ceil(input.byteLength / 3) * 4;
158
+ if (originalWidth <= options.maxWidth && originalHeight <= options.maxHeight && inputSize < options.maxBytes) return {
159
+ data: Buffer.from(input).toString("base64"),
160
+ mimeType,
161
+ originalWidth,
162
+ originalHeight,
163
+ width: originalWidth,
164
+ height: originalHeight,
165
+ wasResized: false
166
+ };
167
+ let width = originalWidth;
168
+ let height = originalHeight;
169
+ if (width > options.maxWidth) {
170
+ height = Math.max(1, Math.round(height * options.maxWidth / width));
171
+ width = options.maxWidth;
172
+ }
173
+ if (height > options.maxHeight) {
174
+ width = Math.max(1, Math.round(width * options.maxHeight / height));
175
+ height = options.maxHeight;
176
+ }
177
+ const qualities = [.../* @__PURE__ */ new Set([
178
+ options.jpegQuality,
179
+ 85,
180
+ 70,
181
+ 55,
182
+ 40
183
+ ])];
184
+ while (true) {
185
+ const resized = photon.resize(image, width, height, photon.SamplingFilter.Lanczos3);
186
+ try {
187
+ const fit = [{
188
+ ...base64(resized.get_bytes()),
189
+ mimeType: "image/png"
190
+ }, ...qualities.map((quality) => ({
191
+ ...base64(resized.get_bytes_jpeg(quality)),
192
+ mimeType: "image/jpeg"
193
+ }))].find((candidate) => candidate.size < options.maxBytes);
194
+ if (fit !== void 0) return {
195
+ data: fit.data,
196
+ mimeType: fit.mimeType,
197
+ originalWidth,
198
+ originalHeight,
199
+ width,
200
+ height,
201
+ wasResized: true
202
+ };
203
+ } finally {
204
+ resized.free();
205
+ }
206
+ const nextWidth = Math.max(1, Math.floor(width * .75));
207
+ const nextHeight = Math.max(1, Math.floor(height * .75));
208
+ if (nextWidth === width && nextHeight === height) return null;
209
+ width = nextWidth;
210
+ height = nextHeight;
211
+ }
212
+ } catch {
213
+ return null;
214
+ } finally {
215
+ image?.free();
216
+ }
217
+ });
218
+ const workerUrl = () => import.meta.url.endsWith(".ts") ? new URL("./worker.ts", import.meta.url) : new URL("./tool/image/worker.mjs", import.meta.url);
219
+ /** The worker could not resize; the caller falls back to this thread. */
220
+ var WorkerError = class extends Schema.TaggedError()("ImageResizeWorkerError", { message: Schema.String }) {};
221
+ const inWorker = (input, mimeType, options) => Effect.callback((resume) => {
222
+ let worker;
223
+ try {
224
+ worker = new Worker(workerUrl());
225
+ } catch (cause) {
226
+ resume(Effect.fail(new WorkerError({ message: String(cause) })));
227
+ return;
228
+ }
229
+ const done = (effect) => {
230
+ resume(effect);
231
+ worker.terminate().catch(() => void 0);
232
+ };
233
+ worker.on("message", (message) => {
234
+ const reply = message;
235
+ if (reply?.type !== "codework:photon-image-resize") return;
236
+ done("error" in reply ? Effect.fail(new WorkerError({ message: reply.error })) : Effect.succeed(reply.result));
237
+ });
238
+ worker.once("error", (error) => done(Effect.fail(new WorkerError({ message: error.message }))));
239
+ worker.once("exit", (code) => done(Effect.fail(new WorkerError({ message: `Image resize worker exited with code ${code}` }))));
240
+ const bytes = new Uint8Array(input);
241
+ worker.postMessage({
242
+ input: bytes,
243
+ mimeType,
244
+ options
245
+ }, [bytes.buffer]);
246
+ return Effect.promise(() => worker.terminate());
247
+ });
248
+ /**
249
+ * {@link resizeInProcess} on a worker thread, so decoding and encoding a large
250
+ * image never blocks the harness's event loop. Falls back to this thread when a
251
+ * worker cannot start, so a read still works.
252
+ */
253
+ const resize = (input, mimeType, options = defaults) => inWorker(input, mimeType, options).pipe(Effect.catch(() => resizeInProcess(input, mimeType, options)));
254
+ /** Tells the model how to map coordinates on a resized image back to the original. */
255
+ const dimensionNote = (result) => {
256
+ if (!result.wasResized) return void 0;
257
+ const scale = result.originalWidth / result.width;
258
+ return `[Image: original ${result.originalWidth}x${result.originalHeight}, displayed at ${result.width}x${result.height}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`;
259
+ };
260
+ //#endregion
261
+ export { decode as a, resizeInProcess as i, dimensionNote as n, load as o, resize as r, REPLY as t };
262
+
263
+ //# sourceMappingURL=resize-Dwv5dCgY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-Dwv5dCgY.mjs","names":[],"sources":["../../src/tool/image/exif.ts","../../src/tool/image/photon.ts","../../src/tool/image/resize.ts"],"sourcesContent":["import type { Photon, PhotonImage } from \"./photon.ts\";\n\n/**\n * EXIF orientation for JPEG and WebP. Photon decodes pixels as stored, so a phone\n * photo taken sideways would reach the model sideways without this.\n */\n\nconst readOrientationFromTiff = (bytes: Uint8Array, tiffStart: number): number => {\n\tif (tiffStart + 8 > bytes.length) return 1;\n\tconst le = ((byte(bytes, tiffStart) << 8) | byte(bytes, tiffStart + 1)) === 0x4949;\n\tconst read16 = (pos: number): number =>\n\t\tle ? byte(bytes, pos) | (byte(bytes, pos + 1) << 8) : (byte(bytes, pos) << 8) | byte(bytes, pos + 1);\n\tconst read32 = (pos: number): number =>\n\t\tle\n\t\t\t? (byte(bytes, pos) |\n\t\t\t\t\t(byte(bytes, pos + 1) << 8) |\n\t\t\t\t\t(byte(bytes, pos + 2) << 16) |\n\t\t\t\t\t(byte(bytes, pos + 3) << 24)) >>>\n\t\t\t\t0\n\t\t\t: ((byte(bytes, pos) << 24) |\n\t\t\t\t\t(byte(bytes, pos + 1) << 16) |\n\t\t\t\t\t(byte(bytes, pos + 2) << 8) |\n\t\t\t\t\tbyte(bytes, pos + 3)) >>>\n\t\t\t\t0;\n\n\tconst ifdStart = tiffStart + read32(tiffStart + 4);\n\tif (ifdStart + 2 > bytes.length) return 1;\n\tconst entryCount = read16(ifdStart);\n\tfor (let index = 0; index < entryCount; index++) {\n\t\tconst entryPos = ifdStart + 2 + index * 12;\n\t\tif (entryPos + 12 > bytes.length) return 1;\n\t\tif (read16(entryPos) === 0x0112) {\n\t\t\tconst value = read16(entryPos + 8);\n\t\t\treturn value >= 1 && value <= 8 ? value : 1;\n\t\t}\n\t}\n\treturn 1;\n};\n\nconst findJpegTiffOffset = (bytes: Uint8Array): number => {\n\tlet offset = 2;\n\twhile (offset < bytes.length - 1) {\n\t\tif (bytes[offset] !== 0xff) return -1;\n\t\tconst marker = bytes[offset + 1];\n\t\tif (marker === 0xff) {\n\t\t\toffset++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (marker === 0xe1) {\n\t\t\tconst segmentStart = offset + 4;\n\t\t\tif (segmentStart + 6 > bytes.length) return -1;\n\t\t\tif (hasExifHeader(bytes, segmentStart)) return segmentStart + 6;\n\t\t}\n\t\tif (offset + 4 > bytes.length) return -1;\n\t\toffset += 2 + ((byte(bytes, offset + 2) << 8) | byte(bytes, offset + 3));\n\t}\n\treturn -1;\n};\n\nconst findWebpTiffOffset = (bytes: Uint8Array): number => {\n\tlet offset = 12;\n\twhile (offset + 8 <= bytes.length) {\n\t\tconst chunkId = String.fromCharCode(...bytes.subarray(offset, offset + 4));\n\t\tconst chunkSize =\n\t\t\tbyte(bytes, offset + 4) |\n\t\t\t(byte(bytes, offset + 5) << 8) |\n\t\t\t(byte(bytes, offset + 6) << 16) |\n\t\t\t(byte(bytes, offset + 7) << 24);\n\t\tconst dataStart = offset + 8;\n\t\tif (chunkId === \"EXIF\") {\n\t\t\tif (dataStart + chunkSize > bytes.length) return -1;\n\t\t\t// Some WebP files carry an \"Exif\\0\\0\" prefix before the TIFF header.\n\t\t\treturn chunkSize >= 6 && hasExifHeader(bytes, dataStart) ? dataStart + 6 : dataStart;\n\t\t}\n\t\t// RIFF chunks are padded to an even size.\n\t\toffset = dataStart + chunkSize + (chunkSize % 2);\n\t}\n\treturn -1;\n};\n\nconst hasExifHeader = (bytes: Uint8Array, offset: number): boolean =>\n\t[0x45, 0x78, 0x69, 0x66, 0x00, 0x00].every((value, index) => bytes[offset + index] === value);\n\nconst orientationOf = (bytes: Uint8Array): number => {\n\tlet tiffOffset = -1;\n\tif (bytes[0] === 0xff && bytes[1] === 0xd8) tiffOffset = findJpegTiffOffset(bytes);\n\telse if (\n\t\tString.fromCharCode(...bytes.subarray(0, 4)) === \"RIFF\" &&\n\t\tString.fromCharCode(...bytes.subarray(8, 12)) === \"WEBP\"\n\t)\n\t\ttiffOffset = findWebpTiffOffset(bytes);\n\treturn tiffOffset === -1 ? 1 : readOrientationFromTiff(bytes, tiffOffset);\n};\n\nconst byte = (bytes: Uint8Array, index: number): number => bytes[index] ?? 0;\n\ntype DstIndex = (x: number, y: number, w: number, h: number) => number;\n\nconst rotate90 = (photon: Photon, image: PhotonImage, dstIndex: DstIndex): PhotonImage => {\n\tconst w = image.get_width();\n\tconst h = image.get_height();\n\tconst src = image.get_raw_pixels();\n\tconst dst = new Uint8Array(src.length);\n\tfor (let y = 0; y < h; y++) {\n\t\tfor (let x = 0; x < w; x++) {\n\t\t\tdst.set(src.subarray((y * w + x) * 4, (y * w + x) * 4 + 4), dstIndex(x, y, w, h) * 4);\n\t\t}\n\t}\n\treturn new photon.PhotonImage(dst, h, w);\n};\n\nconst clockwise: DstIndex = (x, y, _w, h) => x * h + (h - 1 - y);\nconst counterClockwise: DstIndex = (x, y, w, h) => (w - 1 - x) * h + y;\n\n/** Flips mutate `image`; rotations return a new image, which the caller frees alongside the old one. */\nexport const applyOrientation = (photon: Photon, image: PhotonImage, originalBytes: Uint8Array): PhotonImage => {\n\tswitch (orientationOf(originalBytes)) {\n\t\tcase 2:\n\t\t\tphoton.fliph(image);\n\t\t\treturn image;\n\t\tcase 3:\n\t\t\tphoton.fliph(image);\n\t\t\tphoton.flipv(image);\n\t\t\treturn image;\n\t\tcase 4:\n\t\t\tphoton.flipv(image);\n\t\t\treturn image;\n\t\tcase 5: {\n\t\t\tconst rotated = rotate90(photon, image, clockwise);\n\t\t\tphoton.fliph(rotated);\n\t\t\treturn rotated;\n\t\t}\n\t\tcase 6:\n\t\t\treturn rotate90(photon, image, clockwise);\n\t\tcase 7: {\n\t\t\tconst rotated = rotate90(photon, image, counterClockwise);\n\t\t\tphoton.fliph(rotated);\n\t\t\treturn rotated;\n\t\t}\n\t\tcase 8:\n\t\t\treturn rotate90(photon, image, counterClockwise);\n\t\tdefault:\n\t\t\treturn image;\n\t}\n};\n","import { Effect } from \"effect\";\nimport { applyOrientation } from \"./exif.ts\";\n\nexport type Photon = typeof import(\"@silvia-odwyer/photon-node\");\nexport type PhotonImage = import(\"@silvia-odwyer/photon-node\").PhotonImage;\n\nlet loading: Promise<Photon | undefined> | undefined;\n\n/** Photon, loaded once on first use; `undefined` when its WASM cannot load, so images degrade instead of failing reads. */\nexport const load: Effect.Effect<Photon | undefined> = Effect.promise(() => {\n\tloading ??= import(\"@silvia-odwyer/photon-node\").then(\n\t\t(module) => module,\n\t\t() => undefined,\n\t);\n\treturn loading;\n});\n\n/** Decode with EXIF orientation applied. The caller frees the result. */\nexport const decode = (photon: Photon, bytes: Uint8Array): PhotonImage => {\n\tconst raw = photon.PhotonImage.new_from_byteslice(bytes);\n\tconst oriented = applyOrientation(photon, raw, bytes);\n\tif (oriented !== raw) raw.free();\n\treturn oriented;\n};\n","import { Effect, Schema } from \"effect\";\nimport { Worker } from \"node:worker_threads\";\nimport { decode, load } from \"./photon.ts\";\n\nexport interface ResizeOptions {\n\treadonly maxWidth: number;\n\treadonly maxHeight: number;\n\t/** Most bytes of base64 payload. */\n\treadonly maxBytes: number;\n\treadonly jpegQuality: number;\n}\n\nexport interface Resized {\n\t/** base64 */\n\treadonly data: string;\n\treadonly mimeType: string;\n\treadonly originalWidth: number;\n\treadonly originalHeight: number;\n\treadonly width: number;\n\treadonly height: number;\n\treadonly wasResized: boolean;\n}\n\n// 4.5MB of base64 leaves headroom below Anthropic's 5MB image limit.\nexport const defaults: ResizeOptions = {\n\tmaxWidth: 2000,\n\tmaxHeight: 2000,\n\tmaxBytes: 4.5 * 1024 * 1024,\n\tjpegQuality: 80,\n};\n\n/** Tags worker replies: Node posts its own messages on the worker channel too (e.g. under `--watch`). */\nexport const REPLY = \"codework:photon-image-resize\";\n\nexport type Reply = { type: typeof REPLY; result: Resized | null } | { type: typeof REPLY; error: string };\n\nconst base64 = (bytes: Uint8Array) => {\n\tconst data = Buffer.from(bytes).toString(\"base64\");\n\treturn { data, size: data.length };\n};\n\n/**\n * Fit an image within the dimensions and encoded size, in this thread. `null`\n * when Photon is unavailable or nothing fits. Fits by: scaling to the max\n * dimensions, keeping the smaller of PNG and JPEG, lowering JPEG quality, then\n * shrinking by a quarter at a time down to 1x1.\n */\nexport const resizeInProcess = (\n\tinput: Uint8Array,\n\tmimeType: string,\n\toptions: ResizeOptions = defaults,\n): Effect.Effect<Resized | null> =>\n\tEffect.map(load, (photon) => {\n\t\tif (photon === undefined) return null;\n\t\tlet image: ReturnType<typeof decode> | undefined;\n\t\ttry {\n\t\t\timage = decode(photon, input);\n\t\t\tconst originalWidth = image.get_width();\n\t\t\tconst originalHeight = image.get_height();\n\t\t\tconst inputSize = Math.ceil(input.byteLength / 3) * 4;\n\t\t\tif (originalWidth <= options.maxWidth && originalHeight <= options.maxHeight && inputSize < options.maxBytes) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: Buffer.from(input).toString(\"base64\"),\n\t\t\t\t\tmimeType,\n\t\t\t\t\toriginalWidth,\n\t\t\t\t\toriginalHeight,\n\t\t\t\t\twidth: originalWidth,\n\t\t\t\t\theight: originalHeight,\n\t\t\t\t\twasResized: false,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// A side never scales below one pixel, or a thin image would vanish.\n\t\t\tlet width = originalWidth;\n\t\t\tlet height = originalHeight;\n\t\t\tif (width > options.maxWidth) {\n\t\t\t\theight = Math.max(1, Math.round((height * options.maxWidth) / width));\n\t\t\t\twidth = options.maxWidth;\n\t\t\t}\n\t\t\tif (height > options.maxHeight) {\n\t\t\t\twidth = Math.max(1, Math.round((width * options.maxHeight) / height));\n\t\t\t\theight = options.maxHeight;\n\t\t\t}\n\n\t\t\tconst qualities = [...new Set([options.jpegQuality, 85, 70, 55, 40])];\n\t\t\twhile (true) {\n\t\t\t\tconst resized = photon.resize(image, width, height, photon.SamplingFilter.Lanczos3);\n\t\t\t\ttry {\n\t\t\t\t\tconst candidates = [\n\t\t\t\t\t\t{ ...base64(resized.get_bytes()), mimeType: \"image/png\" },\n\t\t\t\t\t\t...qualities.map((quality) => ({\n\t\t\t\t\t\t\t...base64(resized.get_bytes_jpeg(quality)),\n\t\t\t\t\t\t\tmimeType: \"image/jpeg\",\n\t\t\t\t\t\t})),\n\t\t\t\t\t];\n\t\t\t\t\tconst fit = candidates.find((candidate) => candidate.size < options.maxBytes);\n\t\t\t\t\tif (fit !== undefined) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tdata: fit.data,\n\t\t\t\t\t\t\tmimeType: fit.mimeType,\n\t\t\t\t\t\t\toriginalWidth,\n\t\t\t\t\t\t\toriginalHeight,\n\t\t\t\t\t\t\twidth,\n\t\t\t\t\t\t\theight,\n\t\t\t\t\t\t\twasResized: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tresized.free();\n\t\t\t\t}\n\t\t\t\tconst nextWidth = Math.max(1, Math.floor(width * 0.75));\n\t\t\t\tconst nextHeight = Math.max(1, Math.floor(height * 0.75));\n\t\t\t\tif (nextWidth === width && nextHeight === height) return null;\n\t\t\t\twidth = nextWidth;\n\t\t\t\theight = nextHeight;\n\t\t\t}\n\t\t} catch {\n\t\t\treturn null;\n\t\t} finally {\n\t\t\timage?.free();\n\t\t}\n\t});\n\n// From source the worker sits beside this module; packed, this module lands in a\n// chunk at the package's output root while the worker keeps its own entry path.\nconst workerUrl = (): URL =>\n\timport.meta.url.endsWith(\".ts\")\n\t\t? new URL(\"./worker.ts\", import.meta.url)\n\t\t: new URL(\"./tool/image/worker.mjs\", import.meta.url);\n\n/** The worker could not resize; the caller falls back to this thread. */\nclass WorkerError extends Schema.TaggedError<WorkerError>()(\"ImageResizeWorkerError\", { message: Schema.String }) {}\n\nconst inWorker = (input: Uint8Array, mimeType: string, options: ResizeOptions) =>\n\tEffect.callback<Resized | null, WorkerError>((resume) => {\n\t\tlet worker: Worker;\n\t\ttry {\n\t\t\tworker = new Worker(workerUrl());\n\t\t} catch (cause) {\n\t\t\t// e.g. a Node permission model without worker access: resize in this thread instead.\n\t\t\tresume(Effect.fail(new WorkerError({ message: String(cause) })));\n\t\t\treturn;\n\t\t}\n\t\tconst done = (effect: Effect.Effect<Resized | null, WorkerError>) => {\n\t\t\tresume(effect);\n\t\t\tvoid worker.terminate().catch(() => undefined);\n\t\t};\n\t\tworker.on(\"message\", (message: unknown) => {\n\t\t\tconst reply = message as Partial<Reply> | null;\n\t\t\tif (reply?.type !== REPLY) return;\n\t\t\tdone(\n\t\t\t\t\"error\" in reply\n\t\t\t\t\t? Effect.fail(new WorkerError({ message: reply.error }))\n\t\t\t\t\t: Effect.succeed((reply as { result: Resized | null }).result),\n\t\t\t);\n\t\t});\n\t\tworker.once(\"error\", (error: Error) => done(Effect.fail(new WorkerError({ message: error.message }))));\n\t\tworker.once(\"exit\", (code) =>\n\t\t\tdone(Effect.fail(new WorkerError({ message: `Image resize worker exited with code ${code}` }))),\n\t\t);\n\t\t// Transferring detaches the buffer, so hand over a copy and leave the caller's bytes intact.\n\t\tconst bytes = new Uint8Array(input);\n\t\tworker.postMessage({ input: bytes, mimeType, options }, [bytes.buffer]);\n\t\treturn Effect.promise(() => worker.terminate());\n\t});\n\n/**\n * {@link resizeInProcess} on a worker thread, so decoding and encoding a large\n * image never blocks the harness's event loop. Falls back to this thread when a\n * worker cannot start, so a read still works.\n */\nexport const resize = (input: Uint8Array, mimeType: string, options: ResizeOptions = defaults) =>\n\tinWorker(input, mimeType, options).pipe(Effect.catch(() => resizeInProcess(input, mimeType, options)));\n\n/** Tells the model how to map coordinates on a resized image back to the original. */\nexport const dimensionNote = (result: Resized): string | undefined => {\n\tif (!result.wasResized) return undefined;\n\tconst scale = result.originalWidth / result.width;\n\treturn `[Image: original ${result.originalWidth}x${result.originalHeight}, displayed at ${result.width}x${result.height}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { a as RuntimeConfig, c as sandbox, i as ResourcesConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../index-DjPzwUHF.mjs";
1
+ import { a as RuntimeConfig, c as sandbox, i as ResourcesConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../index-BlvIgEtU.mjs";
2
2
  export { ClientOptions, CreateConfig, Options, ResourcesConfig, RuntimeConfig, config, sandbox as default, make };
@@ -1,2 +1,2 @@
1
- import { a as RuntimeConfig, c as sandbox, i as ResourcesConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../daytona-BAurx6Gp.mjs";
1
+ import { a as RuntimeConfig, c as sandbox, i as ResourcesConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../daytona-ByTHZelc.mjs";
2
2
  export { ClientOptions, CreateConfig, Options, ResourcesConfig, RuntimeConfig, config, sandbox as default, make };
@@ -1,2 +1,2 @@
1
- import { a as Source, c as sandbox, i as RuntimeConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../index-DIP2u0Pr.mjs";
1
+ import { a as Source, c as sandbox, i as RuntimeConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../index-BEZ8eL--.mjs";
2
2
  export { ClientOptions, CreateConfig, Options, RuntimeConfig, Source, config, sandbox as default, make };
@@ -1,2 +1,2 @@
1
- import { a as Source, c as sandbox, i as RuntimeConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../vercel-C0v5nh20.mjs";
1
+ import { a as Source, c as sandbox, i as RuntimeConfig, n as CreateConfig, o as config, r as Options, s as make, t as ClientOptions } from "../../vercel-3GouQSJI.mjs";
2
2
  export { ClientOptions, CreateConfig, Options, RuntimeConfig, Source, config, sandbox as default, make };
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,19 @@
1
+ import { i as resizeInProcess, t as REPLY } from "../../resize-Dwv5dCgY.mjs";
2
+ import { Effect } from "effect";
3
+ import { parentPort } from "node:worker_threads";
4
+ //#region src/tool/image/worker.ts
5
+ const port = parentPort;
6
+ if (port === null) throw new Error("image resize worker requires parentPort");
7
+ port.once("message", (request) => {
8
+ Effect.runPromise(resizeInProcess(request.input, request.mimeType, request.options)).then((result) => port.postMessage({
9
+ type: REPLY,
10
+ result
11
+ }), (error) => port.postMessage({
12
+ type: REPLY,
13
+ error: error instanceof Error ? error.message : String(error)
14
+ }));
15
+ });
16
+ //#endregion
17
+ export {};
18
+
19
+ //# sourceMappingURL=worker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.mjs","names":[],"sources":["../../../../src/tool/image/worker.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { parentPort } from \"node:worker_threads\";\nimport { REPLY, type Reply, type ResizeOptions, resizeInProcess } from \"./resize.ts\";\n\ninterface Request {\n\treadonly input: Uint8Array;\n\treadonly mimeType: string;\n\treadonly options: ResizeOptions;\n}\n\nconst port = parentPort;\nif (port === null) throw new Error(\"image resize worker requires parentPort\");\n\nport.once(\"message\", (request: Request) => {\n\tEffect.runPromise(resizeInProcess(request.input, request.mimeType, request.options)).then(\n\t\t(result) => port.postMessage({ type: REPLY, result } satisfies Reply),\n\t\t(error: unknown) =>\n\t\t\tport.postMessage({\n\t\t\t\ttype: REPLY,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t} satisfies Reply),\n\t);\n});\n"],"mappings":";;;;AAUA,MAAM,OAAO;AACb,IAAI,SAAS,MAAM,MAAM,IAAI,MAAM,yCAAyC;AAE5E,KAAK,KAAK,YAAY,YAAqB;CAC1C,OAAO,WAAW,gBAAgB,QAAQ,OAAO,QAAQ,UAAU,QAAQ,OAAO,CAAC,CAAC,CAAC,MACnF,WAAW,KAAK,YAAY;EAAE,MAAM;EAAO;CAAO,CAAiB,IACnE,UACA,KAAK,YAAY;EAChB,MAAM;EACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CAC7D,CAAiB,CACnB;AACD,CAAC"}
@@ -20,6 +20,7 @@ const make$1 = (provider, options) => {
20
20
  return {
21
21
  readFile: (path) => provider.readFile(resolve(path)),
22
22
  readFileBuffer: (path) => provider.readFileBuffer(resolve(path)),
23
+ readBytes: (path, offset, length) => provider.readBytes(resolve(path), offset, length),
23
24
  writeFile: (path, content) => provider.writeFile(resolve(path), content),
24
25
  stat: (path) => provider.stat(resolve(path)),
25
26
  ...provider.lstat === void 0 ? {} : { lstat: (path) => provider.lstat(resolve(path)) },
@@ -27,12 +28,15 @@ const make$1 = (provider, options) => {
27
28
  exists: (path) => provider.exists(resolve(path)),
28
29
  mkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),
29
30
  rm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),
30
- realpath: (path) => provider.realpath(resolve(path))
31
+ realpath: (path) => provider.realpath(resolve(path)),
32
+ scanLines: (path, scanOptions) => provider.scanLines(resolve(path), scanOptions)
31
33
  };
32
34
  };
33
35
  //#endregion
34
36
  //#region src/sandboxes/vercel/provider.ts
35
37
  const utf8 = new TextEncoder();
38
+ /** Where oversized tool output is written inside the sandbox. */
39
+ const SPILL_PATH = "/tmp";
36
40
  Schema.TaggedError()("VercelError", { sanitized: instance_exports.SandboxInstance.PersistedError });
37
41
  const ApiFailure = Schema.Struct({ json: Schema.Struct({ error: Schema.Struct({
38
42
  message: Schema.optional(Schema.String),
@@ -100,6 +104,14 @@ const statsFrom = (stats) => {
100
104
  };
101
105
  };
102
106
  const providerFrom = (sandbox, options) => {
107
+ const run = async (argv) => {
108
+ const result = await (await spawnArgv(sandbox, options, argv)).wait();
109
+ return {
110
+ exitCode: result.exitCode,
111
+ stdout: await result.stdout(),
112
+ stderr: await result.stderr()
113
+ };
114
+ };
103
115
  return {
104
116
  readFile: (path) => sandbox.fs.readFile(path, "utf8"),
105
117
  readFileBuffer: async (path) => new Uint8Array(await sandbox.fs.readFile(path)),
@@ -135,7 +147,9 @@ const providerFrom = (sandbox, options) => {
135
147
  if (result.exitCode === 0) return (await result.stdout()).trimEnd();
136
148
  }
137
149
  throw Object.assign(/* @__PURE__ */ new Error(`ENOENT: no such file or directory, realpath '${path}'`), { code: "ENOENT" });
138
- }
150
+ },
151
+ scanLines: filesystem_exports.SandboxFileSystem.Scan.viaShell(run),
152
+ readBytes: filesystem_exports.SandboxFileSystem.readBytesViaShell(run)
139
153
  };
140
154
  };
141
155
  const spawn = (sandbox, options, command, env, cwd) => spawnArgv(sandbox, options, [
@@ -182,8 +196,19 @@ const execArgv = (sandbox, options) => (argv, opts) => {
182
196
  const command = (0, shell_exports.quoteArgv)(argv);
183
197
  return acquireWith(command, () => spawnArgv(sandbox, options, argv, opts?.env, opts?.cwd)).pipe(Effect.flatMap(collect(command)), Effect.scoped);
184
198
  };
199
+ const closable = (logs) => ({ [Symbol.asyncIterator]: () => ({
200
+ next: () => logs.next(),
201
+ return: async () => {
202
+ logs.close();
203
+ await logs.return().catch(() => {});
204
+ return {
205
+ done: true,
206
+ value: void 0
207
+ };
208
+ }
209
+ }) });
185
210
  const stream = (sandbox, options) => (command, opts) => Stream.unwrap(acquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(Effect.map((cmd) => {
186
- const logs = Stream.fromAsyncIterable(cmd.logs(), (cause) => new shell_exports.ShellError({
211
+ const logs = Stream.fromAsyncIterable(closable(cmd.logs()), (cause) => new shell_exports.ShellError({
187
212
  command,
188
213
  cause
189
214
  })).pipe(Stream.map((log) => ({
@@ -244,6 +269,7 @@ const CreateConfig = Schema.Struct({
244
269
  });
245
270
  const RuntimeConfig = Schema.Struct({
246
271
  defaultCwd: SandboxDriver.AbsolutePath,
272
+ spillPath: Schema.optional(SandboxDriver.AbsolutePath),
247
273
  execTimeout: Schema.optional(Schema.Finite)
248
274
  });
249
275
  const name = SandboxDriver.Name.make("vercel");
@@ -324,6 +350,7 @@ const make = (client = {}) => {
324
350
  providerStatus: state.providerStatus,
325
351
  runtimeConfig: {
326
352
  defaultCwd: SandboxDriver.AbsolutePath.make(sandbox.cwd || "/vercel/sandbox"),
353
+ spillPath: SandboxDriver.AbsolutePath.make(SPILL_PATH),
327
354
  ...config.execTimeout === void 0 ? {} : { execTimeout: config.execTimeout }
328
355
  },
329
356
  metadata: { cwd: sandbox.cwd }
@@ -331,6 +358,7 @@ const make = (client = {}) => {
331
358
  }),
332
359
  runtimeConfigFor: ({ providerResourceId, overrides }) => Effect.map(get(providerResourceId, false, "runtimeConfigFor"), (sandbox) => ({
333
360
  defaultCwd: overrides?.defaultCwd ?? SandboxDriver.AbsolutePath.make(sandbox.cwd || "/vercel/sandbox"),
361
+ spillPath: overrides?.spillPath ?? SandboxDriver.AbsolutePath.make("/tmp"),
334
362
  ...overrides?.execTimeout === void 0 ? {} : { execTimeout: overrides.execTimeout }
335
363
  })),
336
364
  attach: (input) => Layer.unwrap(Effect.map(get(Option.getOrElse(input.providerResourceId, () => input.id), true, "attach"), (sandbox) => transport(sandbox, input.runtimeConfig.execTimeout === void 0 ? void 0 : { execTimeout: input.runtimeConfig.execTimeout }))),
@@ -353,4 +381,4 @@ const config = (value) => ({
353
381
  //#endregion
354
382
  export { Source as a, sandbox as c, RuntimeConfig as i, CreateConfig as n, config as o, Options as r, make as s, ClientOptions as t };
355
383
 
356
- //# sourceMappingURL=vercel-C0v5nh20.mjs.map
384
+ //# sourceMappingURL=vercel-3GouQSJI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-3GouQSJI.mjs","names":["make","SandboxInstance","makeRedactor","sanitizeSandboxError","SandboxFileSystem","resolveCwd","ShellError","quoteArgv","RemoteFileSystem.make","Shell","SandboxResource","EnvVercel.credentialsFrom","EnvVercel.sanitizeProviderError","EnvVercel.createSandbox","EnvVercel.SPILL_PATH","EnvVercel.transport"],"sources":["../../src/sandboxes/vercel/fs.ts","../../src/sandboxes/vercel/provider.ts","../../src/sandboxes/vercel/index.ts"],"sourcesContent":["import { posix } from \"../../util/posix.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\n\n// The provider contract and FileStat live in `filesystem.ts` (the single source of truth, VFS-free).\n// A remote provider implements this Interface; `make` wraps\n// it into the same runtime surface the local vfs backend exposes.\nexport type FileStat = SandboxFileSystem.FileStat;\n\n// Remote-aware callers can opt into metadata that is not part of the generic\n// SandboxFileSystem surface. In particular, `stat` keeps the familiar\n// provider-level meaning, while `lstat` explicitly asks for the directory entry\n// itself so symlink identity is not inferred from a method with mixed provider\n// semantics.\nexport interface Interface extends SandboxFileSystem.Provider {\n\treadonly lstat?: (path: string) => Promise<FileStat>;\n}\n\nexport interface Options {\n\t/**\n\t * Optional remote working directory for relative paths. When omitted, relative\n\t * paths are passed through so the remote provider can use its own default cwd.\n\t */\n\treadonly cwd?: string;\n}\n\nconst resolvePath = (path: string, options?: Options) => {\n\tconst normalized = posix.normalize(path);\n\tif (options?.cwd === undefined || posix.isAbsolute(normalized)) return normalized;\n\treturn posix.normalize(posix.join(options.cwd, normalized));\n};\n\n/**\n * Wrap a remote provider into the runtime filesystem surface: resolve relative\n * paths against `cwd`, and nothing else. Parent creation and `rm` option\n * validation are the runtime's job and live in `SandboxFileSystem.fromProvider`,\n * which every backend passes through — putting them here would cover only the\n * backends that happen to use this wrapper.\n */\nexport const make = (provider: Interface, options?: Options): SandboxFileSystem.Provider => {\n\tconst resolve = (path: string) => resolvePath(path, options);\n\n\treturn {\n\t\treadFile: (path) => provider.readFile(resolve(path)),\n\t\treadFileBuffer: (path) => provider.readFileBuffer(resolve(path)),\n\t\treadBytes: (path, offset, length) => provider.readBytes(resolve(path), offset, length),\n\t\twriteFile: (path, content) => provider.writeFile(resolve(path), content),\n\t\tstat: (path) => provider.stat(resolve(path)),\n\t\t...(provider.lstat === undefined ? {} : { lstat: (path: string) => provider.lstat!(resolve(path)) }),\n\t\treaddir: (path) => provider.readdir(resolve(path)),\n\t\texists: (path) => provider.exists(resolve(path)),\n\t\tmkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),\n\t\t// option validation happens in `fromProvider`, before any mutation\n\t\trm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),\n\t\trealpath: (path) => provider.realpath(resolve(path)),\n\t\tscanLines: (path, scanOptions) => provider.scanLines(resolve(path), scanOptions),\n\t};\n};\n\nexport const withProvider = make;\n","/* oxlint-disable effecttsgo/async-function -- Vercel's sandbox SDK boundary is Promise-based. */\nimport { Context, Effect, Layer, Schema, Stream } from \"effect\";\nimport { Buffer } from \"node:buffer\";\nimport { makeRedactor, type Redactor, sanitizeError as sanitizeSandboxError } from \"../../sandbox/errors.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\nimport { SandboxInstance } from \"../../sandbox/instance.ts\";\nimport { SandboxIO } from \"../../sandbox/io.ts\";\nimport { SandboxResource } from \"../../sandbox/resource.ts\";\nimport {\n\ttype ExecChunk,\n\ttype ExecResult,\n\ttype ISandboxExe,\n\tquoteArgv,\n\tresolveCwd,\n\tShell,\n\tShellError,\n} from \"../../sandbox/shell/shell.ts\";\nimport * as RemoteFileSystem from \"./fs.ts\";\n\nconst utf8 = new TextEncoder();\ntype Command = import(\"@vercel/sandbox\").Command;\ntype RemoteSandbox = import(\"@vercel/sandbox\").Sandbox;\n\n/** Vercel's namespace-intrinsic working directory. */\nexport const DEFAULT_CWD = \"/vercel/sandbox\";\n/** Where oversized tool output is written inside the sandbox. */\nexport const SPILL_PATH = \"/tmp\";\n\nexport class VercelError extends Schema.TaggedError<VercelError>()(\"VercelError\", {\n\tsanitized: SandboxInstance.PersistedError,\n}) {}\n\nconst ApiFailure = Schema.Struct({\n\tjson: Schema.Struct({\n\t\terror: Schema.Struct({\n\t\t\tmessage: Schema.optional(Schema.String),\n\t\t\tcode: Schema.optional(Schema.String),\n\t\t}),\n\t}),\n});\nconst isApiFailure = Schema.is(ApiFailure);\n\n/** Prefer Vercel's structured API failure while retaining the shared redaction boundary. */\nexport const sanitizeProviderError = (\n\tcause: unknown,\n\tredact: Redactor = makeRedactor(),\n): SandboxInstance.PersistedError => {\n\tconst fallback = sanitizeSandboxError(cause, redact);\n\tif (!isApiFailure(cause)) return fallback;\n\tconst message = cause.json.error.message?.trim();\n\tconst code = cause.json.error.code?.trim();\n\treturn {\n\t\t...fallback,\n\t\t...(message === undefined || message.length === 0 ? {} : { message: redact(message) }),\n\t\t...(code === undefined || code.length === 0 ? {} : { code: redact(code) }),\n\t};\n};\n\n/**\n * Vercel API credentials. Either all three are provided together or none are:\n * when omitted, the SDK resolves them from the `VERCEL_OIDC_TOKEN` env var\n * (the token's payload carries the project and team ids).\n */\nexport interface Credentials {\n\treadonly token: string;\n\treadonly teamId: string;\n\treadonly projectId: string;\n}\n\nexport interface Options {\n\t/** Auth token (OIDC or access token). Falls back to `VERCEL_OIDC_TOKEN`. */\n\treadonly token?: string | undefined;\n\t/** Team id. Derived from the OIDC token when omitted. */\n\treadonly teamId?: string | undefined;\n\t/** Project id. Derived from the OIDC token when omitted. */\n\treadonly projectId?: string | undefined;\n\t/** Reuse an existing sandbox by name instead of creating one. */\n\treadonly sandboxName?: string | undefined;\n\t/** Explicit name for a newly created sandbox. */\n\treadonly name?: string | undefined;\n\t/** Provider-side diagnostic labels (maximum five). */\n\treadonly tags?: Record<string, string> | undefined;\n\t/** Durable instance identity for this namespace. Supplied by the Controller. */\n\treadonly instanceId?: SandboxInstance.ID | undefined;\n\t/** Snapshot id to create the sandbox from. */\n\treadonly snapshot?: string | undefined;\n\t/** Source to seed the sandbox filesystem from (git or tarball). */\n\treadonly source?:\n\t\t| {\n\t\t\t\treadonly type: \"git\";\n\t\t\t\treadonly url: string;\n\t\t\t\treadonly revision?: string | undefined;\n\t\t\t\treadonly depth?: number | undefined;\n\t\t }\n\t\t| { readonly type: \"tarball\"; readonly url: string };\n\t/** Runtime used by the sandbox. Defaults to the SDK default (`node24`). */\n\treadonly runtime?: string | undefined;\n\t/** Ports to expose from the sandbox (max 4). */\n\treadonly ports?: number[] | undefined;\n\t/** Environment variables baked into the sandbox. */\n\treadonly envVars?: Record<string, string> | undefined;\n\t/** vCPU allocation (memory scales at 2048 MB per vCPU). */\n\treadonly vcpus?: number | undefined;\n\t/**\n\t * Mount working directory. Relative values resolve against `/vercel/sandbox`;\n\t * omitted values use that namespace default.\n\t */\n\treadonly cwd?: string | undefined;\n\t/** Milliseconds before the sandbox auto-terminates. */\n\treadonly timeout?: number | undefined;\n\t/** Per-command timeout in milliseconds. Omit for no timeout. */\n\treadonly execTimeout?: number | undefined;\n}\n\ninterface RemoteState {\n\treadonly sandbox: RemoteSandbox;\n}\n\nclass Remote extends Context.Service<Remote, RemoteState>()(\"@codeworksh/harness/sandboxes/vercel/provider/Remote\") {}\n\n// Vercel requires all three credential fields together or none — partial\n// credentials are rejected by the SDK — so only forward them when complete.\nexport const credentialsFrom = (options: Options): Credentials | undefined =>\n\toptions.token !== undefined && options.teamId !== undefined && options.projectId !== undefined\n\t\t? { token: options.token, teamId: options.teamId, projectId: options.projectId }\n\t\t: undefined;\n\nexport const createSandbox = async (options: Options, creds: Credentials | undefined = credentialsFrom(options)) => {\n\tconst { Sandbox } = await import(\"@vercel/sandbox\");\n\tconst withCreds = <T extends object>(params: T) => (creds ? { ...params, ...creds } : params);\n\tconst source =\n\t\toptions.source?.type === \"git\"\n\t\t\t? {\n\t\t\t\t\ttype: \"git\" as const,\n\t\t\t\t\turl: options.source.url,\n\t\t\t\t\t...(options.source.revision === undefined ? {} : { revision: options.source.revision }),\n\t\t\t\t\t...(options.source.depth === undefined ? {} : { depth: options.source.depth }),\n\t\t\t\t}\n\t\t\t: options.source;\n\tconst base = {\n\t\t...(options.name === undefined ? {} : { name: options.name }),\n\t\t...(options.tags === undefined ? {} : { tags: options.tags }),\n\t\t...(options.envVars === undefined ? {} : { env: options.envVars }),\n\t\t...(options.ports === undefined ? {} : { ports: options.ports }),\n\t\t...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n\t\t...(options.vcpus === undefined ? {} : { resources: { vcpus: options.vcpus } }),\n\t};\n\treturn options.snapshot !== undefined\n\t\t? Sandbox.create(withCreds({ ...base, source: { type: \"snapshot\" as const, snapshotId: options.snapshot } }))\n\t\t: Sandbox.create(\n\t\t\t\twithCreds({\n\t\t\t\t\t...base,\n\t\t\t\t\t...(options.runtime === undefined ? {} : { runtime: options.runtime }),\n\t\t\t\t\t...(source === undefined ? {} : { source }),\n\t\t\t\t}),\n\t\t\t);\n};\n\nconst remote = (options: Options) =>\n\tLayer.effect(\n\t\tRemote,\n\t\tEffect.tryPromise({\n\t\t\ttry: async (): Promise<RemoteState> => {\n\t\t\t\tconst { Sandbox } = await import(\"@vercel/sandbox\");\n\t\t\t\tconst creds = credentialsFrom(options);\n\t\t\t\tconst sandbox = options.sandboxName\n\t\t\t\t\t? await Sandbox.get(creds ? { ...creds, name: options.sandboxName } : { name: options.sandboxName })\n\t\t\t\t\t: await createSandbox(options, creds);\n\t\t\t\treturn { sandbox };\n\t\t\t},\n\t\t\tcatch: (cause) => new VercelError({ sanitized: sanitizeProviderError(cause) }),\n\t\t}),\n\t);\n\ninterface Stats {\n\treadonly size: number;\n\treadonly mtime: Date;\n\treadonly isFile: () => boolean;\n\treadonly isDirectory: () => boolean;\n\treadonly isSymbolicLink: () => boolean;\n}\n\nexport const statsFrom = (stats: Stats): RemoteFileSystem.FileStat => {\n\tconst mtime = stats.mtime;\n\n\t// omit size/mtime the stat could not report — never fabricate\n\treturn {\n\t\tisFile: stats.isFile(),\n\t\tisDirectory: stats.isDirectory(),\n\t\tisSymbolicLink: stats.isSymbolicLink(),\n\t\t...(Number.isFinite(stats.size) ? { size: stats.size } : {}),\n\t\t...(mtime instanceof Date && !Number.isNaN(mtime.getTime()) ? { mtime } : {}),\n\t};\n};\n\ntype RemoteFilesystemProvider = Pick<\n\tRemoteFileSystem.Interface,\n\t| \"readFile\"\n\t| \"readFileBuffer\"\n\t| \"readBytes\"\n\t| \"writeFile\"\n\t| \"stat\"\n\t| \"lstat\"\n\t| \"readdir\"\n\t| \"exists\"\n\t| \"mkdir\"\n\t| \"rm\"\n\t| \"realpath\"\n\t| \"scanLines\"\n>;\n\n// The Vercel `fs` surface is `node:fs/promises`-compatible, so the provider\n// maps almost directly. The `RemoteFileSystem.make` wrapper resolves relative\n// paths against `cwd` and guarantees parent creation on `writeFile`. Only\n// `realpath` has no fs counterpart and shells out.\nconst providerFrom = (sandbox: RemoteSandbox, options: Options): RemoteFilesystemProvider => {\n\tconst run = async (argv: ReadonlyArray<string>) => {\n\t\tconst result = await (await spawnArgv(sandbox, options, argv)).wait();\n\t\treturn { exitCode: result.exitCode, stdout: await result.stdout(), stderr: await result.stderr() };\n\t};\n\tconst filesystem: RemoteFilesystemProvider = {\n\t\treadFile: (path: string) => sandbox.fs.readFile(path, \"utf8\"),\n\t\treadFileBuffer: async (path: string) => new Uint8Array(await sandbox.fs.readFile(path)),\n\t\twriteFile: (path: string, content: string | Uint8Array) =>\n\t\t\tsandbox.fs.writeFile(path, typeof content === \"string\" ? Buffer.from(content, \"utf8\") : Buffer.from(content)),\n\t\tstat: async (path: string) => statsFrom(await sandbox.fs.stat(path)),\n\t\t// Keep symlink identity explicit: Vercel's `stat` follows symlinks\n\t\t// (`stat -L`), so remote-aware callers must ask for `lstat` when they\n\t\t// need the entry itself instead of the target's metadata.\n\t\tlstat: async (path: string) => statsFrom(await sandbox.fs.lstat(path)),\n\t\t// `withFileTypes` lists via `find`, which includes dotfiles (`.git` …);\n\t\t// the bare `readdir` shells out to `ls -1` and would drop them.\n\t\treaddir: async (path: string) => (await sandbox.fs.readdir(path, { withFileTypes: true })).map((e) => e.name),\n\t\texists: async (path: string) => {\n\t\t\ttry {\n\t\t\t\tawait sandbox.fs.stat(path);\n\t\t\t\treturn true;\n\t\t\t} catch (cause) {\n\t\t\t\tif (SandboxFileSystem.isNotFoundError(cause)) return false;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t},\n\t\tmkdir: async (path: string, mkdirOptions?: { recursive?: boolean }) => {\n\t\t\tawait sandbox.fs.mkdir(\n\t\t\t\tpath,\n\t\t\t\tmkdirOptions?.recursive === undefined ? {} : { recursive: mkdirOptions.recursive },\n\t\t\t);\n\t\t},\n\t\t// `rm -f` is native, so force/recursive delegate straight through; the\n\t\t// wrapper has already rejected any unsupported option before we get here.\n\t\trm: (path: string, rmOptions?: { recursive?: boolean; force?: boolean }) =>\n\t\t\tsandbox.fs.rm(path, {\n\t\t\t\t...(rmOptions?.recursive === undefined ? {} : { recursive: rmOptions.recursive }),\n\t\t\t\t...(rmOptions?.force === undefined ? {} : { force: rmOptions.force }),\n\t\t\t}),\n\t\trealpath: async (path: string) => {\n\t\t\tfor (const script of SandboxFileSystem.realpathScripts) {\n\t\t\t\tconst result = await (await spawnArgv(sandbox, options, [\"sh\", \"-c\", script, \"_\", path])).wait();\n\t\t\t\tif (result.exitCode === 0) return (await result.stdout()).trimEnd();\n\t\t\t}\n\t\t\t// same shape `fs.stat` rejects with, so `isNotFoundError` recognises it\n\t\t\tthrow Object.assign(new Error(`ENOENT: no such file or directory, realpath '${path}'`), { code: \"ENOENT\" });\n\t\t},\n\t\tscanLines: SandboxFileSystem.Scan.viaShell(run),\n\t\treadBytes: SandboxFileSystem.readBytesViaShell(run),\n\t};\n\n\treturn filesystem;\n};\n\n// Arbitrary command strings run through `sh -c` to match the single-string\n// contract the rest of the harness expects. Commands run **detached** so the\n// returned `Command` exposes `kill`/`logs`/`wait`: a `cwd`/`env` is threaded in,\n// and the per-command `execTimeout` is a server-side SIGKILL deadline.\nconst spawn = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\tcommand: string,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n): Promise<Command> => spawnArgv(sandbox, options, [\"sh\", \"-c\", command], env, cwd);\n\n// Vercel spawns a program with a real argument vector, so `execArgv` needs no\n// quoting at all — the args never pass through a shell.\nconst spawnArgv = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\targv: ReadonlyArray<string>,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n): Promise<Command> => {\n\tconst resolvedCwd = resolveCwd(options.cwd, cwd);\n\treturn sandbox.runCommand({\n\t\tcmd: argv[0]!,\n\t\targs: argv.slice(1),\n\t\t...(resolvedCwd === undefined ? {} : { cwd: resolvedCwd }),\n\t\t...(env === undefined ? {} : { env }),\n\t\tdetached: true,\n\t\t...(options.execTimeout === undefined ? {} : { timeoutMs: options.execTimeout }),\n\t});\n};\n\n// Acquire a detached command and register its kill as a scope finalizer, so an\n// interrupt / timeout from the consumer actually terminates the remote process\n// (best-effort SIGKILL) instead of leaving it running server-side.\n// `command` labels failures only; the spawn itself is supplied by the caller so\n// string and argv execution share one kill finalizer.\nconst acquireWith = (command: string, run: () => Promise<Command>) =>\n\tEffect.acquireRelease(Effect.tryPromise({ try: run, catch: (cause) => new ShellError({ command, cause }) }), (cmd) =>\n\t\tEffect.promise(() => cmd.kill(\"SIGKILL\").catch(() => {})),\n\t);\n\n// Vercel reports stdout and stderr separately with a distinct exit code, so the\n// shell surfaces both streams faithfully.\nconst collect = (command: string) => (cmd: Command) =>\n\tEffect.tryPromise({\n\t\ttry: async (): Promise<ExecResult> => {\n\t\t\tconst result = await cmd.wait();\n\t\t\tconst [stdout, stderr] = await Promise.all([result.stdout(), result.stderr()]);\n\t\t\treturn { stdout, stderr, exitCode: result.exitCode };\n\t\t},\n\t\tcatch: (cause) => new ShellError({ command, cause }),\n\t});\n\nconst acquireCommand = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\tcommand: string,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n) => acquireWith(command, () => spawn(sandbox, options, command, env, cwd));\n\nconst exec =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"exec\"] =>\n\t(command, opts) =>\n\t\tacquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(\n\t\t\tEffect.flatMap(collect(command)),\n\t\t\tEffect.scoped,\n\t\t);\n\nconst execArgv =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"execArgv\"] =>\n\t(argv, opts) => {\n\t\t// quoted for the error label only — the spawn passes argv through untouched\n\t\tconst command = quoteArgv(argv);\n\t\treturn acquireWith(command, () => spawnArgv(sandbox, options, argv, opts?.env, opts?.cwd)).pipe(\n\t\t\tEffect.flatMap(collect(command)),\n\t\t\tEffect.scoped,\n\t\t);\n\t};\n\ntype Logs = ReturnType<Command[\"logs\"]>;\ntype LogLine = Logs extends AsyncGenerator<infer L> ? L : never;\n\n// The SDK's `return()` waits for the pending read of the HTTP log stream, which\n// never ends while a surviving child (e.g. `tee`) holds stdout open; abort the\n// read first so closing the stream's scope cannot hang.\nconst closable = (logs: Logs): AsyncIterable<LogLine, void> => ({\n\t[Symbol.asyncIterator]: () => ({\n\t\tnext: () => logs.next(),\n\t\treturn: async () => {\n\t\t\tlogs.close();\n\t\t\tawait logs.return().catch(() => {});\n\t\t\treturn { done: true, value: undefined };\n\t\t},\n\t}),\n});\n\n// Streaming output via `Command.logs` (an async generator of stdout/stderr\n// entries), followed by the exit code from `wait`. The kill finalizer fires when\n// the consuming scope closes (interrupt / timeout).\nconst stream =\n\t(sandbox: RemoteSandbox, options: Options): NonNullable<ISandboxExe[\"stream\"]> =>\n\t(command, opts) =>\n\t\tStream.unwrap(\n\t\t\tacquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(\n\t\t\t\tEffect.map((cmd) => {\n\t\t\t\t\tconst logs = Stream.fromAsyncIterable(\n\t\t\t\t\t\tclosable(cmd.logs()),\n\t\t\t\t\t\t(cause) => new ShellError({ command, cause }),\n\t\t\t\t\t).pipe(Stream.map((log): ExecChunk => ({ _tag: log.stream, bytes: utf8.encode(log.data) })));\n\t\t\t\t\tconst exit = Stream.fromEffect(\n\t\t\t\t\t\tEffect.tryPromise({ try: () => cmd.wait(), catch: (cause) => new ShellError({ command, cause }) }),\n\t\t\t\t\t).pipe(Stream.map((finished): ExecChunk => ({ _tag: \"exit\", exitCode: finished.exitCode })));\n\t\t\t\t\treturn Stream.concat(logs, exit);\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\nconst filesystemLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxFileSystem.Service,\n\t\tEffect.map(Remote, ({ sandbox }) =>\n\t\t\tSandboxFileSystem.fromProvider(\n\t\t\t\tRemoteFileSystem.make(\n\t\t\t\t\tproviderFrom(sandbox, options),\n\t\t\t\t\toptions.cwd === undefined ? undefined : { cwd: options.cwd },\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t);\n\nconst shellLayer = (options: Options) =>\n\tLayer.effect(\n\t\tShell,\n\t\tEffect.map(Remote, ({ sandbox }) =>\n\t\t\tShell.of({\n\t\t\t\texec: exec(sandbox, options),\n\t\t\t\texecArgv: execArgv(sandbox, options),\n\t\t\t\tstream: stream(sandbox, options),\n\t\t\t}),\n\t\t),\n\t);\n\n/**\n * Cwd-neutral IO attachment for a lifecycle driver.\n *\n * The controller binds a cwd per mount, so neither filesystem nor shell stores\n * one here. The returned layer owns no provider resource and has no deletion\n * finalizer.\n */\nexport const transport = (\n\tsandbox: RemoteSandbox,\n\toptions: Pick<Options, \"execTimeout\"> = {},\n): Layer.Layer<SandboxFileSystem.Service | Shell> =>\n\tLayer.merge(\n\t\tLayer.succeed(\n\t\t\tSandboxFileSystem.Service,\n\t\t\tSandboxFileSystem.fromProvider(RemoteFileSystem.make(providerFrom(sandbox, options))),\n\t\t),\n\t\tLayer.succeed(\n\t\t\tShell,\n\t\t\tShell.of({\n\t\t\t\texec: exec(sandbox, options),\n\t\t\t\texecArgv: execArgv(sandbox, options),\n\t\t\t\tstream: stream(sandbox, options),\n\t\t\t}),\n\t\t),\n\t);\n\n// Vercel's locator is the sandbox name. See `SandboxResource` for why this is a\n// shared tag rather than a Vercel-specific one.\nconst resourceLayer = Layer.effect(\n\tSandboxResource.Service,\n\tEffect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.name })),\n);\n\n// Identity is per remote sandbox, not per provider: two sandboxes both rooted at\n// the same directory must not share persisted directory records.\n//\n// The id is minted here only when the caller names none. A durable id is the\n// control plane's to mint and record — deriving one from the provider's own\n// locator is what §6.1 forbids — so a caller that needs the namespace to survive\n// a restart passes `instanceId` rather than relying on this.\nconst identityLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxIO.Current,\n\t\tEffect.map(Remote, () =>\n\t\t\tSandboxIO.remote({\n\t\t\t\tdriver: \"vercel\",\n\t\t\t\tid: options.instanceId ?? SandboxInstance.ID.create(),\n\t\t\t\tdefaultCwd: DEFAULT_CWD,\n\t\t\t\tspillPath: SPILL_PATH,\n\t\t\t\t...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n\t\t\t}),\n\t\t),\n\t);\n\n/**\n * A Vercel sandbox provides the runtime filesystem service directly plus the\n * sandbox's native remote shell. It intentionally does not provide VFS: remote\n * filesystems have no synchronous filesystem surface.\n */\nexport const layer = (\n\toptions: Options = {},\n): Layer.Layer<SandboxIO.Provides | SandboxResource.Service, VercelError> => {\n\tconst mounted = { ...options, cwd: SandboxIO.resolveMountCwd(DEFAULT_CWD, options.cwd) };\n\treturn Layer.mergeAll(\n\t\tSandboxIO.withMutation(Layer.mergeAll(filesystemLayer(mounted), shellLayer(mounted), identityLayer(mounted))),\n\t\tresourceLayer,\n\t).pipe(Layer.provide(remote(mounted)));\n};\n\nexport const services = layer;\n","import { Effect, Layer, Option, Schema } from \"effect\";\nimport { SandboxDriver, SandboxInstance, SandboxProvider } from \"../../sandbox.ts\";\nimport * as EnvVercel from \"./provider.ts\";\n\nexport const Options = Schema.Struct({\n\ttoken: Schema.optional(Schema.String),\n\tteamId: Schema.optional(Schema.String),\n\tprojectId: Schema.optional(Schema.String),\n});\nexport type Options = typeof Options.Type;\nexport const ClientOptions = Options;\nexport type ClientOptions = Options;\n\nexport const Source = Schema.Union([\n\tSchema.Struct({\n\t\ttype: Schema.Literal(\"git\"),\n\t\turl: Schema.String,\n\t\trevision: Schema.optional(Schema.String),\n\t\tdepth: Schema.optional(Schema.Finite),\n\t}),\n\tSchema.Struct({\n\t\ttype: Schema.Literal(\"tarball\"),\n\t\turl: Schema.String,\n\t}),\n]);\nexport type Source = typeof Source.Type;\n\nexport const CreateConfig = Schema.Struct({\n\tsnapshot: Schema.optional(Schema.String),\n\tsource: Schema.optional(Source),\n\truntime: Schema.optional(Schema.String),\n\tports: Schema.optional(Schema.Array(Schema.Finite)),\n\tenvVars: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n\tvcpus: Schema.optional(Schema.Finite),\n\ttimeout: Schema.optional(Schema.Finite),\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type CreateConfig = typeof CreateConfig.Type;\n\nexport const RuntimeConfig = Schema.Struct({\n\tdefaultCwd: SandboxDriver.AbsolutePath,\n\tspillPath: Schema.optional(SandboxDriver.AbsolutePath),\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type RuntimeConfig = typeof RuntimeConfig.Type;\n\nconst name = SandboxDriver.Name.make(\"vercel\");\ntype RemoteSandbox = import(\"@vercel/sandbox\").Sandbox;\n\nconst statusFrom = (\n\tstatus: RemoteSandbox[\"status\"],\n): {\n\treadonly status: SandboxInstance.Status;\n\treadonly providerStatus: string;\n} => ({\n\tstatus:\n\t\tstatus === \"stopped\"\n\t\t\t? \"offline\"\n\t\t\t: status === \"stopping\" || status === \"snapshotting\"\n\t\t\t\t? \"suspending\"\n\t\t\t\t: status === \"failed\" || status === \"aborted\"\n\t\t\t\t\t? \"faulted\"\n\t\t\t\t\t: \"online\",\n\tproviderStatus: status,\n});\n\nconst isNotFound = (cause: unknown): boolean => {\n\tif (typeof cause !== \"object\" || cause === null) return false;\n\tconst response = \"response\" in cause && cause.response instanceof Response ? cause.response : undefined;\n\tconst code =\n\t\t\"code\" in cause && typeof cause.code === \"string\"\n\t\t\t? cause.code\n\t\t\t: \"json\" in cause &&\n\t\t\t\t typeof cause.json === \"object\" &&\n\t\t\t\t cause.json !== null &&\n\t\t\t\t \"error\" in cause.json &&\n\t\t\t\t typeof cause.json.error === \"object\" &&\n\t\t\t\t cause.json.error !== null &&\n\t\t\t\t \"code\" in cause.json.error &&\n\t\t\t\t typeof cause.json.error.code === \"string\"\n\t\t\t\t? cause.json.error.code\n\t\t\t\t: undefined;\n\treturn response?.status === 404 || code === \"not_found\" || code === \"sandbox_not_found\";\n};\n\nexport const make = (\n\tclient: ClientOptions = {},\n): SandboxDriver.Driver<CreateConfig, RuntimeConfig> & SandboxDriver.Registration => {\n\tconst credentials = EnvVercel.credentialsFrom(client);\n\tconst redact = SandboxProvider.makeRedactor([client.token ?? \"\"]);\n\n\tconst attempt = <A>(\n\t\toperation: string,\n\t\trun: () => Promise<A>,\n\t): Effect.Effect<A, SandboxProvider.SandboxProviderError> =>\n\t\tEffect.tryPromise({\n\t\t\ttry: run,\n\t\t\tcatch: (cause) =>\n\t\t\t\tSandboxProvider.providerError({\n\t\t\t\t\tdriver: name,\n\t\t\t\t\toperation,\n\t\t\t\t\tcause,\n\t\t\t\t\tredact,\n\t\t\t\t\tsanitize: EnvVercel.sanitizeProviderError,\n\t\t\t\t\tnotFound: isNotFound(cause),\n\t\t\t\t}),\n\t\t});\n\n\tconst get = (providerResourceId: string, resume: boolean, operation: string) =>\n\t\tattempt(operation, () =>\n\t\t\timport(\"@vercel/sandbox\").then(({ Sandbox }) =>\n\t\t\t\tSandbox.get(\n\t\t\t\t\tcredentials === undefined\n\t\t\t\t\t\t? { name: providerResourceId, resume }\n\t\t\t\t\t\t: { ...credentials, name: providerResourceId, resume },\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\tconst observed = (sandbox: RemoteSandbox): SandboxDriver.Observed => ({\n\t\t...statusFrom(sandbox.status),\n\t\tmetadata: {\n\t\t\tcwd: sandbox.cwd,\n\t\t},\n\t});\n\n\treturn SandboxDriver.driver({\n\t\tname,\n\t\tkind: \"remote\",\n\t\tcapabilities: {\n\t\t\tinspect: true,\n\t\t\treattach: true,\n\t\t\twake: true,\n\t\t\tstop: true,\n\t\t\tdestroy: true,\n\t\t\tcancels: true,\n\t\t},\n\t\tcreateConfigCodec: CreateConfig,\n\t\truntimeConfigCodec: RuntimeConfig,\n\t\tcreate: ({ instanceId, config }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst source =\n\t\t\t\t\tconfig.source?.type === \"git\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: \"git\" as const,\n\t\t\t\t\t\t\t\turl: config.source.url,\n\t\t\t\t\t\t\t\t...(config.source.revision === undefined ? {} : { revision: config.source.revision }),\n\t\t\t\t\t\t\t\t...(config.source.depth === undefined ? {} : { depth: config.source.depth }),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: config.source;\n\t\t\t\tconst sandbox = yield* attempt(\"create\", () =>\n\t\t\t\t\tEnvVercel.createSandbox(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...client,\n\t\t\t\t\t\t\t...(config.snapshot === undefined ? {} : { snapshot: config.snapshot }),\n\t\t\t\t\t\t\t...(source === undefined ? {} : { source }),\n\t\t\t\t\t\t\t...(config.runtime === undefined ? {} : { runtime: config.runtime }),\n\t\t\t\t\t\t\t...(config.ports === undefined ? {} : { ports: [...config.ports] }),\n\t\t\t\t\t\t\t...(config.envVars === undefined ? {} : { envVars: config.envVars }),\n\t\t\t\t\t\t\t...(config.vcpus === undefined ? {} : { vcpus: config.vcpus }),\n\t\t\t\t\t\t\t...(config.timeout === undefined ? {} : { timeout: config.timeout }),\n\t\t\t\t\t\t\t...(config.execTimeout === undefined ? {} : { execTimeout: config.execTimeout }),\n\t\t\t\t\t\t\ttags: {\n\t\t\t\t\t\t\t\t\"codework-instance\": instanceId,\n\t\t\t\t\t\t\t\t\"codework-managed\": \"true\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcredentials,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst state = statusFrom(sandbox.status);\n\t\t\t\treturn {\n\t\t\t\t\tproviderResourceId: sandbox.name,\n\t\t\t\t\tproviderStatus: state.providerStatus,\n\t\t\t\t\truntimeConfig: {\n\t\t\t\t\t\tdefaultCwd: SandboxDriver.AbsolutePath.make(sandbox.cwd || EnvVercel.DEFAULT_CWD),\n\t\t\t\t\t\tspillPath: SandboxDriver.AbsolutePath.make(EnvVercel.SPILL_PATH),\n\t\t\t\t\t\t...(config.execTimeout === undefined ? {} : { execTimeout: config.execTimeout }),\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tcwd: sandbox.cwd,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\truntimeConfigFor: ({ providerResourceId, overrides }) =>\n\t\t\tEffect.map(get(providerResourceId, false, \"runtimeConfigFor\"), (sandbox) => ({\n\t\t\t\tdefaultCwd: overrides?.defaultCwd ?? SandboxDriver.AbsolutePath.make(sandbox.cwd || EnvVercel.DEFAULT_CWD),\n\t\t\t\tspillPath: overrides?.spillPath ?? SandboxDriver.AbsolutePath.make(EnvVercel.SPILL_PATH),\n\t\t\t\t...(overrides?.execTimeout === undefined ? {} : { execTimeout: overrides.execTimeout }),\n\t\t\t})),\n\t\tattach: (input) =>\n\t\t\tLayer.unwrap(\n\t\t\t\tEffect.map(\n\t\t\t\t\tget(\n\t\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"attach\",\n\t\t\t\t\t),\n\t\t\t\t\t(sandbox) =>\n\t\t\t\t\t\tEnvVercel.transport(\n\t\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\t\tinput.runtimeConfig.execTimeout === undefined\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: { execTimeout: input.runtimeConfig.execTimeout },\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\tinspect: (input) =>\n\t\t\tEffect.map(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"inspect\",\n\t\t\t\t),\n\t\t\t\tobserved,\n\t\t\t),\n\t\twake: (input) =>\n\t\t\tEffect.map(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"wake\",\n\t\t\t\t),\n\t\t\t\tobserved,\n\t\t\t),\n\t\tstop: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"stop\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"stop\", () => sandbox.stop()).pipe(Effect.map(() => observed(sandbox))),\n\t\t\t),\n\t\tdestroy: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"destroy\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"destroy\", () => sandbox.delete()),\n\t\t\t),\n\t});\n};\n\nconst sandbox = SandboxDriver.module({\n\tapiVersion: SandboxDriver.apiVersion,\n\tname,\n\toptions: Options,\n\tmake,\n});\n\nexport const config = (value: CreateConfig) => ({ driver: \"vercel\" as const, config: value });\n\nexport default sandbox;\n"],"mappings":"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"}