@namzu/sandbox 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +474 -0
- package/LICENSE.md +110 -0
- package/README.md +148 -0
- package/dist/backends/aci-standby-pool/index.d.ts +104 -0
- package/dist/backends/aci-standby-pool/index.d.ts.map +1 -0
- package/dist/backends/aci-standby-pool/index.js +425 -0
- package/dist/backends/aci-standby-pool/index.js.map +1 -0
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts +40 -0
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts.map +1 -0
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js +157 -0
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js.map +1 -0
- package/dist/backends/docker/index.d.ts +118 -0
- package/dist/backends/docker/index.d.ts.map +1 -0
- package/dist/backends/docker/index.js +645 -0
- package/dist/backends/docker/index.js.map +1 -0
- package/dist/backends/firecracker/__tests__/backend.test.d.ts +13 -0
- package/dist/backends/firecracker/__tests__/backend.test.d.ts.map +1 -0
- package/dist/backends/firecracker/__tests__/backend.test.js +353 -0
- package/dist/backends/firecracker/__tests__/backend.test.js.map +1 -0
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts +19 -0
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts.map +1 -0
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js +201 -0
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js.map +1 -0
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts +39 -0
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts.map +1 -0
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js +149 -0
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js.map +1 -0
- package/dist/backends/firecracker/__tests__/protocol.test.d.ts +6 -0
- package/dist/backends/firecracker/__tests__/protocol.test.d.ts.map +1 -0
- package/dist/backends/firecracker/__tests__/protocol.test.js +77 -0
- package/dist/backends/firecracker/__tests__/protocol.test.js.map +1 -0
- package/dist/backends/firecracker/__tests__/transport.test.d.ts +20 -0
- package/dist/backends/firecracker/__tests__/transport.test.d.ts.map +1 -0
- package/dist/backends/firecracker/__tests__/transport.test.js +449 -0
- package/dist/backends/firecracker/__tests__/transport.test.js.map +1 -0
- package/dist/backends/firecracker/index.d.ts +124 -0
- package/dist/backends/firecracker/index.d.ts.map +1 -0
- package/dist/backends/firecracker/index.js +334 -0
- package/dist/backends/firecracker/index.js.map +1 -0
- package/dist/backends/firecracker/protocol.d.ts +132 -0
- package/dist/backends/firecracker/protocol.d.ts.map +1 -0
- package/dist/backends/firecracker/protocol.js +112 -0
- package/dist/backends/firecracker/protocol.js.map +1 -0
- package/dist/backends/firecracker/transport.d.ts +251 -0
- package/dist/backends/firecracker/transport.d.ts.map +1 -0
- package/dist/backends/firecracker/transport.js +524 -0
- package/dist/backends/firecracker/transport.js.map +1 -0
- package/dist/index.d.ts +611 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +376 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +28 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +670 -0
- package/dist/index.test.js.map +1 -0
- package/package.json +54 -0
- package/src/backends/aci-standby-pool/index.ts +602 -0
- package/src/backends/docker/__tests__/leaf-permissions.smoke.test.ts +169 -0
- package/src/backends/docker/index.ts +826 -0
- package/src/backends/firecracker/__tests__/backend.test.ts +418 -0
- package/src/backends/firecracker/__tests__/control-plane-mtls.test.ts +253 -0
- package/src/backends/firecracker/__tests__/fixtures/mtls-pki.ts +166 -0
- package/src/backends/firecracker/__tests__/protocol.test.ts +90 -0
- package/src/backends/firecracker/__tests__/transport.test.ts +526 -0
- package/src/backends/firecracker/index.ts +528 -0
- package/src/backends/firecracker/protocol.ts +191 -0
- package/src/backends/firecracker/transport.ts +667 -0
- package/src/index.test.ts +731 -0
- package/src/index.ts +930 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @namzu/sandbox — pluggable sandbox provider for @namzu/sdk.
|
|
3
|
+
*
|
|
4
|
+
* The SDK already declares a `SandboxProvider` shape in
|
|
5
|
+
* `@namzu/sdk` (`packages/sdk/src/types/sandbox/index.ts`). This
|
|
6
|
+
* package implements that shape with concrete BACKENDS picked at
|
|
7
|
+
* construction time. The set is aligned with the 2026 industrial
|
|
8
|
+
* standard for AI-agent code-execution sandboxes:
|
|
9
|
+
*
|
|
10
|
+
* • `docker` — plain OCI container per task, seccomp default
|
|
11
|
+
* profile, tmpfs workdir, no-network-by-default. The universal
|
|
12
|
+
* fallback every namzu host gets locally with `docker compose`
|
|
13
|
+
* and on every Linux replica in any cloud. What Northflank /
|
|
14
|
+
* Railway / Render / Compass-platform / GitHub Actions runners
|
|
15
|
+
* actually ship for code execution. Trust boundary: namespaces.
|
|
16
|
+
*
|
|
17
|
+
* • `e2b` — adapter for E2B's managed Firecracker microVM service
|
|
18
|
+
* (`e2b.dev`). Sub-second cold-start via snapshot/restore, full
|
|
19
|
+
* kernel-level trust boundary. The SaaS-friendly path to real
|
|
20
|
+
* Firecracker isolation without running our own scheduler.
|
|
21
|
+
*
|
|
22
|
+
* • `fly-machines` — adapter for Fly Machines (`fly.io/docs/machines`).
|
|
23
|
+
* Also Firecracker microVMs; closer to bare-metal control than
|
|
24
|
+
* E2B, useful when the workload is more "arbitrary tool calls"
|
|
25
|
+
* than "Python REPL".
|
|
26
|
+
*
|
|
27
|
+
* • `firecracker` — self-hosted `firecracker-containerd` on bare
|
|
28
|
+
* metal (or KVM-enabled cloud instance). For hosts that need
|
|
29
|
+
* Firecracker isolation AND insist on running the scheduler
|
|
30
|
+
* themselves. Tier 3 isolation, highest operational cost.
|
|
31
|
+
*
|
|
32
|
+
* • `gvisor` — adapter for `runsc` runtime (Google's userspace
|
|
33
|
+
* kernel). What OpenAI Code Interpreter and Modal Labs ship.
|
|
34
|
+
* Trusted-tenant tier with near-zero cold-start; runs on
|
|
35
|
+
* commodity Linux without nested virt. Locally via Linux Docker
|
|
36
|
+
* runtime; not available on macOS Docker Desktop.
|
|
37
|
+
*
|
|
38
|
+
* • `passthrough` — no isolation, runs commands directly. For
|
|
39
|
+
* tests and trusted environments only. Off by default; opt-in.
|
|
40
|
+
*
|
|
41
|
+
* **What we deliberately do NOT build** is yet-another Firecracker
|
|
42
|
+
* scheduler — that is E2B's and Fly's entire product, and writing
|
|
43
|
+
* our own is a years-long detour. We adapt to theirs.
|
|
44
|
+
*
|
|
45
|
+
* **Cloud portability:** the backend interface is cloud-agnostic.
|
|
46
|
+
* `docker` works on every cloud; `e2b` and `fly-machines` are
|
|
47
|
+
* managed services not tied to any cloud; `firecracker` and
|
|
48
|
+
* `gvisor` need infrastructure the host chooses (GKE Sandbox, AWS
|
|
49
|
+
* Fargate, self-hosted KVM, etc.). Picking a stronger backend may
|
|
50
|
+
* imply moving cloud — that's the host's call, not the SDK's.
|
|
51
|
+
*
|
|
52
|
+
* **Local dev story:** Phase 1 (`docker`) runs everywhere. Phase 2
|
|
53
|
+
* (`e2b` / `fly-machines`) hits the managed service from a dev
|
|
54
|
+
* laptop with no infra setup. Phase 3 (`firecracker` / `gvisor`)
|
|
55
|
+
* needs Lima/Colima on macOS or native KVM on Linux — only the
|
|
56
|
+
* adversarial-multi-tenant prod path needs that and it's clearly
|
|
57
|
+
* documented as such.
|
|
58
|
+
*
|
|
59
|
+
* This file is the public surface. Concrete backend implementations
|
|
60
|
+
* land under `./backends/<kind>/` in subsequent commits — the
|
|
61
|
+
* `SandboxBackend` interface here is the contract they implement.
|
|
62
|
+
*
|
|
63
|
+
* Refs: `e2b.dev/docs/sandbox`, `fly.io/docs/machines`,
|
|
64
|
+
* `firecracker-microvm.github.io`, `gvisor.dev/docs`,
|
|
65
|
+
* `cloud.google.com/kubernetes-engine/docs/concepts/sandbox-pods`,
|
|
66
|
+
* `aws.amazon.com/blogs/aws/firecracker-lightweight-virtualization-for-serverless-computing`.
|
|
67
|
+
*/
|
|
68
|
+
import { buildAciStandbyPoolBackend } from './backends/aci-standby-pool/index.js';
|
|
69
|
+
import { buildDockerBackend, resolveLayout } from './backends/docker/index.js';
|
|
70
|
+
import { buildFirecrackerBackend } from './backends/firecracker/index.js';
|
|
71
|
+
// Re-export the default container-path constants the prompt-template
|
|
72
|
+
// generator side wants to import without also depending on
|
|
73
|
+
// `@namzu/sdk` directly. Single source of truth: a Vandal prompt
|
|
74
|
+
// saying "write outputs to `/mnt/user-data/outputs`" imports
|
|
75
|
+
// `SANDBOX_DEFAULT_OUTPUTS_PATH` instead of hard-coding the string.
|
|
76
|
+
export { SANDBOX_DEFAULT_OUTPUTS_PATH, SANDBOX_DEFAULT_SKILLS_PARENT, SANDBOX_DEFAULT_TOOL_RESULTS_PATH, SANDBOX_DEFAULT_TRANSCRIPTS_PATH, SANDBOX_DEFAULT_UPLOADS_PATH, } from '@namzu/sdk';
|
|
77
|
+
export { VsockAgentTransport, } from './backends/firecracker/transport.js';
|
|
78
|
+
/**
|
|
79
|
+
* Build a {@link SandboxProvider} the SDK can wire into
|
|
80
|
+
* `drainQuery`'s `sandboxProvider` field. Selects the backend at
|
|
81
|
+
* construction time; subsequent `provider.create()` calls all use
|
|
82
|
+
* the chosen backend.
|
|
83
|
+
*
|
|
84
|
+
* Backends are loaded lazily — the package only imports the
|
|
85
|
+
* platform-specific modules (Anthropic's sandbox-runtime, the
|
|
86
|
+
* Docker SDK, the E2B SDK, …) when the corresponding backend is
|
|
87
|
+
* requested. That keeps `@namzu/sandbox` reasonable to install in
|
|
88
|
+
* environments where one backend is genuinely impossible.
|
|
89
|
+
*
|
|
90
|
+
* **Not implemented in this commit** — this file declares the
|
|
91
|
+
* surface; backends arrive in subsequent commits per the ses_004
|
|
92
|
+
* phase plan:
|
|
93
|
+
*
|
|
94
|
+
* - **P3.1** — `container` (docker runtime). Phase 1: ship now.
|
|
95
|
+
* - **P3.2** — `EgressPolicy` plumbing + reference egress proxy.
|
|
96
|
+
* - **P3.3** — `microvm` (E2B + Fly Machines adapters). Phase 2.
|
|
97
|
+
* - **P3.4** — `process` (Anthropic sandbox-runtime adapter).
|
|
98
|
+
* - **P3.5** — `microvm` (self-hosted firecracker-containerd) +
|
|
99
|
+
* `container` (gVisor runtime). Phase 3 adversarial-multi-tenant.
|
|
100
|
+
*
|
|
101
|
+
* Calling this function now throws
|
|
102
|
+
* {@link SandboxBackendNotImplementedError} so consumers get a
|
|
103
|
+
* clear signal during the staged rollout.
|
|
104
|
+
*/
|
|
105
|
+
export function createSandboxProvider(config) {
|
|
106
|
+
const backend = pickBackend(config);
|
|
107
|
+
const id = `namzu-${backend.tier}-${backend.name}`;
|
|
108
|
+
const name = `@namzu/sandbox: ${describeBackend(config.backend)}`;
|
|
109
|
+
return {
|
|
110
|
+
id,
|
|
111
|
+
name,
|
|
112
|
+
environment: 'basic',
|
|
113
|
+
async create(perCall) {
|
|
114
|
+
return await backend.create({
|
|
115
|
+
workingDirectory: perCall?.workingDirectory ?? '/workspace',
|
|
116
|
+
...(config.defaultEgress !== undefined ? { egress: config.defaultEgress } : {}),
|
|
117
|
+
...(perCall?.timeoutMs !== undefined
|
|
118
|
+
? { timeoutMs: perCall.timeoutMs }
|
|
119
|
+
: config.defaultTimeoutMs !== undefined
|
|
120
|
+
? { timeoutMs: config.defaultTimeoutMs }
|
|
121
|
+
: {}),
|
|
122
|
+
...(perCall?.memoryLimitMb !== undefined
|
|
123
|
+
? { memoryLimitMb: perCall.memoryLimitMb }
|
|
124
|
+
: config.defaultMemoryLimitMb !== undefined
|
|
125
|
+
? { memoryLimitMb: config.defaultMemoryLimitMb }
|
|
126
|
+
: {}),
|
|
127
|
+
...(perCall?.maxProcesses !== undefined
|
|
128
|
+
? { maxProcesses: perCall.maxProcesses }
|
|
129
|
+
: config.defaultMaxProcesses !== undefined
|
|
130
|
+
? { maxProcesses: config.defaultMaxProcesses }
|
|
131
|
+
: {}),
|
|
132
|
+
...(perCall?.env !== undefined ? { env: perCall.env } : {}),
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function pickBackend(config) {
|
|
138
|
+
const backend = config.backend;
|
|
139
|
+
if (backend.tier === 'container' && (backend.runtime ?? 'docker') === 'docker') {
|
|
140
|
+
// `layout` is required for container-tier backends by the
|
|
141
|
+
// discriminated union — narrow safely without a non-null
|
|
142
|
+
// assertion.
|
|
143
|
+
const layout = config
|
|
144
|
+
.layout;
|
|
145
|
+
// Resolve once at construction. Validation throws synchronously
|
|
146
|
+
// here, before the provider is returned, so any layout error
|
|
147
|
+
// surfaces during host wiring rather than mid-run.
|
|
148
|
+
const resolved = resolveLayout(layout);
|
|
149
|
+
return buildDockerBackend({
|
|
150
|
+
image: backend.image,
|
|
151
|
+
layout: resolved,
|
|
152
|
+
...(backend.hostReachability !== undefined
|
|
153
|
+
? { hostReachability: backend.hostReachability }
|
|
154
|
+
: {}),
|
|
155
|
+
...(backend.network !== undefined ? { network: backend.network } : {}),
|
|
156
|
+
...(backend.labels !== undefined ? { labels: backend.labels } : {}),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (backend.tier === 'container' &&
|
|
160
|
+
backend.runtime === 'aci-standby-pool') {
|
|
161
|
+
const aciBackend = backend;
|
|
162
|
+
const layout = config
|
|
163
|
+
.layout;
|
|
164
|
+
const resolved = resolveLayout(layout);
|
|
165
|
+
return buildAciStandbyPoolBackend({
|
|
166
|
+
subscriptionId: aciBackend.subscriptionId,
|
|
167
|
+
resourceGroup: aciBackend.resourceGroup,
|
|
168
|
+
location: aciBackend.location,
|
|
169
|
+
standbyPoolResourceId: aciBackend.standbyPoolResourceId,
|
|
170
|
+
containerGroupProfileResourceId: aciBackend.containerGroupProfileResourceId,
|
|
171
|
+
...(aciBackend.containerGroupProfileRevision !== undefined
|
|
172
|
+
? { containerGroupProfileRevision: aciBackend.containerGroupProfileRevision }
|
|
173
|
+
: {}),
|
|
174
|
+
layout: resolved,
|
|
175
|
+
getArmToken: aciBackend.getArmToken,
|
|
176
|
+
...(aciBackend.subnetId !== undefined ? { subnetId: aciBackend.subnetId } : {}),
|
|
177
|
+
...(aciBackend.readyPollIntervalMs !== undefined
|
|
178
|
+
? { readyPollIntervalMs: aciBackend.readyPollIntervalMs }
|
|
179
|
+
: {}),
|
|
180
|
+
...(aciBackend.readyTimeoutMs !== undefined
|
|
181
|
+
? { readyTimeoutMs: aciBackend.readyTimeoutMs }
|
|
182
|
+
: {}),
|
|
183
|
+
...(aciBackend.workerPort !== undefined ? { workerPort: aciBackend.workerPort } : {}),
|
|
184
|
+
...(aciBackend.armApiVersion !== undefined
|
|
185
|
+
? { armApiVersion: aciBackend.armApiVersion }
|
|
186
|
+
: {}),
|
|
187
|
+
...(aciBackend.containerNamePrefix !== undefined
|
|
188
|
+
? { containerNamePrefix: aciBackend.containerNamePrefix }
|
|
189
|
+
: {}),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
if (backend.tier === 'container' && backend.runtime === 'runsc') {
|
|
193
|
+
const layout = config
|
|
194
|
+
.layout;
|
|
195
|
+
const resolved = resolveLayout(layout);
|
|
196
|
+
return buildDockerBackend({
|
|
197
|
+
image: backend.image,
|
|
198
|
+
layout: resolved,
|
|
199
|
+
runtime: 'runsc',
|
|
200
|
+
...(backend.hostReachability !== undefined
|
|
201
|
+
? { hostReachability: backend.hostReachability }
|
|
202
|
+
: {}),
|
|
203
|
+
...(backend.network !== undefined ? { network: backend.network } : {}),
|
|
204
|
+
...(backend.labels !== undefined ? { labels: backend.labels } : {}),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// `microvm:self-hosted` targeting the OWNED Azure Firecracker
|
|
208
|
+
// orchestrator (ses_051). The presence of `orchestratorEndpoint` +
|
|
209
|
+
// `getToken` distinguishes the owned-platform shape from the legacy
|
|
210
|
+
// local `firecracker-containerd` shape (still unimplemented → throws
|
|
211
|
+
// below). No layout: FC is a remote-copy backend (archive-sync over
|
|
212
|
+
// vsock, like ACI), so it carries no host bind-mount layout.
|
|
213
|
+
if (backend.tier === 'microvm' &&
|
|
214
|
+
backend.service === 'self-hosted' &&
|
|
215
|
+
backend.orchestratorEndpoint !== undefined &&
|
|
216
|
+
backend.getToken !== undefined) {
|
|
217
|
+
return buildFirecrackerBackend({
|
|
218
|
+
orchestratorEndpoint: backend.orchestratorEndpoint,
|
|
219
|
+
getToken: backend.getToken,
|
|
220
|
+
...(backend.template !== undefined ? { template: backend.template } : {}),
|
|
221
|
+
...(backend.agentSnapshot !== undefined ? { agentSnapshot: backend.agentSnapshot } : {}),
|
|
222
|
+
...(backend.agentVsockPort !== undefined ? { agentVsockPort: backend.agentVsockPort } : {}),
|
|
223
|
+
...(backend.readyTimeoutMs !== undefined ? { readyTimeoutMs: backend.readyTimeoutMs } : {}),
|
|
224
|
+
...(backend.readyPollIntervalMs !== undefined
|
|
225
|
+
? { readyPollIntervalMs: backend.readyPollIntervalMs }
|
|
226
|
+
: {}),
|
|
227
|
+
...(backend.mtls !== undefined ? { mtls: backend.mtls } : {}),
|
|
228
|
+
...(backend.controlPlaneMtls !== undefined
|
|
229
|
+
? { controlPlaneMtls: backend.controlPlaneMtls }
|
|
230
|
+
: {}),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
throw new SandboxBackendNotImplementedError(describeBackend(backend));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Human-readable backend label for error messages. Returns the
|
|
237
|
+
* tier plus the concrete service / runtime when present, e.g.
|
|
238
|
+
* `'microvm:e2b'` or `'container:runsc'`.
|
|
239
|
+
*/
|
|
240
|
+
function describeBackend(config) {
|
|
241
|
+
if (config.tier === 'microvm')
|
|
242
|
+
return `microvm:${config.service}`;
|
|
243
|
+
if (config.tier === 'container')
|
|
244
|
+
return `container:${config.runtime ?? 'docker'}`;
|
|
245
|
+
if (config.tier === 'process')
|
|
246
|
+
return `process:${config.engine ?? 'auto'}`;
|
|
247
|
+
return config.tier;
|
|
248
|
+
}
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// Errors
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
/**
|
|
253
|
+
* Thrown by the factory when a backend is requested before its
|
|
254
|
+
* implementation has landed. Makes the staged rollout legible —
|
|
255
|
+
* consumers see exactly which backend is missing rather than a
|
|
256
|
+
* generic `TypeError: foo is not a function`.
|
|
257
|
+
*
|
|
258
|
+
* Subclasses Error so existing host error handling (instanceof
|
|
259
|
+
* checks, JSON.stringify, etc.) keeps working.
|
|
260
|
+
*/
|
|
261
|
+
export class SandboxBackendNotImplementedError extends Error {
|
|
262
|
+
backend;
|
|
263
|
+
name = 'SandboxBackendNotImplementedError';
|
|
264
|
+
constructor(backend) {
|
|
265
|
+
super(`Sandbox backend '${backend}' is not implemented yet. Track progress in vendor/namzu/docs.local/sessions/ses_004-native-agentic-runtime-and-sandbox.`);
|
|
266
|
+
this.backend = backend;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Thrown when a {@link ContainerSandboxLayout} fails validation:
|
|
271
|
+
* missing required `outputs` mount, malformed skill id, duplicate
|
|
272
|
+
* skill id, duplicate `containerPath` across mounts. The `reasons`
|
|
273
|
+
* array carries one entry per violation so consumers can surface
|
|
274
|
+
* every problem in one round-trip rather than fix-then-rerun.
|
|
275
|
+
*
|
|
276
|
+
* **Transport caveat.** `JSON.stringify(err)` works because
|
|
277
|
+
* `toJSON()` returns a plain object with `reasons` preserved. But
|
|
278
|
+
* `structuredClone(err)` on the Error object itself drops the
|
|
279
|
+
* subclass name and any non-enumerable fields. For transport
|
|
280
|
+
* boundaries (postMessage, worker IPC, log shippers) call
|
|
281
|
+
* {@link serializeSandboxError} which returns a plain object that
|
|
282
|
+
* is `structuredClone`-safe and `JSON.stringify`-safe in one shape.
|
|
283
|
+
*/
|
|
284
|
+
export class ContainerSandboxLayoutValidationError extends Error {
|
|
285
|
+
reasons;
|
|
286
|
+
name = 'ContainerSandboxLayoutValidationError';
|
|
287
|
+
constructor(reasons, options) {
|
|
288
|
+
super(`Invalid ContainerSandboxLayout: ${reasons.join('; ')}`, options?.cause !== undefined ? { cause: options.cause } : undefined);
|
|
289
|
+
this.reasons = reasons;
|
|
290
|
+
}
|
|
291
|
+
toJSON() {
|
|
292
|
+
return {
|
|
293
|
+
name: this.name,
|
|
294
|
+
message: this.message,
|
|
295
|
+
reasons: this.reasons,
|
|
296
|
+
...(this.cause !== undefined ? { cause: this.cause } : {}),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Convert a non-Error `cause` value into a typed envelope that is
|
|
302
|
+
* safe through every transport channel. Categorises the input by
|
|
303
|
+
* runtime type so the receiver can tell e.g. "this was a Symbol"
|
|
304
|
+
* apart from "this was a string" without inspecting the message
|
|
305
|
+
* format.
|
|
306
|
+
*/
|
|
307
|
+
function serializeNonErrorCause(value) {
|
|
308
|
+
if (value === null)
|
|
309
|
+
return { name: 'NonError', message: 'null' };
|
|
310
|
+
if (value === undefined)
|
|
311
|
+
return { name: 'NonError', message: 'undefined' };
|
|
312
|
+
if (typeof value === 'function')
|
|
313
|
+
return { name: 'Function', message: '[function]' };
|
|
314
|
+
if (typeof value === 'symbol')
|
|
315
|
+
return { name: 'Symbol', message: value.toString() };
|
|
316
|
+
if (typeof value === 'bigint')
|
|
317
|
+
return { name: 'BigInt', message: value.toString() };
|
|
318
|
+
if (typeof value === 'number' && !Number.isFinite(value)) {
|
|
319
|
+
return { name: 'NonFiniteNumber', message: String(value) };
|
|
320
|
+
}
|
|
321
|
+
if (typeof value === 'string')
|
|
322
|
+
return { name: 'NonError', message: value };
|
|
323
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
324
|
+
return { name: 'NonError', message: String(value) };
|
|
325
|
+
}
|
|
326
|
+
// Plain objects / arrays — JSON-stringify with a fallback so
|
|
327
|
+
// values that contain non-JSON-safe leaves (Symbol-keyed props,
|
|
328
|
+
// BigInt, …) still produce a printable message.
|
|
329
|
+
return { name: 'NonError', message: safeStringify(value) };
|
|
330
|
+
}
|
|
331
|
+
export function serializeSandboxError(err) {
|
|
332
|
+
return serializeWithGuard(err, new WeakSet());
|
|
333
|
+
}
|
|
334
|
+
function serializeWithGuard(err, seen) {
|
|
335
|
+
// Non-Error inputs go through the typed-envelope path. Primitive
|
|
336
|
+
// values can't participate in a cycle so the WeakSet is a no-op
|
|
337
|
+
// for them; object inputs (plain objects, arrays) DO need the
|
|
338
|
+
// cycle guard before `safeStringify` is reached.
|
|
339
|
+
if (!(err instanceof Error)) {
|
|
340
|
+
if (typeof err === 'object' && err !== null) {
|
|
341
|
+
if (seen.has(err))
|
|
342
|
+
return { name: 'CircularReference', message: '[circular]' };
|
|
343
|
+
seen.add(err);
|
|
344
|
+
}
|
|
345
|
+
return serializeNonErrorCause(err);
|
|
346
|
+
}
|
|
347
|
+
if (seen.has(err)) {
|
|
348
|
+
return { name: 'CircularReference', message: '[circular]' };
|
|
349
|
+
}
|
|
350
|
+
seen.add(err);
|
|
351
|
+
const out = {
|
|
352
|
+
name: err.name,
|
|
353
|
+
message: err.message,
|
|
354
|
+
};
|
|
355
|
+
if (err.stack !== undefined)
|
|
356
|
+
out.stack = err.stack;
|
|
357
|
+
if (err instanceof ContainerSandboxLayoutValidationError) {
|
|
358
|
+
out.reasons = err.reasons;
|
|
359
|
+
}
|
|
360
|
+
// Walk the cause chain. The same `seen` set is threaded through
|
|
361
|
+
// the recursion so a cycle detected at any depth replaces the
|
|
362
|
+
// offending node with the sentinel rather than blowing the stack.
|
|
363
|
+
if ('cause' in err && err.cause !== undefined) {
|
|
364
|
+
out.cause = serializeWithGuard(err.cause, seen);
|
|
365
|
+
}
|
|
366
|
+
return out;
|
|
367
|
+
}
|
|
368
|
+
function safeStringify(value) {
|
|
369
|
+
try {
|
|
370
|
+
return JSON.stringify(value);
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return String(value);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioural contract for `createSandboxProvider`, `resolveLayout`,
|
|
3
|
+
* and `renderLayoutMountArgs`:
|
|
4
|
+
*
|
|
5
|
+
* - Builds a `SandboxProvider` for the `container:docker` tier
|
|
6
|
+
* without spawning anything (the container only spawns on
|
|
7
|
+
* `provider.create()`, not at construction time). The provider
|
|
8
|
+
* carries a layout baked in at construction; per-task hosts
|
|
9
|
+
* construct one provider per task.
|
|
10
|
+
* - Throws `SandboxBackendNotImplementedError` for tiers the docker
|
|
11
|
+
* backend has not landed yet, with a label that names the missing
|
|
12
|
+
* tier and concrete service.
|
|
13
|
+
* - Layout validation happens synchronously inside
|
|
14
|
+
* `createSandboxProvider`; `ContainerSandboxLayoutValidationError` exposes
|
|
15
|
+
* a `reasons` array so consumers see every violation in one
|
|
16
|
+
* round-trip.
|
|
17
|
+
* - Every `--volume` source rendered by the docker backend traces
|
|
18
|
+
* back to a layout `hostDir.hostPath` declared by the consumer —
|
|
19
|
+
* pinned here as a regression guard against the old `mkdtemp`-
|
|
20
|
+
* allocated workspace path that hit EACCES in sibling-container
|
|
21
|
+
* deployments.
|
|
22
|
+
*
|
|
23
|
+
* Docker-touching integration tests live under
|
|
24
|
+
* `backends/docker/__tests__/` and skip when `docker` isn't
|
|
25
|
+
* available; this file stays pure-unit.
|
|
26
|
+
*/
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=index.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|