tensorlake 0.5.85 → 0.5.89
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/dist/index.cjs +185 -37
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +116 -36
- package/dist/index.d.ts +116 -36
- package/dist/index.js +185 -37
- package/dist/index.js.map +1 -1
- package/dist/native/darwin-arm64/tensorlake-node.node +0 -0
- package/dist/native/linux-arm64/tensorlake-node.node +0 -0
- package/dist/native/linux-arm64-musl/tensorlake-node.node +0 -0
- package/dist/native/linux-x64/tensorlake-node.node +0 -0
- package/dist/native/linux-x64-musl/tensorlake-node.node +0 -0
- package/dist/native/win32-x64/tensorlake-node.node +0 -0
- package/dist/sandbox-image.cjs +1 -1
- package/dist/sandbox-image.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults.ts","../src/errors.ts","../src/native-sandbox.ts","../src/models.ts","../src/tunnel.ts","../src/desktop.ts","../src/sdk-timings.ts","../src/url.ts","../src/sandbox.ts","../src/client.ts","../src/http.ts","../src/sse.ts","../src/cloud-client.ts","../src/image.ts","../src/sandbox-image.ts","../src/index.ts","../src/api-client.ts","../src/repositories.ts","../src/file-system.ts","../src/filesystem.ts","../src/filesystem-models.ts"],"sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION: string = __SDK_VERSION__;\n\nexport const API_URL =\n process.env.TENSORLAKE_API_URL ?? \"https://api.tensorlake.ai\";\nexport const API_KEY = process.env.TENSORLAKE_API_KEY ?? undefined;\nexport const NAMESPACE = process.env.INDEXIFY_NAMESPACE ?? \"default\";\nexport const SANDBOX_PROXY_URL =\n process.env.TENSORLAKE_SANDBOX_PROXY_URL ?? \"https://sandbox.tensorlake.ai\";\n\nexport const DEFAULT_HTTP_TIMEOUT_MS = 300_000;\nexport const MAX_RETRIES = 3;\nexport const RETRY_BACKOFF_MS = 500;\nexport const RETRYABLE_STATUS_CODES = new Set([429, 502, 503, 504]);\n","/** Base exception for all sandbox-related errors. */\nexport class SandboxException extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SandboxException\";\n }\n}\n\n/** General sandbox operation error. */\nexport class SandboxError extends SandboxException {\n constructor(message: string) {\n super(message);\n this.name = \"SandboxError\";\n }\n}\n\n/**\n * Raised when the client cannot complete a request against the API server.\n *\n * The original transport error (typically undici's `TypeError: fetch failed`,\n * whose real reason — `ECONNREFUSED`, `UND_ERR_CONNECT_TIMEOUT`, `EMFILE`, … —\n * lives in `.cause`) is preserved on this error's {@link cause} for programmatic\n * inspection, and its full chain is folded into the message so it survives\n * wrappers that only forward `error.message`. No interpretation of the failure\n * (client vs server) is applied — the raw inner error is surfaced as-is so the\n * reader can judge.\n */\nexport class SandboxConnectionError extends SandboxError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(`Connection error: ${message}`);\n this.name = \"SandboxConnectionError\";\n if (options?.cause !== undefined) this.cause = options.cause;\n }\n}\n\n/**\n * Flatten an error and its `cause` chain into a single readable line, appending\n * each level's `code` when it is not already present in the message. undici\n * reports `fetch failed` at the top and the real reason one or more levels down\n * in `.cause`, so this surfaces the part that actually identifies the failure.\n *\n * @example \"fetch failed: connect ECONNREFUSED 10.0.0.1:443\"\n * @example \"fetch failed: Connect Timeout Error (UND_ERR_CONNECT_TIMEOUT)\"\n */\nexport function describeError(err: unknown): string {\n const parts: string[] = [];\n const seen = new Set<unknown>();\n let current: unknown = err;\n\n for (let depth = 0; depth < 6; depth++) {\n if (current == null || typeof current !== \"object\" || seen.has(current)) {\n break;\n }\n seen.add(current);\n const e = current as { message?: unknown; code?: unknown; cause?: unknown };\n const message = typeof e.message === \"string\" ? e.message.trim() : \"\";\n const code = typeof e.code === \"string\" ? e.code : undefined;\n\n let segment = message;\n if (code && (!message || !message.includes(code))) {\n segment = segment ? `${segment} (${code})` : code;\n }\n if (segment && !parts.includes(segment)) parts.push(segment);\n\n current = e.cause;\n }\n\n if (parts.length > 0) return parts.join(\": \");\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Raised when a sandbox is not found. */\nexport class SandboxNotFoundError extends SandboxError {\n readonly sandboxId: string;\n\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`);\n this.name = \"SandboxNotFoundError\";\n this.sandboxId = sandboxId;\n }\n}\n\n/** Raised when a sandbox pool is not found. */\nexport class PoolNotFoundError extends SandboxError {\n readonly poolId: string;\n\n constructor(poolId: string) {\n super(`Sandbox pool not found: ${poolId}`);\n this.name = \"PoolNotFoundError\";\n this.poolId = poolId;\n }\n}\n\n/** Raised when attempting to delete a pool that is in use. */\nexport class PoolInUseError extends SandboxError {\n readonly poolId: string;\n\n constructor(poolId: string, message?: string) {\n const base = `Cannot delete pool ${poolId}: pool is in use`;\n super(message ? `${base} - ${message}` : base);\n this.name = \"PoolInUseError\";\n this.poolId = poolId;\n }\n}\n\n/** Raised when the remote API returns an error. */\nexport class RemoteAPIError extends SandboxError {\n readonly statusCode: number;\n readonly responseMessage: string;\n\n constructor(statusCode: number, message: string) {\n super(`API error (status ${statusCode}): ${message}`);\n this.name = \"RemoteAPIError\";\n this.statusCode = statusCode;\n this.responseMessage = message;\n }\n}\n\n/** Raised when request output is fetched before the request has completed. */\nexport class RequestNotFinishedError extends Error {\n constructor() {\n super(\"Request has not finished yet\");\n this.name = \"RequestNotFinishedError\";\n }\n}\n\n/** Raised when a request completed unsuccessfully. */\nexport class RequestFailedError extends Error {\n readonly failure: string;\n\n constructor(failure: string) {\n super(`Request failed: ${failure}`);\n this.name = \"RequestFailedError\";\n this.failure = failure;\n }\n}\n\n/** Raised when a request surfaced an application-level error. */\nexport class RequestExecutionError extends Error {\n readonly functionName?: string;\n\n constructor(message: string, functionName?: string) {\n super(\n functionName ? `Request error in ${functionName}: ${message}` : message,\n );\n this.name = \"RequestExecutionError\";\n this.functionName = functionName;\n }\n}\n","import { createRequire } from \"node:module\";\nimport {\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxError,\n SandboxNotFoundError,\n} from \"./errors.js\";\n\n/**\n * Bridge to the Rust core's sandbox lifecycle + proxy clients (`napi-rs`).\n *\n * The proxy data path (process/file/stream ops) is served by the Rust core so\n * it shares `reqwest`'s connection pool — replacing the previous undici path,\n * which multiplexed every parallel request onto a single, untuned HTTP/2\n * connection. The native binding is required: there is no JS fallback.\n *\n * Convention (mirrors the Python binding): structured payloads cross as JSON\n * strings, bytes as `Buffer`, and every call surfaces the W3C `traceId`.\n * Errors arrive as a JSON `{category, status, message}` string in the native\n * error message; {@link translateNativeError} rethrows them as the SDK's typed\n * errors.\n */\n\n// ---- Native value shapes --------------------------------------------------\n\nexport interface TracedJson {\n traceId: string;\n json: string;\n}\n\nexport interface TracedBytes {\n traceId: string;\n data: Buffer;\n}\n\nexport interface TracedEvents {\n traceId: string;\n events: string[];\n}\n\n/** Per-event callback used by the streaming proxy methods. */\nexport type NativeEmit = (eventJson: string) => void;\n\nexport interface NativeSandboxProxyClient {\n baseUrl(): string;\n\n startProcess(payloadJson: string): Promise<TracedJson>;\n listProcesses(): Promise<TracedJson>;\n // `process` is the pid-or-name path segment (the TS layer stringifies the number|string arg).\n getProcess(process: string): Promise<TracedJson>;\n killProcess(process: string): Promise<string>;\n restartProcess(process: string): Promise<TracedJson>;\n sendSignal(process: string, signal: number): Promise<TracedJson>;\n writeStdin(process: string, data: Buffer): Promise<string>;\n closeStdin(process: string): Promise<string>;\n getStdout(process: string): Promise<TracedJson>;\n getStderr(process: string): Promise<TracedJson>;\n getOutput(process: string): Promise<TracedJson>;\n\n followStdout(process: string, emit: NativeEmit): Promise<string>;\n followStderr(process: string, emit: NativeEmit): Promise<string>;\n followOutput(process: string, emit: NativeEmit): Promise<string>;\n runProcess(payloadJson: string): Promise<TracedEvents>;\n runProcessStreaming(payloadJson: string, emit: NativeEmit): Promise<string>;\n\n readFile(path: string): Promise<TracedBytes>;\n writeFile(path: string, content: Buffer): Promise<string>;\n uploadFile(path: string, localPath: string): Promise<string>;\n deleteFile(path: string): Promise<string>;\n listDirectory(path: string): Promise<TracedJson>;\n\n createPtySession(payloadJson: string): Promise<TracedJson>;\n deletePtySession(sessionId: string): Promise<string>;\n health(): Promise<TracedJson>;\n info(): Promise<TracedJson>;\n}\n\nexport interface NativeSandboxClient {\n createSandbox(requestJson: string): Promise<TracedJson>;\n claimSandbox(poolId: string): Promise<TracedJson>;\n copySandbox(sandboxId: string, times: number): Promise<TracedJson>;\n getSandbox(sandboxId: string): Promise<TracedJson>;\n listSandboxes(): Promise<TracedJson>;\n listArchivedSandboxes(\n limit?: number | null,\n cursor?: string | null,\n direction?: string | null,\n ): Promise<TracedJson>;\n getArchivedSandbox(sandboxId: string): Promise<TracedJson>;\n getSandboxLogs(requestJson: string): Promise<TracedJson>;\n listSandboxLogProcesses(sandboxId: string): Promise<TracedJson>;\n updateSandbox(sandboxId: string, requestJson: string): Promise<TracedJson>;\n deleteSandbox(sandboxId: string): Promise<string>;\n suspendSandbox(sandboxId: string): Promise<string>;\n resumeSandbox(sandboxId: string): Promise<string>;\n attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n ): Promise<TracedJson>;\n detachFileSystem(\n sandboxId: string,\n mountPath: string,\n ): Promise<TracedJson>;\n createSnapshot(\n sandboxId: string,\n snapshotType?: string | null,\n ): Promise<TracedJson>;\n getSnapshot(snapshotId: string): Promise<TracedJson>;\n listSnapshots(): Promise<TracedJson>;\n deleteSnapshot(snapshotId: string): Promise<string>;\n createPool(requestJson: string): Promise<TracedJson>;\n getPool(poolId: string): Promise<TracedJson>;\n listPools(): Promise<TracedJson>;\n updatePool(poolId: string, requestJson: string): Promise<TracedJson>;\n deletePool(poolId: string): Promise<string>;\n\n connectProxy(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxProxyClient;\n selectSandboxProxyUrl(\n sandboxId: string,\n sandboxUrl?: string | null,\n ingressEndpoint?: string | null,\n explicitProxyUrl?: string | null,\n ): string;\n}\n\nexport interface NativeRepositoryClient {\n gitRepoUrl(repo: string): string;\n createRepo(repo: string, defaultBranch?: string | null): Promise<TracedJson>;\n listRepos(): Promise<TracedJson>;\n deleteRepo(repo: string): Promise<string>;\n forkRepo(repo: string, baseRepo: string): Promise<TracedJson>;\n archiveRepo(repo: string): Promise<string>;\n restoreRepo(repo: string): Promise<string>;\n repoInfo(repo: string): Promise<TracedJson>;\n listBranches(repo: string): Promise<TracedJson>;\n listRefs(repo: string): Promise<TracedJson>;\n deleteBranch(repo: string, branch: string): Promise<string>;\n listOperations(repo: string): Promise<TracedJson>;\n gitCredential(repo?: string | null): Promise<string>;\n commitStatus(repo: string, jobId: string): Promise<TracedJson>;\n pushWorktree(\n repo: string,\n root: string,\n branch: string,\n message: string,\n expectOid?: string | null,\n ): Promise<TracedJson>;\n mergeRepo(\n repo: string,\n ours: string,\n theirs: string,\n preflight: boolean,\n deep: boolean,\n materialize: boolean,\n message?: string | null,\n base?: string | null,\n ): Promise<TracedJson>;\n commitConflicts(repo: string, commit: string): Promise<TracedJson>;\n createFilesystem(name: string): Promise<string>;\n listFilesystems(): Promise<TracedJson>;\n filesystemMeta(name: string): Promise<TracedJson>;\n deleteFilesystem(name: string): Promise<string>;\n filesystemRefStatus(name: string, refspec: string): Promise<TracedJson>;\n readFilesystemFile(\n name: string,\n path: string,\n version: string,\n ): Promise<TracedBytes>;\n listFilesystemTree(\n name: string,\n dirPath: string,\n version: string,\n ): Promise<TracedJson>;\n pushFilesystemFiles(\n name: string,\n files: Array<{ path: string; content: Buffer }>,\n deletes: string[],\n message: string,\n branch: string,\n idempotencyKey?: string | null,\n ): Promise<TracedJson>;\n}\n\ninterface NativeSandboxClientCtor {\n new (\n apiUrl: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n namespace?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxClient;\n}\n\ninterface NativeRepositoryClientCtor {\n new (\n apiUrl: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeRepositoryClient;\n}\n\ninterface NativeSandboxProxyClientCtor {\n new (\n proxyUrl: string,\n sandboxId: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n routingHint?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxProxyClient;\n}\n\nexport interface NativeSandboxBinding {\n NativeSandboxClient: NativeSandboxClientCtor;\n NativeSandboxProxyClient: NativeSandboxProxyClientCtor;\n NativeRepositoryClient?: NativeRepositoryClientCtor;\n /** Validate a managed-process name; throws on failure. Single source-of-truth rule in Rust. */\n validateManagedName: (name: string) => void;\n}\n\n// ---- Binding loader -------------------------------------------------------\n\n// `require` exists in the CJS bundle but not in ESM; declared here so the\n// runtime check below typechecks under \"module\": \"esnext\".\ndeclare const require: NodeRequire | undefined;\ndeclare const module: { exports?: unknown } | undefined;\n\nlet cachedBinding: NativeSandboxBinding | undefined;\nlet cachedBindingError: Error | undefined;\n\nfunction resolveRequire(): NodeRequire {\n // tsup rewrites `import.meta.url` in the CJS output; prefer the injected\n // real `require` there and fall back to `createRequire` for ESM. Mirrors\n // the loader in sandbox-image.ts.\n if (\n typeof module !== \"undefined\" &&\n module.exports != null &&\n typeof require !== \"undefined\"\n ) {\n return require;\n }\n return createRequire(import.meta.url);\n}\n\nexport function loadNativeSandboxBinding(): NativeSandboxBinding {\n if (cachedBinding) return cachedBinding;\n if (cachedBindingError) throw cachedBindingError;\n try {\n const { loadNative } = resolveRequire()(\"../lib/runtime.cjs\") as {\n loadNative: () => NativeSandboxBinding;\n };\n const binding = loadNative();\n if (\n binding == null ||\n typeof binding.NativeSandboxClient !== \"function\" ||\n typeof binding.NativeSandboxProxyClient !== \"function\"\n ) {\n throw new SandboxError(\n \"native binding does not export the sandbox clients; rebuild with 'npm run build:native'\",\n );\n }\n cachedBinding = binding;\n return cachedBinding;\n } catch (error) {\n cachedBindingError =\n error instanceof Error ? error : new Error(String(error));\n throw cachedBindingError;\n }\n}\n\n/** Test seam: replace (or clear) the native binding. */\nexport function __setNativeSandboxBindingForTest(\n binding: NativeSandboxBinding | undefined,\n): void {\n cachedBinding = binding;\n cachedBindingError = undefined;\n}\n\n// ---- Error translation ----------------------------------------------------\n\ninterface NativeErrorPayload {\n category: string;\n status: number | null;\n message: string;\n}\n\n/** Context used to reconstruct entity-specific typed errors from a 404/409. */\nexport interface NativeErrorContext {\n sandboxId?: string;\n poolId?: string;\n /**\n * When set, a 404 maps to the typed not-found error for that entity\n * (`SandboxNotFoundError` / `PoolNotFoundError`). Lifecycle ops set it;\n * proxy/data-plane ops omit it so a 404 (e.g. missing file or process)\n * stays a generic `RemoteAPIError`, matching the pre-shim behavior.\n */\n notFoundKind?: \"sandbox\" | \"pool\";\n}\n\nfunction parseNativeError(error: unknown): NativeErrorPayload | null {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"\";\n if (!message) return null;\n try {\n const parsed = JSON.parse(message) as Partial<NativeErrorPayload>;\n if (parsed && typeof parsed.category === \"string\") {\n return {\n category: parsed.category,\n status: typeof parsed.status === \"number\" ? parsed.status : null,\n message: typeof parsed.message === \"string\" ? parsed.message : message,\n };\n }\n } catch {\n // Not a structured native error — fall through.\n }\n return null;\n}\n\n/**\n * Map a native error to the SDK's typed error hierarchy, matching the status\n * codes the undici path produced (404 → SandboxNotFoundError/PoolNotFoundError,\n * 409 → PoolInUseError, connection failures → SandboxConnectionError).\n */\nexport function translateNativeError(\n error: unknown,\n context?: NativeErrorContext,\n): Error {\n const payload = parseNativeError(error);\n if (!payload) {\n if (error instanceof Error) return error;\n return new SandboxError(String(error));\n }\n\n const { category, status, message } = payload;\n\n if (category === \"connection\") {\n return new SandboxConnectionError(message, { cause: error });\n }\n\n if (status === 404) {\n if (context?.notFoundKind === \"pool\" && context.poolId) {\n return new PoolNotFoundError(context.poolId);\n }\n if (context?.notFoundKind === \"sandbox\" && context.sandboxId) {\n return new SandboxNotFoundError(context.sandboxId);\n }\n return new RemoteAPIError(404, message);\n }\n\n if (status === 409 && context?.poolId) {\n return new PoolInUseError(context.poolId, message);\n }\n\n if (typeof status === \"number\") {\n return new RemoteAPIError(status, message);\n }\n\n return new SandboxError(message);\n}\n\n/** Run a native call, translating any error to the SDK's typed hierarchy. */\nexport async function callNative<T>(\n fn: () => Promise<T>,\n context?: NativeErrorContext,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw translateNativeError(error, context);\n }\n}\n\n// ---- Streaming bridge -----------------------------------------------------\n\n/**\n * Adapt the native per-event callback API into an async generator, preserving\n * the live-streaming semantics of `followStdout`/`followStderr`/`followOutput`.\n * The native `start` call resolves once the upstream stream closes; events are\n * buffered in a queue and drained in order.\n */\nexport async function* nativeEventStream(\n start: (emit: NativeEmit) => Promise<string>,\n context?: NativeErrorContext,\n signal?: AbortSignal,\n): AsyncGenerator<Record<string, unknown>> {\n const queue: string[] = [];\n let wake: (() => void) | null = null;\n let finished = false;\n let failure: unknown = null;\n\n const notify = () => {\n if (wake) {\n const w = wake;\n wake = null;\n w();\n }\n };\n\n const emit: NativeEmit = (eventJson) => {\n queue.push(eventJson);\n notify();\n };\n\n const onAbort = () => notify();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n const startPromise = start(emit)\n .catch((error) => {\n failure = error;\n })\n .finally(() => {\n finished = true;\n notify();\n });\n\n try {\n while (true) {\n if (queue.length > 0) {\n yield JSON.parse(queue.shift()!) as Record<string, unknown>;\n continue;\n }\n if (signal?.aborted) break;\n if (finished) break;\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n if (failure != null) {\n throw translateNativeError(failure, context);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n // Ensure the native call settles so it never surfaces as an unhandled\n // rejection when the consumer breaks early.\n void startPromise.catch(() => {});\n }\n}\n\n/**\n * Reduce the buffered `runProcess` events into a `CommandResult`, matching the\n * SSE-parsing logic the undici `run()` path used.\n */\nexport function assembleCommandResult(events: string[]): {\n exitCode: number;\n stdout: string;\n stderr: string;\n} {\n const stdoutLines: string[] = [];\n const stderrLines: string[] = [];\n let exitCode = -1;\n\n for (const eventJson of events) {\n const raw = JSON.parse(eventJson) as Record<string, unknown>;\n if (typeof raw.line === \"string\") {\n if (raw.stream === \"stderr\") {\n stderrLines.push(raw.line);\n } else {\n stdoutLines.push(raw.line);\n }\n } else if (\"exit_code\" in raw || \"signal\" in raw) {\n if (typeof raw.exit_code === \"number\") {\n exitCode = raw.exit_code;\n } else if (typeof raw.signal === \"number\") {\n exitCode = -raw.signal;\n }\n }\n }\n\n return { exitCode, stdout: stdoutLines.join(\"\\n\"), stderr: stderrLines.join(\"\\n\") };\n}\n","// --- Enums ---\n\nexport enum SandboxStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n SNAPSHOTTING = \"snapshotting\",\n SUSPENDING = \"suspending\",\n SUSPENDED = \"suspended\",\n TERMINATED = \"terminated\",\n TIMEOUT = \"timeout\",\n}\n\nexport enum SnapshotStatus {\n IN_PROGRESS = \"in_progress\",\n LOCAL_READY = \"local_ready\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n}\n\n/**\n * Snapshot type for sandbox snapshot creation.\n *\n * - `\"memory\"`: Capture VM memory + filesystem state. Sandboxes restored\n * from this snapshot warm-restore VM memory.\n * - `\"filesystem\"`: Capture filesystem state only. Sandboxes restored from\n * this snapshot cold-boot from the snapshot tarball instead of warm-\n * restoring VM state. Use this for sandbox image builds so that the\n * restored sandbox bypasses Firecracker's overlay-path constraints.\n */\nexport type SnapshotType = \"memory\" | \"filesystem\";\n\n/**\n * Checkpoint type for {@link Sandbox.checkpoint}.\n *\n * - `\"memory\"`: Capture VM memory + filesystem state. Sandboxes restored\n * from this checkpoint warm-restore VM memory and running processes.\n * - `\"filesystem\"`: Capture filesystem state only. Sandboxes restored from\n * this checkpoint cold-boot from the snapshot tarball.\n */\nexport type CheckpointType = \"memory\" | \"filesystem\";\n\nexport type SnapshotWaitCondition = \"local_ready\" | \"completed\";\n\nexport enum ProcessStatus {\n RUNNING = \"running\",\n EXITED = \"exited\",\n SIGNALED = \"signaled\",\n OOM_KILLED = \"oom_killed\",\n}\n\nexport enum StdinMode {\n CLOSED = \"closed\",\n PIPE = \"pipe\",\n}\n\nexport enum OutputMode {\n CAPTURE = \"capture\",\n DISCARD = \"discard\",\n}\n\nexport enum ContainerState {\n IDLE = \"Idle\",\n RUNNING = \"Running\",\n}\n\n// --- Resource / Network ---\n\nexport interface ContainerResourcesInfo {\n cpus: number;\n memoryMb: number;\n ephemeralDiskMb: number;\n}\n\nexport interface GPUResources {\n count: number;\n model: string;\n}\n\nexport interface NetworkConfig {\n allowInternetAccess: boolean;\n allowOut: string[];\n denyOut: string[];\n}\n\n/**\n * One file system mounted into a sandbox at an absolute guest path.\n *\n * `fileSystemId` is the registered file system's id (e.g.\n * `file_system_...`) and `mountPath` is an absolute, unique guest path\n * (e.g. `/mnt/skills`).\n */\nexport interface FileSystemMount {\n fileSystemId: string;\n mountPath: string;\n}\n\n// --- Sandbox lifecycle ---\n\nexport interface CreateSandboxOptions {\n /** Optional sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. When omitted, Tensorlake uses the default managed environment. */\n image?: string;\n cpus?: number;\n memoryMb?: number;\n /** Root disk size in megabytes. When omitted, the server uses its default disk size. */\n diskMb?: number;\n /** Number of GPUs to allocate. When provided, defaults to A10 unless gpuModel is set. */\n gpus?: number;\n /** GPU model to allocate. Only \"A10\" is supported. */\n gpuModel?: string;\n timeoutSecs?: number;\n entrypoint?: string[];\n allowInternetAccess?: boolean;\n allowOut?: string[];\n denyOut?: string[];\n snapshotId?: string;\n /** Optional name for the sandbox. Named sandboxes support suspend/resume. When absent the sandbox is ephemeral. */\n name?: string;\n /** File systems to mount into the sandbox at boot, each at its own absolute, unique guest mount path. */\n fileSystems?: FileSystemMount[];\n}\n\nexport interface UpdateSandboxOptions {\n /** New name for the sandbox. Naming an ephemeral sandbox enables suspend/resume. */\n name?: string;\n /** Whether exposed user ports should be reachable without TensorLake auth. */\n allowUnauthenticatedAccess?: boolean;\n /** User ports that should be routable through the sandbox proxy. Port 9501 is reserved. */\n exposedPorts?: number[];\n}\n\nexport interface CreateSandboxResponse {\n sandboxId: string;\n status: SandboxStatus;\n reason?: string;\n routingHint?: string;\n ingressEndpoint?: string;\n sandboxUrl?: string;\n name?: string | null;\n terminationReason?: string;\n errorDetails?: unknown;\n}\n\nexport interface CopySandboxOptions {\n /** Number of running copies to create. Defaults to 1. */\n times?: number;\n /** Per-request timeout in seconds for the blocking live-copy request. */\n requestTimeout?: number;\n}\n\nexport interface CopiedSandboxResponse {\n sandboxId: string;\n /** Raw server status. Partial copy responses can include statuses such as `\"failed\"`. */\n status: string;\n reason?: string;\n routingHint?: string;\n ingressEndpoint?: string;\n sandboxUrl?: string;\n name?: string | null;\n terminationReason?: string;\n errorDetails?: unknown;\n}\n\nexport interface CopySandboxResponse {\n sourceSandboxId: string;\n sandboxes: CopiedSandboxResponse[];\n}\n\nexport interface SandboxInfo {\n sandboxId: string;\n namespace: string;\n status: SandboxStatus;\n /** Resolved sandbox image name. */\n image?: string;\n resources: ContainerResourcesInfo;\n timeoutSecs?: number;\n entrypoint?: string[];\n network?: NetworkConfig;\n poolId?: string;\n outcome?: string;\n terminationReason?: string;\n errorDetails?: unknown;\n createdAt?: Date;\n terminatedAt?: Date;\n name?: string;\n allowUnauthenticatedAccess?: boolean;\n exposedPorts?: number[];\n ingressEndpoint?: string;\n sandboxUrl?: string;\n routingHint?: string;\n /** File systems currently mounted into the sandbox, each at its own guest mount path. Empty when none are mounted. */\n fileSystems?: FileSystemMount[];\n}\n\nexport interface SandboxPortAccess {\n allowUnauthenticatedAccess: boolean;\n exposedPorts: number[];\n ingressEndpoint?: string;\n sandboxUrl?: string;\n}\n\n/** Sandbox information plus the archival timestamp. */\nexport interface ArchivedSandboxInfo extends SandboxInfo {\n archivedAt: Date;\n}\n\n/** Pagination params for `listArchivedSandboxes`. */\nexport interface ListArchivedSandboxesOptions {\n limit?: number;\n /** Base64-encoded pagination cursor returned by a prior call. */\n cursor?: string;\n /** Pagination direction. */\n direction?: \"forward\" | \"backward\";\n}\n\nexport interface ListArchivedSandboxesResponse {\n sandboxes: ArchivedSandboxInfo[];\n prevCursor?: string;\n nextCursor?: string;\n}\n\n// --- Snapshots ---\n\nexport interface CreateSnapshotResponse {\n snapshotId: string;\n status: SnapshotStatus;\n}\n\nexport interface SnapshotInfo {\n snapshotId: string;\n namespace: string;\n sandboxId: string;\n baseImage: string;\n status: SnapshotStatus;\n snapshotType?: SnapshotType;\n error?: string;\n snapshotUri?: string;\n snapshotFormatVersion?: string;\n sizeBytes?: number;\n rootfsDiskBytes?: number;\n createdAt?: Date;\n}\n\nexport interface SnapshotOptions {\n /**\n * Optional snapshot type. When omitted the server picks its default. Use\n * `\"filesystem\"` for snapshots intended for sandbox image builds so that\n * restored sandboxes cold-boot.\n */\n snapshotType?: SnapshotType;\n}\n\nexport interface SnapshotAndWaitOptions extends SnapshotOptions {\n timeout?: number;\n pollInterval?: number;\n /** Defaults to `\"local_ready\"`, which is enough to resume from a snapshot. */\n waitUntil?: SnapshotWaitCondition;\n}\n\n// --- Persisted sandbox logs ---\n\nexport type SandboxLogLevel =\n | \"trace\"\n | \"debug\"\n | \"info\"\n | \"warn\"\n | \"error\"\n | \"fatal\";\n\nexport interface GetSandboxLogsOptions {\n levels?: SandboxLogLevel[];\n processIds?: string[];\n nextToken?: string;\n head?: number;\n tail?: number;\n body?: string;\n}\n\nexport interface SandboxLogSignal {\n timestamp: number;\n uuid: string;\n namespace: string;\n application: string;\n sandboxId?: string;\n resourceAttributes: Array<[string, string]>;\n body: string;\n logAttributes: string;\n allocations?: string[];\n functionRuns?: string[];\n level?: number;\n retention?: number;\n}\n\nexport interface SandboxLogsResponse {\n logs: SandboxLogSignal[];\n nextToken?: string;\n}\n\nexport interface SandboxProcessLogFilter {\n processId: string;\n processPid: string;\n processCommand: string;\n processManagedId: string;\n processManagedName: string;\n firstSeen: number;\n lastSeen: number;\n logCount: number;\n}\n\nexport interface SandboxProcessLogFiltersResponse {\n processes: SandboxProcessLogFilter[];\n}\n\n// --- Pools ---\n\nexport interface CreatePoolOptions {\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n ephemeralDiskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n}\n\nexport interface UpdatePoolOptions {\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n ephemeralDiskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n}\n\nexport interface CreateSandboxPoolResponse {\n poolId: string;\n namespace: string;\n}\n\nexport interface PoolContainerInfo {\n id: string;\n state: string;\n sandboxId?: string;\n executorId: string;\n}\n\nexport interface SandboxPoolInfo {\n poolId: string;\n namespace: string;\n /** Sandbox image name backing the pool. */\n image: string;\n resources: ContainerResourcesInfo;\n timeoutSecs: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n containers?: PoolContainerInfo[];\n createdAt?: Date;\n updatedAt?: Date;\n}\n\n// --- Process management ---\n\nexport interface ProcessUserSpec {\n name?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type ProcessUser = string | ProcessUserSpec;\n\nexport type RestartPolicy = \"never\" | \"on_failure\" | \"always\";\n\nexport interface RestartPolicyConfig {\n policy?: RestartPolicy;\n maxRestarts?: number;\n initialBackoffMs?: number;\n maxBackoffMs?: number;\n}\n\nexport type ProcessHealthCheckType = \"http\" | \"tcp\";\n\nexport interface ProcessHealthCheck {\n type: ProcessHealthCheckType;\n port: number;\n path?: string;\n initialDelayMs?: number;\n intervalMs?: number;\n timeoutMs?: number;\n failureThreshold?: number;\n}\n\nexport type ManagedProcessStatus =\n | \"starting\"\n | \"running\"\n | \"backing_off\"\n | \"stopped\";\n\nexport type ManagedProcessHealthStatus =\n | \"disabled\"\n | \"starting\"\n | \"healthy\"\n | \"unhealthy\";\n\nexport interface ManagedProcessExit {\n exitCode?: number;\n signal?: number;\n oomKilled: boolean;\n endedAt: Date;\n}\n\n/**\n * Managed-process metadata embedded into {@link ProcessInfo}.\n *\n * A managed process is addressable by either its current PID or, if a `name` was given at\n * creation, that name (process APIs accept a PID or process name). `id` is a stable\n * daemon-local identifier: it equals `name` when one was set, otherwise a daemon-assigned\n * opaque id (the process is then addressable only by PID, not by `id`).\n */\nexport interface ManagedProcessInfo {\n id: string;\n name?: string;\n status: ManagedProcessStatus;\n restartCount: number;\n restart: RestartPolicyConfig;\n healthCheck?: ProcessHealthCheck;\n healthStatus: ManagedProcessHealthStatus;\n consecutiveHealthFailures: number;\n lastExit?: ManagedProcessExit;\n lastError?: string;\n nextRestartAt?: Date;\n}\n\nexport interface StartProcessOptions {\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n stdinMode?: StdinMode;\n stdoutMode?: OutputMode;\n stderrMode?: OutputMode;\n user?: ProcessUser;\n /**\n * Optional managed-process name. Supplying this opts into managed process behavior, and\n * lets the process be addressed by this name (in addition to its PID) in\n * `getProcess`/`killProcess`/`sendSignal`/etc. — useful because a managed process's PID\n * changes when it restarts. May contain any characters except `/` and must not be all\n * digits (numeric strings are reserved for PID addressing). If omitted, the daemon assigns\n * an opaque id (`ManagedProcessInfo.id`) and the process is addressable only by its current PID.\n */\n name?: string;\n /** Optional restart behavior. Supplying this opts into managed process behavior. */\n restart?: RestartPolicyConfig;\n /** Optional HTTP/TCP health check. Supplying this opts into managed process behavior. */\n healthCheck?: ProcessHealthCheck;\n}\n\nexport interface ProcessInfo {\n handle?: number;\n pid: number;\n status: ProcessStatus;\n exitCode?: number;\n signal?: number;\n stdinWritable: boolean;\n command: string;\n args: string[];\n startedAt: Date;\n endedAt?: Date;\n managed?: ManagedProcessInfo;\n}\n\nexport interface SendSignalResponse {\n success: boolean;\n}\n\nexport interface OutputResponse {\n pid: number;\n lines: string[];\n lineCount: number;\n}\n\nexport interface OutputEvent {\n line: string;\n timestamp: Date;\n stream?: string;\n}\n\n// --- Run ---\n\nexport interface RunOptions {\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n timeout?: number;\n user?: ProcessUser;\n}\n\nexport interface CommandResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// --- File operations ---\n\nexport interface DirectoryEntry {\n name: string;\n isDir: boolean;\n size?: number;\n modifiedAt?: Date;\n}\n\nexport interface ListDirectoryResponse {\n path: string;\n entries: DirectoryEntry[];\n}\n\n// --- PTY ---\n\nexport interface CreatePtySessionOptions {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n rows?: number;\n cols?: number;\n}\n\nexport interface PtySessionInfo {\n sessionId: string;\n token: string;\n}\n\n// --- Health ---\n\nexport interface HealthResponse {\n healthy: boolean;\n}\n\nexport interface DaemonInfo {\n version: string;\n uptimeSecs: number;\n runningProcesses: number;\n totalProcesses: number;\n}\n\n// --- Client options ---\n\nexport interface SandboxClientOptions {\n apiUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n namespace?: string;\n maxRetries?: number;\n retryBackoffMs?: number;\n /** Total HTTP request timeout in seconds. Default: 300. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. Total HTTP request timeout in milliseconds. */\n timeoutMs?: number;\n}\n\nexport interface SandboxOptions {\n sandboxId: string;\n /**\n * Explicit sandbox proxy base URL. Direct `new Sandbox(...)` construction\n * requires this; `Sandbox.connect()` and `SandboxClient.connect()` normally\n * resolve the server-returned `sandboxUrl`.\n */\n proxyUrl?: string;\n /** @internal Real caller/env proxy override, distinct from an internally selected proxyUrl. */\n explicitProxyUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n routingHint?: string;\n resolveProxyInfo?: (\n identifier: string,\n ) => Promise<SandboxInfo & { readonly traceId: string }>;\n /** Optional total HTTP request timeout in seconds for sandbox proxy operations. Omit for no total proxy timeout. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. Optional total HTTP request timeout in milliseconds for sandbox proxy operations. */\n timeoutMs?: number;\n /**\n * @internal Shared Rust-backed lifecycle client. When provided, the proxy\n * client is minted via `connectProxy` so it reuses this client's connection\n * pool (HTTP/2 coalescing across sandboxes).\n */\n nativeClient?: import(\"./native-sandbox.js\").NativeSandboxClient;\n}\n\nexport interface CreateAndConnectOptions extends CreateSandboxOptions {\n poolId?: string;\n proxyUrl?: string;\n /** Total HTTP request timeout in seconds for sandbox startup. Default: client requestTimeout. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. */\n startupTimeout?: number;\n}\n\nexport interface SuspendResumeOptions {\n /** If false, fire-and-return without waiting for completion. Default: true. */\n wait?: boolean;\n /** Max seconds to wait when wait=true. Default: 300. */\n timeout?: number;\n /** Seconds between status polls when wait=true. Default: 1. */\n pollInterval?: number;\n}\n\nexport interface CheckpointOptions extends SuspendResumeOptions {\n checkpointType?: CheckpointType;\n /** Defaults to `\"local_ready\"`, which is enough to resume from a checkpoint. */\n waitUntil?: SnapshotWaitCondition;\n}\n\nexport interface ConnectOptions {\n sandboxId: string;\n proxyUrl?: string;\n routingHint?: string;\n}\n\n// --- JSON key conversion helpers ---\n\nconst CAMEL_TO_SNAKE_RE = /[A-Z]/g;\n\n/** Convert a camelCase string to snake_case. */\nexport function camelToSnake(str: string): string {\n return str.replace(CAMEL_TO_SNAKE_RE, (ch) => \"_\" + ch.toLowerCase());\n}\n\n/** Convert a snake_case string to camelCase. */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, ch) => ch.toUpperCase());\n}\n\n/** Recursively convert all object keys from camelCase to snake_case. */\nexport function toSnakeKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) return obj.map(toSnakeKeys);\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n result[camelToSnake(k)] = toSnakeKeys(v);\n }\n return result;\n }\n return obj;\n}\n\n/**\n * Parse a numeric timestamp into a Date.\n *\n * Handles seconds, milliseconds, and microseconds by checking magnitude.\n */\nexport function parseTimestamp(v: unknown): Date | undefined {\n if (v == null) return undefined;\n if (v instanceof Date) return v;\n if (typeof v === \"string\") {\n const parsed = Date.parse(v);\n return Number.isNaN(parsed) ? undefined : new Date(parsed);\n }\n const ts = Number(v);\n if (isNaN(ts)) return undefined;\n if (ts > 1e15) return new Date(ts / 1000); // microseconds → ms\n if (ts > 1e12) return new Date(ts); // already ms\n return new Date(ts * 1000); // seconds → ms\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase,\n * with special handling for `id` → contextual name and timestamp parsing.\n */\nexport function fromSnakeKeys(\n obj: unknown,\n idField?: string,\n): unknown {\n if (Array.isArray(obj)) return obj.map((item) => fromSnakeKeys(item, idField));\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n let key: string;\n if (k === \"id\" && idField) {\n key = idField;\n } else {\n key = snakeToCamel(k);\n }\n\n // Parse timestamp fields\n if (\n key.endsWith(\"At\") ||\n key === \"timestamp\" ||\n key === \"startedAt\" ||\n key === \"endedAt\"\n ) {\n result[key] = parseTimestamp(v);\n } else if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n result[key] = fromSnakeKeys(v);\n } else if (Array.isArray(v)) {\n result[key] = v.map((item) => fromSnakeKeys(item));\n } else {\n // Normalize null → undefined so optional fields match TypeScript's ? convention.\n result[key] = v === null ? undefined : v;\n }\n }\n return result;\n }\n return obj;\n}\n","import * as net from \"node:net\";\nimport { SandboxConnectionError, SandboxError } from \"./errors.js\";\nimport WebSocket, { type RawData } from \"ws\";\n\nconst DEFAULT_TUNNEL_CONNECT_TIMEOUT_MS = 10_000;\nconst WEBSOCKET_KEEPALIVE_INTERVAL_MS = 15_000;\n\nexport interface CreateTunnelOptions {\n /** Local host/interface to bind. Defaults to `127.0.0.1`. */\n localHost?: string;\n /** Local port to bind. Defaults to the remote port. Use `0` for an ephemeral port. */\n localPort?: number;\n /** Seconds to wait for each websocket tunnel connection. Defaults to `10`. */\n connectTimeout?: number;\n}\n\nexport interface TunnelAddress {\n host: string;\n port: number;\n}\n\ninterface TunnelWebSocketOptions {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n connectTimeoutMs?: number;\n}\n\ninterface PendingRead {\n length: number;\n resolve: (chunk: Buffer) => void;\n reject: (error: Error) => void;\n}\n\ninterface ActiveRelay {\n localSocket: net.Socket;\n websocket: WebSocket | null;\n}\n\nexport async function openTunnelWebSocket(\n options: TunnelWebSocketOptions,\n): Promise<WebSocket> {\n const wsUrl = buildTunnelWsUrl(options.baseUrl, options.remotePort);\n const timeoutMs = options.connectTimeoutMs ?? DEFAULT_TUNNEL_CONNECT_TIMEOUT_MS;\n\n return new Promise<WebSocket>((resolve, reject) => {\n const socket = new WebSocket(wsUrl, {\n headers: options.wsHeaders,\n });\n\n let settled = false;\n const timer = setTimeout(() => {\n fail(\n new SandboxError(\n `timed out while connecting tunnel websocket after ${(timeoutMs / 1000).toFixed(2)}s`,\n ),\n );\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timer);\n socket.removeListener(\"open\", onOpen);\n socket.removeListener(\"error\", onError);\n socket.removeListener(\"close\", onCloseBeforeOpen);\n socket.removeListener(\"unexpected-response\", onUnexpectedResponse);\n };\n\n const settle = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n\n const fail = (error: Error) => {\n settle(() => {\n reject(error);\n });\n };\n\n const onOpen = () => {\n settle(() => resolve(socket));\n };\n\n const onError = (error: Error) => {\n fail(new SandboxConnectionError(error.message));\n };\n\n const onCloseBeforeOpen = (code: number, reason: Buffer) => {\n const closeReason =\n reason.length > 0 ? reason.toString(\"utf8\") : \"no reason\";\n fail(\n new SandboxError(\n `tunnel websocket closed before opening: ${code} ${closeReason}`,\n ),\n );\n };\n\n const onUnexpectedResponse = (\n _request: unknown,\n response: { statusCode?: number; statusMessage?: string },\n ) => {\n const status = response.statusCode ?? 0;\n const statusMessage = response.statusMessage?.trim();\n fail(\n new SandboxError(\n `tunnel websocket handshake failed with HTTP ${status}${statusMessage ? ` ${statusMessage}` : \"\"}`,\n ),\n );\n };\n\n socket.on(\"open\", onOpen);\n socket.on(\"error\", onError);\n socket.on(\"close\", onCloseBeforeOpen);\n socket.on(\"unexpected-response\", onUnexpectedResponse);\n });\n}\n\nexport class TunnelByteStream {\n private readonly socket: WebSocket;\n private readBuffer: Buffer = Buffer.alloc(0);\n private readonly pendingReads: PendingRead[] = [];\n private closeError: Error | null = null;\n private closePromise: Promise<void> | null = null;\n private readonly keepAliveInterval: ReturnType<typeof setInterval>;\n\n constructor(socket: WebSocket) {\n this.socket = socket;\n this.keepAliveInterval = setInterval(() => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.ping();\n }\n }, WEBSOCKET_KEEPALIVE_INTERVAL_MS);\n this.keepAliveInterval.unref?.();\n\n socket.on(\"message\", (message: RawData, isBinary: boolean) => {\n if (!isBinary) {\n this.fail(\n new SandboxError(\"desktop tunnel received unexpected text frame\"),\n );\n return;\n }\n this.pushBytes(normalizeWebSocketData(message));\n });\n\n socket.on(\"ping\", (data: Buffer) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.pong(data, false, () => {});\n }\n });\n\n socket.on(\"close\", (_code: number, reason: Buffer) => {\n clearInterval(this.keepAliveInterval);\n const closeReason =\n reason.length > 0 ? reason.toString(\"utf8\") : \"desktop tunnel closed unexpectedly\";\n this.fail(new SandboxError(closeReason));\n });\n\n socket.on(\"error\", (error: Error) => {\n clearInterval(this.keepAliveInterval);\n this.fail(new SandboxConnectionError(error.message));\n });\n }\n\n static async connect(options: TunnelWebSocketOptions): Promise<TunnelByteStream> {\n const socket = await openTunnelWebSocket(options);\n return new TunnelByteStream(socket);\n }\n\n async readExactly(length: number): Promise<Buffer> {\n if (length < 0) {\n throw new SandboxError(`read length must be >= 0, got ${length}`);\n }\n if (length === 0) {\n return Buffer.alloc(0);\n }\n if (this.readBuffer.length >= length) {\n const chunk = this.readBuffer.subarray(0, length);\n this.readBuffer = this.readBuffer.subarray(length);\n return chunk;\n }\n if (this.closeError) {\n throw this.closeError;\n }\n return new Promise<Buffer>((resolve, reject) => {\n this.pendingReads.push({ length, resolve, reject });\n });\n }\n\n async writeAll(data: Uint8Array): Promise<void> {\n if (this.closeError) {\n throw this.closeError;\n }\n if (this.socket.readyState !== WebSocket.OPEN) {\n throw new SandboxError(\"desktop tunnel is not connected\");\n }\n const payload = Buffer.from(data);\n await new Promise<void>((resolve, reject) => {\n this.socket.send(payload, { binary: true }, (error?: Error) => {\n if (error) {\n reject(new SandboxConnectionError(error.message));\n return;\n }\n resolve();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.closePromise) {\n return this.closePromise;\n }\n if (\n this.socket.readyState === WebSocket.CLOSED ||\n this.socket.readyState === WebSocket.CLOSING\n ) {\n this.closePromise = Promise.resolve();\n return this.closePromise;\n }\n\n this.closePromise = new Promise<void>((resolve) => {\n const onClose = () => {\n this.socket.removeListener(\"close\", onClose);\n resolve();\n };\n this.socket.on(\"close\", onClose);\n this.socket.close();\n });\n return this.closePromise;\n }\n\n private pushBytes(chunk: Buffer): void {\n this.readBuffer =\n this.readBuffer.length === 0\n ? chunk\n : Buffer.from(Buffer.concat([this.readBuffer, chunk]));\n this.flushPendingReads();\n }\n\n private flushPendingReads(): void {\n while (this.pendingReads.length > 0) {\n const next = this.pendingReads[0];\n if (this.readBuffer.length < next.length) {\n break;\n }\n const chunk = this.readBuffer.subarray(0, next.length);\n this.readBuffer = this.readBuffer.subarray(next.length);\n this.pendingReads.shift();\n next.resolve(chunk);\n }\n }\n\n private fail(error: Error): void {\n if (this.closeError) {\n return;\n }\n this.closeError = error;\n while (this.pendingReads.length > 0) {\n const pending = this.pendingReads.shift();\n pending?.reject(error);\n }\n }\n}\n\nexport class TcpTunnel {\n readonly remotePort: number;\n readonly localHost: string;\n readonly localPort: number;\n\n private readonly baseUrl: string;\n private readonly wsHeaders: Record<string, string>;\n private readonly server: net.Server;\n private readonly connectTimeoutMs: number;\n private readonly activeRelays = new Set<ActiveRelay>();\n private closePromise: Promise<void> | null = null;\n\n private constructor(options: {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n localHost: string;\n localPort: number;\n server: net.Server;\n connectTimeoutMs: number;\n }) {\n this.baseUrl = options.baseUrl;\n this.wsHeaders = options.wsHeaders;\n this.remotePort = options.remotePort;\n this.localHost = options.localHost;\n this.localPort = options.localPort;\n this.server = options.server;\n this.connectTimeoutMs = options.connectTimeoutMs;\n }\n\n static async listen(options: {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n localHost?: string;\n localPort?: number;\n connectTimeout?: number;\n }): Promise<TcpTunnel> {\n const remotePort = validatePort(options.remotePort, \"remote port\");\n const localHost = options.localHost ?? \"127.0.0.1\";\n const localPort = validatePort(\n options.localPort ?? remotePort,\n \"local port\",\n true,\n );\n const connectTimeoutMs = secondsToMillis(options.connectTimeout ?? 10);\n\n const server = net.createServer();\n await listenServer(server, localPort, localHost);\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n throw new SandboxError(\"failed to determine bound tunnel address\");\n }\n\n const tunnel = new TcpTunnel({\n baseUrl: options.baseUrl,\n wsHeaders: options.wsHeaders,\n remotePort,\n localHost,\n localPort: address.port,\n server,\n connectTimeoutMs,\n });\n\n server.on(\"connection\", (localSocket) => {\n void tunnel.handleConnection(localSocket);\n });\n\n return tunnel;\n }\n\n address(): TunnelAddress {\n return { host: this.localHost, port: this.localPort };\n }\n\n async close(): Promise<void> {\n if (this.closePromise) {\n return this.closePromise;\n }\n\n for (const relay of this.activeRelays) {\n relay.localSocket.destroy();\n relay.websocket?.close();\n }\n\n this.closePromise = new Promise<void>((resolve, reject) => {\n this.server.close((error) => {\n if (error) {\n reject(new SandboxError(`failed to close tunnel listener: ${error.message}`));\n return;\n }\n resolve();\n });\n });\n return this.closePromise;\n }\n\n private async handleConnection(localSocket: net.Socket): Promise<void> {\n localSocket.setNoDelay(true);\n\n const relay: ActiveRelay = { localSocket, websocket: null };\n this.activeRelays.add(relay);\n\n try {\n relay.websocket = await openTunnelWebSocket({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n remotePort: this.remotePort,\n connectTimeoutMs: this.connectTimeoutMs,\n });\n await relaySocket(localSocket, relay.websocket);\n } catch (error) {\n localSocket.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n } finally {\n this.activeRelays.delete(relay);\n }\n }\n}\n\nexport function buildTunnelWsUrl(baseUrl: string, remotePort: number): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/api/v1/tunnels/tcp\";\n url.search = `port=${encodeURIComponent(String(remotePort))}`;\n return url.toString();\n}\n\nfunction normalizeWebSocketData(message: RawData): Buffer {\n if (Buffer.isBuffer(message)) return message;\n if (Array.isArray(message)) {\n return Buffer.concat(message.map((part) => Buffer.from(part)));\n }\n return Buffer.from(message);\n}\n\nasync function relaySocket(localSocket: net.Socket, websocket: WebSocket): Promise<void> {\n return new Promise<void>((resolve) => {\n let settled = false;\n const keepAliveInterval = setInterval(() => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.ping();\n }\n }, WEBSOCKET_KEEPALIVE_INTERVAL_MS);\n keepAliveInterval.unref?.();\n\n const finish = () => {\n if (settled) return;\n settled = true;\n clearInterval(keepAliveInterval);\n cleanup();\n resolve();\n };\n\n const cleanup = () => {\n localSocket.removeListener(\"data\", onLocalData);\n localSocket.removeListener(\"end\", onLocalEnd);\n localSocket.removeListener(\"close\", onLocalClose);\n localSocket.removeListener(\"error\", onLocalError);\n websocket.removeListener(\"message\", onWsMessage);\n websocket.removeListener(\"close\", onWsClose);\n websocket.removeListener(\"error\", onWsError);\n websocket.removeListener(\"ping\", onWsPing);\n };\n\n const onLocalData = (chunk: Buffer) => {\n if (websocket.readyState !== WebSocket.OPEN) {\n localSocket.destroy();\n return;\n }\n\n websocket.send(chunk, { binary: true }, (error?: Error) => {\n if (error) {\n localSocket.destroy(error);\n }\n });\n };\n\n const onLocalEnd = () => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.close();\n }\n };\n\n const onLocalClose = () => {\n if (\n websocket.readyState === WebSocket.OPEN ||\n websocket.readyState === WebSocket.CONNECTING\n ) {\n websocket.close();\n }\n finish();\n };\n\n const onLocalError = () => {\n websocket.close();\n finish();\n };\n\n const onWsMessage = (message: RawData, isBinary: boolean) => {\n if (!isBinary) {\n localSocket.destroy(\n new SandboxError(\"received unexpected text frame from tunnel\"),\n );\n websocket.close();\n return;\n }\n\n const payload = normalizeWebSocketData(message);\n if (!localSocket.destroyed) {\n localSocket.write(payload);\n }\n };\n\n const onWsClose = () => {\n if (!localSocket.destroyed) {\n localSocket.end();\n }\n finish();\n };\n\n const onWsError = (error: Error) => {\n localSocket.destroy(error);\n finish();\n };\n\n const onWsPing = (data: Buffer) => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.pong(data, false, () => {});\n }\n };\n\n localSocket.on(\"data\", onLocalData);\n localSocket.on(\"end\", onLocalEnd);\n localSocket.on(\"close\", onLocalClose);\n localSocket.on(\"error\", onLocalError);\n websocket.on(\"message\", onWsMessage);\n websocket.on(\"close\", onWsClose);\n websocket.on(\"error\", onWsError);\n websocket.on(\"ping\", onWsPing);\n });\n}\n\nasync function listenServer(\n server: net.Server,\n localPort: number,\n localHost: string,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error) => {\n server.removeListener(\"listening\", onListening);\n reject(\n new SandboxError(\n `failed to bind local tunnel listener on ${localHost}:${localPort}: ${error.message}`,\n ),\n );\n };\n\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(localPort, localHost);\n });\n}\n\nfunction validatePort(port: number, label: string, allowZero = false): number {\n if (!Number.isInteger(port)) {\n throw new SandboxError(`${label} must be an integer, got ${port}`);\n }\n if (allowZero && port === 0) {\n return port;\n }\n if (port < 1 || port > 65535) {\n throw new SandboxError(`${label} must be between 1 and 65535, got ${port}`);\n }\n return port;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds < 0) {\n throw new SandboxError(`timeout must be >= 0 seconds, got ${seconds}`);\n }\n return Math.round(seconds * 1000);\n}\n\nexport async function withTimeout<T>(\n timeoutMs: number,\n operation: () => Promise<T>,\n timeoutMessage: string,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new SandboxError(timeoutMessage));\n }, timeoutMs);\n\n void operation()\n .then((value) => {\n clearTimeout(timer);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n","import { deflateSync } from \"node:zlib\";\nimport { SandboxError } from \"./errors.js\";\nimport { TunnelByteStream, withTimeout } from \"./tunnel.js\";\n\nconst SECURITY_TYPE_NONE = 1;\nconst SECURITY_TYPE_VNC_AUTH = 2;\nconst ENCODING_RAW = 0;\nconst ENCODING_DESKTOP_SIZE = -223;\n\nconst BUTTON_LEFT_MASK = 1;\nconst BUTTON_MIDDLE_MASK = 1 << 1;\nconst BUTTON_RIGHT_MASK = 1 << 2;\nconst BUTTON_SCROLL_UP_MASK = 1 << 3;\nconst BUTTON_SCROLL_DOWN_MASK = 1 << 4;\n\nconst PNG_SIGNATURE = Buffer.from([\n 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,\n]);\n\nconst CRC32_TABLE = buildCrc32Table();\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nexport interface ConnectDesktopOptions {\n /** Remote VNC port. Defaults to `5901`. */\n port?: number;\n /** Optional VNC password for classic VNC authentication. */\n password?: string;\n /** Whether to request a shared VNC session. Defaults to `true`. */\n shared?: boolean;\n /** Seconds to wait while opening the desktop session. Defaults to `10`. */\n connectTimeout?: number;\n}\n\nexport interface DesktopPointerOptions {\n button?: MouseButton;\n x?: number;\n y?: number;\n}\n\nexport interface DesktopDoubleClickOptions extends DesktopPointerOptions {\n delayMs?: number;\n}\n\ninterface DesktopConnectRequest extends ConnectDesktopOptions {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n}\n\ninterface FramebufferUpdateOutcome {\n kind: \"framebufferUpdate\";\n sawResize: boolean;\n sawRaw: boolean;\n}\n\ninterface BellOutcome {\n kind: \"bell\";\n}\n\ninterface ServerCutTextOutcome {\n kind: \"serverCutText\";\n}\n\ntype ServerMessageOutcome =\n | FramebufferUpdateOutcome\n | BellOutcome\n | ServerCutTextOutcome;\n\nexport interface DesktopTransport {\n readExactly(length: number): Promise<Buffer>;\n writeAll(data: Uint8Array): Promise<void>;\n close(): Promise<void>;\n}\n\nexport class DesktopSession<T extends DesktopTransport> {\n readonly transport: T;\n width: number;\n height: number;\n\n private pixelFormat: PixelFormat;\n private framebuffer: Uint8Array;\n private pointerX = 0;\n private pointerY = 0;\n private buttonMask = 0;\n private framebufferVersion = 0;\n private closed = false;\n private updateLoopError: Error | null = null;\n private readonly updateSignal = createDeferredSignal();\n private updateLoopPromise: Promise<void> | null = null;\n\n constructor(options: {\n transport: T;\n width: number;\n height: number;\n pixelFormat: PixelFormat;\n framebuffer: Uint8Array;\n }) {\n this.transport = options.transport;\n this.width = options.width;\n this.height = options.height;\n this.pixelFormat = options.pixelFormat;\n this.framebuffer = options.framebuffer;\n }\n\n static async connect<T extends DesktopTransport>(\n transport: T,\n password?: string,\n shared = true,\n ): Promise<DesktopSession<T>> {\n const serverVersion = await ProtocolVersion.read(transport);\n const clientVersion = serverVersion.negotiated();\n await transport.writeAll(Buffer.from(clientVersion.render(), \"ascii\"));\n\n await negotiateSecurity(transport, clientVersion, password);\n await transport.writeAll(Uint8Array.of(shared ? 1 : 0));\n\n const init = await ServerInit.read(transport);\n if (!init.pixelFormat.trueColor) {\n throw new SandboxError(\n \"desktop sessions require a true-color VNC pixel format\",\n );\n }\n\n const pixelFormat = PixelFormat.preferred();\n await sendSetPixelFormat(transport, pixelFormat);\n await sendSetEncodings(transport, [ENCODING_RAW, ENCODING_DESKTOP_SIZE]);\n\n const session = new DesktopSession({\n transport,\n width: init.width,\n height: init.height,\n pixelFormat,\n framebuffer: allocateFramebuffer(init.width, init.height),\n });\n session.startFramebufferUpdates();\n return session;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.updateSignal.resolve();\n await this.transport.close();\n await this.updateLoopPromise;\n }\n\n async screenshot(timeoutSeconds = 5): Promise<Uint8Array> {\n await this.waitForFramebufferVersion(\n 1,\n timeoutSeconds,\n `timed out waiting for initial desktop framebuffer after ${timeoutSeconds.toFixed(2)}s`,\n );\n return encodePng(this.width, this.height, this.framebuffer);\n }\n\n getFrameVersion(): number {\n return this.framebufferVersion;\n }\n\n async screenshotAfter(frameVersion: number, timeoutSeconds = 1): Promise<Uint8Array> {\n const minimumVersion = validateNonNegativeInteger(frameVersion, \"frame version\") + 1;\n\n if (this.framebufferVersion < minimumVersion) {\n await this.waitForFramebufferVersion(\n minimumVersion,\n timeoutSeconds,\n `timed out waiting for a fresher desktop framebuffer after ${timeoutSeconds.toFixed(2)}s`,\n );\n }\n\n return encodePng(this.width, this.height, this.framebuffer);\n }\n\n async moveMouse(x: number, y: number): Promise<void> {\n const nextX = validateCoordinate(x, \"mouse x coordinate\");\n const nextY = validateCoordinate(y, \"mouse y coordinate\");\n this.ensurePointerInBounds(nextX, nextY);\n this.pointerX = nextX;\n this.pointerY = nextY;\n await sendPointerEvent(this.transport, this.buttonMask, nextX, nextY);\n }\n\n async mousePress(options?: DesktopPointerOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n await this.moveIfRequested(options?.x, options?.y);\n this.buttonMask |= buttonMask(button);\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n\n async mouseRelease(options?: DesktopPointerOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n await this.moveIfRequested(options?.x, options?.y);\n this.buttonMask &= ~buttonMask(button);\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n\n async click(options?: DesktopPointerOptions): Promise<void> {\n await this.mousePress(options);\n await this.mouseRelease({ button: options?.button ?? \"left\" });\n }\n\n async doubleClick(options?: DesktopDoubleClickOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n const delayMs = options?.delayMs ?? 50;\n validateNonNegativeInteger(delayMs, \"double click delay\");\n\n await this.click({ button, x: options?.x, y: options?.y });\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n await this.click({ button });\n }\n\n async scroll(steps: number, x?: number, y?: number): Promise<void> {\n const normalizedSteps = validateInteger(steps, \"scroll steps\");\n await this.moveIfRequested(x, y);\n\n if (normalizedSteps === 0) {\n return;\n }\n\n const wheelMask =\n normalizedSteps > 0 ? BUTTON_SCROLL_UP_MASK : BUTTON_SCROLL_DOWN_MASK;\n const stepCount = Math.abs(normalizedSteps);\n for (let index = 0; index < stepCount; index += 1) {\n await sendPointerEvent(\n this.transport,\n this.buttonMask | wheelMask,\n this.pointerX,\n this.pointerY,\n );\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n }\n\n async keyDown(key: string): Promise<void> {\n await sendKeyEvent(this.transport, true, keysymFromKeyName(key));\n }\n\n async keyUp(key: string): Promise<void> {\n await sendKeyEvent(this.transport, false, keysymFromKeyName(key));\n }\n\n async press(keys: string | string[]): Promise<void> {\n const parts = Array.isArray(keys) ? keys : [keys];\n if (parts.length === 0) {\n throw new SandboxError(\"desktop press requires at least one key\");\n }\n\n const keysyms = parts.map((part) => keysymFromKeyName(part));\n if (keysyms.length === 1) {\n await sendKeyEvent(this.transport, true, keysyms[0]);\n await sendKeyEvent(this.transport, false, keysyms[0]);\n return;\n }\n\n for (const keysym of keysyms.slice(0, -1)) {\n await sendKeyEvent(this.transport, true, keysym);\n }\n\n const last = keysyms[keysyms.length - 1];\n await sendKeyEvent(this.transport, true, last);\n await sendKeyEvent(this.transport, false, last);\n\n for (const keysym of keysyms.slice(0, -1).reverse()) {\n await sendKeyEvent(this.transport, false, keysym);\n }\n }\n\n async typeText(text: string): Promise<void> {\n for (const char of text) {\n const keysym = keysymFromChar(char);\n await sendKeyEvent(this.transport, true, keysym);\n await sendKeyEvent(this.transport, false, keysym);\n }\n }\n\n private async moveIfRequested(x?: number, y?: number): Promise<void> {\n if (x == null && y == null) {\n return;\n }\n if (x == null || y == null) {\n throw new SandboxError(\n \"desktop pointer actions require both x and y when specifying coordinates\",\n );\n }\n await this.moveMouse(x, y);\n }\n\n private ensurePointerInBounds(x: number, y: number): void {\n if (this.width > 0 && x >= this.width) {\n throw new SandboxError(\n `mouse x coordinate ${x} is outside desktop width ${this.width}`,\n );\n }\n if (this.height > 0 && y >= this.height) {\n throw new SandboxError(\n `mouse y coordinate ${y} is outside desktop height ${this.height}`,\n );\n }\n }\n\n private startFramebufferUpdates(): void {\n if (this.updateLoopPromise) {\n return;\n }\n\n this.updateLoopPromise = this.runFramebufferUpdateLoop().catch((error: unknown) => {\n if (this.closed) {\n return;\n }\n this.updateLoopError = normalizeError(error);\n this.updateSignal.resolve();\n });\n }\n\n private async runFramebufferUpdateLoop(): Promise<void> {\n let incremental = false;\n\n while (!this.closed) {\n await sendFramebufferUpdateRequest(\n this.transport,\n incremental,\n 0,\n 0,\n this.width,\n this.height,\n );\n\n const outcome = await this.readUntilFramebufferUpdate();\n if (outcome.sawResize && !outcome.sawRaw) {\n incremental = false;\n continue;\n }\n\n if (outcome.sawRaw) {\n this.framebufferVersion += 1;\n this.updateSignal.resolve();\n }\n\n incremental = true;\n }\n }\n\n private async readUntilFramebufferUpdate(): Promise<FramebufferUpdateOutcome> {\n while (true) {\n const outcome = await this.readServerMessage();\n if (outcome.kind === \"framebufferUpdate\") {\n return outcome;\n }\n }\n }\n\n private async waitForFramebufferVersion(\n minimumVersion: number,\n timeoutSeconds: number,\n timeoutMessage: string,\n ): Promise<void> {\n const timeoutMs = secondsToMillis(timeoutSeconds);\n const deadline = Date.now() + timeoutMs;\n\n while (this.framebufferVersion < minimumVersion) {\n if (this.updateLoopError) {\n throw this.updateLoopError;\n }\n if (this.closed) {\n throw new SandboxError(\"desktop session is closed\");\n }\n\n const observedVersion = this.framebufferVersion;\n const waitForUpdate = this.updateSignal.wait();\n if (this.framebufferVersion !== observedVersion) {\n continue;\n }\n\n const remainingMs = Math.max(0, deadline - Date.now());\n if (remainingMs === 0) {\n break;\n }\n\n await withTimeout(remainingMs, () => waitForUpdate, timeoutMessage);\n }\n\n if (this.framebufferVersion < minimumVersion) {\n throw new SandboxError(timeoutMessage);\n }\n }\n\n private async readServerMessage(): Promise<ServerMessageOutcome> {\n const messageType = await readU8(this.transport);\n if (messageType === 0) {\n return this.readFramebufferUpdate();\n }\n if (messageType === 1) {\n await this.readSetColorMapEntries();\n return { kind: \"bell\" };\n }\n if (messageType === 2) {\n return { kind: \"bell\" };\n }\n if (messageType === 3) {\n await this.readServerCutText();\n return { kind: \"serverCutText\" };\n }\n throw new SandboxError(`unsupported VNC server message type ${messageType}`);\n }\n\n private async readFramebufferUpdate(): Promise<FramebufferUpdateOutcome> {\n await readU8(this.transport);\n const rectangleCount = await readU16(this.transport);\n let sawResize = false;\n let sawRaw = false;\n\n for (let index = 0; index < rectangleCount; index += 1) {\n const x = await readU16(this.transport);\n const y = await readU16(this.transport);\n const width = await readU16(this.transport);\n const height = await readU16(this.transport);\n const encoding = await readI32(this.transport);\n\n if (encoding === ENCODING_RAW) {\n const bytesPerPixel = this.pixelFormat.bytesPerPixel();\n const length = width * height * bytesPerPixel;\n const data = await this.transport.readExactly(length);\n this.blitRawRectangle(x, y, width, height, data);\n sawRaw = true;\n continue;\n }\n\n if (encoding === ENCODING_DESKTOP_SIZE) {\n this.resizeFramebuffer(width, height);\n sawResize = true;\n continue;\n }\n\n throw new SandboxError(`unsupported VNC rectangle encoding ${encoding}`);\n }\n\n return { kind: \"framebufferUpdate\", sawResize, sawRaw };\n }\n\n private async readSetColorMapEntries(): Promise<void> {\n await readU8(this.transport);\n await readU16(this.transport);\n const colorCount = await readU16(this.transport);\n await this.transport.readExactly(colorCount * 6);\n throw new SandboxError(\n \"desktop sessions do not support color-map VNC pixel formats\",\n );\n }\n\n private async readServerCutText(): Promise<void> {\n await this.transport.readExactly(3);\n const length = await readU32(this.transport);\n await this.transport.readExactly(length);\n }\n\n private resizeFramebuffer(width: number, height: number): void {\n this.width = width;\n this.height = height;\n this.framebuffer = allocateFramebuffer(width, height);\n this.pointerX = width > 0 ? Math.min(this.pointerX, width - 1) : 0;\n this.pointerY = height > 0 ? Math.min(this.pointerY, height - 1) : 0;\n }\n\n private blitRawRectangle(\n x: number,\n y: number,\n width: number,\n height: number,\n data: Uint8Array,\n ): void {\n if (x + width > this.width || y + height > this.height) {\n throw new SandboxError(\"desktop raw rectangle exceeds framebuffer bounds\");\n }\n\n const bytesPerPixel = this.pixelFormat.bytesPerPixel();\n for (let row = 0; row < height; row += 1) {\n for (let col = 0; col < width; col += 1) {\n const srcIndex = (row * width + col) * bytesPerPixel;\n const rgba = this.pixelFormat.decodePixel(\n data.subarray(srcIndex, srcIndex + bytesPerPixel),\n );\n const dstIndex = ((y + row) * this.width + x + col) * 4;\n this.framebuffer.set(rgba, dstIndex);\n }\n }\n }\n}\n\nexport class Desktop {\n private session: DesktopSession<TunnelByteStream>;\n private readonly connectRequest: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n };\n private operationChain: Promise<void> = Promise.resolve();\n private reconnectPromise: Promise<void> | null = null;\n private closed = false;\n\n private constructor(\n session: DesktopSession<TunnelByteStream>,\n connectRequest: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n },\n ) {\n this.session = session;\n this.connectRequest = connectRequest;\n }\n\n static async connect(options: DesktopConnectRequest): Promise<Desktop> {\n const connectRequest = normalizeDesktopConnectRequest(options);\n const session = await openDesktopSession(connectRequest);\n return new Desktop(session, connectRequest);\n }\n\n get width(): number {\n return this.session.width;\n }\n\n get height(): number {\n return this.session.height;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n await this.enqueue(() => this.session.close());\n }\n\n async screenshot(timeout = 5): Promise<Uint8Array> {\n return this.enqueue(() => this.captureScreenshot(timeout));\n }\n\n getFrameVersion(): number {\n return this.session.getFrameVersion();\n }\n\n async screenshotAfter(frameVersion: number, timeout = 1): Promise<Uint8Array> {\n return this.enqueue(() => this.captureScreenshotAfter(frameVersion, timeout));\n }\n\n async moveMouse(x: number, y: number): Promise<void> {\n await this.enqueue(() => this.session.moveMouse(x, y));\n }\n\n async mousePress(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.mousePress(options));\n }\n\n async mouseRelease(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.mouseRelease(options));\n }\n\n async click(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.click(options));\n }\n\n async doubleClick(options?: DesktopDoubleClickOptions): Promise<void> {\n await this.enqueue(() => this.session.doubleClick(options));\n }\n\n async leftClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"left\", x, y });\n }\n\n async middleClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"middle\", x, y });\n }\n\n async rightClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"right\", x, y });\n }\n\n async scroll(steps: number, x?: number, y?: number): Promise<void> {\n await this.enqueue(() => this.session.scroll(steps, x, y));\n }\n\n async scrollUp(steps = 1, x?: number, y?: number): Promise<void> {\n await this.scroll(Math.abs(steps), x, y);\n }\n\n async scrollDown(steps = 1, x?: number, y?: number): Promise<void> {\n await this.scroll(-Math.abs(steps), x, y);\n }\n\n async keyDown(key: string): Promise<void> {\n await this.enqueue(() => this.session.keyDown(key));\n }\n\n async keyUp(key: string): Promise<void> {\n await this.enqueue(() => this.session.keyUp(key));\n }\n\n async press(keys: string | string[]): Promise<void> {\n await this.enqueue(() => this.session.press(keys));\n }\n\n async typeText(text: string): Promise<void> {\n await this.enqueue(() => this.session.typeText(text));\n }\n\n private enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const run = this.operationChain.catch(() => {}).then(operation);\n this.operationChain = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n\n private async captureScreenshot(timeout: number): Promise<Uint8Array> {\n try {\n return await this.session.screenshot(timeout);\n } catch (error) {\n if (!isReconnectableDesktopScreenshotError(error) || this.closed) {\n throw error;\n }\n\n await this.reconnect();\n return this.session.screenshot(timeout);\n }\n }\n\n private async captureScreenshotAfter(\n frameVersion: number,\n timeout: number,\n ): Promise<Uint8Array> {\n try {\n return await this.session.screenshotAfter(frameVersion, timeout);\n } catch (error) {\n if (!isReconnectableDesktopScreenshotError(error) || this.closed) {\n throw error;\n }\n\n await this.reconnect();\n return this.session.screenshot(timeout);\n }\n }\n\n private async reconnect(): Promise<void> {\n if (this.reconnectPromise) {\n return this.reconnectPromise;\n }\n\n this.reconnectPromise = this.performReconnect().finally(() => {\n this.reconnectPromise = null;\n });\n return this.reconnectPromise;\n }\n\n private async performReconnect(): Promise<void> {\n const previousSession = this.session;\n await previousSession.close().catch(() => {});\n this.session = await openDesktopSession(this.connectRequest);\n }\n}\n\nclass ProtocolVersion {\n readonly major: number;\n readonly minor: number;\n\n constructor(major: number, minor: number) {\n this.major = major;\n this.minor = minor;\n }\n\n static async read(transport: DesktopTransport): Promise<ProtocolVersion> {\n const raw = await transport.readExactly(12);\n const text = raw.toString(\"ascii\");\n const trimmed = text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n const match = /^RFB (\\d{3})\\.(\\d{3})$/.exec(trimmed);\n if (!match) {\n throw new SandboxError(`invalid VNC protocol banner \\`${text}\\``);\n }\n return new ProtocolVersion(Number.parseInt(match[1], 10), Number.parseInt(match[2], 10));\n }\n\n negotiated(): ProtocolVersion {\n if (this.major !== 3 || this.minor >= 8) {\n return new ProtocolVersion(3, 8);\n }\n if (this.minor >= 7) {\n return new ProtocolVersion(3, 7);\n }\n return new ProtocolVersion(3, 3);\n }\n\n render(): string {\n return `RFB ${String(this.major).padStart(3, \"0\")}.${String(this.minor).padStart(3, \"0\")}\\n`;\n }\n}\n\nclass PixelFormat {\n readonly bitsPerPixel: number;\n readonly depth: number;\n readonly bigEndian: boolean;\n readonly trueColor: boolean;\n readonly redMax: number;\n readonly greenMax: number;\n readonly blueMax: number;\n readonly redShift: number;\n readonly greenShift: number;\n readonly blueShift: number;\n\n constructor(options: {\n bitsPerPixel: number;\n depth: number;\n bigEndian: boolean;\n trueColor: boolean;\n redMax: number;\n greenMax: number;\n blueMax: number;\n redShift: number;\n greenShift: number;\n blueShift: number;\n }) {\n this.bitsPerPixel = options.bitsPerPixel;\n this.depth = options.depth;\n this.bigEndian = options.bigEndian;\n this.trueColor = options.trueColor;\n this.redMax = options.redMax;\n this.greenMax = options.greenMax;\n this.blueMax = options.blueMax;\n this.redShift = options.redShift;\n this.greenShift = options.greenShift;\n this.blueShift = options.blueShift;\n }\n\n static preferred(): PixelFormat {\n return new PixelFormat({\n bitsPerPixel: 32,\n depth: 24,\n bigEndian: false,\n trueColor: true,\n redMax: 255,\n greenMax: 255,\n blueMax: 255,\n redShift: 16,\n greenShift: 8,\n blueShift: 0,\n });\n }\n\n static parse(bytes: Uint8Array): PixelFormat {\n if (bytes.length !== 16) {\n throw new SandboxError(\"invalid VNC pixel format payload length\");\n }\n return new PixelFormat({\n bitsPerPixel: bytes[0],\n depth: bytes[1],\n bigEndian: bytes[2] !== 0,\n trueColor: bytes[3] !== 0,\n redMax: Buffer.from(bytes.subarray(4, 6)).readUInt16BE(0),\n greenMax: Buffer.from(bytes.subarray(6, 8)).readUInt16BE(0),\n blueMax: Buffer.from(bytes.subarray(8, 10)).readUInt16BE(0),\n redShift: bytes[10],\n greenShift: bytes[11],\n blueShift: bytes[12],\n });\n }\n\n bytesPerPixel(): number {\n return this.bitsPerPixel / 8;\n }\n\n encode(): Uint8Array {\n const bytes = Buffer.alloc(16);\n bytes[0] = this.bitsPerPixel;\n bytes[1] = this.depth;\n bytes[2] = this.bigEndian ? 1 : 0;\n bytes[3] = this.trueColor ? 1 : 0;\n bytes.writeUInt16BE(this.redMax, 4);\n bytes.writeUInt16BE(this.greenMax, 6);\n bytes.writeUInt16BE(this.blueMax, 8);\n bytes[10] = this.redShift;\n bytes[11] = this.greenShift;\n bytes[12] = this.blueShift;\n return bytes;\n }\n\n decodePixel(bytes: Uint8Array): Uint8Array {\n if (bytes.length !== this.bytesPerPixel()) {\n throw new SandboxError(\"desktop pixel buffer has an unexpected size\");\n }\n\n let value = 0;\n if (this.bigEndian) {\n for (const byte of bytes) {\n value = (value << 8) | byte;\n }\n } else {\n for (let index = 0; index < bytes.length; index += 1) {\n value |= bytes[index] << (index * 8);\n }\n }\n\n const red = scaleChannel((value >> this.redShift) & this.redMax, this.redMax);\n const green = scaleChannel(\n (value >> this.greenShift) & this.greenMax,\n this.greenMax,\n );\n const blue = scaleChannel((value >> this.blueShift) & this.blueMax, this.blueMax);\n return Uint8Array.of(red, green, blue, 255);\n }\n}\n\nclass ServerInit {\n readonly width: number;\n readonly height: number;\n readonly pixelFormat: PixelFormat;\n\n constructor(width: number, height: number, pixelFormat: PixelFormat) {\n this.width = width;\n this.height = height;\n this.pixelFormat = pixelFormat;\n }\n\n static async read(transport: DesktopTransport): Promise<ServerInit> {\n const width = await readU16(transport);\n const height = await readU16(transport);\n const pixelFormat = PixelFormat.parse(await transport.readExactly(16));\n const nameLength = await readU32(transport);\n await transport.readExactly(nameLength);\n return new ServerInit(width, height, pixelFormat);\n }\n}\n\nasync function negotiateSecurity(\n transport: DesktopTransport,\n version: ProtocolVersion,\n password?: string,\n): Promise<number> {\n let securityTypes: number[];\n\n if (version.minor === 3) {\n const securityType = await readU32(transport);\n if (securityType === 0) {\n const reasonLength = await readU32(transport);\n const reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n }\n securityTypes = [securityType];\n } else {\n const count = await readU8(transport);\n if (count === 0) {\n const reasonLength = await readU32(transport);\n const reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n }\n securityTypes = [...(await transport.readExactly(count))];\n }\n\n let selected: number;\n if (password != null && securityTypes.includes(SECURITY_TYPE_VNC_AUTH)) {\n selected = SECURITY_TYPE_VNC_AUTH;\n } else if (securityTypes.includes(SECURITY_TYPE_NONE)) {\n selected = SECURITY_TYPE_NONE;\n } else if (securityTypes.includes(SECURITY_TYPE_VNC_AUTH)) {\n throw new SandboxError(\n \"VNC server requires password authentication but no password was provided\",\n );\n } else {\n throw new SandboxError(\n `unsupported VNC security types advertised by server: [${securityTypes.join(\", \")}]`,\n );\n }\n\n if (version.minor >= 7) {\n await transport.writeAll(Uint8Array.of(selected));\n }\n\n if (selected === SECURITY_TYPE_VNC_AUTH) {\n if (password == null) {\n throw new SandboxError(\n \"VNC server requires password authentication but no password was provided\",\n );\n }\n const challenge = await transport.readExactly(16);\n const response = encryptVncChallenge(Buffer.from(password, \"utf8\"), challenge);\n await transport.writeAll(response);\n await readSecurityResult(transport, version.minor >= 8);\n } else if (version.minor >= 8) {\n await readSecurityResult(transport, true);\n }\n\n return selected;\n}\n\nfunction encryptVncChallenge(password: Uint8Array, challenge: Uint8Array): Uint8Array {\n if (challenge.length !== 16) {\n throw new SandboxError(\"VNC authentication challenge must be 16 bytes\");\n }\n\n const key = Buffer.alloc(8);\n for (let index = 0; index < Math.min(password.length, 8); index += 1) {\n key[index] = reverseBits(password[index]);\n }\n\n const roundKeys = buildDesRoundKeys(key);\n const output = Buffer.alloc(16);\n for (let blockIndex = 0; blockIndex < 2; blockIndex += 1) {\n const start = blockIndex * 8;\n const encrypted = encryptDesBlock(challenge.subarray(start, start + 8), roundKeys);\n output.set(encrypted, start);\n }\n return output;\n}\n\nfunction reverseBits(value: number): number {\n let reversed = 0;\n for (let bit = 0; bit < 8; bit += 1) {\n reversed |= ((value >> bit) & 1) << (7 - bit);\n }\n return reversed;\n}\n\nasync function readSecurityResult(\n transport: DesktopTransport,\n hasReasonString: boolean,\n): Promise<void> {\n const status = await readU32(transport);\n if (status === 0) {\n return;\n }\n\n let reason: string;\n if (hasReasonString) {\n const reasonLength = await readU32(transport);\n reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n } else if (status === 1) {\n reason = \"authentication failed\";\n } else {\n reason = `security handshake failed with status ${status}`;\n }\n\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n}\n\nasync function sendSetPixelFormat(\n transport: DesktopTransport,\n pixelFormat: PixelFormat,\n): Promise<void> {\n const message = Buffer.alloc(20);\n message[0] = 0;\n message.set(pixelFormat.encode(), 4);\n await transport.writeAll(message);\n}\n\nasync function sendSetEncodings(\n transport: DesktopTransport,\n encodings: number[],\n): Promise<void> {\n const message = Buffer.alloc(4 + encodings.length * 4);\n message[0] = 2;\n message.writeUInt16BE(encodings.length, 2);\n for (let index = 0; index < encodings.length; index += 1) {\n message.writeInt32BE(encodings[index], 4 + index * 4);\n }\n await transport.writeAll(message);\n}\n\nasync function sendFramebufferUpdateRequest(\n transport: DesktopTransport,\n incremental: boolean,\n x: number,\n y: number,\n width: number,\n height: number,\n): Promise<void> {\n const message = Buffer.alloc(10);\n message[0] = 3;\n message[1] = incremental ? 1 : 0;\n message.writeUInt16BE(x, 2);\n message.writeUInt16BE(y, 4);\n message.writeUInt16BE(width, 6);\n message.writeUInt16BE(height, 8);\n await transport.writeAll(message);\n}\n\nasync function sendPointerEvent(\n transport: DesktopTransport,\n buttonMask: number,\n x: number,\n y: number,\n): Promise<void> {\n const message = Buffer.alloc(6);\n message[0] = 5;\n message[1] = buttonMask;\n message.writeUInt16BE(x, 2);\n message.writeUInt16BE(y, 4);\n await transport.writeAll(message);\n}\n\nasync function sendKeyEvent(\n transport: DesktopTransport,\n down: boolean,\n keysym: number,\n): Promise<void> {\n const message = Buffer.alloc(8);\n message[0] = 4;\n message[1] = down ? 1 : 0;\n message.writeUInt32BE(keysym, 4);\n await transport.writeAll(message);\n}\n\nasync function readU8(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(1))[0];\n}\n\nasync function readU16(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(2)).readUInt16BE(0);\n}\n\nasync function readU32(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(4)).readUInt32BE(0);\n}\n\nasync function readI32(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(4)).readInt32BE(0);\n}\n\nfunction scaleChannel(value: number, max: number): number {\n if (max === 0) {\n throw new SandboxError(\"invalid VNC pixel format with zero channel range\");\n }\n return Math.trunc((value * 255) / max);\n}\n\nfunction allocateFramebuffer(width: number, height: number): Uint8Array {\n return new Uint8Array(width * height * 4);\n}\n\nfunction normalizeDesktopConnectRequest(\n options: DesktopConnectRequest,\n): DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n} {\n return {\n ...options,\n port: validatePort(options.port ?? 5901, \"desktop port\"),\n shared: options.shared ?? true,\n connectTimeout: options.connectTimeout ?? 10,\n };\n}\n\nasync function openDesktopSession(\n options: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n },\n): Promise<DesktopSession<TunnelByteStream>> {\n const connectTimeoutMs = secondsToMillis(options.connectTimeout);\n const state: { transport?: TunnelByteStream } = {};\n\n try {\n return await withTimeout(\n connectTimeoutMs,\n async () => {\n state.transport = await TunnelByteStream.connect({\n baseUrl: options.baseUrl,\n wsHeaders: options.wsHeaders,\n remotePort: options.port,\n connectTimeoutMs,\n });\n return DesktopSession.connect(\n state.transport,\n options.password,\n options.shared,\n );\n },\n `timed out while connecting desktop session after ${options.connectTimeout.toFixed(2)}s`,\n );\n } catch (error) {\n if (state.transport) {\n await state.transport.close().catch(() => {});\n }\n throw error;\n }\n}\n\nfunction isReconnectableDesktopScreenshotError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes(\"desktop tunnel closed unexpectedly\") ||\n message.includes(\"desktop tunnel is not connected\") ||\n message.includes(\"connection closed\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"timed out waiting for initial desktop framebuffer\") ||\n message.includes(\"timed out while connecting tunnel websocket\") ||\n message.includes(\"tunnel websocket closed before opening\") ||\n message.includes(\"tunnel websocket handshake failed\")\n );\n}\n\nfunction createDeferredSignal(): {\n resolve(): void;\n wait(): Promise<void>;\n} {\n let resolveCurrent!: () => void;\n let promise = new Promise<void>((resolve) => {\n resolveCurrent = resolve;\n });\n\n return {\n resolve() {\n resolveCurrent();\n promise = new Promise<void>((resolve) => {\n resolveCurrent = resolve;\n });\n },\n wait() {\n return promise;\n },\n };\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new SandboxError(String(error));\n}\n\nfunction buttonMask(button: MouseButton | string): number {\n const normalized = button.trim().toLowerCase();\n if (normalized === \"left\") return BUTTON_LEFT_MASK;\n if (normalized === \"middle\") return BUTTON_MIDDLE_MASK;\n if (normalized === \"right\") return BUTTON_RIGHT_MASK;\n throw new SandboxError(\n `unsupported mouse button \\`${button}\\`; expected left, middle, or right`,\n );\n}\n\nfunction keysymFromKeyName(key: string): number {\n const trimmed = key.trim();\n if (trimmed.length === 0) {\n throw new SandboxError(\"desktop key name cannot be empty\");\n }\n\n if ([...trimmed].length === 1) {\n return keysymFromChar(trimmed);\n }\n\n const normalized = trimmed.toLowerCase();\n const special = SPECIAL_KEYSYMS.get(normalized);\n if (special != null) {\n return special;\n }\n\n const functionMatch = /^f([1-9]|1[0-2])$/.exec(normalized);\n if (functionMatch) {\n return 0xffbd + Number.parseInt(functionMatch[1], 10);\n }\n\n throw new SandboxError(`unsupported desktop key \\`${trimmed}\\``);\n}\n\nfunction keysymFromChar(char: string): number {\n const codePoint = char.codePointAt(0);\n if (codePoint == null) {\n throw new SandboxError(\"desktop key name cannot be empty\");\n }\n if (char === \"\\n\" || char === \"\\r\") return 0xff0d;\n if (char === \"\\t\") return 0xff09;\n if (char === \"\\b\") return 0xff08;\n if (codePoint >= 0x20 && codePoint <= 0x7e) return codePoint;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n throw new SandboxError(\n `unsupported control character U+${codePoint.toString(16).toUpperCase().padStart(4, \"0\")} for desktop typing`,\n );\n }\n return 0x0100_0000 | codePoint;\n}\n\nfunction encodePng(width: number, height: number, rgba: Uint8Array): Uint8Array {\n const stride = width * 4;\n const raw = Buffer.alloc((stride + 1) * height);\n for (let row = 0; row < height; row += 1) {\n const srcOffset = row * stride;\n const dstOffset = row * (stride + 1);\n raw[dstOffset] = 0;\n raw.set(rgba.subarray(srcOffset, srcOffset + stride), dstOffset + 1);\n }\n\n const ihdr = Buffer.alloc(13);\n ihdr.writeUInt32BE(width, 0);\n ihdr.writeUInt32BE(height, 4);\n ihdr[8] = 8;\n ihdr[9] = 6;\n ihdr[10] = 0;\n ihdr[11] = 0;\n ihdr[12] = 0;\n\n const idat = deflateSync(raw);\n return Buffer.concat([\n PNG_SIGNATURE,\n pngChunk(\"IHDR\", ihdr),\n pngChunk(\"IDAT\", idat),\n pngChunk(\"IEND\", Buffer.alloc(0)),\n ]);\n}\n\nfunction pngChunk(type: string, data: Buffer): Buffer {\n const chunkType = Buffer.from(type, \"ascii\");\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length, 0);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(Buffer.concat([chunkType, data])), 0);\n return Buffer.concat([length, chunkType, data, crc]);\n}\n\nfunction crc32(data: Uint8Array): number {\n let crc = 0xffff_ffff;\n for (const byte of data) {\n crc = CRC32_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffff_ffff) >>> 0;\n}\n\nfunction buildCrc32Table(): Uint32Array {\n const table = new Uint32Array(256);\n for (let index = 0; index < 256; index += 1) {\n let value = index;\n for (let bit = 0; bit < 8; bit += 1) {\n value = (value & 1) !== 0 ? 0xedb8_8320 ^ (value >>> 1) : value >>> 1;\n }\n table[index] = value >>> 0;\n }\n return table;\n}\n\nfunction validateCoordinate(value: number, label: string): number {\n return validateIntegerInRange(value, label, 0, 0xffff);\n}\n\nfunction validatePort(value: number, label: string): number {\n return validateIntegerInRange(value, label, 1, 65535);\n}\n\nfunction validateIntegerInRange(\n value: number,\n label: string,\n min: number,\n max: number,\n): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new SandboxError(`${label} must be an integer between ${min} and ${max}, got ${value}`);\n }\n return value;\n}\n\nfunction validateInteger(value: number, label: string): number {\n if (!Number.isInteger(value)) {\n throw new SandboxError(`${label} must be an integer, got ${value}`);\n }\n return value;\n}\n\nfunction validateNonNegativeInteger(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new SandboxError(`${label} must be a non-negative integer, got ${value}`);\n }\n return value;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds < 0) {\n throw new SandboxError(`timeout must be >= 0 seconds, got ${seconds}`);\n }\n return Math.round(seconds * 1000);\n}\n\nconst SPECIAL_KEYSYMS = new Map<string, number>([\n [\"enter\", 0xff0d],\n [\"tab\", 0xff09],\n [\"escape\", 0xff1b],\n [\"backspace\", 0xff08],\n [\"delete\", 0xffff],\n [\"space\", 0x0020],\n [\"up\", 0xff52],\n [\"down\", 0xff54],\n [\"left\", 0xff51],\n [\"right\", 0xff53],\n [\"home\", 0xff50],\n [\"end\", 0xff57],\n [\"pageup\", 0xff55],\n [\"pagedown\", 0xff56],\n [\"page_up\", 0xff55],\n [\"page_down\", 0xff56],\n [\"shift\", 0xffe1],\n [\"ctrl\", 0xffe3],\n [\"control\", 0xffe3],\n [\"alt\", 0xffe9],\n [\"meta\", 0xffe7],\n]);\n\nconst DES_INITIAL_PERMUTATION = [\n 58, 50, 42, 34, 26, 18, 10, 2,\n 60, 52, 44, 36, 28, 20, 12, 4,\n 62, 54, 46, 38, 30, 22, 14, 6,\n 64, 56, 48, 40, 32, 24, 16, 8,\n 57, 49, 41, 33, 25, 17, 9, 1,\n 59, 51, 43, 35, 27, 19, 11, 3,\n 61, 53, 45, 37, 29, 21, 13, 5,\n 63, 55, 47, 39, 31, 23, 15, 7,\n];\n\nconst DES_FINAL_PERMUTATION = [\n 40, 8, 48, 16, 56, 24, 64, 32,\n 39, 7, 47, 15, 55, 23, 63, 31,\n 38, 6, 46, 14, 54, 22, 62, 30,\n 37, 5, 45, 13, 53, 21, 61, 29,\n 36, 4, 44, 12, 52, 20, 60, 28,\n 35, 3, 43, 11, 51, 19, 59, 27,\n 34, 2, 42, 10, 50, 18, 58, 26,\n 33, 1, 41, 9, 49, 17, 57, 25,\n];\n\nconst DES_EXPANSION = [\n 32, 1, 2, 3, 4, 5,\n 4, 5, 6, 7, 8, 9,\n 8, 9, 10, 11, 12, 13,\n 12, 13, 14, 15, 16, 17,\n 16, 17, 18, 19, 20, 21,\n 20, 21, 22, 23, 24, 25,\n 24, 25, 26, 27, 28, 29,\n 28, 29, 30, 31, 32, 1,\n];\n\nconst DES_P_PERMUTATION = [\n 16, 7, 20, 21,\n 29, 12, 28, 17,\n 1, 15, 23, 26,\n 5, 18, 31, 10,\n 2, 8, 24, 14,\n 32, 27, 3, 9,\n 19, 13, 30, 6,\n 22, 11, 4, 25,\n];\n\nconst DES_PC1 = [\n 57, 49, 41, 33, 25, 17, 9,\n 1, 58, 50, 42, 34, 26, 18,\n 10, 2, 59, 51, 43, 35, 27,\n 19, 11, 3, 60, 52, 44, 36,\n 63, 55, 47, 39, 31, 23, 15,\n 7, 62, 54, 46, 38, 30, 22,\n 14, 6, 61, 53, 45, 37, 29,\n 21, 13, 5, 28, 20, 12, 4,\n];\n\nconst DES_PC2 = [\n 14, 17, 11, 24, 1, 5,\n 3, 28, 15, 6, 21, 10,\n 23, 19, 12, 4, 26, 8,\n 16, 7, 27, 20, 13, 2,\n 41, 52, 31, 37, 47, 55,\n 30, 40, 51, 45, 33, 48,\n 44, 49, 39, 56, 34, 53,\n 46, 42, 50, 36, 29, 32,\n];\n\nconst DES_ROTATIONS = [\n 1, 1, 2, 2, 2, 2, 2, 2,\n 1, 2, 2, 2, 2, 2, 2, 1,\n];\n\nconst DES_SBOXES = [\n [\n 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,\n 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,\n 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,\n 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,\n ],\n [\n 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,\n 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,\n 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,\n 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,\n ],\n [\n 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,\n 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,\n 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,\n 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,\n ],\n [\n 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,\n 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,\n 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,\n 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,\n ],\n [\n 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,\n 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,\n 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,\n 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,\n ],\n [\n 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,\n 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,\n 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,\n 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,\n ],\n [\n 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,\n 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,\n 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,\n 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,\n ],\n [\n 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,\n 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,\n 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,\n 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,\n ],\n];\n\nfunction buildDesRoundKeys(key: Uint8Array): bigint[] {\n const keyBlock = bytesToBigInt(key);\n const permuted = permuteBits(keyBlock, DES_PC1, 64);\n let c = Number((permuted >> 28n) & 0x0fff_ffffn);\n let d = Number(permuted & 0x0fff_ffffn);\n\n const roundKeys: bigint[] = [];\n for (const rotation of DES_ROTATIONS) {\n c = rotateLeft28(c, rotation);\n d = rotateLeft28(d, rotation);\n const combined = (BigInt(c) << 28n) | BigInt(d);\n roundKeys.push(permuteBits(combined, DES_PC2, 56));\n }\n return roundKeys;\n}\n\nfunction encryptDesBlock(block: Uint8Array, roundKeys: bigint[]): Uint8Array {\n let value = permuteBits(bytesToBigInt(block), DES_INITIAL_PERMUTATION, 64);\n let left = Number((value >> 32n) & 0xffff_ffffn);\n let right = Number(value & 0xffff_ffffn);\n\n for (const roundKey of roundKeys) {\n const nextLeft = right;\n const nextRight = (left ^ feistel(right, roundKey)) >>> 0;\n left = nextLeft >>> 0;\n right = nextRight;\n }\n\n value = (BigInt(right) << 32n) | BigInt(left);\n return bigIntToBytes(permuteBits(value, DES_FINAL_PERMUTATION, 64), 8);\n}\n\nfunction feistel(right: number, roundKey: bigint): number {\n const expanded = permuteBits(BigInt(right >>> 0), DES_EXPANSION, 32) ^ roundKey;\n let output = 0;\n for (let index = 0; index < 8; index += 1) {\n const shift = BigInt((7 - index) * 6);\n const chunk = Number((expanded >> shift) & 0x3fn);\n const row = ((chunk & 0x20) >> 4) | (chunk & 0x01);\n const column = (chunk >> 1) & 0x0f;\n output = (output << 4) | DES_SBOXES[index][row * 16 + column];\n }\n return Number(permuteBits(BigInt(output >>> 0), DES_P_PERMUTATION, 32)) >>> 0;\n}\n\nfunction rotateLeft28(value: number, shift: number): number {\n const masked = value & 0x0fff_ffff;\n return ((masked << shift) | (masked >>> (28 - shift))) & 0x0fff_ffff;\n}\n\nfunction permuteBits(input: bigint, table: number[], inputBits: number): bigint {\n let output = 0n;\n for (const position of table) {\n const shift = BigInt(inputBits - position);\n output = (output << 1n) | ((input >> shift) & 1n);\n }\n return output;\n}\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n return value;\n}\n\nfunction bigIntToBytes(value: bigint, length: number): Uint8Array {\n const out = Buffer.alloc(length);\n let remaining = value;\n for (let index = length - 1; index >= 0; index -= 1) {\n out[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return out;\n}\n","const SDK_TIMINGS_ENV_VAR = \"TENSORLAKE_SDK_TIMINGS\";\nconst SDK_TIMING_PAYLOADS_ENV_VAR = \"TENSORLAKE_SDK_TIMING_PAYLOADS\";\n\nexport type SdkTimingFields = Record<string, string | number | boolean | null | undefined>;\n\nexport function sdkTimingsEnabled(): boolean {\n const value = process.env[SDK_TIMINGS_ENV_VAR];\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function sdkTimingPayloadsEnabled(): boolean {\n const value = process.env[SDK_TIMING_PAYLOADS_ENV_VAR];\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function nowMs(): number {\n return performance.now();\n}\n\nexport function logSdkTiming(\n op: string,\n phase: string,\n startedAt: number,\n fields: SdkTimingFields = {},\n): void {\n if (!sdkTimingsEnabled()) return;\n logSdkTimingEvent(op, phase, {\n ...fields,\n duration_ms: Math.round((nowMs() - startedAt) * 100) / 100,\n });\n}\n\nexport function logSdkTimingEvent(\n op: string,\n phase: string,\n fields: SdkTimingFields = {},\n): void {\n if (!sdkTimingsEnabled()) return;\n\n const parts = [\n \"[tensorlake:sdk-timing]\",\n `op=${op}`,\n `phase=${phase}`,\n ];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value == null) continue;\n parts.push(`${key}=${formatSdkTimingValue(value)}`);\n }\n\n console.error(parts.join(\" \"));\n}\n\nfunction formatSdkTimingValue(value: string | number | boolean): string {\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (/^[A-Za-z0-9_./:@-]+$/.test(value)) {\n return value;\n }\n return JSON.stringify(value);\n}\n","import * as defaults from \"./defaults.js\";\n\n/** Remove a trailing slash from a URL string if present. */\nfunction trimTrailingSlashes(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/** Check whether a URL points to localhost. */\nexport function isLocalhost(apiUrl: string): boolean {\n try {\n const parsed = new URL(apiUrl);\n return parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n } catch {\n return false;\n }\n}\n\n/** Return the explicit sandbox proxy env override, if the user set one. */\nexport function explicitProxyUrlOverride(): string | undefined {\n const explicit = process.env.TENSORLAKE_SANDBOX_PROXY_URL?.trim();\n return explicit && explicit.length > 0 ? explicit : undefined;\n}\n\n/**\n * Resolve the legacy default proxy URL for direct sandbox handles.\n *\n * Normal client connect/create flows use the server-returned `sandboxUrl`.\n * This helper keeps the old direct-handle behavior and treats the env var as\n * an explicit override.\n *\n * Legacy priority:\n * 1. TENSORLAKE_SANDBOX_PROXY_URL env var\n * 2. `http://localhost:9443` for localhost API URLs\n * 3. Transform `api.X` → `sandbox.X`\n * 4. Default fallback\n */\nexport function resolveProxyUrl(apiUrl: string): string {\n const explicit = explicitProxyUrlOverride();\n if (explicit) return explicit;\n\n if (isLocalhost(apiUrl)) return \"http://localhost:9443\";\n\n try {\n const parsed = new URL(apiUrl);\n const host = parsed.hostname;\n if (host.startsWith(\"api.\")) {\n const proxyHost = \"sandbox.\" + host.slice(4);\n return `${parsed.protocol}//${proxyHost}`;\n }\n } catch {\n // fall through to default\n }\n\n return defaults.SANDBOX_PROXY_URL;\n}\n\n/**\n * Resolve the proxy target for a specific sandbox.\n *\n * - Localhost: base URL stays the same, Host header set to `{sandboxId}.local`\n * - Cloud: selected proxy domain with `X-Tensorlake-Sandbox-Id` header\n *\n * Returns `{ baseUrl, hostHeader, sandboxIdHeader }`.\n */\nexport function resolveProxyTarget(\n proxyUrl: string,\n sandboxId: string,\n): { baseUrl: string; hostHeader: string | undefined; sandboxIdHeader: string | undefined } {\n try {\n const parsed = new URL(proxyUrl);\n const host = parsed.hostname;\n\n if (host === \"localhost\" || host === \"127.0.0.1\") {\n return {\n baseUrl: trimTrailingSlashes(proxyUrl),\n hostHeader: `${sandboxId}.local`,\n sandboxIdHeader: undefined,\n };\n }\n\n const port = parsed.port ? `:${parsed.port}` : \"\";\n return {\n baseUrl: `${parsed.protocol}//${host}${port}`,\n hostHeader: undefined,\n sandboxIdHeader: sandboxId,\n };\n } catch {\n return {\n baseUrl: `${trimTrailingSlashes(proxyUrl)}/${sandboxId}`,\n hostHeader: undefined,\n sandboxIdHeader: undefined,\n };\n }\n}\n\n/**\n * Build a public sandbox URL from a server-provided ingress endpoint.\n *\n * `port` omitted or `9501` returns the management URL:\n * `https://<sandbox-id>.<ingress-host>`. User ports use the public\n * `<port>-<sandbox-id>.<ingress-host>` form.\n */\nexport function sandboxUrlFromIngressEndpoint(\n ingressEndpoint: string,\n sandboxId: string,\n port = 9501,\n): string {\n const parsed = new URL(ingressEndpoint);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"ingressEndpoint must be an absolute http(s) URL\");\n }\n const label = port === 9501 ? sandboxId : `${port}-${sandboxId}`;\n return `${parsed.protocol}//${label}.${parsed.host}`;\n}\n\n/**\n * Derive the sandbox lifecycle URL from the API URL.\n *\n * Transforms `api.X` → `sandbox.X` for cloud. Returns the URL unchanged for\n * localhost or unrecognised patterns.\n */\nexport function resolveSandboxLifecycleUrl(apiUrl: string): string {\n if (isLocalhost(apiUrl)) return apiUrl;\n\n try {\n const parsed = new URL(apiUrl);\n if (parsed.hostname.startsWith(\"api.\")) {\n parsed.hostname = \"sandbox.\" + parsed.hostname.slice(4);\n return parsed.toString().replace(/\\/$/, \"\");\n }\n } catch {\n // fall through\n }\n\n return apiUrl;\n}\n\n/**\n * Build a lifecycle API path.\n *\n * - Localhost (namespaced): `/v1/namespaces/{namespace}/{path}`\n * - Cloud (flat): `/{path}`\n */\nexport function lifecyclePath(\n path: string,\n isLocal: boolean,\n namespace: string,\n): string {\n if (isLocal) {\n return `/v1/namespaces/${namespace}/${path}`;\n }\n return `/${path}`;\n}\n","import type { SandboxClient } from \"./client.js\";\nimport {\n type ConnectDesktopOptions,\n Desktop,\n} from \"./desktop.js\";\nimport { SandboxError } from \"./errors.js\";\nimport { type Traced } from \"./http.js\";\nimport {\n assembleCommandResult,\n callNative,\n loadNativeSandboxBinding,\n nativeEventStream,\n type NativeSandboxProxyClient,\n} from \"./native-sandbox.js\";\nimport {\n type CheckpointOptions,\n type CommandResult,\n type ConnectOptions,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type CreateAndConnectOptions,\n type CreatePtySessionOptions,\n type DaemonInfo,\n type DirectoryEntry,\n type GetSandboxLogsOptions,\n type HealthResponse,\n type ListDirectoryResponse,\n type OutputEvent,\n type OutputResponse,\n OutputMode,\n type ProcessInfo,\n type ProcessUser,\n type PtySessionInfo,\n type RunOptions,\n type SandboxClientOptions,\n type SandboxInfo,\n type SandboxLogsResponse,\n type SandboxOptions,\n type SandboxProcessLogFiltersResponse,\n type SendSignalResponse,\n type FileSystemMount,\n type SnapshotInfo,\n type StartProcessOptions,\n SandboxStatus,\n StdinMode,\n type SuspendResumeOptions,\n type UpdateSandboxOptions,\n fromSnakeKeys,\n toSnakeKeys,\n} from \"./models.js\";\nimport {\n type CreateTunnelOptions,\n TcpTunnel,\n} from \"./tunnel.js\";\nimport { nowMs, logSdkTimingEvent, sdkTimingPayloadsEnabled, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride, resolveProxyTarget } from \"./url.js\";\nimport WebSocket, { type RawData } from \"ws\";\n\nclass SandboxProxyConnection {\n baseUrl = \"\";\n wsHeaders: Record<string, string> = {};\n\n private nativeProxy: NativeSandboxProxyClient | null = null;\n private resolveProxyInfo?: (\n identifier: string,\n ) => Promise<Traced<SandboxInfo>>;\n private resolvePromise: Promise<void> | null = null;\n private routingHint?: string;\n private readonly optionRoutingHint?: string;\n private readonly explicitProxyUrl?: string;\n private resolveGeneration = 0;\n\n constructor(\n private readonly sandbox: Sandbox,\n private readonly options: SandboxOptions,\n ) {\n this.routingHint = options.routingHint;\n this.optionRoutingHint = options.routingHint;\n this.explicitProxyUrl = options.explicitProxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n this.resolveProxyInfo = options.resolveProxyInfo;\n if (options.proxyUrl != null) {\n this.nativeProxy = this.configureProxy(\n options.proxyUrl,\n options.sandboxId,\n options.routingHint,\n );\n } else if (this.resolveProxyInfo == null) {\n throw new SandboxError(\n \"proxyUrl is required for direct Sandbox construction; use Sandbox.connect(...) or SandboxClient.connect(...) to use the server-returned sandbox_url.\",\n );\n }\n }\n\n async ensureResolved(): Promise<void> {\n if (this.nativeProxy != null) {\n return;\n }\n if (this.resolveProxyInfo == null) {\n return;\n }\n if (this.resolvePromise != null) {\n return this.resolvePromise;\n }\n\n const identifier = this.sandbox._getLifecycleIdentifier();\n const resolveStart = nowMs();\n logSdkTimingEvent(\"sandbox.proxy\", \"resolve_start\", {\n sandbox_id: identifier,\n });\n\n const generation = this.resolveGeneration;\n this.resolvePromise = this.resolveProxyInfo(identifier)\n .then((info) => {\n if (generation !== this.resolveGeneration) {\n return;\n }\n this.sandbox.traceId = info.traceId;\n this.sandbox._setLifecycleIdentifier(info.sandboxId);\n this.sandbox._setName(info.name ?? null);\n this.routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = this.options.nativeClient?.selectSandboxProxyUrl(\n info.sandboxId,\n info.sandboxUrl ?? null,\n info.ingressEndpoint ?? null,\n this.explicitProxyUrl ?? null,\n ) ?? info.sandboxUrl\n ?? this.explicitProxyUrl;\n if (proxyUrl == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n this.nativeProxy = this.configureProxy(\n proxyUrl,\n info.sandboxId,\n this.routingHint,\n );\n logSdkTiming(\"sandbox.proxy\", \"resolve_complete\", resolveStart, {\n sandbox_id: info.sandboxId,\n server_trace_id: info.traceId,\n routing_hint: this.routingHint,\n ingress_endpoint: info.ingressEndpoint,\n sandbox_url: info.sandboxUrl,\n });\n })\n .finally(() => {\n this.resolvePromise = null;\n });\n\n return this.resolvePromise;\n }\n\n hasExplicitProxyUrl(): boolean {\n return this.explicitProxyUrl != null;\n }\n\n refreshFromInfo(info: Traced<SandboxInfo>): void {\n const routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = this.options.nativeClient?.selectSandboxProxyUrl(\n info.sandboxId,\n info.sandboxUrl ?? null,\n info.ingressEndpoint ?? null,\n this.explicitProxyUrl ?? null,\n ) ?? info.sandboxUrl\n ?? this.explicitProxyUrl;\n if (proxyUrl == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n const state = this.buildProxyState(\n proxyUrl,\n info.sandboxId,\n routingHint,\n );\n this.resolveGeneration += 1;\n this.resolvePromise = null;\n this.routingHint = routingHint;\n this.nativeProxy = state.nativeProxy;\n this.baseUrl = state.baseUrl;\n this.wsHeaders = state.wsHeaders;\n this.sandbox.traceId = info.traceId;\n this.sandbox._setLifecycleIdentifier(info.sandboxId);\n this.sandbox._setName(info.name ?? null);\n }\n\n /** Await proxy resolution and return the Rust-backed proxy client. */\n async client(): Promise<NativeSandboxProxyClient> {\n await this.ensureResolved();\n if (this.nativeProxy == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n return this.nativeProxy;\n }\n\n close(): void {\n // The underlying reqwest client is released when the native handle is\n // garbage-collected; there is nothing to close eagerly.\n }\n\n private configureProxy(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string,\n ): NativeSandboxProxyClient {\n const state = this.buildProxyState(proxyUrl, sandboxId, routingHint);\n this.baseUrl = state.baseUrl;\n this.wsHeaders = state.wsHeaders;\n return state.nativeProxy;\n }\n\n private buildProxyState(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string,\n ): {\n nativeProxy: NativeSandboxProxyClient;\n baseUrl: string;\n wsHeaders: Record<string, string>;\n } {\n // `baseUrl`/`wsHeaders` are still computed here for the WebSocket consumers\n // (PTY, tunnel, desktop), which do not flow through the native HTTP client.\n const { baseUrl, hostHeader, sandboxIdHeader } = resolveProxyTarget(\n proxyUrl,\n sandboxId,\n );\n const wsHeaders: Record<string, string> = {};\n if (this.options.apiKey) {\n wsHeaders.Authorization = `Bearer ${this.options.apiKey}`;\n }\n if (this.options.organizationId) {\n wsHeaders[\"X-Forwarded-Organization-Id\"] = this.options.organizationId;\n }\n if (this.options.projectId) {\n wsHeaders[\"X-Forwarded-Project-Id\"] = this.options.projectId;\n }\n if (hostHeader) {\n wsHeaders.Host = hostHeader;\n }\n if (sandboxIdHeader) {\n wsHeaders[\"X-Tensorlake-Sandbox-Id\"] = sandboxIdHeader;\n }\n\n // Prefer minting from the shared lifecycle client so the proxy reuses its\n // connection pool; fall back to a standalone client when none was wired.\n let nativeProxy: NativeSandboxProxyClient;\n if (this.options.nativeClient) {\n nativeProxy = this.options.nativeClient.connectProxy(\n proxyUrl,\n sandboxId,\n routingHint ?? null,\n this.proxyRequestTimeoutSec(),\n );\n } else {\n const binding = loadNativeSandboxBinding();\n nativeProxy = new binding.NativeSandboxProxyClient(\n proxyUrl,\n sandboxId,\n this.options.apiKey ?? null,\n this.options.organizationId ?? null,\n this.options.projectId ?? null,\n routingHint ?? null,\n null,\n this.proxyRequestTimeoutSec(),\n );\n }\n return { nativeProxy, baseUrl, wsHeaders };\n }\n\n private proxyRequestTimeoutSec(): number | null {\n if (this.options.requestTimeout != null) {\n return this.options.requestTimeout;\n }\n if (this.options.timeoutMs != null) {\n return this.options.timeoutMs / 1000;\n }\n return null;\n }\n}\n\nfunction processUserPayload(\n user: ProcessUser | undefined,\n): ProcessUser | undefined {\n // No user requested: omit the field so the sandbox resolves the image's\n // configured user (the image USER directive, falling back to root).\n if (user == null) {\n return undefined;\n }\n if (typeof user === \"string\" && user.trim() === \"\") {\n throw new SandboxError(\"process user must not be empty\");\n }\n return user;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst PTY_OP_DATA = 0x00;\nconst PTY_OP_RESIZE = 0x01;\nconst PTY_OP_READY = 0x02;\nconst PTY_OP_EXIT = 0x03;\n\nexport type PtyDataHandler = (data: Uint8Array) => void;\nexport type PtyExitHandler = (exitCode: number) => void;\n\nexport interface PtyConnectionOptions {\n onData?: PtyDataHandler;\n onExit?: PtyExitHandler;\n}\n\nexport interface CreatePtyOptions\n extends CreatePtySessionOptions,\n PtyConnectionOptions {}\n\nexport class Pty {\n readonly sessionId: string;\n readonly token: string;\n\n private readonly wsUrl: string;\n private readonly wsHeaders: Record<string, string>;\n private readonly killSession: () => Promise<void>;\n private socket: WebSocket | null = null;\n private connectPromise: Promise<this> | null = null;\n private intentionalDisconnect = false;\n private exitCode: number | null = null;\n private waitSettled = false;\n private readonly dataHandlers = new Set<PtyDataHandler>();\n private readonly exitHandlers = new Set<PtyExitHandler>();\n private readonly waitPromise: Promise<number>;\n private resolveWait!: (exitCode: number) => void;\n private rejectWait!: (error: unknown) => void;\n\n constructor(options: {\n sessionId: string;\n token: string;\n wsUrl: string;\n wsHeaders: Record<string, string>;\n killSession: () => Promise<void>;\n }) {\n this.sessionId = options.sessionId;\n this.token = options.token;\n this.wsUrl = options.wsUrl;\n this.wsHeaders = options.wsHeaders;\n this.killSession = options.killSession;\n this.waitPromise = new Promise<number>((resolve, reject) => {\n this.resolveWait = resolve;\n this.rejectWait = reject;\n });\n }\n\n onData(handler: PtyDataHandler): () => void {\n this.dataHandlers.add(handler);\n return () => this.dataHandlers.delete(handler);\n }\n\n onExit(handler: PtyExitHandler): () => void {\n this.exitHandlers.add(handler);\n if (this.exitCode != null) {\n queueMicrotask(() => handler(this.exitCode!));\n }\n return () => this.exitHandlers.delete(handler);\n }\n\n async connect(): Promise<this> {\n if (this.socket?.readyState === WebSocket.OPEN) {\n return this;\n }\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.intentionalDisconnect = false;\n\n this.connectPromise = new Promise<this>((resolve, reject) => {\n let opened = false;\n const socket = new WebSocket(this.wsUrl, {\n headers: this.wsHeaders,\n });\n this.socket = socket;\n\n socket.on(\"open\", async () => {\n try {\n await sendPtyFrame(socket, Buffer.from([PTY_OP_READY]));\n opened = true;\n resolve(this);\n } catch (error) {\n reject(error);\n }\n });\n\n socket.on(\"message\", (message: RawData) => {\n const bytes = normalizePtyMessage(message);\n const opcode = bytes[0];\n\n if (opcode === PTY_OP_DATA) {\n const payload = bytes.subarray(1);\n for (const handler of this.dataHandlers) {\n handler(payload);\n }\n return;\n }\n\n if (opcode === PTY_OP_EXIT && bytes.length >= 5) {\n this.finishWait(bytes.readInt32BE(1));\n }\n });\n\n socket.on(\"close\", (code: number, reason: Buffer) => {\n const closeReason = Buffer.isBuffer(reason)\n ? reason.toString(\"utf8\")\n : String(reason);\n\n if (this.socket === socket) {\n this.socket = null;\n }\n this.connectPromise = null;\n\n if (this.exitCode != null) {\n this.finishWait(this.exitCode);\n return;\n }\n\n if (closeReason.startsWith(\"exit:\")) {\n const parsed = Number.parseInt(closeReason.slice(5), 10);\n this.finishWait(Number.isNaN(parsed) ? -1 : parsed);\n return;\n }\n\n if (this.intentionalDisconnect) {\n this.intentionalDisconnect = false;\n return;\n }\n\n if (!opened) {\n reject(new SandboxError(\n `PTY websocket closed before READY completed: ${code} ${closeReason || \"no reason\"}`,\n ));\n return;\n }\n\n if (closeReason === \"session terminated\") {\n this.failWait(new SandboxError(\"PTY session terminated\"));\n return;\n }\n\n this.failWait(\n new SandboxError(\n `PTY websocket closed unexpectedly: ${code} ${closeReason || \"no reason\"}`,\n ),\n );\n });\n\n socket.on(\"error\", (error: Error) => {\n if (!opened) {\n reject(error);\n }\n });\n });\n\n return this.connectPromise;\n }\n\n async sendInput(input: string | Uint8Array): Promise<void> {\n const socket = this.requireOpenSocket();\n await sendPtyFrame(socket, encodePtyInput(input));\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n const socket = this.requireOpenSocket();\n await sendPtyFrame(socket, encodePtyResize(cols, rows));\n }\n\n disconnect(code = 1000, reason = \"client disconnect\"): void {\n if (!this.socket) return;\n this.intentionalDisconnect = true;\n this.socket.close(code, reason);\n }\n\n wait(): Promise<number> {\n return this.waitPromise;\n }\n\n async kill(): Promise<void> {\n await this.killSession();\n }\n\n private requireOpenSocket(): WebSocket {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new SandboxError(\"PTY is not connected\");\n }\n return this.socket;\n }\n\n private finishWait(exitCode: number): void {\n if (this.waitSettled) return;\n this.waitSettled = true;\n this.exitCode = exitCode;\n for (const handler of this.exitHandlers) {\n handler(exitCode);\n }\n this.resolveWait(exitCode);\n }\n\n private failWait(error: unknown): void {\n if (this.waitSettled) return;\n this.waitSettled = true;\n this.rejectWait(error);\n }\n}\n\nfunction normalizePtyMessage(message: RawData): Buffer {\n if (Buffer.isBuffer(message)) return message;\n if (Array.isArray(message)) {\n return Buffer.concat(message.map((part) => Buffer.from(part)));\n }\n return Buffer.from(message);\n}\n\nfunction encodePtyInput(input: string | Uint8Array): Buffer {\n const payload =\n typeof input === \"string\" ? Buffer.from(input, \"utf8\") : Buffer.from(input);\n return Buffer.concat([Buffer.from([PTY_OP_DATA]), payload]);\n}\n\nfunction encodePtyResize(cols: number, rows: number): Buffer {\n const frame = Buffer.alloc(5);\n frame[0] = PTY_OP_RESIZE;\n frame.writeUInt16BE(cols, 1);\n frame.writeUInt16BE(rows, 3);\n return frame;\n}\n\nfunction sendPtyFrame(socket: WebSocket, frame: Buffer): Promise<void> {\n return new Promise((resolve, reject) => {\n socket.send(frame, (error?: Error) => (error ? reject(error) : resolve()));\n });\n}\n\n/**\n * Client for interacting with a running sandbox.\n *\n * Provides process management, file operations, and I/O streaming\n * through the sandbox proxy.\n */\nexport class Sandbox {\n readonly sandboxId: string;\n traceId: string | null = null;\n private readonly proxy: SandboxProxyConnection;\n private ownsSandbox = false;\n private lifecycleClient: SandboxClient | null = null;\n private lifecycleIdentifier: string;\n private sandboxName: string | null = null;\n\n constructor(options: SandboxOptions) {\n this.sandboxId = options.sandboxId;\n this.lifecycleIdentifier = options.sandboxId;\n this.proxy = new SandboxProxyConnection(this, options);\n }\n\n private get baseUrl(): string {\n return this.proxy.baseUrl;\n }\n\n private get wsHeaders(): Record<string, string> {\n return this.proxy.wsHeaders;\n }\n\n get name(): string | null {\n return this.sandboxName;\n }\n\n /** @internal Used by client wiring to keep locally cached name in sync. */\n _setName(name: string | null): void {\n this.sandboxName = name;\n }\n\n /** @internal Used by lifecycle operations to pin to canonical sandbox ID. */\n _setLifecycleIdentifier(identifier: string): void {\n this.lifecycleIdentifier = identifier;\n }\n\n /** @internal Used by the lazy proxy resolver. */\n _getLifecycleIdentifier(): string {\n return this.lifecycleIdentifier;\n }\n\n /** @internal Used by SandboxClient.createAndConnect to set ownership. */\n _setOwner(client: SandboxClient): void {\n this.ownsSandbox = true;\n this.lifecycleClient = client;\n }\n\n // --- Static factory methods ---\n\n /**\n * Create a new sandbox and return a connected, running handle.\n *\n * Covers both fresh sandbox creation and restore-from-snapshot (set\n * `snapshotId`). Blocks until the sandbox is `Running`.\n */\n static async create(\n options?: CreateAndConnectOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n // Dynamic import to break the circular dependency (client.ts imports Sandbox).\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.createAndConnect(options);\n }\n\n /**\n * Attach to an existing sandbox and return a connected handle.\n *\n * When `proxyUrl` is omitted, resolves the sandbox first so the handle uses\n * the correct cloud/region ingress endpoint. Does **not** auto-resume a\n * suspended sandbox — call `sandbox.resume()` explicitly.\n */\n static async connect(\n options: ConnectOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n const sandbox = client.connect(\n options.sandboxId,\n options.proxyUrl,\n options.routingHint,\n options.requestTimeout,\n );\n sandbox.lifecycleClient = client;\n return sandbox;\n }\n\n // --- Static snapshot management ---\n\n /** Get information about a snapshot by ID. No sandbox handle needed. */\n static async getSnapshot(\n snapshotId: string,\n options?: Partial<SandboxClientOptions>,\n ): Promise<SnapshotInfo> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.getSnapshot(snapshotId);\n }\n\n /** Delete a snapshot by ID. No sandbox handle needed. */\n static async deleteSnapshot(\n snapshotId: string,\n options?: Partial<SandboxClientOptions>,\n ): Promise<void> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n await client.deleteSnapshot(snapshotId);\n }\n\n /** List all sandboxes. No sandbox handle needed. */\n static async list(\n options?: Partial<SandboxClientOptions>,\n ): Promise<SandboxInfo[]> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.list();\n }\n\n /** List all snapshots in the project. No sandbox handle needed. */\n static async listSnapshots(\n options?: Partial<SandboxClientOptions>,\n ): Promise<SnapshotInfo[]> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.listSnapshots();\n }\n\n // --- Instance lifecycle methods ---\n\n private requireLifecycleClient(operation: string): SandboxClient {\n if (!this.lifecycleClient) {\n throw new SandboxError(\n `Cannot ${operation}: no lifecycle client available. ` +\n \"Use Sandbox.create() or Sandbox.connect() to get a lifecycle-aware handle.\",\n );\n }\n return this.lifecycleClient;\n }\n\n /** Fetch the current sandbox information from the server on demand. */\n async info(): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"info\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Fetch the current sandbox status from the server.\n *\n * Always hits the network — the value is not cached locally because the\n * status changes over the sandbox's lifecycle.\n */\n async status(): Promise<SandboxStatus> {\n const client = this.requireLifecycleClient(\"read_status\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info.status;\n }\n\n /**\n * Update this sandbox's properties (name, exposed ports, proxy auth).\n *\n * Naming an ephemeral sandbox makes it non-ephemeral and enables\n * suspend/resume.\n */\n async update(options: UpdateSandboxOptions): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"update\");\n const info = await client.update(this.lifecycleIdentifier, options);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Suspend this sandbox.\n *\n * By default blocks until the sandbox is fully `Suspended`. Pass\n * `{ wait: false }` for fire-and-return.\n */\n async suspend(options?: SuspendResumeOptions): Promise<void> {\n const client = this.requireLifecycleClient(\"suspend\");\n await client.suspend(this.lifecycleIdentifier, options);\n }\n\n /**\n * Resume this sandbox.\n *\n * By default blocks until the sandbox is `Running` and refreshes this\n * handle's cached proxy routing. Rare transient proxy errors may still occur\n * immediately after resume.\n *\n * Pass `{ wait: false }` for fire-and-return. That mode does not refresh\n * cached proxy routing on this handle; use the default wait behavior for\n * immediate follow-up operations, or wait until the sandbox is running and\n * reconnect before issuing process/file/PTY operations.\n */\n async resume(options?: SuspendResumeOptions): Promise<void> {\n const client = this.requireLifecycleClient(\"resume\");\n const wait = options?.wait !== false;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n await client.resume(this.lifecycleIdentifier, {\n ...options,\n timeout: Math.max(0, (deadline - Date.now()) / 1000),\n });\n if (!wait) return;\n\n while (Date.now() < deadline) {\n const info = await client.get(this.lifecycleIdentifier);\n if (\n info.status === SandboxStatus.RUNNING &&\n (info.sandboxUrl != null || this.proxy.hasExplicitProxyUrl())\n ) {\n this.proxy.refreshFromInfo(info);\n return;\n }\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(\n `Sandbox ${this.lifecycleIdentifier} terminated while refreshing proxy routing`,\n );\n }\n await sleep(Math.min(pollInterval * 1000, Math.max(0, deadline - Date.now())));\n }\n throw new SandboxError(\n `Sandbox ${this.lifecycleIdentifier} did not provide refreshed proxy routing within ${timeout}s`,\n );\n }\n\n /** Live-copy this running sandbox. */\n async copy(options?: CopySandboxOptions): Promise<Traced<CopySandboxResponse>> {\n const client = this.requireLifecycleClient(\"copy\");\n return client.copy(this.lifecycleIdentifier, options);\n }\n\n /**\n * Attach a registered file system to this running sandbox at `mountPath`.\n *\n * Returns the updated sandbox info; the new mount appears in\n * `fileSystems`.\n */\n async attachFileSystem(\n fileSystemId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"attachFileSystem\");\n const info = await client.attachFileSystem(\n this.lifecycleIdentifier,\n fileSystemId,\n mountPath,\n );\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Detach the file system mounted at `mountPath` from this running\n * sandbox.\n *\n * Returns the updated sandbox info with the mount removed from\n * `fileSystems`.\n */\n async detachFileSystem(mountPath: string): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"detachFileSystem\");\n const info = await client.detachFileSystem(\n this.lifecycleIdentifier,\n mountPath,\n );\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /** List the file systems currently mounted into this sandbox. */\n async listFileSystems(): Promise<Traced<FileSystemMount[]>> {\n const client = this.requireLifecycleClient(\"listFileSystems\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return Object.assign(info.fileSystems ?? [], { traceId: info.traceId });\n }\n\n /**\n * Create a checkpoint of this sandbox and wait for it to be locally ready.\n *\n * By default blocks until the checkpoint is resumable and returns\n * `SnapshotInfo`. Pass `{ wait: false }` to fire-and-return\n * (returns `undefined`).\n */\n async checkpoint(options?: CheckpointOptions): Promise<Traced<SnapshotInfo> | undefined> {\n const client = this.requireLifecycleClient(\"checkpoint\");\n if (options?.wait === false) {\n await client.snapshot(this.lifecycleIdentifier, { snapshotType: options.checkpointType });\n return undefined;\n }\n return client.snapshotAndWait(this.lifecycleIdentifier, {\n timeout: options?.timeout,\n pollInterval: options?.pollInterval,\n snapshotType: options?.checkpointType,\n waitUntil: options?.waitUntil,\n });\n }\n\n /**\n * List snapshots taken from this sandbox.\n */\n async listSnapshots(): Promise<Traced<SnapshotInfo[]>> {\n const client = this.requireLifecycleClient(\"listSnapshots\");\n const all = await client.listSnapshots();\n const filtered = all.filter((s) => s.sandboxId === this.lifecycleIdentifier);\n return Object.assign(filtered, { traceId: all.traceId });\n }\n\n /** Close the proxy connection. The sandbox keeps running. */\n close(): void {\n this.proxy.close();\n }\n\n /** Terminate the sandbox and release all resources. */\n async terminate(): Promise<void> {\n const client = this.lifecycleClient;\n this.ownsSandbox = false;\n this.lifecycleClient = null;\n this.close();\n if (client) {\n await client.delete(this.lifecycleIdentifier);\n }\n }\n\n // --- High-level convenience ---\n\n /**\n * Run a command to completion and return its output.\n *\n * Uses a single streaming `POST /api/v1/processes/run` request that starts\n * the process, streams output, and delivers the exit code over one connection.\n */\n async run(command: string, options?: RunOptions): Promise<Traced<CommandResult>> {\n const opStart = nowMs();\n const body: Record<string, unknown> = { command };\n if (options?.args) body.args = options.args;\n if (options?.env) body.env = options.env;\n if (options?.workingDir) body.working_dir = options.workingDir;\n if (options?.timeout != null) body.timeout = options.timeout;\n const user = processUserPayload(options?.user);\n if (user !== undefined) body.user = user;\n\n logSdkTimingEvent(\"sandbox.run\", \"start\", {\n sandbox_id: this.sandboxId,\n command: sdkTimingPayloadsEnabled() ? command : undefined,\n command_length: command.length,\n });\n\n const proxy = await this.proxy.client();\n const { traceId, events } = await callNative(\n () => proxy.runProcess(JSON.stringify(body)),\n { sandboxId: this.sandboxId },\n );\n const { exitCode, stdout, stderr } = assembleCommandResult(events);\n logSdkTiming(\"sandbox.run\", \"complete\", opStart, {\n sandbox_id: this.sandboxId,\n server_trace_id: traceId,\n command: sdkTimingPayloadsEnabled() ? command : undefined,\n command_length: command.length,\n exit_code: exitCode,\n });\n\n return Object.assign({ exitCode, stdout, stderr }, { traceId });\n }\n\n // --- Process management ---\n\n /**\n * Start a process in the sandbox without waiting for it to exit.\n *\n * Returns a `ProcessInfo` with the assigned `pid`. Use `getProcess()` to\n * poll status, or `followStdout()` / `followOutput()` to stream output\n * until the process exits. Use `run()` instead to block until completion\n * and get combined output in one call.\n */\n async startProcess(\n command: string,\n options?: StartProcessOptions,\n ): Promise<Traced<ProcessInfo>> {\n const payload: Record<string, unknown> = { command };\n if (options?.args != null) payload.args = options.args;\n if (options?.env != null) payload.env = options.env;\n if (options?.workingDir != null) payload.working_dir = options.workingDir;\n const user = processUserPayload(options?.user);\n if (user !== undefined) payload.user = user;\n if (options?.stdinMode != null && options.stdinMode !== StdinMode.CLOSED) {\n payload.stdin_mode = options.stdinMode;\n }\n if (options?.stdoutMode != null && options.stdoutMode !== OutputMode.CAPTURE) {\n payload.stdout_mode = options.stdoutMode;\n }\n if (options?.stderrMode != null && options.stderrMode !== OutputMode.CAPTURE) {\n payload.stderr_mode = options.stderrMode;\n }\n if (options?.name != null) {\n // Validate the managed name client-side (throws) via the single source-of-truth rule\n // in the Rust core. The daemon re-validates as the authority.\n loadNativeSandboxBinding().validateManagedName(options.name);\n payload.name = options.name;\n }\n if (options?.restart != null) payload.restart = toSnakeKeys(options.restart);\n if (options?.healthCheck != null) {\n payload.health_check = toSnakeKeys(options.healthCheck);\n }\n\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.startProcess(JSON.stringify(payload)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** List all processes (running and exited) tracked by the sandbox daemon. */\n async listProcesses(): Promise<Traced<ProcessInfo[]>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.listProcesses(), {\n sandboxId: this.sandboxId,\n });\n const parsed = JSON.parse(json) as { processes?: Record<string, unknown>[] };\n const processes = (parsed.processes ?? []).map(\n (p) => fromSnakeKeys(p) as ProcessInfo,\n );\n return Object.assign(processes, { traceId });\n }\n\n /** Read persisted logs for this sandbox from the log service. */\n async getLogs(\n options?: GetSandboxLogsOptions,\n ): Promise<Traced<SandboxLogsResponse>> {\n const client = this.requireLifecycleClient(\"get_logs\");\n const info = await this.info();\n return client.getLogs(info.sandboxId, options);\n }\n\n /** List processes available as persisted-log filters for this sandbox. */\n async listLogProcesses(): Promise<Traced<SandboxProcessLogFiltersResponse>> {\n const client = this.requireLifecycleClient(\"list_log_processes\");\n const info = await this.info();\n return client.listLogProcesses(info.sandboxId);\n }\n\n /** Get current status and metadata for a process. `process` is a PID or process name given on creation. */\n async getProcess(process: number | string): Promise<Traced<ProcessInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getProcess(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** Send SIGKILL to a process (or stop a managed process). `process` is a PID or process name given on creation. */\n async killProcess(process: number | string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.killProcess(String(process)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Restart a managed process. `process` is a PID or process name given on creation. */\n async restartProcess(process: number | string): Promise<Traced<ProcessInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.restartProcess(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** Send an arbitrary signal (e.g. `15` for SIGTERM, `9` for SIGKILL). `process` is a PID or process name given on creation. */\n async sendSignal(\n process: number | string,\n signal: number,\n ): Promise<Traced<SendSignalResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.sendSignal(String(process), signal),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as SendSignalResponse, {\n traceId,\n });\n }\n\n // --- Process I/O ---\n\n /** Write bytes to a process's stdin (must be started with `stdinMode: StdinMode.PIPE`). `process` is a PID or process name given on creation. */\n async writeStdin(process: number | string, data: Uint8Array): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.writeStdin(String(process), Buffer.from(data)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Close a process's stdin pipe, signalling EOF. `process` is a PID or process name given on creation. */\n async closeStdin(process: number | string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.closeStdin(String(process)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Return all captured stdout lines produced so far. `process` is a PID or process name given on creation. */\n async getStdout(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getStdout(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n /** Return all captured stderr lines produced so far. `process` is a PID or process name given on creation. */\n async getStderr(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getStderr(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n /** Return all captured stdout+stderr lines produced so far. `process` is a PID or process name given on creation. */\n async getOutput(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getOutput(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n // --- Streaming (SSE) ---\n\n /** Stream stdout events until the process exits. `process` is a PID or process name given on creation. */\n async *followStdout(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followStdout(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n /** Stream stderr events until the process exits. `process` is a PID or process name given on creation. */\n async *followStderr(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followStderr(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n /** Stream combined stdout+stderr events until the process exits. `process` is a PID or process name given on creation. */\n async *followOutput(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followOutput(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n // --- File operations ---\n\n /** Read a file from the sandbox and return its raw bytes. */\n async readFile(path: string): Promise<Traced<Uint8Array>> {\n const proxy = await this.proxy.client();\n const { traceId, data } = await callNative(() => proxy.readFile(path), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(Uint8Array.from(data), { traceId });\n }\n\n /** Write raw bytes to a file in the sandbox, creating it if it does not exist. */\n async writeFile(path: string, content: Uint8Array): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.writeFile(path, Buffer.from(content)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Delete a file from the sandbox. */\n async deleteFile(path: string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.deleteFile(path), { sandboxId: this.sandboxId });\n }\n\n /** List the contents of a directory in the sandbox. */\n async listDirectory(path: string): Promise<Traced<ListDirectoryResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.listDirectory(path), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ListDirectoryResponse, {\n traceId,\n });\n }\n\n // --- PTY ---\n\n /** Create an interactive PTY session. Returns a `sessionId` and `token` for WebSocket connection via `connectPty()`. */\n async createPtySession(\n options: CreatePtySessionOptions,\n ): Promise<Traced<PtySessionInfo>> {\n const payload: Record<string, unknown> = {\n command: options.command,\n rows: options.rows ?? 24,\n cols: options.cols ?? 80,\n };\n if (options.args != null) payload.args = options.args;\n if (options.env != null) payload.env = options.env;\n if (options.workingDir != null) payload.working_dir = options.workingDir;\n\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.createPtySession(JSON.stringify(payload)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as PtySessionInfo, { traceId });\n }\n\n /** Create a PTY session and connect to it immediately. Cleans up the session if the WebSocket connection fails. */\n async createPty(options: CreatePtyOptions): Promise<Pty> {\n const { onData, onExit, ...createOptions } = options;\n const session = await this.createPtySession(createOptions);\n try {\n return await this.connectPty(session.sessionId, session.token, { onData, onExit });\n } catch (error) {\n try {\n const proxy = await this.proxy.client();\n await proxy.deletePtySession(session.sessionId);\n } catch {}\n throw error;\n }\n }\n\n /** Attach to an existing PTY session by ID and token and return a connected `Pty` handle. */\n async connectPty(\n sessionId: string,\n token: string,\n options?: PtyConnectionOptions,\n ): Promise<Pty> {\n await this.proxy.ensureResolved();\n const wsUrl = new URL(this.ptyWsUrl(sessionId, token));\n const authToken = wsUrl.searchParams.get(\"token\") ?? token;\n\n const pty = new Pty({\n sessionId,\n token: authToken,\n wsUrl: wsUrl.toString(),\n wsHeaders: {\n ...this.wsHeaders,\n \"X-PTY-Token\": authToken,\n },\n killSession: async () => {\n const proxy = await this.proxy.client();\n await proxy.deletePtySession(sessionId);\n },\n });\n\n if (options?.onData) {\n pty.onData(options.onData);\n }\n if (options?.onExit) {\n pty.onExit(options.onExit);\n }\n\n await pty.connect();\n return pty;\n }\n\n /** Open a TCP tunnel to a port inside the sandbox and return the local listener. */\n async createTunnel(\n remotePort: number,\n options?: CreateTunnelOptions,\n ): Promise<TcpTunnel> {\n await this.proxy.ensureResolved();\n return TcpTunnel.listen({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n remotePort,\n localHost: options?.localHost,\n localPort: options?.localPort,\n connectTimeout: options?.connectTimeout,\n });\n }\n\n /** Connect to a sandbox VNC session for programmatic desktop control. */\n async connectDesktop(options?: ConnectDesktopOptions): Promise<Desktop> {\n await this.proxy.ensureResolved();\n const port = options?.port ?? 5901;\n const connectTimeout = options?.connectTimeout ?? 10;\n\n // Wait for the VNC port to be reachable inside the sandbox before\n // attempting the WebSocket tunnel handshake. Without this, freshly\n // created sandboxes (where the in-VM `vncserver` systemd unit is\n // still starting) race the tunnel: the dataplane gets `Connection\n // refused` on 127.0.0.1:<port> and the proxy returns 502 before\n // VNC has had a chance to bind. The wait is bounded by\n // `connectTimeout` along with the WS handshake and VNC negotiation\n // that follow — total wall-clock is what the caller asked for.\n const startMs = Date.now();\n const deadlineMs = startMs + connectTimeout * 1000;\n await this.waitForPortReady(port, deadlineMs);\n const remainingSecs = Math.max(0.1, (deadlineMs - Date.now()) / 1000);\n\n return Desktop.connect({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n port,\n password: options?.password,\n shared: options?.shared,\n connectTimeout: remainingSecs,\n });\n }\n\n /**\n * Poll the in-sandbox daemon until `127.0.0.1:port` accepts a TCP connection.\n * Uses `bash`'s `/dev/tcp` builtin via `processes/run` — no extra deps in\n * the sandbox image. `bash` is present on every image we ship.\n */\n private async waitForPortReady(\n port: number,\n deadlineMs: number,\n ): Promise<void> {\n const probeIntervalMs = 250;\n const probeProcessTimeoutSecs = 2;\n let lastError: unknown;\n\n while (Date.now() < deadlineMs) {\n try {\n const result = await this.run(\"/bin/bash\", {\n args: [\"-c\", `exec 3<>/dev/tcp/127.0.0.1/${port}`],\n timeout: probeProcessTimeoutSecs,\n });\n if (result.exitCode === 0) {\n return;\n }\n } catch (error) {\n lastError = error;\n }\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) break;\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(probeIntervalMs, remainingMs)),\n );\n }\n\n const detail =\n lastError instanceof Error ? `: ${lastError.message}` : \"\";\n throw new SandboxError(\n `port ${port} did not become reachable inside sandbox within the connect timeout${detail}`,\n );\n }\n\n ptyWsUrl(sessionId: string, token: string): string {\n let wsBase: string;\n if (this.baseUrl.startsWith(\"https://\")) {\n wsBase = \"wss://\" + this.baseUrl.slice(8);\n } else if (this.baseUrl.startsWith(\"http://\")) {\n wsBase = \"ws://\" + this.baseUrl.slice(7);\n } else {\n wsBase = this.baseUrl;\n }\n return `${wsBase}/api/v1/pty/${sessionId}/ws?token=${token}`;\n }\n\n // --- Health ---\n\n /** Check the sandbox daemon health. */\n async health(): Promise<Traced<HealthResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.health(), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as HealthResponse, { traceId });\n }\n\n /** Get sandbox daemon info (version, uptime, process counts). */\n async daemonInfo(): Promise<Traced<DaemonInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.info(), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as DaemonInfo, { traceId });\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./http.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeErrorContext,\n type NativeSandboxClient,\n} from \"./native-sandbox.js\";\nimport {\n type ArchivedSandboxInfo,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type CreateAndConnectOptions,\n type CreatePoolOptions,\n type CreateSandboxOptions,\n type CreateSandboxPoolResponse,\n type CreateSandboxResponse,\n type CreateSnapshotResponse,\n type GetSandboxLogsOptions,\n type ListArchivedSandboxesOptions,\n type ListArchivedSandboxesResponse,\n type SandboxClientOptions,\n type SandboxInfo,\n type SandboxLogsResponse,\n type SandboxPortAccess,\n type SandboxPoolInfo,\n type SandboxProcessLogFiltersResponse,\n SandboxStatus,\n type SnapshotAndWaitOptions,\n type SnapshotInfo,\n type SnapshotOptions,\n SnapshotStatus,\n type SnapshotWaitCondition,\n type SuspendResumeOptions,\n type UpdatePoolOptions,\n type UpdateSandboxOptions,\n fromSnakeKeys,\n} from \"./models.js\";\nimport { Sandbox } from \"./sandbox.js\";\nimport { nowMs, logSdkTimingEvent, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride } from \"./url.js\";\n\nfunction gpuRequest(\n gpus: number | undefined,\n gpuModel: string | undefined,\n): Array<{ count: number; model: string }> | undefined {\n if (gpus == null) return undefined;\n if (!Number.isInteger(gpus) || gpus < 1) {\n throw new SandboxError(\"gpus must be a positive integer\");\n }\n gpuModel = gpuModel ?? \"A10\";\n if (gpuModel !== \"A10\") {\n throw new SandboxError(\"only A10 GPU sandboxes are supported for now\");\n }\n return [{ count: gpus, model: gpuModel }];\n}\n\n/**\n * Client for managing TensorLake sandboxes, pools, and snapshots.\n *\n * This is a thin shim over the Rust core ({@link NativeSandboxClient}): every\n * call marshals a request to JSON, delegates the RPC (URL resolution,\n * namespacing, retries, connection pooling) to Rust, and reshapes the JSON\n * response. There is no TypeScript-side HTTP transport.\n */\nexport class SandboxClient {\n private readonly native: NativeSandboxClient;\n private readonly apiUrl: string;\n private readonly apiKey: string | undefined;\n private readonly organizationId: string | undefined;\n private readonly projectId: string | undefined;\n private readonly namespace: string;\n private readonly requestTimeoutMs: number;\n\n /** @internal Pass `true` to suppress the deprecation warning when used by `Sandbox.create()` / `Sandbox.connect()`. */\n constructor(options?: SandboxClientOptions, _internal = false) {\n if (!_internal) {\n console.warn(\n \"[tensorlake] SandboxClient is deprecated; use Sandbox.create() / Sandbox.connect() instead.\",\n );\n }\n this.apiUrl = options?.apiUrl ?? defaults.API_URL;\n this.apiKey = options?.apiKey ?? defaults.API_KEY;\n this.organizationId = options?.organizationId;\n this.projectId = options?.projectId;\n this.namespace = options?.namespace ?? defaults.NAMESPACE;\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n\n const binding = loadNativeSandboxBinding();\n this.native = new binding.NativeSandboxClient(\n this.apiUrl,\n this.apiKey ?? null,\n this.organizationId ?? null,\n this.projectId ?? null,\n this.namespace,\n null,\n this.requestTimeoutMs / 1000,\n );\n }\n\n /** Create a client for the TensorLake cloud platform. */\n static forCloud(options?: {\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n apiUrl?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n }): SandboxClient {\n return new SandboxClient({\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n /** Create a client for a local Indexify server. */\n static forLocalhost(options?: {\n apiUrl?: string;\n namespace?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n }): SandboxClient {\n return new SandboxClient({\n apiUrl: options?.apiUrl ?? \"http://localhost:8900\",\n namespace: options?.namespace ?? \"default\",\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n close(): void {\n // The native client releases its connection pool on GC; nothing to do.\n }\n\n private withRequestTimeout(requestTimeout: number | undefined): SandboxClient {\n if (requestTimeout == null) {\n return this;\n }\n const timeoutMs = secondsToMillis(requestTimeout);\n if (timeoutMs === this.requestTimeoutMs) {\n return this;\n }\n return new SandboxClient({\n apiUrl: this.apiUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n namespace: this.namespace,\n timeoutMs,\n }, /* _internal */ true);\n }\n\n // --- Native marshalling helpers ---\n\n /** Run a native JSON call and reshape it into a `Traced<T>`. */\n private async tracedJson<T extends object>(\n fn: () => Promise<{ traceId: string; json: string }>,\n idField?: string,\n context?: NativeErrorContext,\n ): Promise<Traced<T>> {\n const { traceId, json } = await callNative(fn, context);\n return Object.assign(fromSnakeKeys(JSON.parse(json), idField) as T, {\n traceId,\n }) as Traced<T>;\n }\n\n /** Run a native JSON call and reshape it into a plain `T` (no trace id). */\n private async plainJson<T>(\n fn: () => Promise<{ traceId: string; json: string }>,\n idField?: string,\n context?: NativeErrorContext,\n ): Promise<T> {\n const { json } = await callNative(fn, context);\n return fromSnakeKeys(JSON.parse(json), idField) as T;\n }\n\n // --- Sandbox CRUD ---\n\n /** Create a new sandbox. Returns immediately; the sandbox may still be starting. Use `createAndConnect()` for a blocking, ready-to-use handle. */\n async create(options?: CreateSandboxOptions): Promise<Traced<CreateSandboxResponse>> {\n const gpuResources = gpuRequest(options?.gpus, options?.gpuModel);\n const body: Record<string, unknown> = {\n resources: {\n cpus: options?.cpus ?? 1.0,\n memory_mb: options?.memoryMb ?? 1024,\n ...(options?.diskMb != null ? { disk_mb: options.diskMb } : {}),\n ...(gpuResources != null ? { gpus: gpuResources } : {}),\n },\n };\n\n if (options?.image != null) body.image = options.image;\n if (options?.timeoutSecs != null) body.timeout_secs = options.timeoutSecs;\n if (options?.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options?.snapshotId != null) body.snapshot_id = options.snapshotId;\n if (options?.name != null) body.name = options.name;\n if (\n options?.fileSystems != null &&\n options.fileSystems.length > 0\n ) {\n body.file_systems = options.fileSystems.map((fs) => ({\n file_system_id: fs.fileSystemId,\n mount_path: fs.mountPath,\n }));\n }\n\n if (\n options?.allowInternetAccess === false ||\n options?.allowOut != null ||\n options?.denyOut != null\n ) {\n body.network = {\n allow_internet_access: options?.allowInternetAccess ?? true,\n allow_out: options?.allowOut ?? [],\n deny_out: options?.denyOut ?? [],\n };\n }\n\n return this.tracedJson<CreateSandboxResponse>(\n () => this.native.createSandbox(JSON.stringify(body)),\n \"sandboxId\",\n );\n }\n\n /** Get current state and metadata for a sandbox by ID. */\n async get(sandboxId: string): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () => this.native.getSandbox(sandboxId),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** List all sandboxes in the namespace. */\n async list(): Promise<Traced<SandboxInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listSandboxes());\n const parsed = JSON.parse(json) as { sandboxes?: Record<string, unknown>[] };\n const sandboxes = (parsed.sandboxes ?? []).map(\n (s) => fromSnakeKeys(s, \"sandboxId\") as SandboxInfo,\n );\n return Object.assign(sandboxes, { traceId });\n }\n\n /**\n * List archived (terminated) sandboxes in the namespace.\n *\n * Archived sandboxes are terminated sandboxes parked in the server's\n * archived sandboxes store until the server-configured TTL expires.\n */\n async listArchived(\n options?: ListArchivedSandboxesOptions,\n ): Promise<Traced<ListArchivedSandboxesResponse>> {\n const { traceId, json } = await callNative(() =>\n this.native.listArchivedSandboxes(\n options?.limit ?? null,\n options?.cursor ?? null,\n options?.direction ?? null,\n ),\n );\n const parsed = JSON.parse(json) as {\n sandboxes?: Record<string, unknown>[];\n prev_cursor?: string;\n next_cursor?: string;\n };\n const sandboxes = (parsed.sandboxes ?? []).map(\n (s) => fromSnakeKeys(s, \"sandboxId\") as ArchivedSandboxInfo,\n );\n const response: ListArchivedSandboxesResponse = {\n sandboxes,\n prevCursor: parsed.prev_cursor,\n nextCursor: parsed.next_cursor,\n };\n return Object.assign(response, { traceId });\n }\n\n /** Get a single archived sandbox by id. */\n async getArchived(sandboxId: string): Promise<Traced<ArchivedSandboxInfo>> {\n return this.tracedJson<ArchivedSandboxInfo>(\n () => this.native.getArchivedSandbox(sandboxId),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Read persisted logs for a sandbox. */\n async getLogs(\n sandboxId: string,\n options?: GetSandboxLogsOptions,\n ): Promise<Traced<SandboxLogsResponse>> {\n const body = {\n sandbox_id: sandboxId,\n levels: options?.levels ?? [],\n process_ids: options?.processIds ?? [],\n next_token: options?.nextToken,\n head: options?.head,\n tail: options?.tail,\n body: options?.body,\n };\n const { traceId, json } = await callNative(\n () => this.native.getSandboxLogs(JSON.stringify(body)),\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n return Object.assign(JSON.parse(json) as SandboxLogsResponse, { traceId });\n }\n\n /** List sandbox processes available as persisted-log filters. */\n async listLogProcesses(\n sandboxId: string,\n ): Promise<Traced<SandboxProcessLogFiltersResponse>> {\n const { traceId, json } = await callNative(\n () => this.native.listSandboxLogProcesses(sandboxId),\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n return Object.assign(JSON.parse(json) as SandboxProcessLogFiltersResponse, {\n traceId,\n });\n }\n\n /** Update sandbox properties such as name, exposed ports, and proxy auth settings. */\n async update(sandboxId: string, options: UpdateSandboxOptions): Promise<Traced<SandboxInfo>> {\n const body: Record<string, unknown> = {};\n if (options.name != null) body.name = options.name;\n if (options.allowUnauthenticatedAccess != null) {\n body.allow_unauthenticated_access = options.allowUnauthenticatedAccess;\n }\n if (options.exposedPorts != null) {\n body.exposed_ports = normalizeUserPorts(options.exposedPorts);\n }\n if (Object.keys(body).length === 0) {\n throw new SandboxError(\"At least one sandbox update field must be provided.\");\n }\n return this.tracedJson<SandboxInfo>(\n () => this.native.updateSandbox(sandboxId, JSON.stringify(body)),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Get the current proxy port settings for a sandbox. */\n async getPortAccess(sandboxId: string): Promise<SandboxPortAccess> {\n const info = await this.get(sandboxId);\n return {\n allowUnauthenticatedAccess: info.allowUnauthenticatedAccess ?? false,\n exposedPorts: dedupeAndSortPorts(info.exposedPorts ?? []),\n ingressEndpoint: info.ingressEndpoint,\n sandboxUrl: info.sandboxUrl,\n };\n }\n\n /** Add one or more user ports to the sandbox proxy allowlist. */\n async exposePorts(\n sandboxId: string,\n ports: number[],\n options?: { allowUnauthenticatedAccess?: boolean },\n ): Promise<SandboxInfo> {\n const requestedPorts = normalizeUserPorts(ports);\n const current = await this.getPortAccess(sandboxId);\n const desiredPorts = dedupeAndSortPorts([\n ...current.exposedPorts,\n ...requestedPorts,\n ]);\n return this.update(sandboxId, {\n allowUnauthenticatedAccess:\n options?.allowUnauthenticatedAccess ??\n current.allowUnauthenticatedAccess,\n exposedPorts: desiredPorts,\n });\n }\n\n /** Remove one or more user ports from the sandbox proxy allowlist. */\n async unexposePorts(\n sandboxId: string,\n ports: number[],\n ): Promise<SandboxInfo> {\n const requestedPorts = normalizeUserPorts(ports);\n const current = await this.getPortAccess(sandboxId);\n const toRemove = new Set(requestedPorts);\n const desiredPorts = current.exposedPorts.filter((port) => !toRemove.has(port));\n return this.update(sandboxId, {\n allowUnauthenticatedAccess: desiredPorts.length\n ? current.allowUnauthenticatedAccess\n : false,\n exposedPorts: desiredPorts,\n });\n }\n\n /** Terminate and delete a sandbox. */\n async delete(sandboxId: string): Promise<void> {\n await callNative(() => this.native.deleteSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n }\n\n /**\n * Suspend a named sandbox, preserving its state for later resume.\n *\n * Only sandboxes created with a `name` can be suspended; ephemeral sandboxes\n * cannot. By default blocks until the sandbox is fully `Suspended`. Pass\n * `{ wait: false }` to return immediately after the request is sent\n * (fire-and-return); the server processes the suspend asynchronously.\n */\n async suspend(sandboxId: string, options?: SuspendResumeOptions): Promise<void> {\n await callNative(() => this.native.suspendSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n if (options?.wait === false) return;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n while (Date.now() < deadline) {\n const info = await this.get(sandboxId);\n if (info.status === SandboxStatus.SUSPENDED) return;\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(`Sandbox ${sandboxId} terminated while waiting for suspend`);\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(`Sandbox ${sandboxId} did not suspend within ${timeout}s`);\n }\n\n /**\n * Resume a suspended sandbox and bring it back to `Running`.\n *\n * By default blocks until the sandbox is `Running` and routable. Pass\n * `{ wait: false }` to return immediately after the request is sent\n * (fire-and-return); the server processes the resume asynchronously.\n */\n async resume(sandboxId: string, options?: SuspendResumeOptions): Promise<void> {\n await callNative(() => this.native.resumeSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n if (options?.wait === false) return;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n while (Date.now() < deadline) {\n const info = await this.get(sandboxId);\n if (info.status === SandboxStatus.RUNNING) return;\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(`Sandbox ${sandboxId} terminated while waiting for resume`);\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(`Sandbox ${sandboxId} did not resume within ${timeout}s`);\n }\n\n /**\n * Attach a registered file system to a running sandbox at `mountPath`.\n *\n * The mount completes asynchronously on the dataplane; the returned\n * `SandboxInfo` already reflects the new entry in `fileSystems`.\n */\n async attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () =>\n this.native.attachFileSystem(sandboxId, fileSystemId, mountPath),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /**\n * Detach the file system mounted at `mountPath` from a running sandbox.\n *\n * The unmount completes asynchronously on the dataplane; the returned\n * `SandboxInfo` already reflects the removed `fileSystems` entry.\n */\n async detachFileSystem(\n sandboxId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () => this.native.detachFileSystem(sandboxId, mountPath),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Claim a warm sandbox from a pool, creating one if no warm containers are available. */\n async claim(poolId: string): Promise<Traced<CreateSandboxResponse>> {\n return this.tracedJson<CreateSandboxResponse>(\n () => this.native.claimSandbox(poolId),\n \"sandboxId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /**\n * Live-copy a running sandbox.\n *\n * The server creates `times` running copies from the source sandbox. Partial\n * responses can include failed copies; inspect each returned sandbox's\n * `status` and `reason`.\n */\n async copy(\n sandboxId: string,\n options?: CopySandboxOptions,\n ): Promise<Traced<CopySandboxResponse>> {\n const times = options?.times ?? 1;\n if (!Number.isInteger(times) || times < 1) {\n throw new SandboxError(\"times must be a positive integer\");\n }\n const client = this.withRequestTimeout(options?.requestTimeout);\n return client.tracedJson<CopySandboxResponse>(\n () => client.native.copySandbox(sandboxId, times),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n // --- Snapshots ---\n\n /**\n * Request a snapshot of a running sandbox's filesystem.\n *\n * This call **returns immediately** with a `snapshotId` and `in_progress`\n * status — the snapshot is created asynchronously. Poll `getSnapshot()` until\n * `local_ready`, `completed`, or `failed`, or use `snapshotAndWait()` to\n * block automatically.\n */\n async snapshot(\n sandboxId: string,\n options?: SnapshotOptions,\n ): Promise<CreateSnapshotResponse> {\n return this.plainJson<CreateSnapshotResponse>(\n () => this.native.createSnapshot(sandboxId, options?.snapshotType ?? null),\n \"snapshotId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Get current status and metadata for a snapshot by ID. */\n async getSnapshot(snapshotId: string): Promise<Traced<SnapshotInfo>> {\n return this.tracedJson<SnapshotInfo>(\n () => this.native.getSnapshot(snapshotId),\n \"snapshotId\",\n );\n }\n\n /** List all snapshots in the namespace. */\n async listSnapshots(): Promise<Traced<SnapshotInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listSnapshots());\n const parsed = JSON.parse(json) as { snapshots?: Record<string, unknown>[] };\n const snapshots = (parsed.snapshots ?? []).map(\n (s) => fromSnakeKeys(s, \"snapshotId\") as SnapshotInfo,\n );\n return Object.assign(snapshots, { traceId });\n }\n\n /** Delete a snapshot by ID. */\n async deleteSnapshot(snapshotId: string): Promise<void> {\n await callNative(() => this.native.deleteSnapshot(snapshotId));\n }\n\n /**\n * Create a snapshot and block until it is locally ready.\n *\n * Combines `snapshot()` with polling `getSnapshot()` until `local_ready`\n * or `completed`. Pass `{ waitUntil: \"completed\" }` when durable\n * `snapshotUri` metadata is required.\n */\n async snapshotAndWait(\n sandboxId: string,\n options?: SnapshotAndWaitOptions,\n ): Promise<Traced<SnapshotInfo>> {\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const waitUntil = options?.waitUntil ?? \"local_ready\";\n\n const result = await this.snapshot(sandboxId, {\n snapshotType: options?.snapshotType,\n });\n const deadline = Date.now() + timeout * 1000;\n\n while (Date.now() < deadline) {\n const info = await this.getSnapshot(result.snapshotId);\n if (snapshotStatusSatisfiesWaitCondition(info.status, waitUntil)) return info;\n if (info.status === SnapshotStatus.FAILED) {\n throw new SandboxError(\n `Snapshot ${result.snapshotId} failed: ${info.error}`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n\n throw new SandboxError(\n `Snapshot ${result.snapshotId} did not reach ${waitUntil} within ${timeout}s`,\n );\n }\n\n // --- Pools ---\n\n /** Create a new sandbox pool with warm pre-booted containers. */\n async createPool(options: CreatePoolOptions): Promise<CreateSandboxPoolResponse> {\n const body: Record<string, unknown> = {\n image: options.image,\n resources: {\n cpus: options.cpus ?? 1.0,\n memory_mb: options.memoryMb ?? 1024,\n ephemeral_disk_mb: options.ephemeralDiskMb ?? 1024,\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null) body.max_containers = options.maxContainers;\n if (options.warmContainers != null) body.warm_containers = options.warmContainers;\n\n return this.plainJson<CreateSandboxPoolResponse>(\n () => this.native.createPool(JSON.stringify(body)),\n \"poolId\",\n );\n }\n\n /** Get current state and metadata for a sandbox pool by ID. */\n async getPool(poolId: string): Promise<SandboxPoolInfo> {\n return this.plainJson<SandboxPoolInfo>(\n () => this.native.getPool(poolId),\n \"poolId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /** List all sandbox pools in the namespace. */\n async listPools(): Promise<Traced<SandboxPoolInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listPools());\n const parsed = JSON.parse(json) as { pools?: Record<string, unknown>[] };\n const pools = (parsed.pools ?? []).map(\n (p) => fromSnakeKeys(p, \"poolId\") as SandboxPoolInfo,\n );\n return Object.assign(pools, { traceId });\n }\n\n /** Replace the configuration of an existing sandbox pool. */\n async updatePool(\n poolId: string,\n options: UpdatePoolOptions,\n ): Promise<SandboxPoolInfo> {\n const body: Record<string, unknown> = {\n image: options.image,\n resources: {\n cpus: options.cpus ?? 1.0,\n memory_mb: options.memoryMb ?? 1024,\n ephemeral_disk_mb: options.ephemeralDiskMb ?? 1024,\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null) body.max_containers = options.maxContainers;\n if (options.warmContainers != null) body.warm_containers = options.warmContainers;\n\n return this.plainJson<SandboxPoolInfo>(\n () => this.native.updatePool(poolId, JSON.stringify(body)),\n \"poolId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /** Delete a sandbox pool. Fails if the pool has active containers. */\n async deletePool(poolId: string): Promise<void> {\n await callNative(() => this.native.deletePool(poolId), { poolId, notFoundKind: \"pool\" });\n }\n\n // --- Connect ---\n\n /** Return a `Sandbox` handle for an existing running sandbox without verifying it exists. */\n connect(\n identifier: string,\n proxyUrl?: string,\n routingHint?: string,\n requestTimeout?: number,\n explicitProxyUrl?: string,\n ): Sandbox {\n const explicitProxyUrlProvided = arguments.length >= 5;\n const resolvedExplicitProxyUrl = explicitProxyUrlProvided\n ? explicitProxyUrl ?? undefined\n : proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n return new Sandbox({\n sandboxId: identifier,\n proxyUrl,\n explicitProxyUrl: resolvedExplicitProxyUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n routingHint,\n resolveProxyInfo: async (currentIdentifier) => this.get(currentIdentifier),\n requestTimeout,\n nativeClient: this.native,\n });\n }\n\n /**\n * Create a sandbox, wait for it to reach `Running`, and return a connected handle.\n *\n * Blocks until the sandbox is ready or `requestTimeout` elapses. The returned\n * `Sandbox` auto-terminates when `terminate()` is called.\n */\n async createAndConnect(\n options?: CreateAndConnectOptions,\n ): Promise<Sandbox> {\n const opStart = nowMs();\n const requestTimeout =\n options?.requestTimeout ??\n options?.startupTimeout ??\n this.requestTimeoutMs / 1000;\n const requestClient = this.withRequestTimeout(requestTimeout);\n logSdkTimingEvent(\"sandbox.create\", \"start\", {\n request_timeout_s: requestTimeout,\n image: options?.image,\n pool_id: options?.poolId,\n });\n\n // claim() never sends options.name to the server, so only create() should fall\n // back to it locally when the server response omits a name.\n const createStart = nowMs();\n const result = options?.poolId != null\n ? await requestClient.claim(options.poolId)\n : await requestClient.create(options);\n logSdkTiming(\"sandbox.create\", options?.poolId != null ? \"claim_response\" : \"create_response\", createStart, {\n sandbox_id: result.sandboxId,\n status: result.status,\n server_trace_id: result.traceId,\n });\n const requestedName = options?.poolId != null ? null : options?.name ?? null;\n\n const finishConnect = (\n sandboxId: string,\n routingHint: string | undefined,\n name: string | null | undefined,\n ingressEndpoint: string | undefined,\n sandboxUrl: string | undefined,\n ) => {\n const explicitProxyUrl = options?.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = this.native.selectSandboxProxyUrl(\n sandboxId,\n sandboxUrl ?? null,\n ingressEndpoint ?? null,\n explicitProxyUrl ?? null,\n );\n const sandbox = requestClient.connect(\n sandboxId,\n selectedProxyUrl,\n routingHint,\n requestTimeout,\n explicitProxyUrl,\n );\n sandbox._setOwner(requestClient);\n sandbox.traceId = result.traceId;\n sandbox._setLifecycleIdentifier(sandboxId);\n sandbox._setName(name ?? requestedName);\n logSdkTiming(\"sandbox.create\", \"complete\", opStart, {\n sandbox_id: sandboxId,\n status: SandboxStatus.RUNNING,\n server_trace_id: result.traceId,\n routing_hint: routingHint,\n ingress_endpoint: ingressEndpoint,\n sandbox_url: sandboxUrl,\n });\n return sandbox;\n };\n\n // Fast path: the blocking create/claim response already carries Running status\n // and a short-lived routing hint. Use it immediately to skip an extra poll RTT\n // and let the proxy route the first request without a placement lookup.\n if (result.status === SandboxStatus.RUNNING) {\n return finishConnect(\n result.sandboxId,\n result.routingHint,\n result.name,\n result.ingressEndpoint,\n result.sandboxUrl,\n );\n }\n if (\n result.status === SandboxStatus.SUSPENDED ||\n result.status === SandboxStatus.TERMINATED\n ) {\n throw new SandboxError(\n formatStartupFailureMessage(result.sandboxId, result.status, {\n errorDetails: result.errorDetails,\n terminationReason: result.terminationReason,\n }),\n );\n }\n if (result.status === SandboxStatus.TIMEOUT) {\n try {\n await requestClient.delete(result.sandboxId);\n } catch {\n // ignore cleanup failures\n }\n throw new SandboxError(\n `Sandbox ${result.sandboxId} did not start within ${requestTimeout}s`,\n );\n }\n\n const deadline = Date.now() + secondsToMillis(requestTimeout);\n\n while (Date.now() < deadline) {\n const pollStart = nowMs();\n const info = await requestClient.get(result.sandboxId);\n logSdkTiming(\"sandbox.create\", \"poll_response\", pollStart, {\n sandbox_id: result.sandboxId,\n status: info.status,\n server_trace_id: info.traceId,\n });\n if (info.status === SandboxStatus.RUNNING) {\n return finishConnect(\n info.sandboxId,\n info.routingHint,\n info.name,\n info.ingressEndpoint,\n info.sandboxUrl,\n );\n }\n if (\n info.status === SandboxStatus.SUSPENDED ||\n info.status === SandboxStatus.TERMINATED\n ) {\n throw new SandboxError(\n formatStartupFailureMessage(result.sandboxId, info.status, {\n errorDetails: info.errorDetails,\n terminationReason: info.terminationReason,\n }),\n );\n }\n await sleep(500);\n }\n\n // Timed out — clean up\n try {\n await requestClient.delete(result.sandboxId);\n } catch {\n // ignore cleanup failures\n }\n throw new SandboxError(\n `Sandbox ${result.sandboxId} did not start within ${requestTimeout}s`,\n );\n }\n}\n\nfunction resolveRequestTimeoutMs(\n options?: { requestTimeout?: number; timeoutMs?: number },\n): number {\n if (options?.requestTimeout != null) {\n return secondsToMillis(options.requestTimeout);\n }\n if (options?.timeoutMs != null) {\n validateTimeoutMs(options.timeoutMs);\n return options.timeoutMs;\n }\n return defaults.DEFAULT_HTTP_TIMEOUT_MS;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new SandboxError(\"requestTimeout must be a positive number of seconds\");\n }\n return Math.ceil(seconds * 1000);\n}\n\nfunction validateTimeoutMs(timeoutMs: number): void {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new SandboxError(\"timeoutMs must be a positive number of milliseconds\");\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction snapshotStatusSatisfiesWaitCondition(\n status: SnapshotStatus | string,\n waitUntil: SnapshotWaitCondition,\n): boolean {\n if (waitUntil === \"local_ready\") {\n return status === SnapshotStatus.LOCAL_READY || status === SnapshotStatus.COMPLETED;\n }\n return status === SnapshotStatus.COMPLETED;\n}\n\nfunction formatStartupFailureMessage(\n sandboxId: string,\n status: SandboxStatus | string,\n options: {\n errorDetails?: unknown;\n terminationReason?: string;\n },\n): string {\n const prefix = status === SandboxStatus.TERMINATED\n ? `Sandbox ${sandboxId} terminated during startup`\n : `Sandbox ${sandboxId} became ${status} during startup`;\n const detail = formatErrorDetails(options.errorDetails);\n if (detail) {\n return `${prefix}: ${detail}`;\n }\n if (options.terminationReason) {\n return `${prefix}: termination reason: ${options.terminationReason}`;\n }\n return prefix;\n}\n\nfunction formatErrorDetails(errorDetails: unknown): string | undefined {\n if (errorDetails == null) return undefined;\n if (typeof errorDetails === \"string\") {\n const detail = errorDetails.trim();\n return detail || undefined;\n }\n if (Array.isArray(errorDetails)) {\n const parts = errorDetails\n .map((item) => formatErrorDetails(item))\n .filter((item): item is string => Boolean(item));\n return parts.length > 0 ? parts.join(\"; \") : JSON.stringify(errorDetails);\n }\n if (typeof errorDetails === \"object\") {\n for (const key of [\"message\", \"detail\", \"error\", \"reason\"]) {\n const value = (errorDetails as Record<string, unknown>)[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return JSON.stringify(errorDetails);\n }\n return String(errorDetails);\n}\n\nconst RESERVED_SANDBOX_MANAGEMENT_PORT = 9501;\n\nfunction normalizeUserPorts(ports: number[]): number[] {\n return dedupeAndSortPorts(ports.map(validateUserPort));\n}\n\nfunction validateUserPort(port: number): number {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new SandboxError(`invalid port '${port}'`);\n }\n if (port === RESERVED_SANDBOX_MANAGEMENT_PORT) {\n throw new SandboxError(\"port 9501 is reserved for sandbox management\");\n }\n return port;\n}\n\nfunction dedupeAndSortPorts(ports: number[]): number[] {\n return [...new Set(ports)].sort((a, b) => a - b);\n}\n","import {\n Agent,\n fetch as undiciFetch,\n setGlobalDispatcher,\n type BodyInit as UndiciBodyInit,\n} from \"undici\";\nimport * as defaults from \"./defaults.js\";\nimport {\n describeError,\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxNotFoundError,\n} from \"./errors.js\";\nimport {\n nowMs,\n logSdkTimingEvent,\n logSdkTiming,\n sdkTimingPayloadsEnabled,\n} from \"./sdk-timings.js\";\n\nconst REQUEST_TIMEOUT_HEADER = \"X-Tensorlake-Request-Timeout-Ms\";\n\nexport interface HttpClientOptions {\n baseUrl: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n hostHeader?: string;\n sandboxIdHeader?: string;\n routingHint?: string;\n maxRetries?: number;\n retryBackoffMs?: number;\n timeoutMs?: number | null;\n}\n\nsetGlobalDispatcher(\n new Agent({\n keepAliveTimeout: 60_000,\n allowH2: true,\n }),\n);\n\n\ntype RequestBody = BodyInit | Uint8Array | ArrayBuffer;\n\nexport interface HttpRequestOptions {\n body?: RequestBody | null;\n headers?: Record<string, string>;\n json?: unknown;\n signal?: AbortSignal;\n allowHttpErrors?: boolean;\n retryableStatusCodes?: Set<number>;\n allowedErrorStatusCodes?: Set<number>;\n}\n\n/**\n * The return value of every SDK operation. Carries the W3C `trace_id` so callers\n * can correlate a specific request with its server-side spans in Datadog APM or\n * any other OTEL-compatible backend.\n *\n * Because this is an intersection type, all properties of `T` are accessible\n * directly — existing code that ignores `traceId` continues to compile and run\n * unchanged.\n *\n * @example\n * const sandbox = await client.createSandbox(req);\n * console.log(sandbox.id); // existing field — unchanged\n * console.log(sandbox.traceId); // new: look this up in Datadog APM\n */\nexport type Traced<T> = T & { readonly traceId: string };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withTraceId<T>(value: T, traceId: string): Traced<T> {\n if (value == null) {\n return { traceId } as unknown as Traced<T>;\n }\n return Object.assign(value as any, { traceId }) as Traced<T>;\n}\n\n/**\n * Internal HTTP client with retry logic, auth headers, and error mapping.\n *\n * Uses native `fetch`. Retries on transient status codes (429, 502, 503, 504)\n * with exponential backoff.\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly maxRetries: number;\n private readonly retryBackoffMs: number;\n private readonly timeoutMs: number | null;\n private abortController: AbortController | null = null;\n\n constructor(options: HttpClientOptions) {\n const url = options.baseUrl;\n this.baseUrl = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n this.maxRetries = options.maxRetries ?? defaults.MAX_RETRIES;\n this.retryBackoffMs = options.retryBackoffMs ?? defaults.RETRY_BACKOFF_MS;\n this.timeoutMs = options.timeoutMs === undefined\n ? defaults.DEFAULT_HTTP_TIMEOUT_MS\n : options.timeoutMs;\n\n this.headers = {\n \"User-Agent\": `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n };\n if (this.timeoutMs != null) {\n this.headers[REQUEST_TIMEOUT_HEADER] = String(this.timeoutMs);\n }\n if (options.apiKey) {\n this.headers[\"Authorization\"] = `Bearer ${options.apiKey}`;\n }\n if (options.organizationId) {\n this.headers[\"X-Forwarded-Organization-Id\"] = options.organizationId;\n }\n if (options.projectId) {\n this.headers[\"X-Forwarded-Project-Id\"] = options.projectId;\n }\n if (options.hostHeader) {\n this.headers[\"Host\"] = options.hostHeader;\n }\n if (options.sandboxIdHeader) {\n this.headers[\"X-Tensorlake-Sandbox-Id\"] = options.sandboxIdHeader;\n }\n if (options.routingHint) {\n this.headers[\"X-Tensorlake-Route-Hint\"] = options.routingHint;\n }\n }\n\n close(): void {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n /** Make a JSON request, returning the parsed response body. */\n async requestJson<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n retryableStatusCodes?: Set<number>;\n allowedErrorStatusCodes?: Set<number>;\n allowHttpErrors?: boolean;\n },\n ): Promise<Traced<T>> {\n const response = await this.requestResponse(method, path, {\n json: options?.body,\n headers: options?.headers,\n signal: options?.signal,\n retryableStatusCodes: options?.retryableStatusCodes,\n allowedErrorStatusCodes: options?.allowedErrorStatusCodes,\n allowHttpErrors: options?.allowHttpErrors,\n });\n const text = await response.text();\n const data = (text ? JSON.parse(text) : undefined) as T;\n return withTraceId(data, response.traceId);\n }\n\n /** Make a request returning raw bytes. */\n async requestBytes(\n method: string,\n path: string,\n options?: {\n body?: RequestBody | null;\n contentType?: string;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n },\n ): Promise<Traced<Uint8Array>> {\n const headers = { ...(options?.headers ?? {}) };\n if (options?.contentType) {\n headers[\"Content-Type\"] = options.contentType;\n }\n\n const response = await this.requestResponse(method, path, {\n body: options?.body,\n headers,\n signal: options?.signal,\n });\n const buffer = await response.arrayBuffer();\n return withTraceId(new Uint8Array(buffer), response.traceId);\n }\n\n /** Make a request and return the response body as an SSE stream. */\n async requestStream(\n method: string,\n path: string,\n options?: { signal?: AbortSignal; json?: unknown },\n ): Promise<Traced<ReadableStream<Uint8Array>>> {\n const response = await this.requestResponse(method, path, {\n json: options?.json,\n headers: { Accept: \"text/event-stream\" },\n signal: options?.signal,\n });\n if (!response.body) {\n throw new RemoteAPIError(\n response.status,\n \"No response body for SSE stream\",\n );\n }\n return withTraceId(response.body, response.traceId);\n }\n\n /** Make a request and return the raw Response. */\n async requestResponse(\n method: string,\n path: string,\n options?: HttpRequestOptions,\n ): Promise<Traced<Response>> {\n const headers = {\n ...this.headers,\n ...(options?.headers ?? {}),\n };\n const hasJsonBody = options?.json !== undefined;\n if (hasJsonBody && !hasHeader(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const body = hasJsonBody\n ? JSON.stringify(options?.json)\n : normalizeRequestBody(options?.body);\n\n const { response, traceId } = await this.doFetch(\n method,\n path,\n body,\n headers,\n options?.signal,\n options?.allowHttpErrors ?? false,\n options?.retryableStatusCodes ?? defaults.RETRYABLE_STATUS_CODES,\n options?.allowedErrorStatusCodes ?? new Set(),\n );\n return withTraceId(response, traceId);\n }\n\n private static makeTraceparent(): { traceparent: string; traceId: string } {\n const randomHex = (bytes: number) =>\n Array.from(crypto.getRandomValues(new Uint8Array(bytes)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const traceId = randomHex(16);\n const spanId = randomHex(8);\n return { traceparent: `00-${traceId}-${spanId}-01`, traceId };\n }\n\n private async doFetch(\n method: string,\n path: string,\n body: UndiciBodyInit | undefined,\n headers: Record<string, string>,\n signal?: AbortSignal,\n allowHttpErrors = false,\n retryableStatusCodes: Set<number> = defaults.RETRYABLE_STATUS_CODES,\n allowedErrorStatusCodes: Set<number> = new Set(),\n ): Promise<{ response: Response; traceId: string }> {\n const url = `${this.baseUrl}${path}`;\n const { traceparent, traceId } = HttpClient.makeTraceparent();\n headers[\"traceparent\"] = traceparent;\n let lastError: Error | undefined;\n const operationStart = nowMs();\n const timingPath = sdkTimingPayloadsEnabled() ? path : stripPathPayload(path);\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryBackoffMs * Math.pow(2, attempt - 1);\n logSdkTimingEvent(\"http.request\", \"retry_sleep_start\", {\n method,\n path: timingPath,\n attempt,\n delay_ms: delay,\n server_trace_id: traceId,\n });\n await sleep(delay);\n }\n\n this.abortController = new AbortController();\n // Track whether *our* deadline fired, so we can tell a client-imposed\n // timeout apart from a network rejection or a caller-initiated abort.\n let timedOut = false;\n const timeoutId = this.timeoutMs == null\n ? null\n : setTimeout(() => {\n timedOut = true;\n this.abortController?.abort();\n }, this.timeoutMs);\n\n // Combine external signal with internal timeout\n const combinedSignal = signal\n ? anySignal([signal, this.abortController.signal])\n : this.abortController.signal;\n\n const attemptStart = nowMs();\n try {\n const response = (await undiciFetch(url, {\n method,\n headers,\n body,\n signal: combinedSignal,\n })) as Response;\n\n if (timeoutId != null) clearTimeout(timeoutId);\n logSdkTiming(\"http.request\", \"headers\", attemptStart, {\n method,\n path: timingPath,\n status: response.status,\n attempt,\n server_trace_id: traceId,\n });\n\n if (response.ok) {\n logSdkTiming(\"http.request\", \"complete\", operationStart, {\n method,\n path: timingPath,\n status: response.status,\n attempts: attempt + 1,\n server_trace_id: traceId,\n });\n return { response, traceId };\n }\n\n // Check if retryable\n if (\n retryableStatusCodes.has(response.status) &&\n attempt < this.maxRetries\n ) {\n lastError = new RemoteAPIError(\n response.status,\n await response.text().catch(() => \"\"),\n );\n logSdkTimingEvent(\"http.request\", \"retryable_status\", {\n method,\n path: timingPath,\n status: response.status,\n attempt,\n server_trace_id: traceId,\n });\n continue;\n }\n\n if (allowHttpErrors || allowedErrorStatusCodes.has(response.status)) {\n logSdkTiming(\"http.request\", \"complete\", operationStart, {\n method,\n path: timingPath,\n status: response.status,\n attempts: attempt + 1,\n server_trace_id: traceId,\n });\n return { response, traceId };\n }\n\n // Non-retryable error — throw mapped error\n const errorBody = await response.text().catch(() => \"\");\n throwMappedError(response.status, errorBody, path);\n } catch (err) {\n if (timeoutId != null) clearTimeout(timeoutId);\n\n if (\n err instanceof RemoteAPIError ||\n err instanceof SandboxNotFoundError ||\n err instanceof PoolNotFoundError ||\n err instanceof PoolInUseError\n ) {\n throw err;\n }\n\n // A caller-supplied signal fired (and it wasn't our own deadline).\n if (signal?.aborted && !timedOut) {\n throw new SandboxConnectionError(\"request aborted by caller\", {\n cause: err,\n });\n }\n\n // Network / timeout error\n lastError = err instanceof Error ? err : new Error(String(err));\n logSdkTiming(\"http.request\", \"error\", attemptStart, {\n method,\n path: timingPath,\n attempt,\n server_trace_id: traceId,\n error: timedOut ? `request timed out after ${this.timeoutMs}ms` : describeError(err),\n });\n\n if (attempt >= this.maxRetries) {\n // Surface the real inner cause; for our own deadline, say so plainly.\n const detail = timedOut\n ? `request timed out after ${this.timeoutMs}ms`\n : describeError(err);\n throw new SandboxConnectionError(detail, { cause: err });\n }\n }\n }\n\n throw new SandboxConnectionError(\n lastError ? describeError(lastError) : \"request failed\",\n { cause: lastError },\n );\n }\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const lowered = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === lowered);\n}\n\nfunction normalizeRequestBody(\n body?: RequestBody | null,\n): UndiciBodyInit | undefined {\n if (body == null) {\n return undefined;\n }\n if (body instanceof Uint8Array) {\n return Uint8Array.from(body).buffer as ArrayBuffer;\n }\n return body as UndiciBodyInit;\n}\n\nfunction stripPathPayload(path: string): string {\n const queryStart = path.search(/[?#]/);\n return queryStart === -1 ? path : path.slice(0, queryStart);\n}\n\n/** Map HTTP status codes to specific error types. */\nfunction throwMappedError(status: number, body: string, path: string): never {\n let message = body;\n try {\n const parsed = JSON.parse(body);\n if (parsed.message) message = parsed.message;\n else if (parsed.error) message = parsed.error;\n } catch {\n // use raw body\n }\n\n if (status === 404) {\n // Determine entity type from path\n if (path.includes(\"sandbox-pools\") || path.includes(\"pools\")) {\n const match = path.match(/sandbox-pools\\/([^/]+)/);\n if (match) throw new PoolNotFoundError(match[1]);\n }\n if (path.includes(\"sandboxes\")) {\n const match = path.match(/sandboxes\\/([^/]+)/);\n if (match) throw new SandboxNotFoundError(match[1]);\n }\n throw new RemoteAPIError(404, message);\n }\n\n if (status === 409) {\n if (path.includes(\"sandbox-pools\") || path.includes(\"pools\")) {\n const match = path.match(/sandbox-pools\\/([^/]+)/);\n if (match) throw new PoolInUseError(match[1], message);\n }\n }\n\n throw new RemoteAPIError(status, message);\n}\n\n/** Combine multiple AbortSignals into one that aborts when any fires. */\nfunction anySignal(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), {\n once: true,\n });\n }\n return controller.signal;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export interface SSEMessage {\n data: string;\n event?: string;\n id?: string;\n}\n\n/**\n * Parse a Server-Sent Events stream into raw SSE messages.\n */\nexport async function* parseSSEMessages(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncIterable<SSEMessage> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) break;\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(/\\r?\\n/);\n const dataLines: string[] = [];\n let event: string | undefined;\n let id: string | undefined;\n\n for (const line of lines) {\n if (!line || line.startsWith(\":\")) continue;\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n\n if (field === \"data\") {\n dataLines.push(value);\n } else if (field === \"event\") {\n event = value;\n } else if (field === \"id\") {\n id = value;\n }\n }\n\n if (dataLines.length > 0 || event || id) {\n yield { data: dataLines.join(\"\\n\"), event, id };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse a Server-Sent Events stream from a ReadableStream<Uint8Array>.\n *\n * Yields parsed JSON objects for each `data:` line. Handles reconnection\n * by simply yielding events as they arrive.\n */\nexport async function* parseSSEStream<T>(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncIterable<T> {\n for await (const message of parseSSEMessages(stream, signal)) {\n if (!message.data) continue;\n try {\n yield JSON.parse(message.data) as T;\n } catch {\n // Skip malformed JSON\n }\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { HttpClient } from \"./http.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport { parseSSEStream } from \"./sse.js\";\nimport type {\n ApiKeyIntrospection,\n ApplicationBuildContext,\n ApplicationBuildResponse,\n ApplicationManifest,\n ApplicationSummary,\n BinaryPayload,\n BuildInfo,\n BuildLogEntry,\n CloudClientOptions,\n CreateApplicationBuildRequest,\n NewSecret,\n RequestInput,\n RequestMetadata,\n RequestOutput,\n SandboxTemplate,\n Secret,\n SecretsList,\n FileSystem,\n StartImageBuildRequest,\n UpsertSecretResponse,\n} from \"./cloud-models.js\";\n\nexport class CloudClient {\n private readonly http: HttpClient;\n private readonly organizationId?: string;\n private readonly projectId?: string;\n private readonly namespace: string;\n\n constructor(options?: CloudClientOptions) {\n this.organizationId = options?.organizationId;\n this.projectId = options?.projectId;\n this.namespace = options?.namespace ?? defaults.NAMESPACE;\n this.http = new HttpClient({\n baseUrl: options?.apiUrl ?? defaults.API_URL,\n apiKey: options?.apiKey ?? defaults.API_KEY,\n organizationId: this.organizationId,\n projectId: this.projectId,\n maxRetries: options?.maxRetries ?? defaults.MAX_RETRIES,\n retryBackoffMs: options?.retryBackoffMs ?? defaults.RETRY_BACKOFF_MS,\n });\n }\n\n static forCloud(options?: CloudClientOptions): CloudClient {\n return new CloudClient(options);\n }\n\n close(): void {\n this.http.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: BinaryPayload,\n upgradeRunningRequests = false,\n ): Promise<void> {\n const form = new FormData();\n form.append(\n \"code\",\n new Blob([toBlobPart(codeZip)], { type: \"application/zip\" }),\n \"code.zip\",\n );\n form.append(\"code_content_type\", \"application/zip\");\n form.append(\"application\", JSON.stringify(manifest));\n form.append(\n \"upgrade_requests_to_latest_code\",\n String(upgradeRunningRequests),\n );\n\n await this.http.requestResponse(\"POST\", this.namespacePath(\"applications\"), {\n body: form,\n });\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.http.requestResponse(\n \"DELETE\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.http.requestResponse(\n \"DELETE\",\n this.namespacePath(`sandbox-images/${encodeURIComponent(imageName)}`),\n );\n }\n\n /**\n * Look up a registered sandbox image (template) by its registered name.\n *\n * Returns the template, or `null` when no image with that name exists.\n * Routed through the platform sandbox-templates API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async findSandboxImageByName(\n imageName: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate | null> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const response = await this.http.requestResponse(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/sandbox-templates/by-name/${encodeURIComponent(imageName)}`,\n { allowedErrorStatusCodes: new Set([404]) },\n );\n if (response.status === 404) {\n return null;\n }\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as SandboxTemplate;\n }\n\n /**\n * List all registered sandbox images (templates), following pagination to\n * the end. Routed through the platform sandbox-templates API, which requires\n * the organization/project scope (from the client or the `options` override).\n */\n async listSandboxImages(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate[]> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const base = `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/sandbox-templates`;\n let path: string | null = `${base}?pageSize=100`;\n const templates: SandboxTemplate[] = [];\n while (path !== null) {\n const page: SandboxTemplatesPage = await this.http.requestJson<SandboxTemplatesPage>(\n \"GET\",\n path,\n );\n for (const item of page.items ?? []) {\n templates.push(fromSnakeKeys(item) as SandboxTemplate);\n }\n const next = page.pagination?.next;\n path = next ? nextRequestPath(next) : null;\n }\n return templates;\n }\n\n /**\n * Register a new file system with the project.\n *\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async createFileSystem(\n request: { name: string; description?: string },\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const body: Record<string, unknown> = { name: request.name };\n if (request.description != null) body.description = request.description;\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems`,\n { body },\n );\n return fromSnakeKeys(raw) as FileSystem;\n }\n\n /**\n * List all registered file systems, following pagination to the end.\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async listFileSystems(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem[]> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const base = `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems`;\n let path: string | null = `${base}?pageSize=100`;\n const fileSystems: FileSystem[] = [];\n while (path !== null) {\n const page: FileSystemsPage =\n await this.http.requestJson<FileSystemsPage>(\"GET\", path);\n for (const item of page.items ?? []) {\n fileSystems.push(fromSnakeKeys(item) as FileSystem);\n }\n const next = page.pagination?.next;\n path = next ? nextRequestPath(next) : null;\n }\n return fileSystems;\n }\n\n /**\n * Delete a registered file system by its id (e.g. `file_system_...`).\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async deleteFileSystem(\n fileSystemId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n await this.http.requestResponse(\n \"DELETE\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems/${encodeURIComponent(fileSystemId)}`,\n );\n }\n\n async applications(): Promise<ApplicationSummary[]> {\n const raw = await this.http.requestJson<{ applications: Record<string, unknown>[] }>(\n \"GET\",\n this.namespacePath(\"applications\"),\n );\n return (raw.applications ?? []).map(\n (application) => fromSnakeKeys(application) as ApplicationSummary,\n );\n }\n\n async applicationManifest(applicationName: string): Promise<ApplicationManifest> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n return fromSnakeKeys(raw) as ApplicationManifest;\n }\n\n async runRequest(\n applicationName: string,\n inputs: RequestInput[] = [],\n ): Promise<string> {\n const path = this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}`,\n );\n\n const response =\n inputs.length === 0\n ? await this.http.requestResponse(\"POST\", path, {\n body: new Uint8Array(),\n headers: { Accept: \"application/json\" },\n })\n : inputs.length === 1 && inputs[0].name === \"0\"\n ? await this.http.requestResponse(\"POST\", path, {\n body: toRequestBody(inputs[0].data),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": inputs[0].contentType,\n },\n })\n : await this.runMultipartRequest(path, inputs);\n\n const body = await parseJsonResponse<{ request_id?: string }>(response);\n const requestId = body?.request_id;\n if (!requestId) {\n throw new Error(\"missing request_id in run request response body\");\n }\n return requestId;\n }\n\n async waitOnRequestCompletion(\n applicationName: string,\n requestId: string,\n ): Promise<void> {\n const stream = await this.http.requestStream(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/progress`,\n ),\n );\n\n for await (const event of parseSSEStream<Record<string, unknown>>(stream)) {\n if (Object.prototype.hasOwnProperty.call(event, \"RequestFinished\")) {\n return;\n }\n }\n\n throw new Error(\"progress stream ended before request completion\");\n }\n\n async requestMetadata(\n applicationName: string,\n requestId: string,\n ): Promise<RequestMetadata> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}`,\n ),\n );\n return fromSnakeKeys(raw) as RequestMetadata;\n }\n\n async requestOutput(\n applicationName: string,\n requestId: string,\n ): Promise<RequestOutput> {\n const response = await this.http.requestResponse(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/output`,\n ),\n );\n\n const serializedValue = new Uint8Array(await response.arrayBuffer());\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return {\n serializedValue,\n contentType,\n };\n }\n\n async introspectApiKey(): Promise<ApiKeyIntrospection> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n \"/platform/v1/keys/introspect\",\n );\n return fromSnakeKeys(raw) as ApiKeyIntrospection;\n }\n\n async listSecrets(options?: {\n organizationId?: string;\n projectId?: string;\n pageSize?: number;\n }): Promise<SecretsList> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets?pageSize=${options?.pageSize ?? 100}`,\n );\n return fromSnakeKeys(raw) as SecretsList;\n }\n\n async getSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<Secret> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets/${encodeURIComponent(secretId)}`,\n );\n return fromSnakeKeys(raw) as Secret;\n }\n\n async upsertSecrets(\n secrets: NewSecret | NewSecret[],\n options?: { organizationId?: string; projectId?: string },\n ): Promise<UpsertSecretResponse> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown> | Record<string, unknown>[]>(\n \"PUT\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets`,\n { body: secrets },\n );\n if (Array.isArray(raw)) {\n return raw.map((secret) => fromSnakeKeys(secret) as Secret);\n }\n return fromSnakeKeys(raw) as Secret;\n }\n\n async deleteSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n await this.http.requestResponse(\n \"DELETE\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets/${encodeURIComponent(secretId)}`,\n );\n }\n\n async startImageBuild(\n buildServicePath: string,\n request: StartImageBuildRequest,\n ): Promise<BuildInfo> {\n const form = new FormData();\n form.append(\"graph_name\", request.applicationName);\n form.append(\"graph_version\", request.applicationVersion);\n form.append(\"graph_function_name\", request.functionName);\n form.append(\"image_name\", request.imageName);\n form.append(\"image_id\", request.imageId);\n form.append(\n \"context\",\n new Blob([toBlobPart(request.buildContext)]),\n \"context.tar.gz\",\n );\n\n const response = await this.http.requestResponse(\n \"PUT\",\n `${trimTrailingSlashes(buildServicePath)}/builds`,\n { body: form },\n );\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as BuildInfo;\n }\n\n async createApplicationBuild(\n buildServicePath: string,\n request: CreateApplicationBuildRequest,\n imageContexts: ApplicationBuildContext[],\n ): Promise<ApplicationBuildResponse> {\n const form = createApplicationBuildForm(request, imageContexts);\n const response = await this.http.requestResponse(\n \"POST\",\n trimTrailingSlashes(buildServicePath),\n { body: form },\n );\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async applicationBuildInfo(\n buildServicePath: string,\n applicationBuildId: string,\n ): Promise<ApplicationBuildResponse> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/${encodeURIComponent(applicationBuildId)}`,\n );\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async cancelApplicationBuild(\n buildServicePath: string,\n applicationBuildId: string,\n ): Promise<ApplicationBuildResponse> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n `${trimTrailingSlashes(buildServicePath)}/${encodeURIComponent(applicationBuildId)}/cancel`,\n );\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async buildInfo(\n buildServicePath: string,\n buildId: string,\n ): Promise<BuildInfo> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}`,\n );\n return fromSnakeKeys(raw) as BuildInfo;\n }\n\n async cancelBuild(buildServicePath: string, buildId: string): Promise<void> {\n await this.http.requestResponse(\n \"POST\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/cancel`,\n );\n }\n\n async *streamBuildLogs(\n buildServicePath: string,\n buildId: string,\n signal?: AbortSignal,\n ): AsyncIterable<BuildLogEntry> {\n const stream = await this.http.requestStream(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/logs`,\n { signal },\n );\n for await (const event of parseSSEStream<Record<string, unknown>>(stream, signal)) {\n yield fromSnakeKeys(event) as BuildLogEntry;\n }\n }\n\n private async runMultipartRequest(\n path: string,\n inputs: RequestInput[],\n ): Promise<Response> {\n const form = new FormData();\n for (const input of inputs) {\n form.append(\n input.name,\n new Blob([toBlobPart(input.data)], { type: input.contentType }),\n input.name,\n );\n }\n return this.http.requestResponse(\"POST\", path, {\n body: form,\n headers: { Accept: \"application/json\" },\n });\n }\n\n private namespacePath(subpath: string): string {\n return `/v1/namespaces/${encodeURIComponent(this.namespace)}/${subpath.replace(/^\\/+/, \"\")}`;\n }\n\n private resolveScope(\n organizationId?: string,\n projectId?: string,\n ): { organizationId: string; projectId: string } {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\n \"organizationId and projectId are required for this operation\",\n );\n }\n return {\n organizationId: resolvedOrganizationId,\n projectId: resolvedProjectId,\n };\n }\n}\n\nfunction createApplicationBuildForm(\n request: CreateApplicationBuildRequest,\n imageContexts: ApplicationBuildContext[],\n): FormData {\n const contextsByPartName = new Map<string, ApplicationBuildContext>();\n for (const context of imageContexts) {\n if (contextsByPartName.has(context.contextTarPartName)) {\n throw new Error(\n `duplicate image context part name '${context.contextTarPartName}'`,\n );\n }\n contextsByPartName.set(context.contextTarPartName, context);\n }\n\n const form = new FormData();\n form.append(\n \"app_version\",\n new Blob([JSON.stringify(request)], { type: \"application/json\" }),\n \"app_version\",\n );\n\n for (const image of request.images) {\n const context = contextsByPartName.get(image.contextTarPartName);\n if (!context) {\n throw new Error(\n `missing image context for part '${image.contextTarPartName}'`,\n );\n }\n form.append(\n image.contextTarPartName,\n new Blob([toBlobPart(context.contextTarGz)]),\n `${image.contextTarPartName}.tar.gz`,\n );\n }\n\n for (const context of imageContexts) {\n if (!request.images.some((image) => image.contextTarPartName === context.contextTarPartName)) {\n throw new Error(\n `unexpected image context for part '${context.contextTarPartName}'`,\n );\n }\n }\n\n return form;\n}\n\nfunction trimTrailingSlashes(value: string): string {\n return value.endsWith(\"/\") ? value.slice(0, -1) : value;\n}\n\n/** One page of the paginated sandbox-templates list response. */\ninterface SandboxTemplatesPage {\n items?: Record<string, unknown>[];\n pagination?: { next?: string };\n}\n\n/** One page of the paginated file-systems list response. */\ninterface FileSystemsPage {\n items?: Record<string, unknown>[];\n pagination?: { next?: string };\n}\n\n/**\n * Reduce a `pagination.next` link to a base-URL-relative request path. The\n * server may return either an absolute URL or an absolute path; the HTTP\n * client always prepends its base URL, so absolute URLs must be reduced to\n * their path+query first.\n */\nfunction nextRequestPath(next: string): string {\n const schemeIndex = next.indexOf(\"://\");\n if (schemeIndex !== -1) {\n const afterScheme = next.slice(schemeIndex + 3);\n const slashIndex = afterScheme.indexOf(\"/\");\n return slashIndex === -1 ? \"/\" : afterScheme.slice(slashIndex);\n }\n return next.startsWith(\"/\") ? next : `/${next}`;\n}\n\nfunction toBlobPart(data: BinaryPayload): string | Blob | ArrayBuffer {\n if (typeof data === \"string\" || data instanceof Blob) {\n return data;\n }\n if (data instanceof Uint8Array) {\n return Uint8Array.from(data).buffer;\n }\n return data;\n}\n\nfunction toRequestBody(data: BinaryPayload): string | Blob | ArrayBuffer {\n return toBlobPart(data);\n}\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n}\n","import { randomUUID } from \"node:crypto\";\n\n// Erased at runtime — safe despite the module cycle with sandbox-image.ts,\n// which imports Image from here.\nimport type { CreateSandboxImageOptions } from \"./sandbox-image.js\";\n\nconst DEFAULT_IMAGE_NAME = \"default\";\n\nexport const ImageBuildOperationType = {\n ADD: \"ADD\",\n COPY: \"COPY\",\n ENV: \"ENV\",\n RUN: \"RUN\",\n WORKDIR: \"WORKDIR\",\n} as const;\n\nexport type ImageBuildOperationType =\n (typeof ImageBuildOperationType)[keyof typeof ImageBuildOperationType];\n\nexport interface ImageBuildOperation {\n type: ImageBuildOperationType;\n args: string[];\n options: Record<string, string>;\n}\n\nexport interface ImageOptions {\n name?: string;\n tag?: string;\n baseImage?: string | null;\n}\n\nfunction cloneOperation(op: ImageBuildOperation): ImageBuildOperation {\n return {\n type: op.type,\n args: [...op.args],\n options: { ...op.options },\n };\n}\n\nexport class Image {\n readonly _id: string;\n readonly _name: string;\n readonly _tag: string;\n readonly _baseImage: string | null;\n readonly _buildOperations: ImageBuildOperation[];\n\n constructor();\n constructor(name: string, tag?: string, baseImage?: string | null);\n constructor(options: ImageOptions);\n constructor(\n nameOrOptions: string | ImageOptions = {},\n tag = \"latest\",\n baseImage: string | null = null,\n ) {\n this._id = randomUUID();\n this._buildOperations = [];\n\n if (typeof nameOrOptions === \"string\") {\n this._name = nameOrOptions;\n this._tag = tag;\n this._baseImage = baseImage;\n return;\n }\n\n this._name = nameOrOptions.name ?? DEFAULT_IMAGE_NAME;\n this._tag = nameOrOptions.tag ?? \"latest\";\n this._baseImage = nameOrOptions.baseImage ?? null;\n }\n\n get name(): string {\n return this._name;\n }\n\n get tag(): string {\n return this._tag;\n }\n\n get baseImage(): string | null {\n return this._baseImage;\n }\n\n get buildOperations(): ImageBuildOperation[] {\n return this._buildOperations.map(cloneOperation);\n }\n\n add(\n src: string,\n dest: string,\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.ADD,\n args: [src, dest],\n options: options == null ? {} : { ...options },\n });\n }\n\n copy(\n src: string,\n dest: string,\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.COPY,\n args: [src, dest],\n options: options == null ? {} : { ...options },\n });\n }\n\n env(key: string, value: string): this {\n return this._addOperation({\n type: ImageBuildOperationType.ENV,\n args: [key, value],\n options: {},\n });\n }\n\n run(\n commands: string | string[],\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.RUN,\n args: Array.isArray(commands) ? [...commands] : [commands],\n options: options == null ? {} : { ...options },\n });\n }\n\n workdir(directory: string): this {\n return this._addOperation({\n type: ImageBuildOperationType.WORKDIR,\n args: [directory],\n options: {},\n });\n }\n\n /**\n * Build this image as a sandbox template and register it.\n *\n * Materializes the image in a build sandbox, snapshots the filesystem,\n * and registers the snapshot as a named sandbox template.\n */\n async build(\n options: CreateSandboxImageOptions = {},\n ): Promise<Record<string, unknown>> {\n const { createSandboxImage } = await import(\"./sandbox-image.js\");\n return createSandboxImage(this, options);\n }\n\n private _addOperation(op: ImageBuildOperation): this {\n this._buildOperations.push(op);\n return this;\n }\n}\n\nfunction renderOptions(options: Record<string, string>): string {\n const entries = Object.entries(options);\n if (entries.length === 0) {\n return \"\";\n }\n return ` ${entries.map(([key, value]) => `--${key}=${value}`).join(\" \")}`;\n}\n\nfunction renderBuildOp(op: ImageBuildOperation): string {\n const options = renderOptions(op.options);\n if (op.type === ImageBuildOperationType.ENV) {\n return `ENV${options} ${op.args[0]}=${JSON.stringify(op.args[1])}`;\n }\n return `${op.type}${options} ${op.args.join(\" \")}`;\n}\n\nexport function dockerfileContent(image: Image): string {\n const lines = image.baseImage == null ? [] : [`FROM ${image.baseImage}`];\n lines.push(...image.buildOperations.map((op) => renderBuildOp(op)));\n return lines.join(\"\\n\");\n}\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { existsSync, mkdtempSync, rmSync } from \"node:fs\";\nimport { parseArgs } from \"node:util\";\nimport { CloudClient } from \"./cloud-client.js\";\nimport type { SandboxTemplate } from \"./cloud-models.js\";\nimport { Image, ImageBuildOperationType, dockerfileContent } from \"./image.js\";\nimport type { ImageBuildOperation } from \"./image.js\";\n\n/**\n * Sandbox-image build engine.\n *\n * Renders the source to a Dockerfile (for `Image` inputs) and hands the\n * Dockerfile path/text + context to the Rust core via `@tensorlake/native`,\n * which parses, validates, materializes, and registers the image. The Rust\n * core owns parsing and the warnings for instructions that run during the\n * build but have no effect when a sandbox runs from the image\n * (`ONBUILD`/`SHELL`/`EXPOSE`/`HEALTHCHECK`/`LABEL`/`STOPSIGNAL`/`VOLUME`).\n */\n\nexport interface CreateSandboxImageOptions {\n registeredName?: string;\n cpus?: number;\n memoryMb?: number;\n diskMb?: number;\n builderDiskMb?: number;\n isPublic?: boolean;\n /**\n * Build context directory for an `Image` source, used exactly like\n * `docker build <contextDir>`: it is uploaded as-is and COPY/ADD sources\n * resolve relative to it. Required when the image has COPY/ADD ops that read\n * host files — building without it then throws. When the image has no such\n * ops it may be omitted, and an empty context (just the generated Dockerfile)\n * is uploaded so cwd is not archived. Ignored when the source is a Dockerfile\n * path (the Dockerfile's parent directory is used instead).\n */\n contextDir?: string;\n /**\n * Use Docker/BuildKit max compatibility mode (build is slower and uses more\n * memory and disk space on builder sandbox).\n */\n dockerCompat?: boolean;\n /**\n * Print build progress to stderr. Ignored when an explicit `emit` is\n * passed via `deps`. Defaults to false — `createSandboxImage` is silent\n * by default when invoked programmatically (e.g. `Image.build()`).\n */\n verbose?: boolean;\n}\n\nexport interface ImportSandboxImageOptions {\n /**\n * Name to register the image under. Defaults to the image reference's last\n * path segment with any tag/digest stripped (e.g. `pytorch/pytorch:2.4.1`\n * -> `pytorch`).\n */\n registeredName?: string;\n cpus?: number;\n memoryMb?: number;\n diskMb?: number;\n builderDiskMb?: number;\n isPublic?: boolean;\n /**\n * Use Docker/BuildKit max compatibility mode (import is slower and uses more\n * memory and disk space on builder sandbox).\n */\n dockerCompat?: boolean;\n /**\n * Print build progress to stderr. Ignored when an explicit `emit` is\n * passed via `deps`. Defaults to false.\n */\n verbose?: boolean;\n}\n\nexport type SandboxImageSource = string | Image;\n\nexport interface CreateSandboxImageDeps {\n emit?: (event: Record<string, unknown>) => void;\n}\n\n// --- Native binding loader -------------------------------------------------\n\n/** Auth/context + resource fields shared by the build and import bindings. */\ninterface NativeBindingCommonOptions {\n apiUrl: string;\n bearerToken: string;\n registeredName?: string | undefined | null;\n diskMb?: number | undefined | null;\n builderDiskMb?: number | undefined | null;\n cpus?: number | undefined | null;\n memoryMb?: number | undefined | null;\n isPublic?: boolean | undefined | null;\n organizationId?: string | undefined | null;\n projectId?: string | undefined | null;\n namespace?: string | undefined | null;\n useScopeHeaders?: boolean | undefined | null;\n userAgent?: string | undefined | null;\n dockerCompat?: boolean | undefined | null;\n}\n\ninterface NativeBindingOptions extends NativeBindingCommonOptions {\n dockerfilePath: string;\n dockerfileText?: string | undefined | null;\n contextDir?: string | undefined | null;\n}\n\ninterface NativeBindingImportOptions extends NativeBindingCommonOptions {\n imageReference: string;\n}\n\ninterface NativeBindingEvent {\n eventType: string;\n stream?: string | undefined | null;\n message: string;\n}\n\ninterface NativeBinding {\n buildSandboxImage(\n options: NativeBindingOptions,\n emit?: ((event: NativeBindingEvent) => void) | null | undefined,\n ): Promise<string>;\n importSandboxImage(\n options: NativeBindingImportOptions,\n emit?: ((event: NativeBindingEvent) => void) | null | undefined,\n ): Promise<string>;\n}\n\n// `require` exists in the CJS bundle but not in ESM; declared here so the\n// runtime check below typechecks under \"module\": \"esnext\".\ndeclare const require: NodeRequire | undefined;\ndeclare const module: { exports?: unknown } | undefined;\n\nlet cachedNativeBinding: NativeBinding | undefined;\nlet cachedNativeBindingError: Error | undefined;\n\nfunction resolveRequire(): NodeRequire {\n // tsup rewrites `import.meta.url` to `import_meta.url` (where\n // `import_meta = {}`) in the CJS output, so `createRequire(import.meta.url)`\n // throws if called at all in CJS. CJS bundles get the real `require`\n // injected at runtime; prefer it. ESM bundles fall back to the createRequire\n // path, which only runs when `import.meta.url` is a real file URL.\n if (\n typeof module !== \"undefined\" &&\n module.exports != null &&\n typeof require !== \"undefined\"\n ) {\n return require;\n }\n return createRequire(import.meta.url);\n}\n\nfunction loadNativeBinding(): NativeBinding {\n if (cachedNativeBinding) return cachedNativeBinding;\n if (cachedNativeBindingError) throw cachedNativeBindingError;\n try {\n // The native binding is staged per-platform under\n // `typescript/dist/native/<triple>/tensorlake-node.node`. Loading goes\n // through the same helper the CLI binaries use so platform detection\n // stays in one place (`typescript/lib/runtime.cjs`). Deferred require so\n // the CJS bundle doesn't trip the `import.meta.url` → undefined fallback.\n const { loadNative } = resolveRequire()(\"../lib/runtime.cjs\") as {\n loadNative: () => NativeBinding;\n };\n cachedNativeBinding = loadNative();\n return cachedNativeBinding;\n } catch (error) {\n cachedNativeBindingError =\n error instanceof Error ? error : new Error(String(error));\n throw cachedNativeBindingError;\n }\n}\n\n/** Test seam: replace the native binding with a stub. */\nexport function __setNativeBindingForTest(binding: NativeBinding | undefined): void {\n cachedNativeBinding = binding;\n cachedNativeBindingError = undefined;\n}\n\n// --- Build context ---------------------------------------------------------\n\nexport interface BuildContext {\n apiUrl: string;\n apiKey?: string;\n personalAccessToken?: string;\n namespace: string;\n organizationId?: string;\n projectId?: string;\n debug: boolean;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value && value.length > 0 ? value : undefined;\n}\n\nexport function buildContextFromEnv(): BuildContext {\n const debugRaw = (process.env.TENSORLAKE_DEBUG ?? \"\").toLowerCase();\n const debug = [\"1\", \"true\", \"yes\", \"on\"].includes(debugRaw);\n return {\n apiUrl: nonEmpty(process.env.TENSORLAKE_API_URL) ?? \"https://api.tensorlake.ai\",\n apiKey: nonEmpty(process.env.TENSORLAKE_API_KEY),\n personalAccessToken: nonEmpty(process.env.TENSORLAKE_PAT),\n namespace: nonEmpty(process.env.INDEXIFY_NAMESPACE) ?? \"default\",\n organizationId: nonEmpty(process.env.TENSORLAKE_ORGANIZATION_ID),\n projectId: nonEmpty(process.env.TENSORLAKE_PROJECT_ID),\n debug,\n };\n}\n\n// --- Default-name helper ---------------------------------------------------\n\nconst DEFAULT_IMAGE_NAME = \"default\";\n\nfunction defaultRegisteredName(dockerfilePath: string): string {\n const parsed = path.parse(dockerfilePath);\n if (parsed.name.toLowerCase() === \"dockerfile\") {\n const parentName = path.basename(path.dirname(dockerfilePath)).trim();\n return parentName || \"sandbox-image\";\n }\n return parsed.name || \"sandbox-image\";\n}\n\n/**\n * Mirror the Rust core's default name derivation for image imports: the last\n * path segment of the reference with any tag/digest stripped\n * (e.g. `pytorch/pytorch:2.4.1` -> `pytorch`, `ghcr.io/org/app@sha256:...`\n * -> `app`).\n */\nfunction defaultRegisteredNameFromImage(imageReference: string): string {\n const withoutDigest = imageReference.split(\"@\", 1)[0] ?? imageReference;\n const lastSegment = withoutDigest.split(\"/\").pop() ?? withoutDigest;\n const colonIndex = lastSegment.lastIndexOf(\":\");\n const name =\n colonIndex > 0 && colonIndex < lastSegment.length - 1\n ? lastSegment.slice(0, colonIndex)\n : lastSegment;\n return name || \"imported-image\";\n}\n\n// --- Emit helpers ----------------------------------------------------------\n\nfunction noopEmit(_event: Record<string, unknown>): void {}\n\nfunction stderrEmit(event: Record<string, unknown>): void {\n const message = typeof event.message === \"string\" ? event.message : \"\";\n const type = typeof event.type === \"string\" ? event.type : \"\";\n if (type === \"build_log\") {\n const stream = typeof event.stream === \"string\" ? event.stream : \"stdout\";\n process.stderr.write(`[${stream}] ${message}\\n`);\n } else if (message) {\n process.stderr.write(`[${type}] ${message}\\n`);\n }\n}\n\nfunction ndjsonStdoutEmit(event: Record<string, unknown>): void {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n}\n\nfunction eventToEmitDict(event: NativeBindingEvent): Record<string, unknown> {\n const out: Record<string, unknown> = {\n type: event.eventType,\n message: event.message,\n };\n if (event.stream != null) out.stream = event.stream;\n return out;\n}\n\n/**\n * True when a `RUN` op bind-mounts the build context (reads host files).\n * A BuildKit `RUN --mount=type=bind` reads from the build context unless it\n * mounts `from=<stage/image>`. `bind` is the default mount type, so a mount\n * with no explicit `type` counts too. Other mount types\n * (`cache`/`tmpfs`/`secret`/`ssh`) don't read the build context.\n */\nfunction runOpMountsContext(op: ImageBuildOperation): boolean {\n if (op.type !== ImageBuildOperationType.RUN) {\n return false;\n }\n const mount = op.options.mount;\n if (mount == null || mount === \"\") {\n return false;\n }\n const fields: Record<string, string> = {};\n for (const token of mount.split(\",\")) {\n const eq = token.indexOf(\"=\");\n const key = (eq === -1 ? token : token.slice(0, eq)).trim();\n const value = eq === -1 ? \"\" : token.slice(eq + 1).trim();\n fields[key] = value;\n }\n if ((fields.type ?? \"bind\") !== \"bind\") {\n return false;\n }\n return !(\"from\" in fields);\n}\n\n/**\n * True when a build op reads files from the host build context.\n * `COPY`/`ADD` with host sources need a context; a `RUN` with a\n * `--mount=type=bind` (the default type) reads it too. `COPY --from=<stage>`,\n * remote `ADD <url>`, `from=` bind mounts, and non-bind mounts don't.\n */\nfunction opReferencesHostFiles(op: ImageBuildOperation): boolean {\n if (op.type === ImageBuildOperationType.RUN) {\n return runOpMountsContext(op);\n }\n if (\n op.type !== ImageBuildOperationType.COPY &&\n op.type !== ImageBuildOperationType.ADD\n ) {\n return false;\n }\n if (op.options.from != null) {\n return false;\n }\n if (\n op.type === ImageBuildOperationType.ADD &&\n (op.args[0].startsWith(\"http://\") || op.args[0].startsWith(\"https://\"))\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * True if the image has ops that read files from the host (COPY/ADD host\n * sources, or a RUN bind mount). Such builds need a build context to resolve\n * those sources, so the caller must pass `contextDir` (mirroring\n * `docker build <context>`).\n */\nfunction imageRequiresContext(image: Image): boolean {\n return image.buildOperations.some(opReferencesHostFiles);\n}\n\n// --- Public API ------------------------------------------------------------\n\nexport async function createSandboxImage(\n source: SandboxImageSource,\n options: CreateSandboxImageOptions = {},\n deps: CreateSandboxImageDeps = {},\n): Promise<Record<string, unknown>> {\n const emit = deps.emit ?? (options.verbose ? stderrEmit : noopEmit);\n const context = buildContextFromEnv();\n\n let dockerfilePath: string;\n let dockerfileText: string | undefined;\n let nativeContextDir: string | undefined;\n let effectiveName: string;\n // Throwaway empty build context created when an Image build has no explicit\n // contextDir. Removed in the finally below.\n let tempContextDir: string | undefined;\n\n if (source instanceof Image) {\n if (!source.baseImage) {\n throw new Error(\"Image must have a baseImage to build\");\n }\n // With an explicit contextDir we upload that directory as-is, like\n // `docker build <dir>`. Without one, an image that reads host files via\n // COPY/ADD can't be built (there is no context to resolve them against);\n // images without such ops get an empty context (just the Dockerfile) so\n // the whole cwd is not archived.\n let resolvedContext: string;\n if (options.contextDir != null) {\n resolvedContext = path.resolve(options.contextDir);\n } else if (imageRequiresContext(source)) {\n throw new Error(\n \"This image reads files from the host (via COPY/ADD or a RUN bind \" +\n \"mount), so it needs a build context. Pass `contextDir` pointing at \" +\n \"the directory that contains those sources; they resolve relative \" +\n \"to it, like `docker build <contextDir>`.\",\n );\n } else {\n tempContextDir = mkdtempSync(path.join(os.tmpdir(), \"tl-build-context-\"));\n resolvedContext = tempContextDir;\n }\n dockerfilePath = path.join(resolvedContext, \"Dockerfile\");\n let text = dockerfileContent(source);\n if (!text.endsWith(\"\\n\")) text += \"\\n\";\n dockerfileText = text;\n nativeContextDir = resolvedContext;\n effectiveName = options.registeredName ?? source.name;\n } else if (typeof source === \"string\") {\n const resolvedPath = path.resolve(source);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Dockerfile not found: ${source}`);\n }\n dockerfilePath = resolvedPath;\n dockerfileText = undefined;\n nativeContextDir = undefined;\n effectiveName =\n options.registeredName ?? defaultRegisteredName(resolvedPath);\n } else {\n throw new TypeError(\n `source must be an Image or a Dockerfile path, got ${typeof source}`,\n );\n }\n\n try {\n if (effectiveName === DEFAULT_IMAGE_NAME) {\n // eslint-disable-next-line no-console\n console.warn(\n `Building sandbox image with the default name \"${DEFAULT_IMAGE_NAME}\". ` +\n \"Pass `registeredName` or `Image({ name })` to avoid collisions \" +\n \"with other default-named images in this project.\",\n );\n }\n\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\n \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\",\n );\n }\n\n emit({ type: \"status\", message: `Building image '${effectiveName}'...` });\n\n const binding = loadNativeBinding();\n let emitError: unknown;\n const resultJson = await binding.buildSandboxImage(\n {\n apiUrl: context.apiUrl,\n bearerToken,\n dockerfilePath,\n registeredName: effectiveName,\n diskMb: options.diskMb,\n builderDiskMb: options.builderDiskMb,\n cpus: options.cpus,\n memoryMb: options.memoryMb,\n isPublic: options.isPublic ?? false,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n useScopeHeaders:\n context.personalAccessToken != null && context.apiKey == null,\n userAgent: undefined,\n dockerCompat: options.dockerCompat ?? false,\n dockerfileText,\n contextDir: nativeContextDir,\n },\n (event) => {\n try {\n emit(eventToEmitDict(event));\n } catch (error) {\n emitError ??= error;\n }\n },\n );\n\n if (emitError != null) {\n throw emitError;\n }\n\n let result: Record<string, unknown> = {};\n if (resultJson.trim().length > 0) {\n result = JSON.parse(resultJson) as Record<string, unknown>;\n }\n emit({\n type: \"image_registered\",\n name: effectiveName,\n image_id:\n (typeof result.id === \"string\" && result.id) ||\n (typeof result.templateId === \"string\" && result.templateId) ||\n \"\",\n });\n emit({ type: \"done\" });\n return result;\n } finally {\n if (tempContextDir != null) {\n rmSync(tempContextDir, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Import a registry image directly into a sandbox image — no Docker.\n *\n * Unlike {@link createSandboxImage}, there is no Dockerfile and no build\n * context: the builder pulls the referenced image's layers and applies them\n * straight into the rootfs (via `oci-image-to-ext4`), bypassing the Docker\n * daemon entirely. This is the programmatic backend for the\n * `tl sbx image import` CLI command. The import is always a fresh base from\n * the registry — the reference is never resolved against the template\n * registry.\n */\nexport async function importSandboxImage(\n imageReference: string,\n options: ImportSandboxImageOptions = {},\n deps: CreateSandboxImageDeps = {},\n): Promise<Record<string, unknown>> {\n const emit = deps.emit ?? (options.verbose ? stderrEmit : noopEmit);\n\n if (typeof imageReference !== \"string\" || imageReference.trim().length === 0) {\n throw new Error(\"image reference to import must not be empty\");\n }\n const reference = imageReference.trim();\n\n const context = buildContextFromEnv();\n const effectiveName =\n options.registeredName ?? defaultRegisteredNameFromImage(reference);\n\n if (effectiveName === DEFAULT_IMAGE_NAME) {\n // eslint-disable-next-line no-console\n console.warn(\n `Importing sandbox image with the default name \"${DEFAULT_IMAGE_NAME}\". ` +\n \"Pass `registeredName` to avoid collisions with other default-named \" +\n \"images in this project.\",\n );\n }\n\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n\n emit({\n type: \"status\",\n message: `Importing image '${reference}' as '${effectiveName}'...`,\n });\n\n const binding = loadNativeBinding();\n let emitError: unknown;\n const resultJson = await binding.importSandboxImage(\n {\n apiUrl: context.apiUrl,\n bearerToken,\n imageReference: reference,\n registeredName: effectiveName,\n diskMb: options.diskMb,\n builderDiskMb: options.builderDiskMb,\n cpus: options.cpus,\n memoryMb: options.memoryMb,\n isPublic: options.isPublic ?? false,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n useScopeHeaders:\n context.personalAccessToken != null && context.apiKey == null,\n userAgent: undefined,\n dockerCompat: options.dockerCompat ?? false,\n },\n (event) => {\n try {\n emit(eventToEmitDict(event));\n } catch (error) {\n emitError ??= error;\n }\n },\n );\n\n if (emitError != null) {\n throw emitError;\n }\n\n let result: Record<string, unknown> = {};\n if (resultJson.trim().length > 0) {\n result = JSON.parse(resultJson) as Record<string, unknown>;\n }\n emit({\n type: \"image_registered\",\n name: effectiveName,\n image_id:\n (typeof result.id === \"string\" && result.id) ||\n (typeof result.templateId === \"string\" && result.templateId) ||\n \"\",\n });\n emit({ type: \"done\" });\n return result;\n}\n\nexport async function deleteSandboxImage(imageName: string): Promise<void> {\n if (typeof imageName !== \"string\" || imageName.length === 0) {\n throw new TypeError(\"imageName must be a non-empty string\");\n }\n\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n await client.deleteSandboxImage(imageName);\n } finally {\n client.close();\n }\n}\n\n/**\n * Look up a registered sandbox image by its registered name.\n *\n * Returns the registered sandbox template, or `null` if no image with that\n * name exists. Uses the same environment-based Tensorlake auth as\n * `createSandboxImage`, and requires organization/project context\n * (`TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID`) since the lookup\n * is routed through the platform sandbox-templates API.\n */\nexport async function findSandboxImageByName(\n imageName: string,\n): Promise<SandboxTemplate | null> {\n if (typeof imageName !== \"string\" || imageName.length === 0) {\n throw new TypeError(\"imageName must be a non-empty string\");\n }\n\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Looking up a sandbox image by name requires organization and project \" +\n \"context (TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n return await client.findSandboxImageByName(imageName);\n } finally {\n client.close();\n }\n}\n\n/**\n * List all registered sandbox images for the current project.\n *\n * Returns the registered sandbox templates (each with `id`, `name`,\n * `snapshotId`, `public`, etc.). Uses the same environment-based Tensorlake\n * auth as `createSandboxImage`, and requires organization/project context\n * (`TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID`) since the listing\n * is routed through the platform sandbox-templates API.\n */\nexport async function listSandboxImages(): Promise<SandboxTemplate[]> {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Listing sandbox images requires organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n return await client.listSandboxImages();\n } finally {\n client.close();\n }\n}\n\nexport async function runCreateSandboxImageCli(argv = process.argv.slice(2)) {\n const parsed = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n name: { type: \"string\", short: \"n\" },\n cpus: { type: \"string\" },\n memory: { type: \"string\" },\n disk_mb: { type: \"string\" },\n builder_disk_mb: { type: \"string\" },\n docker_compat: { type: \"boolean\", default: false },\n public: { type: \"boolean\", default: false },\n },\n });\n\n const dockerfilePath = parsed.positionals[0];\n if (!dockerfilePath) {\n throw new Error(\n \"Usage: tensorlake-create-sandbox-image <dockerfile_path> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]\",\n );\n }\n\n const cpus =\n parsed.values.cpus != null ? Number(parsed.values.cpus) : undefined;\n const memoryMb =\n parsed.values.memory != null ? Number(parsed.values.memory) : undefined;\n const diskMb =\n parsed.values.disk_mb != null ? Number(parsed.values.disk_mb) : undefined;\n const builderDiskMb =\n parsed.values.builder_disk_mb != null\n ? Number(parsed.values.builder_disk_mb)\n : undefined;\n if (cpus != null && !Number.isFinite(cpus)) {\n throw new Error(`Invalid --cpus value: ${parsed.values.cpus}`);\n }\n if (memoryMb != null && !Number.isInteger(memoryMb)) {\n throw new Error(`Invalid --memory value: ${parsed.values.memory}`);\n }\n if (diskMb != null && !Number.isInteger(diskMb)) {\n throw new Error(`Invalid --disk_mb value: ${parsed.values.disk_mb}`);\n }\n if (builderDiskMb != null && !Number.isInteger(builderDiskMb)) {\n throw new Error(\n `Invalid --builder_disk_mb value: ${parsed.values.builder_disk_mb}`,\n );\n }\n\n await createSandboxImage(\n dockerfilePath,\n {\n registeredName: parsed.values.name,\n cpus,\n memoryMb,\n diskMb,\n builderDiskMb,\n dockerCompat: parsed.values.docker_compat,\n isPublic: parsed.values.public,\n },\n { emit: ndjsonStdoutEmit },\n );\n}\n\nexport async function runImportSandboxImageCli(argv = process.argv.slice(2)) {\n const parsed = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n name: { type: \"string\", short: \"n\" },\n cpus: { type: \"string\" },\n memory: { type: \"string\" },\n disk_mb: { type: \"string\" },\n builder_disk_mb: { type: \"string\" },\n docker_compat: { type: \"boolean\", default: false },\n public: { type: \"boolean\", default: false },\n },\n });\n\n const imageReference = parsed.positionals[0];\n if (!imageReference) {\n throw new Error(\n \"Usage: tensorlake-import-sandbox-image <image_reference> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]\",\n );\n }\n\n const cpus =\n parsed.values.cpus != null ? Number(parsed.values.cpus) : undefined;\n const memoryMb =\n parsed.values.memory != null ? Number(parsed.values.memory) : undefined;\n const diskMb =\n parsed.values.disk_mb != null ? Number(parsed.values.disk_mb) : undefined;\n const builderDiskMb =\n parsed.values.builder_disk_mb != null\n ? Number(parsed.values.builder_disk_mb)\n : undefined;\n if (cpus != null && !Number.isFinite(cpus)) {\n throw new Error(`Invalid --cpus value: ${parsed.values.cpus}`);\n }\n if (memoryMb != null && !Number.isInteger(memoryMb)) {\n throw new Error(`Invalid --memory value: ${parsed.values.memory}`);\n }\n if (diskMb != null && !Number.isInteger(diskMb)) {\n throw new Error(`Invalid --disk_mb value: ${parsed.values.disk_mb}`);\n }\n if (builderDiskMb != null && !Number.isInteger(builderDiskMb)) {\n throw new Error(\n `Invalid --builder_disk_mb value: ${parsed.values.builder_disk_mb}`,\n );\n }\n\n await importSandboxImage(\n imageReference,\n {\n registeredName: parsed.values.name,\n cpus,\n memoryMb,\n diskMb,\n builderDiskMb,\n dockerCompat: parsed.values.docker_compat,\n isPublic: parsed.values.public,\n },\n { emit: ndjsonStdoutEmit },\n );\n}\n","// Public API\nexport { SandboxClient } from \"./client.js\";\nexport { Sandbox } from \"./sandbox.js\";\nexport { Pty } from \"./sandbox.js\";\nexport { Desktop } from \"./desktop.js\";\nexport { TcpTunnel } from \"./tunnel.js\";\nexport { CloudClient } from \"./cloud-client.js\";\nexport { APIClient } from \"./api-client.js\";\nexport { RepositoryClient } from \"./repositories.js\";\nexport {\n createSandboxImage,\n importSandboxImage,\n deleteSandboxImage,\n findSandboxImageByName,\n listSandboxImages,\n} from \"./sandbox-image.js\";\nexport {\n createFileSystem,\n listFileSystems,\n deleteFileSystem,\n} from \"./file-system.js\";\nexport {\n FilesystemClient,\n Filesystem,\n FilesystemMount,\n} from \"./filesystem.js\";\nexport type { FilesystemClientOptions } from \"./filesystem.js\";\nexport {\n FilesystemError,\n FilesystemNotFoundError,\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n MountError,\n CliNotFoundError,\n} from \"./filesystem-models.js\";\nexport type {\n FilesystemInfo,\n FilesystemStatus,\n FileEntry,\n Snapshot,\n MountStatus,\n} from \"./filesystem-models.js\";\nexport { Image, dockerfileContent, ImageBuildOperationType } from \"./image.js\";\nexport { sandboxUrlFromIngressEndpoint } from \"./url.js\";\n\nexport type {\n PtyDataHandler,\n PtyExitHandler,\n PtyConnectionOptions,\n CreatePtyOptions,\n} from \"./sandbox.js\";\nexport type {\n ConnectDesktopOptions,\n DesktopDoubleClickOptions,\n DesktopPointerOptions,\n MouseButton,\n} from \"./desktop.js\";\nexport type {\n CreateTunnelOptions,\n TunnelAddress,\n} from \"./tunnel.js\";\n\n// Errors\nexport {\n SandboxException,\n SandboxError,\n SandboxConnectionError,\n SandboxNotFoundError,\n PoolNotFoundError,\n PoolInUseError,\n RemoteAPIError,\n RequestNotFinishedError,\n RequestFailedError,\n RequestExecutionError,\n} from \"./errors.js\";\n\n// Models & enums\nexport {\n SandboxStatus,\n SnapshotStatus,\n ProcessStatus,\n StdinMode,\n OutputMode,\n ContainerState,\n} from \"./models.js\";\n\nexport type {\n CheckpointType,\n SnapshotType,\n SnapshotOptions,\n SnapshotWaitCondition,\n} from \"./models.js\";\n\nexport type {\n BinaryPayload,\n CloudClientOptions,\n RequestInput,\n ApplicationSummary,\n ApplicationManifest,\n RequestErrorInfo,\n RequestMetadata,\n RequestOutput,\n ApiKeyIntrospection,\n NewSecret,\n Secret,\n SecretsPagination,\n SecretsList,\n UpsertSecretResponse,\n BuildInfo,\n BuildLogEntry,\n StartImageBuildRequest,\n CreateApplicationBuildImageRequest,\n CreateApplicationBuildRequest,\n ApplicationBuildContext,\n ApplicationBuildImageResult,\n ApplicationBuildResponse,\n SandboxTemplate,\n FileSystem,\n} from \"./cloud-models.js\";\n\nexport type {\n ContainerResourcesInfo,\n NetworkConfig,\n FileSystemMount,\n CopySandboxOptions,\n CopiedSandboxResponse,\n CopySandboxResponse,\n CreateSandboxOptions,\n GPUResources,\n CreateSandboxResponse,\n SandboxInfo,\n SandboxPortAccess,\n ArchivedSandboxInfo,\n ListArchivedSandboxesOptions,\n ListArchivedSandboxesResponse,\n CreateSnapshotResponse,\n SnapshotInfo,\n SnapshotAndWaitOptions,\n CreatePoolOptions,\n UpdatePoolOptions,\n CreateSandboxPoolResponse,\n PoolContainerInfo,\n SandboxPoolInfo,\n StartProcessOptions,\n RestartPolicy,\n RestartPolicyConfig,\n ProcessHealthCheckType,\n ProcessHealthCheck,\n ManagedProcessStatus,\n ManagedProcessHealthStatus,\n ManagedProcessExit,\n ManagedProcessInfo,\n ProcessUser,\n ProcessUserSpec,\n ProcessInfo,\n SandboxLogLevel,\n GetSandboxLogsOptions,\n SandboxLogSignal,\n SandboxLogsResponse,\n SandboxProcessLogFilter,\n SandboxProcessLogFiltersResponse,\n SendSignalResponse,\n OutputResponse,\n OutputEvent,\n RunOptions,\n CommandResult,\n DirectoryEntry,\n ListDirectoryResponse,\n CreatePtySessionOptions,\n PtySessionInfo,\n HealthResponse,\n DaemonInfo,\n SandboxClientOptions,\n SandboxOptions,\n CreateAndConnectOptions,\n SuspendResumeOptions,\n CheckpointOptions,\n ConnectOptions,\n} from \"./models.js\";\n\nexport type {\n CreateSandboxImageOptions,\n ImportSandboxImageOptions,\n SandboxImageSource,\n} from \"./sandbox-image.js\";\n\nexport type {\n ImageOptions,\n ImageBuildOperation,\n ImageBuildOperationType as ImageBuildOperationTypeValue,\n} from \"./image.js\";\n\nexport type {\n Branch,\n CommitJobError,\n CommitJobReadBack,\n CommitJobStatus,\n ConflictPath,\n ConflictTerm,\n GitCredential,\n GitRef,\n GitRepository,\n MergeConflict,\n MergeConflictRecord,\n MergeEntry,\n MergeOptions,\n MergeReport,\n MergeStats,\n Operation,\n OperationRef,\n PushReport,\n PushWorktreeOptions,\n RepositoryClientOptions,\n RepositoryHandle,\n RepositoryInfo,\n} from \"./repositories.js\";\n","import { CloudClient } from \"./cloud-client.js\";\nimport {\n RequestExecutionError,\n RequestFailedError,\n RequestNotFinishedError,\n} from \"./errors.js\";\nimport type {\n ApplicationManifest,\n ApplicationSummary,\n CloudClientOptions,\n RequestInput,\n RequestOutput,\n FileSystem,\n} from \"./cloud-models.js\";\n\nexport class APIClient {\n private readonly cloudClient: CloudClient;\n\n constructor(options?: CloudClientOptions) {\n this.cloudClient = new CloudClient(options);\n }\n\n close(): void {\n this.cloudClient.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: Uint8Array | ArrayBuffer | Blob | string,\n upgradeRunningRequests = false,\n ): Promise<void> {\n await this.cloudClient.upsertApplication(\n manifest,\n codeZip,\n upgradeRunningRequests,\n );\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.cloudClient.deleteApplication(applicationName);\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.cloudClient.deleteSandboxImage(imageName);\n }\n\n async createFileSystem(\n name: string,\n description?: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem> {\n return this.cloudClient.createFileSystem({ name, description }, options);\n }\n\n async listFileSystems(options?: {\n organizationId?: string;\n projectId?: string;\n }): Promise<FileSystem[]> {\n return this.cloudClient.listFileSystems(options);\n }\n\n async deleteFileSystem(\n fileSystemId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n await this.cloudClient.deleteFileSystem(fileSystemId, options);\n }\n\n async applications(): Promise<ApplicationSummary[]> {\n return this.cloudClient.applications();\n }\n\n async application(applicationName: string): Promise<ApplicationManifest> {\n return this.cloudClient.applicationManifest(applicationName);\n }\n\n async runRequest(\n applicationName: string,\n inputs: RequestInput[],\n ): Promise<string> {\n return this.cloudClient.runRequest(applicationName, inputs);\n }\n\n async waitOnRequestCompletion(\n applicationName: string,\n requestId: string,\n ): Promise<void> {\n await this.cloudClient.waitOnRequestCompletion(applicationName, requestId);\n }\n\n async requestOutput(\n applicationName: string,\n requestId: string,\n ): Promise<RequestOutput> {\n const metadata = await this.cloudClient.requestMetadata(\n applicationName,\n requestId,\n );\n\n if (metadata.outcome == null) {\n throw new RequestNotFinishedError();\n }\n\n if (typeof metadata.outcome === \"object\") {\n if (metadata.requestError?.message) {\n throw new RequestExecutionError(\n metadata.requestError.message,\n metadata.requestError.functionName,\n );\n }\n const failure =\n typeof metadata.outcome.failure === \"string\"\n ? metadata.outcome.failure\n : JSON.stringify(metadata.outcome);\n throw new RequestFailedError(failure);\n }\n\n return this.cloudClient.requestOutput(applicationName, requestId);\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { CloudClient } from \"./cloud-client.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./http.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeRepositoryClient,\n} from \"./native-sandbox.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\nexport interface RepositoryClientOptions {\n apiUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n}\n\nexport interface GitRepository {\n name: string;\n fullName: string;\n defaultBranch: string;\n status: string;\n}\n\nexport interface RepositoryHandle {\n repo: string;\n url: string;\n baseRepo?: string;\n}\n\nexport interface GitRef {\n name: string;\n oid: string;\n}\n\nexport interface Branch {\n name: string;\n refName: string;\n oid: string;\n}\n\nexport interface RepositoryInfo {\n repo: string;\n url: string;\n branches: Branch[];\n refs: GitRef[];\n}\n\nexport interface GitCredential {\n token: string;\n tokenType: string;\n expiresAt: string;\n gitUsername: string;\n repoPattern: string;\n scopes: string[];\n}\n\nexport interface CommitJobReadBack {\n done: number;\n total: number;\n}\n\nexport interface CommitJobError {\n kind: string;\n message: string;\n retryable: boolean;\n}\n\nexport interface CommitJobStatus {\n jobId: string;\n state: string;\n phase?: string;\n readBack?: CommitJobReadBack;\n commit?: string;\n tree?: string;\n refName?: string;\n parent?: string;\n created?: boolean;\n error?: CommitJobError;\n}\n\nexport interface PushReport {\n commit: string;\n tree: string;\n refName: string;\n created: boolean;\n files: number;\n bytesTotal: number;\n chunksTotal: number;\n chunksUploaded: number;\n bytesUploaded: number;\n fileBlobOids: Array<[string, string]>;\n}\n\nexport interface PushWorktreeOptions {\n path?: string;\n branch?: string;\n message?: string;\n expectOid?: string;\n}\n\nexport interface MergeEntry {\n mode: number;\n oid: string;\n}\n\nexport interface MergeConflict {\n path: string;\n kind: string;\n potential: boolean;\n ours?: MergeEntry;\n base?: MergeEntry;\n theirs?: MergeEntry;\n}\n\nexport interface MergeStats {\n treesRead: number;\n entriesCompared: number;\n blobsMerged: number;\n wallMs: number;\n}\n\nexport interface MergeReport {\n ours: string;\n theirs: string;\n mergeBase?: string;\n clean: boolean;\n fastForward: boolean;\n alreadyMerged: boolean;\n changedPaths: number;\n conflicts: MergeConflict[];\n stats: MergeStats;\n commit?: string;\n fastForwarded: boolean;\n}\n\nexport interface MergeOptions {\n preflight?: boolean;\n deep?: boolean;\n materialize?: boolean;\n message?: string;\n base?: string;\n}\n\nexport interface ConflictTerm {\n mode: number;\n oid: string;\n}\n\nexport interface ConflictPath {\n path: string;\n kind: string;\n terms: Array<ConflictTerm | null>;\n}\n\nexport interface MergeConflictRecord {\n version: number;\n oursCommit: string;\n theirsCommit: string;\n baseCommit?: string;\n paths: ConflictPath[];\n truncatedPaths: number;\n}\n\nexport interface OperationRef {\n name: string;\n old?: string;\n new?: string;\n}\n\nexport interface Operation {\n opId: string;\n repo: string;\n network?: string;\n parentOpId?: string;\n actor: string;\n atSecs: number;\n kind: string;\n result: string;\n refs: OperationRef[];\n packIds: string[];\n oldPackIds: string[];\n relatedRepo?: string;\n status?: string;\n oldPackCount: number;\n objectCount: number;\n packBytes: number;\n}\n\nexport class RepositoryClient {\n private readonly native: NativeRepositoryClient;\n private readonly requestTimeoutMs: number;\n\n constructor(options?: RepositoryClientOptions) {\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n const binding = loadNativeSandboxBinding();\n if (typeof binding.NativeRepositoryClient !== \"function\") {\n throw new SandboxError(\n \"native binding does not export the repository client; rebuild with 'npm run build:native'\",\n );\n }\n this.native = new binding.NativeRepositoryClient(\n options?.apiUrl ?? defaults.API_URL,\n options?.apiKey ?? defaults.API_KEY ?? null,\n options?.organizationId ?? null,\n options?.projectId ?? null,\n null,\n this.requestTimeoutMs / 1000,\n );\n }\n\n static forCloud(options?: RepositoryClientOptions): RepositoryClient {\n return new RepositoryClient({\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n static async fromEnv(): Promise<RepositoryClient> {\n const context = buildContextFromEnv();\n if (!context.apiKey) {\n if (context.personalAccessToken) {\n throw new SandboxError(\n \"Repository SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new SandboxError(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n return new RepositoryClient({\n apiUrl: context.apiUrl,\n apiKey: context.apiKey,\n projectId: context.projectId ?? await projectIdFromApiKey(context.apiUrl, context.apiKey),\n });\n }\n\n close(): void {\n // The native client releases its connection pool on GC; nothing to do.\n }\n\n url(repo: string): string {\n return this.native.gitRepoUrl(repo);\n }\n\n async create(\n repo: string,\n options?: { defaultBranch?: string },\n ): Promise<Traced<RepositoryHandle>> {\n return this.tracedJson<RepositoryHandle>(() =>\n this.native.createRepo(repo, options?.defaultBranch ?? null),\n );\n }\n\n async list(): Promise<Traced<GitRepository[]>> {\n const { traceId, json } = await callNative(() => this.native.listRepos());\n const parsed = fromSnakeKeys(JSON.parse(json)) as { repos?: GitRepository[] };\n return Object.assign(parsed.repos ?? [], { traceId });\n }\n\n async delete(repo: string): Promise<void> {\n await callNative(() => this.native.deleteRepo(repo));\n }\n\n async fork(repo: string, baseRepo: string): Promise<Traced<RepositoryHandle>> {\n return this.tracedJson<RepositoryHandle>(() =>\n this.native.forkRepo(repo, baseRepo),\n );\n }\n\n async archive(repo: string): Promise<void> {\n await callNative(() => this.native.archiveRepo(repo));\n }\n\n async restore(repo: string): Promise<void> {\n await callNative(() => this.native.restoreRepo(repo));\n }\n\n async info(repo: string): Promise<Traced<RepositoryInfo>> {\n return this.tracedJson<RepositoryInfo>(() => this.native.repoInfo(repo));\n }\n\n async branches(repo: string): Promise<Traced<Branch[]>> {\n const { traceId, json } = await callNative(() => this.native.listBranches(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { branches?: Branch[] };\n return Object.assign(parsed.branches ?? [], { traceId });\n }\n\n async refs(repo: string): Promise<Traced<GitRef[]>> {\n const { traceId, json } = await callNative(() => this.native.listRefs(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { refs?: GitRef[] };\n return Object.assign(parsed.refs ?? [], { traceId });\n }\n\n async deleteBranch(repo: string, branch: string): Promise<void> {\n await callNative(() => this.native.deleteBranch(repo, branch));\n }\n\n async operations(repo: string): Promise<Traced<Operation[]>> {\n const { traceId, json } = await callNative(() => this.native.listOperations(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { operations?: Operation[] };\n return Object.assign(parsed.operations ?? [], { traceId });\n }\n\n async credential(repo?: string): Promise<GitCredential> {\n const json = await callNative(() => this.native.gitCredential(repo ?? null));\n return JSON.parse(json) as GitCredential;\n }\n\n async commitStatus(repo: string, jobId: string): Promise<Traced<CommitJobStatus>> {\n return this.tracedJson<CommitJobStatus>(() =>\n this.native.commitStatus(repo, jobId),\n );\n }\n\n async pushWorktree(\n repo: string,\n options?: PushWorktreeOptions,\n ): Promise<Traced<PushReport>> {\n return this.tracedJson<PushReport>(() =>\n this.native.pushWorktree(\n repo,\n options?.path ?? process.cwd(),\n options?.branch ?? \"main\",\n options?.message ?? \"Update repository\",\n options?.expectOid ?? null,\n ),\n );\n }\n\n async merge(\n repo: string,\n ours: string,\n theirs: string,\n options?: MergeOptions,\n ): Promise<Traced<MergeReport>> {\n return this.tracedJson<MergeReport>(() =>\n this.native.mergeRepo(\n repo,\n ours,\n theirs,\n options?.preflight ?? false,\n options?.deep ?? false,\n options?.materialize ?? false,\n options?.message ?? null,\n options?.base ?? null,\n ),\n );\n }\n\n async commitConflicts(\n repo: string,\n commit: string,\n ): Promise<Traced<MergeConflictRecord> | null> {\n const { traceId, json } = await callNative(() =>\n this.native.commitConflicts(repo, commit),\n );\n const parsed = JSON.parse(json) as unknown;\n if (parsed == null) {\n return null;\n }\n return Object.assign(fromSnakeKeys(parsed) as MergeConflictRecord, { traceId });\n }\n\n private async tracedJson<T extends object>(\n fn: () => Promise<{ traceId: string; json: string }>,\n ): Promise<Traced<T>> {\n const { traceId, json } = await callNative(fn);\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as T, { traceId });\n }\n}\n\nfunction resolveRequestTimeoutMs(\n options?: { requestTimeout?: number; timeoutMs?: number },\n): number {\n if (options?.requestTimeout != null) {\n return secondsToMillis(options.requestTimeout);\n }\n if (options?.timeoutMs != null) {\n validateTimeoutMs(options.timeoutMs);\n return options.timeoutMs;\n }\n return defaults.DEFAULT_HTTP_TIMEOUT_MS;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new SandboxError(\"requestTimeout must be a positive number of seconds\");\n }\n return Math.ceil(seconds * 1000);\n}\n\nfunction validateTimeoutMs(timeoutMs: number): void {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new SandboxError(\"timeoutMs must be a positive number of milliseconds\");\n }\n}\n\nasync function projectIdFromApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const client = new CloudClient({ apiUrl, apiKey });\n try {\n const projectId = extractProjectId(await client.introspectApiKey());\n if (!projectId) {\n throw new SandboxError(\"Repository API key did not include project context.\");\n }\n return projectId;\n } finally {\n client.close();\n }\n}\n\nfunction extractProjectId(value: unknown): string | undefined {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n const object = value as Record<string, unknown>;\n for (const key of [\"projectId\", \"project_id\"]) {\n const candidate = object[key];\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n\n const project = object.project;\n if (typeof project === \"string\" && project.length > 0) {\n return project;\n }\n if (project != null && typeof project === \"object\") {\n const projectObject = project as Record<string, unknown>;\n for (const key of [\"id\", \"projectId\", \"project_id\"]) {\n const candidate = projectObject[key];\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n }\n\n for (const key of [\"scope\", \"apiKey\", \"api_key\", \"key\"]) {\n const nested = extractProjectId(object[key]);\n if (nested) {\n return nested;\n }\n }\n\n const projects = object.projects;\n if (Array.isArray(projects) && projects.length === 1) {\n return extractProjectId(projects[0]);\n }\n\n return undefined;\n}\n","import { CloudClient } from \"./cloud-client.js\";\nimport type { FileSystem } from \"./cloud-models.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\n/**\n * Project-scoped file-system registry helpers (create, list, delete).\n *\n * Uses the same environment-based Tensorlake auth as `createSandboxImage`, and\n * requires `TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID` because the\n * file-system API is organization/project-scoped.\n *\n * To mount a registered file system into a sandbox, pass\n * `fileSystems` to `Sandbox.create()` (mount at boot) or call\n * `sandbox.attachFileSystem()` / `sandbox.detachFileSystem()` on a\n * running sandbox.\n */\n\nfunction requireCloudClient(): CloudClient {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Managing file systems requires organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n return new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n}\n\n/** Register a new file system for the current project. */\nexport async function createFileSystem(\n name: string,\n description?: string,\n): Promise<FileSystem> {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"name must be a non-empty string\");\n }\n const client = requireCloudClient();\n try {\n return await client.createFileSystem({ name, description });\n } finally {\n client.close();\n }\n}\n\n/** List all registered file systems for the current project. */\nexport async function listFileSystems(): Promise<FileSystem[]> {\n const client = requireCloudClient();\n try {\n return await client.listFileSystems();\n } finally {\n client.close();\n }\n}\n\n/** Delete a registered file system by its id (e.g. `file_system_...`). */\nexport async function deleteFileSystem(\n fileSystemId: string,\n): Promise<void> {\n if (typeof fileSystemId !== \"string\" || fileSystemId.length === 0) {\n throw new TypeError(\"fileSystemId must be a non-empty string\");\n }\n const client = requireCloudClient();\n try {\n await client.deleteFileSystem(fileSystemId);\n } finally {\n client.close();\n }\n}\n","/**\n * Client for Tensorlake filesystems.\n *\n * A filesystem is a durable, versioned file tree that lives in Tensorlake\n * Cloud. Every write produces a {@link Snapshot} (a durable version), files\n * can be read at any version, and a filesystem can be mounted to a local\n * path through the `tl` CLI's FUSE/FSKit daemon.\n *\n * Reads and writes are served by the shared Rust cloud-sdk core (the same\n * engine behind the `tl` CLI), so uploads get content-defined chunking,\n * dedup, transient retries, and idempotent commit reattachment for free.\n *\n * @example\n * const client = new FilesystemClient(); // env-based auth\n * const fs = await client.create(\"my-data\");\n * await fs.writeFile(\"docs/hello.txt\", \"hi\");\n * console.log(await fs.readText(\"docs/hello.txt\"));\n * const snapshot = await fs.snapshot(\"after first write\");\n *\n * const mount = await fs.mount(\"/mnt/my-data\"); // requires the `tl` CLI\n * // ... use it as a normal directory\n * await mount.unmount();\n */\n\nimport { execFile } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport * as defaults from \"./defaults.js\";\nimport {\n CliNotFoundError,\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n FilesystemError,\n FilesystemNotFoundError,\n MountError,\n fileEntryFromWire,\n mountStatusFromRaw,\n trimSlashes,\n type FileEntry,\n type FilesystemInfo,\n type FilesystemStatus,\n type MountStatus,\n type Snapshot,\n} from \"./filesystem-models.js\";\nimport {\n loadNativeSandboxBinding,\n type NativeRepositoryClient,\n} from \"./native-sandbox.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst FILESYSTEM_REPO_KIND = \"filesystem\";\n\nexport interface FilesystemClientOptions {\n apiKey?: string;\n apiUrl?: string;\n organizationId?: string;\n projectId?: string;\n /** @internal Test seam: bypass the native binding loader. */\n nativeClient?: NativeRepositoryClient;\n}\n\n/**\n * Translate a structured native error (`{category, status, message}` JSON in\n * the error message) into the filesystem error hierarchy. `notFound`, when\n * given, replaces the generic API error for 404s.\n */\nfunction translateNativeError(error: unknown, notFound?: FilesystemError): Error {\n const message = error instanceof Error ? error.message : String(error);\n let payload: { category?: unknown; status?: unknown; message?: unknown };\n try {\n payload = JSON.parse(message);\n } catch {\n return error instanceof Error ? error : new FilesystemError(message);\n }\n if (!payload || typeof payload.category !== \"string\") {\n return error instanceof Error ? error : new FilesystemError(message);\n }\n const detail =\n typeof payload.message === \"string\" ? payload.message : message;\n // Connection-level failures carry a fabricated gateway status in the napi\n // layer; surface them as plain FilesystemError (matching Python, where\n // they carry no status) instead of a fake server FilesystemAPIError.\n if (payload.category === \"connection\") {\n return new FilesystemError(detail);\n }\n if (payload.status === 404 && notFound !== undefined) {\n return notFound;\n }\n if (typeof payload.status === \"number\") {\n return new FilesystemAPIError(payload.status, detail);\n }\n return new FilesystemError(detail);\n}\n\nasync function callNative<T>(\n fn: () => Promise<T>,\n notFound?: FilesystemError,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw translateNativeError(error, notFound);\n }\n}\n\n/**\n * Runs `tl fs ...` commands for local mount operations.\n *\n * Mounting a filesystem to a local path is served by a FUSE (Linux) / FSKit\n * (macOS) daemon that ships only inside the Tensorlake CLI, so the SDK drives\n * mounts by invoking `tl fs mount/unmount/snapshot/status`. Everything else\n * goes through the Rust core and does not need the CLI.\n */\nclass FsCli {\n private binary: string | null = null;\n private readonly envOverrides: Record<string, string>;\n\n constructor(envOverrides: Record<string, string>) {\n this.envOverrides = envOverrides;\n }\n\n private async findCli(): Promise<string> {\n const candidates: string[] = [];\n if (process.env.TENSORLAKE_CLI) {\n candidates.push(process.env.TENSORLAKE_CLI);\n }\n candidates.push(\"tl\");\n const installed = join(homedir(), \".tensorlake\", \"bin\", \"tl\");\n try {\n // Existence, not executability: a present-but-broken install should be\n // probed and blamed as \"upgrade required\" (parity with Python), not\n // reported as missing.\n accessSync(installed, constants.F_OK);\n candidates.push(installed);\n } catch {\n // not installed at the default path\n }\n // A candidate that exists but fails the probe means \"upgrade tl\"; a\n // candidate that does not exist must not be blamed as outdated. The\n // Python SDK mirrors these exact semantics.\n let unsupported: string | null = null;\n for (const candidate of candidates) {\n try {\n await execFileAsync(candidate, [\"fs\", \"--help\"], { timeout: 15_000 });\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n unsupported = candidate;\n }\n }\n }\n throw new CliNotFoundError(\n unsupported\n ? `\\`tl\\` at ${unsupported} does not support \\`tl fs\\` (upgrade required)`\n : \"`tl` was not found on PATH\",\n );\n }\n\n private async run(args: string[], timeoutMs = 300_000): Promise<string> {\n if (this.binary === null) {\n this.binary = await this.findCli();\n }\n try {\n const { stdout } = await execFileAsync(this.binary, [\"fs\", ...args], {\n timeout: timeoutMs,\n env: { ...process.env, ...this.envOverrides },\n maxBuffer: 16 * 1024 * 1024,\n });\n return stdout;\n } catch (error) {\n const failure = error as { stderr?: string; stdout?: string; killed?: boolean };\n if (failure.killed) {\n throw new MountError(`\\`tl fs ${args[0]}\\` timed out after ${timeoutMs}ms`);\n }\n const detail = (failure.stderr || failure.stdout || String(error)).trim();\n throw new MountError(`\\`tl fs ${args.join(\" \")}\\` failed: ${detail}`);\n }\n }\n\n // Flags always precede a `--` end-of-options separator so caller-supplied\n // names/paths can never be parsed as CLI flags (e.g. a path literally\n // named \"--discard\" must stay a path, not become the destructive flag).\n async mount(filesystem: string, localPath: string, readonly: boolean): Promise<void> {\n const args = [\"mount\"];\n if (readonly) args.push(\"--ro\");\n args.push(\"--\", filesystem, localPath);\n await this.run(args);\n }\n\n async unmount(localPath: string, discard: boolean): Promise<void> {\n const args = [\"unmount\"];\n if (discard) args.push(\"--discard\");\n args.push(\"--\", localPath);\n await this.run(args);\n }\n\n async snapshot(localPath: string, message?: string): Promise<void> {\n const args = [\"snapshot\"];\n // Attached form: a detached value (\"-m\", \"-msg\") is rejected by the CLI\n // parser when the message starts with '-'.\n if (message) args.push(`--message=${message}`);\n args.push(\"--\", localPath);\n await this.run(args);\n }\n\n async status(localPath?: string): Promise<Record<string, unknown>> {\n const args = [\"status\", \"--json\"];\n if (localPath) args.push(\"--\", localPath);\n const output = await this.run(args, 60_000);\n try {\n const payload = JSON.parse(output);\n return typeof payload === \"object\" && payload !== null\n ? (payload as Record<string, unknown>)\n : { status: payload };\n } catch {\n throw new MountError(\n `\\`tl fs status --json\\` returned invalid JSON: ${output.slice(0, 200)}`,\n );\n }\n }\n}\n\n/** Manages the filesystems of one Tensorlake project. */\nexport class FilesystemClient {\n private readonly native: NativeRepositoryClient;\n private readonly cli: FsCli;\n\n /**\n * Any option left unset is resolved from the environment\n * (`TENSORLAKE_API_KEY` / `TENSORLAKE_PAT`, `TENSORLAKE_API_URL`,\n * `TENSORLAKE_ORGANIZATION_ID`, `TENSORLAKE_PROJECT_ID`).\n */\n constructor(options: FilesystemClientOptions = {}) {\n const context = buildContextFromEnv();\n const token =\n options.apiKey ?? context.apiKey ?? context.personalAccessToken;\n if (!token) {\n throw new FilesystemError(\n \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\",\n );\n }\n const organizationId = options.organizationId ?? context.organizationId;\n const projectId = options.projectId ?? context.projectId;\n if (!organizationId || !projectId) {\n throw new FilesystemError(\n \"Filesystem operations require organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n if (options.nativeClient) {\n this.native = options.nativeClient;\n } else {\n const binding = loadNativeSandboxBinding();\n if (typeof binding.NativeRepositoryClient !== \"function\") {\n throw new FilesystemError(\n \"native binding does not export the repository client; rebuild with 'npm run build:native'\",\n );\n }\n this.native = new binding.NativeRepositoryClient(\n options.apiUrl ?? context.apiUrl,\n token,\n organizationId,\n projectId,\n `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n null,\n );\n }\n const envOverrides: Record<string, string> = {\n TENSORLAKE_ORGANIZATION_ID: organizationId,\n TENSORLAKE_PROJECT_ID: projectId,\n // The CLI must target the same deployment the data plane does, or a\n // mount could resolve a same-named filesystem in the wrong environment.\n TENSORLAKE_API_URL: options.apiUrl ?? context.apiUrl,\n };\n if (options.apiKey) {\n envOverrides.TENSORLAKE_API_KEY = options.apiKey;\n }\n this.cli = new FsCli(envOverrides);\n }\n\n // -- lifecycle --------------------------------------------------------------\n\n /** Create a new filesystem and return a handle to it. */\n async create(name: string): Promise<Filesystem> {\n if (typeof name !== \"string\") {\n throw new TypeError(\"name must be a string\");\n }\n if (name.length === 0) {\n throw new FilesystemError(\"filesystem name must not be empty\");\n }\n const raw = await callNative(() => this.native.createFilesystem(name));\n // The binding reports the effective default branch; it differs from\n // \"main\" only when a lost-response retry adopted a pre-existing\n // filesystem.\n const created = JSON.parse(raw) as { default_branch?: string };\n return new Filesystem(\n this,\n this.native,\n this.cli,\n name,\n created.default_branch || \"main\",\n );\n }\n\n /** Return a handle to an existing filesystem (verifies it exists). */\n async get(name: string): Promise<Filesystem> {\n const traced = await callNative(\n () => this.native.filesystemMeta(name),\n new FilesystemNotFoundError(name),\n );\n const meta = JSON.parse(traced.json) as {\n kind?: string;\n default_branch?: string;\n };\n if ((meta.kind ?? FILESYSTEM_REPO_KIND) !== FILESYSTEM_REPO_KIND) {\n throw new FilesystemNotFoundError(name);\n }\n return new Filesystem(\n this,\n this.native,\n this.cli,\n name,\n meta.default_branch || \"main\",\n );\n }\n\n /** List all filesystems in the project. */\n async list(): Promise<FilesystemInfo[]> {\n const traced = await callNative(() => this.native.listFilesystems());\n const page = JSON.parse(traced.json) as {\n repos?: Array<Record<string, unknown>>;\n };\n return (page.repos ?? []).map((repo) => ({\n name: String(repo.name ?? \"\"),\n fullName: String(repo.full_name ?? \"\"),\n defaultBranch: String(repo.default_branch ?? \"main\"),\n status: String(repo.status ?? \"\"),\n kind: String(repo.kind ?? FILESYSTEM_REPO_KIND),\n }));\n }\n\n /** Permanently delete a filesystem and all its snapshots. */\n async delete(name: string): Promise<void> {\n await callNative(\n () => this.native.deleteFilesystem(name),\n new FilesystemNotFoundError(name),\n );\n }\n\n // -- local mounts -------------------------------------------------------------\n\n /** Mount a filesystem to a local path (requires the `tl` CLI). */\n async mount(\n name: string,\n localPath: string,\n readonly = false,\n ): Promise<FilesystemMount> {\n await this.cli.mount(name, localPath, readonly);\n return new FilesystemMount(this, this.cli, name, localPath, readonly);\n }\n\n /**\n * Unmount a locally mounted filesystem.\n *\n * `discard: true` drops local changes that were not yet uploaded.\n */\n async unmount(localPath: string, discard = false): Promise<void> {\n await this.cli.unmount(localPath, discard);\n }\n\n /** Status of a local mount (defaults to the mount containing CWD). */\n async mountStatus(localPath?: string): Promise<MountStatus> {\n return mountStatusFromRaw(await this.cli.status(localPath), localPath);\n }\n}\n\ntype FileData = Uint8Array | string;\n\nfunction toBuffer(data: FileData): Buffer {\n return typeof data === \"string\" ? Buffer.from(data, \"utf-8\") : Buffer.from(data);\n}\n\n/** Handle to one filesystem; reads/writes go through the Rust core. */\nexport class Filesystem {\n private readonly client: FilesystemClient;\n private readonly native: NativeRepositoryClient;\n private readonly cli: FsCli;\n readonly name: string;\n private defaultBranch: string | null;\n\n /** @internal — obtain instances via `FilesystemClient.create()` / `.get()`. */\n constructor(\n client: FilesystemClient,\n native: NativeRepositoryClient,\n cli: FsCli,\n name: string,\n defaultBranch: string | null = null,\n ) {\n this.client = client;\n this.native = native;\n this.cli = cli;\n this.name = name;\n this.defaultBranch = defaultBranch;\n }\n\n /**\n * The filesystem's default branch — the target of every write and the\n * default version of every read, so writes and `status()` can never\n * silently disagree on a non-\"main\" filesystem.\n */\n private async branch(): Promise<string> {\n if (!this.defaultBranch) {\n const traced = await callNative(\n () => this.native.filesystemMeta(this.name),\n new FilesystemNotFoundError(this.name),\n );\n const meta = JSON.parse(traced.json) as { default_branch?: string };\n this.defaultBranch = meta.default_branch || \"main\";\n }\n return this.defaultBranch;\n }\n\n // -- writes -------------------------------------------------------------------\n\n /** Write one file. Returns the snapshot (version) the write produced. */\n async writeFile(\n path: string,\n data: FileData,\n message?: string,\n ): Promise<Snapshot> {\n return await this.writeFiles(new Map([[path, data]]), message);\n }\n\n /** Write several files (and/or delete paths) in one atomic snapshot. */\n async writeFiles(\n files: Map<string, FileData> | Record<string, FileData>,\n message?: string,\n deletes: string[] = [],\n ): Promise<Snapshot> {\n const entries =\n files instanceof Map ? [...files.entries()] : Object.entries(files);\n if (entries.length === 0 && deletes.length === 0) {\n throw new FilesystemError(\"nothing to write: no files or deletions given\");\n }\n const writes = entries.map(([path, data]) => ({\n path,\n content: toBuffer(data),\n }));\n // Truthiness, not nullish: an explicit \"\" gets the default too (parity\n // with the Python SDK).\n const resolvedMessage = message || `write ${writes.length} file(s) via SDK`;\n const branch = await this.branch();\n const traced = await callNative(\n () =>\n this.native.pushFilesystemFiles(\n this.name,\n writes,\n deletes,\n resolvedMessage,\n branch,\n // One key per logical write: a retried submit reattaches to the\n // same durable commit job instead of double-committing.\n randomBytes(16).toString(\"hex\"),\n ),\n new FilesystemNotFoundError(this.name),\n );\n const report = JSON.parse(traced.json) as Record<string, unknown>;\n return {\n commit: String(report.commit ?? \"\"),\n tree: String(report.tree ?? \"\"),\n refName: String(report.ref_name ?? \"\"),\n parent: null,\n created: report.created === undefined ? true : Boolean(report.created),\n message: resolvedMessage,\n };\n }\n\n /** Delete one file. Returns the snapshot the deletion produced. */\n async deleteFile(path: string, message?: string): Promise<Snapshot> {\n return await this.writeFiles(\n new Map(),\n message || `delete ${path} via SDK`,\n [path],\n );\n }\n\n /**\n * Return the filesystem's current version as a snapshot.\n *\n * Writes already create snapshots implicitly; this pins the current head\n * without changing any content.\n */\n async snapshot(message = \"\"): Promise<Snapshot> {\n const status = await this.status();\n if (!status.headCommit) {\n throw new FilesystemError(\n `filesystem ${this.name} is empty: write files first`,\n );\n }\n return {\n commit: status.headCommit,\n tree: \"\",\n refName: `refs/heads/${status.defaultBranch}`,\n parent: null,\n created: false,\n message,\n };\n }\n\n // -- reads --------------------------------------------------------------------\n\n /**\n * Read a file's bytes at `version` (branch, ref, or snapshot commit;\n * defaults to the filesystem's default branch).\n */\n async readFile(path: string, version?: string): Promise<Uint8Array> {\n if (trimSlashes(path) === \"\") {\n throw new FilesystemError(\"file path must not be empty\");\n }\n const resolvedVersion = version || (await this.branch());\n const traced = await callNative(\n () => this.native.readFilesystemFile(this.name, path, resolvedVersion),\n new FileNotFoundInFilesystemError(this.name, path),\n );\n return new Uint8Array(traced.data);\n }\n\n /** Read a file as UTF-8 text at `version`. Throws on non-UTF-8 content. */\n async readText(path: string, version?: string): Promise<string> {\n // fatal: parity with Python's strict bytes.decode(\"utf-8\") — corrupt\n // data must raise, never silently decode to replacement characters.\n // ignoreBOM keeps a leading U+FEFF, exactly as Python does.\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(\n await this.readFile(path, version),\n );\n }\n\n /** List one directory (non-recursive) at `version`. */\n async listFiles(dirPath = \"\", version?: string): Promise<FileEntry[]> {\n const resolvedVersion = version || (await this.branch());\n const traced = await callNative(\n () => this.native.listFilesystemTree(this.name, dirPath, resolvedVersion),\n new FileNotFoundInFilesystemError(this.name, dirPath || \"/\"),\n );\n const page = JSON.parse(traced.json) as {\n entries?: Array<{ name: string; oid?: string; mode?: number; size?: number | null }>;\n };\n return (page.entries ?? []).map((entry) => fileEntryFromWire(entry, dirPath));\n }\n\n // -- status -------------------------------------------------------------------\n\n /** Remote status: identity plus the current head snapshot. */\n async status(): Promise<FilesystemStatus> {\n const metaTraced = await callNative(\n () => this.native.filesystemMeta(this.name),\n new FilesystemNotFoundError(this.name),\n );\n const meta = JSON.parse(metaTraced.json) as Record<string, unknown>;\n const defaultBranch = String(meta.default_branch || \"main\");\n this.defaultBranch = defaultBranch;\n let headCommit: string | null = null;\n let generation: number | null = null;\n try {\n // A 404 here means \"no such ref yet\" (an empty filesystem), so it is\n // deliberately NOT mapped to FilesystemNotFoundError.\n const refTraced = await callNative(() =>\n this.native.filesystemRefStatus(this.name, defaultBranch),\n );\n const ref = JSON.parse(refTraced.json) as Record<string, unknown>;\n headCommit =\n (ref.resolved_commit as string) || (ref.oid as string) || null;\n generation = typeof ref.generation === \"number\" ? ref.generation : null;\n } catch (error) {\n // Only \"no such ref yet\" means an empty filesystem; anything else\n // (auth, 5xx) must not masquerade as one.\n if (!(error instanceof FilesystemAPIError) || error.statusCode !== 404) {\n throw error;\n }\n }\n return {\n name: this.name,\n status: String(meta.status ?? \"\"),\n defaultBranch,\n headCommit,\n generation,\n };\n }\n\n // -- mounts -------------------------------------------------------------------\n\n /** Mount this filesystem to a local path (requires the `tl` CLI). */\n async mount(localPath: string, readonly = false): Promise<FilesystemMount> {\n return await this.client.mount(this.name, localPath, readonly);\n }\n}\n\n/** A filesystem mounted to a local path via the `tl` CLI daemon. */\nexport class FilesystemMount {\n private readonly client: FilesystemClient;\n private readonly cli: FsCli;\n readonly filesystem: string;\n readonly path: string;\n readonly readonly: boolean;\n\n /** @internal — obtain instances via `FilesystemClient.mount()`. */\n constructor(\n client: FilesystemClient,\n cli: FsCli,\n filesystem: string,\n path: string,\n readonly: boolean,\n ) {\n this.client = client;\n this.cli = cli;\n this.filesystem = filesystem;\n this.path = path;\n this.readonly = readonly;\n }\n\n /** Flush pending local changes into a durable snapshot. */\n async snapshot(message?: string): Promise<void> {\n await this.cli.snapshot(this.path, message);\n }\n\n /** Local mount status as reported by the mount daemon. */\n async status(): Promise<MountStatus> {\n return await this.client.mountStatus(this.path);\n }\n\n /** Unmount; `discard: true` drops changes not yet uploaded. */\n async unmount(discard = false): Promise<void> {\n await this.client.unmount(this.path, discard);\n }\n}\n","/** Models and errors for the filesystem SDK. */\n\n/** Git tree mode for a directory entry. */\nconst GIT_MODE_DIR = 0o40000;\nconst GIT_MODE_SYMLINK = 0o120000;\n\n/**\n * Strip leading/trailing '/' in linear time (the regex equivalent\n * `/^\\/+|\\/+$/g` backtracks polynomially on adversarial many-slash input).\n */\nexport function trimSlashes(path: string): string {\n let start = 0;\n let end = path.length;\n while (start < end && path.charCodeAt(start) === 0x2f) start += 1;\n while (end > start && path.charCodeAt(end - 1) === 0x2f) end -= 1;\n return path.slice(start, end);\n}\n\n/** One filesystem as returned by listing/point-read endpoints. */\nexport interface FilesystemInfo {\n name: string;\n fullName: string;\n defaultBranch: string;\n status: string;\n kind: string;\n}\n\n/** Remote status of a filesystem: identity plus current head. */\nexport interface FilesystemStatus {\n name: string;\n status: string;\n defaultBranch: string;\n /**\n * Commit hash the default branch currently points at; null for an empty\n * filesystem that has never been written to.\n */\n headCommit: string | null;\n /** Server-side movement counter for the default branch, when reported. */\n generation: number | null;\n}\n\n/** One directory entry from a filesystem listing. */\nexport interface FileEntry {\n name: string;\n /** Path of the entry relative to the filesystem root. */\n path: string;\n /** Git blob/tree object id. */\n oid: string;\n /** Raw git mode (0o100644 file, 0o100755 executable, 0o120000 symlink, 0o40000 dir). */\n mode: number;\n /** Blob size in bytes when cheaply known server-side. */\n size: number | null;\n isDir: boolean;\n isSymlink: boolean;\n}\n\nexport function fileEntryFromWire(\n entry: { name: string; oid?: string; mode?: number; size?: number | null },\n dirPath: string,\n): FileEntry {\n const mode = entry.mode ?? 0o100644;\n const prefix = trimSlashes(dirPath);\n return {\n name: entry.name,\n path: prefix ? `${prefix}/${entry.name}` : entry.name,\n oid: entry.oid ?? \"\",\n mode,\n size: entry.size ?? null,\n isDir: mode === GIT_MODE_DIR,\n isSymlink: mode === GIT_MODE_SYMLINK,\n };\n}\n\n/** A durable version of the filesystem (a commit). */\nexport interface Snapshot {\n /** Commit hash — pass as `version` to read the filesystem at this point. */\n commit: string;\n tree: string;\n refName: string;\n parent: string | null;\n /** False when the write was a no-op (content identical to the parent). */\n created: boolean;\n message: string;\n}\n\n/**\n * Status of a local mount as reported by `tl fs status --json`.\n *\n * The mount daemon's JSON is versioned independently of this SDK, so only\n * stable fields are typed; the full payload is preserved in `raw`.\n */\nexport interface MountStatus {\n /** Local mount path. */\n path: string;\n /** Filesystem name this mount serves, when reported. */\n filesystem: string | null;\n /** Whether the daemon reports the mount as healthy/active. */\n mounted: boolean;\n /** Complete parsed JSON payload from the CLI. */\n raw: Record<string, unknown>;\n}\n\n/**\n * Map one `tl fs status --json` payload to a MountStatus.\n *\n * Semantics deliberately mirror the Python SDK: `mounted` honors key\n * presence (an explicit null means \"not mounted\"), and path/filesystem\n * fall through empty strings, not just null/undefined.\n */\nexport function mountStatusFromRaw(\n raw: Record<string, unknown>,\n localPath?: string,\n): MountStatus {\n const mounted =\n \"mounted\" in raw\n ? Boolean(raw.mounted)\n : \"active\" in raw\n ? Boolean(raw.active)\n : true;\n const path = String(raw.path || raw.mount_path || localPath || \"\");\n const filesystem = (raw.filesystem || raw.file_system || null) as\n | string\n | null;\n return { path, filesystem, mounted, raw };\n}\n\nexport class FilesystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemError\";\n }\n}\n\nexport class FilesystemNotFoundError extends FilesystemError {\n readonly filesystemName: string;\n constructor(name: string) {\n super(`Filesystem not found: ${name}`);\n this.name = \"FilesystemNotFoundError\";\n this.filesystemName = name;\n }\n}\n\nexport class FileNotFoundInFilesystemError extends FilesystemError {\n readonly filesystem: string;\n readonly path: string;\n constructor(filesystem: string, path: string) {\n super(`File not found in filesystem ${filesystem}: ${path}`);\n this.name = \"FileNotFoundInFilesystemError\";\n this.filesystem = filesystem;\n this.path = path;\n }\n}\n\nexport class FilesystemAPIError extends FilesystemError {\n readonly statusCode: number;\n constructor(statusCode: number, message: string) {\n super(`API error (status ${statusCode}): ${message}`);\n this.name = \"FilesystemAPIError\";\n this.statusCode = statusCode;\n }\n}\n\nexport class MountError extends FilesystemError {\n constructor(message: string) {\n super(message);\n this.name = \"MountError\";\n }\n}\n\nexport class CliNotFoundError extends MountError {\n constructor(detail: string) {\n super(\n \"Mount operations require the Tensorlake CLI (`tl`) with `tl fs` \" +\n `support: ${detail}. Install or upgrade it with: ` +\n \"curl -fsSL https://tensorlake.ai/install.sh | sh\",\n );\n this.name = \"CliNotFoundError\";\n }\n}\n"],"mappings":"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AA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,MACrD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACrD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;A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","names":["SandboxStatus","SnapshotStatus","ProcessStatus","StdinMode","OutputMode","ContainerState","WebSocket","buttonMask","validatePort","secondsToMillis","import_ws","WebSocket","SandboxClient","process","path","secondsToMillis","sleep","path","sleep","undiciFetch","value","trimTrailingSlashes","path","createSandboxImage","resolveRequire","import_meta","path","os","DEFAULT_IMAGE_NAME","import_node_module","resolveRequestTimeoutMs","secondsToMillis","validateTimeoutMs","import_node_crypto","import_node_fs","import_node_os","import_node_path","import_node_util","path","translateNativeError","callNative","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/defaults.ts","../src/errors.ts","../src/native-sandbox.ts","../src/models.ts","../src/tunnel.ts","../src/desktop.ts","../src/sdk-timings.ts","../src/url.ts","../src/sandbox.ts","../src/client.ts","../src/http.ts","../src/sse.ts","../src/cloud-client.ts","../src/image.ts","../src/sandbox-image.ts","../src/index.ts","../src/api-client.ts","../src/repositories.ts","../src/file-system.ts","../src/filesystem.ts","../src/filesystem-models.ts"],"sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION: string = __SDK_VERSION__;\n\nexport const API_URL =\n process.env.TENSORLAKE_API_URL ?? \"https://api.tensorlake.ai\";\nexport const API_KEY = process.env.TENSORLAKE_API_KEY ?? undefined;\nexport const NAMESPACE = process.env.INDEXIFY_NAMESPACE ?? \"default\";\nexport const SANDBOX_PROXY_URL =\n process.env.TENSORLAKE_SANDBOX_PROXY_URL ?? \"https://sandbox.tensorlake.ai\";\n\nexport const DEFAULT_HTTP_TIMEOUT_MS = 300_000;\nexport const MAX_RETRIES = 3;\nexport const RETRY_BACKOFF_MS = 500;\nexport const RETRYABLE_STATUS_CODES = new Set([429, 502, 503, 504]);\n","/** Base exception for all sandbox-related errors. */\nexport class SandboxException extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SandboxException\";\n }\n}\n\n/** General sandbox operation error. */\nexport class SandboxError extends SandboxException {\n constructor(message: string) {\n super(message);\n this.name = \"SandboxError\";\n }\n}\n\n/**\n * Raised when the client cannot complete a request against the API server.\n *\n * The original transport error (typically undici's `TypeError: fetch failed`,\n * whose real reason — `ECONNREFUSED`, `UND_ERR_CONNECT_TIMEOUT`, `EMFILE`, … —\n * lives in `.cause`) is preserved on this error's {@link cause} for programmatic\n * inspection, and its full chain is folded into the message so it survives\n * wrappers that only forward `error.message`. No interpretation of the failure\n * (client vs server) is applied — the raw inner error is surfaced as-is so the\n * reader can judge.\n */\nexport class SandboxConnectionError extends SandboxError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(`Connection error: ${message}`);\n this.name = \"SandboxConnectionError\";\n if (options?.cause !== undefined) this.cause = options.cause;\n }\n}\n\n/**\n * Flatten an error and its `cause` chain into a single readable line, appending\n * each level's `code` when it is not already present in the message. undici\n * reports `fetch failed` at the top and the real reason one or more levels down\n * in `.cause`, so this surfaces the part that actually identifies the failure.\n *\n * @example \"fetch failed: connect ECONNREFUSED 10.0.0.1:443\"\n * @example \"fetch failed: Connect Timeout Error (UND_ERR_CONNECT_TIMEOUT)\"\n */\nexport function describeError(err: unknown): string {\n const parts: string[] = [];\n const seen = new Set<unknown>();\n let current: unknown = err;\n\n for (let depth = 0; depth < 6; depth++) {\n if (current == null || typeof current !== \"object\" || seen.has(current)) {\n break;\n }\n seen.add(current);\n const e = current as { message?: unknown; code?: unknown; cause?: unknown };\n const message = typeof e.message === \"string\" ? e.message.trim() : \"\";\n const code = typeof e.code === \"string\" ? e.code : undefined;\n\n let segment = message;\n if (code && (!message || !message.includes(code))) {\n segment = segment ? `${segment} (${code})` : code;\n }\n if (segment && !parts.includes(segment)) parts.push(segment);\n\n current = e.cause;\n }\n\n if (parts.length > 0) return parts.join(\": \");\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Raised when a sandbox is not found. */\nexport class SandboxNotFoundError extends SandboxError {\n readonly sandboxId: string;\n\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`);\n this.name = \"SandboxNotFoundError\";\n this.sandboxId = sandboxId;\n }\n}\n\n/** Raised when a sandbox pool is not found. */\nexport class PoolNotFoundError extends SandboxError {\n readonly poolId: string;\n\n constructor(poolId: string) {\n super(`Sandbox pool not found: ${poolId}`);\n this.name = \"PoolNotFoundError\";\n this.poolId = poolId;\n }\n}\n\n/** Raised when attempting to delete a pool that is in use. */\nexport class PoolInUseError extends SandboxError {\n readonly poolId: string;\n\n constructor(poolId: string, message?: string) {\n const base = `Cannot delete pool ${poolId}: pool is in use`;\n super(message ? `${base} - ${message}` : base);\n this.name = \"PoolInUseError\";\n this.poolId = poolId;\n }\n}\n\n/** Raised when the remote API returns an error. */\nexport class RemoteAPIError extends SandboxError {\n readonly statusCode: number;\n readonly responseMessage: string;\n\n constructor(statusCode: number, message: string) {\n super(`API error (status ${statusCode}): ${message}`);\n this.name = \"RemoteAPIError\";\n this.statusCode = statusCode;\n this.responseMessage = message;\n }\n}\n\n/** Raised when request output is fetched before the request has completed. */\nexport class RequestNotFinishedError extends Error {\n constructor() {\n super(\"Request has not finished yet\");\n this.name = \"RequestNotFinishedError\";\n }\n}\n\n/** Raised when a request completed unsuccessfully. */\nexport class RequestFailedError extends Error {\n readonly failure: string;\n\n constructor(failure: string) {\n super(`Request failed: ${failure}`);\n this.name = \"RequestFailedError\";\n this.failure = failure;\n }\n}\n\n/** Raised when a request surfaced an application-level error. */\nexport class RequestExecutionError extends Error {\n readonly functionName?: string;\n\n constructor(message: string, functionName?: string) {\n super(\n functionName ? `Request error in ${functionName}: ${message}` : message,\n );\n this.name = \"RequestExecutionError\";\n this.functionName = functionName;\n }\n}\n","import { createRequire } from \"node:module\";\nimport {\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxError,\n SandboxNotFoundError,\n} from \"./errors.js\";\n\n/**\n * Bridge to the Rust core's sandbox lifecycle + proxy clients (`napi-rs`).\n *\n * The proxy data path (process/file/stream ops) is served by the Rust core so\n * it shares `reqwest`'s connection pool — replacing the previous undici path,\n * which multiplexed every parallel request onto a single, untuned HTTP/2\n * connection. The native binding is required: there is no JS fallback.\n *\n * Convention (mirrors the Python binding): structured payloads cross as JSON\n * strings, bytes as `Buffer`, and every call surfaces the W3C `traceId`.\n * Errors arrive as a JSON `{category, status, message}` string in the native\n * error message; {@link translateNativeError} rethrows them as the SDK's typed\n * errors.\n */\n\n// ---- Native value shapes --------------------------------------------------\n\nexport interface TracedJson {\n traceId: string;\n json: string;\n}\n\nexport interface TracedBytes {\n traceId: string;\n data: Buffer;\n contentId?: string;\n fullSize?: number;\n}\n\nexport interface TracedEvents {\n traceId: string;\n events: string[];\n}\n\n/** Per-event callback used by the streaming proxy methods. */\nexport type NativeEmit = (eventJson: string) => void;\n\nexport interface NativeSandboxProxyClient {\n baseUrl(): string;\n\n startProcess(payloadJson: string): Promise<TracedJson>;\n listProcesses(): Promise<TracedJson>;\n // `process` is the pid-or-name path segment (the TS layer stringifies the number|string arg).\n getProcess(process: string): Promise<TracedJson>;\n killProcess(process: string): Promise<string>;\n restartProcess(process: string): Promise<TracedJson>;\n sendSignal(process: string, signal: number): Promise<TracedJson>;\n writeStdin(process: string, data: Buffer): Promise<string>;\n closeStdin(process: string): Promise<string>;\n getStdout(process: string): Promise<TracedJson>;\n getStderr(process: string): Promise<TracedJson>;\n getOutput(process: string): Promise<TracedJson>;\n\n followStdout(process: string, emit: NativeEmit): Promise<string>;\n followStderr(process: string, emit: NativeEmit): Promise<string>;\n followOutput(process: string, emit: NativeEmit): Promise<string>;\n runProcess(payloadJson: string): Promise<TracedEvents>;\n runProcessStreaming(payloadJson: string, emit: NativeEmit): Promise<string>;\n\n readFile(path: string): Promise<TracedBytes>;\n writeFile(path: string, content: Buffer): Promise<string>;\n uploadFile(path: string, localPath: string): Promise<string>;\n deleteFile(path: string): Promise<string>;\n listDirectory(path: string): Promise<TracedJson>;\n\n createPtySession(payloadJson: string): Promise<TracedJson>;\n deletePtySession(sessionId: string): Promise<string>;\n health(): Promise<TracedJson>;\n info(): Promise<TracedJson>;\n}\n\nexport interface NativeSandboxClient {\n createSandbox(requestJson: string): Promise<TracedJson>;\n claimSandbox(poolId: string): Promise<TracedJson>;\n copySandbox(sandboxId: string, times: number): Promise<TracedJson>;\n getSandbox(sandboxId: string): Promise<TracedJson>;\n listSandboxes(): Promise<TracedJson>;\n listArchivedSandboxes(\n limit?: number | null,\n cursor?: string | null,\n direction?: string | null,\n ): Promise<TracedJson>;\n getArchivedSandbox(sandboxId: string): Promise<TracedJson>;\n getSandboxLogs(requestJson: string): Promise<TracedJson>;\n listSandboxLogProcesses(sandboxId: string): Promise<TracedJson>;\n updateSandbox(sandboxId: string, requestJson: string): Promise<TracedJson>;\n deleteSandbox(sandboxId: string): Promise<string>;\n suspendSandbox(sandboxId: string): Promise<string>;\n resumeSandbox(sandboxId: string): Promise<string>;\n attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n ): Promise<TracedJson>;\n detachFileSystem(\n sandboxId: string,\n mountPath: string,\n ): Promise<TracedJson>;\n createSnapshot(\n sandboxId: string,\n snapshotType?: string | null,\n ): Promise<TracedJson>;\n getSnapshot(snapshotId: string): Promise<TracedJson>;\n listSnapshots(): Promise<TracedJson>;\n deleteSnapshot(snapshotId: string): Promise<string>;\n createPool(requestJson: string): Promise<TracedJson>;\n getPool(poolId: string): Promise<TracedJson>;\n listPools(): Promise<TracedJson>;\n updatePool(poolId: string, requestJson: string): Promise<TracedJson>;\n deletePool(poolId: string): Promise<string>;\n\n connectProxy(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxProxyClient;\n selectSandboxProxyUrl(\n sandboxId: string,\n sandboxUrl?: string | null,\n ingressEndpoint?: string | null,\n explicitProxyUrl?: string | null,\n ): string;\n}\n\nexport interface NativeRepositoryClient {\n gitRepoUrl(repo: string): string;\n createRepo(repo: string, defaultBranch?: string | null): Promise<TracedJson>;\n listRepos(): Promise<TracedJson>;\n deleteRepo(repo: string): Promise<string>;\n forkRepo(repo: string, baseRepo: string): Promise<TracedJson>;\n archiveRepo(repo: string): Promise<string>;\n restoreRepo(repo: string): Promise<string>;\n repoInfo(repo: string): Promise<TracedJson>;\n listBranches(repo: string): Promise<TracedJson>;\n listRefs(repo: string): Promise<TracedJson>;\n deleteBranch(repo: string, branch: string): Promise<string>;\n listOperations(repo: string): Promise<TracedJson>;\n gitCredential(repo?: string | null): Promise<string>;\n commitStatus(repo: string, jobId: string): Promise<TracedJson>;\n pushWorktree(\n repo: string,\n root: string,\n branch: string,\n message: string,\n expectOid?: string | null,\n ): Promise<TracedJson>;\n mergeRepo(\n repo: string,\n ours: string,\n theirs: string,\n preflight: boolean,\n deep: boolean,\n materialize: boolean,\n message?: string | null,\n base?: string | null,\n ): Promise<TracedJson>;\n commitConflicts(repo: string, commit: string): Promise<TracedJson>;\n createFilesystem(name: string): Promise<string>;\n forkFilesystem(\n name: string,\n base: string,\n snapshot?: string | null,\n ): Promise<TracedJson>;\n listFilesystems(): Promise<TracedJson>;\n filesystemMeta(name: string): Promise<TracedJson>;\n deleteFilesystem(name: string): Promise<string>;\n filesystemRefStatus(name: string, refspec: string): Promise<TracedJson>;\n retainFilesystemSnapshot(\n name: string,\n message: string,\n requestId: string,\n ): Promise<TracedJson>;\n listFilesystemSnapshots(name: string): Promise<TracedJson>;\n deleteFilesystemSnapshot(name: string, snapshot: string): Promise<string>;\n readFilesystemFile(\n name: string,\n path: string,\n version: string,\n offset?: number,\n length?: number,\n ): Promise<TracedBytes>;\n listFilesystemTree(\n name: string,\n dirPath: string,\n version: string,\n ): Promise<TracedJson>;\n pushFilesystemFiles(\n name: string,\n files: Array<{ path: string; content: Buffer }>,\n deletes: string[],\n moves: Array<{ from: string; to: string }>,\n copies: Array<{ from: string; to: string }>,\n message: string,\n branch: string,\n idempotencyKey?: string | null,\n ): Promise<TracedJson>;\n pushFilesystemPaths(\n name: string,\n files: Array<{ path: string; localPath: string }>,\n message: string,\n branch: string,\n idempotencyKey?: string | null,\n ): Promise<TracedJson>;\n}\n\ninterface NativeSandboxClientCtor {\n new (\n apiUrl: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n namespace?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxClient;\n}\n\ninterface NativeRepositoryClientCtor {\n new (\n apiUrl: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeRepositoryClient;\n}\n\ninterface NativeSandboxProxyClientCtor {\n new (\n proxyUrl: string,\n sandboxId: string,\n apiKey?: string | null,\n organizationId?: string | null,\n projectId?: string | null,\n routingHint?: string | null,\n userAgent?: string | null,\n requestTimeoutSec?: number | null,\n ): NativeSandboxProxyClient;\n}\n\nexport interface NativeSandboxBinding {\n NativeSandboxClient: NativeSandboxClientCtor;\n NativeSandboxProxyClient: NativeSandboxProxyClientCtor;\n NativeRepositoryClient?: NativeRepositoryClientCtor;\n /** Validate a managed-process name; throws on failure. Single source-of-truth rule in Rust. */\n validateManagedName: (name: string) => void;\n}\n\n// ---- Binding loader -------------------------------------------------------\n\n// `require` exists in the CJS bundle but not in ESM; declared here so the\n// runtime check below typechecks under \"module\": \"esnext\".\ndeclare const require: NodeRequire | undefined;\ndeclare const module: { exports?: unknown } | undefined;\n\nlet cachedBinding: NativeSandboxBinding | undefined;\nlet cachedBindingError: Error | undefined;\n\nfunction resolveRequire(): NodeRequire {\n // tsup rewrites `import.meta.url` in the CJS output; prefer the injected\n // real `require` there and fall back to `createRequire` for ESM. Mirrors\n // the loader in sandbox-image.ts.\n if (\n typeof module !== \"undefined\" &&\n module.exports != null &&\n typeof require !== \"undefined\"\n ) {\n return require;\n }\n return createRequire(import.meta.url);\n}\n\nexport function loadNativeSandboxBinding(): NativeSandboxBinding {\n if (cachedBinding) return cachedBinding;\n if (cachedBindingError) throw cachedBindingError;\n try {\n const { loadNative } = resolveRequire()(\"../lib/runtime.cjs\") as {\n loadNative: () => NativeSandboxBinding;\n };\n const binding = loadNative();\n if (\n binding == null ||\n typeof binding.NativeSandboxClient !== \"function\" ||\n typeof binding.NativeSandboxProxyClient !== \"function\"\n ) {\n throw new SandboxError(\n \"native binding does not export the sandbox clients; rebuild with 'npm run build:native'\",\n );\n }\n cachedBinding = binding;\n return cachedBinding;\n } catch (error) {\n cachedBindingError =\n error instanceof Error ? error : new Error(String(error));\n throw cachedBindingError;\n }\n}\n\n/** Test seam: replace (or clear) the native binding. */\nexport function __setNativeSandboxBindingForTest(\n binding: NativeSandboxBinding | undefined,\n): void {\n cachedBinding = binding;\n cachedBindingError = undefined;\n}\n\n// ---- Error translation ----------------------------------------------------\n\ninterface NativeErrorPayload {\n category: string;\n status: number | null;\n message: string;\n}\n\n/** Context used to reconstruct entity-specific typed errors from a 404/409. */\nexport interface NativeErrorContext {\n sandboxId?: string;\n poolId?: string;\n /**\n * When set, a 404 maps to the typed not-found error for that entity\n * (`SandboxNotFoundError` / `PoolNotFoundError`). Lifecycle ops set it;\n * proxy/data-plane ops omit it so a 404 (e.g. missing file or process)\n * stays a generic `RemoteAPIError`, matching the pre-shim behavior.\n */\n notFoundKind?: \"sandbox\" | \"pool\";\n}\n\nfunction parseNativeError(error: unknown): NativeErrorPayload | null {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"\";\n if (!message) return null;\n try {\n const parsed = JSON.parse(message) as Partial<NativeErrorPayload>;\n if (parsed && typeof parsed.category === \"string\") {\n return {\n category: parsed.category,\n status: typeof parsed.status === \"number\" ? parsed.status : null,\n message: typeof parsed.message === \"string\" ? parsed.message : message,\n };\n }\n } catch {\n // Not a structured native error — fall through.\n }\n return null;\n}\n\n/**\n * Map a native error to the SDK's typed error hierarchy, matching the status\n * codes the undici path produced (404 → SandboxNotFoundError/PoolNotFoundError,\n * 409 → PoolInUseError, connection failures → SandboxConnectionError).\n */\nexport function translateNativeError(\n error: unknown,\n context?: NativeErrorContext,\n): Error {\n const payload = parseNativeError(error);\n if (!payload) {\n if (error instanceof Error) return error;\n return new SandboxError(String(error));\n }\n\n const { category, status, message } = payload;\n\n if (category === \"connection\") {\n return new SandboxConnectionError(message, { cause: error });\n }\n\n if (status === 404) {\n if (context?.notFoundKind === \"pool\" && context.poolId) {\n return new PoolNotFoundError(context.poolId);\n }\n if (context?.notFoundKind === \"sandbox\" && context.sandboxId) {\n return new SandboxNotFoundError(context.sandboxId);\n }\n return new RemoteAPIError(404, message);\n }\n\n if (status === 409 && context?.poolId) {\n return new PoolInUseError(context.poolId, message);\n }\n\n if (typeof status === \"number\") {\n return new RemoteAPIError(status, message);\n }\n\n return new SandboxError(message);\n}\n\n/** Run a native call, translating any error to the SDK's typed hierarchy. */\nexport async function callNative<T>(\n fn: () => Promise<T>,\n context?: NativeErrorContext,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw translateNativeError(error, context);\n }\n}\n\n// ---- Streaming bridge -----------------------------------------------------\n\n/**\n * Adapt the native per-event callback API into an async generator, preserving\n * the live-streaming semantics of `followStdout`/`followStderr`/`followOutput`.\n * The native `start` call resolves once the upstream stream closes; events are\n * buffered in a queue and drained in order.\n */\nexport async function* nativeEventStream(\n start: (emit: NativeEmit) => Promise<string>,\n context?: NativeErrorContext,\n signal?: AbortSignal,\n): AsyncGenerator<Record<string, unknown>> {\n const queue: string[] = [];\n let wake: (() => void) | null = null;\n let finished = false;\n let failure: unknown = null;\n\n const notify = () => {\n if (wake) {\n const w = wake;\n wake = null;\n w();\n }\n };\n\n const emit: NativeEmit = (eventJson) => {\n queue.push(eventJson);\n notify();\n };\n\n const onAbort = () => notify();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n const startPromise = start(emit)\n .catch((error) => {\n failure = error;\n })\n .finally(() => {\n finished = true;\n notify();\n });\n\n try {\n while (true) {\n if (queue.length > 0) {\n yield JSON.parse(queue.shift()!) as Record<string, unknown>;\n continue;\n }\n if (signal?.aborted) break;\n if (finished) break;\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n if (failure != null) {\n throw translateNativeError(failure, context);\n }\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n // Ensure the native call settles so it never surfaces as an unhandled\n // rejection when the consumer breaks early.\n void startPromise.catch(() => {});\n }\n}\n\n/**\n * Reduce the buffered `runProcess` events into a `CommandResult`, matching the\n * SSE-parsing logic the undici `run()` path used.\n */\nexport function assembleCommandResult(events: string[]): {\n exitCode: number;\n stdout: string;\n stderr: string;\n} {\n const stdoutLines: string[] = [];\n const stderrLines: string[] = [];\n let exitCode = -1;\n\n for (const eventJson of events) {\n const raw = JSON.parse(eventJson) as Record<string, unknown>;\n if (typeof raw.line === \"string\") {\n if (raw.stream === \"stderr\") {\n stderrLines.push(raw.line);\n } else {\n stdoutLines.push(raw.line);\n }\n } else if (\"exit_code\" in raw || \"signal\" in raw) {\n if (typeof raw.exit_code === \"number\") {\n exitCode = raw.exit_code;\n } else if (typeof raw.signal === \"number\") {\n exitCode = -raw.signal;\n }\n }\n }\n\n return { exitCode, stdout: stdoutLines.join(\"\\n\"), stderr: stderrLines.join(\"\\n\") };\n}\n","// --- Enums ---\n\nexport enum SandboxStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n SNAPSHOTTING = \"snapshotting\",\n SUSPENDING = \"suspending\",\n SUSPENDED = \"suspended\",\n TERMINATED = \"terminated\",\n TIMEOUT = \"timeout\",\n}\n\nexport enum SnapshotStatus {\n IN_PROGRESS = \"in_progress\",\n LOCAL_READY = \"local_ready\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n}\n\n/**\n * Snapshot type for sandbox snapshot creation.\n *\n * - `\"memory\"`: Capture VM memory + filesystem state. Sandboxes restored\n * from this snapshot warm-restore VM memory.\n * - `\"filesystem\"`: Capture filesystem state only. Sandboxes restored from\n * this snapshot cold-boot from the snapshot tarball instead of warm-\n * restoring VM state. Use this for sandbox image builds so that the\n * restored sandbox bypasses Firecracker's overlay-path constraints.\n */\nexport type SnapshotType = \"memory\" | \"filesystem\";\n\n/**\n * Checkpoint type for {@link Sandbox.checkpoint}.\n *\n * - `\"memory\"`: Capture VM memory + filesystem state. Sandboxes restored\n * from this checkpoint warm-restore VM memory and running processes.\n * - `\"filesystem\"`: Capture filesystem state only. Sandboxes restored from\n * this checkpoint cold-boot from the snapshot tarball.\n */\nexport type CheckpointType = \"memory\" | \"filesystem\";\n\nexport type SnapshotWaitCondition = \"local_ready\" | \"completed\";\n\nexport enum ProcessStatus {\n RUNNING = \"running\",\n EXITED = \"exited\",\n SIGNALED = \"signaled\",\n OOM_KILLED = \"oom_killed\",\n}\n\nexport enum StdinMode {\n CLOSED = \"closed\",\n PIPE = \"pipe\",\n}\n\nexport enum OutputMode {\n CAPTURE = \"capture\",\n DISCARD = \"discard\",\n}\n\nexport enum ContainerState {\n IDLE = \"Idle\",\n RUNNING = \"Running\",\n}\n\n// --- Resource / Network ---\n\nexport interface ContainerResourcesInfo {\n cpus: number;\n memoryMb: number;\n ephemeralDiskMb: number;\n}\n\nexport interface GPUResources {\n count: number;\n model: string;\n}\n\nexport interface NetworkConfig {\n allowInternetAccess: boolean;\n allowOut: string[];\n denyOut: string[];\n}\n\n/**\n * One file system mounted into a sandbox at an absolute guest path.\n *\n * `fileSystemId` is the registered file system's id (e.g.\n * `file_system_...`) and `mountPath` is an absolute, unique guest path\n * (e.g. `/mnt/skills`).\n */\nexport interface FileSystemMount {\n fileSystemId: string;\n mountPath: string;\n}\n\n// --- Sandbox lifecycle ---\n\nexport interface CreateSandboxOptions {\n /** Optional sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. When omitted, Tensorlake uses the default managed environment. */\n image?: string;\n cpus?: number;\n memoryMb?: number;\n /** Root disk size in megabytes. When omitted, the server uses its default disk size. */\n diskMb?: number;\n /** Number of GPUs to allocate. When provided, defaults to A10 unless gpuModel is set. */\n gpus?: number;\n /** GPU model to allocate. Only \"A10\" is supported. */\n gpuModel?: string;\n timeoutSecs?: number;\n entrypoint?: string[];\n allowInternetAccess?: boolean;\n allowOut?: string[];\n denyOut?: string[];\n snapshotId?: string;\n /** Optional name for the sandbox. Named sandboxes support suspend/resume. When absent the sandbox is ephemeral. */\n name?: string;\n /** File systems to mount into the sandbox at boot, each at its own absolute, unique guest mount path. */\n fileSystems?: FileSystemMount[];\n}\n\nexport interface UpdateSandboxOptions {\n /** New name for the sandbox. Naming an ephemeral sandbox enables suspend/resume. */\n name?: string;\n /** Whether exposed user ports should be reachable without TensorLake auth. */\n allowUnauthenticatedAccess?: boolean;\n /** User ports that should be routable through the sandbox proxy. Port 9501 is reserved. */\n exposedPorts?: number[];\n}\n\nexport interface CreateSandboxResponse {\n sandboxId: string;\n status: SandboxStatus;\n reason?: string;\n routingHint?: string;\n ingressEndpoint?: string;\n sandboxUrl?: string;\n name?: string | null;\n terminationReason?: string;\n errorDetails?: unknown;\n}\n\nexport interface CopySandboxOptions {\n /** Number of running copies to create. Defaults to 1. */\n times?: number;\n /** Per-request timeout in seconds for the blocking live-copy request. */\n requestTimeout?: number;\n}\n\nexport interface CopiedSandboxResponse {\n sandboxId: string;\n /** Raw server status. Partial copy responses can include statuses such as `\"failed\"`. */\n status: string;\n reason?: string;\n routingHint?: string;\n ingressEndpoint?: string;\n sandboxUrl?: string;\n name?: string | null;\n terminationReason?: string;\n errorDetails?: unknown;\n}\n\nexport interface CopySandboxResponse {\n sourceSandboxId: string;\n sandboxes: CopiedSandboxResponse[];\n}\n\nexport interface SandboxInfo {\n sandboxId: string;\n namespace: string;\n status: SandboxStatus;\n /** Resolved sandbox image name. */\n image?: string;\n resources: ContainerResourcesInfo;\n timeoutSecs?: number;\n entrypoint?: string[];\n network?: NetworkConfig;\n poolId?: string;\n outcome?: string;\n terminationReason?: string;\n errorDetails?: unknown;\n createdAt?: Date;\n terminatedAt?: Date;\n name?: string;\n allowUnauthenticatedAccess?: boolean;\n exposedPorts?: number[];\n ingressEndpoint?: string;\n sandboxUrl?: string;\n routingHint?: string;\n /** File systems currently mounted into the sandbox, each at its own guest mount path. Empty when none are mounted. */\n fileSystems?: FileSystemMount[];\n}\n\nexport interface SandboxPortAccess {\n allowUnauthenticatedAccess: boolean;\n exposedPorts: number[];\n ingressEndpoint?: string;\n sandboxUrl?: string;\n}\n\n/** Sandbox information plus the archival timestamp. */\nexport interface ArchivedSandboxInfo extends SandboxInfo {\n archivedAt: Date;\n}\n\n/** Pagination params for `listArchivedSandboxes`. */\nexport interface ListArchivedSandboxesOptions {\n limit?: number;\n /** Base64-encoded pagination cursor returned by a prior call. */\n cursor?: string;\n /** Pagination direction. */\n direction?: \"forward\" | \"backward\";\n}\n\nexport interface ListArchivedSandboxesResponse {\n sandboxes: ArchivedSandboxInfo[];\n prevCursor?: string;\n nextCursor?: string;\n}\n\n// --- Snapshots ---\n\nexport interface CreateSnapshotResponse {\n snapshotId: string;\n status: SnapshotStatus;\n}\n\nexport interface SnapshotInfo {\n snapshotId: string;\n namespace: string;\n sandboxId: string;\n baseImage: string;\n status: SnapshotStatus;\n snapshotType?: SnapshotType;\n error?: string;\n snapshotUri?: string;\n snapshotFormatVersion?: string;\n sizeBytes?: number;\n rootfsDiskBytes?: number;\n createdAt?: Date;\n}\n\nexport interface SnapshotOptions {\n /**\n * Optional snapshot type. When omitted the server picks its default. Use\n * `\"filesystem\"` for snapshots intended for sandbox image builds so that\n * restored sandboxes cold-boot.\n */\n snapshotType?: SnapshotType;\n}\n\nexport interface SnapshotAndWaitOptions extends SnapshotOptions {\n timeout?: number;\n pollInterval?: number;\n /** Defaults to `\"local_ready\"`, which is enough to resume from a snapshot. */\n waitUntil?: SnapshotWaitCondition;\n}\n\n// --- Persisted sandbox logs ---\n\nexport type SandboxLogLevel =\n | \"trace\"\n | \"debug\"\n | \"info\"\n | \"warn\"\n | \"error\"\n | \"fatal\";\n\nexport interface GetSandboxLogsOptions {\n levels?: SandboxLogLevel[];\n processIds?: string[];\n nextToken?: string;\n head?: number;\n tail?: number;\n body?: string;\n}\n\nexport interface SandboxLogSignal {\n timestamp: number;\n uuid: string;\n namespace: string;\n application: string;\n sandboxId?: string;\n resourceAttributes: Array<[string, string]>;\n body: string;\n logAttributes: string;\n allocations?: string[];\n functionRuns?: string[];\n level?: number;\n retention?: number;\n}\n\nexport interface SandboxLogsResponse {\n logs: SandboxLogSignal[];\n nextToken?: string;\n}\n\nexport interface SandboxProcessLogFilter {\n processId: string;\n processPid: string;\n processCommand: string;\n processManagedId: string;\n processManagedName: string;\n firstSeen: number;\n lastSeen: number;\n logCount: number;\n}\n\nexport interface SandboxProcessLogFiltersResponse {\n processes: SandboxProcessLogFilter[];\n}\n\n// --- Pools ---\n\nexport interface CreatePoolOptions {\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n ephemeralDiskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n}\n\nexport interface UpdatePoolOptions {\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n ephemeralDiskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n}\n\nexport interface CreateSandboxPoolResponse {\n poolId: string;\n namespace: string;\n}\n\nexport interface PoolContainerInfo {\n id: string;\n state: string;\n sandboxId?: string;\n executorId: string;\n}\n\nexport interface SandboxPoolInfo {\n poolId: string;\n namespace: string;\n /** Sandbox image name backing the pool. */\n image: string;\n resources: ContainerResourcesInfo;\n timeoutSecs: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n containers?: PoolContainerInfo[];\n createdAt?: Date;\n updatedAt?: Date;\n}\n\n// --- Process management ---\n\nexport interface ProcessUserSpec {\n name?: string;\n uid?: number;\n gid?: number;\n}\n\nexport type ProcessUser = string | ProcessUserSpec;\n\nexport type RestartPolicy = \"never\" | \"on_failure\" | \"always\";\n\nexport interface RestartPolicyConfig {\n policy?: RestartPolicy;\n maxRestarts?: number;\n initialBackoffMs?: number;\n maxBackoffMs?: number;\n}\n\nexport type ProcessHealthCheckType = \"http\" | \"tcp\";\n\nexport interface ProcessHealthCheck {\n type: ProcessHealthCheckType;\n port: number;\n path?: string;\n initialDelayMs?: number;\n intervalMs?: number;\n timeoutMs?: number;\n failureThreshold?: number;\n}\n\nexport type ManagedProcessStatus =\n | \"starting\"\n | \"running\"\n | \"backing_off\"\n | \"stopped\";\n\nexport type ManagedProcessHealthStatus =\n | \"disabled\"\n | \"starting\"\n | \"healthy\"\n | \"unhealthy\";\n\nexport interface ManagedProcessExit {\n exitCode?: number;\n signal?: number;\n oomKilled: boolean;\n endedAt: Date;\n}\n\n/**\n * Managed-process metadata embedded into {@link ProcessInfo}.\n *\n * A managed process is addressable by either its current PID or, if a `name` was given at\n * creation, that name (process APIs accept a PID or process name). `id` is a stable\n * daemon-local identifier: it equals `name` when one was set, otherwise a daemon-assigned\n * opaque id (the process is then addressable only by PID, not by `id`).\n */\nexport interface ManagedProcessInfo {\n id: string;\n name?: string;\n status: ManagedProcessStatus;\n restartCount: number;\n restart: RestartPolicyConfig;\n healthCheck?: ProcessHealthCheck;\n healthStatus: ManagedProcessHealthStatus;\n consecutiveHealthFailures: number;\n lastExit?: ManagedProcessExit;\n lastError?: string;\n nextRestartAt?: Date;\n}\n\nexport interface StartProcessOptions {\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n stdinMode?: StdinMode;\n stdoutMode?: OutputMode;\n stderrMode?: OutputMode;\n user?: ProcessUser;\n /**\n * Optional managed-process name. Supplying this opts into managed process behavior, and\n * lets the process be addressed by this name (in addition to its PID) in\n * `getProcess`/`killProcess`/`sendSignal`/etc. — useful because a managed process's PID\n * changes when it restarts. May contain any characters except `/` and must not be all\n * digits (numeric strings are reserved for PID addressing). If omitted, the daemon assigns\n * an opaque id (`ManagedProcessInfo.id`) and the process is addressable only by its current PID.\n */\n name?: string;\n /** Optional restart behavior. Supplying this opts into managed process behavior. */\n restart?: RestartPolicyConfig;\n /** Optional HTTP/TCP health check. Supplying this opts into managed process behavior. */\n healthCheck?: ProcessHealthCheck;\n}\n\nexport interface ProcessInfo {\n handle?: number;\n pid: number;\n status: ProcessStatus;\n exitCode?: number;\n signal?: number;\n stdinWritable: boolean;\n command: string;\n args: string[];\n startedAt: Date;\n endedAt?: Date;\n managed?: ManagedProcessInfo;\n}\n\nexport interface SendSignalResponse {\n success: boolean;\n}\n\nexport interface OutputResponse {\n pid: number;\n lines: string[];\n lineCount: number;\n}\n\nexport interface OutputEvent {\n line: string;\n timestamp: Date;\n stream?: string;\n}\n\n// --- Run ---\n\nexport interface RunOptions {\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n timeout?: number;\n user?: ProcessUser;\n}\n\nexport interface CommandResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// --- File operations ---\n\nexport interface DirectoryEntry {\n name: string;\n isDir: boolean;\n size?: number;\n modifiedAt?: Date;\n}\n\nexport interface ListDirectoryResponse {\n path: string;\n entries: DirectoryEntry[];\n}\n\n// --- PTY ---\n\nexport interface CreatePtySessionOptions {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n workingDir?: string;\n rows?: number;\n cols?: number;\n}\n\nexport interface PtySessionInfo {\n sessionId: string;\n token: string;\n}\n\n// --- Health ---\n\nexport interface HealthResponse {\n healthy: boolean;\n}\n\nexport interface DaemonInfo {\n version: string;\n uptimeSecs: number;\n runningProcesses: number;\n totalProcesses: number;\n}\n\n// --- Client options ---\n\nexport interface SandboxClientOptions {\n apiUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n namespace?: string;\n maxRetries?: number;\n retryBackoffMs?: number;\n /** Total HTTP request timeout in seconds. Default: 300. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. Total HTTP request timeout in milliseconds. */\n timeoutMs?: number;\n}\n\nexport interface SandboxOptions {\n sandboxId: string;\n /**\n * Explicit sandbox proxy base URL. Direct `new Sandbox(...)` construction\n * requires this; `Sandbox.connect()` and `SandboxClient.connect()` normally\n * resolve the server-returned `sandboxUrl`.\n */\n proxyUrl?: string;\n /** @internal Real caller/env proxy override, distinct from an internally selected proxyUrl. */\n explicitProxyUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n routingHint?: string;\n resolveProxyInfo?: (\n identifier: string,\n ) => Promise<SandboxInfo & { readonly traceId: string }>;\n /** Optional total HTTP request timeout in seconds for sandbox proxy operations. Omit for no total proxy timeout. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. Optional total HTTP request timeout in milliseconds for sandbox proxy operations. */\n timeoutMs?: number;\n /**\n * @internal Shared Rust-backed lifecycle client. When provided, the proxy\n * client is minted via `connectProxy` so it reuses this client's connection\n * pool (HTTP/2 coalescing across sandboxes).\n */\n nativeClient?: import(\"./native-sandbox.js\").NativeSandboxClient;\n}\n\nexport interface CreateAndConnectOptions extends CreateSandboxOptions {\n poolId?: string;\n proxyUrl?: string;\n /** Total HTTP request timeout in seconds for sandbox startup. Default: client requestTimeout. */\n requestTimeout?: number;\n /** @deprecated Use requestTimeout. */\n startupTimeout?: number;\n}\n\nexport interface SuspendResumeOptions {\n /** If false, fire-and-return without waiting for completion. Default: true. */\n wait?: boolean;\n /** Max seconds to wait when wait=true. Default: 300. */\n timeout?: number;\n /** Seconds between status polls when wait=true. Default: 1. */\n pollInterval?: number;\n}\n\nexport interface CheckpointOptions extends SuspendResumeOptions {\n checkpointType?: CheckpointType;\n /** Defaults to `\"local_ready\"`, which is enough to resume from a checkpoint. */\n waitUntil?: SnapshotWaitCondition;\n}\n\nexport interface ConnectOptions {\n sandboxId: string;\n proxyUrl?: string;\n routingHint?: string;\n}\n\n// --- JSON key conversion helpers ---\n\nconst CAMEL_TO_SNAKE_RE = /[A-Z]/g;\n\n/** Convert a camelCase string to snake_case. */\nexport function camelToSnake(str: string): string {\n return str.replace(CAMEL_TO_SNAKE_RE, (ch) => \"_\" + ch.toLowerCase());\n}\n\n/** Convert a snake_case string to camelCase. */\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, ch) => ch.toUpperCase());\n}\n\n/** Recursively convert all object keys from camelCase to snake_case. */\nexport function toSnakeKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) return obj.map(toSnakeKeys);\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n result[camelToSnake(k)] = toSnakeKeys(v);\n }\n return result;\n }\n return obj;\n}\n\n/**\n * Parse a numeric timestamp into a Date.\n *\n * Handles seconds, milliseconds, and microseconds by checking magnitude.\n */\nexport function parseTimestamp(v: unknown): Date | undefined {\n if (v == null) return undefined;\n if (v instanceof Date) return v;\n if (typeof v === \"string\") {\n const parsed = Date.parse(v);\n return Number.isNaN(parsed) ? undefined : new Date(parsed);\n }\n const ts = Number(v);\n if (isNaN(ts)) return undefined;\n if (ts > 1e15) return new Date(ts / 1000); // microseconds → ms\n if (ts > 1e12) return new Date(ts); // already ms\n return new Date(ts * 1000); // seconds → ms\n}\n\n/**\n * Recursively convert all object keys from snake_case to camelCase,\n * with special handling for `id` → contextual name and timestamp parsing.\n */\nexport function fromSnakeKeys(\n obj: unknown,\n idField?: string,\n): unknown {\n if (Array.isArray(obj)) return obj.map((item) => fromSnakeKeys(item, idField));\n if (obj !== null && typeof obj === \"object\" && !(obj instanceof Date)) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {\n let key: string;\n if (k === \"id\" && idField) {\n key = idField;\n } else {\n key = snakeToCamel(k);\n }\n\n // Parse timestamp fields\n if (\n key.endsWith(\"At\") ||\n key === \"timestamp\" ||\n key === \"startedAt\" ||\n key === \"endedAt\"\n ) {\n result[key] = parseTimestamp(v);\n } else if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n result[key] = fromSnakeKeys(v);\n } else if (Array.isArray(v)) {\n result[key] = v.map((item) => fromSnakeKeys(item));\n } else {\n // Normalize null → undefined so optional fields match TypeScript's ? convention.\n result[key] = v === null ? undefined : v;\n }\n }\n return result;\n }\n return obj;\n}\n","import * as net from \"node:net\";\nimport { SandboxConnectionError, SandboxError } from \"./errors.js\";\nimport WebSocket, { type RawData } from \"ws\";\n\nconst DEFAULT_TUNNEL_CONNECT_TIMEOUT_MS = 10_000;\nconst WEBSOCKET_KEEPALIVE_INTERVAL_MS = 15_000;\n\nexport interface CreateTunnelOptions {\n /** Local host/interface to bind. Defaults to `127.0.0.1`. */\n localHost?: string;\n /** Local port to bind. Defaults to the remote port. Use `0` for an ephemeral port. */\n localPort?: number;\n /** Seconds to wait for each websocket tunnel connection. Defaults to `10`. */\n connectTimeout?: number;\n}\n\nexport interface TunnelAddress {\n host: string;\n port: number;\n}\n\ninterface TunnelWebSocketOptions {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n connectTimeoutMs?: number;\n}\n\ninterface PendingRead {\n length: number;\n resolve: (chunk: Buffer) => void;\n reject: (error: Error) => void;\n}\n\ninterface ActiveRelay {\n localSocket: net.Socket;\n websocket: WebSocket | null;\n}\n\nexport async function openTunnelWebSocket(\n options: TunnelWebSocketOptions,\n): Promise<WebSocket> {\n const wsUrl = buildTunnelWsUrl(options.baseUrl, options.remotePort);\n const timeoutMs = options.connectTimeoutMs ?? DEFAULT_TUNNEL_CONNECT_TIMEOUT_MS;\n\n return new Promise<WebSocket>((resolve, reject) => {\n const socket = new WebSocket(wsUrl, {\n headers: options.wsHeaders,\n });\n\n let settled = false;\n const timer = setTimeout(() => {\n fail(\n new SandboxError(\n `timed out while connecting tunnel websocket after ${(timeoutMs / 1000).toFixed(2)}s`,\n ),\n );\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timer);\n socket.removeListener(\"open\", onOpen);\n socket.removeListener(\"error\", onError);\n socket.removeListener(\"close\", onCloseBeforeOpen);\n socket.removeListener(\"unexpected-response\", onUnexpectedResponse);\n };\n\n const settle = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n\n const fail = (error: Error) => {\n settle(() => {\n reject(error);\n });\n };\n\n const onOpen = () => {\n settle(() => resolve(socket));\n };\n\n const onError = (error: Error) => {\n fail(new SandboxConnectionError(error.message));\n };\n\n const onCloseBeforeOpen = (code: number, reason: Buffer) => {\n const closeReason =\n reason.length > 0 ? reason.toString(\"utf8\") : \"no reason\";\n fail(\n new SandboxError(\n `tunnel websocket closed before opening: ${code} ${closeReason}`,\n ),\n );\n };\n\n const onUnexpectedResponse = (\n _request: unknown,\n response: { statusCode?: number; statusMessage?: string },\n ) => {\n const status = response.statusCode ?? 0;\n const statusMessage = response.statusMessage?.trim();\n fail(\n new SandboxError(\n `tunnel websocket handshake failed with HTTP ${status}${statusMessage ? ` ${statusMessage}` : \"\"}`,\n ),\n );\n };\n\n socket.on(\"open\", onOpen);\n socket.on(\"error\", onError);\n socket.on(\"close\", onCloseBeforeOpen);\n socket.on(\"unexpected-response\", onUnexpectedResponse);\n });\n}\n\nexport class TunnelByteStream {\n private readonly socket: WebSocket;\n private readBuffer: Buffer = Buffer.alloc(0);\n private readonly pendingReads: PendingRead[] = [];\n private closeError: Error | null = null;\n private closePromise: Promise<void> | null = null;\n private readonly keepAliveInterval: ReturnType<typeof setInterval>;\n\n constructor(socket: WebSocket) {\n this.socket = socket;\n this.keepAliveInterval = setInterval(() => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.ping();\n }\n }, WEBSOCKET_KEEPALIVE_INTERVAL_MS);\n this.keepAliveInterval.unref?.();\n\n socket.on(\"message\", (message: RawData, isBinary: boolean) => {\n if (!isBinary) {\n this.fail(\n new SandboxError(\"desktop tunnel received unexpected text frame\"),\n );\n return;\n }\n this.pushBytes(normalizeWebSocketData(message));\n });\n\n socket.on(\"ping\", (data: Buffer) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.pong(data, false, () => {});\n }\n });\n\n socket.on(\"close\", (_code: number, reason: Buffer) => {\n clearInterval(this.keepAliveInterval);\n const closeReason =\n reason.length > 0 ? reason.toString(\"utf8\") : \"desktop tunnel closed unexpectedly\";\n this.fail(new SandboxError(closeReason));\n });\n\n socket.on(\"error\", (error: Error) => {\n clearInterval(this.keepAliveInterval);\n this.fail(new SandboxConnectionError(error.message));\n });\n }\n\n static async connect(options: TunnelWebSocketOptions): Promise<TunnelByteStream> {\n const socket = await openTunnelWebSocket(options);\n return new TunnelByteStream(socket);\n }\n\n async readExactly(length: number): Promise<Buffer> {\n if (length < 0) {\n throw new SandboxError(`read length must be >= 0, got ${length}`);\n }\n if (length === 0) {\n return Buffer.alloc(0);\n }\n if (this.readBuffer.length >= length) {\n const chunk = this.readBuffer.subarray(0, length);\n this.readBuffer = this.readBuffer.subarray(length);\n return chunk;\n }\n if (this.closeError) {\n throw this.closeError;\n }\n return new Promise<Buffer>((resolve, reject) => {\n this.pendingReads.push({ length, resolve, reject });\n });\n }\n\n async writeAll(data: Uint8Array): Promise<void> {\n if (this.closeError) {\n throw this.closeError;\n }\n if (this.socket.readyState !== WebSocket.OPEN) {\n throw new SandboxError(\"desktop tunnel is not connected\");\n }\n const payload = Buffer.from(data);\n await new Promise<void>((resolve, reject) => {\n this.socket.send(payload, { binary: true }, (error?: Error) => {\n if (error) {\n reject(new SandboxConnectionError(error.message));\n return;\n }\n resolve();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.closePromise) {\n return this.closePromise;\n }\n if (\n this.socket.readyState === WebSocket.CLOSED ||\n this.socket.readyState === WebSocket.CLOSING\n ) {\n this.closePromise = Promise.resolve();\n return this.closePromise;\n }\n\n this.closePromise = new Promise<void>((resolve) => {\n const onClose = () => {\n this.socket.removeListener(\"close\", onClose);\n resolve();\n };\n this.socket.on(\"close\", onClose);\n this.socket.close();\n });\n return this.closePromise;\n }\n\n private pushBytes(chunk: Buffer): void {\n this.readBuffer =\n this.readBuffer.length === 0\n ? chunk\n : Buffer.from(Buffer.concat([this.readBuffer, chunk]));\n this.flushPendingReads();\n }\n\n private flushPendingReads(): void {\n while (this.pendingReads.length > 0) {\n const next = this.pendingReads[0];\n if (this.readBuffer.length < next.length) {\n break;\n }\n const chunk = this.readBuffer.subarray(0, next.length);\n this.readBuffer = this.readBuffer.subarray(next.length);\n this.pendingReads.shift();\n next.resolve(chunk);\n }\n }\n\n private fail(error: Error): void {\n if (this.closeError) {\n return;\n }\n this.closeError = error;\n while (this.pendingReads.length > 0) {\n const pending = this.pendingReads.shift();\n pending?.reject(error);\n }\n }\n}\n\nexport class TcpTunnel {\n readonly remotePort: number;\n readonly localHost: string;\n readonly localPort: number;\n\n private readonly baseUrl: string;\n private readonly wsHeaders: Record<string, string>;\n private readonly server: net.Server;\n private readonly connectTimeoutMs: number;\n private readonly activeRelays = new Set<ActiveRelay>();\n private closePromise: Promise<void> | null = null;\n\n private constructor(options: {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n localHost: string;\n localPort: number;\n server: net.Server;\n connectTimeoutMs: number;\n }) {\n this.baseUrl = options.baseUrl;\n this.wsHeaders = options.wsHeaders;\n this.remotePort = options.remotePort;\n this.localHost = options.localHost;\n this.localPort = options.localPort;\n this.server = options.server;\n this.connectTimeoutMs = options.connectTimeoutMs;\n }\n\n static async listen(options: {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n remotePort: number;\n localHost?: string;\n localPort?: number;\n connectTimeout?: number;\n }): Promise<TcpTunnel> {\n const remotePort = validatePort(options.remotePort, \"remote port\");\n const localHost = options.localHost ?? \"127.0.0.1\";\n const localPort = validatePort(\n options.localPort ?? remotePort,\n \"local port\",\n true,\n );\n const connectTimeoutMs = secondsToMillis(options.connectTimeout ?? 10);\n\n const server = net.createServer();\n await listenServer(server, localPort, localHost);\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n throw new SandboxError(\"failed to determine bound tunnel address\");\n }\n\n const tunnel = new TcpTunnel({\n baseUrl: options.baseUrl,\n wsHeaders: options.wsHeaders,\n remotePort,\n localHost,\n localPort: address.port,\n server,\n connectTimeoutMs,\n });\n\n server.on(\"connection\", (localSocket) => {\n void tunnel.handleConnection(localSocket);\n });\n\n return tunnel;\n }\n\n address(): TunnelAddress {\n return { host: this.localHost, port: this.localPort };\n }\n\n async close(): Promise<void> {\n if (this.closePromise) {\n return this.closePromise;\n }\n\n for (const relay of this.activeRelays) {\n relay.localSocket.destroy();\n relay.websocket?.close();\n }\n\n this.closePromise = new Promise<void>((resolve, reject) => {\n this.server.close((error) => {\n if (error) {\n reject(new SandboxError(`failed to close tunnel listener: ${error.message}`));\n return;\n }\n resolve();\n });\n });\n return this.closePromise;\n }\n\n private async handleConnection(localSocket: net.Socket): Promise<void> {\n localSocket.setNoDelay(true);\n\n const relay: ActiveRelay = { localSocket, websocket: null };\n this.activeRelays.add(relay);\n\n try {\n relay.websocket = await openTunnelWebSocket({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n remotePort: this.remotePort,\n connectTimeoutMs: this.connectTimeoutMs,\n });\n await relaySocket(localSocket, relay.websocket);\n } catch (error) {\n localSocket.destroy(\n error instanceof Error ? error : new Error(String(error)),\n );\n } finally {\n this.activeRelays.delete(relay);\n }\n }\n}\n\nexport function buildTunnelWsUrl(baseUrl: string, remotePort: number): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/api/v1/tunnels/tcp\";\n url.search = `port=${encodeURIComponent(String(remotePort))}`;\n return url.toString();\n}\n\nfunction normalizeWebSocketData(message: RawData): Buffer {\n if (Buffer.isBuffer(message)) return message;\n if (Array.isArray(message)) {\n return Buffer.concat(message.map((part) => Buffer.from(part)));\n }\n return Buffer.from(message);\n}\n\nasync function relaySocket(localSocket: net.Socket, websocket: WebSocket): Promise<void> {\n return new Promise<void>((resolve) => {\n let settled = false;\n const keepAliveInterval = setInterval(() => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.ping();\n }\n }, WEBSOCKET_KEEPALIVE_INTERVAL_MS);\n keepAliveInterval.unref?.();\n\n const finish = () => {\n if (settled) return;\n settled = true;\n clearInterval(keepAliveInterval);\n cleanup();\n resolve();\n };\n\n const cleanup = () => {\n localSocket.removeListener(\"data\", onLocalData);\n localSocket.removeListener(\"end\", onLocalEnd);\n localSocket.removeListener(\"close\", onLocalClose);\n localSocket.removeListener(\"error\", onLocalError);\n websocket.removeListener(\"message\", onWsMessage);\n websocket.removeListener(\"close\", onWsClose);\n websocket.removeListener(\"error\", onWsError);\n websocket.removeListener(\"ping\", onWsPing);\n };\n\n const onLocalData = (chunk: Buffer) => {\n if (websocket.readyState !== WebSocket.OPEN) {\n localSocket.destroy();\n return;\n }\n\n websocket.send(chunk, { binary: true }, (error?: Error) => {\n if (error) {\n localSocket.destroy(error);\n }\n });\n };\n\n const onLocalEnd = () => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.close();\n }\n };\n\n const onLocalClose = () => {\n if (\n websocket.readyState === WebSocket.OPEN ||\n websocket.readyState === WebSocket.CONNECTING\n ) {\n websocket.close();\n }\n finish();\n };\n\n const onLocalError = () => {\n websocket.close();\n finish();\n };\n\n const onWsMessage = (message: RawData, isBinary: boolean) => {\n if (!isBinary) {\n localSocket.destroy(\n new SandboxError(\"received unexpected text frame from tunnel\"),\n );\n websocket.close();\n return;\n }\n\n const payload = normalizeWebSocketData(message);\n if (!localSocket.destroyed) {\n localSocket.write(payload);\n }\n };\n\n const onWsClose = () => {\n if (!localSocket.destroyed) {\n localSocket.end();\n }\n finish();\n };\n\n const onWsError = (error: Error) => {\n localSocket.destroy(error);\n finish();\n };\n\n const onWsPing = (data: Buffer) => {\n if (websocket.readyState === WebSocket.OPEN) {\n websocket.pong(data, false, () => {});\n }\n };\n\n localSocket.on(\"data\", onLocalData);\n localSocket.on(\"end\", onLocalEnd);\n localSocket.on(\"close\", onLocalClose);\n localSocket.on(\"error\", onLocalError);\n websocket.on(\"message\", onWsMessage);\n websocket.on(\"close\", onWsClose);\n websocket.on(\"error\", onWsError);\n websocket.on(\"ping\", onWsPing);\n });\n}\n\nasync function listenServer(\n server: net.Server,\n localPort: number,\n localHost: string,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error) => {\n server.removeListener(\"listening\", onListening);\n reject(\n new SandboxError(\n `failed to bind local tunnel listener on ${localHost}:${localPort}: ${error.message}`,\n ),\n );\n };\n\n const onListening = () => {\n server.removeListener(\"error\", onError);\n resolve();\n };\n\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(localPort, localHost);\n });\n}\n\nfunction validatePort(port: number, label: string, allowZero = false): number {\n if (!Number.isInteger(port)) {\n throw new SandboxError(`${label} must be an integer, got ${port}`);\n }\n if (allowZero && port === 0) {\n return port;\n }\n if (port < 1 || port > 65535) {\n throw new SandboxError(`${label} must be between 1 and 65535, got ${port}`);\n }\n return port;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds < 0) {\n throw new SandboxError(`timeout must be >= 0 seconds, got ${seconds}`);\n }\n return Math.round(seconds * 1000);\n}\n\nexport async function withTimeout<T>(\n timeoutMs: number,\n operation: () => Promise<T>,\n timeoutMessage: string,\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new SandboxError(timeoutMessage));\n }, timeoutMs);\n\n void operation()\n .then((value) => {\n clearTimeout(timer);\n resolve(value);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}\n","import { deflateSync } from \"node:zlib\";\nimport { SandboxError } from \"./errors.js\";\nimport { TunnelByteStream, withTimeout } from \"./tunnel.js\";\n\nconst SECURITY_TYPE_NONE = 1;\nconst SECURITY_TYPE_VNC_AUTH = 2;\nconst ENCODING_RAW = 0;\nconst ENCODING_DESKTOP_SIZE = -223;\n\nconst BUTTON_LEFT_MASK = 1;\nconst BUTTON_MIDDLE_MASK = 1 << 1;\nconst BUTTON_RIGHT_MASK = 1 << 2;\nconst BUTTON_SCROLL_UP_MASK = 1 << 3;\nconst BUTTON_SCROLL_DOWN_MASK = 1 << 4;\n\nconst PNG_SIGNATURE = Buffer.from([\n 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,\n]);\n\nconst CRC32_TABLE = buildCrc32Table();\n\nexport type MouseButton = \"left\" | \"middle\" | \"right\";\n\nexport interface ConnectDesktopOptions {\n /** Remote VNC port. Defaults to `5901`. */\n port?: number;\n /** Optional VNC password for classic VNC authentication. */\n password?: string;\n /** Whether to request a shared VNC session. Defaults to `true`. */\n shared?: boolean;\n /** Seconds to wait while opening the desktop session. Defaults to `10`. */\n connectTimeout?: number;\n}\n\nexport interface DesktopPointerOptions {\n button?: MouseButton;\n x?: number;\n y?: number;\n}\n\nexport interface DesktopDoubleClickOptions extends DesktopPointerOptions {\n delayMs?: number;\n}\n\ninterface DesktopConnectRequest extends ConnectDesktopOptions {\n baseUrl: string;\n wsHeaders: Record<string, string>;\n}\n\ninterface FramebufferUpdateOutcome {\n kind: \"framebufferUpdate\";\n sawResize: boolean;\n sawRaw: boolean;\n}\n\ninterface BellOutcome {\n kind: \"bell\";\n}\n\ninterface ServerCutTextOutcome {\n kind: \"serverCutText\";\n}\n\ntype ServerMessageOutcome =\n | FramebufferUpdateOutcome\n | BellOutcome\n | ServerCutTextOutcome;\n\nexport interface DesktopTransport {\n readExactly(length: number): Promise<Buffer>;\n writeAll(data: Uint8Array): Promise<void>;\n close(): Promise<void>;\n}\n\nexport class DesktopSession<T extends DesktopTransport> {\n readonly transport: T;\n width: number;\n height: number;\n\n private pixelFormat: PixelFormat;\n private framebuffer: Uint8Array;\n private pointerX = 0;\n private pointerY = 0;\n private buttonMask = 0;\n private framebufferVersion = 0;\n private closed = false;\n private updateLoopError: Error | null = null;\n private readonly updateSignal = createDeferredSignal();\n private updateLoopPromise: Promise<void> | null = null;\n\n constructor(options: {\n transport: T;\n width: number;\n height: number;\n pixelFormat: PixelFormat;\n framebuffer: Uint8Array;\n }) {\n this.transport = options.transport;\n this.width = options.width;\n this.height = options.height;\n this.pixelFormat = options.pixelFormat;\n this.framebuffer = options.framebuffer;\n }\n\n static async connect<T extends DesktopTransport>(\n transport: T,\n password?: string,\n shared = true,\n ): Promise<DesktopSession<T>> {\n const serverVersion = await ProtocolVersion.read(transport);\n const clientVersion = serverVersion.negotiated();\n await transport.writeAll(Buffer.from(clientVersion.render(), \"ascii\"));\n\n await negotiateSecurity(transport, clientVersion, password);\n await transport.writeAll(Uint8Array.of(shared ? 1 : 0));\n\n const init = await ServerInit.read(transport);\n if (!init.pixelFormat.trueColor) {\n throw new SandboxError(\n \"desktop sessions require a true-color VNC pixel format\",\n );\n }\n\n const pixelFormat = PixelFormat.preferred();\n await sendSetPixelFormat(transport, pixelFormat);\n await sendSetEncodings(transport, [ENCODING_RAW, ENCODING_DESKTOP_SIZE]);\n\n const session = new DesktopSession({\n transport,\n width: init.width,\n height: init.height,\n pixelFormat,\n framebuffer: allocateFramebuffer(init.width, init.height),\n });\n session.startFramebufferUpdates();\n return session;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.updateSignal.resolve();\n await this.transport.close();\n await this.updateLoopPromise;\n }\n\n async screenshot(timeoutSeconds = 5): Promise<Uint8Array> {\n await this.waitForFramebufferVersion(\n 1,\n timeoutSeconds,\n `timed out waiting for initial desktop framebuffer after ${timeoutSeconds.toFixed(2)}s`,\n );\n return encodePng(this.width, this.height, this.framebuffer);\n }\n\n getFrameVersion(): number {\n return this.framebufferVersion;\n }\n\n async screenshotAfter(frameVersion: number, timeoutSeconds = 1): Promise<Uint8Array> {\n const minimumVersion = validateNonNegativeInteger(frameVersion, \"frame version\") + 1;\n\n if (this.framebufferVersion < minimumVersion) {\n await this.waitForFramebufferVersion(\n minimumVersion,\n timeoutSeconds,\n `timed out waiting for a fresher desktop framebuffer after ${timeoutSeconds.toFixed(2)}s`,\n );\n }\n\n return encodePng(this.width, this.height, this.framebuffer);\n }\n\n async moveMouse(x: number, y: number): Promise<void> {\n const nextX = validateCoordinate(x, \"mouse x coordinate\");\n const nextY = validateCoordinate(y, \"mouse y coordinate\");\n this.ensurePointerInBounds(nextX, nextY);\n this.pointerX = nextX;\n this.pointerY = nextY;\n await sendPointerEvent(this.transport, this.buttonMask, nextX, nextY);\n }\n\n async mousePress(options?: DesktopPointerOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n await this.moveIfRequested(options?.x, options?.y);\n this.buttonMask |= buttonMask(button);\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n\n async mouseRelease(options?: DesktopPointerOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n await this.moveIfRequested(options?.x, options?.y);\n this.buttonMask &= ~buttonMask(button);\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n\n async click(options?: DesktopPointerOptions): Promise<void> {\n await this.mousePress(options);\n await this.mouseRelease({ button: options?.button ?? \"left\" });\n }\n\n async doubleClick(options?: DesktopDoubleClickOptions): Promise<void> {\n const button = options?.button ?? \"left\";\n const delayMs = options?.delayMs ?? 50;\n validateNonNegativeInteger(delayMs, \"double click delay\");\n\n await this.click({ button, x: options?.x, y: options?.y });\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n await this.click({ button });\n }\n\n async scroll(steps: number, x?: number, y?: number): Promise<void> {\n const normalizedSteps = validateInteger(steps, \"scroll steps\");\n await this.moveIfRequested(x, y);\n\n if (normalizedSteps === 0) {\n return;\n }\n\n const wheelMask =\n normalizedSteps > 0 ? BUTTON_SCROLL_UP_MASK : BUTTON_SCROLL_DOWN_MASK;\n const stepCount = Math.abs(normalizedSteps);\n for (let index = 0; index < stepCount; index += 1) {\n await sendPointerEvent(\n this.transport,\n this.buttonMask | wheelMask,\n this.pointerX,\n this.pointerY,\n );\n await sendPointerEvent(\n this.transport,\n this.buttonMask,\n this.pointerX,\n this.pointerY,\n );\n }\n }\n\n async keyDown(key: string): Promise<void> {\n await sendKeyEvent(this.transport, true, keysymFromKeyName(key));\n }\n\n async keyUp(key: string): Promise<void> {\n await sendKeyEvent(this.transport, false, keysymFromKeyName(key));\n }\n\n async press(keys: string | string[]): Promise<void> {\n const parts = Array.isArray(keys) ? keys : [keys];\n if (parts.length === 0) {\n throw new SandboxError(\"desktop press requires at least one key\");\n }\n\n const keysyms = parts.map((part) => keysymFromKeyName(part));\n if (keysyms.length === 1) {\n await sendKeyEvent(this.transport, true, keysyms[0]);\n await sendKeyEvent(this.transport, false, keysyms[0]);\n return;\n }\n\n for (const keysym of keysyms.slice(0, -1)) {\n await sendKeyEvent(this.transport, true, keysym);\n }\n\n const last = keysyms[keysyms.length - 1];\n await sendKeyEvent(this.transport, true, last);\n await sendKeyEvent(this.transport, false, last);\n\n for (const keysym of keysyms.slice(0, -1).reverse()) {\n await sendKeyEvent(this.transport, false, keysym);\n }\n }\n\n async typeText(text: string): Promise<void> {\n for (const char of text) {\n const keysym = keysymFromChar(char);\n await sendKeyEvent(this.transport, true, keysym);\n await sendKeyEvent(this.transport, false, keysym);\n }\n }\n\n private async moveIfRequested(x?: number, y?: number): Promise<void> {\n if (x == null && y == null) {\n return;\n }\n if (x == null || y == null) {\n throw new SandboxError(\n \"desktop pointer actions require both x and y when specifying coordinates\",\n );\n }\n await this.moveMouse(x, y);\n }\n\n private ensurePointerInBounds(x: number, y: number): void {\n if (this.width > 0 && x >= this.width) {\n throw new SandboxError(\n `mouse x coordinate ${x} is outside desktop width ${this.width}`,\n );\n }\n if (this.height > 0 && y >= this.height) {\n throw new SandboxError(\n `mouse y coordinate ${y} is outside desktop height ${this.height}`,\n );\n }\n }\n\n private startFramebufferUpdates(): void {\n if (this.updateLoopPromise) {\n return;\n }\n\n this.updateLoopPromise = this.runFramebufferUpdateLoop().catch((error: unknown) => {\n if (this.closed) {\n return;\n }\n this.updateLoopError = normalizeError(error);\n this.updateSignal.resolve();\n });\n }\n\n private async runFramebufferUpdateLoop(): Promise<void> {\n let incremental = false;\n\n while (!this.closed) {\n await sendFramebufferUpdateRequest(\n this.transport,\n incremental,\n 0,\n 0,\n this.width,\n this.height,\n );\n\n const outcome = await this.readUntilFramebufferUpdate();\n if (outcome.sawResize && !outcome.sawRaw) {\n incremental = false;\n continue;\n }\n\n if (outcome.sawRaw) {\n this.framebufferVersion += 1;\n this.updateSignal.resolve();\n }\n\n incremental = true;\n }\n }\n\n private async readUntilFramebufferUpdate(): Promise<FramebufferUpdateOutcome> {\n while (true) {\n const outcome = await this.readServerMessage();\n if (outcome.kind === \"framebufferUpdate\") {\n return outcome;\n }\n }\n }\n\n private async waitForFramebufferVersion(\n minimumVersion: number,\n timeoutSeconds: number,\n timeoutMessage: string,\n ): Promise<void> {\n const timeoutMs = secondsToMillis(timeoutSeconds);\n const deadline = Date.now() + timeoutMs;\n\n while (this.framebufferVersion < minimumVersion) {\n if (this.updateLoopError) {\n throw this.updateLoopError;\n }\n if (this.closed) {\n throw new SandboxError(\"desktop session is closed\");\n }\n\n const observedVersion = this.framebufferVersion;\n const waitForUpdate = this.updateSignal.wait();\n if (this.framebufferVersion !== observedVersion) {\n continue;\n }\n\n const remainingMs = Math.max(0, deadline - Date.now());\n if (remainingMs === 0) {\n break;\n }\n\n await withTimeout(remainingMs, () => waitForUpdate, timeoutMessage);\n }\n\n if (this.framebufferVersion < minimumVersion) {\n throw new SandboxError(timeoutMessage);\n }\n }\n\n private async readServerMessage(): Promise<ServerMessageOutcome> {\n const messageType = await readU8(this.transport);\n if (messageType === 0) {\n return this.readFramebufferUpdate();\n }\n if (messageType === 1) {\n await this.readSetColorMapEntries();\n return { kind: \"bell\" };\n }\n if (messageType === 2) {\n return { kind: \"bell\" };\n }\n if (messageType === 3) {\n await this.readServerCutText();\n return { kind: \"serverCutText\" };\n }\n throw new SandboxError(`unsupported VNC server message type ${messageType}`);\n }\n\n private async readFramebufferUpdate(): Promise<FramebufferUpdateOutcome> {\n await readU8(this.transport);\n const rectangleCount = await readU16(this.transport);\n let sawResize = false;\n let sawRaw = false;\n\n for (let index = 0; index < rectangleCount; index += 1) {\n const x = await readU16(this.transport);\n const y = await readU16(this.transport);\n const width = await readU16(this.transport);\n const height = await readU16(this.transport);\n const encoding = await readI32(this.transport);\n\n if (encoding === ENCODING_RAW) {\n const bytesPerPixel = this.pixelFormat.bytesPerPixel();\n const length = width * height * bytesPerPixel;\n const data = await this.transport.readExactly(length);\n this.blitRawRectangle(x, y, width, height, data);\n sawRaw = true;\n continue;\n }\n\n if (encoding === ENCODING_DESKTOP_SIZE) {\n this.resizeFramebuffer(width, height);\n sawResize = true;\n continue;\n }\n\n throw new SandboxError(`unsupported VNC rectangle encoding ${encoding}`);\n }\n\n return { kind: \"framebufferUpdate\", sawResize, sawRaw };\n }\n\n private async readSetColorMapEntries(): Promise<void> {\n await readU8(this.transport);\n await readU16(this.transport);\n const colorCount = await readU16(this.transport);\n await this.transport.readExactly(colorCount * 6);\n throw new SandboxError(\n \"desktop sessions do not support color-map VNC pixel formats\",\n );\n }\n\n private async readServerCutText(): Promise<void> {\n await this.transport.readExactly(3);\n const length = await readU32(this.transport);\n await this.transport.readExactly(length);\n }\n\n private resizeFramebuffer(width: number, height: number): void {\n this.width = width;\n this.height = height;\n this.framebuffer = allocateFramebuffer(width, height);\n this.pointerX = width > 0 ? Math.min(this.pointerX, width - 1) : 0;\n this.pointerY = height > 0 ? Math.min(this.pointerY, height - 1) : 0;\n }\n\n private blitRawRectangle(\n x: number,\n y: number,\n width: number,\n height: number,\n data: Uint8Array,\n ): void {\n if (x + width > this.width || y + height > this.height) {\n throw new SandboxError(\"desktop raw rectangle exceeds framebuffer bounds\");\n }\n\n const bytesPerPixel = this.pixelFormat.bytesPerPixel();\n for (let row = 0; row < height; row += 1) {\n for (let col = 0; col < width; col += 1) {\n const srcIndex = (row * width + col) * bytesPerPixel;\n const rgba = this.pixelFormat.decodePixel(\n data.subarray(srcIndex, srcIndex + bytesPerPixel),\n );\n const dstIndex = ((y + row) * this.width + x + col) * 4;\n this.framebuffer.set(rgba, dstIndex);\n }\n }\n }\n}\n\nexport class Desktop {\n private session: DesktopSession<TunnelByteStream>;\n private readonly connectRequest: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n };\n private operationChain: Promise<void> = Promise.resolve();\n private reconnectPromise: Promise<void> | null = null;\n private closed = false;\n\n private constructor(\n session: DesktopSession<TunnelByteStream>,\n connectRequest: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n },\n ) {\n this.session = session;\n this.connectRequest = connectRequest;\n }\n\n static async connect(options: DesktopConnectRequest): Promise<Desktop> {\n const connectRequest = normalizeDesktopConnectRequest(options);\n const session = await openDesktopSession(connectRequest);\n return new Desktop(session, connectRequest);\n }\n\n get width(): number {\n return this.session.width;\n }\n\n get height(): number {\n return this.session.height;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n await this.enqueue(() => this.session.close());\n }\n\n async screenshot(timeout = 5): Promise<Uint8Array> {\n return this.enqueue(() => this.captureScreenshot(timeout));\n }\n\n getFrameVersion(): number {\n return this.session.getFrameVersion();\n }\n\n async screenshotAfter(frameVersion: number, timeout = 1): Promise<Uint8Array> {\n return this.enqueue(() => this.captureScreenshotAfter(frameVersion, timeout));\n }\n\n async moveMouse(x: number, y: number): Promise<void> {\n await this.enqueue(() => this.session.moveMouse(x, y));\n }\n\n async mousePress(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.mousePress(options));\n }\n\n async mouseRelease(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.mouseRelease(options));\n }\n\n async click(options?: DesktopPointerOptions): Promise<void> {\n await this.enqueue(() => this.session.click(options));\n }\n\n async doubleClick(options?: DesktopDoubleClickOptions): Promise<void> {\n await this.enqueue(() => this.session.doubleClick(options));\n }\n\n async leftClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"left\", x, y });\n }\n\n async middleClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"middle\", x, y });\n }\n\n async rightClick(x?: number, y?: number): Promise<void> {\n await this.click({ button: \"right\", x, y });\n }\n\n async scroll(steps: number, x?: number, y?: number): Promise<void> {\n await this.enqueue(() => this.session.scroll(steps, x, y));\n }\n\n async scrollUp(steps = 1, x?: number, y?: number): Promise<void> {\n await this.scroll(Math.abs(steps), x, y);\n }\n\n async scrollDown(steps = 1, x?: number, y?: number): Promise<void> {\n await this.scroll(-Math.abs(steps), x, y);\n }\n\n async keyDown(key: string): Promise<void> {\n await this.enqueue(() => this.session.keyDown(key));\n }\n\n async keyUp(key: string): Promise<void> {\n await this.enqueue(() => this.session.keyUp(key));\n }\n\n async press(keys: string | string[]): Promise<void> {\n await this.enqueue(() => this.session.press(keys));\n }\n\n async typeText(text: string): Promise<void> {\n await this.enqueue(() => this.session.typeText(text));\n }\n\n private enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const run = this.operationChain.catch(() => {}).then(operation);\n this.operationChain = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n\n private async captureScreenshot(timeout: number): Promise<Uint8Array> {\n try {\n return await this.session.screenshot(timeout);\n } catch (error) {\n if (!isReconnectableDesktopScreenshotError(error) || this.closed) {\n throw error;\n }\n\n await this.reconnect();\n return this.session.screenshot(timeout);\n }\n }\n\n private async captureScreenshotAfter(\n frameVersion: number,\n timeout: number,\n ): Promise<Uint8Array> {\n try {\n return await this.session.screenshotAfter(frameVersion, timeout);\n } catch (error) {\n if (!isReconnectableDesktopScreenshotError(error) || this.closed) {\n throw error;\n }\n\n await this.reconnect();\n return this.session.screenshot(timeout);\n }\n }\n\n private async reconnect(): Promise<void> {\n if (this.reconnectPromise) {\n return this.reconnectPromise;\n }\n\n this.reconnectPromise = this.performReconnect().finally(() => {\n this.reconnectPromise = null;\n });\n return this.reconnectPromise;\n }\n\n private async performReconnect(): Promise<void> {\n const previousSession = this.session;\n await previousSession.close().catch(() => {});\n this.session = await openDesktopSession(this.connectRequest);\n }\n}\n\nclass ProtocolVersion {\n readonly major: number;\n readonly minor: number;\n\n constructor(major: number, minor: number) {\n this.major = major;\n this.minor = minor;\n }\n\n static async read(transport: DesktopTransport): Promise<ProtocolVersion> {\n const raw = await transport.readExactly(12);\n const text = raw.toString(\"ascii\");\n const trimmed = text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n const match = /^RFB (\\d{3})\\.(\\d{3})$/.exec(trimmed);\n if (!match) {\n throw new SandboxError(`invalid VNC protocol banner \\`${text}\\``);\n }\n return new ProtocolVersion(Number.parseInt(match[1], 10), Number.parseInt(match[2], 10));\n }\n\n negotiated(): ProtocolVersion {\n if (this.major !== 3 || this.minor >= 8) {\n return new ProtocolVersion(3, 8);\n }\n if (this.minor >= 7) {\n return new ProtocolVersion(3, 7);\n }\n return new ProtocolVersion(3, 3);\n }\n\n render(): string {\n return `RFB ${String(this.major).padStart(3, \"0\")}.${String(this.minor).padStart(3, \"0\")}\\n`;\n }\n}\n\nclass PixelFormat {\n readonly bitsPerPixel: number;\n readonly depth: number;\n readonly bigEndian: boolean;\n readonly trueColor: boolean;\n readonly redMax: number;\n readonly greenMax: number;\n readonly blueMax: number;\n readonly redShift: number;\n readonly greenShift: number;\n readonly blueShift: number;\n\n constructor(options: {\n bitsPerPixel: number;\n depth: number;\n bigEndian: boolean;\n trueColor: boolean;\n redMax: number;\n greenMax: number;\n blueMax: number;\n redShift: number;\n greenShift: number;\n blueShift: number;\n }) {\n this.bitsPerPixel = options.bitsPerPixel;\n this.depth = options.depth;\n this.bigEndian = options.bigEndian;\n this.trueColor = options.trueColor;\n this.redMax = options.redMax;\n this.greenMax = options.greenMax;\n this.blueMax = options.blueMax;\n this.redShift = options.redShift;\n this.greenShift = options.greenShift;\n this.blueShift = options.blueShift;\n }\n\n static preferred(): PixelFormat {\n return new PixelFormat({\n bitsPerPixel: 32,\n depth: 24,\n bigEndian: false,\n trueColor: true,\n redMax: 255,\n greenMax: 255,\n blueMax: 255,\n redShift: 16,\n greenShift: 8,\n blueShift: 0,\n });\n }\n\n static parse(bytes: Uint8Array): PixelFormat {\n if (bytes.length !== 16) {\n throw new SandboxError(\"invalid VNC pixel format payload length\");\n }\n return new PixelFormat({\n bitsPerPixel: bytes[0],\n depth: bytes[1],\n bigEndian: bytes[2] !== 0,\n trueColor: bytes[3] !== 0,\n redMax: Buffer.from(bytes.subarray(4, 6)).readUInt16BE(0),\n greenMax: Buffer.from(bytes.subarray(6, 8)).readUInt16BE(0),\n blueMax: Buffer.from(bytes.subarray(8, 10)).readUInt16BE(0),\n redShift: bytes[10],\n greenShift: bytes[11],\n blueShift: bytes[12],\n });\n }\n\n bytesPerPixel(): number {\n return this.bitsPerPixel / 8;\n }\n\n encode(): Uint8Array {\n const bytes = Buffer.alloc(16);\n bytes[0] = this.bitsPerPixel;\n bytes[1] = this.depth;\n bytes[2] = this.bigEndian ? 1 : 0;\n bytes[3] = this.trueColor ? 1 : 0;\n bytes.writeUInt16BE(this.redMax, 4);\n bytes.writeUInt16BE(this.greenMax, 6);\n bytes.writeUInt16BE(this.blueMax, 8);\n bytes[10] = this.redShift;\n bytes[11] = this.greenShift;\n bytes[12] = this.blueShift;\n return bytes;\n }\n\n decodePixel(bytes: Uint8Array): Uint8Array {\n if (bytes.length !== this.bytesPerPixel()) {\n throw new SandboxError(\"desktop pixel buffer has an unexpected size\");\n }\n\n let value = 0;\n if (this.bigEndian) {\n for (const byte of bytes) {\n value = (value << 8) | byte;\n }\n } else {\n for (let index = 0; index < bytes.length; index += 1) {\n value |= bytes[index] << (index * 8);\n }\n }\n\n const red = scaleChannel((value >> this.redShift) & this.redMax, this.redMax);\n const green = scaleChannel(\n (value >> this.greenShift) & this.greenMax,\n this.greenMax,\n );\n const blue = scaleChannel((value >> this.blueShift) & this.blueMax, this.blueMax);\n return Uint8Array.of(red, green, blue, 255);\n }\n}\n\nclass ServerInit {\n readonly width: number;\n readonly height: number;\n readonly pixelFormat: PixelFormat;\n\n constructor(width: number, height: number, pixelFormat: PixelFormat) {\n this.width = width;\n this.height = height;\n this.pixelFormat = pixelFormat;\n }\n\n static async read(transport: DesktopTransport): Promise<ServerInit> {\n const width = await readU16(transport);\n const height = await readU16(transport);\n const pixelFormat = PixelFormat.parse(await transport.readExactly(16));\n const nameLength = await readU32(transport);\n await transport.readExactly(nameLength);\n return new ServerInit(width, height, pixelFormat);\n }\n}\n\nasync function negotiateSecurity(\n transport: DesktopTransport,\n version: ProtocolVersion,\n password?: string,\n): Promise<number> {\n let securityTypes: number[];\n\n if (version.minor === 3) {\n const securityType = await readU32(transport);\n if (securityType === 0) {\n const reasonLength = await readU32(transport);\n const reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n }\n securityTypes = [securityType];\n } else {\n const count = await readU8(transport);\n if (count === 0) {\n const reasonLength = await readU32(transport);\n const reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n }\n securityTypes = [...(await transport.readExactly(count))];\n }\n\n let selected: number;\n if (password != null && securityTypes.includes(SECURITY_TYPE_VNC_AUTH)) {\n selected = SECURITY_TYPE_VNC_AUTH;\n } else if (securityTypes.includes(SECURITY_TYPE_NONE)) {\n selected = SECURITY_TYPE_NONE;\n } else if (securityTypes.includes(SECURITY_TYPE_VNC_AUTH)) {\n throw new SandboxError(\n \"VNC server requires password authentication but no password was provided\",\n );\n } else {\n throw new SandboxError(\n `unsupported VNC security types advertised by server: [${securityTypes.join(\", \")}]`,\n );\n }\n\n if (version.minor >= 7) {\n await transport.writeAll(Uint8Array.of(selected));\n }\n\n if (selected === SECURITY_TYPE_VNC_AUTH) {\n if (password == null) {\n throw new SandboxError(\n \"VNC server requires password authentication but no password was provided\",\n );\n }\n const challenge = await transport.readExactly(16);\n const response = encryptVncChallenge(Buffer.from(password, \"utf8\"), challenge);\n await transport.writeAll(response);\n await readSecurityResult(transport, version.minor >= 8);\n } else if (version.minor >= 8) {\n await readSecurityResult(transport, true);\n }\n\n return selected;\n}\n\nfunction encryptVncChallenge(password: Uint8Array, challenge: Uint8Array): Uint8Array {\n if (challenge.length !== 16) {\n throw new SandboxError(\"VNC authentication challenge must be 16 bytes\");\n }\n\n const key = Buffer.alloc(8);\n for (let index = 0; index < Math.min(password.length, 8); index += 1) {\n key[index] = reverseBits(password[index]);\n }\n\n const roundKeys = buildDesRoundKeys(key);\n const output = Buffer.alloc(16);\n for (let blockIndex = 0; blockIndex < 2; blockIndex += 1) {\n const start = blockIndex * 8;\n const encrypted = encryptDesBlock(challenge.subarray(start, start + 8), roundKeys);\n output.set(encrypted, start);\n }\n return output;\n}\n\nfunction reverseBits(value: number): number {\n let reversed = 0;\n for (let bit = 0; bit < 8; bit += 1) {\n reversed |= ((value >> bit) & 1) << (7 - bit);\n }\n return reversed;\n}\n\nasync function readSecurityResult(\n transport: DesktopTransport,\n hasReasonString: boolean,\n): Promise<void> {\n const status = await readU32(transport);\n if (status === 0) {\n return;\n }\n\n let reason: string;\n if (hasReasonString) {\n const reasonLength = await readU32(transport);\n reason = (await transport.readExactly(reasonLength)).toString(\"utf8\");\n } else if (status === 1) {\n reason = \"authentication failed\";\n } else {\n reason = `security handshake failed with status ${status}`;\n }\n\n throw new SandboxError(`VNC security negotiation failed: ${reason}`);\n}\n\nasync function sendSetPixelFormat(\n transport: DesktopTransport,\n pixelFormat: PixelFormat,\n): Promise<void> {\n const message = Buffer.alloc(20);\n message[0] = 0;\n message.set(pixelFormat.encode(), 4);\n await transport.writeAll(message);\n}\n\nasync function sendSetEncodings(\n transport: DesktopTransport,\n encodings: number[],\n): Promise<void> {\n const message = Buffer.alloc(4 + encodings.length * 4);\n message[0] = 2;\n message.writeUInt16BE(encodings.length, 2);\n for (let index = 0; index < encodings.length; index += 1) {\n message.writeInt32BE(encodings[index], 4 + index * 4);\n }\n await transport.writeAll(message);\n}\n\nasync function sendFramebufferUpdateRequest(\n transport: DesktopTransport,\n incremental: boolean,\n x: number,\n y: number,\n width: number,\n height: number,\n): Promise<void> {\n const message = Buffer.alloc(10);\n message[0] = 3;\n message[1] = incremental ? 1 : 0;\n message.writeUInt16BE(x, 2);\n message.writeUInt16BE(y, 4);\n message.writeUInt16BE(width, 6);\n message.writeUInt16BE(height, 8);\n await transport.writeAll(message);\n}\n\nasync function sendPointerEvent(\n transport: DesktopTransport,\n buttonMask: number,\n x: number,\n y: number,\n): Promise<void> {\n const message = Buffer.alloc(6);\n message[0] = 5;\n message[1] = buttonMask;\n message.writeUInt16BE(x, 2);\n message.writeUInt16BE(y, 4);\n await transport.writeAll(message);\n}\n\nasync function sendKeyEvent(\n transport: DesktopTransport,\n down: boolean,\n keysym: number,\n): Promise<void> {\n const message = Buffer.alloc(8);\n message[0] = 4;\n message[1] = down ? 1 : 0;\n message.writeUInt32BE(keysym, 4);\n await transport.writeAll(message);\n}\n\nasync function readU8(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(1))[0];\n}\n\nasync function readU16(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(2)).readUInt16BE(0);\n}\n\nasync function readU32(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(4)).readUInt32BE(0);\n}\n\nasync function readI32(transport: DesktopTransport): Promise<number> {\n return (await transport.readExactly(4)).readInt32BE(0);\n}\n\nfunction scaleChannel(value: number, max: number): number {\n if (max === 0) {\n throw new SandboxError(\"invalid VNC pixel format with zero channel range\");\n }\n return Math.trunc((value * 255) / max);\n}\n\nfunction allocateFramebuffer(width: number, height: number): Uint8Array {\n return new Uint8Array(width * height * 4);\n}\n\nfunction normalizeDesktopConnectRequest(\n options: DesktopConnectRequest,\n): DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n} {\n return {\n ...options,\n port: validatePort(options.port ?? 5901, \"desktop port\"),\n shared: options.shared ?? true,\n connectTimeout: options.connectTimeout ?? 10,\n };\n}\n\nasync function openDesktopSession(\n options: DesktopConnectRequest & {\n port: number;\n shared: boolean;\n connectTimeout: number;\n },\n): Promise<DesktopSession<TunnelByteStream>> {\n const connectTimeoutMs = secondsToMillis(options.connectTimeout);\n const state: { transport?: TunnelByteStream } = {};\n\n try {\n return await withTimeout(\n connectTimeoutMs,\n async () => {\n state.transport = await TunnelByteStream.connect({\n baseUrl: options.baseUrl,\n wsHeaders: options.wsHeaders,\n remotePort: options.port,\n connectTimeoutMs,\n });\n return DesktopSession.connect(\n state.transport,\n options.password,\n options.shared,\n );\n },\n `timed out while connecting desktop session after ${options.connectTimeout.toFixed(2)}s`,\n );\n } catch (error) {\n if (state.transport) {\n await state.transport.close().catch(() => {});\n }\n throw error;\n }\n}\n\nfunction isReconnectableDesktopScreenshotError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const message = error.message.toLowerCase();\n return (\n message.includes(\"desktop tunnel closed unexpectedly\") ||\n message.includes(\"desktop tunnel is not connected\") ||\n message.includes(\"connection closed\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"timed out waiting for initial desktop framebuffer\") ||\n message.includes(\"timed out while connecting tunnel websocket\") ||\n message.includes(\"tunnel websocket closed before opening\") ||\n message.includes(\"tunnel websocket handshake failed\")\n );\n}\n\nfunction createDeferredSignal(): {\n resolve(): void;\n wait(): Promise<void>;\n} {\n let resolveCurrent!: () => void;\n let promise = new Promise<void>((resolve) => {\n resolveCurrent = resolve;\n });\n\n return {\n resolve() {\n resolveCurrent();\n promise = new Promise<void>((resolve) => {\n resolveCurrent = resolve;\n });\n },\n wait() {\n return promise;\n },\n };\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new SandboxError(String(error));\n}\n\nfunction buttonMask(button: MouseButton | string): number {\n const normalized = button.trim().toLowerCase();\n if (normalized === \"left\") return BUTTON_LEFT_MASK;\n if (normalized === \"middle\") return BUTTON_MIDDLE_MASK;\n if (normalized === \"right\") return BUTTON_RIGHT_MASK;\n throw new SandboxError(\n `unsupported mouse button \\`${button}\\`; expected left, middle, or right`,\n );\n}\n\nfunction keysymFromKeyName(key: string): number {\n const trimmed = key.trim();\n if (trimmed.length === 0) {\n throw new SandboxError(\"desktop key name cannot be empty\");\n }\n\n if ([...trimmed].length === 1) {\n return keysymFromChar(trimmed);\n }\n\n const normalized = trimmed.toLowerCase();\n const special = SPECIAL_KEYSYMS.get(normalized);\n if (special != null) {\n return special;\n }\n\n const functionMatch = /^f([1-9]|1[0-2])$/.exec(normalized);\n if (functionMatch) {\n return 0xffbd + Number.parseInt(functionMatch[1], 10);\n }\n\n throw new SandboxError(`unsupported desktop key \\`${trimmed}\\``);\n}\n\nfunction keysymFromChar(char: string): number {\n const codePoint = char.codePointAt(0);\n if (codePoint == null) {\n throw new SandboxError(\"desktop key name cannot be empty\");\n }\n if (char === \"\\n\" || char === \"\\r\") return 0xff0d;\n if (char === \"\\t\") return 0xff09;\n if (char === \"\\b\") return 0xff08;\n if (codePoint >= 0x20 && codePoint <= 0x7e) return codePoint;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint <= 0x9f)) {\n throw new SandboxError(\n `unsupported control character U+${codePoint.toString(16).toUpperCase().padStart(4, \"0\")} for desktop typing`,\n );\n }\n return 0x0100_0000 | codePoint;\n}\n\nfunction encodePng(width: number, height: number, rgba: Uint8Array): Uint8Array {\n const stride = width * 4;\n const raw = Buffer.alloc((stride + 1) * height);\n for (let row = 0; row < height; row += 1) {\n const srcOffset = row * stride;\n const dstOffset = row * (stride + 1);\n raw[dstOffset] = 0;\n raw.set(rgba.subarray(srcOffset, srcOffset + stride), dstOffset + 1);\n }\n\n const ihdr = Buffer.alloc(13);\n ihdr.writeUInt32BE(width, 0);\n ihdr.writeUInt32BE(height, 4);\n ihdr[8] = 8;\n ihdr[9] = 6;\n ihdr[10] = 0;\n ihdr[11] = 0;\n ihdr[12] = 0;\n\n const idat = deflateSync(raw);\n return Buffer.concat([\n PNG_SIGNATURE,\n pngChunk(\"IHDR\", ihdr),\n pngChunk(\"IDAT\", idat),\n pngChunk(\"IEND\", Buffer.alloc(0)),\n ]);\n}\n\nfunction pngChunk(type: string, data: Buffer): Buffer {\n const chunkType = Buffer.from(type, \"ascii\");\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length, 0);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(Buffer.concat([chunkType, data])), 0);\n return Buffer.concat([length, chunkType, data, crc]);\n}\n\nfunction crc32(data: Uint8Array): number {\n let crc = 0xffff_ffff;\n for (const byte of data) {\n crc = CRC32_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffff_ffff) >>> 0;\n}\n\nfunction buildCrc32Table(): Uint32Array {\n const table = new Uint32Array(256);\n for (let index = 0; index < 256; index += 1) {\n let value = index;\n for (let bit = 0; bit < 8; bit += 1) {\n value = (value & 1) !== 0 ? 0xedb8_8320 ^ (value >>> 1) : value >>> 1;\n }\n table[index] = value >>> 0;\n }\n return table;\n}\n\nfunction validateCoordinate(value: number, label: string): number {\n return validateIntegerInRange(value, label, 0, 0xffff);\n}\n\nfunction validatePort(value: number, label: string): number {\n return validateIntegerInRange(value, label, 1, 65535);\n}\n\nfunction validateIntegerInRange(\n value: number,\n label: string,\n min: number,\n max: number,\n): number {\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new SandboxError(`${label} must be an integer between ${min} and ${max}, got ${value}`);\n }\n return value;\n}\n\nfunction validateInteger(value: number, label: string): number {\n if (!Number.isInteger(value)) {\n throw new SandboxError(`${label} must be an integer, got ${value}`);\n }\n return value;\n}\n\nfunction validateNonNegativeInteger(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new SandboxError(`${label} must be a non-negative integer, got ${value}`);\n }\n return value;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds < 0) {\n throw new SandboxError(`timeout must be >= 0 seconds, got ${seconds}`);\n }\n return Math.round(seconds * 1000);\n}\n\nconst SPECIAL_KEYSYMS = new Map<string, number>([\n [\"enter\", 0xff0d],\n [\"tab\", 0xff09],\n [\"escape\", 0xff1b],\n [\"backspace\", 0xff08],\n [\"delete\", 0xffff],\n [\"space\", 0x0020],\n [\"up\", 0xff52],\n [\"down\", 0xff54],\n [\"left\", 0xff51],\n [\"right\", 0xff53],\n [\"home\", 0xff50],\n [\"end\", 0xff57],\n [\"pageup\", 0xff55],\n [\"pagedown\", 0xff56],\n [\"page_up\", 0xff55],\n [\"page_down\", 0xff56],\n [\"shift\", 0xffe1],\n [\"ctrl\", 0xffe3],\n [\"control\", 0xffe3],\n [\"alt\", 0xffe9],\n [\"meta\", 0xffe7],\n]);\n\nconst DES_INITIAL_PERMUTATION = [\n 58, 50, 42, 34, 26, 18, 10, 2,\n 60, 52, 44, 36, 28, 20, 12, 4,\n 62, 54, 46, 38, 30, 22, 14, 6,\n 64, 56, 48, 40, 32, 24, 16, 8,\n 57, 49, 41, 33, 25, 17, 9, 1,\n 59, 51, 43, 35, 27, 19, 11, 3,\n 61, 53, 45, 37, 29, 21, 13, 5,\n 63, 55, 47, 39, 31, 23, 15, 7,\n];\n\nconst DES_FINAL_PERMUTATION = [\n 40, 8, 48, 16, 56, 24, 64, 32,\n 39, 7, 47, 15, 55, 23, 63, 31,\n 38, 6, 46, 14, 54, 22, 62, 30,\n 37, 5, 45, 13, 53, 21, 61, 29,\n 36, 4, 44, 12, 52, 20, 60, 28,\n 35, 3, 43, 11, 51, 19, 59, 27,\n 34, 2, 42, 10, 50, 18, 58, 26,\n 33, 1, 41, 9, 49, 17, 57, 25,\n];\n\nconst DES_EXPANSION = [\n 32, 1, 2, 3, 4, 5,\n 4, 5, 6, 7, 8, 9,\n 8, 9, 10, 11, 12, 13,\n 12, 13, 14, 15, 16, 17,\n 16, 17, 18, 19, 20, 21,\n 20, 21, 22, 23, 24, 25,\n 24, 25, 26, 27, 28, 29,\n 28, 29, 30, 31, 32, 1,\n];\n\nconst DES_P_PERMUTATION = [\n 16, 7, 20, 21,\n 29, 12, 28, 17,\n 1, 15, 23, 26,\n 5, 18, 31, 10,\n 2, 8, 24, 14,\n 32, 27, 3, 9,\n 19, 13, 30, 6,\n 22, 11, 4, 25,\n];\n\nconst DES_PC1 = [\n 57, 49, 41, 33, 25, 17, 9,\n 1, 58, 50, 42, 34, 26, 18,\n 10, 2, 59, 51, 43, 35, 27,\n 19, 11, 3, 60, 52, 44, 36,\n 63, 55, 47, 39, 31, 23, 15,\n 7, 62, 54, 46, 38, 30, 22,\n 14, 6, 61, 53, 45, 37, 29,\n 21, 13, 5, 28, 20, 12, 4,\n];\n\nconst DES_PC2 = [\n 14, 17, 11, 24, 1, 5,\n 3, 28, 15, 6, 21, 10,\n 23, 19, 12, 4, 26, 8,\n 16, 7, 27, 20, 13, 2,\n 41, 52, 31, 37, 47, 55,\n 30, 40, 51, 45, 33, 48,\n 44, 49, 39, 56, 34, 53,\n 46, 42, 50, 36, 29, 32,\n];\n\nconst DES_ROTATIONS = [\n 1, 1, 2, 2, 2, 2, 2, 2,\n 1, 2, 2, 2, 2, 2, 2, 1,\n];\n\nconst DES_SBOXES = [\n [\n 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,\n 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,\n 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,\n 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,\n ],\n [\n 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,\n 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,\n 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,\n 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,\n ],\n [\n 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,\n 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,\n 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,\n 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,\n ],\n [\n 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,\n 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,\n 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,\n 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,\n ],\n [\n 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,\n 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,\n 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,\n 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,\n ],\n [\n 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,\n 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,\n 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,\n 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,\n ],\n [\n 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,\n 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,\n 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,\n 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,\n ],\n [\n 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,\n 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,\n 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,\n 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,\n ],\n];\n\nfunction buildDesRoundKeys(key: Uint8Array): bigint[] {\n const keyBlock = bytesToBigInt(key);\n const permuted = permuteBits(keyBlock, DES_PC1, 64);\n let c = Number((permuted >> 28n) & 0x0fff_ffffn);\n let d = Number(permuted & 0x0fff_ffffn);\n\n const roundKeys: bigint[] = [];\n for (const rotation of DES_ROTATIONS) {\n c = rotateLeft28(c, rotation);\n d = rotateLeft28(d, rotation);\n const combined = (BigInt(c) << 28n) | BigInt(d);\n roundKeys.push(permuteBits(combined, DES_PC2, 56));\n }\n return roundKeys;\n}\n\nfunction encryptDesBlock(block: Uint8Array, roundKeys: bigint[]): Uint8Array {\n let value = permuteBits(bytesToBigInt(block), DES_INITIAL_PERMUTATION, 64);\n let left = Number((value >> 32n) & 0xffff_ffffn);\n let right = Number(value & 0xffff_ffffn);\n\n for (const roundKey of roundKeys) {\n const nextLeft = right;\n const nextRight = (left ^ feistel(right, roundKey)) >>> 0;\n left = nextLeft >>> 0;\n right = nextRight;\n }\n\n value = (BigInt(right) << 32n) | BigInt(left);\n return bigIntToBytes(permuteBits(value, DES_FINAL_PERMUTATION, 64), 8);\n}\n\nfunction feistel(right: number, roundKey: bigint): number {\n const expanded = permuteBits(BigInt(right >>> 0), DES_EXPANSION, 32) ^ roundKey;\n let output = 0;\n for (let index = 0; index < 8; index += 1) {\n const shift = BigInt((7 - index) * 6);\n const chunk = Number((expanded >> shift) & 0x3fn);\n const row = ((chunk & 0x20) >> 4) | (chunk & 0x01);\n const column = (chunk >> 1) & 0x0f;\n output = (output << 4) | DES_SBOXES[index][row * 16 + column];\n }\n return Number(permuteBits(BigInt(output >>> 0), DES_P_PERMUTATION, 32)) >>> 0;\n}\n\nfunction rotateLeft28(value: number, shift: number): number {\n const masked = value & 0x0fff_ffff;\n return ((masked << shift) | (masked >>> (28 - shift))) & 0x0fff_ffff;\n}\n\nfunction permuteBits(input: bigint, table: number[], inputBits: number): bigint {\n let output = 0n;\n for (const position of table) {\n const shift = BigInt(inputBits - position);\n output = (output << 1n) | ((input >> shift) & 1n);\n }\n return output;\n}\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n return value;\n}\n\nfunction bigIntToBytes(value: bigint, length: number): Uint8Array {\n const out = Buffer.alloc(length);\n let remaining = value;\n for (let index = length - 1; index >= 0; index -= 1) {\n out[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return out;\n}\n","const SDK_TIMINGS_ENV_VAR = \"TENSORLAKE_SDK_TIMINGS\";\nconst SDK_TIMING_PAYLOADS_ENV_VAR = \"TENSORLAKE_SDK_TIMING_PAYLOADS\";\n\nexport type SdkTimingFields = Record<string, string | number | boolean | null | undefined>;\n\nexport function sdkTimingsEnabled(): boolean {\n const value = process.env[SDK_TIMINGS_ENV_VAR];\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function sdkTimingPayloadsEnabled(): boolean {\n const value = process.env[SDK_TIMING_PAYLOADS_ENV_VAR];\n return value === \"1\" || value === \"true\" || value === \"yes\";\n}\n\nexport function nowMs(): number {\n return performance.now();\n}\n\nexport function logSdkTiming(\n op: string,\n phase: string,\n startedAt: number,\n fields: SdkTimingFields = {},\n): void {\n if (!sdkTimingsEnabled()) return;\n logSdkTimingEvent(op, phase, {\n ...fields,\n duration_ms: Math.round((nowMs() - startedAt) * 100) / 100,\n });\n}\n\nexport function logSdkTimingEvent(\n op: string,\n phase: string,\n fields: SdkTimingFields = {},\n): void {\n if (!sdkTimingsEnabled()) return;\n\n const parts = [\n \"[tensorlake:sdk-timing]\",\n `op=${op}`,\n `phase=${phase}`,\n ];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value == null) continue;\n parts.push(`${key}=${formatSdkTimingValue(value)}`);\n }\n\n console.error(parts.join(\" \"));\n}\n\nfunction formatSdkTimingValue(value: string | number | boolean): string {\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (/^[A-Za-z0-9_./:@-]+$/.test(value)) {\n return value;\n }\n return JSON.stringify(value);\n}\n","import * as defaults from \"./defaults.js\";\n\n/** Remove a trailing slash from a URL string if present. */\nfunction trimTrailingSlashes(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\n/** Check whether a URL points to localhost. */\nexport function isLocalhost(apiUrl: string): boolean {\n try {\n const parsed = new URL(apiUrl);\n return parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\";\n } catch {\n return false;\n }\n}\n\n/** Return the explicit sandbox proxy env override, if the user set one. */\nexport function explicitProxyUrlOverride(): string | undefined {\n const explicit = process.env.TENSORLAKE_SANDBOX_PROXY_URL?.trim();\n return explicit && explicit.length > 0 ? explicit : undefined;\n}\n\n/**\n * Resolve the legacy default proxy URL for direct sandbox handles.\n *\n * Normal client connect/create flows use the server-returned `sandboxUrl`.\n * This helper keeps the old direct-handle behavior and treats the env var as\n * an explicit override.\n *\n * Legacy priority:\n * 1. TENSORLAKE_SANDBOX_PROXY_URL env var\n * 2. `http://localhost:9443` for localhost API URLs\n * 3. Transform `api.X` → `sandbox.X`\n * 4. Default fallback\n */\nexport function resolveProxyUrl(apiUrl: string): string {\n const explicit = explicitProxyUrlOverride();\n if (explicit) return explicit;\n\n if (isLocalhost(apiUrl)) return \"http://localhost:9443\";\n\n try {\n const parsed = new URL(apiUrl);\n const host = parsed.hostname;\n if (host.startsWith(\"api.\")) {\n const proxyHost = \"sandbox.\" + host.slice(4);\n return `${parsed.protocol}//${proxyHost}`;\n }\n } catch {\n // fall through to default\n }\n\n return defaults.SANDBOX_PROXY_URL;\n}\n\n/**\n * Resolve the proxy target for a specific sandbox.\n *\n * - Localhost: base URL stays the same, Host header set to `{sandboxId}.local`\n * - Cloud: selected proxy domain with `X-Tensorlake-Sandbox-Id` header\n *\n * Returns `{ baseUrl, hostHeader, sandboxIdHeader }`.\n */\nexport function resolveProxyTarget(\n proxyUrl: string,\n sandboxId: string,\n): { baseUrl: string; hostHeader: string | undefined; sandboxIdHeader: string | undefined } {\n try {\n const parsed = new URL(proxyUrl);\n const host = parsed.hostname;\n\n if (host === \"localhost\" || host === \"127.0.0.1\") {\n return {\n baseUrl: trimTrailingSlashes(proxyUrl),\n hostHeader: `${sandboxId}.local`,\n sandboxIdHeader: undefined,\n };\n }\n\n const port = parsed.port ? `:${parsed.port}` : \"\";\n return {\n baseUrl: `${parsed.protocol}//${host}${port}`,\n hostHeader: undefined,\n sandboxIdHeader: sandboxId,\n };\n } catch {\n return {\n baseUrl: `${trimTrailingSlashes(proxyUrl)}/${sandboxId}`,\n hostHeader: undefined,\n sandboxIdHeader: undefined,\n };\n }\n}\n\n/**\n * Build a public sandbox URL from a server-provided ingress endpoint.\n *\n * `port` omitted or `9501` returns the management URL:\n * `https://<sandbox-id>.<ingress-host>`. User ports use the public\n * `<port>-<sandbox-id>.<ingress-host>` form.\n */\nexport function sandboxUrlFromIngressEndpoint(\n ingressEndpoint: string,\n sandboxId: string,\n port = 9501,\n): string {\n const parsed = new URL(ingressEndpoint);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"ingressEndpoint must be an absolute http(s) URL\");\n }\n const label = port === 9501 ? sandboxId : `${port}-${sandboxId}`;\n return `${parsed.protocol}//${label}.${parsed.host}`;\n}\n\n/**\n * Derive the sandbox lifecycle URL from the API URL.\n *\n * Transforms `api.X` → `sandbox.X` for cloud. Returns the URL unchanged for\n * localhost or unrecognised patterns.\n */\nexport function resolveSandboxLifecycleUrl(apiUrl: string): string {\n if (isLocalhost(apiUrl)) return apiUrl;\n\n try {\n const parsed = new URL(apiUrl);\n if (parsed.hostname.startsWith(\"api.\")) {\n parsed.hostname = \"sandbox.\" + parsed.hostname.slice(4);\n return parsed.toString().replace(/\\/$/, \"\");\n }\n } catch {\n // fall through\n }\n\n return apiUrl;\n}\n\n/**\n * Build a lifecycle API path.\n *\n * - Localhost (namespaced): `/v1/namespaces/{namespace}/{path}`\n * - Cloud (flat): `/{path}`\n */\nexport function lifecyclePath(\n path: string,\n isLocal: boolean,\n namespace: string,\n): string {\n if (isLocal) {\n return `/v1/namespaces/${namespace}/${path}`;\n }\n return `/${path}`;\n}\n","import type { SandboxClient } from \"./client.js\";\nimport {\n type ConnectDesktopOptions,\n Desktop,\n} from \"./desktop.js\";\nimport { SandboxError } from \"./errors.js\";\nimport { type Traced } from \"./http.js\";\nimport {\n assembleCommandResult,\n callNative,\n loadNativeSandboxBinding,\n nativeEventStream,\n type NativeSandboxProxyClient,\n} from \"./native-sandbox.js\";\nimport {\n type CheckpointOptions,\n type CommandResult,\n type ConnectOptions,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type CreateAndConnectOptions,\n type CreatePtySessionOptions,\n type DaemonInfo,\n type DirectoryEntry,\n type GetSandboxLogsOptions,\n type HealthResponse,\n type ListDirectoryResponse,\n type OutputEvent,\n type OutputResponse,\n OutputMode,\n type ProcessInfo,\n type ProcessUser,\n type PtySessionInfo,\n type RunOptions,\n type SandboxClientOptions,\n type SandboxInfo,\n type SandboxLogsResponse,\n type SandboxOptions,\n type SandboxProcessLogFiltersResponse,\n type SendSignalResponse,\n type FileSystemMount,\n type SnapshotInfo,\n type StartProcessOptions,\n SandboxStatus,\n StdinMode,\n type SuspendResumeOptions,\n type UpdateSandboxOptions,\n fromSnakeKeys,\n toSnakeKeys,\n} from \"./models.js\";\nimport {\n type CreateTunnelOptions,\n TcpTunnel,\n} from \"./tunnel.js\";\nimport { nowMs, logSdkTimingEvent, sdkTimingPayloadsEnabled, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride, resolveProxyTarget } from \"./url.js\";\nimport WebSocket, { type RawData } from \"ws\";\n\nclass SandboxProxyConnection {\n baseUrl = \"\";\n wsHeaders: Record<string, string> = {};\n\n private nativeProxy: NativeSandboxProxyClient | null = null;\n private resolveProxyInfo?: (\n identifier: string,\n ) => Promise<Traced<SandboxInfo>>;\n private resolvePromise: Promise<void> | null = null;\n private routingHint?: string;\n private readonly optionRoutingHint?: string;\n private readonly explicitProxyUrl?: string;\n private resolveGeneration = 0;\n\n constructor(\n private readonly sandbox: Sandbox,\n private readonly options: SandboxOptions,\n ) {\n this.routingHint = options.routingHint;\n this.optionRoutingHint = options.routingHint;\n this.explicitProxyUrl = options.explicitProxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n this.resolveProxyInfo = options.resolveProxyInfo;\n if (options.proxyUrl != null) {\n this.nativeProxy = this.configureProxy(\n options.proxyUrl,\n options.sandboxId,\n options.routingHint,\n );\n } else if (this.resolveProxyInfo == null) {\n throw new SandboxError(\n \"proxyUrl is required for direct Sandbox construction; use Sandbox.connect(...) or SandboxClient.connect(...) to use the server-returned sandbox_url.\",\n );\n }\n }\n\n async ensureResolved(): Promise<void> {\n if (this.nativeProxy != null) {\n return;\n }\n if (this.resolveProxyInfo == null) {\n return;\n }\n if (this.resolvePromise != null) {\n return this.resolvePromise;\n }\n\n const identifier = this.sandbox._getLifecycleIdentifier();\n const resolveStart = nowMs();\n logSdkTimingEvent(\"sandbox.proxy\", \"resolve_start\", {\n sandbox_id: identifier,\n });\n\n const generation = this.resolveGeneration;\n this.resolvePromise = this.resolveProxyInfo(identifier)\n .then((info) => {\n if (generation !== this.resolveGeneration) {\n return;\n }\n this.sandbox.traceId = info.traceId;\n this.sandbox._setLifecycleIdentifier(info.sandboxId);\n this.sandbox._setName(info.name ?? null);\n this.routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = this.options.nativeClient?.selectSandboxProxyUrl(\n info.sandboxId,\n info.sandboxUrl ?? null,\n info.ingressEndpoint ?? null,\n this.explicitProxyUrl ?? null,\n ) ?? info.sandboxUrl\n ?? this.explicitProxyUrl;\n if (proxyUrl == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n this.nativeProxy = this.configureProxy(\n proxyUrl,\n info.sandboxId,\n this.routingHint,\n );\n logSdkTiming(\"sandbox.proxy\", \"resolve_complete\", resolveStart, {\n sandbox_id: info.sandboxId,\n server_trace_id: info.traceId,\n routing_hint: this.routingHint,\n ingress_endpoint: info.ingressEndpoint,\n sandbox_url: info.sandboxUrl,\n });\n })\n .finally(() => {\n this.resolvePromise = null;\n });\n\n return this.resolvePromise;\n }\n\n hasExplicitProxyUrl(): boolean {\n return this.explicitProxyUrl != null;\n }\n\n refreshFromInfo(info: Traced<SandboxInfo>): void {\n const routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = this.options.nativeClient?.selectSandboxProxyUrl(\n info.sandboxId,\n info.sandboxUrl ?? null,\n info.ingressEndpoint ?? null,\n this.explicitProxyUrl ?? null,\n ) ?? info.sandboxUrl\n ?? this.explicitProxyUrl;\n if (proxyUrl == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n const state = this.buildProxyState(\n proxyUrl,\n info.sandboxId,\n routingHint,\n );\n this.resolveGeneration += 1;\n this.resolvePromise = null;\n this.routingHint = routingHint;\n this.nativeProxy = state.nativeProxy;\n this.baseUrl = state.baseUrl;\n this.wsHeaders = state.wsHeaders;\n this.sandbox.traceId = info.traceId;\n this.sandbox._setLifecycleIdentifier(info.sandboxId);\n this.sandbox._setName(info.name ?? null);\n }\n\n /** Await proxy resolution and return the Rust-backed proxy client. */\n async client(): Promise<NativeSandboxProxyClient> {\n await this.ensureResolved();\n if (this.nativeProxy == null) {\n throw new SandboxError(\n \"server response did not include sandbox_url; refusing to derive a proxy URL\",\n );\n }\n return this.nativeProxy;\n }\n\n close(): void {\n // The underlying reqwest client is released when the native handle is\n // garbage-collected; there is nothing to close eagerly.\n }\n\n private configureProxy(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string,\n ): NativeSandboxProxyClient {\n const state = this.buildProxyState(proxyUrl, sandboxId, routingHint);\n this.baseUrl = state.baseUrl;\n this.wsHeaders = state.wsHeaders;\n return state.nativeProxy;\n }\n\n private buildProxyState(\n proxyUrl: string,\n sandboxId: string,\n routingHint?: string,\n ): {\n nativeProxy: NativeSandboxProxyClient;\n baseUrl: string;\n wsHeaders: Record<string, string>;\n } {\n // `baseUrl`/`wsHeaders` are still computed here for the WebSocket consumers\n // (PTY, tunnel, desktop), which do not flow through the native HTTP client.\n const { baseUrl, hostHeader, sandboxIdHeader } = resolveProxyTarget(\n proxyUrl,\n sandboxId,\n );\n const wsHeaders: Record<string, string> = {};\n if (this.options.apiKey) {\n wsHeaders.Authorization = `Bearer ${this.options.apiKey}`;\n }\n if (this.options.organizationId) {\n wsHeaders[\"X-Forwarded-Organization-Id\"] = this.options.organizationId;\n }\n if (this.options.projectId) {\n wsHeaders[\"X-Forwarded-Project-Id\"] = this.options.projectId;\n }\n if (hostHeader) {\n wsHeaders.Host = hostHeader;\n }\n if (sandboxIdHeader) {\n wsHeaders[\"X-Tensorlake-Sandbox-Id\"] = sandboxIdHeader;\n }\n\n // Prefer minting from the shared lifecycle client so the proxy reuses its\n // connection pool; fall back to a standalone client when none was wired.\n let nativeProxy: NativeSandboxProxyClient;\n if (this.options.nativeClient) {\n nativeProxy = this.options.nativeClient.connectProxy(\n proxyUrl,\n sandboxId,\n routingHint ?? null,\n this.proxyRequestTimeoutSec(),\n );\n } else {\n const binding = loadNativeSandboxBinding();\n nativeProxy = new binding.NativeSandboxProxyClient(\n proxyUrl,\n sandboxId,\n this.options.apiKey ?? null,\n this.options.organizationId ?? null,\n this.options.projectId ?? null,\n routingHint ?? null,\n null,\n this.proxyRequestTimeoutSec(),\n );\n }\n return { nativeProxy, baseUrl, wsHeaders };\n }\n\n private proxyRequestTimeoutSec(): number | null {\n if (this.options.requestTimeout != null) {\n return this.options.requestTimeout;\n }\n if (this.options.timeoutMs != null) {\n return this.options.timeoutMs / 1000;\n }\n return null;\n }\n}\n\nfunction processUserPayload(\n user: ProcessUser | undefined,\n): ProcessUser | undefined {\n // No user requested: omit the field so the sandbox resolves the image's\n // configured user (the image USER directive, falling back to root).\n if (user == null) {\n return undefined;\n }\n if (typeof user === \"string\" && user.trim() === \"\") {\n throw new SandboxError(\"process user must not be empty\");\n }\n return user;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst PTY_OP_DATA = 0x00;\nconst PTY_OP_RESIZE = 0x01;\nconst PTY_OP_READY = 0x02;\nconst PTY_OP_EXIT = 0x03;\n\nexport type PtyDataHandler = (data: Uint8Array) => void;\nexport type PtyExitHandler = (exitCode: number) => void;\n\nexport interface PtyConnectionOptions {\n onData?: PtyDataHandler;\n onExit?: PtyExitHandler;\n}\n\nexport interface CreatePtyOptions\n extends CreatePtySessionOptions,\n PtyConnectionOptions {}\n\nexport class Pty {\n readonly sessionId: string;\n readonly token: string;\n\n private readonly wsUrl: string;\n private readonly wsHeaders: Record<string, string>;\n private readonly killSession: () => Promise<void>;\n private socket: WebSocket | null = null;\n private connectPromise: Promise<this> | null = null;\n private intentionalDisconnect = false;\n private exitCode: number | null = null;\n private waitSettled = false;\n private readonly dataHandlers = new Set<PtyDataHandler>();\n private readonly exitHandlers = new Set<PtyExitHandler>();\n private readonly waitPromise: Promise<number>;\n private resolveWait!: (exitCode: number) => void;\n private rejectWait!: (error: unknown) => void;\n\n constructor(options: {\n sessionId: string;\n token: string;\n wsUrl: string;\n wsHeaders: Record<string, string>;\n killSession: () => Promise<void>;\n }) {\n this.sessionId = options.sessionId;\n this.token = options.token;\n this.wsUrl = options.wsUrl;\n this.wsHeaders = options.wsHeaders;\n this.killSession = options.killSession;\n this.waitPromise = new Promise<number>((resolve, reject) => {\n this.resolveWait = resolve;\n this.rejectWait = reject;\n });\n }\n\n onData(handler: PtyDataHandler): () => void {\n this.dataHandlers.add(handler);\n return () => this.dataHandlers.delete(handler);\n }\n\n onExit(handler: PtyExitHandler): () => void {\n this.exitHandlers.add(handler);\n if (this.exitCode != null) {\n queueMicrotask(() => handler(this.exitCode!));\n }\n return () => this.exitHandlers.delete(handler);\n }\n\n async connect(): Promise<this> {\n if (this.socket?.readyState === WebSocket.OPEN) {\n return this;\n }\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.intentionalDisconnect = false;\n\n this.connectPromise = new Promise<this>((resolve, reject) => {\n let opened = false;\n const socket = new WebSocket(this.wsUrl, {\n headers: this.wsHeaders,\n });\n this.socket = socket;\n\n socket.on(\"open\", async () => {\n try {\n await sendPtyFrame(socket, Buffer.from([PTY_OP_READY]));\n opened = true;\n resolve(this);\n } catch (error) {\n reject(error);\n }\n });\n\n socket.on(\"message\", (message: RawData) => {\n const bytes = normalizePtyMessage(message);\n const opcode = bytes[0];\n\n if (opcode === PTY_OP_DATA) {\n const payload = bytes.subarray(1);\n for (const handler of this.dataHandlers) {\n handler(payload);\n }\n return;\n }\n\n if (opcode === PTY_OP_EXIT && bytes.length >= 5) {\n this.finishWait(bytes.readInt32BE(1));\n }\n });\n\n socket.on(\"close\", (code: number, reason: Buffer) => {\n const closeReason = Buffer.isBuffer(reason)\n ? reason.toString(\"utf8\")\n : String(reason);\n\n if (this.socket === socket) {\n this.socket = null;\n }\n this.connectPromise = null;\n\n if (this.exitCode != null) {\n this.finishWait(this.exitCode);\n return;\n }\n\n if (closeReason.startsWith(\"exit:\")) {\n const parsed = Number.parseInt(closeReason.slice(5), 10);\n this.finishWait(Number.isNaN(parsed) ? -1 : parsed);\n return;\n }\n\n if (this.intentionalDisconnect) {\n this.intentionalDisconnect = false;\n return;\n }\n\n if (!opened) {\n reject(new SandboxError(\n `PTY websocket closed before READY completed: ${code} ${closeReason || \"no reason\"}`,\n ));\n return;\n }\n\n if (closeReason === \"session terminated\") {\n this.failWait(new SandboxError(\"PTY session terminated\"));\n return;\n }\n\n this.failWait(\n new SandboxError(\n `PTY websocket closed unexpectedly: ${code} ${closeReason || \"no reason\"}`,\n ),\n );\n });\n\n socket.on(\"error\", (error: Error) => {\n if (!opened) {\n reject(error);\n }\n });\n });\n\n return this.connectPromise;\n }\n\n async sendInput(input: string | Uint8Array): Promise<void> {\n const socket = this.requireOpenSocket();\n await sendPtyFrame(socket, encodePtyInput(input));\n }\n\n async resize(cols: number, rows: number): Promise<void> {\n const socket = this.requireOpenSocket();\n await sendPtyFrame(socket, encodePtyResize(cols, rows));\n }\n\n disconnect(code = 1000, reason = \"client disconnect\"): void {\n if (!this.socket) return;\n this.intentionalDisconnect = true;\n this.socket.close(code, reason);\n }\n\n wait(): Promise<number> {\n return this.waitPromise;\n }\n\n async kill(): Promise<void> {\n await this.killSession();\n }\n\n private requireOpenSocket(): WebSocket {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new SandboxError(\"PTY is not connected\");\n }\n return this.socket;\n }\n\n private finishWait(exitCode: number): void {\n if (this.waitSettled) return;\n this.waitSettled = true;\n this.exitCode = exitCode;\n for (const handler of this.exitHandlers) {\n handler(exitCode);\n }\n this.resolveWait(exitCode);\n }\n\n private failWait(error: unknown): void {\n if (this.waitSettled) return;\n this.waitSettled = true;\n this.rejectWait(error);\n }\n}\n\nfunction normalizePtyMessage(message: RawData): Buffer {\n if (Buffer.isBuffer(message)) return message;\n if (Array.isArray(message)) {\n return Buffer.concat(message.map((part) => Buffer.from(part)));\n }\n return Buffer.from(message);\n}\n\nfunction encodePtyInput(input: string | Uint8Array): Buffer {\n const payload =\n typeof input === \"string\" ? Buffer.from(input, \"utf8\") : Buffer.from(input);\n return Buffer.concat([Buffer.from([PTY_OP_DATA]), payload]);\n}\n\nfunction encodePtyResize(cols: number, rows: number): Buffer {\n const frame = Buffer.alloc(5);\n frame[0] = PTY_OP_RESIZE;\n frame.writeUInt16BE(cols, 1);\n frame.writeUInt16BE(rows, 3);\n return frame;\n}\n\nfunction sendPtyFrame(socket: WebSocket, frame: Buffer): Promise<void> {\n return new Promise((resolve, reject) => {\n socket.send(frame, (error?: Error) => (error ? reject(error) : resolve()));\n });\n}\n\n/**\n * Client for interacting with a running sandbox.\n *\n * Provides process management, file operations, and I/O streaming\n * through the sandbox proxy.\n */\nexport class Sandbox {\n readonly sandboxId: string;\n traceId: string | null = null;\n private readonly proxy: SandboxProxyConnection;\n private ownsSandbox = false;\n private lifecycleClient: SandboxClient | null = null;\n private lifecycleIdentifier: string;\n private sandboxName: string | null = null;\n\n constructor(options: SandboxOptions) {\n this.sandboxId = options.sandboxId;\n this.lifecycleIdentifier = options.sandboxId;\n this.proxy = new SandboxProxyConnection(this, options);\n }\n\n private get baseUrl(): string {\n return this.proxy.baseUrl;\n }\n\n private get wsHeaders(): Record<string, string> {\n return this.proxy.wsHeaders;\n }\n\n get name(): string | null {\n return this.sandboxName;\n }\n\n /** @internal Used by client wiring to keep locally cached name in sync. */\n _setName(name: string | null): void {\n this.sandboxName = name;\n }\n\n /** @internal Used by lifecycle operations to pin to canonical sandbox ID. */\n _setLifecycleIdentifier(identifier: string): void {\n this.lifecycleIdentifier = identifier;\n }\n\n /** @internal Used by the lazy proxy resolver. */\n _getLifecycleIdentifier(): string {\n return this.lifecycleIdentifier;\n }\n\n /** @internal Used by SandboxClient.createAndConnect to set ownership. */\n _setOwner(client: SandboxClient): void {\n this.ownsSandbox = true;\n this.lifecycleClient = client;\n }\n\n // --- Static factory methods ---\n\n /**\n * Create a new sandbox and return a connected, running handle.\n *\n * Covers both fresh sandbox creation and restore-from-snapshot (set\n * `snapshotId`). Blocks until the sandbox is `Running`.\n */\n static async create(\n options?: CreateAndConnectOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n // Dynamic import to break the circular dependency (client.ts imports Sandbox).\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.createAndConnect(options);\n }\n\n /**\n * Attach to an existing sandbox and return a connected handle.\n *\n * When `proxyUrl` is omitted, resolves the sandbox first so the handle uses\n * the correct cloud/region ingress endpoint. Does **not** auto-resume a\n * suspended sandbox — call `sandbox.resume()` explicitly.\n */\n static async connect(\n options: ConnectOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n const sandbox = client.connect(\n options.sandboxId,\n options.proxyUrl,\n options.routingHint,\n options.requestTimeout,\n );\n sandbox.lifecycleClient = client;\n return sandbox;\n }\n\n // --- Static snapshot management ---\n\n /** Get information about a snapshot by ID. No sandbox handle needed. */\n static async getSnapshot(\n snapshotId: string,\n options?: Partial<SandboxClientOptions>,\n ): Promise<SnapshotInfo> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.getSnapshot(snapshotId);\n }\n\n /** Delete a snapshot by ID. No sandbox handle needed. */\n static async deleteSnapshot(\n snapshotId: string,\n options?: Partial<SandboxClientOptions>,\n ): Promise<void> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n await client.deleteSnapshot(snapshotId);\n }\n\n /** List all sandboxes. No sandbox handle needed. */\n static async list(\n options?: Partial<SandboxClientOptions>,\n ): Promise<SandboxInfo[]> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.list();\n }\n\n /** List all snapshots in the project. No sandbox handle needed. */\n static async listSnapshots(\n options?: Partial<SandboxClientOptions>,\n ): Promise<SnapshotInfo[]> {\n const { SandboxClient } = await import(\"./client.js\");\n const client = new SandboxClient(options, /* _internal */ true);\n return client.listSnapshots();\n }\n\n // --- Instance lifecycle methods ---\n\n private requireLifecycleClient(operation: string): SandboxClient {\n if (!this.lifecycleClient) {\n throw new SandboxError(\n `Cannot ${operation}: no lifecycle client available. ` +\n \"Use Sandbox.create() or Sandbox.connect() to get a lifecycle-aware handle.\",\n );\n }\n return this.lifecycleClient;\n }\n\n /** Fetch the current sandbox information from the server on demand. */\n async info(): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"info\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Fetch the current sandbox status from the server.\n *\n * Always hits the network — the value is not cached locally because the\n * status changes over the sandbox's lifecycle.\n */\n async status(): Promise<SandboxStatus> {\n const client = this.requireLifecycleClient(\"read_status\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info.status;\n }\n\n /**\n * Update this sandbox's properties (name, exposed ports, proxy auth).\n *\n * Naming an ephemeral sandbox makes it non-ephemeral and enables\n * suspend/resume.\n */\n async update(options: UpdateSandboxOptions): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"update\");\n const info = await client.update(this.lifecycleIdentifier, options);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Suspend this sandbox.\n *\n * By default blocks until the sandbox is fully `Suspended`. Pass\n * `{ wait: false }` for fire-and-return.\n */\n async suspend(options?: SuspendResumeOptions): Promise<void> {\n const client = this.requireLifecycleClient(\"suspend\");\n await client.suspend(this.lifecycleIdentifier, options);\n }\n\n /**\n * Resume this sandbox.\n *\n * By default blocks until the sandbox is `Running` and refreshes this\n * handle's cached proxy routing. Rare transient proxy errors may still occur\n * immediately after resume.\n *\n * Pass `{ wait: false }` for fire-and-return. That mode does not refresh\n * cached proxy routing on this handle; use the default wait behavior for\n * immediate follow-up operations, or wait until the sandbox is running and\n * reconnect before issuing process/file/PTY operations.\n */\n async resume(options?: SuspendResumeOptions): Promise<void> {\n const client = this.requireLifecycleClient(\"resume\");\n const wait = options?.wait !== false;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n await client.resume(this.lifecycleIdentifier, {\n ...options,\n timeout: Math.max(0, (deadline - Date.now()) / 1000),\n });\n if (!wait) return;\n\n while (Date.now() < deadline) {\n const info = await client.get(this.lifecycleIdentifier);\n if (\n info.status === SandboxStatus.RUNNING &&\n (info.sandboxUrl != null || this.proxy.hasExplicitProxyUrl())\n ) {\n this.proxy.refreshFromInfo(info);\n return;\n }\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(\n `Sandbox ${this.lifecycleIdentifier} terminated while refreshing proxy routing`,\n );\n }\n await sleep(Math.min(pollInterval * 1000, Math.max(0, deadline - Date.now())));\n }\n throw new SandboxError(\n `Sandbox ${this.lifecycleIdentifier} did not provide refreshed proxy routing within ${timeout}s`,\n );\n }\n\n /** Live-copy this running sandbox. */\n async copy(options?: CopySandboxOptions): Promise<Traced<CopySandboxResponse>> {\n const client = this.requireLifecycleClient(\"copy\");\n return client.copy(this.lifecycleIdentifier, options);\n }\n\n /**\n * Attach a registered file system to this running sandbox at `mountPath`.\n *\n * Returns the updated sandbox info; the new mount appears in\n * `fileSystems`.\n */\n async attachFileSystem(\n fileSystemId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"attachFileSystem\");\n const info = await client.attachFileSystem(\n this.lifecycleIdentifier,\n fileSystemId,\n mountPath,\n );\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /**\n * Detach the file system mounted at `mountPath` from this running\n * sandbox.\n *\n * Returns the updated sandbox info with the mount removed from\n * `fileSystems`.\n */\n async detachFileSystem(mountPath: string): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"detachFileSystem\");\n const info = await client.detachFileSystem(\n this.lifecycleIdentifier,\n mountPath,\n );\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return info;\n }\n\n /** List the file systems currently mounted into this sandbox. */\n async listFileSystems(): Promise<Traced<FileSystemMount[]>> {\n const client = this.requireLifecycleClient(\"listFileSystems\");\n const info = await client.get(this.lifecycleIdentifier);\n this._setLifecycleIdentifier(info.sandboxId);\n this._setName(info.name ?? null);\n return Object.assign(info.fileSystems ?? [], { traceId: info.traceId });\n }\n\n /**\n * Create a checkpoint of this sandbox and wait for it to be locally ready.\n *\n * By default blocks until the checkpoint is resumable and returns\n * `SnapshotInfo`. Pass `{ wait: false }` to fire-and-return\n * (returns `undefined`).\n */\n async checkpoint(options?: CheckpointOptions): Promise<Traced<SnapshotInfo> | undefined> {\n const client = this.requireLifecycleClient(\"checkpoint\");\n if (options?.wait === false) {\n await client.snapshot(this.lifecycleIdentifier, { snapshotType: options.checkpointType });\n return undefined;\n }\n return client.snapshotAndWait(this.lifecycleIdentifier, {\n timeout: options?.timeout,\n pollInterval: options?.pollInterval,\n snapshotType: options?.checkpointType,\n waitUntil: options?.waitUntil,\n });\n }\n\n /**\n * List snapshots taken from this sandbox.\n */\n async listSnapshots(): Promise<Traced<SnapshotInfo[]>> {\n const client = this.requireLifecycleClient(\"listSnapshots\");\n const all = await client.listSnapshots();\n const filtered = all.filter((s) => s.sandboxId === this.lifecycleIdentifier);\n return Object.assign(filtered, { traceId: all.traceId });\n }\n\n /** Close the proxy connection. The sandbox keeps running. */\n close(): void {\n this.proxy.close();\n }\n\n /** Terminate the sandbox and release all resources. */\n async terminate(): Promise<void> {\n const client = this.lifecycleClient;\n this.ownsSandbox = false;\n this.lifecycleClient = null;\n this.close();\n if (client) {\n await client.delete(this.lifecycleIdentifier);\n }\n }\n\n // --- High-level convenience ---\n\n /**\n * Run a command to completion and return its output.\n *\n * Uses a single streaming `POST /api/v1/processes/run` request that starts\n * the process, streams output, and delivers the exit code over one connection.\n */\n async run(command: string, options?: RunOptions): Promise<Traced<CommandResult>> {\n const opStart = nowMs();\n const body: Record<string, unknown> = { command };\n if (options?.args) body.args = options.args;\n if (options?.env) body.env = options.env;\n if (options?.workingDir) body.working_dir = options.workingDir;\n if (options?.timeout != null) body.timeout = options.timeout;\n const user = processUserPayload(options?.user);\n if (user !== undefined) body.user = user;\n\n logSdkTimingEvent(\"sandbox.run\", \"start\", {\n sandbox_id: this.sandboxId,\n command: sdkTimingPayloadsEnabled() ? command : undefined,\n command_length: command.length,\n });\n\n const proxy = await this.proxy.client();\n const { traceId, events } = await callNative(\n () => proxy.runProcess(JSON.stringify(body)),\n { sandboxId: this.sandboxId },\n );\n const { exitCode, stdout, stderr } = assembleCommandResult(events);\n logSdkTiming(\"sandbox.run\", \"complete\", opStart, {\n sandbox_id: this.sandboxId,\n server_trace_id: traceId,\n command: sdkTimingPayloadsEnabled() ? command : undefined,\n command_length: command.length,\n exit_code: exitCode,\n });\n\n return Object.assign({ exitCode, stdout, stderr }, { traceId });\n }\n\n // --- Process management ---\n\n /**\n * Start a process in the sandbox without waiting for it to exit.\n *\n * Returns a `ProcessInfo` with the assigned `pid`. Use `getProcess()` to\n * poll status, or `followStdout()` / `followOutput()` to stream output\n * until the process exits. Use `run()` instead to block until completion\n * and get combined output in one call.\n */\n async startProcess(\n command: string,\n options?: StartProcessOptions,\n ): Promise<Traced<ProcessInfo>> {\n const payload: Record<string, unknown> = { command };\n if (options?.args != null) payload.args = options.args;\n if (options?.env != null) payload.env = options.env;\n if (options?.workingDir != null) payload.working_dir = options.workingDir;\n const user = processUserPayload(options?.user);\n if (user !== undefined) payload.user = user;\n if (options?.stdinMode != null && options.stdinMode !== StdinMode.CLOSED) {\n payload.stdin_mode = options.stdinMode;\n }\n if (options?.stdoutMode != null && options.stdoutMode !== OutputMode.CAPTURE) {\n payload.stdout_mode = options.stdoutMode;\n }\n if (options?.stderrMode != null && options.stderrMode !== OutputMode.CAPTURE) {\n payload.stderr_mode = options.stderrMode;\n }\n if (options?.name != null) {\n // Validate the managed name client-side (throws) via the single source-of-truth rule\n // in the Rust core. The daemon re-validates as the authority.\n loadNativeSandboxBinding().validateManagedName(options.name);\n payload.name = options.name;\n }\n if (options?.restart != null) payload.restart = toSnakeKeys(options.restart);\n if (options?.healthCheck != null) {\n payload.health_check = toSnakeKeys(options.healthCheck);\n }\n\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.startProcess(JSON.stringify(payload)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** List all processes (running and exited) tracked by the sandbox daemon. */\n async listProcesses(): Promise<Traced<ProcessInfo[]>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.listProcesses(), {\n sandboxId: this.sandboxId,\n });\n const parsed = JSON.parse(json) as { processes?: Record<string, unknown>[] };\n const processes = (parsed.processes ?? []).map(\n (p) => fromSnakeKeys(p) as ProcessInfo,\n );\n return Object.assign(processes, { traceId });\n }\n\n /** Read persisted logs for this sandbox from the log service. */\n async getLogs(\n options?: GetSandboxLogsOptions,\n ): Promise<Traced<SandboxLogsResponse>> {\n const client = this.requireLifecycleClient(\"get_logs\");\n const info = await this.info();\n return client.getLogs(info.sandboxId, options);\n }\n\n /** List processes available as persisted-log filters for this sandbox. */\n async listLogProcesses(): Promise<Traced<SandboxProcessLogFiltersResponse>> {\n const client = this.requireLifecycleClient(\"list_log_processes\");\n const info = await this.info();\n return client.listLogProcesses(info.sandboxId);\n }\n\n /** Get current status and metadata for a process. `process` is a PID or process name given on creation. */\n async getProcess(process: number | string): Promise<Traced<ProcessInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getProcess(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** Send SIGKILL to a process (or stop a managed process). `process` is a PID or process name given on creation. */\n async killProcess(process: number | string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.killProcess(String(process)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Restart a managed process. `process` is a PID or process name given on creation. */\n async restartProcess(process: number | string): Promise<Traced<ProcessInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.restartProcess(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ProcessInfo, { traceId });\n }\n\n /** Send an arbitrary signal (e.g. `15` for SIGTERM, `9` for SIGKILL). `process` is a PID or process name given on creation. */\n async sendSignal(\n process: number | string,\n signal: number,\n ): Promise<Traced<SendSignalResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.sendSignal(String(process), signal),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as SendSignalResponse, {\n traceId,\n });\n }\n\n // --- Process I/O ---\n\n /** Write bytes to a process's stdin (must be started with `stdinMode: StdinMode.PIPE`). `process` is a PID or process name given on creation. */\n async writeStdin(process: number | string, data: Uint8Array): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.writeStdin(String(process), Buffer.from(data)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Close a process's stdin pipe, signalling EOF. `process` is a PID or process name given on creation. */\n async closeStdin(process: number | string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.closeStdin(String(process)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Return all captured stdout lines produced so far. `process` is a PID or process name given on creation. */\n async getStdout(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getStdout(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n /** Return all captured stderr lines produced so far. `process` is a PID or process name given on creation. */\n async getStderr(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getStderr(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n /** Return all captured stdout+stderr lines produced so far. `process` is a PID or process name given on creation. */\n async getOutput(process: number | string): Promise<Traced<OutputResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.getOutput(String(process)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as OutputResponse, { traceId });\n }\n\n // --- Streaming (SSE) ---\n\n /** Stream stdout events until the process exits. `process` is a PID or process name given on creation. */\n async *followStdout(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followStdout(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n /** Stream stderr events until the process exits. `process` is a PID or process name given on creation. */\n async *followStderr(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followStderr(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n /** Stream combined stdout+stderr events until the process exits. `process` is a PID or process name given on creation. */\n async *followOutput(\n process: number | string,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<OutputEvent> {\n const proxy = await this.proxy.client();\n for await (const raw of nativeEventStream(\n (emit) => proxy.followOutput(String(process), emit),\n { sandboxId: this.sandboxId },\n options?.signal,\n )) {\n yield fromSnakeKeys(raw) as OutputEvent;\n }\n }\n\n // --- File operations ---\n\n /** Read a file from the sandbox and return its raw bytes. */\n async readFile(path: string): Promise<Traced<Uint8Array>> {\n const proxy = await this.proxy.client();\n const { traceId, data } = await callNative(() => proxy.readFile(path), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(Uint8Array.from(data), { traceId });\n }\n\n /** Write raw bytes to a file in the sandbox, creating it if it does not exist. */\n async writeFile(path: string, content: Uint8Array): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.writeFile(path, Buffer.from(content)), {\n sandboxId: this.sandboxId,\n });\n }\n\n /** Delete a file from the sandbox. */\n async deleteFile(path: string): Promise<void> {\n const proxy = await this.proxy.client();\n await callNative(() => proxy.deleteFile(path), { sandboxId: this.sandboxId });\n }\n\n /** List the contents of a directory in the sandbox. */\n async listDirectory(path: string): Promise<Traced<ListDirectoryResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.listDirectory(path), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as ListDirectoryResponse, {\n traceId,\n });\n }\n\n // --- PTY ---\n\n /** Create an interactive PTY session. Returns a `sessionId` and `token` for WebSocket connection via `connectPty()`. */\n async createPtySession(\n options: CreatePtySessionOptions,\n ): Promise<Traced<PtySessionInfo>> {\n const payload: Record<string, unknown> = {\n command: options.command,\n rows: options.rows ?? 24,\n cols: options.cols ?? 80,\n };\n if (options.args != null) payload.args = options.args;\n if (options.env != null) payload.env = options.env;\n if (options.workingDir != null) payload.working_dir = options.workingDir;\n\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(\n () => proxy.createPtySession(JSON.stringify(payload)),\n { sandboxId: this.sandboxId },\n );\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as PtySessionInfo, { traceId });\n }\n\n /** Create a PTY session and connect to it immediately. Cleans up the session if the WebSocket connection fails. */\n async createPty(options: CreatePtyOptions): Promise<Pty> {\n const { onData, onExit, ...createOptions } = options;\n const session = await this.createPtySession(createOptions);\n try {\n return await this.connectPty(session.sessionId, session.token, { onData, onExit });\n } catch (error) {\n try {\n const proxy = await this.proxy.client();\n await proxy.deletePtySession(session.sessionId);\n } catch {}\n throw error;\n }\n }\n\n /** Attach to an existing PTY session by ID and token and return a connected `Pty` handle. */\n async connectPty(\n sessionId: string,\n token: string,\n options?: PtyConnectionOptions,\n ): Promise<Pty> {\n await this.proxy.ensureResolved();\n const wsUrl = new URL(this.ptyWsUrl(sessionId, token));\n const authToken = wsUrl.searchParams.get(\"token\") ?? token;\n\n const pty = new Pty({\n sessionId,\n token: authToken,\n wsUrl: wsUrl.toString(),\n wsHeaders: {\n ...this.wsHeaders,\n \"X-PTY-Token\": authToken,\n },\n killSession: async () => {\n const proxy = await this.proxy.client();\n await proxy.deletePtySession(sessionId);\n },\n });\n\n if (options?.onData) {\n pty.onData(options.onData);\n }\n if (options?.onExit) {\n pty.onExit(options.onExit);\n }\n\n await pty.connect();\n return pty;\n }\n\n /** Open a TCP tunnel to a port inside the sandbox and return the local listener. */\n async createTunnel(\n remotePort: number,\n options?: CreateTunnelOptions,\n ): Promise<TcpTunnel> {\n await this.proxy.ensureResolved();\n return TcpTunnel.listen({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n remotePort,\n localHost: options?.localHost,\n localPort: options?.localPort,\n connectTimeout: options?.connectTimeout,\n });\n }\n\n /** Connect to a sandbox VNC session for programmatic desktop control. */\n async connectDesktop(options?: ConnectDesktopOptions): Promise<Desktop> {\n await this.proxy.ensureResolved();\n const port = options?.port ?? 5901;\n const connectTimeout = options?.connectTimeout ?? 10;\n\n // Wait for the VNC port to be reachable inside the sandbox before\n // attempting the WebSocket tunnel handshake. Without this, freshly\n // created sandboxes (where the in-VM `vncserver` systemd unit is\n // still starting) race the tunnel: the dataplane gets `Connection\n // refused` on 127.0.0.1:<port> and the proxy returns 502 before\n // VNC has had a chance to bind. The wait is bounded by\n // `connectTimeout` along with the WS handshake and VNC negotiation\n // that follow — total wall-clock is what the caller asked for.\n const startMs = Date.now();\n const deadlineMs = startMs + connectTimeout * 1000;\n await this.waitForPortReady(port, deadlineMs);\n const remainingSecs = Math.max(0.1, (deadlineMs - Date.now()) / 1000);\n\n return Desktop.connect({\n baseUrl: this.baseUrl,\n wsHeaders: this.wsHeaders,\n port,\n password: options?.password,\n shared: options?.shared,\n connectTimeout: remainingSecs,\n });\n }\n\n /**\n * Poll the in-sandbox daemon until `127.0.0.1:port` accepts a TCP connection.\n * Uses `bash`'s `/dev/tcp` builtin via `processes/run` — no extra deps in\n * the sandbox image. `bash` is present on every image we ship.\n */\n private async waitForPortReady(\n port: number,\n deadlineMs: number,\n ): Promise<void> {\n const probeIntervalMs = 250;\n const probeProcessTimeoutSecs = 2;\n let lastError: unknown;\n\n while (Date.now() < deadlineMs) {\n try {\n const result = await this.run(\"/bin/bash\", {\n args: [\"-c\", `exec 3<>/dev/tcp/127.0.0.1/${port}`],\n timeout: probeProcessTimeoutSecs,\n });\n if (result.exitCode === 0) {\n return;\n }\n } catch (error) {\n lastError = error;\n }\n const remainingMs = deadlineMs - Date.now();\n if (remainingMs <= 0) break;\n await new Promise((resolve) =>\n setTimeout(resolve, Math.min(probeIntervalMs, remainingMs)),\n );\n }\n\n const detail =\n lastError instanceof Error ? `: ${lastError.message}` : \"\";\n throw new SandboxError(\n `port ${port} did not become reachable inside sandbox within the connect timeout${detail}`,\n );\n }\n\n ptyWsUrl(sessionId: string, token: string): string {\n let wsBase: string;\n if (this.baseUrl.startsWith(\"https://\")) {\n wsBase = \"wss://\" + this.baseUrl.slice(8);\n } else if (this.baseUrl.startsWith(\"http://\")) {\n wsBase = \"ws://\" + this.baseUrl.slice(7);\n } else {\n wsBase = this.baseUrl;\n }\n return `${wsBase}/api/v1/pty/${sessionId}/ws?token=${token}`;\n }\n\n // --- Health ---\n\n /** Check the sandbox daemon health. */\n async health(): Promise<Traced<HealthResponse>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.health(), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as HealthResponse, { traceId });\n }\n\n /** Get sandbox daemon info (version, uptime, process counts). */\n async daemonInfo(): Promise<Traced<DaemonInfo>> {\n const proxy = await this.proxy.client();\n const { traceId, json } = await callNative(() => proxy.info(), {\n sandboxId: this.sandboxId,\n });\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as DaemonInfo, { traceId });\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./http.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeErrorContext,\n type NativeSandboxClient,\n} from \"./native-sandbox.js\";\nimport {\n type ArchivedSandboxInfo,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type CreateAndConnectOptions,\n type CreatePoolOptions,\n type CreateSandboxOptions,\n type CreateSandboxPoolResponse,\n type CreateSandboxResponse,\n type CreateSnapshotResponse,\n type GetSandboxLogsOptions,\n type ListArchivedSandboxesOptions,\n type ListArchivedSandboxesResponse,\n type SandboxClientOptions,\n type SandboxInfo,\n type SandboxLogsResponse,\n type SandboxPortAccess,\n type SandboxPoolInfo,\n type SandboxProcessLogFiltersResponse,\n SandboxStatus,\n type SnapshotAndWaitOptions,\n type SnapshotInfo,\n type SnapshotOptions,\n SnapshotStatus,\n type SnapshotWaitCondition,\n type SuspendResumeOptions,\n type UpdatePoolOptions,\n type UpdateSandboxOptions,\n fromSnakeKeys,\n} from \"./models.js\";\nimport { Sandbox } from \"./sandbox.js\";\nimport { nowMs, logSdkTimingEvent, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride } from \"./url.js\";\n\nfunction gpuRequest(\n gpus: number | undefined,\n gpuModel: string | undefined,\n): Array<{ count: number; model: string }> | undefined {\n if (gpus == null) return undefined;\n if (!Number.isInteger(gpus) || gpus < 1) {\n throw new SandboxError(\"gpus must be a positive integer\");\n }\n gpuModel = gpuModel ?? \"A10\";\n if (gpuModel !== \"A10\") {\n throw new SandboxError(\"only A10 GPU sandboxes are supported for now\");\n }\n return [{ count: gpus, model: gpuModel }];\n}\n\n/**\n * Client for managing TensorLake sandboxes, pools, and snapshots.\n *\n * This is a thin shim over the Rust core ({@link NativeSandboxClient}): every\n * call marshals a request to JSON, delegates the RPC (URL resolution,\n * namespacing, retries, connection pooling) to Rust, and reshapes the JSON\n * response. There is no TypeScript-side HTTP transport.\n */\nexport class SandboxClient {\n private readonly native: NativeSandboxClient;\n private readonly apiUrl: string;\n private readonly apiKey: string | undefined;\n private readonly organizationId: string | undefined;\n private readonly projectId: string | undefined;\n private readonly namespace: string;\n private readonly requestTimeoutMs: number;\n\n /** @internal Pass `true` to suppress the deprecation warning when used by `Sandbox.create()` / `Sandbox.connect()`. */\n constructor(options?: SandboxClientOptions, _internal = false) {\n if (!_internal) {\n console.warn(\n \"[tensorlake] SandboxClient is deprecated; use Sandbox.create() / Sandbox.connect() instead.\",\n );\n }\n this.apiUrl = options?.apiUrl ?? defaults.API_URL;\n this.apiKey = options?.apiKey ?? defaults.API_KEY;\n this.organizationId = options?.organizationId;\n this.projectId = options?.projectId;\n this.namespace = options?.namespace ?? defaults.NAMESPACE;\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n\n const binding = loadNativeSandboxBinding();\n this.native = new binding.NativeSandboxClient(\n this.apiUrl,\n this.apiKey ?? null,\n this.organizationId ?? null,\n this.projectId ?? null,\n this.namespace,\n null,\n this.requestTimeoutMs / 1000,\n );\n }\n\n /** Create a client for the TensorLake cloud platform. */\n static forCloud(options?: {\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n apiUrl?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n }): SandboxClient {\n return new SandboxClient({\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n /** Create a client for a local Indexify server. */\n static forLocalhost(options?: {\n apiUrl?: string;\n namespace?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n }): SandboxClient {\n return new SandboxClient({\n apiUrl: options?.apiUrl ?? \"http://localhost:8900\",\n namespace: options?.namespace ?? \"default\",\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n close(): void {\n // The native client releases its connection pool on GC; nothing to do.\n }\n\n private withRequestTimeout(requestTimeout: number | undefined): SandboxClient {\n if (requestTimeout == null) {\n return this;\n }\n const timeoutMs = secondsToMillis(requestTimeout);\n if (timeoutMs === this.requestTimeoutMs) {\n return this;\n }\n return new SandboxClient({\n apiUrl: this.apiUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n namespace: this.namespace,\n timeoutMs,\n }, /* _internal */ true);\n }\n\n // --- Native marshalling helpers ---\n\n /** Run a native JSON call and reshape it into a `Traced<T>`. */\n private async tracedJson<T extends object>(\n fn: () => Promise<{ traceId: string; json: string }>,\n idField?: string,\n context?: NativeErrorContext,\n ): Promise<Traced<T>> {\n const { traceId, json } = await callNative(fn, context);\n return Object.assign(fromSnakeKeys(JSON.parse(json), idField) as T, {\n traceId,\n }) as Traced<T>;\n }\n\n /** Run a native JSON call and reshape it into a plain `T` (no trace id). */\n private async plainJson<T>(\n fn: () => Promise<{ traceId: string; json: string }>,\n idField?: string,\n context?: NativeErrorContext,\n ): Promise<T> {\n const { json } = await callNative(fn, context);\n return fromSnakeKeys(JSON.parse(json), idField) as T;\n }\n\n // --- Sandbox CRUD ---\n\n /** Create a new sandbox. Returns immediately; the sandbox may still be starting. Use `createAndConnect()` for a blocking, ready-to-use handle. */\n async create(options?: CreateSandboxOptions): Promise<Traced<CreateSandboxResponse>> {\n const gpuResources = gpuRequest(options?.gpus, options?.gpuModel);\n const body: Record<string, unknown> = {\n resources: {\n cpus: options?.cpus ?? 1.0,\n memory_mb: options?.memoryMb ?? 1024,\n ...(options?.diskMb != null ? { disk_mb: options.diskMb } : {}),\n ...(gpuResources != null ? { gpus: gpuResources } : {}),\n },\n };\n\n if (options?.image != null) body.image = options.image;\n if (options?.timeoutSecs != null) body.timeout_secs = options.timeoutSecs;\n if (options?.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options?.snapshotId != null) body.snapshot_id = options.snapshotId;\n if (options?.name != null) body.name = options.name;\n if (\n options?.fileSystems != null &&\n options.fileSystems.length > 0\n ) {\n body.file_systems = options.fileSystems.map((fs) => ({\n file_system_id: fs.fileSystemId,\n mount_path: fs.mountPath,\n }));\n }\n\n if (\n options?.allowInternetAccess === false ||\n options?.allowOut != null ||\n options?.denyOut != null\n ) {\n body.network = {\n allow_internet_access: options?.allowInternetAccess ?? true,\n allow_out: options?.allowOut ?? [],\n deny_out: options?.denyOut ?? [],\n };\n }\n\n return this.tracedJson<CreateSandboxResponse>(\n () => this.native.createSandbox(JSON.stringify(body)),\n \"sandboxId\",\n );\n }\n\n /** Get current state and metadata for a sandbox by ID. */\n async get(sandboxId: string): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () => this.native.getSandbox(sandboxId),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** List all sandboxes in the namespace. */\n async list(): Promise<Traced<SandboxInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listSandboxes());\n const parsed = JSON.parse(json) as { sandboxes?: Record<string, unknown>[] };\n const sandboxes = (parsed.sandboxes ?? []).map(\n (s) => fromSnakeKeys(s, \"sandboxId\") as SandboxInfo,\n );\n return Object.assign(sandboxes, { traceId });\n }\n\n /**\n * List archived (terminated) sandboxes in the namespace.\n *\n * Archived sandboxes are terminated sandboxes parked in the server's\n * archived sandboxes store until the server-configured TTL expires.\n */\n async listArchived(\n options?: ListArchivedSandboxesOptions,\n ): Promise<Traced<ListArchivedSandboxesResponse>> {\n const { traceId, json } = await callNative(() =>\n this.native.listArchivedSandboxes(\n options?.limit ?? null,\n options?.cursor ?? null,\n options?.direction ?? null,\n ),\n );\n const parsed = JSON.parse(json) as {\n sandboxes?: Record<string, unknown>[];\n prev_cursor?: string;\n next_cursor?: string;\n };\n const sandboxes = (parsed.sandboxes ?? []).map(\n (s) => fromSnakeKeys(s, \"sandboxId\") as ArchivedSandboxInfo,\n );\n const response: ListArchivedSandboxesResponse = {\n sandboxes,\n prevCursor: parsed.prev_cursor,\n nextCursor: parsed.next_cursor,\n };\n return Object.assign(response, { traceId });\n }\n\n /** Get a single archived sandbox by id. */\n async getArchived(sandboxId: string): Promise<Traced<ArchivedSandboxInfo>> {\n return this.tracedJson<ArchivedSandboxInfo>(\n () => this.native.getArchivedSandbox(sandboxId),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Read persisted logs for a sandbox. */\n async getLogs(\n sandboxId: string,\n options?: GetSandboxLogsOptions,\n ): Promise<Traced<SandboxLogsResponse>> {\n const body = {\n sandbox_id: sandboxId,\n levels: options?.levels ?? [],\n process_ids: options?.processIds ?? [],\n next_token: options?.nextToken,\n head: options?.head,\n tail: options?.tail,\n body: options?.body,\n };\n const { traceId, json } = await callNative(\n () => this.native.getSandboxLogs(JSON.stringify(body)),\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n return Object.assign(JSON.parse(json) as SandboxLogsResponse, { traceId });\n }\n\n /** List sandbox processes available as persisted-log filters. */\n async listLogProcesses(\n sandboxId: string,\n ): Promise<Traced<SandboxProcessLogFiltersResponse>> {\n const { traceId, json } = await callNative(\n () => this.native.listSandboxLogProcesses(sandboxId),\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n return Object.assign(JSON.parse(json) as SandboxProcessLogFiltersResponse, {\n traceId,\n });\n }\n\n /** Update sandbox properties such as name, exposed ports, and proxy auth settings. */\n async update(sandboxId: string, options: UpdateSandboxOptions): Promise<Traced<SandboxInfo>> {\n const body: Record<string, unknown> = {};\n if (options.name != null) body.name = options.name;\n if (options.allowUnauthenticatedAccess != null) {\n body.allow_unauthenticated_access = options.allowUnauthenticatedAccess;\n }\n if (options.exposedPorts != null) {\n body.exposed_ports = normalizeUserPorts(options.exposedPorts);\n }\n if (Object.keys(body).length === 0) {\n throw new SandboxError(\"At least one sandbox update field must be provided.\");\n }\n return this.tracedJson<SandboxInfo>(\n () => this.native.updateSandbox(sandboxId, JSON.stringify(body)),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Get the current proxy port settings for a sandbox. */\n async getPortAccess(sandboxId: string): Promise<SandboxPortAccess> {\n const info = await this.get(sandboxId);\n return {\n allowUnauthenticatedAccess: info.allowUnauthenticatedAccess ?? false,\n exposedPorts: dedupeAndSortPorts(info.exposedPorts ?? []),\n ingressEndpoint: info.ingressEndpoint,\n sandboxUrl: info.sandboxUrl,\n };\n }\n\n /** Add one or more user ports to the sandbox proxy allowlist. */\n async exposePorts(\n sandboxId: string,\n ports: number[],\n options?: { allowUnauthenticatedAccess?: boolean },\n ): Promise<SandboxInfo> {\n const requestedPorts = normalizeUserPorts(ports);\n const current = await this.getPortAccess(sandboxId);\n const desiredPorts = dedupeAndSortPorts([\n ...current.exposedPorts,\n ...requestedPorts,\n ]);\n return this.update(sandboxId, {\n allowUnauthenticatedAccess:\n options?.allowUnauthenticatedAccess ??\n current.allowUnauthenticatedAccess,\n exposedPorts: desiredPorts,\n });\n }\n\n /** Remove one or more user ports from the sandbox proxy allowlist. */\n async unexposePorts(\n sandboxId: string,\n ports: number[],\n ): Promise<SandboxInfo> {\n const requestedPorts = normalizeUserPorts(ports);\n const current = await this.getPortAccess(sandboxId);\n const toRemove = new Set(requestedPorts);\n const desiredPorts = current.exposedPorts.filter((port) => !toRemove.has(port));\n return this.update(sandboxId, {\n allowUnauthenticatedAccess: desiredPorts.length\n ? current.allowUnauthenticatedAccess\n : false,\n exposedPorts: desiredPorts,\n });\n }\n\n /** Terminate and delete a sandbox. */\n async delete(sandboxId: string): Promise<void> {\n await callNative(() => this.native.deleteSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n }\n\n /**\n * Suspend a named sandbox, preserving its state for later resume.\n *\n * Only sandboxes created with a `name` can be suspended; ephemeral sandboxes\n * cannot. By default blocks until the sandbox is fully `Suspended`. Pass\n * `{ wait: false }` to return immediately after the request is sent\n * (fire-and-return); the server processes the suspend asynchronously.\n */\n async suspend(sandboxId: string, options?: SuspendResumeOptions): Promise<void> {\n await callNative(() => this.native.suspendSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n if (options?.wait === false) return;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n while (Date.now() < deadline) {\n const info = await this.get(sandboxId);\n if (info.status === SandboxStatus.SUSPENDED) return;\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(`Sandbox ${sandboxId} terminated while waiting for suspend`);\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(`Sandbox ${sandboxId} did not suspend within ${timeout}s`);\n }\n\n /**\n * Resume a suspended sandbox and bring it back to `Running`.\n *\n * By default blocks until the sandbox is `Running` and routable. Pass\n * `{ wait: false }` to return immediately after the request is sent\n * (fire-and-return); the server processes the resume asynchronously.\n */\n async resume(sandboxId: string, options?: SuspendResumeOptions): Promise<void> {\n await callNative(() => this.native.resumeSandbox(sandboxId), { sandboxId, notFoundKind: \"sandbox\" });\n if (options?.wait === false) return;\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const deadline = Date.now() + timeout * 1000;\n while (Date.now() < deadline) {\n const info = await this.get(sandboxId);\n if (info.status === SandboxStatus.RUNNING) return;\n if (info.status === SandboxStatus.TERMINATED) {\n throw new SandboxError(`Sandbox ${sandboxId} terminated while waiting for resume`);\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(`Sandbox ${sandboxId} did not resume within ${timeout}s`);\n }\n\n /**\n * Attach a registered file system to a running sandbox at `mountPath`.\n *\n * The mount completes asynchronously on the dataplane; the returned\n * `SandboxInfo` already reflects the new entry in `fileSystems`.\n */\n async attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () =>\n this.native.attachFileSystem(sandboxId, fileSystemId, mountPath),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /**\n * Detach the file system mounted at `mountPath` from a running sandbox.\n *\n * The unmount completes asynchronously on the dataplane; the returned\n * `SandboxInfo` already reflects the removed `fileSystems` entry.\n */\n async detachFileSystem(\n sandboxId: string,\n mountPath: string,\n ): Promise<Traced<SandboxInfo>> {\n return this.tracedJson<SandboxInfo>(\n () => this.native.detachFileSystem(sandboxId, mountPath),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Claim a warm sandbox from a pool, creating one if no warm containers are available. */\n async claim(poolId: string): Promise<Traced<CreateSandboxResponse>> {\n return this.tracedJson<CreateSandboxResponse>(\n () => this.native.claimSandbox(poolId),\n \"sandboxId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /**\n * Live-copy a running sandbox.\n *\n * The server creates `times` running copies from the source sandbox. Partial\n * responses can include failed copies; inspect each returned sandbox's\n * `status` and `reason`.\n */\n async copy(\n sandboxId: string,\n options?: CopySandboxOptions,\n ): Promise<Traced<CopySandboxResponse>> {\n const times = options?.times ?? 1;\n if (!Number.isInteger(times) || times < 1) {\n throw new SandboxError(\"times must be a positive integer\");\n }\n const client = this.withRequestTimeout(options?.requestTimeout);\n return client.tracedJson<CopySandboxResponse>(\n () => client.native.copySandbox(sandboxId, times),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n // --- Snapshots ---\n\n /**\n * Request a snapshot of a running sandbox's filesystem.\n *\n * This call **returns immediately** with a `snapshotId` and `in_progress`\n * status — the snapshot is created asynchronously. Poll `getSnapshot()` until\n * `local_ready`, `completed`, or `failed`, or use `snapshotAndWait()` to\n * block automatically.\n */\n async snapshot(\n sandboxId: string,\n options?: SnapshotOptions,\n ): Promise<CreateSnapshotResponse> {\n return this.plainJson<CreateSnapshotResponse>(\n () => this.native.createSnapshot(sandboxId, options?.snapshotType ?? null),\n \"snapshotId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Get current status and metadata for a snapshot by ID. */\n async getSnapshot(snapshotId: string): Promise<Traced<SnapshotInfo>> {\n return this.tracedJson<SnapshotInfo>(\n () => this.native.getSnapshot(snapshotId),\n \"snapshotId\",\n );\n }\n\n /** List all snapshots in the namespace. */\n async listSnapshots(): Promise<Traced<SnapshotInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listSnapshots());\n const parsed = JSON.parse(json) as { snapshots?: Record<string, unknown>[] };\n const snapshots = (parsed.snapshots ?? []).map(\n (s) => fromSnakeKeys(s, \"snapshotId\") as SnapshotInfo,\n );\n return Object.assign(snapshots, { traceId });\n }\n\n /** Delete a snapshot by ID. */\n async deleteSnapshot(snapshotId: string): Promise<void> {\n await callNative(() => this.native.deleteSnapshot(snapshotId));\n }\n\n /**\n * Create a snapshot and block until it is locally ready.\n *\n * Combines `snapshot()` with polling `getSnapshot()` until `local_ready`\n * or `completed`. Pass `{ waitUntil: \"completed\" }` when durable\n * `snapshotUri` metadata is required.\n */\n async snapshotAndWait(\n sandboxId: string,\n options?: SnapshotAndWaitOptions,\n ): Promise<Traced<SnapshotInfo>> {\n const timeout = options?.timeout ?? 300;\n const pollInterval = options?.pollInterval ?? 1;\n const waitUntil = options?.waitUntil ?? \"local_ready\";\n\n const result = await this.snapshot(sandboxId, {\n snapshotType: options?.snapshotType,\n });\n const deadline = Date.now() + timeout * 1000;\n\n while (Date.now() < deadline) {\n const info = await this.getSnapshot(result.snapshotId);\n if (snapshotStatusSatisfiesWaitCondition(info.status, waitUntil)) return info;\n if (info.status === SnapshotStatus.FAILED) {\n throw new SandboxError(\n `Snapshot ${result.snapshotId} failed: ${info.error}`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n\n throw new SandboxError(\n `Snapshot ${result.snapshotId} did not reach ${waitUntil} within ${timeout}s`,\n );\n }\n\n // --- Pools ---\n\n /** Create a new sandbox pool with warm pre-booted containers. */\n async createPool(options: CreatePoolOptions): Promise<CreateSandboxPoolResponse> {\n const body: Record<string, unknown> = {\n image: options.image,\n resources: {\n cpus: options.cpus ?? 1.0,\n memory_mb: options.memoryMb ?? 1024,\n ephemeral_disk_mb: options.ephemeralDiskMb ?? 1024,\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null) body.max_containers = options.maxContainers;\n if (options.warmContainers != null) body.warm_containers = options.warmContainers;\n\n return this.plainJson<CreateSandboxPoolResponse>(\n () => this.native.createPool(JSON.stringify(body)),\n \"poolId\",\n );\n }\n\n /** Get current state and metadata for a sandbox pool by ID. */\n async getPool(poolId: string): Promise<SandboxPoolInfo> {\n return this.plainJson<SandboxPoolInfo>(\n () => this.native.getPool(poolId),\n \"poolId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /** List all sandbox pools in the namespace. */\n async listPools(): Promise<Traced<SandboxPoolInfo[]>> {\n const { traceId, json } = await callNative(() => this.native.listPools());\n const parsed = JSON.parse(json) as { pools?: Record<string, unknown>[] };\n const pools = (parsed.pools ?? []).map(\n (p) => fromSnakeKeys(p, \"poolId\") as SandboxPoolInfo,\n );\n return Object.assign(pools, { traceId });\n }\n\n /** Replace the configuration of an existing sandbox pool. */\n async updatePool(\n poolId: string,\n options: UpdatePoolOptions,\n ): Promise<SandboxPoolInfo> {\n const body: Record<string, unknown> = {\n image: options.image,\n resources: {\n cpus: options.cpus ?? 1.0,\n memory_mb: options.memoryMb ?? 1024,\n ephemeral_disk_mb: options.ephemeralDiskMb ?? 1024,\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null) body.max_containers = options.maxContainers;\n if (options.warmContainers != null) body.warm_containers = options.warmContainers;\n\n return this.plainJson<SandboxPoolInfo>(\n () => this.native.updatePool(poolId, JSON.stringify(body)),\n \"poolId\",\n { poolId, notFoundKind: \"pool\" },\n );\n }\n\n /** Delete a sandbox pool. Fails if the pool has active containers. */\n async deletePool(poolId: string): Promise<void> {\n await callNative(() => this.native.deletePool(poolId), { poolId, notFoundKind: \"pool\" });\n }\n\n // --- Connect ---\n\n /** Return a `Sandbox` handle for an existing running sandbox without verifying it exists. */\n connect(\n identifier: string,\n proxyUrl?: string,\n routingHint?: string,\n requestTimeout?: number,\n explicitProxyUrl?: string,\n ): Sandbox {\n const explicitProxyUrlProvided = arguments.length >= 5;\n const resolvedExplicitProxyUrl = explicitProxyUrlProvided\n ? explicitProxyUrl ?? undefined\n : proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n return new Sandbox({\n sandboxId: identifier,\n proxyUrl,\n explicitProxyUrl: resolvedExplicitProxyUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n routingHint,\n resolveProxyInfo: async (currentIdentifier) => this.get(currentIdentifier),\n requestTimeout,\n nativeClient: this.native,\n });\n }\n\n /**\n * Create a sandbox, wait for it to reach `Running`, and return a connected handle.\n *\n * Blocks until the sandbox is ready or `requestTimeout` elapses. The returned\n * `Sandbox` auto-terminates when `terminate()` is called.\n */\n async createAndConnect(\n options?: CreateAndConnectOptions,\n ): Promise<Sandbox> {\n const opStart = nowMs();\n const requestTimeout =\n options?.requestTimeout ??\n options?.startupTimeout ??\n this.requestTimeoutMs / 1000;\n const requestClient = this.withRequestTimeout(requestTimeout);\n logSdkTimingEvent(\"sandbox.create\", \"start\", {\n request_timeout_s: requestTimeout,\n image: options?.image,\n pool_id: options?.poolId,\n });\n\n // claim() never sends options.name to the server, so only create() should fall\n // back to it locally when the server response omits a name.\n const createStart = nowMs();\n const result = options?.poolId != null\n ? await requestClient.claim(options.poolId)\n : await requestClient.create(options);\n logSdkTiming(\"sandbox.create\", options?.poolId != null ? \"claim_response\" : \"create_response\", createStart, {\n sandbox_id: result.sandboxId,\n status: result.status,\n server_trace_id: result.traceId,\n });\n const requestedName = options?.poolId != null ? null : options?.name ?? null;\n\n const finishConnect = (\n sandboxId: string,\n routingHint: string | undefined,\n name: string | null | undefined,\n ingressEndpoint: string | undefined,\n sandboxUrl: string | undefined,\n ) => {\n const explicitProxyUrl = options?.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = this.native.selectSandboxProxyUrl(\n sandboxId,\n sandboxUrl ?? null,\n ingressEndpoint ?? null,\n explicitProxyUrl ?? null,\n );\n const sandbox = requestClient.connect(\n sandboxId,\n selectedProxyUrl,\n routingHint,\n requestTimeout,\n explicitProxyUrl,\n );\n sandbox._setOwner(requestClient);\n sandbox.traceId = result.traceId;\n sandbox._setLifecycleIdentifier(sandboxId);\n sandbox._setName(name ?? requestedName);\n logSdkTiming(\"sandbox.create\", \"complete\", opStart, {\n sandbox_id: sandboxId,\n status: SandboxStatus.RUNNING,\n server_trace_id: result.traceId,\n routing_hint: routingHint,\n ingress_endpoint: ingressEndpoint,\n sandbox_url: sandboxUrl,\n });\n return sandbox;\n };\n\n // Fast path: the blocking create/claim response already carries Running status\n // and a short-lived routing hint. Use it immediately to skip an extra poll RTT\n // and let the proxy route the first request without a placement lookup.\n if (result.status === SandboxStatus.RUNNING) {\n return finishConnect(\n result.sandboxId,\n result.routingHint,\n result.name,\n result.ingressEndpoint,\n result.sandboxUrl,\n );\n }\n if (\n result.status === SandboxStatus.SUSPENDED ||\n result.status === SandboxStatus.TERMINATED\n ) {\n throw new SandboxError(\n formatStartupFailureMessage(result.sandboxId, result.status, {\n errorDetails: result.errorDetails,\n terminationReason: result.terminationReason,\n }),\n );\n }\n if (result.status === SandboxStatus.TIMEOUT) {\n try {\n await requestClient.delete(result.sandboxId);\n } catch {\n // ignore cleanup failures\n }\n throw new SandboxError(\n `Sandbox ${result.sandboxId} did not start within ${requestTimeout}s`,\n );\n }\n\n const deadline = Date.now() + secondsToMillis(requestTimeout);\n\n while (Date.now() < deadline) {\n const pollStart = nowMs();\n const info = await requestClient.get(result.sandboxId);\n logSdkTiming(\"sandbox.create\", \"poll_response\", pollStart, {\n sandbox_id: result.sandboxId,\n status: info.status,\n server_trace_id: info.traceId,\n });\n if (info.status === SandboxStatus.RUNNING) {\n return finishConnect(\n info.sandboxId,\n info.routingHint,\n info.name,\n info.ingressEndpoint,\n info.sandboxUrl,\n );\n }\n if (\n info.status === SandboxStatus.SUSPENDED ||\n info.status === SandboxStatus.TERMINATED\n ) {\n throw new SandboxError(\n formatStartupFailureMessage(result.sandboxId, info.status, {\n errorDetails: info.errorDetails,\n terminationReason: info.terminationReason,\n }),\n );\n }\n await sleep(500);\n }\n\n // Timed out — clean up\n try {\n await requestClient.delete(result.sandboxId);\n } catch {\n // ignore cleanup failures\n }\n throw new SandboxError(\n `Sandbox ${result.sandboxId} did not start within ${requestTimeout}s`,\n );\n }\n}\n\nfunction resolveRequestTimeoutMs(\n options?: { requestTimeout?: number; timeoutMs?: number },\n): number {\n if (options?.requestTimeout != null) {\n return secondsToMillis(options.requestTimeout);\n }\n if (options?.timeoutMs != null) {\n validateTimeoutMs(options.timeoutMs);\n return options.timeoutMs;\n }\n return defaults.DEFAULT_HTTP_TIMEOUT_MS;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new SandboxError(\"requestTimeout must be a positive number of seconds\");\n }\n return Math.ceil(seconds * 1000);\n}\n\nfunction validateTimeoutMs(timeoutMs: number): void {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new SandboxError(\"timeoutMs must be a positive number of milliseconds\");\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction snapshotStatusSatisfiesWaitCondition(\n status: SnapshotStatus | string,\n waitUntil: SnapshotWaitCondition,\n): boolean {\n if (waitUntil === \"local_ready\") {\n return status === SnapshotStatus.LOCAL_READY || status === SnapshotStatus.COMPLETED;\n }\n return status === SnapshotStatus.COMPLETED;\n}\n\nfunction formatStartupFailureMessage(\n sandboxId: string,\n status: SandboxStatus | string,\n options: {\n errorDetails?: unknown;\n terminationReason?: string;\n },\n): string {\n const prefix = status === SandboxStatus.TERMINATED\n ? `Sandbox ${sandboxId} terminated during startup`\n : `Sandbox ${sandboxId} became ${status} during startup`;\n const detail = formatErrorDetails(options.errorDetails);\n if (detail) {\n return `${prefix}: ${detail}`;\n }\n if (options.terminationReason) {\n return `${prefix}: termination reason: ${options.terminationReason}`;\n }\n return prefix;\n}\n\nfunction formatErrorDetails(errorDetails: unknown): string | undefined {\n if (errorDetails == null) return undefined;\n if (typeof errorDetails === \"string\") {\n const detail = errorDetails.trim();\n return detail || undefined;\n }\n if (Array.isArray(errorDetails)) {\n const parts = errorDetails\n .map((item) => formatErrorDetails(item))\n .filter((item): item is string => Boolean(item));\n return parts.length > 0 ? parts.join(\"; \") : JSON.stringify(errorDetails);\n }\n if (typeof errorDetails === \"object\") {\n for (const key of [\"message\", \"detail\", \"error\", \"reason\"]) {\n const value = (errorDetails as Record<string, unknown>)[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return JSON.stringify(errorDetails);\n }\n return String(errorDetails);\n}\n\nconst RESERVED_SANDBOX_MANAGEMENT_PORT = 9501;\n\nfunction normalizeUserPorts(ports: number[]): number[] {\n return dedupeAndSortPorts(ports.map(validateUserPort));\n}\n\nfunction validateUserPort(port: number): number {\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new SandboxError(`invalid port '${port}'`);\n }\n if (port === RESERVED_SANDBOX_MANAGEMENT_PORT) {\n throw new SandboxError(\"port 9501 is reserved for sandbox management\");\n }\n return port;\n}\n\nfunction dedupeAndSortPorts(ports: number[]): number[] {\n return [...new Set(ports)].sort((a, b) => a - b);\n}\n","import {\n Agent,\n fetch as undiciFetch,\n setGlobalDispatcher,\n type BodyInit as UndiciBodyInit,\n} from \"undici\";\nimport * as defaults from \"./defaults.js\";\nimport {\n describeError,\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxNotFoundError,\n} from \"./errors.js\";\nimport {\n nowMs,\n logSdkTimingEvent,\n logSdkTiming,\n sdkTimingPayloadsEnabled,\n} from \"./sdk-timings.js\";\n\nconst REQUEST_TIMEOUT_HEADER = \"X-Tensorlake-Request-Timeout-Ms\";\n\nexport interface HttpClientOptions {\n baseUrl: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n hostHeader?: string;\n sandboxIdHeader?: string;\n routingHint?: string;\n maxRetries?: number;\n retryBackoffMs?: number;\n timeoutMs?: number | null;\n}\n\nsetGlobalDispatcher(\n new Agent({\n keepAliveTimeout: 60_000,\n allowH2: true,\n }),\n);\n\n\ntype RequestBody = BodyInit | Uint8Array | ArrayBuffer;\n\nexport interface HttpRequestOptions {\n body?: RequestBody | null;\n headers?: Record<string, string>;\n json?: unknown;\n signal?: AbortSignal;\n allowHttpErrors?: boolean;\n retryableStatusCodes?: Set<number>;\n allowedErrorStatusCodes?: Set<number>;\n}\n\n/**\n * The return value of every SDK operation. Carries the W3C `trace_id` so callers\n * can correlate a specific request with its server-side spans in Datadog APM or\n * any other OTEL-compatible backend.\n *\n * Because this is an intersection type, all properties of `T` are accessible\n * directly — existing code that ignores `traceId` continues to compile and run\n * unchanged.\n *\n * @example\n * const sandbox = await client.createSandbox(req);\n * console.log(sandbox.id); // existing field — unchanged\n * console.log(sandbox.traceId); // new: look this up in Datadog APM\n */\nexport type Traced<T> = T & { readonly traceId: string };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withTraceId<T>(value: T, traceId: string): Traced<T> {\n if (value == null) {\n return { traceId } as unknown as Traced<T>;\n }\n return Object.assign(value as any, { traceId }) as Traced<T>;\n}\n\n/**\n * Internal HTTP client with retry logic, auth headers, and error mapping.\n *\n * Uses native `fetch`. Retries on transient status codes (429, 502, 503, 504)\n * with exponential backoff.\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private readonly maxRetries: number;\n private readonly retryBackoffMs: number;\n private readonly timeoutMs: number | null;\n private abortController: AbortController | null = null;\n\n constructor(options: HttpClientOptions) {\n const url = options.baseUrl;\n this.baseUrl = url.endsWith(\"/\") ? url.slice(0, -1) : url;\n this.maxRetries = options.maxRetries ?? defaults.MAX_RETRIES;\n this.retryBackoffMs = options.retryBackoffMs ?? defaults.RETRY_BACKOFF_MS;\n this.timeoutMs = options.timeoutMs === undefined\n ? defaults.DEFAULT_HTTP_TIMEOUT_MS\n : options.timeoutMs;\n\n this.headers = {\n \"User-Agent\": `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n };\n if (this.timeoutMs != null) {\n this.headers[REQUEST_TIMEOUT_HEADER] = String(this.timeoutMs);\n }\n if (options.apiKey) {\n this.headers[\"Authorization\"] = `Bearer ${options.apiKey}`;\n }\n if (options.organizationId) {\n this.headers[\"X-Forwarded-Organization-Id\"] = options.organizationId;\n }\n if (options.projectId) {\n this.headers[\"X-Forwarded-Project-Id\"] = options.projectId;\n }\n if (options.hostHeader) {\n this.headers[\"Host\"] = options.hostHeader;\n }\n if (options.sandboxIdHeader) {\n this.headers[\"X-Tensorlake-Sandbox-Id\"] = options.sandboxIdHeader;\n }\n if (options.routingHint) {\n this.headers[\"X-Tensorlake-Route-Hint\"] = options.routingHint;\n }\n }\n\n close(): void {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n /** Make a JSON request, returning the parsed response body. */\n async requestJson<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n retryableStatusCodes?: Set<number>;\n allowedErrorStatusCodes?: Set<number>;\n allowHttpErrors?: boolean;\n },\n ): Promise<Traced<T>> {\n const response = await this.requestResponse(method, path, {\n json: options?.body,\n headers: options?.headers,\n signal: options?.signal,\n retryableStatusCodes: options?.retryableStatusCodes,\n allowedErrorStatusCodes: options?.allowedErrorStatusCodes,\n allowHttpErrors: options?.allowHttpErrors,\n });\n const text = await response.text();\n const data = (text ? JSON.parse(text) : undefined) as T;\n return withTraceId(data, response.traceId);\n }\n\n /** Make a request returning raw bytes. */\n async requestBytes(\n method: string,\n path: string,\n options?: {\n body?: RequestBody | null;\n contentType?: string;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n },\n ): Promise<Traced<Uint8Array>> {\n const headers = { ...(options?.headers ?? {}) };\n if (options?.contentType) {\n headers[\"Content-Type\"] = options.contentType;\n }\n\n const response = await this.requestResponse(method, path, {\n body: options?.body,\n headers,\n signal: options?.signal,\n });\n const buffer = await response.arrayBuffer();\n return withTraceId(new Uint8Array(buffer), response.traceId);\n }\n\n /** Make a request and return the response body as an SSE stream. */\n async requestStream(\n method: string,\n path: string,\n options?: { signal?: AbortSignal; json?: unknown },\n ): Promise<Traced<ReadableStream<Uint8Array>>> {\n const response = await this.requestResponse(method, path, {\n json: options?.json,\n headers: { Accept: \"text/event-stream\" },\n signal: options?.signal,\n });\n if (!response.body) {\n throw new RemoteAPIError(\n response.status,\n \"No response body for SSE stream\",\n );\n }\n return withTraceId(response.body, response.traceId);\n }\n\n /** Make a request and return the raw Response. */\n async requestResponse(\n method: string,\n path: string,\n options?: HttpRequestOptions,\n ): Promise<Traced<Response>> {\n const headers = {\n ...this.headers,\n ...(options?.headers ?? {}),\n };\n const hasJsonBody = options?.json !== undefined;\n if (hasJsonBody && !hasHeader(headers, \"Content-Type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const body = hasJsonBody\n ? JSON.stringify(options?.json)\n : normalizeRequestBody(options?.body);\n\n const { response, traceId } = await this.doFetch(\n method,\n path,\n body,\n headers,\n options?.signal,\n options?.allowHttpErrors ?? false,\n options?.retryableStatusCodes ?? defaults.RETRYABLE_STATUS_CODES,\n options?.allowedErrorStatusCodes ?? new Set(),\n );\n return withTraceId(response, traceId);\n }\n\n private static makeTraceparent(): { traceparent: string; traceId: string } {\n const randomHex = (bytes: number) =>\n Array.from(crypto.getRandomValues(new Uint8Array(bytes)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const traceId = randomHex(16);\n const spanId = randomHex(8);\n return { traceparent: `00-${traceId}-${spanId}-01`, traceId };\n }\n\n private async doFetch(\n method: string,\n path: string,\n body: UndiciBodyInit | undefined,\n headers: Record<string, string>,\n signal?: AbortSignal,\n allowHttpErrors = false,\n retryableStatusCodes: Set<number> = defaults.RETRYABLE_STATUS_CODES,\n allowedErrorStatusCodes: Set<number> = new Set(),\n ): Promise<{ response: Response; traceId: string }> {\n const url = `${this.baseUrl}${path}`;\n const { traceparent, traceId } = HttpClient.makeTraceparent();\n headers[\"traceparent\"] = traceparent;\n let lastError: Error | undefined;\n const operationStart = nowMs();\n const timingPath = sdkTimingPayloadsEnabled() ? path : stripPathPayload(path);\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryBackoffMs * Math.pow(2, attempt - 1);\n logSdkTimingEvent(\"http.request\", \"retry_sleep_start\", {\n method,\n path: timingPath,\n attempt,\n delay_ms: delay,\n server_trace_id: traceId,\n });\n await sleep(delay);\n }\n\n this.abortController = new AbortController();\n // Track whether *our* deadline fired, so we can tell a client-imposed\n // timeout apart from a network rejection or a caller-initiated abort.\n let timedOut = false;\n const timeoutId = this.timeoutMs == null\n ? null\n : setTimeout(() => {\n timedOut = true;\n this.abortController?.abort();\n }, this.timeoutMs);\n\n // Combine external signal with internal timeout\n const combinedSignal = signal\n ? anySignal([signal, this.abortController.signal])\n : this.abortController.signal;\n\n const attemptStart = nowMs();\n try {\n const response = (await undiciFetch(url, {\n method,\n headers,\n body,\n signal: combinedSignal,\n })) as Response;\n\n if (timeoutId != null) clearTimeout(timeoutId);\n logSdkTiming(\"http.request\", \"headers\", attemptStart, {\n method,\n path: timingPath,\n status: response.status,\n attempt,\n server_trace_id: traceId,\n });\n\n if (response.ok) {\n logSdkTiming(\"http.request\", \"complete\", operationStart, {\n method,\n path: timingPath,\n status: response.status,\n attempts: attempt + 1,\n server_trace_id: traceId,\n });\n return { response, traceId };\n }\n\n // Check if retryable\n if (\n retryableStatusCodes.has(response.status) &&\n attempt < this.maxRetries\n ) {\n lastError = new RemoteAPIError(\n response.status,\n await response.text().catch(() => \"\"),\n );\n logSdkTimingEvent(\"http.request\", \"retryable_status\", {\n method,\n path: timingPath,\n status: response.status,\n attempt,\n server_trace_id: traceId,\n });\n continue;\n }\n\n if (allowHttpErrors || allowedErrorStatusCodes.has(response.status)) {\n logSdkTiming(\"http.request\", \"complete\", operationStart, {\n method,\n path: timingPath,\n status: response.status,\n attempts: attempt + 1,\n server_trace_id: traceId,\n });\n return { response, traceId };\n }\n\n // Non-retryable error — throw mapped error\n const errorBody = await response.text().catch(() => \"\");\n throwMappedError(response.status, errorBody, path);\n } catch (err) {\n if (timeoutId != null) clearTimeout(timeoutId);\n\n if (\n err instanceof RemoteAPIError ||\n err instanceof SandboxNotFoundError ||\n err instanceof PoolNotFoundError ||\n err instanceof PoolInUseError\n ) {\n throw err;\n }\n\n // A caller-supplied signal fired (and it wasn't our own deadline).\n if (signal?.aborted && !timedOut) {\n throw new SandboxConnectionError(\"request aborted by caller\", {\n cause: err,\n });\n }\n\n // Network / timeout error\n lastError = err instanceof Error ? err : new Error(String(err));\n logSdkTiming(\"http.request\", \"error\", attemptStart, {\n method,\n path: timingPath,\n attempt,\n server_trace_id: traceId,\n error: timedOut ? `request timed out after ${this.timeoutMs}ms` : describeError(err),\n });\n\n if (attempt >= this.maxRetries) {\n // Surface the real inner cause; for our own deadline, say so plainly.\n const detail = timedOut\n ? `request timed out after ${this.timeoutMs}ms`\n : describeError(err);\n throw new SandboxConnectionError(detail, { cause: err });\n }\n }\n }\n\n throw new SandboxConnectionError(\n lastError ? describeError(lastError) : \"request failed\",\n { cause: lastError },\n );\n }\n}\n\nfunction hasHeader(headers: Record<string, string>, name: string): boolean {\n const lowered = name.toLowerCase();\n return Object.keys(headers).some((key) => key.toLowerCase() === lowered);\n}\n\nfunction normalizeRequestBody(\n body?: RequestBody | null,\n): UndiciBodyInit | undefined {\n if (body == null) {\n return undefined;\n }\n if (body instanceof Uint8Array) {\n return Uint8Array.from(body).buffer as ArrayBuffer;\n }\n return body as UndiciBodyInit;\n}\n\nfunction stripPathPayload(path: string): string {\n const queryStart = path.search(/[?#]/);\n return queryStart === -1 ? path : path.slice(0, queryStart);\n}\n\n/** Map HTTP status codes to specific error types. */\nfunction throwMappedError(status: number, body: string, path: string): never {\n let message = body;\n try {\n const parsed = JSON.parse(body);\n if (parsed.message) message = parsed.message;\n else if (parsed.error) message = parsed.error;\n } catch {\n // use raw body\n }\n\n if (status === 404) {\n // Determine entity type from path\n if (path.includes(\"sandbox-pools\") || path.includes(\"pools\")) {\n const match = path.match(/sandbox-pools\\/([^/]+)/);\n if (match) throw new PoolNotFoundError(match[1]);\n }\n if (path.includes(\"sandboxes\")) {\n const match = path.match(/sandboxes\\/([^/]+)/);\n if (match) throw new SandboxNotFoundError(match[1]);\n }\n throw new RemoteAPIError(404, message);\n }\n\n if (status === 409) {\n if (path.includes(\"sandbox-pools\") || path.includes(\"pools\")) {\n const match = path.match(/sandbox-pools\\/([^/]+)/);\n if (match) throw new PoolInUseError(match[1], message);\n }\n }\n\n throw new RemoteAPIError(status, message);\n}\n\n/** Combine multiple AbortSignals into one that aborts when any fires. */\nfunction anySignal(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n signal.addEventListener(\"abort\", () => controller.abort(signal.reason), {\n once: true,\n });\n }\n return controller.signal;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export interface SSEMessage {\n data: string;\n event?: string;\n id?: string;\n}\n\n/**\n * Parse a Server-Sent Events stream into raw SSE messages.\n */\nexport async function* parseSSEMessages(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncIterable<SSEMessage> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n if (signal?.aborted) break;\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n const lines = part.split(/\\r?\\n/);\n const dataLines: string[] = [];\n let event: string | undefined;\n let id: string | undefined;\n\n for (const line of lines) {\n if (!line || line.startsWith(\":\")) continue;\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n let value = separator === -1 ? \"\" : line.slice(separator + 1);\n if (value.startsWith(\" \")) {\n value = value.slice(1);\n }\n\n if (field === \"data\") {\n dataLines.push(value);\n } else if (field === \"event\") {\n event = value;\n } else if (field === \"id\") {\n id = value;\n }\n }\n\n if (dataLines.length > 0 || event || id) {\n yield { data: dataLines.join(\"\\n\"), event, id };\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Parse a Server-Sent Events stream from a ReadableStream<Uint8Array>.\n *\n * Yields parsed JSON objects for each `data:` line. Handles reconnection\n * by simply yielding events as they arrive.\n */\nexport async function* parseSSEStream<T>(\n stream: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncIterable<T> {\n for await (const message of parseSSEMessages(stream, signal)) {\n if (!message.data) continue;\n try {\n yield JSON.parse(message.data) as T;\n } catch {\n // Skip malformed JSON\n }\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { HttpClient } from \"./http.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport { parseSSEStream } from \"./sse.js\";\nimport type {\n ApiKeyIntrospection,\n ApplicationBuildContext,\n ApplicationBuildResponse,\n ApplicationManifest,\n ApplicationSummary,\n BinaryPayload,\n BuildInfo,\n BuildLogEntry,\n CloudClientOptions,\n CreateApplicationBuildRequest,\n NewSecret,\n RequestInput,\n RequestMetadata,\n RequestOutput,\n SandboxTemplate,\n Secret,\n SecretsList,\n FileSystem,\n StartImageBuildRequest,\n UpsertSecretResponse,\n} from \"./cloud-models.js\";\n\nexport class CloudClient {\n private readonly http: HttpClient;\n private readonly organizationId?: string;\n private readonly projectId?: string;\n private readonly namespace: string;\n\n constructor(options?: CloudClientOptions) {\n this.organizationId = options?.organizationId;\n this.projectId = options?.projectId;\n this.namespace = options?.namespace ?? defaults.NAMESPACE;\n this.http = new HttpClient({\n baseUrl: options?.apiUrl ?? defaults.API_URL,\n apiKey: options?.apiKey ?? defaults.API_KEY,\n organizationId: this.organizationId,\n projectId: this.projectId,\n maxRetries: options?.maxRetries ?? defaults.MAX_RETRIES,\n retryBackoffMs: options?.retryBackoffMs ?? defaults.RETRY_BACKOFF_MS,\n });\n }\n\n static forCloud(options?: CloudClientOptions): CloudClient {\n return new CloudClient(options);\n }\n\n close(): void {\n this.http.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: BinaryPayload,\n upgradeRunningRequests = false,\n ): Promise<void> {\n const form = new FormData();\n form.append(\n \"code\",\n new Blob([toBlobPart(codeZip)], { type: \"application/zip\" }),\n \"code.zip\",\n );\n form.append(\"code_content_type\", \"application/zip\");\n form.append(\"application\", JSON.stringify(manifest));\n form.append(\n \"upgrade_requests_to_latest_code\",\n String(upgradeRunningRequests),\n );\n\n await this.http.requestResponse(\"POST\", this.namespacePath(\"applications\"), {\n body: form,\n });\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.http.requestResponse(\n \"DELETE\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.http.requestResponse(\n \"DELETE\",\n this.namespacePath(`sandbox-images/${encodeURIComponent(imageName)}`),\n );\n }\n\n /**\n * Look up a registered sandbox image (template) by its registered name.\n *\n * Returns the template, or `null` when no image with that name exists.\n * Routed through the platform sandbox-templates API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async findSandboxImageByName(\n imageName: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate | null> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const response = await this.http.requestResponse(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/sandbox-templates/by-name/${encodeURIComponent(imageName)}`,\n { allowedErrorStatusCodes: new Set([404]) },\n );\n if (response.status === 404) {\n return null;\n }\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as SandboxTemplate;\n }\n\n /**\n * List all registered sandbox images (templates), following pagination to\n * the end. Routed through the platform sandbox-templates API, which requires\n * the organization/project scope (from the client or the `options` override).\n */\n async listSandboxImages(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate[]> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const base = `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/sandbox-templates`;\n let path: string | null = `${base}?pageSize=100`;\n const templates: SandboxTemplate[] = [];\n while (path !== null) {\n const page: SandboxTemplatesPage = await this.http.requestJson<SandboxTemplatesPage>(\n \"GET\",\n path,\n );\n for (const item of page.items ?? []) {\n templates.push(fromSnakeKeys(item) as SandboxTemplate);\n }\n const next = page.pagination?.next;\n path = next ? nextRequestPath(next) : null;\n }\n return templates;\n }\n\n /**\n * Register a new file system with the project.\n *\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async createFileSystem(\n request: { name: string; description?: string },\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const body: Record<string, unknown> = { name: request.name };\n if (request.description != null) body.description = request.description;\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems`,\n { body },\n );\n return fromSnakeKeys(raw) as FileSystem;\n }\n\n /**\n * List all registered file systems, following pagination to the end.\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async listFileSystems(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem[]> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const base = `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems`;\n let path: string | null = `${base}?pageSize=100`;\n const fileSystems: FileSystem[] = [];\n while (path !== null) {\n const page: FileSystemsPage =\n await this.http.requestJson<FileSystemsPage>(\"GET\", path);\n for (const item of page.items ?? []) {\n fileSystems.push(fromSnakeKeys(item) as FileSystem);\n }\n const next = page.pagination?.next;\n path = next ? nextRequestPath(next) : null;\n }\n return fileSystems;\n }\n\n /**\n * Delete a registered file system by its id (e.g. `file_system_...`).\n * Routed through the platform file-systems API, which requires the\n * organization/project scope (from the client or the `options` override).\n */\n async deleteFileSystem(\n fileSystemId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n await this.http.requestResponse(\n \"DELETE\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/file-systems/${encodeURIComponent(fileSystemId)}`,\n );\n }\n\n async applications(): Promise<ApplicationSummary[]> {\n const raw = await this.http.requestJson<{ applications: Record<string, unknown>[] }>(\n \"GET\",\n this.namespacePath(\"applications\"),\n );\n return (raw.applications ?? []).map(\n (application) => fromSnakeKeys(application) as ApplicationSummary,\n );\n }\n\n async applicationManifest(applicationName: string): Promise<ApplicationManifest> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n return fromSnakeKeys(raw) as ApplicationManifest;\n }\n\n async runRequest(\n applicationName: string,\n inputs: RequestInput[] = [],\n ): Promise<string> {\n const path = this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}`,\n );\n\n const response =\n inputs.length === 0\n ? await this.http.requestResponse(\"POST\", path, {\n body: new Uint8Array(),\n headers: { Accept: \"application/json\" },\n })\n : inputs.length === 1 && inputs[0].name === \"0\"\n ? await this.http.requestResponse(\"POST\", path, {\n body: toRequestBody(inputs[0].data),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": inputs[0].contentType,\n },\n })\n : await this.runMultipartRequest(path, inputs);\n\n const body = await parseJsonResponse<{ request_id?: string }>(response);\n const requestId = body?.request_id;\n if (!requestId) {\n throw new Error(\"missing request_id in run request response body\");\n }\n return requestId;\n }\n\n async waitOnRequestCompletion(\n applicationName: string,\n requestId: string,\n ): Promise<void> {\n const stream = await this.http.requestStream(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/progress`,\n ),\n );\n\n for await (const event of parseSSEStream<Record<string, unknown>>(stream)) {\n if (Object.prototype.hasOwnProperty.call(event, \"RequestFinished\")) {\n return;\n }\n }\n\n throw new Error(\"progress stream ended before request completion\");\n }\n\n async requestMetadata(\n applicationName: string,\n requestId: string,\n ): Promise<RequestMetadata> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}`,\n ),\n );\n return fromSnakeKeys(raw) as RequestMetadata;\n }\n\n async requestOutput(\n applicationName: string,\n requestId: string,\n ): Promise<RequestOutput> {\n const response = await this.http.requestResponse(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/output`,\n ),\n );\n\n const serializedValue = new Uint8Array(await response.arrayBuffer());\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n return {\n serializedValue,\n contentType,\n };\n }\n\n async introspectApiKey(): Promise<ApiKeyIntrospection> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n \"/platform/v1/keys/introspect\",\n );\n return fromSnakeKeys(raw) as ApiKeyIntrospection;\n }\n\n async listSecrets(options?: {\n organizationId?: string;\n projectId?: string;\n pageSize?: number;\n }): Promise<SecretsList> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets?pageSize=${options?.pageSize ?? 100}`,\n );\n return fromSnakeKeys(raw) as SecretsList;\n }\n\n async getSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<Secret> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets/${encodeURIComponent(secretId)}`,\n );\n return fromSnakeKeys(raw) as Secret;\n }\n\n async upsertSecrets(\n secrets: NewSecret | NewSecret[],\n options?: { organizationId?: string; projectId?: string },\n ): Promise<UpsertSecretResponse> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n const raw = await this.http.requestJson<Record<string, unknown> | Record<string, unknown>[]>(\n \"PUT\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets`,\n { body: secrets },\n );\n if (Array.isArray(raw)) {\n return raw.map((secret) => fromSnakeKeys(secret) as Secret);\n }\n return fromSnakeKeys(raw) as Secret;\n }\n\n async deleteSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const scope = this.resolveScope(options?.organizationId, options?.projectId);\n await this.http.requestResponse(\n \"DELETE\",\n `/platform/v1/organizations/${encodeURIComponent(scope.organizationId)}/projects/${encodeURIComponent(scope.projectId)}/secrets/${encodeURIComponent(secretId)}`,\n );\n }\n\n async startImageBuild(\n buildServicePath: string,\n request: StartImageBuildRequest,\n ): Promise<BuildInfo> {\n const form = new FormData();\n form.append(\"graph_name\", request.applicationName);\n form.append(\"graph_version\", request.applicationVersion);\n form.append(\"graph_function_name\", request.functionName);\n form.append(\"image_name\", request.imageName);\n form.append(\"image_id\", request.imageId);\n form.append(\n \"context\",\n new Blob([toBlobPart(request.buildContext)]),\n \"context.tar.gz\",\n );\n\n const response = await this.http.requestResponse(\n \"PUT\",\n `${trimTrailingSlashes(buildServicePath)}/builds`,\n { body: form },\n );\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as BuildInfo;\n }\n\n async createApplicationBuild(\n buildServicePath: string,\n request: CreateApplicationBuildRequest,\n imageContexts: ApplicationBuildContext[],\n ): Promise<ApplicationBuildResponse> {\n const form = createApplicationBuildForm(request, imageContexts);\n const response = await this.http.requestResponse(\n \"POST\",\n trimTrailingSlashes(buildServicePath),\n { body: form },\n );\n const raw = await parseJsonResponse<Record<string, unknown>>(response);\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async applicationBuildInfo(\n buildServicePath: string,\n applicationBuildId: string,\n ): Promise<ApplicationBuildResponse> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/${encodeURIComponent(applicationBuildId)}`,\n );\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async cancelApplicationBuild(\n buildServicePath: string,\n applicationBuildId: string,\n ): Promise<ApplicationBuildResponse> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"POST\",\n `${trimTrailingSlashes(buildServicePath)}/${encodeURIComponent(applicationBuildId)}/cancel`,\n );\n return fromSnakeKeys(raw) as ApplicationBuildResponse;\n }\n\n async buildInfo(\n buildServicePath: string,\n buildId: string,\n ): Promise<BuildInfo> {\n const raw = await this.http.requestJson<Record<string, unknown>>(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}`,\n );\n return fromSnakeKeys(raw) as BuildInfo;\n }\n\n async cancelBuild(buildServicePath: string, buildId: string): Promise<void> {\n await this.http.requestResponse(\n \"POST\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/cancel`,\n );\n }\n\n async *streamBuildLogs(\n buildServicePath: string,\n buildId: string,\n signal?: AbortSignal,\n ): AsyncIterable<BuildLogEntry> {\n const stream = await this.http.requestStream(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/logs`,\n { signal },\n );\n for await (const event of parseSSEStream<Record<string, unknown>>(stream, signal)) {\n yield fromSnakeKeys(event) as BuildLogEntry;\n }\n }\n\n private async runMultipartRequest(\n path: string,\n inputs: RequestInput[],\n ): Promise<Response> {\n const form = new FormData();\n for (const input of inputs) {\n form.append(\n input.name,\n new Blob([toBlobPart(input.data)], { type: input.contentType }),\n input.name,\n );\n }\n return this.http.requestResponse(\"POST\", path, {\n body: form,\n headers: { Accept: \"application/json\" },\n });\n }\n\n private namespacePath(subpath: string): string {\n return `/v1/namespaces/${encodeURIComponent(this.namespace)}/${subpath.replace(/^\\/+/, \"\")}`;\n }\n\n private resolveScope(\n organizationId?: string,\n projectId?: string,\n ): { organizationId: string; projectId: string } {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\n \"organizationId and projectId are required for this operation\",\n );\n }\n return {\n organizationId: resolvedOrganizationId,\n projectId: resolvedProjectId,\n };\n }\n}\n\nfunction createApplicationBuildForm(\n request: CreateApplicationBuildRequest,\n imageContexts: ApplicationBuildContext[],\n): FormData {\n const contextsByPartName = new Map<string, ApplicationBuildContext>();\n for (const context of imageContexts) {\n if (contextsByPartName.has(context.contextTarPartName)) {\n throw new Error(\n `duplicate image context part name '${context.contextTarPartName}'`,\n );\n }\n contextsByPartName.set(context.contextTarPartName, context);\n }\n\n const form = new FormData();\n form.append(\n \"app_version\",\n new Blob([JSON.stringify(request)], { type: \"application/json\" }),\n \"app_version\",\n );\n\n for (const image of request.images) {\n const context = contextsByPartName.get(image.contextTarPartName);\n if (!context) {\n throw new Error(\n `missing image context for part '${image.contextTarPartName}'`,\n );\n }\n form.append(\n image.contextTarPartName,\n new Blob([toBlobPart(context.contextTarGz)]),\n `${image.contextTarPartName}.tar.gz`,\n );\n }\n\n for (const context of imageContexts) {\n if (!request.images.some((image) => image.contextTarPartName === context.contextTarPartName)) {\n throw new Error(\n `unexpected image context for part '${context.contextTarPartName}'`,\n );\n }\n }\n\n return form;\n}\n\nfunction trimTrailingSlashes(value: string): string {\n return value.endsWith(\"/\") ? value.slice(0, -1) : value;\n}\n\n/** One page of the paginated sandbox-templates list response. */\ninterface SandboxTemplatesPage {\n items?: Record<string, unknown>[];\n pagination?: { next?: string };\n}\n\n/** One page of the paginated file-systems list response. */\ninterface FileSystemsPage {\n items?: Record<string, unknown>[];\n pagination?: { next?: string };\n}\n\n/**\n * Reduce a `pagination.next` link to a base-URL-relative request path. The\n * server may return either an absolute URL or an absolute path; the HTTP\n * client always prepends its base URL, so absolute URLs must be reduced to\n * their path+query first.\n */\nfunction nextRequestPath(next: string): string {\n const schemeIndex = next.indexOf(\"://\");\n if (schemeIndex !== -1) {\n const afterScheme = next.slice(schemeIndex + 3);\n const slashIndex = afterScheme.indexOf(\"/\");\n return slashIndex === -1 ? \"/\" : afterScheme.slice(slashIndex);\n }\n return next.startsWith(\"/\") ? next : `/${next}`;\n}\n\nfunction toBlobPart(data: BinaryPayload): string | Blob | ArrayBuffer {\n if (typeof data === \"string\" || data instanceof Blob) {\n return data;\n }\n if (data instanceof Uint8Array) {\n return Uint8Array.from(data).buffer;\n }\n return data;\n}\n\nfunction toRequestBody(data: BinaryPayload): string | Blob | ArrayBuffer {\n return toBlobPart(data);\n}\n\nasync function parseJsonResponse<T>(response: Response): Promise<T> {\n const text = await response.text();\n if (!text) {\n return undefined as T;\n }\n return JSON.parse(text) as T;\n}\n","import { randomUUID } from \"node:crypto\";\n\n// Erased at runtime — safe despite the module cycle with sandbox-image.ts,\n// which imports Image from here.\nimport type { CreateSandboxImageOptions } from \"./sandbox-image.js\";\n\nconst DEFAULT_IMAGE_NAME = \"default\";\n\nexport const ImageBuildOperationType = {\n ADD: \"ADD\",\n COPY: \"COPY\",\n ENV: \"ENV\",\n RUN: \"RUN\",\n WORKDIR: \"WORKDIR\",\n} as const;\n\nexport type ImageBuildOperationType =\n (typeof ImageBuildOperationType)[keyof typeof ImageBuildOperationType];\n\nexport interface ImageBuildOperation {\n type: ImageBuildOperationType;\n args: string[];\n options: Record<string, string>;\n}\n\nexport interface ImageOptions {\n name?: string;\n tag?: string;\n baseImage?: string | null;\n}\n\nfunction cloneOperation(op: ImageBuildOperation): ImageBuildOperation {\n return {\n type: op.type,\n args: [...op.args],\n options: { ...op.options },\n };\n}\n\nexport class Image {\n readonly _id: string;\n readonly _name: string;\n readonly _tag: string;\n readonly _baseImage: string | null;\n readonly _buildOperations: ImageBuildOperation[];\n\n constructor();\n constructor(name: string, tag?: string, baseImage?: string | null);\n constructor(options: ImageOptions);\n constructor(\n nameOrOptions: string | ImageOptions = {},\n tag = \"latest\",\n baseImage: string | null = null,\n ) {\n this._id = randomUUID();\n this._buildOperations = [];\n\n if (typeof nameOrOptions === \"string\") {\n this._name = nameOrOptions;\n this._tag = tag;\n this._baseImage = baseImage;\n return;\n }\n\n this._name = nameOrOptions.name ?? DEFAULT_IMAGE_NAME;\n this._tag = nameOrOptions.tag ?? \"latest\";\n this._baseImage = nameOrOptions.baseImage ?? null;\n }\n\n get name(): string {\n return this._name;\n }\n\n get tag(): string {\n return this._tag;\n }\n\n get baseImage(): string | null {\n return this._baseImage;\n }\n\n get buildOperations(): ImageBuildOperation[] {\n return this._buildOperations.map(cloneOperation);\n }\n\n add(\n src: string,\n dest: string,\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.ADD,\n args: [src, dest],\n options: options == null ? {} : { ...options },\n });\n }\n\n copy(\n src: string,\n dest: string,\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.COPY,\n args: [src, dest],\n options: options == null ? {} : { ...options },\n });\n }\n\n env(key: string, value: string): this {\n return this._addOperation({\n type: ImageBuildOperationType.ENV,\n args: [key, value],\n options: {},\n });\n }\n\n run(\n commands: string | string[],\n options: Record<string, string> | undefined = undefined,\n ): this {\n return this._addOperation({\n type: ImageBuildOperationType.RUN,\n args: Array.isArray(commands) ? [...commands] : [commands],\n options: options == null ? {} : { ...options },\n });\n }\n\n workdir(directory: string): this {\n return this._addOperation({\n type: ImageBuildOperationType.WORKDIR,\n args: [directory],\n options: {},\n });\n }\n\n /**\n * Build this image as a sandbox template and register it.\n *\n * Materializes the image in a build sandbox, snapshots the filesystem,\n * and registers the snapshot as a named sandbox template.\n */\n async build(\n options: CreateSandboxImageOptions = {},\n ): Promise<Record<string, unknown>> {\n const { createSandboxImage } = await import(\"./sandbox-image.js\");\n return createSandboxImage(this, options);\n }\n\n private _addOperation(op: ImageBuildOperation): this {\n this._buildOperations.push(op);\n return this;\n }\n}\n\nfunction renderOptions(options: Record<string, string>): string {\n const entries = Object.entries(options);\n if (entries.length === 0) {\n return \"\";\n }\n return ` ${entries.map(([key, value]) => `--${key}=${value}`).join(\" \")}`;\n}\n\nfunction renderBuildOp(op: ImageBuildOperation): string {\n const options = renderOptions(op.options);\n if (op.type === ImageBuildOperationType.ENV) {\n return `ENV${options} ${op.args[0]}=${JSON.stringify(op.args[1])}`;\n }\n return `${op.type}${options} ${op.args.join(\" \")}`;\n}\n\nexport function dockerfileContent(image: Image): string {\n const lines = image.baseImage == null ? [] : [`FROM ${image.baseImage}`];\n lines.push(...image.buildOperations.map((op) => renderBuildOp(op)));\n return lines.join(\"\\n\");\n}\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { existsSync, mkdtempSync, rmSync } from \"node:fs\";\nimport { parseArgs } from \"node:util\";\nimport { CloudClient } from \"./cloud-client.js\";\nimport type { SandboxTemplate } from \"./cloud-models.js\";\nimport { Image, ImageBuildOperationType, dockerfileContent } from \"./image.js\";\nimport type { ImageBuildOperation } from \"./image.js\";\n\n/**\n * Sandbox-image build engine.\n *\n * Renders the source to a Dockerfile (for `Image` inputs) and hands the\n * Dockerfile path/text + context to the Rust core via `@tensorlake/native`,\n * which parses, validates, materializes, and registers the image. The Rust\n * core owns parsing and the warnings for instructions that run during the\n * build but have no effect when a sandbox runs from the image\n * (`ONBUILD`/`SHELL`/`EXPOSE`/`HEALTHCHECK`/`LABEL`/`STOPSIGNAL`/`VOLUME`).\n */\n\nexport interface CreateSandboxImageOptions {\n registeredName?: string;\n cpus?: number;\n memoryMb?: number;\n diskMb?: number;\n builderDiskMb?: number;\n isPublic?: boolean;\n /**\n * Build context directory for an `Image` source, used exactly like\n * `docker build <contextDir>`: it is uploaded as-is and COPY/ADD sources\n * resolve relative to it. Required when the image has COPY/ADD ops that read\n * host files — building without it then throws. When the image has no such\n * ops it may be omitted, and an empty context (just the generated Dockerfile)\n * is uploaded so cwd is not archived. Ignored when the source is a Dockerfile\n * path (the Dockerfile's parent directory is used instead).\n */\n contextDir?: string;\n /**\n * Use Docker/BuildKit max compatibility mode (build is slower and uses more\n * memory and disk space on builder sandbox).\n */\n dockerCompat?: boolean;\n /**\n * Print build progress to stderr. Ignored when an explicit `emit` is\n * passed via `deps`. Defaults to false — `createSandboxImage` is silent\n * by default when invoked programmatically (e.g. `Image.build()`).\n */\n verbose?: boolean;\n}\n\nexport interface ImportSandboxImageOptions {\n /**\n * Name to register the image under. Defaults to the image reference's last\n * path segment with any tag/digest stripped (e.g. `pytorch/pytorch:2.4.1`\n * -> `pytorch`).\n */\n registeredName?: string;\n cpus?: number;\n memoryMb?: number;\n diskMb?: number;\n builderDiskMb?: number;\n isPublic?: boolean;\n /**\n * Use Docker/BuildKit max compatibility mode (import is slower and uses more\n * memory and disk space on builder sandbox).\n */\n dockerCompat?: boolean;\n /**\n * Print build progress to stderr. Ignored when an explicit `emit` is\n * passed via `deps`. Defaults to false.\n */\n verbose?: boolean;\n}\n\nexport type SandboxImageSource = string | Image;\n\nexport interface CreateSandboxImageDeps {\n emit?: (event: Record<string, unknown>) => void;\n}\n\n// --- Native binding loader -------------------------------------------------\n\n/** Auth/context + resource fields shared by the build and import bindings. */\ninterface NativeBindingCommonOptions {\n apiUrl: string;\n bearerToken: string;\n registeredName?: string | undefined | null;\n diskMb?: number | undefined | null;\n builderDiskMb?: number | undefined | null;\n cpus?: number | undefined | null;\n memoryMb?: number | undefined | null;\n isPublic?: boolean | undefined | null;\n organizationId?: string | undefined | null;\n projectId?: string | undefined | null;\n namespace?: string | undefined | null;\n useScopeHeaders?: boolean | undefined | null;\n userAgent?: string | undefined | null;\n dockerCompat?: boolean | undefined | null;\n}\n\ninterface NativeBindingOptions extends NativeBindingCommonOptions {\n dockerfilePath: string;\n dockerfileText?: string | undefined | null;\n contextDir?: string | undefined | null;\n}\n\ninterface NativeBindingImportOptions extends NativeBindingCommonOptions {\n imageReference: string;\n}\n\ninterface NativeBindingEvent {\n eventType: string;\n stream?: string | undefined | null;\n message: string;\n}\n\ninterface NativeBinding {\n buildSandboxImage(\n options: NativeBindingOptions,\n emit?: ((event: NativeBindingEvent) => void) | null | undefined,\n ): Promise<string>;\n importSandboxImage(\n options: NativeBindingImportOptions,\n emit?: ((event: NativeBindingEvent) => void) | null | undefined,\n ): Promise<string>;\n}\n\n// `require` exists in the CJS bundle but not in ESM; declared here so the\n// runtime check below typechecks under \"module\": \"esnext\".\ndeclare const require: NodeRequire | undefined;\ndeclare const module: { exports?: unknown } | undefined;\n\nlet cachedNativeBinding: NativeBinding | undefined;\nlet cachedNativeBindingError: Error | undefined;\n\nfunction resolveRequire(): NodeRequire {\n // tsup rewrites `import.meta.url` to `import_meta.url` (where\n // `import_meta = {}`) in the CJS output, so `createRequire(import.meta.url)`\n // throws if called at all in CJS. CJS bundles get the real `require`\n // injected at runtime; prefer it. ESM bundles fall back to the createRequire\n // path, which only runs when `import.meta.url` is a real file URL.\n if (\n typeof module !== \"undefined\" &&\n module.exports != null &&\n typeof require !== \"undefined\"\n ) {\n return require;\n }\n return createRequire(import.meta.url);\n}\n\nfunction loadNativeBinding(): NativeBinding {\n if (cachedNativeBinding) return cachedNativeBinding;\n if (cachedNativeBindingError) throw cachedNativeBindingError;\n try {\n // The native binding is staged per-platform under\n // `typescript/dist/native/<triple>/tensorlake-node.node`. Loading goes\n // through the same helper the CLI binaries use so platform detection\n // stays in one place (`typescript/lib/runtime.cjs`). Deferred require so\n // the CJS bundle doesn't trip the `import.meta.url` → undefined fallback.\n const { loadNative } = resolveRequire()(\"../lib/runtime.cjs\") as {\n loadNative: () => NativeBinding;\n };\n cachedNativeBinding = loadNative();\n return cachedNativeBinding;\n } catch (error) {\n cachedNativeBindingError =\n error instanceof Error ? error : new Error(String(error));\n throw cachedNativeBindingError;\n }\n}\n\n/** Test seam: replace the native binding with a stub. */\nexport function __setNativeBindingForTest(binding: NativeBinding | undefined): void {\n cachedNativeBinding = binding;\n cachedNativeBindingError = undefined;\n}\n\n// --- Build context ---------------------------------------------------------\n\nexport interface BuildContext {\n apiUrl: string;\n apiKey?: string;\n personalAccessToken?: string;\n namespace: string;\n organizationId?: string;\n projectId?: string;\n debug: boolean;\n}\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n return value && value.length > 0 ? value : undefined;\n}\n\nexport function buildContextFromEnv(): BuildContext {\n const debugRaw = (process.env.TENSORLAKE_DEBUG ?? \"\").toLowerCase();\n const debug = [\"1\", \"true\", \"yes\", \"on\"].includes(debugRaw);\n return {\n apiUrl: nonEmpty(process.env.TENSORLAKE_API_URL) ?? \"https://api.tensorlake.ai\",\n apiKey: nonEmpty(process.env.TENSORLAKE_API_KEY),\n personalAccessToken: nonEmpty(process.env.TENSORLAKE_PAT),\n namespace: nonEmpty(process.env.INDEXIFY_NAMESPACE) ?? \"default\",\n organizationId: nonEmpty(process.env.TENSORLAKE_ORGANIZATION_ID),\n projectId: nonEmpty(process.env.TENSORLAKE_PROJECT_ID),\n debug,\n };\n}\n\n// --- Default-name helper ---------------------------------------------------\n\nconst DEFAULT_IMAGE_NAME = \"default\";\n\nfunction defaultRegisteredName(dockerfilePath: string): string {\n const parsed = path.parse(dockerfilePath);\n if (parsed.name.toLowerCase() === \"dockerfile\") {\n const parentName = path.basename(path.dirname(dockerfilePath)).trim();\n return parentName || \"sandbox-image\";\n }\n return parsed.name || \"sandbox-image\";\n}\n\n/**\n * Mirror the Rust core's default name derivation for image imports: the last\n * path segment of the reference with any tag/digest stripped\n * (e.g. `pytorch/pytorch:2.4.1` -> `pytorch`, `ghcr.io/org/app@sha256:...`\n * -> `app`).\n */\nfunction defaultRegisteredNameFromImage(imageReference: string): string {\n const withoutDigest = imageReference.split(\"@\", 1)[0] ?? imageReference;\n const lastSegment = withoutDigest.split(\"/\").pop() ?? withoutDigest;\n const colonIndex = lastSegment.lastIndexOf(\":\");\n const name =\n colonIndex > 0 && colonIndex < lastSegment.length - 1\n ? lastSegment.slice(0, colonIndex)\n : lastSegment;\n return name || \"imported-image\";\n}\n\n// --- Emit helpers ----------------------------------------------------------\n\nfunction noopEmit(_event: Record<string, unknown>): void {}\n\nfunction stderrEmit(event: Record<string, unknown>): void {\n const message = typeof event.message === \"string\" ? event.message : \"\";\n const type = typeof event.type === \"string\" ? event.type : \"\";\n if (type === \"build_log\") {\n const stream = typeof event.stream === \"string\" ? event.stream : \"stdout\";\n process.stderr.write(`[${stream}] ${message}\\n`);\n } else if (message) {\n process.stderr.write(`[${type}] ${message}\\n`);\n }\n}\n\nfunction ndjsonStdoutEmit(event: Record<string, unknown>): void {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n}\n\nfunction eventToEmitDict(event: NativeBindingEvent): Record<string, unknown> {\n const out: Record<string, unknown> = {\n type: event.eventType,\n message: event.message,\n };\n if (event.stream != null) out.stream = event.stream;\n return out;\n}\n\n/**\n * True when a `RUN` op bind-mounts the build context (reads host files).\n * A BuildKit `RUN --mount=type=bind` reads from the build context unless it\n * mounts `from=<stage/image>`. `bind` is the default mount type, so a mount\n * with no explicit `type` counts too. Other mount types\n * (`cache`/`tmpfs`/`secret`/`ssh`) don't read the build context.\n */\nfunction runOpMountsContext(op: ImageBuildOperation): boolean {\n if (op.type !== ImageBuildOperationType.RUN) {\n return false;\n }\n const mount = op.options.mount;\n if (mount == null || mount === \"\") {\n return false;\n }\n const fields: Record<string, string> = {};\n for (const token of mount.split(\",\")) {\n const eq = token.indexOf(\"=\");\n const key = (eq === -1 ? token : token.slice(0, eq)).trim();\n const value = eq === -1 ? \"\" : token.slice(eq + 1).trim();\n fields[key] = value;\n }\n if ((fields.type ?? \"bind\") !== \"bind\") {\n return false;\n }\n return !(\"from\" in fields);\n}\n\n/**\n * True when a build op reads files from the host build context.\n * `COPY`/`ADD` with host sources need a context; a `RUN` with a\n * `--mount=type=bind` (the default type) reads it too. `COPY --from=<stage>`,\n * remote `ADD <url>`, `from=` bind mounts, and non-bind mounts don't.\n */\nfunction opReferencesHostFiles(op: ImageBuildOperation): boolean {\n if (op.type === ImageBuildOperationType.RUN) {\n return runOpMountsContext(op);\n }\n if (\n op.type !== ImageBuildOperationType.COPY &&\n op.type !== ImageBuildOperationType.ADD\n ) {\n return false;\n }\n if (op.options.from != null) {\n return false;\n }\n if (\n op.type === ImageBuildOperationType.ADD &&\n (op.args[0].startsWith(\"http://\") || op.args[0].startsWith(\"https://\"))\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * True if the image has ops that read files from the host (COPY/ADD host\n * sources, or a RUN bind mount). Such builds need a build context to resolve\n * those sources, so the caller must pass `contextDir` (mirroring\n * `docker build <context>`).\n */\nfunction imageRequiresContext(image: Image): boolean {\n return image.buildOperations.some(opReferencesHostFiles);\n}\n\n// --- Public API ------------------------------------------------------------\n\nexport async function createSandboxImage(\n source: SandboxImageSource,\n options: CreateSandboxImageOptions = {},\n deps: CreateSandboxImageDeps = {},\n): Promise<Record<string, unknown>> {\n const emit = deps.emit ?? (options.verbose ? stderrEmit : noopEmit);\n const context = buildContextFromEnv();\n\n let dockerfilePath: string;\n let dockerfileText: string | undefined;\n let nativeContextDir: string | undefined;\n let effectiveName: string;\n // Throwaway empty build context created when an Image build has no explicit\n // contextDir. Removed in the finally below.\n let tempContextDir: string | undefined;\n\n if (source instanceof Image) {\n if (!source.baseImage) {\n throw new Error(\"Image must have a baseImage to build\");\n }\n // With an explicit contextDir we upload that directory as-is, like\n // `docker build <dir>`. Without one, an image that reads host files via\n // COPY/ADD can't be built (there is no context to resolve them against);\n // images without such ops get an empty context (just the Dockerfile) so\n // the whole cwd is not archived.\n let resolvedContext: string;\n if (options.contextDir != null) {\n resolvedContext = path.resolve(options.contextDir);\n } else if (imageRequiresContext(source)) {\n throw new Error(\n \"This image reads files from the host (via COPY/ADD or a RUN bind \" +\n \"mount), so it needs a build context. Pass `contextDir` pointing at \" +\n \"the directory that contains those sources; they resolve relative \" +\n \"to it, like `docker build <contextDir>`.\",\n );\n } else {\n tempContextDir = mkdtempSync(path.join(os.tmpdir(), \"tl-build-context-\"));\n resolvedContext = tempContextDir;\n }\n dockerfilePath = path.join(resolvedContext, \"Dockerfile\");\n let text = dockerfileContent(source);\n if (!text.endsWith(\"\\n\")) text += \"\\n\";\n dockerfileText = text;\n nativeContextDir = resolvedContext;\n effectiveName = options.registeredName ?? source.name;\n } else if (typeof source === \"string\") {\n const resolvedPath = path.resolve(source);\n if (!existsSync(resolvedPath)) {\n throw new Error(`Dockerfile not found: ${source}`);\n }\n dockerfilePath = resolvedPath;\n dockerfileText = undefined;\n nativeContextDir = undefined;\n effectiveName =\n options.registeredName ?? defaultRegisteredName(resolvedPath);\n } else {\n throw new TypeError(\n `source must be an Image or a Dockerfile path, got ${typeof source}`,\n );\n }\n\n try {\n if (effectiveName === DEFAULT_IMAGE_NAME) {\n // eslint-disable-next-line no-console\n console.warn(\n `Building sandbox image with the default name \"${DEFAULT_IMAGE_NAME}\". ` +\n \"Pass `registeredName` or `Image({ name })` to avoid collisions \" +\n \"with other default-named images in this project.\",\n );\n }\n\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\n \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\",\n );\n }\n\n emit({ type: \"status\", message: `Building image '${effectiveName}'...` });\n\n const binding = loadNativeBinding();\n let emitError: unknown;\n const resultJson = await binding.buildSandboxImage(\n {\n apiUrl: context.apiUrl,\n bearerToken,\n dockerfilePath,\n registeredName: effectiveName,\n diskMb: options.diskMb,\n builderDiskMb: options.builderDiskMb,\n cpus: options.cpus,\n memoryMb: options.memoryMb,\n isPublic: options.isPublic ?? false,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n useScopeHeaders:\n context.personalAccessToken != null && context.apiKey == null,\n userAgent: undefined,\n dockerCompat: options.dockerCompat ?? false,\n dockerfileText,\n contextDir: nativeContextDir,\n },\n (event) => {\n try {\n emit(eventToEmitDict(event));\n } catch (error) {\n emitError ??= error;\n }\n },\n );\n\n if (emitError != null) {\n throw emitError;\n }\n\n let result: Record<string, unknown> = {};\n if (resultJson.trim().length > 0) {\n result = JSON.parse(resultJson) as Record<string, unknown>;\n }\n emit({\n type: \"image_registered\",\n name: effectiveName,\n image_id:\n (typeof result.id === \"string\" && result.id) ||\n (typeof result.templateId === \"string\" && result.templateId) ||\n \"\",\n });\n emit({ type: \"done\" });\n return result;\n } finally {\n if (tempContextDir != null) {\n rmSync(tempContextDir, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Import a registry image directly into a sandbox image — no Docker.\n *\n * Unlike {@link createSandboxImage}, there is no Dockerfile and no build\n * context: the builder pulls the referenced image's layers and applies them\n * straight into the rootfs (via `oci-image-to-ext4`), bypassing the Docker\n * daemon entirely. This is the programmatic backend for the\n * `tl sbx image import` CLI command. The import is always a fresh base from\n * the registry — the reference is never resolved against the template\n * registry.\n */\nexport async function importSandboxImage(\n imageReference: string,\n options: ImportSandboxImageOptions = {},\n deps: CreateSandboxImageDeps = {},\n): Promise<Record<string, unknown>> {\n const emit = deps.emit ?? (options.verbose ? stderrEmit : noopEmit);\n\n if (typeof imageReference !== \"string\" || imageReference.trim().length === 0) {\n throw new Error(\"image reference to import must not be empty\");\n }\n const reference = imageReference.trim();\n\n const context = buildContextFromEnv();\n const effectiveName =\n options.registeredName ?? defaultRegisteredNameFromImage(reference);\n\n if (effectiveName === DEFAULT_IMAGE_NAME) {\n // eslint-disable-next-line no-console\n console.warn(\n `Importing sandbox image with the default name \"${DEFAULT_IMAGE_NAME}\". ` +\n \"Pass `registeredName` to avoid collisions with other default-named \" +\n \"images in this project.\",\n );\n }\n\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n\n emit({\n type: \"status\",\n message: `Importing image '${reference}' as '${effectiveName}'...`,\n });\n\n const binding = loadNativeBinding();\n let emitError: unknown;\n const resultJson = await binding.importSandboxImage(\n {\n apiUrl: context.apiUrl,\n bearerToken,\n imageReference: reference,\n registeredName: effectiveName,\n diskMb: options.diskMb,\n builderDiskMb: options.builderDiskMb,\n cpus: options.cpus,\n memoryMb: options.memoryMb,\n isPublic: options.isPublic ?? false,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n useScopeHeaders:\n context.personalAccessToken != null && context.apiKey == null,\n userAgent: undefined,\n dockerCompat: options.dockerCompat ?? false,\n },\n (event) => {\n try {\n emit(eventToEmitDict(event));\n } catch (error) {\n emitError ??= error;\n }\n },\n );\n\n if (emitError != null) {\n throw emitError;\n }\n\n let result: Record<string, unknown> = {};\n if (resultJson.trim().length > 0) {\n result = JSON.parse(resultJson) as Record<string, unknown>;\n }\n emit({\n type: \"image_registered\",\n name: effectiveName,\n image_id:\n (typeof result.id === \"string\" && result.id) ||\n (typeof result.templateId === \"string\" && result.templateId) ||\n \"\",\n });\n emit({ type: \"done\" });\n return result;\n}\n\nexport async function deleteSandboxImage(imageName: string): Promise<void> {\n if (typeof imageName !== \"string\" || imageName.length === 0) {\n throw new TypeError(\"imageName must be a non-empty string\");\n }\n\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n await client.deleteSandboxImage(imageName);\n } finally {\n client.close();\n }\n}\n\n/**\n * Look up a registered sandbox image by its registered name.\n *\n * Returns the registered sandbox template, or `null` if no image with that\n * name exists. Uses the same environment-based Tensorlake auth as\n * `createSandboxImage`, and requires organization/project context\n * (`TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID`) since the lookup\n * is routed through the platform sandbox-templates API.\n */\nexport async function findSandboxImageByName(\n imageName: string,\n): Promise<SandboxTemplate | null> {\n if (typeof imageName !== \"string\" || imageName.length === 0) {\n throw new TypeError(\"imageName must be a non-empty string\");\n }\n\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Looking up a sandbox image by name requires organization and project \" +\n \"context (TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n return await client.findSandboxImageByName(imageName);\n } finally {\n client.close();\n }\n}\n\n/**\n * List all registered sandbox images for the current project.\n *\n * Returns the registered sandbox templates (each with `id`, `name`,\n * `snapshotId`, `public`, etc.). Uses the same environment-based Tensorlake\n * auth as `createSandboxImage`, and requires organization/project context\n * (`TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID`) since the listing\n * is routed through the platform sandbox-templates API.\n */\nexport async function listSandboxImages(): Promise<SandboxTemplate[]> {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Listing sandbox images requires organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n try {\n return await client.listSandboxImages();\n } finally {\n client.close();\n }\n}\n\nexport async function runCreateSandboxImageCli(argv = process.argv.slice(2)) {\n const parsed = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n name: { type: \"string\", short: \"n\" },\n cpus: { type: \"string\" },\n memory: { type: \"string\" },\n disk_mb: { type: \"string\" },\n builder_disk_mb: { type: \"string\" },\n docker_compat: { type: \"boolean\", default: false },\n public: { type: \"boolean\", default: false },\n },\n });\n\n const dockerfilePath = parsed.positionals[0];\n if (!dockerfilePath) {\n throw new Error(\n \"Usage: tensorlake-create-sandbox-image <dockerfile_path> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]\",\n );\n }\n\n const cpus =\n parsed.values.cpus != null ? Number(parsed.values.cpus) : undefined;\n const memoryMb =\n parsed.values.memory != null ? Number(parsed.values.memory) : undefined;\n const diskMb =\n parsed.values.disk_mb != null ? Number(parsed.values.disk_mb) : undefined;\n const builderDiskMb =\n parsed.values.builder_disk_mb != null\n ? Number(parsed.values.builder_disk_mb)\n : undefined;\n if (cpus != null && !Number.isFinite(cpus)) {\n throw new Error(`Invalid --cpus value: ${parsed.values.cpus}`);\n }\n if (memoryMb != null && !Number.isInteger(memoryMb)) {\n throw new Error(`Invalid --memory value: ${parsed.values.memory}`);\n }\n if (diskMb != null && !Number.isInteger(diskMb)) {\n throw new Error(`Invalid --disk_mb value: ${parsed.values.disk_mb}`);\n }\n if (builderDiskMb != null && !Number.isInteger(builderDiskMb)) {\n throw new Error(\n `Invalid --builder_disk_mb value: ${parsed.values.builder_disk_mb}`,\n );\n }\n\n await createSandboxImage(\n dockerfilePath,\n {\n registeredName: parsed.values.name,\n cpus,\n memoryMb,\n diskMb,\n builderDiskMb,\n dockerCompat: parsed.values.docker_compat,\n isPublic: parsed.values.public,\n },\n { emit: ndjsonStdoutEmit },\n );\n}\n\nexport async function runImportSandboxImageCli(argv = process.argv.slice(2)) {\n const parsed = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n name: { type: \"string\", short: \"n\" },\n cpus: { type: \"string\" },\n memory: { type: \"string\" },\n disk_mb: { type: \"string\" },\n builder_disk_mb: { type: \"string\" },\n docker_compat: { type: \"boolean\", default: false },\n public: { type: \"boolean\", default: false },\n },\n });\n\n const imageReference = parsed.positionals[0];\n if (!imageReference) {\n throw new Error(\n \"Usage: tensorlake-import-sandbox-image <image_reference> [--name NAME] [--cpus N] [--memory MB] [--disk_mb MB] [--builder_disk_mb MB] [--docker_compat] [--public]\",\n );\n }\n\n const cpus =\n parsed.values.cpus != null ? Number(parsed.values.cpus) : undefined;\n const memoryMb =\n parsed.values.memory != null ? Number(parsed.values.memory) : undefined;\n const diskMb =\n parsed.values.disk_mb != null ? Number(parsed.values.disk_mb) : undefined;\n const builderDiskMb =\n parsed.values.builder_disk_mb != null\n ? Number(parsed.values.builder_disk_mb)\n : undefined;\n if (cpus != null && !Number.isFinite(cpus)) {\n throw new Error(`Invalid --cpus value: ${parsed.values.cpus}`);\n }\n if (memoryMb != null && !Number.isInteger(memoryMb)) {\n throw new Error(`Invalid --memory value: ${parsed.values.memory}`);\n }\n if (diskMb != null && !Number.isInteger(diskMb)) {\n throw new Error(`Invalid --disk_mb value: ${parsed.values.disk_mb}`);\n }\n if (builderDiskMb != null && !Number.isInteger(builderDiskMb)) {\n throw new Error(\n `Invalid --builder_disk_mb value: ${parsed.values.builder_disk_mb}`,\n );\n }\n\n await importSandboxImage(\n imageReference,\n {\n registeredName: parsed.values.name,\n cpus,\n memoryMb,\n diskMb,\n builderDiskMb,\n dockerCompat: parsed.values.docker_compat,\n isPublic: parsed.values.public,\n },\n { emit: ndjsonStdoutEmit },\n );\n}\n","// Public API\nexport { SandboxClient } from \"./client.js\";\nexport { Sandbox } from \"./sandbox.js\";\nexport { Pty } from \"./sandbox.js\";\nexport { Desktop } from \"./desktop.js\";\nexport { TcpTunnel } from \"./tunnel.js\";\nexport { CloudClient } from \"./cloud-client.js\";\nexport { APIClient } from \"./api-client.js\";\nexport { RepositoryClient } from \"./repositories.js\";\nexport {\n createSandboxImage,\n importSandboxImage,\n deleteSandboxImage,\n findSandboxImageByName,\n listSandboxImages,\n} from \"./sandbox-image.js\";\nexport {\n createFileSystem,\n listFileSystems,\n deleteFileSystem,\n} from \"./file-system.js\";\nexport {\n FilesystemClient,\n Filesystem,\n FilesystemMount,\n} from \"./filesystem.js\";\nexport type { FilesystemClientOptions } from \"./filesystem.js\";\nexport {\n FilesystemError,\n FilesystemNotFoundError,\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n MountError,\n CliNotFoundError,\n} from \"./filesystem-models.js\";\nexport type {\n FilesystemInfo,\n FilesystemStatus,\n FileEntry,\n FilesystemFileRead,\n FilesystemReadOptions,\n FilesystemVersion,\n FilesystemSnapshot,\n FilesystemSnapshotInfo,\n MountStatus,\n} from \"./filesystem-models.js\";\nexport { Image, dockerfileContent, ImageBuildOperationType } from \"./image.js\";\nexport { sandboxUrlFromIngressEndpoint } from \"./url.js\";\n\nexport type {\n PtyDataHandler,\n PtyExitHandler,\n PtyConnectionOptions,\n CreatePtyOptions,\n} from \"./sandbox.js\";\nexport type {\n ConnectDesktopOptions,\n DesktopDoubleClickOptions,\n DesktopPointerOptions,\n MouseButton,\n} from \"./desktop.js\";\nexport type {\n CreateTunnelOptions,\n TunnelAddress,\n} from \"./tunnel.js\";\n\n// Errors\nexport {\n SandboxException,\n SandboxError,\n SandboxConnectionError,\n SandboxNotFoundError,\n PoolNotFoundError,\n PoolInUseError,\n RemoteAPIError,\n RequestNotFinishedError,\n RequestFailedError,\n RequestExecutionError,\n} from \"./errors.js\";\n\n// Models & enums\nexport {\n SandboxStatus,\n SnapshotStatus,\n ProcessStatus,\n StdinMode,\n OutputMode,\n ContainerState,\n} from \"./models.js\";\n\nexport type {\n CheckpointType,\n SnapshotType,\n SnapshotOptions,\n SnapshotWaitCondition,\n} from \"./models.js\";\n\nexport type {\n BinaryPayload,\n CloudClientOptions,\n RequestInput,\n ApplicationSummary,\n ApplicationManifest,\n RequestErrorInfo,\n RequestMetadata,\n RequestOutput,\n ApiKeyIntrospection,\n NewSecret,\n Secret,\n SecretsPagination,\n SecretsList,\n UpsertSecretResponse,\n BuildInfo,\n BuildLogEntry,\n StartImageBuildRequest,\n CreateApplicationBuildImageRequest,\n CreateApplicationBuildRequest,\n ApplicationBuildContext,\n ApplicationBuildImageResult,\n ApplicationBuildResponse,\n SandboxTemplate,\n FileSystem,\n} from \"./cloud-models.js\";\n\nexport type {\n ContainerResourcesInfo,\n NetworkConfig,\n FileSystemMount,\n CopySandboxOptions,\n CopiedSandboxResponse,\n CopySandboxResponse,\n CreateSandboxOptions,\n GPUResources,\n CreateSandboxResponse,\n SandboxInfo,\n SandboxPortAccess,\n ArchivedSandboxInfo,\n ListArchivedSandboxesOptions,\n ListArchivedSandboxesResponse,\n CreateSnapshotResponse,\n SnapshotInfo,\n SnapshotAndWaitOptions,\n CreatePoolOptions,\n UpdatePoolOptions,\n CreateSandboxPoolResponse,\n PoolContainerInfo,\n SandboxPoolInfo,\n StartProcessOptions,\n RestartPolicy,\n RestartPolicyConfig,\n ProcessHealthCheckType,\n ProcessHealthCheck,\n ManagedProcessStatus,\n ManagedProcessHealthStatus,\n ManagedProcessExit,\n ManagedProcessInfo,\n ProcessUser,\n ProcessUserSpec,\n ProcessInfo,\n SandboxLogLevel,\n GetSandboxLogsOptions,\n SandboxLogSignal,\n SandboxLogsResponse,\n SandboxProcessLogFilter,\n SandboxProcessLogFiltersResponse,\n SendSignalResponse,\n OutputResponse,\n OutputEvent,\n RunOptions,\n CommandResult,\n DirectoryEntry,\n ListDirectoryResponse,\n CreatePtySessionOptions,\n PtySessionInfo,\n HealthResponse,\n DaemonInfo,\n SandboxClientOptions,\n SandboxOptions,\n CreateAndConnectOptions,\n SuspendResumeOptions,\n CheckpointOptions,\n ConnectOptions,\n} from \"./models.js\";\n\nexport type {\n CreateSandboxImageOptions,\n ImportSandboxImageOptions,\n SandboxImageSource,\n} from \"./sandbox-image.js\";\n\nexport type {\n ImageOptions,\n ImageBuildOperation,\n ImageBuildOperationType as ImageBuildOperationTypeValue,\n} from \"./image.js\";\n\nexport type {\n Branch,\n CommitJobError,\n CommitJobReadBack,\n CommitJobStatus,\n ConflictPath,\n ConflictTerm,\n GitCredential,\n GitRef,\n GitRepository,\n MergeConflict,\n MergeConflictRecord,\n MergeEntry,\n MergeOptions,\n MergeReport,\n MergeStats,\n Operation,\n OperationRef,\n PushReport,\n PushWorktreeOptions,\n RepositoryClientOptions,\n RepositoryHandle,\n RepositoryInfo,\n} from \"./repositories.js\";\n","import { CloudClient } from \"./cloud-client.js\";\nimport {\n RequestExecutionError,\n RequestFailedError,\n RequestNotFinishedError,\n} from \"./errors.js\";\nimport type {\n ApplicationManifest,\n ApplicationSummary,\n CloudClientOptions,\n RequestInput,\n RequestOutput,\n FileSystem,\n} from \"./cloud-models.js\";\n\nexport class APIClient {\n private readonly cloudClient: CloudClient;\n\n constructor(options?: CloudClientOptions) {\n this.cloudClient = new CloudClient(options);\n }\n\n close(): void {\n this.cloudClient.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: Uint8Array | ArrayBuffer | Blob | string,\n upgradeRunningRequests = false,\n ): Promise<void> {\n await this.cloudClient.upsertApplication(\n manifest,\n codeZip,\n upgradeRunningRequests,\n );\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.cloudClient.deleteApplication(applicationName);\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.cloudClient.deleteSandboxImage(imageName);\n }\n\n async createFileSystem(\n name: string,\n description?: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<FileSystem> {\n return this.cloudClient.createFileSystem({ name, description }, options);\n }\n\n async listFileSystems(options?: {\n organizationId?: string;\n projectId?: string;\n }): Promise<FileSystem[]> {\n return this.cloudClient.listFileSystems(options);\n }\n\n async deleteFileSystem(\n fileSystemId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n await this.cloudClient.deleteFileSystem(fileSystemId, options);\n }\n\n async applications(): Promise<ApplicationSummary[]> {\n return this.cloudClient.applications();\n }\n\n async application(applicationName: string): Promise<ApplicationManifest> {\n return this.cloudClient.applicationManifest(applicationName);\n }\n\n async runRequest(\n applicationName: string,\n inputs: RequestInput[],\n ): Promise<string> {\n return this.cloudClient.runRequest(applicationName, inputs);\n }\n\n async waitOnRequestCompletion(\n applicationName: string,\n requestId: string,\n ): Promise<void> {\n await this.cloudClient.waitOnRequestCompletion(applicationName, requestId);\n }\n\n async requestOutput(\n applicationName: string,\n requestId: string,\n ): Promise<RequestOutput> {\n const metadata = await this.cloudClient.requestMetadata(\n applicationName,\n requestId,\n );\n\n if (metadata.outcome == null) {\n throw new RequestNotFinishedError();\n }\n\n if (typeof metadata.outcome === \"object\") {\n if (metadata.requestError?.message) {\n throw new RequestExecutionError(\n metadata.requestError.message,\n metadata.requestError.functionName,\n );\n }\n const failure =\n typeof metadata.outcome.failure === \"string\"\n ? metadata.outcome.failure\n : JSON.stringify(metadata.outcome);\n throw new RequestFailedError(failure);\n }\n\n return this.cloudClient.requestOutput(applicationName, requestId);\n }\n}\n","import * as defaults from \"./defaults.js\";\nimport { CloudClient } from \"./cloud-client.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./http.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeRepositoryClient,\n} from \"./native-sandbox.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\nexport interface RepositoryClientOptions {\n apiUrl?: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n requestTimeout?: number;\n timeoutMs?: number;\n}\n\nexport interface GitRepository {\n name: string;\n fullName: string;\n defaultBranch: string;\n status: string;\n}\n\nexport interface RepositoryHandle {\n repo: string;\n url: string;\n baseRepo?: string;\n}\n\nexport interface GitRef {\n name: string;\n oid: string;\n}\n\nexport interface Branch {\n name: string;\n refName: string;\n oid: string;\n}\n\nexport interface RepositoryInfo {\n repo: string;\n url: string;\n branches: Branch[];\n refs: GitRef[];\n}\n\nexport interface GitCredential {\n token: string;\n tokenType: string;\n expiresAt: string;\n gitUsername: string;\n repoPattern: string;\n scopes: string[];\n}\n\nexport interface CommitJobReadBack {\n done: number;\n total: number;\n}\n\nexport interface CommitJobError {\n kind: string;\n message: string;\n retryable: boolean;\n}\n\nexport interface CommitJobStatus {\n jobId: string;\n state: string;\n phase?: string;\n readBack?: CommitJobReadBack;\n commit?: string;\n tree?: string;\n refName?: string;\n parent?: string;\n created?: boolean;\n error?: CommitJobError;\n}\n\nexport interface PushReport {\n commit: string;\n tree: string;\n refName: string;\n created: boolean;\n files: number;\n bytesTotal: number;\n chunksTotal: number;\n chunksUploaded: number;\n bytesUploaded: number;\n fileBlobOids: Array<[string, string]>;\n}\n\nexport interface PushWorktreeOptions {\n path?: string;\n branch?: string;\n message?: string;\n expectOid?: string;\n}\n\nexport interface MergeEntry {\n mode: number;\n oid: string;\n}\n\nexport interface MergeConflict {\n path: string;\n kind: string;\n potential: boolean;\n ours?: MergeEntry;\n base?: MergeEntry;\n theirs?: MergeEntry;\n}\n\nexport interface MergeStats {\n treesRead: number;\n entriesCompared: number;\n blobsMerged: number;\n wallMs: number;\n}\n\nexport interface MergeReport {\n ours: string;\n theirs: string;\n mergeBase?: string;\n clean: boolean;\n fastForward: boolean;\n alreadyMerged: boolean;\n changedPaths: number;\n conflicts: MergeConflict[];\n stats: MergeStats;\n commit?: string;\n fastForwarded: boolean;\n}\n\nexport interface MergeOptions {\n preflight?: boolean;\n deep?: boolean;\n materialize?: boolean;\n message?: string;\n base?: string;\n}\n\nexport interface ConflictTerm {\n mode: number;\n oid: string;\n}\n\nexport interface ConflictPath {\n path: string;\n kind: string;\n terms: Array<ConflictTerm | null>;\n}\n\nexport interface MergeConflictRecord {\n version: number;\n oursCommit: string;\n theirsCommit: string;\n baseCommit?: string;\n paths: ConflictPath[];\n truncatedPaths: number;\n}\n\nexport interface OperationRef {\n name: string;\n old?: string;\n new?: string;\n}\n\nexport interface Operation {\n opId: string;\n repo: string;\n network?: string;\n parentOpId?: string;\n actor: string;\n atSecs: number;\n kind: string;\n result: string;\n refs: OperationRef[];\n packIds: string[];\n oldPackIds: string[];\n relatedRepo?: string;\n status?: string;\n oldPackCount: number;\n objectCount: number;\n packBytes: number;\n}\n\nexport class RepositoryClient {\n private readonly native: NativeRepositoryClient;\n private readonly requestTimeoutMs: number;\n\n constructor(options?: RepositoryClientOptions) {\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n const binding = loadNativeSandboxBinding();\n if (typeof binding.NativeRepositoryClient !== \"function\") {\n throw new SandboxError(\n \"native binding does not export the repository client; rebuild with 'npm run build:native'\",\n );\n }\n this.native = new binding.NativeRepositoryClient(\n options?.apiUrl ?? defaults.API_URL,\n options?.apiKey ?? defaults.API_KEY ?? null,\n options?.organizationId ?? null,\n options?.projectId ?? null,\n null,\n this.requestTimeoutMs / 1000,\n );\n }\n\n static forCloud(options?: RepositoryClientOptions): RepositoryClient {\n return new RepositoryClient({\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n requestTimeout: options?.requestTimeout,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n static async fromEnv(): Promise<RepositoryClient> {\n const context = buildContextFromEnv();\n if (!context.apiKey) {\n if (context.personalAccessToken) {\n throw new SandboxError(\n \"Repository SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new SandboxError(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n return new RepositoryClient({\n apiUrl: context.apiUrl,\n apiKey: context.apiKey,\n projectId: context.projectId ?? await projectIdFromApiKey(context.apiUrl, context.apiKey),\n });\n }\n\n close(): void {\n // The native client releases its connection pool on GC; nothing to do.\n }\n\n url(repo: string): string {\n return this.native.gitRepoUrl(repo);\n }\n\n async create(\n repo: string,\n options?: { defaultBranch?: string },\n ): Promise<Traced<RepositoryHandle>> {\n return this.tracedJson<RepositoryHandle>(() =>\n this.native.createRepo(repo, options?.defaultBranch ?? null),\n );\n }\n\n async list(): Promise<Traced<GitRepository[]>> {\n const { traceId, json } = await callNative(() => this.native.listRepos());\n const parsed = fromSnakeKeys(JSON.parse(json)) as { repos?: GitRepository[] };\n return Object.assign(parsed.repos ?? [], { traceId });\n }\n\n async delete(repo: string): Promise<void> {\n await callNative(() => this.native.deleteRepo(repo));\n }\n\n async fork(repo: string, baseRepo: string): Promise<Traced<RepositoryHandle>> {\n return this.tracedJson<RepositoryHandle>(() =>\n this.native.forkRepo(repo, baseRepo),\n );\n }\n\n async archive(repo: string): Promise<void> {\n await callNative(() => this.native.archiveRepo(repo));\n }\n\n async restore(repo: string): Promise<void> {\n await callNative(() => this.native.restoreRepo(repo));\n }\n\n async info(repo: string): Promise<Traced<RepositoryInfo>> {\n return this.tracedJson<RepositoryInfo>(() => this.native.repoInfo(repo));\n }\n\n async branches(repo: string): Promise<Traced<Branch[]>> {\n const { traceId, json } = await callNative(() => this.native.listBranches(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { branches?: Branch[] };\n return Object.assign(parsed.branches ?? [], { traceId });\n }\n\n async refs(repo: string): Promise<Traced<GitRef[]>> {\n const { traceId, json } = await callNative(() => this.native.listRefs(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { refs?: GitRef[] };\n return Object.assign(parsed.refs ?? [], { traceId });\n }\n\n async deleteBranch(repo: string, branch: string): Promise<void> {\n await callNative(() => this.native.deleteBranch(repo, branch));\n }\n\n async operations(repo: string): Promise<Traced<Operation[]>> {\n const { traceId, json } = await callNative(() => this.native.listOperations(repo));\n const parsed = fromSnakeKeys(JSON.parse(json)) as { operations?: Operation[] };\n return Object.assign(parsed.operations ?? [], { traceId });\n }\n\n async credential(repo?: string): Promise<GitCredential> {\n const json = await callNative(() => this.native.gitCredential(repo ?? null));\n return JSON.parse(json) as GitCredential;\n }\n\n async commitStatus(repo: string, jobId: string): Promise<Traced<CommitJobStatus>> {\n return this.tracedJson<CommitJobStatus>(() =>\n this.native.commitStatus(repo, jobId),\n );\n }\n\n async pushWorktree(\n repo: string,\n options?: PushWorktreeOptions,\n ): Promise<Traced<PushReport>> {\n return this.tracedJson<PushReport>(() =>\n this.native.pushWorktree(\n repo,\n options?.path ?? process.cwd(),\n options?.branch ?? \"main\",\n options?.message ?? \"Update repository\",\n options?.expectOid ?? null,\n ),\n );\n }\n\n async merge(\n repo: string,\n ours: string,\n theirs: string,\n options?: MergeOptions,\n ): Promise<Traced<MergeReport>> {\n return this.tracedJson<MergeReport>(() =>\n this.native.mergeRepo(\n repo,\n ours,\n theirs,\n options?.preflight ?? false,\n options?.deep ?? false,\n options?.materialize ?? false,\n options?.message ?? null,\n options?.base ?? null,\n ),\n );\n }\n\n async commitConflicts(\n repo: string,\n commit: string,\n ): Promise<Traced<MergeConflictRecord> | null> {\n const { traceId, json } = await callNative(() =>\n this.native.commitConflicts(repo, commit),\n );\n const parsed = JSON.parse(json) as unknown;\n if (parsed == null) {\n return null;\n }\n return Object.assign(fromSnakeKeys(parsed) as MergeConflictRecord, { traceId });\n }\n\n private async tracedJson<T extends object>(\n fn: () => Promise<{ traceId: string; json: string }>,\n ): Promise<Traced<T>> {\n const { traceId, json } = await callNative(fn);\n return Object.assign(fromSnakeKeys(JSON.parse(json)) as T, { traceId });\n }\n}\n\nfunction resolveRequestTimeoutMs(\n options?: { requestTimeout?: number; timeoutMs?: number },\n): number {\n if (options?.requestTimeout != null) {\n return secondsToMillis(options.requestTimeout);\n }\n if (options?.timeoutMs != null) {\n validateTimeoutMs(options.timeoutMs);\n return options.timeoutMs;\n }\n return defaults.DEFAULT_HTTP_TIMEOUT_MS;\n}\n\nfunction secondsToMillis(seconds: number): number {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n throw new SandboxError(\"requestTimeout must be a positive number of seconds\");\n }\n return Math.ceil(seconds * 1000);\n}\n\nfunction validateTimeoutMs(timeoutMs: number): void {\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new SandboxError(\"timeoutMs must be a positive number of milliseconds\");\n }\n}\n\nasync function projectIdFromApiKey(apiUrl: string, apiKey: string): Promise<string> {\n const client = new CloudClient({ apiUrl, apiKey });\n try {\n const projectId = extractProjectId(await client.introspectApiKey());\n if (!projectId) {\n throw new SandboxError(\"Repository API key did not include project context.\");\n }\n return projectId;\n } finally {\n client.close();\n }\n}\n\nfunction extractProjectId(value: unknown): string | undefined {\n if (value == null || typeof value !== \"object\") {\n return undefined;\n }\n const object = value as Record<string, unknown>;\n for (const key of [\"projectId\", \"project_id\"]) {\n const candidate = object[key];\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n\n const project = object.project;\n if (typeof project === \"string\" && project.length > 0) {\n return project;\n }\n if (project != null && typeof project === \"object\") {\n const projectObject = project as Record<string, unknown>;\n for (const key of [\"id\", \"projectId\", \"project_id\"]) {\n const candidate = projectObject[key];\n if (typeof candidate === \"string\" && candidate.length > 0) {\n return candidate;\n }\n }\n }\n\n for (const key of [\"scope\", \"apiKey\", \"api_key\", \"key\"]) {\n const nested = extractProjectId(object[key]);\n if (nested) {\n return nested;\n }\n }\n\n const projects = object.projects;\n if (Array.isArray(projects) && projects.length === 1) {\n return extractProjectId(projects[0]);\n }\n\n return undefined;\n}\n","import { CloudClient } from \"./cloud-client.js\";\nimport type { FileSystem } from \"./cloud-models.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\n/**\n * Project-scoped file-system registry helpers (create, list, delete).\n *\n * Uses the same environment-based Tensorlake auth as `createSandboxImage`, and\n * requires `TENSORLAKE_ORGANIZATION_ID` and `TENSORLAKE_PROJECT_ID` because the\n * file-system API is organization/project-scoped.\n *\n * To mount a registered file system into a sandbox, pass\n * `fileSystems` to `Sandbox.create()` (mount at boot) or call\n * `sandbox.attachFileSystem()` / `sandbox.detachFileSystem()` on a\n * running sandbox.\n */\n\nfunction requireCloudClient(): CloudClient {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey ?? context.personalAccessToken;\n if (!bearerToken) {\n throw new Error(\"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\");\n }\n if (!context.organizationId || !context.projectId) {\n throw new Error(\n \"Managing file systems requires organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n return new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\n organizationId: context.organizationId,\n projectId: context.projectId,\n namespace: context.namespace,\n });\n}\n\n/** Register a new file system for the current project. */\nexport async function createFileSystem(\n name: string,\n description?: string,\n): Promise<FileSystem> {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"name must be a non-empty string\");\n }\n const client = requireCloudClient();\n try {\n return await client.createFileSystem({ name, description });\n } finally {\n client.close();\n }\n}\n\n/** List all registered file systems for the current project. */\nexport async function listFileSystems(): Promise<FileSystem[]> {\n const client = requireCloudClient();\n try {\n return await client.listFileSystems();\n } finally {\n client.close();\n }\n}\n\n/** Delete a registered file system by its id (e.g. `file_system_...`). */\nexport async function deleteFileSystem(\n fileSystemId: string,\n): Promise<void> {\n if (typeof fileSystemId !== \"string\" || fileSystemId.length === 0) {\n throw new TypeError(\"fileSystemId must be a non-empty string\");\n }\n const client = requireCloudClient();\n try {\n await client.deleteFileSystem(fileSystemId);\n } finally {\n client.close();\n }\n}\n","/**\n * Client for Tensorlake filesystems.\n *\n * A filesystem is a durable, versioned file tree that lives in Tensorlake\n * Cloud. Every write publishes a durable live version; {@link Filesystem.snapshot}\n * retains the current version permanently. Files can be read at any retained\n * version, and a filesystem can be mounted to a local path through the `tl`\n * CLI's FUSE/FSKit daemon.\n *\n * Server-side SDK writes hash complete files locally, upload missing bytes\n * directly to checksum-bound object-store targets, and atomically publish\n * one durable snapshot. Payload bytes never transit the API service.\n *\n * @example\n * const client = new FilesystemClient(); // env-based auth\n * const fs = await client.create(\"my-data\");\n * await fs.writeFile(\"docs/hello.txt\", \"hi\");\n * console.log(await fs.readText(\"docs/hello.txt\"));\n * const snapshot = await fs.snapshot(\"after first write\");\n *\n * const mount = await fs.mount(\"/mnt/my-data\"); // requires the `tl` CLI\n * // ... use it as a normal directory\n * await mount.unmount();\n */\n\nimport { execFile } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport * as defaults from \"./defaults.js\";\nimport {\n CliNotFoundError,\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n FilesystemError,\n FilesystemNotFoundError,\n MountError,\n fileEntryFromWire,\n mountStatusFromRaw,\n trimSlashes,\n type FileEntry,\n type FilesystemFileRead,\n type FilesystemInfo,\n type FilesystemReadOptions,\n type FilesystemSnapshot,\n type FilesystemSnapshotInfo,\n type FilesystemStatus,\n type FilesystemVersion,\n type MountStatus,\n} from \"./filesystem-models.js\";\nimport {\n loadNativeSandboxBinding,\n type NativeRepositoryClient,\n} from \"./native-sandbox.js\";\nimport { buildContextFromEnv } from \"./sandbox-image.js\";\n\nconst execFileAsync = promisify(execFile);\n\nconst FILESYSTEM_REPO_KIND = \"filesystem\";\n\nexport interface FilesystemClientOptions {\n apiKey?: string;\n apiUrl?: string;\n organizationId?: string;\n projectId?: string;\n /** @internal Test seam: bypass the native binding loader. */\n nativeClient?: NativeRepositoryClient;\n}\n\n/**\n * Translate a structured native error (`{category, status, message}` JSON in\n * the error message) into the filesystem error hierarchy. `notFound`, when\n * given, replaces the generic API error for 404s.\n */\nfunction translateNativeError(error: unknown, notFound?: FilesystemError): Error {\n const message = error instanceof Error ? error.message : String(error);\n let payload: { category?: unknown; status?: unknown; message?: unknown };\n try {\n payload = JSON.parse(message);\n } catch {\n return error instanceof Error ? error : new FilesystemError(message);\n }\n if (!payload || typeof payload.category !== \"string\") {\n return error instanceof Error ? error : new FilesystemError(message);\n }\n const detail =\n typeof payload.message === \"string\" ? payload.message : message;\n // Connection-level failures carry a fabricated gateway status in the napi\n // layer; surface them as plain FilesystemError (matching Python, where\n // they carry no status) instead of a fake server FilesystemAPIError.\n if (payload.category === \"connection\") {\n return new FilesystemError(detail);\n }\n if (payload.status === 404 && notFound !== undefined) {\n return notFound;\n }\n if (typeof payload.status === \"number\") {\n return new FilesystemAPIError(payload.status, detail);\n }\n return new FilesystemError(detail);\n}\n\nasync function callNative<T>(\n fn: () => Promise<T>,\n notFound?: FilesystemError,\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n throw translateNativeError(error, notFound);\n }\n}\n\n/**\n * Runs `tl fs ...` commands for local mount operations.\n *\n * Mounting a filesystem to a local path is served by a FUSE (Linux) / FSKit\n * (macOS) daemon that ships only inside the Tensorlake CLI, so the SDK drives\n * mounts by invoking `tl fs mount/unmount/snapshot/status`. Everything else\n * goes through the Rust core and does not need the CLI.\n */\nclass FsCli {\n private binary: string | null = null;\n private readonly envOverrides: Record<string, string>;\n\n constructor(envOverrides: Record<string, string>) {\n this.envOverrides = envOverrides;\n }\n\n private async findCli(): Promise<string> {\n const candidates: string[] = [];\n if (process.env.TENSORLAKE_CLI) {\n candidates.push(process.env.TENSORLAKE_CLI);\n }\n candidates.push(\"tl\");\n const installed = join(homedir(), \".tensorlake\", \"bin\", \"tl\");\n try {\n // Existence, not executability: a present-but-broken install should be\n // probed and blamed as \"upgrade required\" (parity with Python), not\n // reported as missing.\n accessSync(installed, constants.F_OK);\n candidates.push(installed);\n } catch {\n // not installed at the default path\n }\n // A candidate that exists but fails the probe means \"upgrade tl\"; a\n // candidate that does not exist must not be blamed as outdated. The\n // Python SDK mirrors these exact semantics.\n let unsupported: string | null = null;\n for (const candidate of candidates) {\n try {\n await execFileAsync(candidate, [\"fs\", \"--help\"], { timeout: 15_000 });\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n unsupported = candidate;\n }\n }\n }\n throw new CliNotFoundError(\n unsupported\n ? `\\`tl\\` at ${unsupported} does not support \\`tl fs\\` (upgrade required)`\n : \"`tl` was not found on PATH\",\n );\n }\n\n private async run(args: string[], timeoutMs = 300_000): Promise<string> {\n if (this.binary === null) {\n this.binary = await this.findCli();\n }\n try {\n const { stdout } = await execFileAsync(this.binary, [\"fs\", ...args], {\n timeout: timeoutMs,\n env: { ...process.env, ...this.envOverrides },\n maxBuffer: 16 * 1024 * 1024,\n });\n return stdout;\n } catch (error) {\n const failure = error as { stderr?: string; stdout?: string; killed?: boolean };\n if (failure.killed) {\n throw new MountError(`\\`tl fs ${args[0]}\\` timed out after ${timeoutMs}ms`);\n }\n const detail = (failure.stderr || failure.stdout || String(error)).trim();\n throw new MountError(`\\`tl fs ${args.join(\" \")}\\` failed: ${detail}`);\n }\n }\n\n // Flags always precede a `--` end-of-options separator so caller-supplied\n // names/paths can never be parsed as CLI flags (e.g. a path literally\n // named \"--discard\" must stay a path, not become the destructive flag).\n async mount(filesystem: string, localPath: string, readonly: boolean): Promise<void> {\n const args = [\"mount\"];\n if (readonly) args.push(\"--ro\");\n args.push(\"--\", filesystem, localPath);\n await this.run(args);\n }\n\n async unmount(localPath: string, discard: boolean): Promise<void> {\n const args = [\"unmount\"];\n if (discard) args.push(\"--discard\");\n args.push(\"--\", localPath);\n await this.run(args);\n }\n\n async snapshot(localPath: string, message?: string): Promise<void> {\n const args = [\"snapshot\"];\n // Attached form: a detached value (\"-m\", \"-msg\") is rejected by the CLI\n // parser when the message starts with '-'.\n if (message) args.push(`--message=${message}`);\n args.push(\"--\", localPath);\n await this.run(args);\n }\n\n async status(localPath?: string): Promise<Record<string, unknown>> {\n const args = [\"status\", \"--json\"];\n if (localPath) args.push(\"--\", localPath);\n const output = await this.run(args, 60_000);\n try {\n const payload = JSON.parse(output);\n return typeof payload === \"object\" && payload !== null\n ? (payload as Record<string, unknown>)\n : { status: payload };\n } catch {\n throw new MountError(\n `\\`tl fs status --json\\` returned invalid JSON: ${output.slice(0, 200)}`,\n );\n }\n }\n}\n\n/** Manages the filesystems of one Tensorlake project. */\nexport class FilesystemClient {\n private readonly native: NativeRepositoryClient;\n private readonly cli: FsCli;\n\n /**\n * Any option left unset is resolved from the environment\n * (`TENSORLAKE_API_KEY` / `TENSORLAKE_PAT`, `TENSORLAKE_API_URL`,\n * `TENSORLAKE_ORGANIZATION_ID`, `TENSORLAKE_PROJECT_ID`).\n */\n constructor(options: FilesystemClientOptions = {}) {\n const context = buildContextFromEnv();\n const token =\n options.apiKey ?? context.apiKey ?? context.personalAccessToken;\n if (!token) {\n throw new FilesystemError(\n \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\",\n );\n }\n const organizationId = options.organizationId ?? context.organizationId;\n const projectId = options.projectId ?? context.projectId;\n if (!organizationId || !projectId) {\n throw new FilesystemError(\n \"Filesystem operations require organization and project context \" +\n \"(TENSORLAKE_ORGANIZATION_ID and TENSORLAKE_PROJECT_ID).\",\n );\n }\n if (options.nativeClient) {\n this.native = options.nativeClient;\n } else {\n const binding = loadNativeSandboxBinding();\n if (typeof binding.NativeRepositoryClient !== \"function\") {\n throw new FilesystemError(\n \"native binding does not export the repository client; rebuild with 'npm run build:native'\",\n );\n }\n this.native = new binding.NativeRepositoryClient(\n options.apiUrl ?? context.apiUrl,\n token,\n organizationId,\n projectId,\n `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n null,\n );\n }\n const envOverrides: Record<string, string> = {\n TENSORLAKE_ORGANIZATION_ID: organizationId,\n TENSORLAKE_PROJECT_ID: projectId,\n // The CLI must target the same deployment the data plane does, or a\n // mount could resolve a same-named filesystem in the wrong environment.\n TENSORLAKE_API_URL: options.apiUrl ?? context.apiUrl,\n };\n if (options.apiKey) {\n envOverrides.TENSORLAKE_API_KEY = options.apiKey;\n }\n this.cli = new FsCli(envOverrides);\n }\n\n // -- lifecycle --------------------------------------------------------------\n\n /** Create a new filesystem and return a handle to it. */\n async create(name: string): Promise<Filesystem> {\n if (typeof name !== \"string\") {\n throw new TypeError(\"name must be a string\");\n }\n if (name.length === 0) {\n throw new FilesystemError(\"filesystem name must not be empty\");\n }\n const raw = await callNative(() => this.native.createFilesystem(name));\n // The binding reports the effective default branch; it differs from\n // \"main\" only when a lost-response retry adopted a pre-existing\n // filesystem.\n const created = JSON.parse(raw) as { default_branch?: string };\n return new Filesystem(\n this,\n this.native,\n this.cli,\n name,\n created.default_branch || \"main\",\n );\n }\n\n /**\n * Fork a filesystem at its live head or an explicit retained snapshot.\n * The server shares immutable content and publishes only metadata.\n */\n async fork(\n name: string,\n baseFilesystem: string,\n snapshot?: string,\n ): Promise<Filesystem> {\n if (!name || !baseFilesystem) {\n throw new FilesystemError(\n \"fork and base filesystem names must not be empty\",\n );\n }\n await callNative(\n () =>\n this.native.forkFilesystem(\n name,\n baseFilesystem,\n snapshot ?? null,\n ),\n new FilesystemNotFoundError(baseFilesystem),\n );\n return new Filesystem(this, this.native, this.cli, name, \"main\");\n }\n\n /** Return a handle to an existing filesystem (verifies it exists). */\n async get(name: string): Promise<Filesystem> {\n const traced = await callNative(\n () => this.native.filesystemMeta(name),\n new FilesystemNotFoundError(name),\n );\n const meta = JSON.parse(traced.json) as {\n kind?: string;\n default_branch?: string;\n };\n if ((meta.kind ?? FILESYSTEM_REPO_KIND) !== FILESYSTEM_REPO_KIND) {\n throw new FilesystemNotFoundError(name);\n }\n return new Filesystem(\n this,\n this.native,\n this.cli,\n name,\n meta.default_branch || \"main\",\n );\n }\n\n /** List all filesystems in the project. */\n async list(): Promise<FilesystemInfo[]> {\n const traced = await callNative(() => this.native.listFilesystems());\n const page = JSON.parse(traced.json) as {\n repos?: Array<Record<string, unknown>>;\n };\n return (page.repos ?? []).map((repo) => ({\n name: String(repo.name ?? \"\"),\n fullName: String(repo.full_name ?? \"\"),\n status: String(repo.status ?? \"\"),\n kind: String(repo.kind ?? FILESYSTEM_REPO_KIND),\n }));\n }\n\n /** Permanently delete a filesystem and all its snapshots. */\n async delete(name: string): Promise<void> {\n await callNative(\n () => this.native.deleteFilesystem(name),\n new FilesystemNotFoundError(name),\n );\n }\n\n // -- local mounts -------------------------------------------------------------\n\n /** Mount a filesystem to a local path (requires the `tl` CLI). */\n async mount(\n name: string,\n localPath: string,\n readonly = false,\n ): Promise<FilesystemMount> {\n await this.cli.mount(name, localPath, readonly);\n return new FilesystemMount(this, this.cli, name, localPath, readonly);\n }\n\n /**\n * Unmount a locally mounted filesystem.\n *\n * `discard: true` drops local changes that were not yet uploaded.\n */\n async unmount(localPath: string, discard = false): Promise<void> {\n await this.cli.unmount(localPath, discard);\n }\n\n /** Status of a local mount (defaults to the mount containing CWD). */\n async mountStatus(localPath?: string): Promise<MountStatus> {\n return mountStatusFromRaw(await this.cli.status(localPath), localPath);\n }\n}\n\ntype FileData = Uint8Array | string;\n\nfunction toBuffer(data: FileData): Buffer {\n // Copy Uint8Array inputs before crossing the async N-API boundary. Sharing\n // the caller's backing store would let a post-call mutation change the\n // bytes being hashed and published.\n return typeof data === \"string\" ? Buffer.from(data, \"utf-8\") : Buffer.from(data);\n}\n\n/** Handle to one filesystem; reads/writes go through the Rust core. */\nexport class Filesystem {\n private readonly client: FilesystemClient;\n private readonly native: NativeRepositoryClient;\n private readonly cli: FsCli;\n readonly name: string;\n private defaultBranch: string | null;\n\n /** @internal — obtain instances via `FilesystemClient.create()` / `.get()`. */\n constructor(\n client: FilesystemClient,\n native: NativeRepositoryClient,\n cli: FsCli,\n name: string,\n defaultBranch: string | null = null,\n ) {\n this.client = client;\n this.native = native;\n this.cli = cli;\n this.name = name;\n this.defaultBranch = defaultBranch;\n }\n\n /**\n * The filesystem's default branch — the target of every write and the\n * default version of every read, so writes and `status()` can never\n * silently disagree on a non-\"main\" filesystem.\n */\n private async branch(): Promise<string> {\n if (!this.defaultBranch) {\n const traced = await callNative(\n () => this.native.filesystemMeta(this.name),\n new FilesystemNotFoundError(this.name),\n );\n const meta = JSON.parse(traced.json) as { default_branch?: string };\n this.defaultBranch = meta.default_branch || \"main\";\n }\n return this.defaultBranch;\n }\n\n // -- writes -------------------------------------------------------------------\n\n /** Write one file. Returns the snapshot (version) the write produced. */\n async writeFile(\n path: string,\n data: FileData,\n message?: string,\n ): Promise<FilesystemVersion> {\n return await this.writeFiles(new Map([[path, data]]), message);\n }\n\n /** Write several files (and/or delete paths) in one atomic snapshot. */\n async writeFiles(\n files: Map<string, FileData> | Record<string, FileData>,\n message?: string,\n deletes: string[] = [],\n ): Promise<FilesystemVersion> {\n const entries =\n files instanceof Map ? [...files.entries()] : Object.entries(files);\n if (entries.length === 0 && deletes.length === 0) {\n throw new FilesystemError(\"nothing to write: no files or deletions given\");\n }\n const writes = entries.map(([path, data]) => ({\n path,\n content: toBuffer(data),\n }));\n // Truthiness, not nullish: an explicit \"\" gets the default too (parity\n // with the Python SDK).\n const resolvedMessage = message || `write ${writes.length} file(s) via SDK`;\n return await this.publishChanges(\n writes,\n deletes,\n [],\n [],\n resolvedMessage,\n );\n }\n\n /**\n * Stream one local file directly to object storage in bounded parts.\n * This is the memory-bounded API for multi-GiB files.\n */\n async writeFileFromPath(\n path: string,\n localPath: string,\n message?: string,\n ): Promise<FilesystemVersion> {\n return await this.writeFilesFromPaths(\n new Map([[path, localPath]]),\n message,\n );\n }\n\n /**\n * Atomically publish local files without loading their complete payloads\n * into JavaScript or Rust memory.\n */\n async writeFilesFromPaths(\n files: Map<string, string> | Record<string, string>,\n message?: string,\n ): Promise<FilesystemVersion> {\n const entries =\n files instanceof Map ? [...files.entries()] : Object.entries(files);\n if (entries.length === 0) {\n throw new FilesystemError(\"nothing to write: no local files given\");\n }\n const writes = entries.map(([path, localPath]) => ({ path, localPath }));\n const resolvedMessage =\n message || `write ${writes.length} local file(s) via SDK`;\n const branch = await this.branch();\n const traced = await callNative(\n () =>\n this.native.pushFilesystemPaths(\n this.name,\n writes,\n resolvedMessage,\n branch,\n randomBytes(16).toString(\"hex\"),\n ),\n new FilesystemNotFoundError(this.name),\n );\n const report = JSON.parse(traced.json) as {\n version_id?: string;\n previous_version_id?: string | null;\n };\n const versionId = String(report.version_id ?? \"\");\n const previousVersionId =\n report.previous_version_id == null\n ? null\n : String(report.previous_version_id);\n return {\n versionId,\n previousVersionId,\n created: previousVersionId !== versionId,\n message: resolvedMessage,\n };\n }\n\n /**\n * Move a file or directory without downloading or re-uploading its bytes.\n * The source removal and destination creation publish as one atomic snapshot.\n */\n async moveFile(\n from: string,\n to: string,\n message?: string,\n ): Promise<FilesystemVersion> {\n return await this.publishChanges(\n [],\n [],\n [{ from, to }],\n [],\n message || `move ${from} to ${to} via SDK`,\n );\n }\n\n /**\n * Copy a file or directory by reusing immutable content references. No\n * payload bytes traverse the client, API server, or object store.\n */\n async copyFile(\n from: string,\n to: string,\n message?: string,\n ): Promise<FilesystemVersion> {\n return await this.publishChanges(\n [],\n [],\n [],\n [{ from, to }],\n message || `copy ${from} to ${to} via SDK`,\n );\n }\n\n private async publishChanges(\n writes: Array<{ path: string; content: Buffer }>,\n deletes: string[],\n moves: Array<{ from: string; to: string }>,\n copies: Array<{ from: string; to: string }>,\n message: string,\n ): Promise<FilesystemVersion> {\n const branch = await this.branch();\n const traced = await callNative(\n () =>\n this.native.pushFilesystemFiles(\n this.name,\n writes,\n deletes,\n moves,\n copies,\n message,\n branch,\n // One key per logical write: a retried submit reattaches to the\n // same durable commit job instead of double-committing.\n randomBytes(16).toString(\"hex\"),\n ),\n new FilesystemNotFoundError(this.name),\n );\n const report = JSON.parse(traced.json) as {\n version_id?: string;\n previous_version_id?: string | null;\n };\n const versionId = String(report.version_id ?? \"\");\n const previousVersionId =\n report.previous_version_id == null\n ? null\n : String(report.previous_version_id);\n return {\n versionId,\n previousVersionId,\n created: previousVersionId !== versionId,\n message,\n };\n }\n\n /** Delete one file. Returns the durable version the deletion produced. */\n async deleteFile(path: string, message?: string): Promise<FilesystemVersion> {\n return await this.writeFiles(\n new Map(),\n message || `delete ${path} via SDK`,\n [path],\n );\n }\n\n /**\n * Return the filesystem's current version as a snapshot.\n *\n * Writes publish durable live versions. This retains the current head\n * permanently in one metadata-only server operation without changing or\n * copying any content.\n */\n async snapshot(message = \"snapshot via SDK\"): Promise<FilesystemSnapshot> {\n const resolvedMessage = message || \"snapshot via SDK\";\n const traced = await callNative(\n () =>\n this.native.retainFilesystemSnapshot(\n this.name,\n resolvedMessage,\n randomBytes(16).toString(\"hex\"),\n ),\n new FilesystemNotFoundError(this.name),\n );\n const retained = JSON.parse(traced.json) as {\n snapshot_id?: string;\n message?: string;\n };\n return {\n id: String(retained.snapshot_id ?? \"\"),\n message: retained.message || resolvedMessage,\n };\n }\n\n /** List explicitly retained snapshots without reading filesystem contents. */\n async listSnapshots(): Promise<FilesystemSnapshotInfo[]> {\n const traced = await callNative(\n () => this.native.listFilesystemSnapshots(this.name),\n new FilesystemNotFoundError(this.name),\n );\n const payload = JSON.parse(traced.json) as {\n snapshots?: Array<{\n snapshot_id?: string;\n created_at_ms?: number;\n message?: string;\n }>;\n };\n return (payload.snapshots ?? []).map((snapshot) => ({\n id: String(snapshot.snapshot_id ?? \"\"),\n createdAt: new Date(Number(snapshot.created_at_ms ?? 0)),\n message: String(snapshot.message ?? \"\"),\n }));\n }\n\n /** Delete one permanent retention point; shared/head-reachable bytes remain. */\n async deleteSnapshot(snapshot: string): Promise<void> {\n await callNative(\n () => this.native.deleteFilesystemSnapshot(this.name, snapshot),\n new FilesystemNotFoundError(this.name),\n );\n }\n\n // -- reads --------------------------------------------------------------------\n\n /**\n * Read a file's bytes at `version` (the current `main` head or a retained\n * snapshot id; defaults to the filesystem's current head).\n */\n async readFile(path: string, version?: string): Promise<Uint8Array> {\n return (await this.readFileWithMetadata(path, { version })).data;\n }\n\n /**\n * Read bytes and immutable metadata in one request. A range is executed by\n * Artifact Storage, so callers never download the unrequested remainder.\n */\n async readFileWithMetadata(\n path: string,\n options: FilesystemReadOptions = {},\n ): Promise<FilesystemFileRead> {\n if (trimSlashes(path) === \"\") {\n throw new FilesystemError(\"file path must not be empty\");\n }\n const range = options.range;\n if (\n range !== undefined &&\n (!Number.isSafeInteger(range.offset) ||\n range.offset < 0 ||\n !Number.isSafeInteger(range.length) ||\n range.length <= 0)\n ) {\n throw new FilesystemError(\n \"range requires a non-negative integer offset and positive integer length\",\n );\n }\n const resolvedVersion = options.version || (await this.branch());\n const traced = await callNative(\n () =>\n this.native.readFilesystemFile(\n this.name,\n path,\n resolvedVersion,\n range?.offset,\n range?.length,\n ),\n new FileNotFoundInFilesystemError(this.name, path),\n );\n const fullSize = traced.fullSize;\n if (\n !traced.contentId ||\n fullSize === undefined ||\n !Number.isSafeInteger(fullSize) ||\n fullSize < 0 ||\n traced.data.byteLength > fullSize\n ) {\n throw new FilesystemError(\n \"filesystem read response omitted content identity or total size\",\n );\n }\n return {\n data: new Uint8Array(traced.data),\n contentId: traced.contentId,\n size: fullSize,\n };\n }\n\n /** Read a file as UTF-8 text at `version`. Throws on non-UTF-8 content. */\n async readText(path: string, version?: string): Promise<string> {\n // fatal: parity with Python's strict bytes.decode(\"utf-8\") — corrupt\n // data must raise, never silently decode to replacement characters.\n // ignoreBOM keeps a leading U+FEFF, exactly as Python does.\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(\n await this.readFile(path, version),\n );\n }\n\n /** List one directory (non-recursive) at `version`. */\n async listFiles(dirPath = \"\", version?: string): Promise<FileEntry[]> {\n const resolvedVersion = version || (await this.branch());\n const traced = await callNative(\n () => this.native.listFilesystemTree(this.name, dirPath, resolvedVersion),\n new FileNotFoundInFilesystemError(this.name, dirPath || \"/\"),\n );\n const page = JSON.parse(traced.json) as {\n entries?: Array<{ name: string; oid?: string; mode?: number; size?: number | null }>;\n };\n return (page.entries ?? []).map((entry) => fileEntryFromWire(entry, dirPath));\n }\n\n // -- status -------------------------------------------------------------------\n\n /** Remote status: identity plus the current native version. */\n async status(): Promise<FilesystemStatus> {\n const metaTraced = await callNative(\n () => this.native.filesystemMeta(this.name),\n new FilesystemNotFoundError(this.name),\n );\n const meta = JSON.parse(metaTraced.json) as Record<string, unknown>;\n const defaultBranch = String(meta.default_branch || \"main\");\n this.defaultBranch = defaultBranch;\n let versionId: string | null = null;\n let generation: number | null = null;\n try {\n // A 404 here means \"no such ref yet\" (an empty filesystem), so it is\n // deliberately NOT mapped to FilesystemNotFoundError.\n const refTraced = await callNative(() =>\n this.native.filesystemRefStatus(this.name, defaultBranch),\n );\n const ref = JSON.parse(refTraced.json) as Record<string, unknown>;\n versionId =\n (ref.resolved_commit as string) || (ref.oid as string) || null;\n generation = typeof ref.generation === \"number\" ? ref.generation : null;\n } catch (error) {\n // Only \"no such ref yet\" means an empty filesystem; anything else\n // (auth, 5xx) must not masquerade as one.\n if (!(error instanceof FilesystemAPIError) || error.statusCode !== 404) {\n throw error;\n }\n }\n return {\n name: this.name,\n status: String(meta.status ?? \"\"),\n versionId,\n generation,\n };\n }\n\n // -- mounts -------------------------------------------------------------------\n\n /** Mount this filesystem to a local path (requires the `tl` CLI). */\n async mount(localPath: string, readonly = false): Promise<FilesystemMount> {\n return await this.client.mount(this.name, localPath, readonly);\n }\n}\n\n/** A filesystem mounted to a local path via the `tl` CLI daemon. */\nexport class FilesystemMount {\n private readonly client: FilesystemClient;\n private readonly cli: FsCli;\n readonly filesystem: string;\n readonly path: string;\n readonly readonly: boolean;\n\n /** @internal — obtain instances via `FilesystemClient.mount()`. */\n constructor(\n client: FilesystemClient,\n cli: FsCli,\n filesystem: string,\n path: string,\n readonly: boolean,\n ) {\n this.client = client;\n this.cli = cli;\n this.filesystem = filesystem;\n this.path = path;\n this.readonly = readonly;\n }\n\n /** Flush pending local changes into a durable snapshot. */\n async snapshot(message?: string): Promise<void> {\n await this.cli.snapshot(this.path, message);\n }\n\n /** Local mount status as reported by the mount daemon. */\n async status(): Promise<MountStatus> {\n return await this.client.mountStatus(this.path);\n }\n\n /** Unmount; `discard: true` drops changes not yet uploaded. */\n async unmount(discard = false): Promise<void> {\n await this.client.unmount(this.path, discard);\n }\n}\n","/** Models and errors for the filesystem SDK. */\n\n/** Git tree mode for a directory entry. */\nconst GIT_MODE_DIR = 0o40000;\nconst GIT_MODE_SYMLINK = 0o120000;\n\n/**\n * Strip leading/trailing '/' in linear time (the regex equivalent\n * `/^\\/+|\\/+$/g` backtracks polynomially on adversarial many-slash input).\n */\nexport function trimSlashes(path: string): string {\n let start = 0;\n let end = path.length;\n while (start < end && path.charCodeAt(start) === 0x2f) start += 1;\n while (end > start && path.charCodeAt(end - 1) === 0x2f) end -= 1;\n return path.slice(start, end);\n}\n\n/** One filesystem as returned by listing/point-read endpoints. */\nexport interface FilesystemInfo {\n name: string;\n fullName: string;\n status: string;\n kind: string;\n}\n\n/** Remote status of a filesystem: identity plus current head. */\nexport interface FilesystemStatus {\n name: string;\n status: string;\n /**\n * Current native version id; null for an empty filesystem that has never\n * been written to.\n */\n versionId: string | null;\n /** Server-side movement counter for the live version, when reported. */\n generation: number | null;\n}\n\n/** One directory entry from a filesystem listing. */\nexport interface FileEntry {\n name: string;\n /** Path of the entry relative to the filesystem root. */\n path: string;\n /** Stable native content identity for the file or directory. */\n contentId: string;\n /** Native entry kind. */\n kind: \"file\" | \"directory\" | \"symlink\";\n /** Whether a regular file is executable. */\n executable: boolean;\n /** Blob size in bytes when cheaply known server-side. */\n size: number | null;\n isDir: boolean;\n isSymlink: boolean;\n}\n\n/** Bytes plus immutable identity/size returned by one file request. */\nexport interface FilesystemFileRead {\n data: Uint8Array;\n /** Stable native identity for the complete file content. */\n contentId: string;\n /** Size of the complete file, even when `data` is a requested range. */\n size: number;\n}\n\nexport interface FilesystemReadOptions {\n /** Current `main` head when omitted; otherwise one retained snapshot id. */\n version?: string;\n /** Half-open byte selection expressed as offset + length. */\n range?: { offset: number; length: number };\n}\n\nexport function fileEntryFromWire(\n entry: { name: string; oid?: string; mode?: number; size?: number | null },\n dirPath: string,\n): FileEntry {\n const mode = entry.mode ?? 0o100644;\n const prefix = trimSlashes(dirPath);\n return {\n name: entry.name,\n path: prefix ? `${prefix}/${entry.name}` : entry.name,\n contentId: entry.oid ?? \"\",\n kind:\n mode === GIT_MODE_DIR\n ? \"directory\"\n : mode === GIT_MODE_SYMLINK\n ? \"symlink\"\n : \"file\",\n executable: mode === 0o100755,\n size: entry.size ?? null,\n isDir: mode === GIT_MODE_DIR,\n isSymlink: mode === GIT_MODE_SYMLINK,\n };\n}\n\n/** The durable live version produced by one atomic filesystem publication. */\nexport interface FilesystemVersion {\n /** Native version id — pass as `version` to read the filesystem at this point. */\n versionId: string;\n /** Version replaced by this publication, or null for the first publication. */\n previousVersionId: string | null;\n /** False when the write was a no-op (content identical to the parent). */\n created: boolean;\n message: string;\n}\n\n/** One newly retained native filesystem snapshot. */\nexport interface FilesystemSnapshot {\n id: string;\n message: string;\n}\n\n/** One explicitly retained native filesystem snapshot. */\nexport interface FilesystemSnapshotInfo {\n id: string;\n createdAt: Date;\n message: string;\n}\n\n/**\n * Status of a local mount as reported by `tl fs status --json`.\n *\n * The mount daemon's JSON is versioned independently of this SDK, so only\n * stable fields are typed; the full payload is preserved in `raw`.\n */\nexport interface MountStatus {\n /** Local mount path. */\n path: string;\n /** Filesystem name this mount serves, when reported. */\n filesystem: string | null;\n /** Whether the daemon reports the mount as healthy/active. */\n mounted: boolean;\n /** Complete parsed JSON payload from the CLI. */\n raw: Record<string, unknown>;\n}\n\n/**\n * Map one `tl fs status --json` payload to a MountStatus.\n *\n * Semantics deliberately mirror the Python SDK: `mounted` honors key\n * presence (an explicit null means \"not mounted\"), and path/filesystem\n * fall through empty strings, not just null/undefined.\n */\nexport function mountStatusFromRaw(\n raw: Record<string, unknown>,\n localPath?: string,\n): MountStatus {\n const mounted =\n \"mounted\" in raw\n ? Boolean(raw.mounted)\n : \"active\" in raw\n ? Boolean(raw.active)\n : true;\n const path = String(raw.path || raw.mount_path || localPath || \"\");\n const filesystem = (raw.filesystem || raw.file_system || null) as\n | string\n | null;\n return { path, filesystem, mounted, raw };\n}\n\nexport class FilesystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FilesystemError\";\n }\n}\n\nexport class FilesystemNotFoundError extends FilesystemError {\n readonly filesystemName: string;\n constructor(name: string) {\n super(`Filesystem not found: ${name}`);\n this.name = \"FilesystemNotFoundError\";\n this.filesystemName = name;\n }\n}\n\nexport class FileNotFoundInFilesystemError extends FilesystemError {\n readonly filesystem: string;\n readonly path: string;\n constructor(filesystem: string, path: string) {\n super(`File not found in filesystem ${filesystem}: ${path}`);\n this.name = \"FileNotFoundInFilesystemError\";\n this.filesystem = filesystem;\n this.path = path;\n }\n}\n\nexport class FilesystemAPIError extends FilesystemError {\n readonly statusCode: number;\n constructor(statusCode: number, message: string) {\n super(`API error (status ${statusCode}): ${message}`);\n this.name = \"FilesystemAPIError\";\n this.statusCode = statusCode;\n }\n}\n\nexport class MountError extends FilesystemError {\n constructor(message: string) {\n super(message);\n this.name = \"MountError\";\n }\n}\n\nexport class CliNotFoundError extends MountError {\n constructor(detail: string) {\n super(\n \"Mount operations require the Tensorlake CLI (`tl`) with `tl fs` \" +\n `support: ${detail}. Install or upgrade it with: ` +\n \"curl -fsSL https://tensorlake.ai/install.sh | sh\",\n );\n this.name = \"CliNotFoundError\";\n }\n}\n"],"mappings":"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AAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,MACrD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QACnD;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACrD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAClD;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;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","names":["SandboxStatus","SnapshotStatus","ProcessStatus","StdinMode","OutputMode","ContainerState","WebSocket","buttonMask","validatePort","secondsToMillis","import_ws","WebSocket","SandboxClient","process","path","secondsToMillis","sleep","path","sleep","undiciFetch","value","trimTrailingSlashes","path","createSandboxImage","resolveRequire","import_meta","path","os","DEFAULT_IMAGE_NAME","import_node_module","resolveRequestTimeoutMs","secondsToMillis","validateTimeoutMs","import_node_crypto","import_node_fs","import_node_os","import_node_path","import_node_util","path","translateNativeError","callNative","path"]}
|