@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.
Files changed (69) hide show
  1. package/CHANGELOG.md +474 -0
  2. package/LICENSE.md +110 -0
  3. package/README.md +148 -0
  4. package/dist/backends/aci-standby-pool/index.d.ts +104 -0
  5. package/dist/backends/aci-standby-pool/index.d.ts.map +1 -0
  6. package/dist/backends/aci-standby-pool/index.js +425 -0
  7. package/dist/backends/aci-standby-pool/index.js.map +1 -0
  8. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts +40 -0
  9. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts.map +1 -0
  10. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js +157 -0
  11. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js.map +1 -0
  12. package/dist/backends/docker/index.d.ts +118 -0
  13. package/dist/backends/docker/index.d.ts.map +1 -0
  14. package/dist/backends/docker/index.js +645 -0
  15. package/dist/backends/docker/index.js.map +1 -0
  16. package/dist/backends/firecracker/__tests__/backend.test.d.ts +13 -0
  17. package/dist/backends/firecracker/__tests__/backend.test.d.ts.map +1 -0
  18. package/dist/backends/firecracker/__tests__/backend.test.js +353 -0
  19. package/dist/backends/firecracker/__tests__/backend.test.js.map +1 -0
  20. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts +19 -0
  21. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts.map +1 -0
  22. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js +201 -0
  23. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js.map +1 -0
  24. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts +39 -0
  25. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts.map +1 -0
  26. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js +149 -0
  27. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js.map +1 -0
  28. package/dist/backends/firecracker/__tests__/protocol.test.d.ts +6 -0
  29. package/dist/backends/firecracker/__tests__/protocol.test.d.ts.map +1 -0
  30. package/dist/backends/firecracker/__tests__/protocol.test.js +77 -0
  31. package/dist/backends/firecracker/__tests__/protocol.test.js.map +1 -0
  32. package/dist/backends/firecracker/__tests__/transport.test.d.ts +20 -0
  33. package/dist/backends/firecracker/__tests__/transport.test.d.ts.map +1 -0
  34. package/dist/backends/firecracker/__tests__/transport.test.js +449 -0
  35. package/dist/backends/firecracker/__tests__/transport.test.js.map +1 -0
  36. package/dist/backends/firecracker/index.d.ts +124 -0
  37. package/dist/backends/firecracker/index.d.ts.map +1 -0
  38. package/dist/backends/firecracker/index.js +334 -0
  39. package/dist/backends/firecracker/index.js.map +1 -0
  40. package/dist/backends/firecracker/protocol.d.ts +132 -0
  41. package/dist/backends/firecracker/protocol.d.ts.map +1 -0
  42. package/dist/backends/firecracker/protocol.js +112 -0
  43. package/dist/backends/firecracker/protocol.js.map +1 -0
  44. package/dist/backends/firecracker/transport.d.ts +251 -0
  45. package/dist/backends/firecracker/transport.d.ts.map +1 -0
  46. package/dist/backends/firecracker/transport.js +524 -0
  47. package/dist/backends/firecracker/transport.js.map +1 -0
  48. package/dist/index.d.ts +611 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +376 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/index.test.d.ts +28 -0
  53. package/dist/index.test.d.ts.map +1 -0
  54. package/dist/index.test.js +670 -0
  55. package/dist/index.test.js.map +1 -0
  56. package/package.json +54 -0
  57. package/src/backends/aci-standby-pool/index.ts +602 -0
  58. package/src/backends/docker/__tests__/leaf-permissions.smoke.test.ts +169 -0
  59. package/src/backends/docker/index.ts +826 -0
  60. package/src/backends/firecracker/__tests__/backend.test.ts +418 -0
  61. package/src/backends/firecracker/__tests__/control-plane-mtls.test.ts +253 -0
  62. package/src/backends/firecracker/__tests__/fixtures/mtls-pki.ts +166 -0
  63. package/src/backends/firecracker/__tests__/protocol.test.ts +90 -0
  64. package/src/backends/firecracker/__tests__/transport.test.ts +526 -0
  65. package/src/backends/firecracker/index.ts +528 -0
  66. package/src/backends/firecracker/protocol.ts +191 -0
  67. package/src/backends/firecracker/transport.ts +667 -0
  68. package/src/index.test.ts +731 -0
  69. 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"}