tensorlake 0.5.135 → 0.5.136
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/applications/index.cjs +12 -12
- package/dist/applications/index.cjs.map +1 -1
- package/dist/applications/index.js +12 -12
- package/dist/applications/index.js.map +1 -1
- package/dist/function-agent/main.cjs +1 -1
- package/dist/function-agent/main.js +1 -1
- package/dist/function-executor/main.cjs +2 -2
- package/dist/function-executor/main.js +2 -2
- package/dist/index.cjs +426 -128
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +259 -9
- package/dist/index.d.ts +259 -9
- package/dist/index.js +420 -128
- package/dist/index.js.map +1 -1
- package/dist/sandbox-image.cjs +12 -12
- package/dist/sandbox-image.cjs.map +1 -1
- package/dist/sandbox-image.js +12 -12
- package/dist/sandbox-image.js.map +1 -1
- package/package.json +7 -7
- package/runtime/function-executor/manifest.json +5 -5
- package/runtime/function-executor/package/dist/function-executor/main.js +2 -2
- package/runtime/function-executor/package/npm-shrinkwrap.json +2 -2
- package/runtime/function-executor/package/package.json +1 -1
- package/runtime/typescript-function-runner/manifest.json +5 -5
- package/runtime/typescript-function-runner/package/dist/function-agent/main.js +1 -1
- package/runtime/typescript-function-runner/package/npm-shrinkwrap.json +20 -20
- package/runtime/typescript-function-runner/package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/defaults.ts","../src/errors.ts","../src/native-worker-protocol.ts","../src/url.ts","../src/native-worker-client.ts","../src/native-sandbox.ts","../src/models.ts","../src/tunnel.ts","../src/desktop.ts","../src/sdk-timings.ts","../src/sandbox.ts","../src/client.ts","../src/native-cloud.ts","../src/cloud-client.ts","../src/image.ts","../lib/libc.cjs","../src/native-binding.ts","../src/sandbox-image.ts","../src/index.ts","../src/api-client.ts","../src/filesystem.ts","../src/mount-cli.ts","../src/filesystem-models.ts","../src/repositories.ts","../src/repository-mount.ts","../src/file-system.ts","../src/applications/index.ts","../src/applications/function.ts","../src/applications/errors.ts","../src/applications/schema.ts","../src/applications/file.ts","../src/applications/http-body.ts","../src/applications/registry.ts","../src/applications/headers.ts","../src/applications/context.ts","../src/applications/serialization.ts","../src/applications/local.ts","../src/applications/remote.ts","../src/applications/manifest.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","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;\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 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. Transport\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\nexport function 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\n/** Raised when the remote API returns an error. */\nexport class RemoteAPIError extends SandboxError {\n readonly statusCode: number;\n /** Original response body, retained for compatibility and diagnostics. */\n readonly responseMessage: string;\n readonly sandboxId?: string;\n /** Server reason, including unknown future reasons. */\n readonly reason?: string;\n readonly errorDetails?: unknown;\n\n constructor(statusCode: number, message: string) {\n let failure: Record<string, unknown> | undefined;\n try {\n const payload: unknown = JSON.parse(message);\n if (payload && typeof payload === \"object\" && !Array.isArray(payload)) {\n const record = payload as Record<string, unknown>;\n if (\n typeof record.sandbox_id === \"string\" &&\n record.sandbox_id.trim() &&\n (record.status === \"failed\" || record.status === \"terminated\")\n )\n failure = record;\n }\n } catch {\n // Non-JSON errors keep their existing message.\n }\n const sandboxId = failure?.sandbox_id as string | undefined;\n const rawReason = failure?.reason ?? failure?.termination_reason;\n const reason = typeof rawReason === \"string\" ? rawReason : undefined;\n const errorDetails = failure?.error_details;\n let displayMessage = message;\n if (failure) {\n displayMessage = `Sandbox ${sandboxId} ${failure.status}`;\n if (reason) displayMessage += ` (${reason})`;\n const detail = formatErrorDetails(errorDetails);\n if (detail) displayMessage += `: ${detail}`;\n if (!reason && !detail) displayMessage = message;\n }\n super(`API error (status ${statusCode}): ${displayMessage}`);\n this.sandboxId = sandboxId;\n this.reason = reason;\n this.errorDetails = errorDetails;\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","/** Internal protocol. Native objects never cross an isolate boundary. */\nexport type NativeClientKind =\n | \"NativeCloudClient\"\n | \"NativeSandboxClient\"\n | \"NativeSandboxProxyClient\"\n | \"NativeRepositoryClient\";\n\nexport interface NativeHandle {\n id: number;\n kind: NativeClientKind;\n args: unknown[];\n parent?: NativeHandle;\n}\n\nexport type WorkerRequest =\n | { type: \"create\"; handle: Omit<NativeHandle, \"parent\">; parentId?: number }\n | {\n type: \"call\";\n id: number;\n handleId?: number;\n method: string;\n args: unknown[];\n stream: boolean;\n }\n | { type: \"release\"; handleId: number }\n | { type: \"ack\" | \"cancel\"; id: number };\n\nexport type WorkerResponse =\n | { type: \"result\"; id: number; value: unknown }\n | {\n type: \"error\";\n id: number;\n error: { name: string; message: string; stack?: string };\n }\n | { type: \"event\"; id: number; value: string };\n\nexport const cancelNativeCall = Symbol.for(\"tensorlake.native.cancel.v1\");\nexport const closeNativeHandle = Symbol.for(\"tensorlake.native.close.v1\");\nexport type NativeCall<T> = Promise<T> & { [cancelNativeCall]?: () => void };\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 { createRequire } from \"node:module\";\nimport { Worker } from \"node:worker_threads\";\nimport type { NativeEmit, NativeSandboxBinding } from \"./native-sandbox.js\";\nimport {\n cancelNativeCall,\n closeNativeHandle,\n type NativeCall,\n type NativeHandle,\n type WorkerRequest,\n type WorkerResponse,\n} from \"./native-worker-protocol.js\";\nimport { resolveProxyTarget } from \"./url.js\";\n\ninterface PendingCall {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n emit?: NativeEmit;\n // Keep descriptors (and their parents) alive until the operation settles.\n handle?: NativeHandle;\n}\n\n/** One persistent worker per SDK installation and calling isolate. */\nexport class NativeWorkerClient {\n private worker?: Worker;\n private nextId = 1;\n private registered = new Set<number>();\n private pending = new Map<number, PendingCall>();\n private finalizers = new FinalizationRegistry<number>((id) =>\n this.release(id),\n );\n\n constructor(\n private readonly workerPath: () => string | URL = () =>\n createRequire(import.meta.url).resolve(\n \"tensorlake/internal/native-worker\",\n ),\n ) {}\n\n handle(\n kind: NativeHandle[\"kind\"],\n args: unknown[],\n parent?: NativeHandle,\n ): object {\n const handle: NativeHandle = { id: this.nextId++, kind, args, parent };\n this.finalizers.register(handle, handle.id);\n let closed = false;\n return new Proxy(\n {},\n {\n get: (_target, method) => {\n if (method === \"then\") return undefined;\n if (method === closeNativeHandle)\n return () => {\n closed = true;\n this.release(handle.id);\n };\n if (method === \"connectProxy\")\n return (...proxyArgs: unknown[]) => {\n if (closed) throw new Error(\"Tensorlake native client is closed\");\n return this.handle(\"NativeSandboxProxyClient\", proxyArgs, handle);\n };\n if (method === \"baseUrl\")\n return () =>\n resolveProxyTarget(String(args[0]), String(args[1])).baseUrl;\n if (typeof method !== \"string\") return undefined;\n return (...callArgs: unknown[]) => {\n if (closed)\n return Promise.reject(\n new Error(\"Tensorlake native client is closed\"),\n );\n const emit =\n typeof callArgs.at(-1) === \"function\"\n ? (callArgs.pop() as NativeEmit)\n : undefined;\n return this.call(handle, method, callArgs, emit);\n };\n },\n },\n );\n }\n\n call(\n handle: NativeHandle | undefined,\n method: string,\n args: unknown[],\n emit?: NativeEmit,\n ): NativeCall<any> {\n const id = this.nextId++;\n let worker: Worker | undefined;\n const promise: NativeCall<any> = new Promise((resolve, reject) => {\n try {\n worker = this.getWorker();\n this.pending.set(id, { resolve, reject, emit, handle });\n worker.ref();\n if (handle) this.register(handle, worker);\n this.send(worker, {\n type: \"call\",\n id,\n handleId: handle?.id,\n method,\n args,\n stream: !!emit,\n });\n } catch (error) {\n this.pending.delete(id);\n this.unrefIfIdle();\n reject(error);\n }\n });\n promise[cancelNativeCall] = () => {\n const pending = this.pending.get(id);\n if (pending && worker) {\n pending.emit = undefined;\n this.send(worker, { type: \"cancel\", id });\n }\n };\n return promise;\n }\n\n private getWorker(): Worker {\n if (this.worker) return this.worker;\n const worker = new Worker(this.workerPath(), {\n // The bundled worker needs no application loaders or telemetry preloads.\n // NODE_OPTIONS is parsed independently of execArgv by Node.\n execArgv: [],\n env: { ...process.env, NODE_OPTIONS: \"\" },\n name: \"tensorlake-native\",\n });\n this.worker = worker;\n worker.on(\"message\", (message: WorkerResponse) => {\n const pending = this.pending.get(message.id);\n if (!pending || this.worker !== worker) return;\n if (message.type === \"event\") {\n // Acknowledge only when the consumer asks for the next event. At most\n // one event per stream is outstanding across Rust, worker and caller.\n Promise.resolve()\n .then(() => pending.emit?.(message.value))\n .then(\n () => {\n if (this.worker === worker)\n this.send(worker, { type: \"ack\", id: message.id });\n },\n (error: Error) => {\n this.send(worker, { type: \"cancel\", id: message.id });\n pending.reject(error);\n },\n );\n return;\n }\n this.pending.delete(message.id);\n if (message.type === \"error\") {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n error.stack = message.error.stack ?? error.stack;\n pending.reject(error);\n } else {\n pending.resolve(message.value);\n }\n this.unrefIfIdle();\n });\n const fail = (error: Error) => {\n if (this.worker !== worker) return;\n this.worker = undefined;\n this.registered.clear();\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n // Never replay an in-flight request: it may already have taken effect.\n // A subsequent explicit call starts a fresh worker from descriptors.\n void worker.terminate();\n };\n worker.on(\"error\", fail);\n worker.on(\"messageerror\", fail);\n worker.on(\"exit\", (code) =>\n fail(\n new Error(\n `Tensorlake native worker exited (${code}); in-flight operations were not retried`,\n ),\n ),\n );\n worker.unref();\n return worker;\n }\n\n private register(handle: NativeHandle, worker: Worker): void {\n if (this.registered.has(handle.id)) return;\n if (handle.parent) this.register(handle.parent, worker);\n this.send(worker, {\n type: \"create\",\n handle: { id: handle.id, kind: handle.kind, args: handle.args },\n parentId: handle.parent?.id,\n });\n this.registered.add(handle.id);\n }\n\n private release(handleId: number): void {\n if (this.worker && this.registered.delete(handleId))\n this.send(this.worker, { type: \"release\", handleId });\n }\n\n private send(worker: Worker, message: WorkerRequest): void {\n worker.postMessage(message);\n }\n private unrefIfIdle(): void {\n if (this.pending.size === 0) this.worker?.unref();\n }\n}\n\nexport function createWorkerBinding(\n runtime: NativeWorkerClient,\n): NativeSandboxBinding {\n return {\n NativeCloudClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeCloudClient\", args);\n }\n },\n NativeSandboxClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeSandboxClient\", args);\n }\n },\n NativeSandboxProxyClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeSandboxProxyClient\", args);\n }\n },\n NativeRepositoryClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeRepositoryClient\", args);\n }\n },\n validateManagedName: (name: string) =>\n runtime.call(undefined, \"validateManagedName\", [name]),\n } as unknown as NativeSandboxBinding;\n}\n\n// ESM and CJS can coexist in one application. Share the worker across bundles\n// of this SDK version, while keeping incompatible installed versions separate.\ndeclare const __SDK_VERSION__: string;\nconst runtimeKey = Symbol.for(\n `tensorlake.native.worker.${typeof __SDK_VERSION__ === \"undefined\" ? \"source\" : __SDK_VERSION__}.v1`,\n);\nconst runtimes = globalThis as typeof globalThis & {\n [runtimeKey]?: NativeWorkerClient;\n};\nexport function workerBinding(): NativeSandboxBinding {\n return createWorkerBinding(\n (runtimes[runtimeKey] ??= new NativeWorkerClient()),\n );\n}\n\n/** Runtime capsules supply the worker alongside their bundled application SDK. */\nexport function configureNativeWorker(workerPath: () => string | URL): void {\n runtimes[runtimeKey] ??= new NativeWorkerClient(workerPath);\n}\n\nexport function releaseNativeHandle(handle: object | null): void {\n (handle as { [closeNativeHandle]?: () => void } | null)?.[\n closeNativeHandle\n ]?.();\n}\n","import {\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxError,\n SandboxNotFoundError,\n} from \"./errors.js\";\nimport { workerBinding } from \"./native-worker-client.js\";\nimport type { NativeCloudClient } from \"./native-cloud.js\";\nimport { cancelNativeCall, type NativeCall } from \"./native-worker-protocol.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: Uint8Array;\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 | Promise<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, requestJson?: 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 readOnly?: boolean | null,\n prefetch?: boolean | null,\n snapshotId?: string | null,\n owner?: string | null,\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 | Promise<string>;\n}\n\nexport interface NativeRepositoryClient {\n gitRepoUrl(repo: string): Promise<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 NativeCloudClient?: new (optionsJson: string) => NativeCloudClient;\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 | Promise<void>;\n}\n\n// ---- Binding loader -------------------------------------------------------\n\nlet cachedBinding: NativeSandboxBinding | undefined;\nexport function loadNativeSandboxBinding(): NativeSandboxBinding {\n return cachedBinding ??= workerBinding();\n}\n\n/** Test seam: replace (or clear) the native binding. */\nexport function __setNativeSandboxBindingForTest(\n binding: NativeSandboxBinding | undefined,\n): void {\n cachedBinding = binding;\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. Each emit\n * resolves only after consumption, propagating backpressure through the worker\n * to Rust. Cancellation drops the upstream response, including quiet streams.\n */\nexport async function* nativeEventStream(\n start: (emit: NativeEmit) => Promise<string>,\n context?: NativeErrorContext,\n signal?: AbortSignal,\n): AsyncGenerator<Record<string, unknown>> {\n if (signal?.aborted) return;\n const queue: Array<{ value: string; consumed: () => void }> = [];\n let wake: (() => void) | undefined;\n let finished = false;\n let stopped = false;\n let failure: unknown;\n const notify = () => { const resolve = wake; wake = undefined; resolve?.(); };\n const emit: NativeEmit = (value) => {\n if (stopped) return Promise.resolve();\n return new Promise<void>((consumed) => { queue.push({ value, consumed }); notify(); });\n };\n let call: NativeCall<string> | undefined;\n const onAbort = () => { stopped = true; call?.[cancelNativeCall]?.(); notify(); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n call = start(emit);\n void call.catch((error: unknown) => { failure = error; }).finally(() => { finished = true; notify(); });\n while (!stopped) {\n const event = queue.shift();\n if (event) {\n try { yield JSON.parse(event.value) as Record<string, unknown>; }\n finally { event.consumed(); }\n } else if (finished) {\n break;\n } else {\n await new Promise<void>((resolve) => { wake = resolve; });\n }\n }\n if (!stopped && failure !== undefined) throw translateNativeError(failure, context);\n } finally {\n stopped = true;\n signal?.removeEventListener(\"abort\", onAbort);\n call?.[cancelNativeCall]?.();\n for (const event of queue) event.consumed();\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 /** Terminal status used by blocking create/claim responses. */\n FAILED = \"failed\",\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 diskMb: number;\n}\n\n/** GPU models supported by the sandbox scheduler. */\nexport type GpuModel =\n | \"A100-40GB\"\n | \"A100-80GB\"\n | \"H100\"\n | \"T4\"\n | \"A6000\"\n | \"RTX-PRO-6000\"\n | \"L40\"\n | \"A10\";\n\n/** A homogeneous GPU allocation for a sandbox. */\nexport interface GpuRequest {\n count: number;\n model: GpuModel;\n}\n\nexport interface GPUResources {\n count: number;\n model: string;\n}\n\n/**\n * Egress network access control policy for a sandbox.\n *\n * `denyOut` takes precedence over `allowOut`: a destination matched by both is\n * blocked. Entries may be IPv4 addresses, CIDR ranges, or DNS hostnames;\n * hostname rules are followed across DNS changes. The policy can be changed on\n * a running sandbox via `Sandbox.update({ network })` (pass `null` to clear).\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 Artifact Storage file-system name created with\n * `tl fs create <name>` and `mountPath` is an absolute, unique guest path\n * (e.g. `/mnt/skills`).\n *\n * `readOnly` and `prefetch` are optional mount modes; they are sent on the\n * wire only when `true` (older servers reject unknown mount fields, so\n * `false` is expressed by omission).\n *\n * `snapshotId` pins the mount to a specific filesystem snapshot. A pinned\n * mount must also set `readOnly: true` (the server rejects a writable pin\n * with HTTP 400). It is sent only when set, for the same compatibility\n * reason as the mount modes.\n *\n * `owner` presents the mounted files as owned by a guest user: `NAME`,\n * `UID`, `NAME:GROUP`, or `UID:GID` (e.g. `\"agent\"` or `\"1001:1001\"`),\n * resolved against the sandbox image's own user database when the mount\n * attaches. Unset keeps the image default (the baked `tl-user` account when\n * the image has one, otherwise root). It is sent only when set, for the\n * same compatibility reason as the mount modes.\n */\nexport interface FileSystemMount {\n fileSystemId: string;\n mountPath: string;\n /** Mount the file system read-only. */\n readOnly?: boolean;\n /** Eagerly download the file system's contents. */\n prefetch?: boolean;\n /** Pin the mount to a specific filesystem snapshot (requires `readOnly`). */\n snapshotId?: string;\n /** Present the mounted files as owned by this guest user spec. */\n owner?: string;\n}\n\n/** Optional mount modes for attaching a file system to a running sandbox. */\nexport interface AttachFileSystemOptions {\n /** Mount the file system read-only. */\n readOnly?: boolean;\n /** Eagerly download the file system's contents. */\n prefetch?: boolean;\n /** Pin the mount to a specific filesystem snapshot (requires `readOnly`). */\n snapshotId?: string;\n /** Present the mounted files as owned by this guest user spec. */\n owner?: string;\n}\n\nexport interface ClaimSandboxOptions {\n /** File systems to mount before the claimed sandbox is reported as running. */\n fileSystems?: FileSystemMount[];\n}\n\n// --- Sandbox lifecycle ---\n\nexport interface CreateSandboxOptions {\n /** Optional sandbox image name. GPU sandboxes require a CAS image; when omitted with a GPU request, Tensorlake uses the server's configured GPU default. */\n image?: string;\n /** CPU count. Defaults to 1 for fresh creates; snapshot restores inherit it when omitted. */\n cpus?: number;\n /** Memory in MB. Defaults to 1024 for fresh creates; snapshot restores inherit it when omitted. */\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. Defaults to A10 unless gpuModel is set. GPU sandboxes require a CAS image. */\n gpus?: number;\n /** GPU model to allocate. The string arm preserves compatibility with existing callers; values are validated at runtime. */\n gpuModel?: GpuModel | (string & {});\n /** Typed GPU model and count request. Cannot be combined with gpus or gpuModel. */\n gpu?: GpuRequest;\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 on fresh creation or warm-pool claim, 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 * Egress network policy for the running sandbox, applied to the live VM's\n * firewall in one atomic swap. Omit to keep the current policy, set to\n * replace it, or pass `null` to clear it to unrestricted egress.\n */\n network?: NetworkConfig | null;\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 /** Egress network policy currently applied to the sandbox. */\n networkPolicy?: 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\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"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 /** Root disk size in megabytes. Omit to use the registered image's size. */\n diskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n /** Network policy for each container. Can be replaced later via updatePool. */\n network?: NetworkConfig;\n}\n\nexport interface UpdatePoolOptions {\n /**\n * Network policy for each container. Omit to keep the pool's current policy,\n * set to replace it, or pass `null` to remove it (unclaimed warm containers\n * are recycled onto the new policy).\n */\n network?: NetworkConfig | null;\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n /** Root disk size in megabytes. Omit to use the registered image's size. */\n diskMb?: 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 /** The network policy that applies to each container in the pool. */\n networkPolicy?: NetworkConfig;\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\" | \"running\" | \"backing_off\" | \"stopped\";\n\nexport type ManagedProcessHealthStatus =\n \"disabled\" | \"starting\" | \"healthy\" | \"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\n/**\n * Options for `Sandbox.getOrCreate`: everything `create` accepts (used only\n * when a new sandbox must be created; `name` comes from the first argument),\n * plus `resume`. `poolId` is excluded: a pool claim cannot carry a name, so\n * a claimed sandbox could never be found again by a later call.\n */\nexport interface GetOrCreateOptions\n extends Omit<CreateAndConnectOptions, \"name\" | \"poolId\"> {\n /** Resume a suspended sandbox before returning. Default: true. */\n resume?: boolean;\n}\n\n/**\n * What `Sandbox.getOrCreate` did to bind the name, exposed as\n * `sandbox.bindOutcome`:\n *\n * - `\"created\"`: nothing held the name; the call created a new sandbox.\n * - `\"attached\"`: a sandbox already held the name and needed no resume.\n * Includes a sandbox that was still starting (the call waited for it)\n * and a suspended sandbox when `resume: false`.\n * - `\"resumed\"`: the sandbox was suspended when the call found it and is\n * running now.\n */\nexport type GetOrCreateOutcome = \"created\" | \"attached\" | \"resumed\";\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(obj: unknown, idField?: string): unknown {\n if (Array.isArray(obj))\n 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 { releaseNativeHandle } from \"./native-worker-client.js\";\nimport type { SandboxClient } from \"./client.js\";\nimport {\n type ConnectDesktopOptions,\n Desktop,\n} from \"./desktop.js\";\nimport {\n RemoteAPIError,\n SandboxError,\n SandboxNotFoundError,\n} from \"./errors.js\";\nimport { type Traced } from \"./traced.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 GetOrCreateOptions,\n type GetOrCreateOutcome,\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 AttachFileSystemOptions,\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 private closed = false;\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.closed) throw new SandboxError(\"Sandbox connection is closed\");\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 const resolving = this.resolveProxyInfo(identifier)\n .then(async (info) => {\n if (generation !== this.resolveGeneration) {\n return;\n }\n const proxyUrl = await 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 if (generation !== this.resolveGeneration) return;\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 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 if (this.resolvePromise === resolving) this.resolvePromise = null;\n });\n this.resolvePromise = resolving;\n return resolving;\n }\n\n hasExplicitProxyUrl(): boolean {\n return this.explicitProxyUrl != null;\n }\n\n async refreshFromInfo(info: Traced<SandboxInfo>): Promise<void> {\n if (this.closed) throw new SandboxError(\"Sandbox connection is closed\");\n const generation = ++this.resolveGeneration;\n const routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = await 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 if (generation !== this.resolveGeneration) return;\n const state = this.buildProxyState(\n proxyUrl,\n info.sandboxId,\n routingHint,\n );\n this.resolvePromise = null;\n this.routingHint = routingHint;\n releaseNativeHandle(this.nativeProxy);\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.closed) throw new SandboxError(\"Sandbox connection is closed\");\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 this.closed = true;\n this.resolveGeneration += 1;\n releaseNativeHandle(this.nativeProxy);\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 */\n// `getOrCreate`: how many connect-or-create attempts to make when a named\n// sandbox is caught mid-handoff (for example, its previous holder is still\n// terminating), and the base delay between attempts.\nconst GET_OR_CREATE_ATTEMPTS = 4;\nconst GET_OR_CREATE_RETRY_DELAY_MS = 500;\n\n// `bindOutcome` is read-only for callers; `getOrCreate` is the one writer.\nfunction markBindOutcome(sandbox: Sandbox, outcome: GetOrCreateOutcome): Sandbox {\n (sandbox as { bindOutcome: GetOrCreateOutcome }).bindOutcome = outcome;\n return sandbox;\n}\n\nexport class Sandbox {\n traceId: string | null = null;\n /**\n * What {@link Sandbox.getOrCreate} did to bind the name: `\"created\"`,\n * `\"attached\"`, or `\"resumed\"`. `null` for handles from `create` or\n * `connect`.\n */\n readonly bindOutcome: GetOrCreateOutcome | 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.lifecycleIdentifier = options.sandboxId;\n this.proxy = new SandboxProxyConnection(this, options);\n }\n\n /**\n * The server-assigned sandbox ID.\n *\n * A handle opened by name (`connect({ sandboxId: name })`) reports the\n * name until its first server response, then the canonical ID. Handles\n * from `create` and `getOrCreate` carry the canonical ID from the start.\n */\n get sandboxId(): string {\n return this.lifecycleIdentifier;\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 * When `name` is already claimed, the server rejects the create with\n * HTTP 409 (`RemoteAPIError`). To attach to the existing sandbox\n * instead, use {@link Sandbox.getOrCreate}.\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 * The handle is lazy: when `proxyUrl` is omitted, the sandbox is resolved\n * on the first request so the handle uses the correct cloud/region ingress\n * endpoint. Connecting does not verify that the sandbox exists. Does\n * **not** auto-resume a suspended sandbox — call `sandbox.resume()`\n * 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 /**\n * Return the one sandbox bound to `name`. Create it on first use.\n *\n * This is the recommended call for an agent session that derives its\n * sandbox name from its session ID. It declares the intent \"this name is\n * my session's sandbox\": when a sandbox already holds the name, the call\n * attaches to it instead of failing with HTTP 409 the way `create` does.\n *\n * The steps, all handled internally:\n *\n * 1. `connect` by name — finds the sandbox, running or suspended.\n * 2. When nothing holds the name, `create` with the given configuration.\n * 3. When that create loses a race against another caller (HTTP 409),\n * connect to the winner.\n * 4. When the sandbox is still starting (another caller's create is in\n * flight), wait until it is `Running`, the same way `create` blocks\n * for its own caller.\n * 5. When the sandbox is suspended, `resume()` it. Disable with\n * `resume: false`.\n *\n * Concurrent callers that use the same name all converge on the same\n * sandbox. The configuration options (`image`, `cpus`, ...) apply only\n * when the call creates a new sandbox; an existing sandbox is returned\n * as-is, with whatever configuration it already has.\n *\n * The returned handle carries the canonical `sandboxId` (not the name)\n * and records what the call did in `bindOutcome`: `\"created\"`,\n * `\"attached\"`, or `\"resumed\"`. See {@link GetOrCreateOutcome}.\n *\n * For about a second after `terminate()`, the name still resolves and\n * the sandbox still reports `running`. A `getOrCreate` in that window\n * attaches to the dying sandbox. When you recreate right after a\n * terminate, check `status()` after the call, or wait for the old\n * sandbox to report `terminated` first.\n *\n * `poolId` is not accepted: a pool claim cannot carry a name, so a\n * claimed sandbox could never be found again by a later call. To use a\n * warm pool, `create` with `poolId` and name the sandbox afterwards\n * with `client.update(sandboxId, { name })`.\n *\n * @param name Sandbox name; unique within the namespace. Derive it\n * deterministically from your session ID, for example\n * `agent-${sessionId}`.\n * @param options Create options plus `resume` (default true: resume a\n * suspended sandbox before returning). Used only when a new sandbox\n * must be created, except connection-level options.\n * @throws {SandboxError} If the name stays claimed but its sandbox cannot\n * be attached to after several attempts (for example, the previous\n * holder is stuck terminating), or if a sandbox that is still starting\n * does not reach `Running` within `requestTimeout`.\n * @throws {RemoteAPIError} If the create step fails with a non-409 error.\n */\n static async getOrCreate(\n name: string,\n options?: GetOrCreateOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n const { resume = true, ...createOptions } = options ?? {};\n // The type omits poolId, but plain-JS callers can still pass it. Reject\n // it here: the claim request has no name field on the wire, so the\n // claimed sandbox would be unnamed and every later call would claim\n // another one instead of converging.\n if ((createOptions as { poolId?: string }).poolId != null) {\n throw new SandboxError(\n \"getOrCreate does not accept poolId: a pool claim cannot name the \" +\n \"sandbox. Use create({ poolId }) and then \" +\n \"client.update(sandboxId, { name }).\",\n );\n }\n let lastConflict: RemoteAPIError | undefined;\n for (let attempt = 0; attempt < GET_OR_CREATE_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n // Reachable only after a lost create race whose winner is not\n // connectable yet (for example, the name's previous holder is\n // still terminating). Give the server a moment.\n await sleep(GET_OR_CREATE_RETRY_DELAY_MS * attempt);\n }\n try {\n const sandbox = await Sandbox.connect({\n ...createOptions,\n sandboxId: name,\n });\n // connect returns a lazy handle without checking that the name\n // exists; this status fetch is the existence check that routes a\n // free name to the create step below.\n const status = await sandbox.status();\n if (status === SandboxStatus.PENDING) {\n // Another caller's create is still starting this sandbox. Match\n // create(): block until Running, then pick up fresh proxy\n // routing before handing the sandbox out.\n const waitTimeout = createOptions.requestTimeout ?? 300;\n await sandbox.refreshRoutingWhenRunning(\n Date.now() + waitTimeout * 1000,\n 0.5,\n waitTimeout,\n );\n } else if (\n resume &&\n (status === SandboxStatus.SUSPENDED ||\n status === SandboxStatus.SUSPENDING)\n ) {\n const waitTimeout = createOptions.requestTimeout ?? 300;\n let settled: SandboxStatus = status;\n if (settled === SandboxStatus.SUSPENDING) {\n // The server rejects resume while a suspend is still in\n // progress; wait for the suspend to settle first.\n settled = await sandbox.waitOutSuspending(waitTimeout, name);\n }\n if (settled === SandboxStatus.SUSPENDED) {\n await sandbox.resume({ timeout: waitTimeout });\n } else if (settled === SandboxStatus.TERMINATED) {\n // The sandbox died while suspending; the name may be free\n // again. Retry the loop.\n continue;\n } else {\n // Another caller resumed it first. The resumed sandbox may\n // live elsewhere, so this handle's routing from before the\n // suspend is stale. Match the PENDING branch: block until\n // Running with fresh proxy routing.\n await sandbox.refreshRoutingWhenRunning(\n Date.now() + waitTimeout * 1000,\n 0.5,\n waitTimeout,\n );\n }\n return markBindOutcome(sandbox, \"resumed\");\n }\n return markBindOutcome(sandbox, \"attached\");\n } catch (err) {\n if (!(err instanceof SandboxNotFoundError)) throw err;\n try {\n const created = await Sandbox.create({ ...createOptions, name });\n return markBindOutcome(created, \"created\");\n } catch (createErr) {\n if (\n createErr instanceof RemoteAPIError &&\n createErr.statusCode === 409\n ) {\n // Lost the create race: another caller claimed the name first.\n // Loop back and attach to the winner.\n lastConflict = createErr;\n continue;\n }\n throw createErr;\n }\n }\n }\n const giveUp = new SandboxError(\n `getOrCreate('${name}'): the name is claimed, but its sandbox could ` +\n `not be attached to after ${GET_OR_CREATE_ATTEMPTS} attempts`,\n );\n giveUp.cause = lastConflict;\n throw giveUp;\n }\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, and\n * egress network policy).\n *\n * Naming an ephemeral sandbox makes it non-ephemeral and enables\n * suspend/resume. For `network`, omit to keep the current policy, pass an\n * object to replace it, or pass `null` to clear it to unrestricted egress.\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 await this.refreshRoutingWhenRunning(deadline, pollInterval, timeout);\n }\n\n /**\n * Poll until the sandbox leaves `Suspending`.\n *\n * The lifecycle API rejects resume while a suspend is still in progress,\n * so `getOrCreate` must wait for the suspend to settle before it can\n * resume the sandbox.\n */\n private async waitOutSuspending(\n waitTimeout: number,\n name: string,\n ): Promise<SandboxStatus> {\n const deadline = Date.now() + waitTimeout * 1000;\n while (Date.now() < deadline) {\n await sleep(500);\n const status = await this.status();\n if (status !== SandboxStatus.SUSPENDING) return status;\n }\n throw new SandboxError(\n `getOrCreate('${name}'): the sandbox holding the name did not finish ` +\n `suspending within ${waitTimeout}s`,\n );\n }\n\n /**\n * Poll until the sandbox is `Running` with routing info, then rebind this\n * handle's cached proxy routing. Shared by `resume()` and the\n * `getOrCreate` path that attaches to a still-starting sandbox.\n */\n private async refreshRoutingWhenRunning(\n deadline: number,\n pollInterval: number,\n timeout: number,\n ): Promise<void> {\n const client = this.requireLifecycleClient(\"refresh proxy routing\");\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 await 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`. `options.snapshotId` pins the mount to a specific\n * filesystem snapshot and requires `options.readOnly: true`.\n */\n async attachFileSystem(\n fileSystemId: string,\n mountPath: string,\n options?: AttachFileSystemOptions,\n ): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"attachFileSystem\");\n const info = await client.attachFileSystem(\n this.lifecycleIdentifier,\n fileSystemId,\n mountPath,\n options,\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 await 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, formatErrorDetails } from \"./errors.js\";\nimport type { Traced } from \"./traced.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeErrorContext,\n type NativeSandboxClient,\n} from \"./native-sandbox.js\";\nimport {\n type ArchivedSandboxInfo,\n type AttachFileSystemOptions,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type ClaimSandboxOptions,\n type CreateAndConnectOptions,\n type CreatePoolOptions,\n type CreateSandboxOptions,\n type CreateSandboxPoolResponse,\n type CreateSandboxResponse,\n type CreateSnapshotResponse,\n type FileSystemMount,\n type GetSandboxLogsOptions,\n type GpuRequest,\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 toSnakeKeys,\n} from \"./models.js\";\nimport { Sandbox } from \"./sandbox.js\";\nimport { nowMs, logSdkTimingEvent, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride } from \"./url.js\";\n\nconst GPU_MODELS = new Set<string>([\n \"A100-40GB\",\n \"A100-80GB\",\n \"H100\",\n \"T4\",\n \"A6000\",\n \"RTX-PRO-6000\",\n \"L40\",\n \"A10\",\n]);\n\n/**\n * Client-side mirror of the server's HTTP 400 for invalid snapshot pins: a\n * mount that pins `snapshotId` must also be `readOnly`, so callers fail fast\n * (and offline) instead of round-tripping to the server.\n */\nfunction requireReadOnlySnapshotPin(\n fileSystemId: string,\n mountPath: string,\n readOnly: boolean | undefined,\n snapshotId: string | undefined,\n): void {\n if (snapshotId != null && readOnly !== true) {\n throw new SandboxError(\n `file system mount '${fileSystemId}' at '${mountPath}' sets snapshotId ` +\n \"without readOnly: snapshot-pinned mounts are read-only\",\n );\n }\n}\n\n/**\n * Map a `FileSystemMount` to its wire form. `read_only` and `prefetch` are\n * included only when `true`, and `snapshot_id` only when set: older servers\n * deserialize mount bodies with `deny_unknown_fields` and would reject an\n * explicit `false` (or an unknown pin field).\n */\nfunction fileSystemMountToWire(fs: FileSystemMount): Record<string, unknown> {\n requireReadOnlySnapshotPin(fs.fileSystemId, fs.mountPath, fs.readOnly, fs.snapshotId);\n return {\n file_system_id: fs.fileSystemId,\n mount_path: fs.mountPath,\n ...(fs.readOnly === true ? { read_only: true } : {}),\n ...(fs.prefetch === true ? { prefetch: true } : {}),\n ...(fs.snapshotId != null ? { snapshot_id: fs.snapshotId } : {}),\n ...(fs.owner != null ? { owner: fs.owner } : {}),\n };\n}\n\nfunction gpuRequest(\n gpu: GpuRequest | undefined,\n gpus: number | undefined,\n gpuModel: string | undefined,\n): Array<{ count: number; model: string }> | undefined {\n if (gpu != null) {\n if (gpus != null || gpuModel != null) {\n throw new SandboxError(\"gpu cannot be combined with gpus or gpuModel\");\n }\n gpus = gpu.count;\n gpuModel = gpu.model;\n }\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 (!GPU_MODELS.has(gpuModel)) {\n throw new SandboxError(`unsupported GPU model: ${gpuModel}`);\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 /**\n * Create an API-key client for TensorLake Cloud. Ingress selects the authorized\n * organization/project; explicit scope options are forwarded only as compatibility headers.\n */\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 releaseNativeHandle(this.native);\n }\n\n private withRequestTimeout(\n requestTimeout: number | undefined,\n ): 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 {\n apiUrl: this.apiUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n namespace: this.namespace,\n timeoutMs,\n },\n /* _internal */ true,\n );\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(\n options?: CreateSandboxOptions,\n ): Promise<Traced<CreateSandboxResponse>> {\n const gpuResources = gpuRequest(\n options?.gpu,\n options?.gpus,\n options?.gpuModel,\n );\n const restoringSnapshot = options?.snapshotId != null;\n const resources: Record<string, unknown> = {\n ...(!restoringSnapshot || options?.cpus != null\n ? { cpus: options?.cpus ?? 1.0 }\n : {}),\n ...(!restoringSnapshot || options?.memoryMb != null\n ? { memory_mb: options?.memoryMb ?? 1024 }\n : {}),\n ...(options?.diskMb != null ? { disk_mb: options.diskMb } : {}),\n ...(gpuResources != null ? { gpus: gpuResources } : {}),\n };\n const body: Record<string, unknown> = {};\n if (Object.keys(resources).length > 0) body.resources = resources;\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 (options?.fileSystems != null && options.fileSystems.length > 0) {\n body.file_systems = options.fileSystems.map(fileSystemMountToWire);\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(() =>\n this.native.listSandboxes(),\n );\n const parsed = JSON.parse(json) as {\n sandboxes?: Record<string, unknown>[];\n };\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(\n sandboxId: string,\n options: UpdateSandboxOptions,\n ): 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 // Tri-state network policy: omit to keep the current policy, `null` to\n // clear it to unrestricted egress, an object to replace it.\n if (options.network !== undefined) {\n body.network =\n options.network === null ? null : toSnakeKeys(options.network);\n }\n if (Object.keys(body).length === 0) {\n throw new SandboxError(\n \"At least one sandbox update field must be provided.\",\n );\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(\n (port) => !toRemove.has(port),\n );\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), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n sandboxId: string,\n options?: SuspendResumeOptions,\n ): Promise<void> {\n await callNative(() => this.native.suspendSandbox(sandboxId), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n `Sandbox ${sandboxId} terminated while waiting for suspend`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} did not suspend within ${timeout}s`,\n );\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(\n sandboxId: string,\n options?: SuspendResumeOptions,\n ): Promise<void> {\n await callNative(() => this.native.resumeSandbox(sandboxId), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n `Sandbox ${sandboxId} terminated while waiting for resume`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} did not resume within ${timeout}s`,\n );\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 * `options.snapshotId` pins the mount to a specific filesystem snapshot\n * and requires `options.readOnly: true`.\n */\n async attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n options?: AttachFileSystemOptions,\n ): Promise<Traced<SandboxInfo>> {\n requireReadOnlySnapshotPin(\n fileSystemId,\n mountPath,\n options?.readOnly,\n options?.snapshotId,\n );\n return this.tracedJson<SandboxInfo>(\n () =>\n this.native.attachFileSystem(\n sandboxId,\n fileSystemId,\n mountPath,\n options?.readOnly === true,\n options?.prefetch === true,\n options?.snapshotId ?? null,\n options?.owner ?? null,\n ),\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 /**\n * Claim a warm sandbox from a pool, creating one if no warm containers are\n * available. Claim-specific file systems are ready before the sandbox is\n * reported as running.\n */\n async claim(\n poolId: string,\n options?: ClaimSandboxOptions,\n ): Promise<Traced<CreateSandboxResponse>> {\n const requestJson =\n options?.fileSystems != null && options.fileSystems.length > 0\n ? JSON.stringify({\n file_systems: options.fileSystems.map(fileSystemMountToWire),\n })\n : undefined;\n return this.tracedJson<CreateSandboxResponse>(\n () =>\n requestJson == null\n ? this.native.claimSandbox(poolId)\n : this.native.claimSandbox(poolId, requestJson),\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 () =>\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(() =>\n this.native.listSnapshots(),\n );\n const parsed = JSON.parse(json) as {\n snapshots?: Record<string, unknown>[];\n };\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))\n 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(\n options: CreatePoolOptions,\n ): 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 ...(options.diskMb != null ? { disk_mb: options.diskMb } : {}),\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null)\n body.max_containers = options.maxContainers;\n if (options.warmContainers != null)\n body.warm_containers = options.warmContainers;\n if (options.network != null) body.network = toSnakeKeys(options.network);\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 /**\n * Replace a pool configuration. Omit `network` to keep the pool's current\n * network policy, set it to replace the policy, or pass `null` to remove the\n * policy entirely. On a change the service recycles the pool's unclaimed\n * warm containers onto the new policy, while containers already claimed by\n * sandboxes keep the policy they booted with. CPU, memory, disk, image, and\n * entrypoint changes likewise recycle unclaimed warm containers\n * asynchronously. If suitable capacity is unavailable, stale warm\n * containers are not used as a fallback.\n */\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 ...(options.diskMb != null ? { disk_mb: options.diskMb } : {}),\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null)\n body.max_containers = options.maxContainers;\n if (options.warmContainers != null)\n body.warm_containers = options.warmContainers;\n // Tri-state: omit to keep the current policy, `null` to clear it, an\n // object to replace it.\n if (options.network !== undefined) {\n body.network =\n options.network === null ? null : toSnakeKeys(options.network);\n }\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), {\n poolId,\n notFoundKind: \"pool\",\n });\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) =>\n 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(options?: CreateAndConnectOptions): 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 =\n options?.poolId != null\n ? await requestClient.claim(options.poolId, {\n fileSystems: options.fileSystems,\n })\n : await requestClient.create(options);\n logSdkTiming(\n \"sandbox.create\",\n options?.poolId != null ? \"claim_response\" : \"create_response\",\n createStart,\n {\n sandbox_id: result.sandboxId,\n status: result.status,\n server_trace_id: result.traceId,\n },\n );\n const requestedName =\n options?.poolId != null ? null : (options?.name ?? null);\n\n const finishConnect = async (\n sandboxId: string,\n routingHint: string | undefined,\n name: string | null | undefined,\n ingressEndpoint: string | undefined,\n sandboxUrl: string | undefined,\n ) => {\n const explicitProxyUrl =\n options?.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = await 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 result.status === SandboxStatus.FAILED\n ) {\n throw new SandboxError(\n formatStartupFailureMessage(result.sandboxId, result.status, {\n errorDetails: result.errorDetails,\n terminationReason: result.terminationReason ?? result.reason,\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(options?: {\n requestTimeout?: number;\n 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(\n \"requestTimeout must be a positive number of seconds\",\n );\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(\n \"timeoutMs must be a positive number of milliseconds\",\n );\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 (\n status === SnapshotStatus.LOCAL_READY ||\n status === SnapshotStatus.COMPLETED\n );\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 let prefix =\n status === SandboxStatus.TERMINATED\n ? `Sandbox ${sandboxId} terminated during startup`\n : `Sandbox ${sandboxId} became ${status} during startup`;\n if (options.terminationReason) {\n prefix += ` (${options.terminationReason})`;\n }\n const detail = formatErrorDetails(options.errorDetails);\n if (detail) {\n return `${prefix}: ${detail}`;\n }\n return prefix;\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 { callNative, loadNativeSandboxBinding, nativeEventStream, type NativeEmit } from \"./native-sandbox.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport type { Traced } from \"./traced.js\";\n\nexport interface NativeCloudPart {\n name: string;\n data: Buffer;\n filename?: string;\n contentType?: string;\n}\n\nexport interface NativeCloudRequest {\n method: string;\n path: string;\n headersJson: string;\n body?: Buffer;\n parts?: NativeCloudPart[];\n statusOnlyCodes: number[];\n}\n\nexport interface NativeCloudResponse {\n status: number;\n headersJson: string;\n data: Uint8Array;\n traceId: string;\n}\n\nexport interface NativeCloudClient {\n request(request: NativeCloudRequest): Promise<NativeCloudResponse>;\n stream(request: NativeCloudRequest, emit: NativeEmit): Promise<string>;\n}\n\ninterface CloudTransportOptions {\n baseUrl: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n userAgent: string;\n maxRetries: number;\n retryBackoffMs: number;\n timeoutMs: number;\n}\n\ninterface RequestOptions {\n body?: string | Blob | ArrayBuffer | Uint8Array | FormData;\n json?: unknown;\n headers?: Record<string, string>;\n /** Return these statuses without consuming their unused diagnostic bodies. */\n statusOnlyCodes?: Set<number>;\n}\n\n/** Only marshals values across the worker boundary; Rust owns all HTTP I/O. */\nexport class NativeCloudTransport {\n private native?: NativeCloudClient;\n private closed = false;\n\n constructor(private readonly options: CloudTransportOptions) {\n if (!Number.isSafeInteger(options.maxRetries) || options.maxRetries < 0 || options.maxRetries > 0xffff_ffff) {\n throw new RangeError(\"maxRetries must be a non-negative 32-bit integer\");\n }\n if (!Number.isFinite(options.retryBackoffMs) || options.retryBackoffMs < 0) {\n throw new RangeError(\"retryBackoffMs must be a non-negative finite number\");\n }\n }\n\n private client(): NativeCloudClient {\n if (this.closed) throw new Error(\"Tensorlake native client is closed\");\n if (this.native) return this.native;\n const ctor = loadNativeSandboxBinding().NativeCloudClient;\n if (!ctor) throw new Error(\"Native binding does not export NativeCloudClient; rebuild with 'npm run build:native'\");\n return this.native = new ctor(JSON.stringify(this.options));\n }\n\n close(): void {\n this.closed = true;\n releaseNativeHandle(this.native ?? null);\n this.native = undefined;\n }\n\n async requestResponse(method: string, path: string, options?: RequestOptions): Promise<Traced<Response>> {\n const request = await serializeRequest(method, path, options);\n const raw = await callNative(() => this.client().request(request));\n const response = new Response(\n [204, 205, 304].includes(raw.status) ? null : Uint8Array.from(raw.data).buffer,\n { status: raw.status, headers: JSON.parse(raw.headersJson) as Record<string, string> },\n );\n return Object.assign(response, { traceId: raw.traceId });\n }\n\n async requestJson<T>(method: string, path: string): Promise<Traced<T>> {\n const response = await this.requestResponse(method, path);\n const text = await response.text();\n const value = text ? JSON.parse(text) : null;\n return Object.assign(value ?? {}, { traceId: response.traceId }) as Traced<T>;\n }\n\n async *stream(method: string, path: string, signal?: AbortSignal): AsyncGenerator<Record<string, unknown>> {\n if (signal?.aborted) return;\n const request = await serializeRequest(method, path, { headers: { Accept: \"text/event-stream\" } });\n yield* nativeEventStream((emit) => this.client().stream(request, emit), undefined, signal);\n }\n}\n\nasync function serializeRequest(method: string, path: string, options?: RequestOptions): Promise<NativeCloudRequest> {\n const headers = { ...options?.headers };\n let body = options?.body;\n if (options?.json !== undefined) {\n body = JSON.stringify(options.json);\n if (!Object.keys(headers).some((key) => key.toLowerCase() === \"content-type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n const request: NativeCloudRequest = {\n method,\n path,\n headersJson: JSON.stringify(headers),\n statusOnlyCodes: [...(options?.statusOnlyCodes ?? [])],\n };\n if (body instanceof FormData) {\n request.parts = [];\n for (const [name, value] of body.entries()) {\n request.parts.push(typeof value === \"string\"\n ? { name, data: Buffer.from(value) }\n : { name, data: Buffer.from(await value.arrayBuffer()), filename: value.name, contentType: value.type || \"application/octet-stream\" });\n }\n } else if (body !== undefined) {\n if (body instanceof Blob) request.body = Buffer.from(await body.arrayBuffer());\n else if (typeof body === \"string\") request.body = Buffer.from(body);\n else if (body instanceof ArrayBuffer) request.body = Buffer.from(new Uint8Array(body));\n else request.body = Buffer.from(body);\n }\n return request;\n}\n","import { nanoid } from \"nanoid\";\n\nimport * as defaults from \"./defaults.js\";\nimport { NativeCloudTransport } from \"./native-cloud.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport type {\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 StartImageBuildRequest,\n UpsertSecretResponse,\n} from \"./cloud-models.js\";\n\nexport class CloudClient {\n private readonly transport: NativeCloudTransport;\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.transport = new NativeCloudTransport({\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 timeoutMs: defaults.DEFAULT_HTTP_TIMEOUT_MS,\n userAgent: `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n });\n }\n\n static forCloud(options?: CloudClientOptions): CloudClient {\n return new CloudClient(options);\n }\n\n close(): void {\n this.transport.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: BinaryPayload,\n upgradeRunningRequests = false,\n ): Promise<void> {\n const applicationManifest = { ...manifest };\n let publicEndpointId = publicEndpointIdFromManifest(applicationManifest);\n if (\n applicationAllowsUnauthenticatedRequests(applicationManifest) &&\n publicEndpointId === undefined\n ) {\n const applicationName = applicationManifest.name;\n if (typeof applicationName === \"string\" && applicationName.length > 0) {\n publicEndpointId =\n await this.existingApplicationPublicEndpointId(applicationName);\n }\n publicEndpointId ??= generatePublicEndpointId();\n }\n if (publicEndpointId !== undefined) {\n applicationManifest.public_endpoint_id = publicEndpointId;\n delete applicationManifest.publicEndpointId;\n }\n\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(applicationManifest));\n form.append(\n \"upgrade_requests_to_latest_code\",\n String(upgradeRunningRequests),\n );\n\n await this.transport.requestResponse(\"POST\", this.namespacePath(\"applications\"), {\n body: form,\n });\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.transport.requestResponse(\n \"DELETE\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.transport.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 * API-key clients may omit organization/project IDs and use the\n * token-scoped Platform API route directly. Explicit scope remains\n * available for PAT callers.\n */\n async findSandboxImageByName(\n imageName: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate | null> {\n const base = this.platformProjectPath(\n \"sandbox-templates\",\n options?.organizationId,\n options?.projectId,\n );\n const response = await this.transport.requestResponse(\n \"GET\",\n `${base}/by-name/${encodeURIComponent(imageName)}`,\n { statusOnlyCodes: 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. API-key clients may omit organization/project IDs and use the\n * token-scoped Platform API route directly.\n */\n async listSandboxImages(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate[]> {\n const base = this.platformProjectPath(\n \"sandbox-templates\",\n options?.organizationId,\n options?.projectId,\n );\n let path: string | null = `${base}?pageSize=100`;\n const templates: SandboxTemplate[] = [];\n while (path !== null) {\n const page: SandboxTemplatesPage = await this.transport.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 async applications(): Promise<ApplicationSummary[]> {\n const raw = await this.transport.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.transport.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.transport.requestResponse(\"POST\", path, {\n body: new Uint8Array(),\n headers: { Accept: \"application/json\" },\n })\n : inputs.length === 1 && inputs[0].name === \"0\"\n ? await this.transport.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 = this.transport.stream(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/progress`,\n ),\n );\n\n for await (const event of 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.transport.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.transport.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 listSecrets(options?: {\n organizationId?: string;\n projectId?: string;\n pageSize?: number;\n }): Promise<SecretsList> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n const raw = await this.transport.requestJson<SecretMetadata[]>(\"GET\", base);\n const pageSize = Math.max(0, options?.pageSize ?? 100);\n return Object.assign(\n {\n items: raw.slice(0, pageSize).map(secretFromMetadata),\n pagination: { total: raw.length },\n },\n { traceId: raw.traceId },\n );\n }\n\n async getSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<Secret> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n const raw = await this.transport.requestJson<SecretMetadata>(\n \"GET\",\n `${base}/${encodeURIComponent(secretId)}`,\n );\n return Object.assign(secretFromMetadata(raw), { traceId: raw.traceId });\n }\n\n async upsertSecrets(\n secrets: NewSecret | NewSecret[],\n options?: { organizationId?: string; projectId?: string },\n ): Promise<UpsertSecretResponse> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n if (Array.isArray(secrets)) {\n const results: Secret[] = [];\n for (const secret of secrets) {\n results.push(await this.upsertSecret(base, secret));\n }\n return results;\n }\n return this.upsertSecret(base, secrets);\n }\n\n async deleteSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n await this.transport.requestResponse(\n \"DELETE\",\n `${base}/${encodeURIComponent(secretId)}`,\n );\n }\n\n private async upsertSecret(base: string, secret: NewSecret): Promise<Secret> {\n let response = await this.transport.requestResponse(\"POST\", base, {\n json: secret,\n headers: { \"Idempotency-Key\": nanoid() },\n statusOnlyCodes: new Set([409]),\n });\n if (response.status === 409) {\n const prefix = base.slice(0, -\"/secrets\".length);\n const existing = await this.transport.requestJson<{ id: string }>(\n \"GET\",\n `${prefix}/secret-names/${encodeURIComponent(secret.name)}`,\n );\n response = await this.transport.requestResponse(\n \"POST\",\n `${base}/${encodeURIComponent(existing.id)}/versions`,\n {\n json: { value: secret.value },\n headers: { \"Idempotency-Key\": nanoid() },\n },\n );\n }\n const metadata = await parseJsonResponse<SecretMetadata>(response);\n return Object.assign(secretFromMetadata(metadata), {\n traceId: response.traceId,\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.transport.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.transport.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.transport.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.transport.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.transport.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.transport.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 = this.transport.stream(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/logs`,\n signal,\n );\n for await (const event of stream) {\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.transport.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 async existingApplicationPublicEndpointId(\n applicationName: string,\n ): Promise<string | undefined> {\n const response = await this.transport.requestResponse(\n \"GET\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n { statusOnlyCodes: new Set([404]) },\n );\n if (response.status === 404) {\n return undefined;\n }\n\n const application =\n await parseJsonResponse<Record<string, unknown>>(response);\n return publicEndpointIdFromManifest(application);\n }\n\n private platformProjectPath(\n resource: \"sandbox-templates\",\n organizationId?: string,\n projectId?: string,\n ): string {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId && !resolvedProjectId) {\n return `/platform/v1/${resource}`;\n }\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\n \"organizationId and projectId must be provided together\",\n );\n }\n return `/platform/v1/organizations/${encodeURIComponent(resolvedOrganizationId)}/projects/${encodeURIComponent(resolvedProjectId)}/${resource}`;\n }\n\n private secretCollectionPath(\n organizationId?: string,\n projectId?: string,\n ): string {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId && !resolvedProjectId) {\n return this.namespacePath(\"secrets\");\n }\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\"organizationId and projectId must be provided together\");\n }\n return this.namespacePath(\"secrets\");\n }\n}\n\ntype SecretMetadata = {\n id: string;\n name: string;\n created_at_ms: number;\n};\n\nfunction secretFromMetadata(metadata: SecretMetadata): Secret {\n return {\n id: metadata.id,\n name: metadata.name,\n createdAt: new Date(metadata.created_at_ms),\n };\n}\n\nconst UNAUTHENTICATED_REQUESTS = \"unauthenticated_requests\";\n\nfunction applicationAllowsUnauthenticatedRequests(\n manifest: ApplicationManifest,\n): boolean {\n return (\n Array.isArray(manifest.allow) &&\n manifest.allow.includes(UNAUTHENTICATED_REQUESTS)\n );\n}\n\nfunction publicEndpointIdFromManifest(\n manifest: ApplicationManifest,\n): string | undefined {\n for (const key of [\"public_endpoint_id\", \"publicEndpointId\"]) {\n const value = manifest[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction generatePublicEndpointId(): string {\n return `endpoint_${nanoid()}`;\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/**\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","// Read the ELF interpreter, rather than generating a process-wide diagnostic\n// report. Both supported Linux architectures use little-endian ELF64. Reads\n// are bounded to the header, program headers, and interpreter pathname.\nfunction detectLinuxLibc(fs, executable = process.execPath) {\n const override = process.env.TENSORLAKE_NODE_LIBC;\n if (override != null) {\n if (override === \"gnu\" || override === \"musl\") return override;\n throw new Error(\"TENSORLAKE_NODE_LIBC must be 'gnu' or 'musl'.\");\n }\n\n let fd;\n try {\n fd = fs.openSync(executable, \"r\");\n function read(size, offset) {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new Error(\"Invalid ELF offset\");\n }\n const buffer = Buffer.alloc(size);\n let count = 0;\n while (count < size) {\n const bytes = fs.readSync(fd, buffer, count, size - count, offset + count);\n if (bytes === 0) throw new Error(\"Truncated ELF executable\");\n count += bytes;\n }\n return buffer;\n }\n\n const header = read(64, 0);\n if (header.readUInt32BE(0) !== 0x7f454c46 || header[4] !== 2 || header[5] !== 1) {\n throw new Error(\"Expected a little-endian ELF64 executable\");\n }\n const entrySize = header.readUInt16LE(54);\n const count = header.readUInt16LE(56);\n if (entrySize !== 56 || count === 0 || count > 128) {\n throw new Error(\"Unsupported ELF program headers\");\n }\n const entries = read(entrySize * count, Number(header.readBigUInt64LE(32)));\n for (let i = 0; i < count; i++) {\n const offset = i * entrySize;\n if (entries.readUInt32LE(offset) !== 3) continue; // PT_INTERP\n const size = Number(entries.readBigUInt64LE(offset + 32));\n if (size < 2 || size > 4096) throw new Error(\"Invalid ELF interpreter size\");\n const interpreter = read(size, Number(entries.readBigUInt64LE(offset + 8)));\n if (interpreter[size - 1] !== 0) throw new Error(\"Unterminated ELF interpreter\");\n const name = interpreter.subarray(0, -1).toString(\"utf8\").split(\"/\").at(-1);\n if (name.startsWith(\"ld-musl-\")) return \"musl\";\n if (name.startsWith(\"ld-linux-\")) return \"gnu\";\n throw new Error(\"Unrecognized ELF interpreter\");\n }\n throw new Error(\"No ELF interpreter (statically linked executable)\");\n } catch (cause) {\n throw new Error(\n \"Unable to detect Linux libc from the Node executable. Set TENSORLAKE_NODE_LIBC to 'gnu' or 'musl' for a nonstandard runtime.\",\n { cause },\n );\n } finally {\n if (fd != null) fs.closeSync(fd);\n }\n}\n\nmodule.exports = { detectLinuxLibc };\n","import { detectLinuxLibc } from \"../lib/libc.cjs\";\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface RuntimeReport {\n header?: {\n glibcVersionRuntime?: string;\n };\n}\n\ninterface TargetOptions {\n libc?: \"gnu\" | \"musl\";\n report?: RuntimeReport;\n}\n\ninterface NativeBindingPathOptions extends TargetOptions {\n packageRoot?: string;\n platform?: NodeJS.Platform;\n arch?: string;\n}\n\nconst NATIVE_PACKAGES: Readonly<Record<string, string>> = {\n \"darwin-arm64\": \"tensorlake-native-darwin-arm64\",\n \"linux-arm64\": \"tensorlake-native-linux-arm64-gnu\",\n \"linux-arm64-musl\": \"tensorlake-native-linux-arm64-musl\",\n \"linux-x64\": \"tensorlake-native-linux-x64-gnu\",\n \"linux-x64-musl\": \"tensorlake-native-linux-x64-musl\",\n \"win32-x64\": \"tensorlake-native-win32-x64\",\n};\n\nfunction packageRoot(): string {\n const parent = fileURLToPath(new URL(\"../\", import.meta.url));\n if (fs.existsSync(path.join(parent, \"package.json\"))) return parent;\n const grandparent = fileURLToPath(new URL(\"../../\", import.meta.url));\n if (fs.existsSync(path.join(grandparent, \"package.json\"))) return grandparent;\n return parent;\n}\n\nlet cachedLinuxLibc: \"gnu\" | \"musl\" | undefined;\n\nfunction linuxLibcFamily(options: TargetOptions): \"gnu\" | \"musl\" {\n if (options.libc != null) return options.libc;\n if (options.report != null) {\n return options.report.header?.glibcVersionRuntime ? \"gnu\" : \"musl\";\n }\n if (cachedLinuxLibc != null) return cachedLinuxLibc;\n\n cachedLinuxLibc = detectLinuxLibc(fs);\n return cachedLinuxLibc;\n}\n\nexport function nativeTargetId(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch,\n options: TargetOptions = {},\n): string {\n const target = `${platform}-${arch}`;\n if (platform !== \"linux\") return target;\n if (options.libc == null && options.report == null && platform !== process.platform) {\n return target;\n }\n return linuxLibcFamily(options) === \"musl\" ? `${target}-musl` : target;\n}\n\nexport function nativeBindingPath(options: NativeBindingPathOptions = {}): string {\n const platform = options.platform ?? process.platform;\n const arch = options.arch ?? process.arch;\n return path.join(\n options.packageRoot ?? packageRoot(),\n \"dist\",\n \"native\",\n nativeTargetId(platform, arch, options),\n \"tensorlake-node.node\",\n );\n}\n\nexport function nativePackageName(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch,\n options: TargetOptions = {},\n): string | undefined {\n return NATIVE_PACKAGES[nativeTargetId(platform, arch, options)];\n}\n\nexport function loadNative<T>(): T {\n const target = nativeTargetId();\n const bindingPath = nativeBindingPath();\n const require = createRequire(import.meta.url);\n\n // Local source builds stage the addon here. Published packages intentionally\n // omit this directory and resolve the platform-specific optional dependency.\n if (fs.existsSync(bindingPath)) return require(bindingPath) as T;\n\n const packageName = nativePackageName();\n if (!packageName) {\n throw new Error(\n `Tensorlake does not provide a native binding for ${target}.`,\n );\n }\n\n let packageEntry: string;\n try {\n packageEntry = require.resolve(packageName);\n } catch (cause) {\n throw new Error(\n `Missing native binding package ${packageName} for ${target}. Reinstall tensorlake without omitting optional dependencies, and install dependencies on the machine where they will run.`,\n { cause },\n );\n }\n return require(packageEntry) as T;\n}\n","import 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\";\nimport { loadNative } from \"./native-binding.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 the platform-specific native binding,\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 /** @internal Standalone CLI entry points allow PAT auth; SDK callers do not. */\n _allowPat?: boolean;\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\nlet cachedNativeBinding: NativeBinding | undefined;\nlet cachedNativeBindingError: Error | undefined;\n\nfunction loadNativeBinding(): NativeBinding {\n if (cachedNativeBinding) return cachedNativeBinding;\n if (cachedNativeBindingError) throw cachedNativeBindingError;\n try {\n cachedNativeBinding = loadNative<NativeBinding>();\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 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 usePat = deps._allowPat === true && context.apiKey == null;\n const bearerToken = context.apiKey ?? (usePat ? context.personalAccessToken : undefined);\n if (!bearerToken) {\n if (context.personalAccessToken && !deps._allowPat) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\n deps._allowPat\n ? \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\"\n : \"Missing TENSORLAKE_API_KEY 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: usePat ? context.organizationId : undefined,\n projectId: usePat ? context.projectId : undefined,\n namespace: context.namespace,\n useScopeHeaders: usePat,\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 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 usePat = deps._allowPat === true && context.apiKey == null;\n const bearerToken = context.apiKey ?? (usePat ? context.personalAccessToken : undefined);\n if (!bearerToken) {\n if (context.personalAccessToken && !deps._allowPat) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\n deps._allowPat\n ? \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\"\n : \"Missing TENSORLAKE_API_KEY credentials.\",\n );\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: usePat ? context.organizationId : undefined,\n projectId: usePat ? context.projectId : undefined,\n namespace: context.namespace,\n useScopeHeaders: usePat,\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;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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`. Ingress derives project scope from the API key.\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;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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`. Ingress derives project scope from the API key.\n */\nexport async function listSandboxImages(): Promise<SandboxTemplate[]> {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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, _allowPat: true },\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, _allowPat: true },\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 { RepositoryMount } from \"./repository-mount.js\";\nexport type {\n RepositoryMountOptions,\n RepositoryMountStatus,\n RepositoryUnmountOptions,\n} from \"./repository-mount.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 ReadOnlyMountNotSupportedError,\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\";\nexport {\n registerApplication,\n registerFunction,\n retries,\n schema,\n File,\n HttpBody,\n Headers,\n RequestContext,\n Future,\n runLocal,\n runRemote,\n remoteOptions,\n} from \"./applications/index.js\";\nexport type {\n ApplicationCapability,\n ApplicationOptions,\n FunctionOptions,\n SimpleApplicationOptions,\n SimpleFunctionOptions,\n RegisteredFunction,\n Schema,\n Parameter,\n HeadersInit,\n RemoteOptions,\n TailCall,\n} from \"./applications/index.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 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 AttachFileSystemOptions,\n ClaimSandboxOptions,\n CopySandboxOptions,\n CopiedSandboxResponse,\n CopySandboxResponse,\n CreateSandboxOptions,\n GpuModel,\n GpuRequest,\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 GetOrCreateOptions,\n GetOrCreateOutcome,\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 { FilesystemClient } from \"./filesystem.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 private readonly filesystemOptions: {\n apiKey?: string;\n apiUrl?: string;\n organizationId?: string;\n projectId?: string;\n };\n\n constructor(options?: CloudClientOptions) {\n this.cloudClient = new CloudClient(options);\n this.filesystemOptions = {\n apiKey: options?.apiKey,\n apiUrl: options?.apiUrl,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n };\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 const filesystem = await new FilesystemClient(this.filesystemOptions).create(name);\n return {\n id: filesystem.name,\n name: filesystem.name,\n description,\n status: \"ready\",\n };\n }\n\n async listFileSystems(_options?: {\n organizationId?: string;\n projectId?: string;\n }): Promise<FileSystem[]> {\n const filesystems = await new FilesystemClient(this.filesystemOptions).list();\n return filesystems.map((filesystem) => ({\n id: filesystem.name,\n name: filesystem.name,\n status: filesystem.status,\n }));\n }\n\n async deleteFileSystem(\n fileSystemId: string,\n _options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n await new FilesystemClient(this.filesystemOptions).delete(fileSystemId);\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","/**\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 { randomBytes } from \"node:crypto\";\nimport { MountCli } from \"./mount-cli.js\";\nimport * as defaults from \"./defaults.js\";\nimport {\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n FilesystemError,\n FilesystemNotFoundError,\n MountError,\n ReadOnlyMountNotSupportedError,\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 FILESYSTEM_REPO_KIND = \"filesystem\";\n\nexport interface FilesystemClientOptions {\n apiKey?: string;\n apiUrl?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\n organizationId?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\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 extends MountCli {\n constructor(envOverrides: Record<string, string>) {\n super(\"fs\", envOverrides);\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 if (readonly) {\n // `tl fs mount` has no --ro flag; shelling it out anyway would surface\n // an opaque CLI parse error. Fail honestly instead.\n throw new ReadOnlyMountNotSupportedError();\n }\n await this.run([\"mount\", \"--\", filesystem, localPath]);\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 * The SDK authenticates with `apiKey` or `TENSORLAKE_API_KEY`. Project scope is selected by\n * ingress from the API key; no organization/project lookup is performed. Organization/project\n * options are retained only for the separately installed `tl` CLI used by local mounts.\n */\n constructor(options: FilesystemClientOptions = {}) {\n const context = buildContextFromEnv();\n const token = options.apiKey ?? context.apiKey;\n if (!token) {\n if (context.personalAccessToken) {\n throw new FilesystemError(\n \"Filesystem SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new FilesystemError(\n \"Missing TENSORLAKE_API_KEY credentials.\",\n );\n }\n const organizationId = options.organizationId ?? context.organizationId;\n const projectId = options.projectId ?? context.projectId;\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 null,\n null,\n `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n null,\n );\n }\n const envOverrides: Record<string, string> = {\n TENSORLAKE_API_KEY: token,\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 (organizationId) envOverrides.TENSORLAKE_ORGANIZATION_ID = organizationId;\n if (projectId) envOverrides.TENSORLAKE_PROJECT_ID = projectId;\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 /**\n * Mount a filesystem to a local path (requires the `tl` CLI).\n *\n * `readonly: true` is not supported for local mounts and throws\n * {@link ReadOnlyMountNotSupportedError}; use a sandbox read-only mount\n * (`readOnly: true`) or `tl git mount --ro` instead.\n */\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 /**\n * Mount this filesystem to a local path (requires the `tl` CLI).\n *\n * `readonly: true` is not supported for local mounts and throws\n * {@link ReadOnlyMountNotSupportedError}; use a sandbox read-only mount\n * (`readOnly: true`) or `tl git mount --ro` instead.\n */\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","import { execFile } from \"node:child_process\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { CliNotFoundError, MountError } from \"./filesystem-models.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/** Shared command runner for the separately installed local mount daemon. */\nexport class MountCli {\n private binary: string | null = null;\n\n constructor(\n private readonly command: \"fs\" | \"git\",\n private readonly envOverrides: Record<string, string>,\n ) {}\n\n private async findCli(): Promise<string> {\n const candidates: string[] = [];\n if (process.env.TENSORLAKE_CLI) candidates.push(process.env.TENSORLAKE_CLI);\n candidates.push(\"tl\");\n const installed = join(homedir(), \".tensorlake\", \"bin\", \"tl\");\n try {\n // Probe present-but-broken installs too, so they report an upgrade error.\n accessSync(installed, constants.F_OK);\n candidates.push(installed);\n } catch {\n // Not installed at the default path.\n }\n const support = this.command === \"git\" ? \"git mount\" : \"fs\";\n const probe = this.command === \"git\" ? [\"git\", \"mount\", \"--help\"] : [\"fs\", \"--help\"];\n let unsupported: string | null = null;\n for (const candidate of candidates) {\n try {\n await execFileAsync(candidate, probe, { timeout: 15_000 });\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") unsupported = candidate;\n }\n }\n throw new CliNotFoundError(\n unsupported\n ? `\\`tl\\` at ${unsupported} does not support \\`tl ${support}\\` (upgrade required)`\n : \"`tl` was not found on PATH\",\n support,\n );\n }\n\n protected async run(args: string[], timeoutMs = 300_000): Promise<string> {\n if (this.binary === null) this.binary = await this.findCli();\n try {\n const { stdout } = await execFileAsync(this.binary, [this.command, ...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 ${this.command} ${args[0]}\\` timed out after ${timeoutMs}ms`);\n }\n const detail = (failure.stderr || failure.stdout || String(error)).trim();\n throw new MountError(`\\`tl ${this.command} ${args.join(\" \")}\\` failed: ${detail}`);\n }\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 ||\n raw.file_system ||\n raw.repository ||\n null) as string | 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 ReadOnlyMountNotSupportedError extends MountError {\n constructor() {\n super(\n \"read-only local mounts are not supported: `tl fs mount` has no --ro \" +\n \"mode. Mount the filesystem into a sandbox read-only instead \" +\n \"(readOnly: true / `tl sbx create -f NAME:PATH:ro`), or use \" +\n \"`tl git mount --ro` for repositories.\",\n );\n this.name = \"ReadOnlyMountNotSupportedError\";\n }\n}\n\nexport class CliNotFoundError extends MountError {\n constructor(detail: string, command: \"fs\" | \"git mount\" = \"fs\") {\n super(\n `Mount operations require the Tensorlake CLI (\\`tl\\`) with \\`tl ${command}\\` ` +\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","import * as defaults from \"./defaults.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./traced.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\";\nimport {\n GitCli,\n type RepositoryMount,\n type RepositoryMountOptions,\n type RepositoryMountStatus,\n type RepositoryUnmountOptions,\n} from \"./repository-mount.js\";\n\nexport interface RepositoryClientOptions {\n apiUrl?: string;\n apiKey?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\n organizationId?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\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 private readonly cli: GitCli;\n\n constructor(options?: RepositoryClientOptions) {\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n const apiKey = options?.apiKey ?? defaults.API_KEY;\n if (!apiKey) {\n throw new SandboxError(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\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 apiKey,\n null,\n null,\n null,\n this.requestTimeoutMs / 1000,\n );\n const context = buildContextFromEnv();\n const envOverrides: Record<string, string> = {\n TENSORLAKE_API_KEY: apiKey,\n TENSORLAKE_API_URL: options?.apiUrl ?? defaults.API_URL,\n };\n const organizationId = options?.organizationId ?? context.organizationId;\n const projectId = options?.projectId ?? context.projectId;\n if (organizationId) envOverrides.TENSORLAKE_ORGANIZATION_ID = organizationId;\n if (projectId) envOverrides.TENSORLAKE_PROJECT_ID = projectId;\n this.cli = new GitCli(envOverrides);\n }\n\n static forCloud(options?: RepositoryClientOptions): RepositoryClient {\n return new RepositoryClient({\n ...options,\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\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 organizationId: context.organizationId,\n projectId: context.projectId,\n });\n }\n\n close(): void {\n releaseNativeHandle(this.native);\n }\n\n /**\n * Mount `repo[:branch|tag|full-commit][//subtree]` to a local directory.\n * Requires the separately installed `tl` CLI with mount support. Mounts\n * live on the machine running Node.js and must be explicitly unmounted.\n */\n async mount(\n target: string,\n localPath: string,\n options?: RepositoryMountOptions,\n ): Promise<RepositoryMount> {\n return this.cli.mount(target, localPath, options);\n }\n\n /** Detach a local repository mount, optionally deleting its private workspace. */\n async unmount(localPath: string, options?: RepositoryUnmountOptions): Promise<void> {\n await this.cli.unmount(localPath, options);\n }\n\n /** Inspect a local mount; defaults to the mount containing the current directory. */\n async mountStatus(localPath?: string): Promise<RepositoryMountStatus> {\n return this.cli.status(localPath);\n }\n\n async url(repo: string): Promise<string> {\n return callNative(() => 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","import { resolve } from \"node:path\";\nimport { MountError } from \"./filesystem-models.js\";\nimport { MountCli } from \"./mount-cli.js\";\n\nexport interface RepositoryMountOptions {\n /** Stateless read-only view; cannot be combined with publish or workspace. */\n readOnly?: boolean;\n /** Publish each explicit snapshot onto the mounted branch. */\n publish?: boolean;\n /** Resume a private workspace; cannot be combined with publish or readOnly. */\n workspace?: string;\n}\n\nexport interface RepositoryUnmountOptions {\n /** Delete the private server workspace after detaching. Defaults to false. */\n deleteWorkspace?: boolean;\n /** Drop unpublished local state. Defaults to false. */\n discard?: boolean;\n}\n\n/** Stable fields from `tl git status --json`, with the full payload in raw. */\nexport interface RepositoryMountStatus {\n path: string;\n repository: string | null;\n reference: string | null;\n workspaceId: string | null;\n state: string | null;\n localChanges: boolean | null;\n raw: Record<string, unknown>;\n}\n\nfunction requireNonEmpty(value: string, name: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${name} must be a non-empty string`);\n }\n}\n\n/** @internal CLI implementation; obtain mounts through RepositoryClient. */\nexport class GitCli extends MountCli {\n constructor(envOverrides: Record<string, string>) {\n super(\"git\", envOverrides);\n }\n\n async mount(\n target: string,\n localPath: string,\n options: RepositoryMountOptions = {},\n ): Promise<RepositoryMount> {\n requireNonEmpty(target, \"target\");\n requireNonEmpty(localPath, \"localPath\");\n if (options.workspace !== undefined) requireNonEmpty(options.workspace, \"workspace\");\n if (\n (options.readOnly && (options.publish || options.workspace !== undefined)) ||\n (options.publish && options.workspace !== undefined)\n ) {\n throw new TypeError(\"readOnly, publish, and workspace are mutually exclusive\");\n }\n // Keep the handle attached to this path if the caller later changes CWD.\n const path = resolve(localPath);\n const args = [\"mount\"];\n if (options.readOnly) args.push(\"--ro\");\n if (options.publish) args.push(\"--publish\");\n if (options.workspace !== undefined) args.push(`--workspace=${options.workspace}`);\n // No shell: preserve refs, subtrees, whitespace, and option-like names literally.\n args.push(\"--\", target, path);\n await this.run(args);\n return new RepositoryMount(this, target, path, options.readOnly ?? false);\n }\n\n async unmount(localPath: string, options: RepositoryUnmountOptions = {}): Promise<void> {\n requireNonEmpty(localPath, \"localPath\");\n const args = [\"unmount\"];\n if (options.deleteWorkspace) args.push(\"--delete\");\n if (options.discard) args.push(\"--discard\");\n args.push(\"--\", resolve(localPath));\n await this.run(args);\n }\n\n async status(localPath?: string): Promise<RepositoryMountStatus> {\n const args = [\"status\", \"--json\"];\n if (localPath !== undefined) {\n requireNonEmpty(localPath, \"localPath\");\n args.push(\"--\", resolve(localPath));\n }\n const output = await this.run(args, 60_000);\n let raw: Record<string, unknown>;\n try {\n const payload: unknown = JSON.parse(output);\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n throw new Error(\"expected a JSON object\");\n }\n raw = payload as Record<string, unknown>;\n } catch {\n throw new MountError(`\\`tl git status --json\\` returned invalid JSON: ${output.slice(0, 200)}`);\n }\n const stringField = (key: string): string | null =>\n typeof raw[key] === \"string\" ? raw[key] : null;\n return {\n path: stringField(\"mountpoint\") ?? (localPath === undefined ? \"\" : resolve(localPath)),\n repository: stringField(\"repository\"),\n reference: stringField(\"reference\"),\n workspaceId: stringField(\"workspace\"),\n state: stringField(\"state\"),\n localChanges: typeof raw.local_changes === \"boolean\" ? raw.local_changes : null,\n raw,\n };\n }\n\n async snapshot(path: string, message?: string): Promise<void> {\n const args = [\"snapshot\"];\n if (message !== undefined) args.push(`--message=${message}`);\n args.push(\"--\", path);\n await this.run(args);\n }\n\n async sync(path: string, target?: string): Promise<void> {\n const args = [\"sync\", \"--\", path];\n if (target !== undefined) {\n requireNonEmpty(target, \"target\");\n args.push(target);\n }\n await this.run(args);\n }\n\n async rebase(path: string, target: string, failOnConflict: boolean): Promise<void> {\n requireNonEmpty(target, \"target\");\n const args = [\"rebase\"];\n if (failOnConflict) args.push(\"--fail-on-conflict\");\n args.push(\"--\", path, target);\n await this.run(args);\n }\n\n async promote(path: string, branch: string, merge: boolean): Promise<void> {\n requireNonEmpty(branch, \"branch\");\n const args = [\"promote\"];\n if (merge) args.push(\"--merge\");\n args.push(\"--\", path, branch);\n await this.run(args);\n }\n\n async prefetch(path: string): Promise<void> {\n await this.run([\"prefetch\", \"--\", path]);\n }\n}\n\n/** A repository mounted on the machine running Node.js via the `tl` CLI daemon. */\nexport class RepositoryMount {\n /** @internal Obtain instances via RepositoryClient.mount(). */\n constructor(\n private readonly cli: GitCli,\n /** Initial source (`repo[:ref][//subtree]`); sync/rebase can change the base. */\n readonly target: string,\n readonly path: string,\n readonly readOnly: boolean,\n ) {}\n\n /** Inspect workspace state, pending changes, and daemon diagnostics. */\n async status(): Promise<RepositoryMountStatus> {\n return this.cli.status(this.path);\n }\n\n /** Materialize autosaved edits as a commit; publish mounts also update their branch. */\n async snapshot(message?: string): Promise<void> {\n await this.cli.snapshot(this.path, message);\n }\n\n /** Refresh the current source, or switch an unsnapshotted workspace to a new base. */\n async sync(target?: string): Promise<void> {\n await this.cli.sync(this.path, target);\n }\n\n /** Replay snapshots and pending edits onto another base. Conflicts become diff3 markers by default. */\n async rebase(target: string, options?: { failOnConflict?: boolean }): Promise<void> {\n await this.cli.rebase(this.path, target, options?.failOnConflict ?? false);\n }\n\n /** Publish the workspace to a branch; merge allows landing when the branch moved. */\n async promote(branch: string, options?: { merge?: boolean }): Promise<void> {\n await this.cli.promote(this.path, branch, options?.merge ?? false);\n }\n\n /** Download and verify the mounted working set for network-free reads. */\n async prefetch(): Promise<void> {\n await this.cli.prefetch(this.path);\n }\n\n /** Detach, retaining the private workspace and unpublished state unless explicitly requested. */\n async unmount(options?: RepositoryUnmountOptions): Promise<void> {\n await this.cli.unmount(this.path, options);\n }\n}\n","import type { FileSystem } from \"./cloud-models.js\";\nimport { FilesystemClient } from \"./filesystem.js\";\n\n/**\n * Compatibility helpers for Artifact Storage filesystems.\n *\n * New code should use {@link FilesystemClient} directly. These helpers retain\n * the original create/list/delete API and authenticate with\n * `TENSORLAKE_API_KEY`; ingress selects the project scope.\n *\n * To mount a registered file system into a sandbox, pass\n * `fileSystems` to `Sandbox.create()` (including warm-pool claims) or call\n * `sandbox.attachFileSystem()` / `sandbox.detachFileSystem()` on a\n * running sandbox.\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 filesystem = await new FilesystemClient().create(name);\n return {\n id: filesystem.name,\n name: filesystem.name,\n description,\n status: \"ready\",\n };\n}\n\n/** List all registered file systems for the current project. */\nexport async function listFileSystems(): Promise<FileSystem[]> {\n const filesystems = await new FilesystemClient().list();\n return filesystems.map((filesystem) => ({\n id: filesystem.name,\n name: filesystem.name,\n status: filesystem.status,\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 await new FilesystemClient().delete(fileSystemId);\n}\n","export {\n registerApplication,\n registerFunction,\n retries,\n FunctionFuture as Future,\n type ApplicationCapability,\n type ApplicationOptions,\n type FunctionOptions,\n type SimpleApplicationOptions,\n type SimpleFunctionOptions,\n type RegisteredFunction,\n type TailCall,\n type WaitOptions,\n type WaitResult,\n} from \"./function.js\";\nexport { schema, type Schema, type Parameter, type Infer, type ParameterValues } from \"./schema.js\";\nexport { File } from \"./file.js\";\nexport { HttpBody } from \"./http-body.js\";\nexport { Headers, type HeadersInit } from \"./headers.js\";\nexport { Image } from \"../image.js\";\nexport { SDK_VERSION } from \"../defaults.js\";\nexport { RequestContext, type RequestContextValue } from \"./context.js\";\nexport { runLocal, LocalRequest } from \"./local.js\";\nexport {\n runRemote,\n remoteOptions,\n RemoteRequest,\n type RemoteOptions,\n} from \"./remote.js\";\nexport {\n TensorlakeApplicationError,\n SDKUsageError,\n SerializationError,\n DeserializationError,\n FunctionError,\n TimeoutError,\n RequestError,\n ReplayMismatchError,\n} from \"./errors.js\";\nexport {\n createApplicationManifest,\n createApplicationManifests,\n createCodeManifest,\n decodeDescriptor,\n type ApplicationManifest,\n type FunctionManifest,\n type CodeManifest,\n} from \"./manifest.js\";\nexport { getApplications, getFunctions, getFunction } from \"./registry.js\";\n","import { AsyncLocalStorage, executionAsyncId } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Image } from \"../image.js\";\nimport { SDKUsageError } from \"./errors.js\";\nimport type { Parameter, ParameterValues, Schema } from \"./schema.js\";\nimport { schema, validateWithSchema } from \"./schema.js\";\nimport { registerDefinition } from \"./registry.js\";\n\nexport interface Retries {\n maxRetries: number;\n}\n\nexport function retries(options: Retries): Retries {\n if (\n typeof options !== \"object\"\n || options == null\n || !Number.isInteger(options.maxRetries)\n || options.maxRetries < 0\n || options.maxRetries > 10\n ) {\n throw new SDKUsageError(\"maxRetries must be an integer between 0 and 10\");\n }\n return Object.freeze({ ...options });\n}\n\nexport type Region = \"us-east-1\" | \"eu-west-1\";\n\nexport type ApplicationCapability = \"unauthenticated_requests\";\n\nexport interface FunctionOptions<\n P extends readonly Parameter<unknown>[],\n R,\n> {\n name?: string;\n parameters: P;\n returns: Schema<R>;\n description?: string;\n cpu?: number;\n memory?: number;\n ephemeralDisk?: number;\n gpu?: string | string[] | null;\n timeout?: number;\n image?: Image;\n secrets?: string[];\n retries?: Retries;\n region?: Region;\n warmContainers?: number;\n minContainers?: number;\n maxContainers?: number;\n}\n\nexport interface ApplicationOptions<\n P extends readonly Parameter<unknown>[],\n R,\n> extends FunctionOptions<P, R> {\n tags?: Record<string, string>;\n applicationRetries?: Retries;\n allow?: readonly ApplicationCapability[];\n}\n\n/** Options available when parameter and return schemas use the JSON defaults. */\nexport type SimpleFunctionOptions = Omit<\n FunctionOptions<readonly Parameter<unknown>[], unknown>,\n \"name\" | \"parameters\" | \"returns\"\n>;\n\n/** Application options available when parameter and return schemas use the JSON defaults. */\nexport type SimpleApplicationOptions = Omit<\n ApplicationOptions<readonly Parameter<unknown>[], unknown>,\n \"name\" | \"parameters\" | \"returns\"\n>;\n\nexport interface NormalizedFunctionOptions {\n description: string;\n cpu: number;\n memory: number;\n ephemeralDisk: number;\n gpu: string | string[] | null;\n timeout: number;\n image?: Image;\n secrets: string[];\n retries?: Retries;\n region?: Region;\n warmContainers?: number;\n minContainers?: number;\n maxContainers?: number;\n}\n\nexport interface ApplicationConfiguration {\n tags: Record<string, string>;\n retries: Retries;\n allow: ApplicationCapability[];\n version: string;\n}\n\nexport interface RegisteredDefinition {\n readonly name: string;\n readonly handler: (...args: unknown[]) => Promise<unknown>;\n readonly parameters: readonly Parameter<unknown>[];\n readonly returns: Schema<unknown>;\n readonly options: NormalizedFunctionOptions;\n readonly application?: ApplicationConfiguration;\n}\n\n// A string discriminator alone is valid user JSON and cannot safely identify\n// an SDK control-flow value. Symbol.for keeps the brand stable when the user\n// application and executor load separate copies of the SDK in one process.\nconst TAIL_CALL_BRAND: unique symbol = Symbol.for(\n \"tensorlake.applications.tail-call.v1\",\n);\n\nexport interface TailCall<T> {\n readonly [TAIL_CALL_BRAND]: true;\n readonly kind: \"tensorlake-tail-call\";\n readonly definition: RegisteredDefinition;\n readonly args: readonly unknown[];\n readonly _result?: T;\n}\n\nexport interface WaitOptions {\n timeout?: number;\n returnWhen?: \"all_completed\" | \"first_completed\" | \"first_failure\";\n}\n\nexport interface WaitResult<T> {\n done: FunctionFuture<T>[];\n notDone: FunctionFuture<T>[];\n}\n\nexport interface FunctionRuntime {\n invoke<T>(definition: RegisteredDefinition, args: readonly unknown[]): Promise<T>;\n runFuture<T>(future: FunctionFuture<T>): Promise<T>;\n wrapFutureWait?<T>(promise: Promise<T>): Promise<T>;\n trackMixedPromiseRace?(\n promise: Promise<unknown>,\n producers?: readonly Promise<unknown>[],\n ): void;\n trackPromiseSettlement?(\n promise: Promise<unknown>,\n onSettled: () => void,\n ): boolean;\n trackDurablePromiseConsumption?(promise: Promise<unknown>): void;\n runPromiseAggregateConstruction?<T>(callback: () => T): T;\n reduce<T>(\n definition: RegisteredDefinition,\n items: readonly unknown[],\n initial: unknown,\n hasInitial: boolean,\n ): Promise<T>;\n}\n\n// FunctionFuture observes durable promises to update its public completion\n// fields. That bookkeeping must not look like an application-level await to\n// the strict replay causality tracker. Symbol.for keeps the private observer\n// available when the application and executor use separate SDK bundles.\nexport const DURABLE_PROMISE_OBSERVER = Symbol.for(\n \"tensorlake.applications.durable-promise-observer.v1\",\n);\n\n// SDK combinators must be able to compose durable promises without making\n// their private bookkeeping look like a user continuation. The aggregate\n// returned to user code is wrapped separately.\nexport const DURABLE_PROMISE_INTERNAL_THEN = Symbol.for(\n \"tensorlake.applications.durable-promise-internal-then.v1\",\n);\n\ninterface ObservableDurablePromise<T> extends Promise<T> {\n [DURABLE_PROMISE_OBSERVER]?: (\n onfulfilled: (value: T) => void,\n onrejected: (reason: unknown) => void,\n ) => void;\n [DURABLE_PROMISE_INTERNAL_THEN]?: <TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ) => Promise<TResult1 | TResult2>;\n}\n\n// The user application and function executor are separate bundles loaded into\n// one Node process. Store the runtime on globalThis so durable calls made by the\n// application SDK copy reach the executor SDK copy that installed the runtime.\nconst FUNCTION_RUNTIME_STORAGE_KEY = Symbol.for(\n \"tensorlake.applications.function-runtime-storage.v1\",\n);\n\nconst PROMISE_INSTRUMENTED_KEY = Symbol.for(\n \"tensorlake.applications.promise-instrumented.v3\",\n);\n\nconst PROMISE_THEN_INSTRUMENTED_KEY = Symbol.for(\n \"tensorlake.applications.promise-then-instrumented.v1\",\n);\n\nconst DURABLE_THENABLE_REGISTRY_KEY = Symbol.for(\n \"tensorlake.applications.durable-thenable-registry.v2\",\n);\n\nconst INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY = Symbol.for(\n \"tensorlake.applications.internal-promise-aggregate-depth.v1\",\n);\n\ninterface DurableAssimilationRegistration {\n active: boolean;\n readonly detach: () => void;\n}\n\ninterface DurableThenableMetadata {\n readonly aggregateExpectations: DurableAggregateExpectation[];\n readonly provenanceExpectations: DurableProvenanceExpectation[];\n}\n\ninterface DurableThenableProvenance {\n readonly metadata: DurableThenableMetadata;\n readonly assimilation?: DurableAssimilationRegistration;\n readonly detached?: true;\n}\n\ninterface DurableAggregateScope {\n settled: boolean;\n readonly metadata: Set<DurableThenableMetadata>;\n}\n\ninterface DurableAggregateExpectation {\n readonly scope: DurableAggregateScope;\n readonly creatorAsyncId: number;\n}\n\ninterface DurableProvenanceExpectation {\n readonly value: object;\n readonly creatorAsyncId: number;\n}\n\nexport interface DurableAssimilation {\n finish(): void;\n link<T extends object>(value: T): T;\n}\n\nlet futureCompletionCounter = 0;\n\nfunction runtimeStorage(): AsyncLocalStorage<FunctionRuntime> {\n const target = globalThis as typeof globalThis & {\n [FUNCTION_RUNTIME_STORAGE_KEY]?: AsyncLocalStorage<FunctionRuntime>;\n };\n target[FUNCTION_RUNTIME_STORAGE_KEY] ??= new AsyncLocalStorage<FunctionRuntime>();\n return target[FUNCTION_RUNTIME_STORAGE_KEY];\n}\n\nexport function currentFunctionRuntime(): FunctionRuntime | undefined {\n return runtimeStorage().getStore();\n}\n\nexport function runWithFunctionRuntime<T>(\n runtime: FunctionRuntime,\n callback: () => Promise<T>,\n): Promise<T> {\n return runtimeStorage().run(runtime, callback);\n}\n\nexport class FunctionFuture<T> implements PromiseLike<T> {\n readonly id = randomUUID();\n readonly definition: RegisteredDefinition;\n readonly args: readonly unknown[];\n private promise?: Promise<T>;\n private startDelaySeconds = 0;\n private completionOrder?: number;\n private failed = false;\n exception?: unknown;\n done = false;\n\n constructor(definition: RegisteredDefinition, args: readonly unknown[]) {\n this.definition = definition;\n this.args = args;\n registerDurableThenable(this);\n }\n\n run(): this {\n if (this.promise != null) throw new SDKUsageError(`Future ${this.id} is already running`);\n const runtime = currentFunctionRuntime();\n const promise = runtime == null\n ? executeHandler<T>(this.definition, this.args)\n : runtime.runFuture(this);\n // The future and its runtime promise are two views of the same durable\n // operation. Sharing provenance lets Promise.resolve/fan-in wrappers keep\n // the exact durable contender identity.\n registerDurableThenable(promise, this);\n this.promise = promise;\n const onfulfilled = (value: T) => {\n this.done = true;\n this.completionOrder = futureCompletionCounter;\n futureCompletionCounter += 1;\n return value;\n };\n const onrejected = (error: unknown) => {\n this.done = true;\n this.failed = true;\n this.exception = error;\n this.completionOrder = futureCompletionCounter;\n futureCompletionCounter += 1;\n };\n const observer = (promise as ObservableDurablePromise<T>)[DURABLE_PROMISE_OBSERVER];\n if (observer != null) {\n observer.call(promise, onfulfilled, onrejected);\n } else {\n void promise.then(\n (value) => {\n onfulfilled(value);\n },\n (error) => {\n onrejected(error);\n },\n );\n }\n // The completion observer handles rejection without changing `this.promise`,\n // so result()/await still receive the original rejection while Node does not\n // treat an intentionally unawaited future as an unhandled rejection.\n return this;\n }\n\n runLater(delaySeconds: number): this {\n if (!Number.isFinite(delaySeconds) || delaySeconds < 0) {\n throw new SDKUsageError(\"Future delay must be a non-negative finite number\");\n }\n if (this.promise != null) {\n throw new SDKUsageError(`Future ${this.id} is already running`);\n }\n this.startDelaySeconds = delaySeconds;\n return this.run();\n }\n\n get delaySeconds(): number {\n return this.startDelaySeconds;\n }\n\n result(): Promise<T> {\n if (this.promise == null) this.run();\n return this.promise as Promise<T>;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.result().then(onfulfilled, onrejected);\n }\n\n static wait<T>(futures: FunctionFuture<T>[], options: WaitOptions = {}): Promise<WaitResult<T>> {\n const completion = FunctionFuture.waitForFutures(futures, options);\n // Returning the runtime wrapper lets strict replay observe when user code\n // awaits this aggregate promise. Merely creating a Future.wait remains\n // fire-and-forget and must not trigger a mismatch.\n return currentFunctionRuntime()?.wrapFutureWait?.(completion) ?? completion;\n }\n\n private static async waitForFutures<T>(\n futures: FunctionFuture<T>[],\n options: WaitOptions,\n ): Promise<WaitResult<T>> {\n const returnWhen = options.returnWhen ?? \"all_completed\";\n if (![\"all_completed\", \"first_completed\", \"first_failure\"].includes(returnWhen)) {\n throw new SDKUsageError(`Unsupported Future.wait returnWhen value '${returnWhen}'`);\n }\n if (options.timeout != null && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n throw new SDKUsageError(\"Future.wait timeout must be a non-negative finite number\");\n }\n futures.forEach((future) => {\n if (future.promise == null) future.run();\n });\n const alreadyDone = futures.filter((future) => future.done);\n if (\n alreadyDone.length > 0\n && (\n returnWhen === \"first_completed\"\n || (\n returnWhen === \"first_failure\"\n && alreadyDone.some((future) => future.failed)\n )\n )\n ) {\n return {\n done: alreadyDone,\n notDone: futures.filter((future) => !future.done),\n };\n }\n const pending = futures.filter((future) => !future.done);\n if (pending.length === 0) {\n return { done: [...futures], notDone: [] };\n }\n let wait: Promise<FutureWaitOutcome<T>>;\n if (returnWhen === \"all_completed\") {\n wait = internalPromiseAll(\n pending.map((future) => internalDurableThen(future.result(),\n () => undefined,\n () => undefined,\n )),\n ).then(() => ({ kind: \"all_completed\" }));\n } else if (returnWhen === \"first_completed\") {\n wait = internalPromiseRace(\n pending.map((future) => internalDurableThen(future.result(),\n () => ({ kind: \"cutoff\", future } as const),\n () => ({ kind: \"cutoff\", future } as const),\n )),\n );\n } else {\n wait = new Promise((resolve) => {\n let remaining = pending.length;\n for (const future of pending) {\n void internalDurableThen(\n future.result(),\n () => {\n remaining -= 1;\n if (remaining === 0) resolve({ kind: \"all_completed\" });\n },\n () => resolve({ kind: \"cutoff\", future }),\n );\n }\n });\n }\n const outcome = await waitUntilOrTimeout(wait, options.timeout);\n if (outcome.kind === \"cutoff\") {\n const completionCutoff = outcome.future.completionOrder;\n if (completionCutoff == null) {\n throw new SDKUsageError(\"Future.wait winner has no completion order\");\n }\n const doneSet = new Set(alreadyDone);\n for (const future of pending) {\n if (\n future.done\n && future.completionOrder != null\n && future.completionOrder <= completionCutoff\n ) {\n doneSet.add(future);\n }\n }\n return {\n done: futures.filter((future) => doneSet.has(future)),\n notDone: futures.filter((future) => !doneSet.has(future)),\n };\n }\n return {\n done: futures.filter((future) => future.done),\n notDone: futures.filter((future) => !future.done),\n };\n }\n}\n\ntype FutureWaitOutcome<T> =\n | { kind: \"all_completed\" }\n | { kind: \"cutoff\"; future: FunctionFuture<T> };\n\nasync function waitUntilOrTimeout<T>(\n promise: Promise<T>,\n timeoutSeconds?: number,\n): Promise<T | { kind: \"timeout\" }> {\n if (timeoutSeconds == null) {\n return promise;\n }\n let timer: NodeJS.Timeout | undefined;\n try {\n return await internalPromiseRace<T | { kind: \"timeout\" }>([\n promise,\n new Promise<{ kind: \"timeout\" }>((resolve) => {\n timer = setTimeout(() => resolve({ kind: \"timeout\" }), timeoutSeconds * 1000);\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\ntype Awaitable<T> = T | PromiseLike<T>;\ntype AwaitableIterable<T> = Iterable<Awaitable<T>> | PromiseLike<Iterable<Awaitable<T>>>;\n\nfunction isDurableThenable(value: unknown): boolean {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value == null) {\n return false;\n }\n return durableThenableRegistry().has(value);\n}\n\nexport function isDetachedDurableThenable(value: unknown): boolean {\n const provenance = provenanceForDurableThenable(value);\n return provenance?.detached === true\n || (provenance?.assimilation != null && !provenance.assimilation.active);\n}\n\nfunction durableThenableRegistry(): WeakMap<object, DurableThenableProvenance> {\n const target = globalThis as typeof globalThis & {\n [DURABLE_THENABLE_REGISTRY_KEY]?: WeakMap<object, DurableThenableProvenance>;\n };\n target[DURABLE_THENABLE_REGISTRY_KEY] ??=\n new WeakMap<object, DurableThenableProvenance>();\n return target[DURABLE_THENABLE_REGISTRY_KEY];\n}\n\nfunction newDurableThenableMetadata(): DurableThenableMetadata {\n return {\n aggregateExpectations: [],\n provenanceExpectations: [],\n };\n}\n\nfunction metadataForDurableThenable(value: unknown): DurableThenableMetadata | undefined {\n return provenanceForDurableThenable(value)?.metadata;\n}\n\nfunction provenanceForDurableThenable(\n value: unknown,\n): DurableThenableProvenance | undefined {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value == null) {\n return undefined;\n }\n return durableThenableRegistry().get(value);\n}\n\nexport function registerDurableThenable<T extends object>(\n value: T,\n source?: object,\n): T {\n const registry = durableThenableRegistry();\n const metadata = source == null\n ? registry.get(value)?.metadata ?? newDurableThenableMetadata()\n : registry.get(source)?.metadata ?? newDurableThenableMetadata();\n registry.set(value, { metadata });\n if (source != null && !registry.has(source)) registry.set(source, { metadata });\n return value;\n}\n\nfunction registerDetachedDurableThenable<T extends object>(value: T): T {\n const registry = durableThenableRegistry();\n registry.set(value, {\n metadata: registry.get(value)?.metadata ?? newDurableThenableMetadata(),\n detached: true,\n });\n return value;\n}\n\nfunction inheritDurableThenable<T extends object>(value: T, source: object): T {\n const provenance = durableThenableRegistry().get(source);\n if (provenance == null) return value;\n durableThenableRegistry().set(value, provenance);\n if (provenance.assimilation == null) {\n provenance.metadata.provenanceExpectations.push({\n value,\n creatorAsyncId: executionAsyncId(),\n });\n }\n return value;\n}\n\n/**\n * Associates a replay-aware durable assimilation with its durable provenance.\n *\n * The returned handle marks normal settlement and links derived promises to\n * this exact assimilation. Promise aggregate construction can detach the\n * aggregate's internal reaction so it is not mistaken for application code\n * awaiting the returned aggregate.\n */\nexport function registerDurableAssimilation(\n value: object,\n detach: () => void,\n): DurableAssimilation {\n const metadata = metadataForDurableThenable(value);\n if (metadata == null) {\n return {\n finish: () => undefined,\n link: (linked) => linked,\n };\n }\n const registration: DurableAssimilationRegistration = {\n active: true,\n detach,\n };\n const provenanceIndex = metadata.provenanceExpectations.findIndex((expectation) =>\n expectation.creatorAsyncId !== executionAsyncId()\n );\n if (provenanceIndex >= 0) {\n const [expectation] = metadata.provenanceExpectations.splice(provenanceIndex, 1);\n durableThenableRegistry().set(expectation.value, {\n metadata,\n assimilation: registration,\n });\n }\n const expectationIndex = metadata.aggregateExpectations.findIndex((expectation) =>\n !expectation.scope.settled\n && expectation.creatorAsyncId !== executionAsyncId()\n );\n if (expectationIndex >= 0) {\n const [expectation] = metadata.aggregateExpectations.splice(expectationIndex, 1);\n associateAssimilationWithAggregate(registration, expectation.scope);\n }\n return {\n finish: () => finishDurableAssimilation(registration),\n link: <T extends object>(linked: T): T => {\n durableThenableRegistry().set(linked, {\n metadata,\n assimilation: registration,\n });\n return linked;\n },\n };\n}\n\nfunction associateAssimilationWithAggregate(\n registration: DurableAssimilationRegistration,\n scope: DurableAggregateScope,\n): void {\n if (!registration.active || scope.settled) return;\n finishDurableAssimilation(registration);\n registration.detach();\n}\n\nfunction finishDurableAssimilation(registration: DurableAssimilationRegistration): void {\n if (!registration.active) return;\n registration.active = false;\n}\n\nfunction trackDurableAggregate(\n runtime: FunctionRuntime,\n result: Promise<unknown>,\n durableContenders: readonly unknown[],\n markResult: boolean,\n): void {\n const scope: DurableAggregateScope = {\n settled: false,\n metadata: new Set<DurableThenableMetadata>(),\n };\n if (markResult) {\n // Constructing an aggregate attaches internal reactions to its durable\n // inputs, but that does not mean application code is awaiting the result.\n // Mark the aggregate itself as detached so a later user reaction becomes\n // the durable assimilation observed by strict replay.\n registerDetachedDurableThenable(result);\n }\n const creatorAsyncId = executionAsyncId();\n for (const contender of durableContenders) {\n const provenance = provenanceForDurableThenable(contender);\n if (provenance == null) continue;\n if (provenance.assimilation != null) {\n associateAssimilationWithAggregate(provenance.assimilation, scope);\n } else {\n provenance.metadata.aggregateExpectations.push({\n scope,\n creatorAsyncId,\n });\n }\n if (scope.metadata.has(provenance.metadata)) continue;\n const { metadata } = provenance;\n scope.metadata.add(metadata);\n }\n const settle = () => {\n if (scope.settled) return;\n scope.settled = true;\n for (const metadata of scope.metadata) {\n for (let index = metadata.aggregateExpectations.length - 1; index >= 0; index -= 1) {\n if (metadata.aggregateExpectations[index].scope === scope) {\n metadata.aggregateExpectations.splice(index, 1);\n }\n }\n }\n scope.metadata.clear();\n };\n // Promise.prototype.then still performs a user-observable Symbol.species\n // lookup even when invoked directly. The executor observes the native\n // promiseResolve async hook instead, so bookkeeping cannot call user code or\n // construct an extra subclass promise.\n if (runtime.trackPromiseSettlement?.(result, settle) !== true) settle();\n}\n\ninterface PromiseAggregateObservation {\n readonly ordinaryLifetime: Promise<void>;\n allOrdinaryValuesObservable: boolean;\n observeFulfillment(): void;\n observeRejection(): void;\n finishIteration(contenderCount: number): void;\n}\n\nfunction promiseAggregateObservation(\n kind: \"all\" | \"all_settled\" | \"any\",\n): PromiseAggregateObservation {\n let settleLifetime!: () => void;\n const ordinaryLifetime = new Promise<void>((resolve) => {\n settleLifetime = resolve;\n });\n let contenderCount: number | undefined;\n let fulfillmentCount = 0;\n let rejectionCount = 0;\n let settled = false;\n const maybeSettle = () => {\n if (settled) return;\n const canNoLongerAdvance = kind === \"any\"\n ? contenderCount != null && rejectionCount === contenderCount\n : kind === \"all\"\n ? rejectionCount > 0\n || (contenderCount != null && fulfillmentCount === contenderCount)\n : contenderCount != null\n && fulfillmentCount + rejectionCount === contenderCount;\n if (!canNoLongerAdvance) return;\n settled = true;\n settleLifetime();\n };\n return {\n ordinaryLifetime,\n allOrdinaryValuesObservable: true,\n observeFulfillment: () => {\n fulfillmentCount += 1;\n maybeSettle();\n },\n observeRejection: () => {\n rejectionCount += 1;\n maybeSettle();\n },\n finishIteration: (count) => {\n contenderCount = count;\n maybeSettle();\n },\n };\n}\n\nfunction observePromiseAggregateContender(\n normalized: unknown,\n observation: PromiseAggregateObservation,\n): unknown {\n if (\n (typeof normalized !== \"object\" && typeof normalized !== \"function\")\n || normalized == null\n ) {\n observation.allOrdinaryValuesObservable = false;\n return normalized;\n }\n let observedSettled = false;\n const observed = Object.create(null) as object;\n Object.defineProperty(observed, \"then\", {\n configurable: true,\n get: () => {\n const then = Reflect.get(normalized, \"then\", normalized) as unknown;\n if (typeof then !== \"function\") return then;\n return function observedThen(\n this: unknown,\n onfulfilled: unknown,\n onrejected: unknown,\n ): unknown {\n return Reflect.apply(then, normalized, [\n function observedFulfillment(this: unknown, value: unknown): unknown {\n if (!observedSettled) {\n observedSettled = true;\n observation.observeFulfillment();\n }\n return typeof onfulfilled === \"function\"\n ? Reflect.apply(onfulfilled, this, [value])\n : undefined;\n },\n function observedRejection(this: unknown, reason: unknown): unknown {\n if (!observedSettled) {\n observedSettled = true;\n observation.observeRejection();\n }\n if (typeof onrejected === \"function\") {\n return Reflect.apply(onrejected, this, [reason]);\n }\n throw reason;\n },\n ]);\n };\n },\n });\n return observed;\n}\n\n/**\n * Lets a native Promise aggregate algorithm retain control of iteration and\n * settlement while exposing each constructor-normalized contender.\n *\n * The facade constructs the real Promise subclass and delegates its `resolve`\n * lookup and calls back to that subclass. This preserves custom static resolve\n * behavior and the public result type without resolving an input twice.\n */\nfunction observedPromiseConstructor(\n constructor: PromiseConstructor,\n observeNormalized: (normalized: unknown) => unknown,\n): PromiseConstructor {\n const facade = function PromiseAggregateObservedConstructor(\n executor: (\n resolve: (value: unknown) => void,\n reject: (reason?: unknown) => void,\n ) => void,\n ): Promise<unknown> {\n return Reflect.construct(\n constructor,\n [executor],\n constructor,\n ) as Promise<unknown>;\n } as unknown as PromiseConstructor;\n Object.defineProperty(facade, \"resolve\", {\n configurable: true,\n get: () => {\n const promiseResolve = Reflect.get(constructor, \"resolve\", constructor) as unknown;\n if (typeof promiseResolve !== \"function\") return promiseResolve;\n return (value: unknown): unknown => {\n const normalized = Reflect.apply(promiseResolve, constructor, [value]) as unknown;\n return observeNormalized(normalized);\n };\n },\n });\n return facade;\n}\n\nfunction internalDurableThen<T, TResult1 = T, TResult2 = never>(\n promise: Promise<T>,\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n): Promise<TResult1 | TResult2> {\n const internalThen = (promise as ObservableDurablePromise<T>)[DURABLE_PROMISE_INTERNAL_THEN];\n if (internalThen != null) {\n return internalThen.call(\n promise,\n onfulfilled,\n onrejected,\n ) as Promise<TResult1 | TResult2>;\n }\n return promise.then(onfulfilled, onrejected);\n}\n\nfunction internalAwaitable<T>(value: Awaitable<T>): Promise<T> {\n if ((typeof value === \"object\" || typeof value === \"function\") && value != null) {\n const internalThen = (\n value as Partial<ObservableDurablePromise<T>>\n )[DURABLE_PROMISE_INTERNAL_THEN];\n if (internalThen != null) {\n return internalThen.call(\n value,\n (resolved) => resolved,\n (error) => {\n throw error;\n },\n ) as Promise<T>;\n }\n }\n return Promise.resolve(value);\n}\n\nasync function resolveAwaitableIterable<T>(\n items: AwaitableIterable<T>,\n): Promise<T[]> {\n const iterable = await internalAwaitable(items);\n return internalPromiseAll([...iterable].map((item) => internalAwaitable(item)));\n}\n\nfunction wrapDurableAggregate<T>(completion: Promise<T>): Promise<T> {\n return currentFunctionRuntime()?.wrapFutureWait?.(completion) ?? completion;\n}\n\nfunction runInternalPromiseAggregate<T>(callback: () => T): T {\n const target = globalThis as typeof globalThis & {\n [INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY]?: number;\n };\n target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] =\n (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 0) + 1;\n try {\n return callback();\n } finally {\n const remaining = (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 1) - 1;\n if (remaining === 0) delete target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY];\n else target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] = remaining;\n }\n}\n\nfunction isInternalPromiseAggregate(): boolean {\n const target = globalThis as typeof globalThis & {\n [INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY]?: number;\n };\n return (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 0) > 0;\n}\n\nfunction internalPromiseAll<T>(\n values: Iterable<T | PromiseLike<T>>,\n): Promise<Awaited<T>[]> {\n return runInternalPromiseAggregate(() => Promise.all(values));\n}\n\nfunction internalPromiseRace<T>(\n values: Iterable<T | PromiseLike<T>>,\n): Promise<Awaited<T>> {\n return runInternalPromiseAggregate(() => Promise.race(values));\n}\n\nexport function installPromiseInstrumentation(): void {\n const target = globalThis as typeof globalThis & {\n [PROMISE_INSTRUMENTED_KEY]?: true;\n [PROMISE_THEN_INSTRUMENTED_KEY]?: true;\n };\n if (target[PROMISE_THEN_INSTRUMENTED_KEY] !== true) {\n const originalThen = Promise.prototype.then;\n Object.defineProperty(Promise.prototype, \"then\", {\n ...Object.getOwnPropertyDescriptor(Promise.prototype, \"then\"),\n value: function then(\n this: Promise<unknown>,\n onfulfilled?: ((value: unknown) => unknown) | null,\n onrejected?: ((reason: unknown) => unknown) | null,\n ): Promise<unknown> {\n const result = Reflect.apply(\n originalThen,\n this,\n [onfulfilled, onrejected],\n ) as Promise<unknown>;\n if (isDetachedDurableThenable(this)) {\n currentFunctionRuntime()?.trackDurablePromiseConsumption?.(result);\n }\n return result;\n },\n });\n target[PROMISE_THEN_INSTRUMENTED_KEY] = true;\n }\n if (target[PROMISE_INSTRUMENTED_KEY] === true) return;\n const originalRace = Promise.race;\n const originalAny = Promise.any;\n const originalAll = Promise.all;\n const originalAllSettled = Promise.allSettled;\n const originalResolve = Promise.resolve;\n\n // Promise.resolve normally hides a durable Promise subclass inside a native\n // Promise. Preserve the durable provenance on that wrapper so a subsequent\n // all/allSettled/race/any can still distinguish it from an independent\n // contender.\n Object.defineProperty(Promise, \"resolve\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"resolve\"),\n value: function resolve<T>(\n this: PromiseConstructor,\n value: T | PromiseLike<T>,\n ): Promise<Awaited<T>> {\n const result = Reflect.apply(originalResolve, this, [value]) as Promise<Awaited<T>>;\n if (isDurableThenable(value)) inheritDurableThenable(result, value as object);\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"race\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"race\"),\n value: function race<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalRace, this, [values]) as Promise<Awaited<T>>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n } else {\n ordinaryContenderCount += 1;\n }\n return normalized;\n },\n );\n const construct = () =>\n Reflect.apply(\n originalRace,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (\n durableContenders.length > 0\n && ordinaryContenderCount > 0\n ) {\n runtime.trackMixedPromiseRace(result);\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"any\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"any\"),\n value: function any<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalAny, this, [values]) as Promise<Awaited<T>>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"any\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAny,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (\n observation.allOrdinaryValuesObservable\n ) {\n // Once every ordinary contender rejects, only a durable contender\n // can advance Promise.any. A fulfillment may itself be a pending\n // promise that the public aggregate adopts, so the ordinary gate\n // must not expire merely because its fulfillment callback ran.\n // Stop treating the ordinary path as a producer when either it or\n // the public aggregate settles. The latter covers a durable winner\n // as well as fulfilled-value adoption and abrupt iterator failures.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n // A non-object custom resolve result makes native Promise.any reject\n // the aggregate. Retain that aggregate as the producer until the\n // rejection becomes observable.\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"all\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"all\"),\n value: function all<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>[]> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalAll, this, [values]) as Promise<Awaited<T>[]>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"all\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAll,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>[]>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (\n observation.allOrdinaryValuesObservable\n ) {\n // Ordinary inputs can advance Promise.all until one rejects or all\n // fulfill. The non-rejecting lifetime gate models that boundary\n // without observing the public result or invoking a thenable twice.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n // A custom resolve result that is not thenable makes the public\n // aggregate reject. Its own settlement is the only observable\n // producer boundary available.\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"allSettled\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"allSettled\"),\n value: function allSettled<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<PromiseSettledResult<Awaited<T>>[]> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(\n originalAllSettled,\n this,\n [values],\n ) as Promise<PromiseSettledResult<Awaited<T>>[]>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"all_settled\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) yield value;\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAllSettled,\n observedConstructor,\n [trackedValues],\n ) as Promise<PromiseSettledResult<Awaited<T>>[]>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (observation.allOrdinaryValuesObservable) {\n // Ordinary inputs can advance Promise.allSettled until every one has\n // settled. The aggregate itself covers abrupt iterator/resolve\n // failures and durable completion.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n target[PROMISE_INSTRUMENTED_KEY] = true;\n}\n\nexport interface RegisteredFunction<Args extends readonly unknown[], Result> {\n (...args: Args): Promise<Result>;\n readonly definition: RegisteredDefinition;\n future(...args: Args): FunctionFuture<Result>;\n map(items: AwaitableIterable<Args[0]>): Promise<Result[]>;\n reduce(\n items: AwaitableIterable<Args[1]>,\n initial?: Args[0],\n ): Promise<Result>;\n tailCall(...args: Args): TailCall<Result>;\n}\n\nfunction normalizeOptions(options: FunctionOptions<readonly Parameter<unknown>[], unknown>): NormalizedFunctionOptions {\n validateGPUOption(options.gpu);\n if (options.secrets != null && !Array.isArray(options.secrets)) {\n throw new SDKUsageError(\"secrets must be an array of non-empty strings\");\n }\n const normalizedRetries = options.retries == null\n ? undefined\n : retries(options.retries);\n const result: NormalizedFunctionOptions = {\n description: options.description ?? \"\",\n cpu: options.cpu ?? 1,\n memory: options.memory ?? 1,\n ephemeralDisk: options.ephemeralDisk ?? 10,\n gpu: Array.isArray(options.gpu) ? [...options.gpu] : options.gpu ?? null,\n timeout: options.timeout ?? 300,\n image: options.image,\n secrets: [...(options.secrets ?? [])],\n retries: normalizedRetries,\n region: options.region,\n warmContainers: options.warmContainers,\n minContainers: options.minContainers,\n maxContainers: options.maxContainers,\n };\n if (!Number.isFinite(result.cpu) || result.cpu <= 0) throw new SDKUsageError(\"cpu must be greater than zero\");\n if (!Number.isFinite(result.memory) || result.memory <= 0) throw new SDKUsageError(\"memory must be greater than zero\");\n if (!Number.isFinite(result.ephemeralDisk) || result.ephemeralDisk <= 0) throw new SDKUsageError(\"ephemeralDisk must be greater than zero\");\n if (!Number.isInteger(result.timeout) || result.timeout <= 0 || result.timeout > 86_400) {\n throw new SDKUsageError(\"timeout must be an integer between 1 and 86400 seconds\");\n }\n for (const [label, value] of [\n [\"warmContainers\", result.warmContainers],\n [\"minContainers\", result.minContainers],\n [\"maxContainers\", result.maxContainers],\n ] as const) {\n if (value != null && (!Number.isInteger(value) || value < 0)) {\n throw new SDKUsageError(`${label} must be a non-negative integer`);\n }\n }\n if (result.minContainers != null && result.maxContainers != null && result.minContainers > result.maxContainers) {\n throw new SDKUsageError(\"minContainers cannot exceed maxContainers\");\n }\n if (result.warmContainers != null && result.maxContainers != null && result.warmContainers > result.maxContainers) {\n throw new SDKUsageError(\"warmContainers cannot exceed maxContainers\");\n }\n if (result.region != null && ![\"us-east-1\", \"eu-west-1\"].includes(result.region)) {\n throw new SDKUsageError(`Unsupported region '${result.region}'`);\n }\n if (result.secrets.some((secret) => typeof secret !== \"string\" || secret.length === 0)) {\n throw new SDKUsageError(\"secrets must contain non-empty strings\");\n }\n return result;\n}\n\nfunction validateGPUOption(value: unknown): void {\n if (value == null) return;\n const values = Array.isArray(value) ? value : [value];\n for (const setting of values) {\n if (typeof setting !== \"string\") {\n throw new SDKUsageError(\"gpu must be a GPU model or an array of GPU models\");\n }\n const [model, countText, ...extra] = setting.split(\":\");\n const count = countText == null ? 1 : Number(countText);\n if (\n !model\n || extra.length > 0\n || !Number.isInteger(count)\n || count <= 0\n || (countText != null && String(count) !== countText)\n ) {\n throw new SDKUsageError(`Invalid GPU setting '${setting}'`);\n }\n }\n}\n\nfunction validateArguments(definition: RegisteredDefinition, supplied: readonly unknown[]): unknown[] {\n const args = [...supplied];\n if (args.length > definition.parameters.length) {\n throw new SDKUsageError(`${definition.name} expected at most ${definition.parameters.length} arguments, received ${args.length}`);\n }\n definition.parameters.forEach((parameter, index) => {\n if (index >= args.length || args[index] === undefined) {\n if (parameter.hasDefault) args[index] = parameter.defaultValue;\n else if (parameter.required) throw new SDKUsageError(`${definition.name} is missing argument '${parameter.name}'`);\n return;\n }\n validateWithSchema(parameter.schema, args[index], `${definition.name}.${parameter.name}`);\n });\n return args;\n}\n\nexport async function executeHandler<T>(\n definition: RegisteredDefinition,\n suppliedArgs: readonly unknown[],\n): Promise<T> {\n const output = await executeHandlerResult<T>(definition, suppliedArgs);\n if (isTailCall(output)) {\n const runtime = currentFunctionRuntime();\n if (runtime == null) return executeHandler<T>(output.definition, output.args);\n return runtime.invoke<T>(output.definition, output.args);\n }\n return output;\n}\n\n/** Runs one handler frame without resolving a tail call. Used by language executors. */\nexport async function executeHandlerResult<T>(\n definition: RegisteredDefinition,\n suppliedArgs: readonly unknown[],\n): Promise<T | TailCall<T>> {\n const args = validateArguments(definition, suppliedArgs);\n const result = definition.handler(...args);\n if (result == null || typeof (result as PromiseLike<unknown>).then !== \"function\") {\n throw new SDKUsageError(`Tensorlake handler '${definition.name}' must be async and return a Promise`);\n }\n const output = await result;\n if (isTailCall(output)) {\n return output as TailCall<T>;\n }\n validateWithSchema(definition.returns, output, `${definition.name} return value`);\n return output as T;\n}\n\nexport function isTailCall(value: unknown): value is TailCall<unknown> {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Partial<TailCall<unknown>>;\n return candidate[TAIL_CALL_BRAND] === true\n && candidate.kind === \"tensorlake-tail-call\"\n && typeof candidate.definition === \"object\"\n && candidate.definition != null\n && Array.isArray(candidate.args);\n}\n\nfunction createRegisteredFunction<Args extends readonly unknown[], Result>(\n definition: RegisteredDefinition,\n): RegisteredFunction<Args, Result> {\n const callable = ((...args: Args): Promise<Result> => {\n const runtime = currentFunctionRuntime();\n return runtime == null\n ? executeHandler<Result>(definition, args)\n : runtime.invoke<Result>(definition, args);\n }) as RegisteredFunction<Args, Result>;\n Object.defineProperties(callable, {\n definition: { value: definition, enumerable: true },\n future: { value: (...args: Args) => new FunctionFuture<Result>(definition, args) },\n map: {\n value: (items: AwaitableIterable<Args[0]>) => {\n // Resolve inputs before assigning durable IDs. Awaiting each input inside\n // the invocation loop would make call order depend on promise timing,\n // allowing strict replay to associate a recorded result with a different\n // input while still matching the durable event sequence.\n const completion = (async () => {\n const resolvedItems = await resolveAwaitableIterable(items);\n return internalPromiseAll(\n resolvedItems.map((item) =>\n internalAwaitable(callable(...([item] as unknown as Args)))\n ),\n );\n })();\n return wrapDurableAggregate(completion);\n },\n },\n reduce: {\n value: (\n items: AwaitableIterable<Args[1]>,\n ...initialValues: [] | [Args[0]]\n ) => {\n const completion = (async () => {\n let values = await resolveAwaitableIterable(items);\n const hasInitial = initialValues.length > 0;\n let initial: unknown = initialValues[0];\n const runtime = currentFunctionRuntime();\n if (runtime != null) {\n return internalAwaitable(\n runtime.reduce<Result>(definition, values, initial, hasInitial),\n );\n }\n if (!hasInitial) {\n if (values.length === 0) {\n throw new SDKUsageError(\"reduce of empty iterable with no initial value\");\n }\n [initial, ...values] = values;\n }\n let accumulator = initial as Result | Args[0];\n for (const item of values) {\n accumulator = await internalAwaitable(\n callable(...([accumulator, item] as unknown as Args)),\n );\n }\n return accumulator as Result;\n })();\n return wrapDurableAggregate(completion);\n },\n },\n tailCall: {\n value: (...args: Args): TailCall<Result> => ({\n [TAIL_CALL_BRAND]: true,\n kind: \"tensorlake-tail-call\",\n definition,\n args,\n }),\n },\n });\n return callable;\n}\n\nfunction register<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: FunctionOptions<P, Result> | ApplicationOptions<P, Result>,\n application: boolean,\n): RegisteredFunction<ParameterValues<P>, Result> {\n const name = options.name ?? handler.name;\n if (!name) throw new SDKUsageError(\"Anonymous Tensorlake handlers require an explicit name\");\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) throw new SDKUsageError(`Invalid Tensorlake function name '${name}'`);\n let applicationRetries: Retries | undefined;\n if (application) {\n const appOptions = options as ApplicationOptions<P, Result>;\n applicationRetries = retries(appOptions.applicationRetries ?? { maxRetries: 0 });\n if (\n appOptions.allow != null\n && (\n !Array.isArray(appOptions.allow)\n || appOptions.allow.some((capability) =>\n capability !== \"unauthenticated_requests\"\n )\n )\n ) {\n throw new SDKUsageError(\n \"Application allow must contain only 'unauthenticated_requests'\",\n );\n }\n const tags = appOptions.tags;\n const tagsPrototype = tags == null || typeof tags !== \"object\"\n ? undefined\n : Object.getPrototypeOf(tags);\n if (\n tags != null\n && (\n typeof tags !== \"object\"\n || Array.isArray(tags)\n || (tagsPrototype !== Object.prototype && tagsPrototype !== null)\n || Reflect.ownKeys(tags).some((key) =>\n typeof key !== \"string\"\n || !key\n || typeof (tags as Record<PropertyKey, unknown>)[key] !== \"string\"\n )\n )\n ) {\n throw new SDKUsageError(\"Application tags require non-empty string keys and string values\");\n }\n }\n if (!Array.isArray(options.parameters)) {\n throw new SDKUsageError(\"Tensorlake registration parameters must be an array\");\n }\n if (\n typeof options.returns !== \"object\"\n || options.returns == null\n || typeof options.returns.jsonSchema !== \"object\"\n || options.returns.jsonSchema == null\n ) {\n throw new SDKUsageError(\"Tensorlake registration returns must be a schema\");\n }\n const parameterNames = new Set<string>();\n for (const parameter of options.parameters) {\n if (\n typeof parameter !== \"object\"\n || parameter == null\n || typeof parameter.name !== \"string\"\n || typeof parameter.schema !== \"object\"\n || parameter.schema == null\n || typeof parameter.schema.jsonSchema !== \"object\"\n || parameter.schema.jsonSchema == null\n || typeof parameter.required !== \"boolean\"\n || typeof parameter.hasDefault !== \"boolean\"\n ) {\n throw new SDKUsageError(\n \"Tensorlake registration parameters must be created with schema.parameter()\",\n );\n }\n if (parameterNames.has(parameter.name)) {\n throw new SDKUsageError(`Duplicate Tensorlake parameter name '${parameter.name}'`);\n }\n parameterNames.add(parameter.name);\n }\n const httpBodyParameter = options.parameters.find(\n (parameter) => parameter.schema._httpBody,\n );\n if (httpBodyParameter != null && !application) {\n throw new SDKUsageError(\n \"HttpBody is only supported for application parameters\",\n );\n }\n if (options.returns._httpBody) {\n throw new SDKUsageError(\n \"HttpBody is only supported for application parameters; \"\n + \"use schema.file() or a JSON-compatible return schema instead\",\n );\n }\n const definition: RegisteredDefinition = {\n name,\n handler: handler as (...args: unknown[]) => Promise<unknown>,\n parameters: [...options.parameters],\n returns: options.returns as Schema<unknown>,\n options: normalizeOptions(options as FunctionOptions<readonly Parameter<unknown>[], unknown>),\n application: application\n ? {\n tags: { ...((options as ApplicationOptions<P, Result>).tags ?? {}) },\n retries: applicationRetries as Retries,\n allow: [...((options as ApplicationOptions<P, Result>).allow ?? [])],\n version: randomUUID().replaceAll(\"-\", \"\"),\n }\n : undefined,\n };\n registerDefinition(definition, application);\n return createRegisteredFunction(definition);\n}\n\ntype SimpleResult<Output> = Output extends TailCall<infer Result> ? Result : Output;\ntype RuntimeHandler = (...args: never[]) => Promise<unknown>;\n\nfunction hasExplicitSchemas(\n value: unknown,\n): value is FunctionOptions<readonly Parameter<unknown>[], unknown> {\n if (typeof value !== \"object\" || value == null) return false;\n const hasParameters = Object.prototype.hasOwnProperty.call(value, \"parameters\");\n const hasReturns = Object.prototype.hasOwnProperty.call(value, \"returns\");\n if (hasParameters !== hasReturns) {\n throw new SDKUsageError(\"Tensorlake registrations must specify both parameters and returns\");\n }\n return hasParameters;\n}\n\nfunction skipJavaScriptLiteral(source: string, start: number): number {\n const quote = source[start];\n let escaped = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n if (escaped) {\n escaped = false;\n } else if (character === \"\\\\\") {\n escaped = true;\n } else if (character === quote) {\n return index;\n }\n }\n return source.length - 1;\n}\n\nfunction skipJavaScriptComment(source: string, start: number): number | undefined {\n if (source[start] !== \"/\") return undefined;\n if (source[start + 1] === \"/\") {\n const newline = source.indexOf(\"\\n\", start + 2);\n return newline < 0 ? source.length - 1 : newline;\n }\n if (source[start + 1] === \"*\") {\n const end = source.indexOf(\"*/\", start + 2);\n return end < 0 ? source.length - 1 : end + 1;\n }\n return undefined;\n}\n\nfunction skipJavaScriptTrivia(source: string, start: number): number {\n let index = start;\n while (index < source.length) {\n while (index < source.length && /\\s/.test(source[index])) index += 1;\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd == null) break;\n index = commentEnd + 1;\n }\n return index;\n}\n\nconst REGEX_PREFIX_KEYWORDS = new Set([\n \"await\",\n \"case\",\n \"delete\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"return\",\n \"throw\",\n \"typeof\",\n \"void\",\n \"yield\",\n]);\n\nfunction regexLiteralStartsAt(source: string, start: number): boolean {\n let expectsExpression = true;\n for (let index = 0; index < start; index += 1) {\n const character = source[index];\n if (/\\s/.test(character)) continue;\n if (character === \"\\\"\" || character === \"'\" || character === \"`\") {\n index = skipJavaScriptLiteral(source, index);\n expectsExpression = false;\n continue;\n }\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd != null) {\n index = commentEnd;\n continue;\n }\n if (/[A-Za-z_$]/.test(character)) {\n let tokenEnd = index + 1;\n while (tokenEnd < start && /[A-Za-z0-9_$]/.test(source[tokenEnd])) tokenEnd += 1;\n expectsExpression = REGEX_PREFIX_KEYWORDS.has(source.slice(index, tokenEnd));\n index = tokenEnd - 1;\n continue;\n }\n if (/[0-9]/.test(character) || (character === \".\" && /[0-9]/.test(source[index + 1]))) {\n while (index + 1 < start && /[A-Za-z0-9_.]/.test(source[index + 1])) index += 1;\n expectsExpression = false;\n continue;\n }\n if (character === \"/\") {\n if (expectsExpression) {\n index = skipJavaScriptRegex(source, index);\n expectsExpression = false;\n } else {\n if (source[index + 1] === \"=\") index += 1;\n expectsExpression = true;\n }\n continue;\n }\n if (character === \")\" || character === \"]\" || character === \"}\") {\n expectsExpression = false;\n continue;\n }\n if (character === \".\") {\n if (source.slice(index, index + 3) === \"...\") {\n index += 2;\n expectsExpression = true;\n } else {\n expectsExpression = false;\n }\n continue;\n }\n if ((character === \"+\" || character === \"-\") && source[index + 1] === character) {\n index += 1;\n continue;\n }\n expectsExpression = true;\n }\n return expectsExpression;\n}\n\nfunction skipJavaScriptRegex(source: string, start: number): number {\n let escaped = false;\n let characterClass = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n if (escaped) {\n escaped = false;\n } else if (character === \"\\\\\") {\n escaped = true;\n } else if (character === \"[\") {\n characterClass = true;\n } else if (character === \"]\") {\n characterClass = false;\n } else if (character === \"/\" && !characterClass) {\n while (index + 1 < source.length && /[A-Za-z]/.test(source[index + 1])) index += 1;\n return index;\n }\n }\n return source.length - 1;\n}\n\nfunction skipJavaScriptValue(source: string, index: number): number | undefined {\n const character = source[index];\n if (character === \"\\\"\" || character === \"'\" || character === \"`\") {\n return skipJavaScriptLiteral(source, index);\n }\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd != null) return commentEnd;\n if (character === \"/\" && regexLiteralStartsAt(source, index)) {\n return skipJavaScriptRegex(source, index);\n }\n return undefined;\n}\n\nfunction findTopLevelArrow(source: string): number {\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length - 1; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") {\n // A top-level block before an arrow is a classic function or method\n // body. Its nested arrows cannot describe the handler parameters.\n if (parentheses === 0 && brackets === 0 && braces === 0) return -1;\n braces += 1;\n }\n else if (character === \"}\") braces -= 1;\n else if (character === \"=\" && source[index + 1] === \">\" && parentheses === 0 && brackets === 0 && braces === 0) {\n return index;\n }\n }\n return -1;\n}\n\nfunction findClosingParenthesis(source: string, open: number): number {\n let depth = 0;\n for (let index = open; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") depth += 1;\n else if (character === \")\" && --depth === 0) return index;\n }\n return -1;\n}\n\nfunction findOpeningParenthesis(source: string): number {\n for (let index = 0; index < source.length; index += 1) {\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (source[index] === \"(\") return index;\n }\n return -1;\n}\n\nfunction splitTopLevelParameters(source: string): string[] {\n if (source.trim() === \"\") return [];\n const result: string[] = [];\n let start = 0;\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") braces += 1;\n else if (character === \"}\") braces -= 1;\n else if (character === \",\" && parentheses === 0 && brackets === 0 && braces === 0) {\n result.push(source.slice(start, index).trim());\n start = index + 1;\n }\n }\n const final = source.slice(start).trim();\n if (final !== \"\") result.push(final);\n return result;\n}\n\nfunction hasTopLevelDefault(source: string): boolean {\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") braces += 1;\n else if (character === \"}\") braces -= 1;\n else if (character === \"=\" && parentheses === 0 && brackets === 0 && braces === 0) return true;\n }\n return false;\n}\n\nfunction declaredHandlerParameters(handler: RuntimeHandler): string[] {\n const source = Function.prototype.toString.call(handler).trim();\n if (source.includes(\"[native code]\")) {\n throw new SDKUsageError(\"Schema-free registration cannot inspect a native or bound handler; specify parameters and returns\");\n }\n const arrow = findTopLevelArrow(source);\n if (arrow >= 0) {\n let header = source.slice(0, arrow).trim();\n if (\n header.startsWith(\"async\")\n && !/[A-Za-z0-9_$]/.test(header[\"async\".length] ?? \"\")\n ) {\n header = header.slice(skipJavaScriptTrivia(header, \"async\".length));\n }\n if (!header.startsWith(\"(\")) return [header];\n const close = findClosingParenthesis(header, 0);\n if (close < 0) throw new SDKUsageError(\"Schema-free registration could not inspect handler parameters\");\n return splitTopLevelParameters(header.slice(1, close));\n }\n const open = findOpeningParenthesis(source);\n const close = open < 0 ? -1 : findClosingParenthesis(source, open);\n if (open < 0 || close < 0) {\n throw new SDKUsageError(\"Schema-free registration could not inspect handler parameters\");\n }\n return splitTopLevelParameters(source.slice(open + 1, close));\n}\n\nfunction inferredJSONParameters(handler: RuntimeHandler): readonly Parameter<unknown>[] {\n const parameters = declaredHandlerParameters(handler);\n if (parameters.some((parameter) => {\n let index = 0;\n while (index < parameter.length) {\n while (index < parameter.length && /\\s/.test(parameter[index])) index += 1;\n const commentEnd = skipJavaScriptComment(parameter, index);\n if (commentEnd == null) break;\n index = commentEnd + 1;\n }\n return parameter.slice(index).startsWith(\"...\");\n })) {\n throw new SDKUsageError(\n \"Schema-free registration does not support rest parameters; specify explicit parameters and returns\",\n );\n }\n return parameters.map((parameter, index) => schema.parameter(\n parameters.length === 1 ? \"input\" : `arg${index}`,\n schema.json(),\n hasTopLevelDefault(parameter) ? { optional: true } : {},\n ));\n}\n\nfunction registerWithDefaults(\n name: string,\n handler: RuntimeHandler,\n options: SimpleFunctionOptions | SimpleApplicationOptions,\n application: boolean,\n): RegisteredFunction<readonly unknown[], unknown> {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n {\n ...options,\n name,\n parameters: inferredJSONParameters(handler),\n returns: schema.json(),\n },\n application,\n );\n}\n\nexport function registerFunction<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: FunctionOptions<P, Result>,\n): RegisteredFunction<ParameterValues<P>, Result>;\n\nexport function registerFunction<\n const Args extends readonly unknown[],\n Output,\n>(\n name: string,\n handler: (...args: Args) => Promise<Output>,\n options?: SimpleFunctionOptions,\n): RegisteredFunction<Args, SimpleResult<Output>>;\nexport function registerFunction(\n handlerOrName: unknown,\n handlerOrOptions?: unknown,\n options: SimpleFunctionOptions = {},\n): RegisteredFunction<readonly unknown[], unknown> {\n if (typeof handlerOrName === \"string\") {\n if (typeof handlerOrOptions !== \"function\") {\n throw new SDKUsageError(\"registerFunction(name, handler) requires an async handler\");\n }\n return registerWithDefaults(\n handlerOrName,\n handlerOrOptions as RuntimeHandler,\n options,\n false,\n );\n }\n if (typeof handlerOrName !== \"function\") {\n throw new SDKUsageError(\"registerFunction requires an async handler\");\n }\n const handler = handlerOrName as RuntimeHandler;\n if (typeof handlerOrOptions === \"function\") {\n throw new SDKUsageError(\"registerFunction received an unexpected second handler\");\n }\n if (hasExplicitSchemas(handlerOrOptions)) {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n handlerOrOptions,\n false,\n );\n }\n throw new SDKUsageError(\n \"Schema-free functions require an explicit stable name: registerFunction(name, handler)\",\n );\n}\n\nexport function registerApplication<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: ApplicationOptions<P, Result>,\n): RegisteredFunction<ParameterValues<P>, Result>;\nexport function registerApplication<\n const Args extends readonly unknown[],\n Output,\n>(\n name: string,\n handler: (...args: Args) => Promise<Output>,\n options?: SimpleApplicationOptions,\n): RegisteredFunction<Args, SimpleResult<Output>>;\nexport function registerApplication(\n handlerOrName: unknown,\n handlerOrOptions?: unknown,\n options: SimpleApplicationOptions = {},\n): RegisteredFunction<readonly unknown[], unknown> {\n if (typeof handlerOrName === \"string\") {\n if (typeof handlerOrOptions !== \"function\") {\n throw new SDKUsageError(\"registerApplication(name, handler) requires an async handler\");\n }\n return registerWithDefaults(\n handlerOrName,\n handlerOrOptions as RuntimeHandler,\n options,\n true,\n );\n }\n if (typeof handlerOrName !== \"function\") {\n throw new SDKUsageError(\"registerApplication requires an async handler\");\n }\n const handler = handlerOrName as RuntimeHandler;\n if (typeof handlerOrOptions === \"function\") {\n throw new SDKUsageError(\"registerApplication received an unexpected second handler\");\n }\n if (hasExplicitSchemas(handlerOrOptions)) {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n handlerOrOptions,\n true,\n );\n }\n throw new SDKUsageError(\n \"Schema-free applications require an explicit stable name: registerApplication(name, handler)\",\n );\n}\n","const SDK_USAGE_ERROR_BRAND = Symbol.for(\"tensorlake.applications.sdk-usage-error.v1\");\nconst REQUEST_ERROR_BRAND = Symbol.for(\"tensorlake.applications.request-error.v1\");\nconst FUNCTION_ERROR_BRAND = Symbol.for(\"tensorlake.applications.function-error.v1\");\nconst TIMEOUT_ERROR_BRAND = Symbol.for(\"tensorlake.applications.timeout-error.v1\");\n\nexport class TensorlakeApplicationError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"TensorlakeApplicationError\";\n }\n}\n\nexport class SDKUsageError extends TensorlakeApplicationError {\n readonly [SDK_USAGE_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== SDKUsageError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isSDKUsageError(value);\n }\n\n constructor(message: string) {\n super(message);\n this.name = \"SDKUsageError\";\n }\n}\n\n/** Recognizes SDKUsageError instances thrown by independently bundled SDK copies. */\nfunction isSDKUsageError(value: unknown): value is SDKUsageError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[SDK_USAGE_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class SerializationError extends TensorlakeApplicationError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"SerializationError\";\n }\n}\n\nexport class DeserializationError extends TensorlakeApplicationError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"DeserializationError\";\n }\n}\n\nexport class FunctionError extends TensorlakeApplicationError {\n readonly [FUNCTION_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== FunctionError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isFunctionError(value);\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"FunctionError\";\n }\n}\n\nexport class TimeoutError extends TensorlakeApplicationError {\n readonly [TIMEOUT_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== TimeoutError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isTimeoutError(value);\n }\n\n constructor() {\n super(\"Timed out.\");\n this.name = \"TimeoutError\";\n }\n}\n\n/** Recognizes TimeoutError instances thrown by independently bundled SDK copies. */\nfunction isTimeoutError(value: unknown): value is TimeoutError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[TIMEOUT_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\n/** Recognizes FunctionError instances thrown by independently bundled SDK copies. */\nfunction isFunctionError(value: unknown): value is FunctionError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[FUNCTION_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class RequestError extends TensorlakeApplicationError {\n readonly [REQUEST_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== RequestError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isRequestError(value);\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** Recognizes RequestError instances thrown by independently bundled SDK copies. */\nexport function isRequestError(value: unknown): value is RequestError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[REQUEST_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class ReplayMismatchError extends TensorlakeApplicationError {\n constructor(message = \"Function execution diverged from its durable event history\") {\n super(message);\n this.name = \"ReplayMismatchError\";\n }\n}\n","import Ajv, { type ValidateFunction } from \"ajv\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport { File, isFile } from \"./file.js\";\nimport { HttpBody, isHttpBody } from \"./http-body.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\nexport type JSONSchema = Record<string, unknown>;\n\nconst TYPE = Symbol(\"tensorlake.schema.type\");\n// SDK-generated schemas use JSON Schema 2020-12 features such as prefixItems.\n// Validate with the same dialect that we emit into application manifests so\n// local/executor checks cannot silently accept values the public schema rejects.\nconst ajvDraft7 = new Ajv({ allErrors: true, strict: false });\nconst ajv2020 = new Ajv2020({ allErrors: true, strict: false });\n\nexport interface Schema<T> {\n readonly jsonSchema: JSONSchema;\n readonly [TYPE]?: T;\n readonly _file?: boolean;\n readonly _httpBody?: boolean;\n}\n\nexport type Infer<S extends Schema<unknown>> = S extends Schema<infer T> ? T : never;\n\nexport interface ParameterOptions<T> {\n description?: string;\n optional?: boolean;\n default?: T;\n}\n\nexport interface Parameter<T> {\n readonly name: string;\n readonly schema: Schema<T>;\n readonly description?: string;\n readonly required: boolean;\n readonly hasDefault: boolean;\n readonly defaultValue?: T;\n}\n\nexport type ParameterValues<P extends readonly Parameter<unknown>[]> = {\n [K in keyof P]: P[K] extends Parameter<infer T> ? T : never;\n};\n\nfunction snapshotJSONValue(\n value: unknown,\n label: string,\n ancestors: Set<object>,\n freeze: boolean,\n): unknown {\n if (\n value == null\n || typeof value === \"string\"\n || typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new SDKUsageError(`${label} contains a non-finite number`);\n }\n return value;\n }\n if (typeof value !== \"object\") {\n throw new SDKUsageError(`${label} contains unsupported ${typeof value}`);\n }\n if (ancestors.has(value)) {\n throw new SDKUsageError(`${label} contains a cycle`);\n }\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) {\n throw new SDKUsageError(\n `${label} contains unsupported ${value.constructor?.name ?? \"object\"}`,\n );\n }\n\n ancestors.add(value);\n let result: unknown[] | Record<string, unknown>;\n if (Array.isArray(value)) {\n result = [];\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n throw new SDKUsageError(`${label} contains a sparse array entry at index ${index}`);\n }\n result.push(snapshotJSONValue(\n value[index],\n `${label}[${index}]`,\n ancestors,\n freeze,\n ));\n }\n } else {\n result = Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n snapshotJSONValue(item, `${label}.${key}`, ancestors, freeze),\n ]),\n );\n }\n ancestors.delete(value);\n return freeze ? Object.freeze(result) : result;\n}\n\nfunction snapshotJSONSchema(jsonSchema: JSONSchema): JSONSchema {\n return snapshotJSONValue(\n jsonSchema,\n \"JSON schema\",\n new Set(),\n true,\n ) as JSONSchema;\n}\n\nfunction snapshotDefault<T>(valueSchema: Schema<T>, value: T): T {\n if (valueSchema._file) {\n if (!isFile(value)) {\n throw new SDKUsageError(\"parameter default must be a Tensorlake File\");\n }\n return new File(new Uint8Array(value.content), value.contentType) as T;\n }\n if (valueSchema._httpBody) {\n if (!isHttpBody(value)) {\n throw new SDKUsageError(\"parameter default must be a Tensorlake HttpBody\");\n }\n return new HttpBody(new Uint8Array(value.content), value.contentType) as T;\n }\n return snapshotJSONValue(\n value,\n \"parameter default\",\n new Set(),\n false,\n ) as T;\n}\n\nfunction makeSchema<T>(\n jsonSchema: JSONSchema,\n rawBody?: \"file\" | \"httpBody\",\n): Schema<T> {\n return Object.freeze({\n jsonSchema: snapshotJSONSchema(jsonSchema),\n _file: rawBody === \"file\",\n _httpBody: rawBody === \"httpBody\",\n });\n}\n\nfunction rejectRawBodyComposition(\n operation: string,\n values: readonly Schema<unknown>[],\n): void {\n const rawBody = values.find((value) => value._file || value._httpBody);\n if (rawBody != null) {\n const factory = rawBody._httpBody ? \"httpBody\" : \"file\";\n const type = rawBody._httpBody ? \"HttpBody\" : \"File\";\n const supportedPosition = rawBody._httpBody\n ? \"as a direct application parameter\"\n : \"as a direct parameter or return value\";\n throw new SDKUsageError(\n `schema.${operation} cannot contain schema.${factory}(); ${type} is only supported`\n + ` ${supportedPosition}`,\n );\n }\n}\n\nfunction parameter<T>(\n name: string,\n valueSchema: Schema<T>,\n options: ParameterOptions<T> = {},\n): Parameter<T> {\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) {\n throw new SDKUsageError(`Invalid parameter name '${name}'`);\n }\n const hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n if (hasDefault) validateWithSchema(valueSchema, options.default, `default for '${name}'`);\n const defaultSnapshot = hasDefault\n ? snapshotDefault(valueSchema, options.default as T)\n : undefined;\n return Object.freeze({\n name,\n schema: valueSchema,\n description: options.description,\n required: options.optional !== true && !hasDefault,\n hasDefault,\n // Defaults cross two public boundaries: callers can inspect the registered\n // definition, and every invocation receives the default when an argument is\n // omitted. Return a fresh boundary copy so neither path can mutate the\n // registration snapshot, later invocations, or generated manifests.\n get defaultValue(): T | undefined {\n return hasDefault\n ? snapshotDefault(valueSchema, defaultSnapshot as T)\n : undefined;\n },\n });\n}\n\nexport const schema = {\n /** Any JSON-serializable value. Useful when strict runtime validation is not needed. */\n json: <T = unknown>() => makeSchema<T>({}),\n string: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<string>({ ...options, type: \"string\" }),\n number: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<number>({ ...options, type: \"number\" }),\n integer: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<number>({ ...options, type: \"integer\" }),\n boolean: () => makeSchema<boolean>({ type: \"boolean\" }),\n null: () => makeSchema<null>({ type: \"null\" }),\n literal: <T extends string | number | boolean | null>(value: T) =>\n makeSchema<T>({ const: value }),\n enum: <const T extends readonly (string | number)[]>(values: T) =>\n makeSchema<T[number]>({ enum: [...values] }),\n array: <S extends Schema<unknown>>(item: S, options: Omit<JSONSchema, \"type\" | \"items\"> = {}) => {\n rejectRawBodyComposition(\"array\", [item]);\n return makeSchema<Infer<S>[]>({ ...options, type: \"array\", items: item.jsonSchema });\n },\n tuple: <const S extends readonly Schema<unknown>[]>(items: S) => {\n rejectRawBodyComposition(\"tuple\", items);\n return makeSchema<{ [K in keyof S]: S[K] extends Schema<infer T> ? T : never }>({\n type: \"array\",\n prefixItems: items.map((item) => item.jsonSchema),\n minItems: items.length,\n maxItems: items.length,\n });\n },\n record: <S extends Schema<unknown>>(value: S) => {\n rejectRawBodyComposition(\"record\", [value]);\n return makeSchema<Record<string, Infer<S>>>({\n type: \"object\",\n additionalProperties: value.jsonSchema,\n });\n },\n object: <const P extends Record<string, Schema<unknown>>>(properties: P) => {\n rejectRawBodyComposition(\"object\", Object.values(properties));\n return makeSchema<{ [K in keyof P]: P[K] extends Schema<infer T> ? T : never }>({\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(properties).map(([key, item]) => [key, item.jsonSchema]),\n ),\n required: Object.keys(properties),\n additionalProperties: false,\n });\n },\n union: <const S extends readonly Schema<unknown>[]>(...choices: S) => {\n rejectRawBodyComposition(\"union\", choices);\n return makeSchema<Infer<S[number]>>({ anyOf: choices.map((choice) => choice.jsonSchema) });\n },\n nullable: <S extends Schema<unknown>>(value: S) => {\n rejectRawBodyComposition(\"nullable\", [value]);\n return makeSchema<Infer<S> | null>({ anyOf: [value.jsonSchema, { type: \"null\" }] });\n },\n file: () => makeSchema<File>({ type: \"tensorlake_file\" }, \"file\"),\n httpBody: () =>\n makeSchema<HttpBody>({ type: \"tensorlake_http_body\" }, \"httpBody\"),\n custom: <T>(jsonSchema: JSONSchema) => makeSchema<T>({ ...jsonSchema }),\n parameter,\n};\n\ninterface CachedValidator {\n readonly validate: ValidateFunction;\n readonly errorsText: (errors: ValidateFunction[\"errors\"]) => string;\n}\n\nconst validatorCache = new WeakMap<object, CachedValidator>();\n\nfunction compileValidator(jsonSchema: JSONSchema): CachedValidator {\n // Earlier SDK versions validated custom schemas with Ajv's draft-07\n // default. Preserve that behavior for explicitly declared draft-07 schemas\n // while using 2020-12 for SDK-generated schemas and custom schemas without a\n // dialect declaration.\n const dialect = jsonSchema.$schema;\n const engine = typeof dialect === \"string\" && /\\/draft-07\\/schema#?$/.test(dialect)\n ? ajvDraft7\n : ajv2020;\n const validate = engine.compile(jsonSchema);\n return {\n validate,\n errorsText: (errors) => engine.errorsText(errors, { separator: \"; \" }),\n };\n}\n\nexport function validateWithSchema<T>(valueSchema: Schema<T>, value: unknown, label: string): T {\n if (valueSchema._file) {\n if (!isFile(value)) {\n throw new SDKUsageError(`${label} must be a Tensorlake File`);\n }\n return value as T;\n }\n if (valueSchema._httpBody) {\n if (!isHttpBody(value)) {\n throw new SDKUsageError(`${label} must be a Tensorlake HttpBody`);\n }\n return value as T;\n }\n if (isFile(value)) {\n throw new SDKUsageError(`${label} must use schema.file() for a Tensorlake File`);\n }\n if (isHttpBody(value)) {\n throw new SDKUsageError(\n `${label} must use schema.httpBody() for a Tensorlake HttpBody`,\n );\n }\n let cached = validatorCache.get(valueSchema as object);\n if (cached == null) {\n try {\n cached = compileValidator(valueSchema.jsonSchema);\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error);\n throw new SDKUsageError(`${label} uses an invalid JSON schema: ${details}`);\n }\n validatorCache.set(valueSchema as object, cached);\n }\n if (!cached.validate(value)) {\n const details = cached.errorsText(cached.validate.errors);\n throw new SDKUsageError(`${label} does not match its schema: ${details}`);\n }\n return value as T;\n}\n\nexport function parameterJSONSchema(parameter: Parameter<unknown>): JSONSchema {\n const result: JSONSchema = {\n ...parameter.schema.jsonSchema,\n title: parameter.name,\n parameter_kind: \"POSITIONAL_OR_KEYWORD\",\n };\n if (parameter.description != null) result.description = parameter.description;\n if (parameter.hasDefault) {\n result.default = parameter.schema._file || parameter.schema._httpBody\n ? true\n : parameter.defaultValue;\n }\n return result;\n}\n","import { SDKUsageError } from \"./errors.js\";\n\nconst FILE_BRAND = Symbol.for(\"tensorlake.applications.file.v1\");\n\nexport class File {\n readonly [FILE_BRAND] = true;\n readonly content: Uint8Array;\n readonly contentType: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== File) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isFile(value);\n }\n\n constructor(content: Uint8Array | ArrayBuffer, contentType: string) {\n if (!contentType.trim()) {\n throw new SDKUsageError(\"File contentType cannot be empty\");\n }\n this.content = content instanceof Uint8Array ? content : new Uint8Array(content);\n this.contentType = contentType;\n }\n}\n\n/**\n * Recognizes Tensorlake Files across independently bundled SDK copies.\n *\n * Deployed application code and the function executor are separate bundles\n * loaded into one Node process, so their `File` constructors are not\n * referentially equal. The shared brand and `Symbol.hasInstance` keep\n * `instanceof File` useful across that boundary.\n */\nexport function isFile(value: unknown): value is File {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[FILE_BRAND] === true\n && candidate.content instanceof Uint8Array\n && typeof candidate.contentType === \"string\"\n && candidate.contentType.trim().length > 0;\n}\n","const HTTP_BODY_BRAND = Symbol.for(\"tensorlake.applications.http-body.v1\");\n\nexport class HttpBody {\n readonly [HTTP_BODY_BRAND] = true;\n readonly content: Uint8Array;\n readonly contentType?: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== HttpBody) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isHttpBody(value);\n }\n\n constructor(\n content: Uint8Array | ArrayBuffer,\n contentType?: string,\n ) {\n this.content = content instanceof Uint8Array\n ? content\n : new Uint8Array(content);\n this.contentType = contentType;\n }\n\n text(encoding = \"utf-8\"): string {\n return new TextDecoder(encoding, { fatal: true }).decode(this.content);\n }\n\n json<T = unknown>(): T {\n return JSON.parse(this.text()) as T;\n }\n}\n\n/**\n * Recognizes Tensorlake HTTP bodies across independently bundled SDK copies.\n *\n * Deployed application code and the function executor are separate bundles\n * loaded into one Node process, so their `HttpBody` constructors are not\n * referentially equal.\n */\nexport function isHttpBody(value: unknown): value is HttpBody {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[HTTP_BODY_BRAND] === true\n && candidate.content instanceof Uint8Array\n && (\n candidate.contentType === undefined\n || typeof candidate.contentType === \"string\"\n );\n}\n","import type { RegisteredDefinition } from \"./function.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\ninterface RegistryState {\n functions: Map<string, RegisteredDefinition>;\n applications: Map<string, RegisteredDefinition>;\n}\n\nexport interface RegistrySnapshot {\n functions: Map<string, RegisteredDefinition>;\n applications: Map<string, RegisteredDefinition>;\n}\n\nconst REGISTRY_KEY = Symbol.for(\"tensorlake.applications.registry.v1\");\n\nfunction registry(): RegistryState {\n const target = globalThis as typeof globalThis & { [REGISTRY_KEY]?: RegistryState };\n target[REGISTRY_KEY] ??= { functions: new Map(), applications: new Map() };\n return target[REGISTRY_KEY];\n}\n\nexport function registerDefinition(definition: RegisteredDefinition, isApplication: boolean): void {\n const state = registry();\n const existing = state.functions.get(definition.name);\n if (existing != null && existing !== definition) {\n throw new SDKUsageError(`Multiple Tensorlake functions are named '${definition.name}'`);\n }\n state.functions.set(definition.name, definition);\n if (isApplication) {\n const app = state.applications.get(definition.name);\n if (app != null && app !== definition) {\n throw new SDKUsageError(`Multiple Tensorlake applications are named '${definition.name}'`);\n }\n state.applications.set(definition.name, definition);\n }\n}\n\nexport function getFunction(name: string): RegisteredDefinition {\n const result = registry().functions.get(name);\n if (result == null) throw new SDKUsageError(`Tensorlake function '${name}' is not registered`);\n return result;\n}\n\nexport function getFunctions(): RegisteredDefinition[] {\n return [...registry().functions.values()];\n}\n\nexport function getApplications(): RegisteredDefinition[] {\n return [...registry().applications.values()];\n}\n\nexport function snapshotRegistry(): RegistrySnapshot {\n const state = registry();\n return {\n functions: new Map(state.functions),\n applications: new Map(state.applications),\n };\n}\n\nexport function restoreRegistry(snapshot: RegistrySnapshot): void {\n const state = registry();\n state.functions.clear();\n state.applications.clear();\n for (const [name, definition] of snapshot.functions) state.functions.set(name, definition);\n for (const [name, definition] of snapshot.applications) state.applications.set(name, definition);\n}\n\nexport function clearRegistryForTest(): void {\n registry().functions.clear();\n registry().applications.clear();\n}\n","export type HeadersInit =\n | Headers\n | Record<string, string>\n | Iterable<readonly [string, string]>;\n\nconst HEADERS_BRAND = Symbol.for(\"tensorlake.applications.headers.v1\");\n\n/** Immutable, case-insensitive application request headers. */\nexport class Headers implements Iterable<readonly [string, string]> {\n readonly [HEADERS_BRAND] = true;\n readonly #items: readonly (readonly [string, string])[];\n readonly #lookup: ReadonlyMap<string, readonly string[]>;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== Headers) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isHeaders(value);\n }\n\n constructor(headers: HeadersInit = []) {\n const entries = headers instanceof Headers\n ? [...headers]\n : Symbol.iterator in Object(headers)\n ? [...headers as Iterable<readonly [string, string]>]\n : Object.entries(headers);\n const lookup = new Map<string, string[]>();\n this.#items = Object.freeze(entries.map(([name, value]) => {\n if (typeof name !== \"string\" || typeof value !== \"string\") {\n throw new TypeError(\"Headers require string names and values\");\n }\n const item = Object.freeze([name, value] as const);\n const key = name.toLowerCase();\n lookup.set(key, [...(lookup.get(key) ?? []), value]);\n return item;\n }));\n this.#lookup = lookup;\n Object.freeze(this);\n }\n\n get(name: string): string | undefined {\n return this.#lookup.get(name.toLowerCase())?.at(-1);\n }\n\n getAll(name: string): readonly string[] {\n return Object.freeze([...(this.#lookup.get(name.toLowerCase()) ?? [])]);\n }\n\n has(name: string): boolean {\n return this.#lookup.has(name.toLowerCase());\n }\n\n entries(): IterableIterator<readonly [string, string]> {\n return this.#items[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<readonly [string, string]> {\n return this.entries();\n }\n}\n\n/** Recognizes immutable request headers across independently bundled SDK copies. */\nexport function isHeaders(value: unknown): value is Headers {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[HEADERS_BRAND] === true\n && typeof candidate.get === \"function\"\n && typeof candidate.getAll === \"function\"\n && typeof candidate.has === \"function\"\n && typeof candidate[Symbol.iterator] === \"function\";\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { SDKUsageError } from \"./errors.js\";\nimport { Headers, type HeadersInit } from \"./headers.js\";\nimport { deserializeJSON, serializeValue } from \"./serialization.js\";\n\nexport interface ProgressOptions {\n message?: string;\n attributes?: Record<string, string>;\n}\n\nexport interface RequestState {\n set(key: string, value: unknown): Promise<void>;\n get<T>(key: string, defaultValue?: T): Promise<T | undefined>;\n}\n\nexport interface RequestMetrics {\n timer(name: string, value: number): Promise<void>;\n counter(name: string, value?: number): Promise<void>;\n}\n\nexport interface FunctionProgress {\n update(current: number, total: number, options?: ProgressOptions): Promise<void>;\n}\n\nexport function validateRequestStateKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\") {\n throw new SDKUsageError(`State key must be a string, got: ${String(key)}`);\n }\n}\n\nexport function serializeRequestStateValue(value: unknown): Uint8Array {\n const serialized = serializeValue(value);\n if (serialized.encoding !== \"json\") {\n throw new SDKUsageError(\"Request state values must be JSON values\");\n }\n return serialized.data;\n}\n\nexport function validateCounterMetric(name: unknown, value: unknown): void {\n if (typeof name !== \"string\") {\n throw new SDKUsageError(`Counter name must be a string, got: ${String(name)}`);\n }\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new SDKUsageError(`Counter value must be an int, got: ${String(value)}`);\n }\n if (!Number.isSafeInteger(value)) {\n throw new SDKUsageError(`Counter value must be a safe int, got: ${String(value)}`);\n }\n}\n\nexport function validateTimerMetric(name: unknown, value: unknown): void {\n if (typeof name !== \"string\") {\n throw new SDKUsageError(`Timer name must be a string, got: ${String(name)}`);\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new SDKUsageError(`Timer value must be a finite number, got: ${String(value)}`);\n }\n}\n\nfunction isPlainRecord(value: unknown): value is Record<PropertyKey, unknown> {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function validateProgressUpdate(\n current: number,\n total: number,\n options?: ProgressOptions,\n): void {\n if (!Number.isFinite(current) || !Number.isFinite(total) || total < 0 || current < 0) {\n throw new SDKUsageError(\"Progress current and total must be non-negative finite numbers\");\n }\n if (options != null && !isPlainRecord(options)) {\n throw new SDKUsageError(\"Progress options must be an object\");\n }\n if (options?.message != null && typeof options.message !== \"string\") {\n throw new SDKUsageError(\"Progress message must be a string\");\n }\n if (options?.attributes != null) {\n if (!isPlainRecord(options.attributes)) {\n throw new SDKUsageError(\"Progress attributes must be an object of string key/value pairs\");\n }\n for (const key of Reflect.ownKeys(options.attributes)) {\n if (typeof key !== \"string\") {\n throw new SDKUsageError(\"Progress attributes must contain only string keys and values\");\n }\n const value = options.attributes[key];\n if (typeof value !== \"string\") {\n throw new SDKUsageError(\"Progress attributes must contain only string keys and values\");\n }\n }\n }\n}\n\nexport interface RequestContextValue {\n readonly requestId: string;\n readonly headers: Headers;\n readonly signal: AbortSignal;\n readonly state: RequestState;\n readonly metrics: RequestMetrics;\n readonly progress: FunctionProgress;\n}\n\n// A deployed application bundle contains its own copy of the applications SDK,\n// while the function executor has another copy in its runtime capsule. Both\n// copies execute in the same Node process and must observe the same context.\n// Symbol.for keeps the AsyncLocalStorage process-global without exposing it as\n// public API or coupling the application bundle to the executor package.\nconst REQUEST_CONTEXT_STORAGE_KEY = Symbol.for(\n \"tensorlake.applications.request-context-storage.v1\",\n);\n\nfunction requestContextStorage(): AsyncLocalStorage<RequestContextValue> {\n const target = globalThis as typeof globalThis & {\n [REQUEST_CONTEXT_STORAGE_KEY]?: AsyncLocalStorage<RequestContextValue>;\n };\n target[REQUEST_CONTEXT_STORAGE_KEY] ??= new AsyncLocalStorage<RequestContextValue>();\n return target[REQUEST_CONTEXT_STORAGE_KEY];\n}\n\nexport class RequestContext {\n static get(): RequestContextValue {\n const context = requestContextStorage().getStore();\n if (context == null) {\n throw new SDKUsageError(\"RequestContext.get() can only be called from a running Tensorlake function\");\n }\n return context;\n }\n}\n\nexport function runWithRequestContext<T>(\n context: RequestContextValue,\n callback: () => Promise<T>,\n): Promise<T> {\n return requestContextStorage().run(context, callback);\n}\n\nexport async function waitWithAbortSignal<T>(\n value: Promise<T>,\n signal: AbortSignal,\n): Promise<T> {\n if (signal.aborted) throw signal.reason;\n let onAbort: (() => void) | undefined;\n try {\n return await Promise.race([\n value,\n new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }),\n ]);\n } finally {\n if (onAbort != null) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nexport class MemoryRequestContext implements RequestContextValue {\n readonly headers: Headers;\n readonly signal: AbortSignal;\n private readonly values = new Map<string, Uint8Array>();\n private readonly counters = new Map<string, number>();\n private readonly timers = new Map<string, number[]>();\n private lastProgress?: { current: number; total: number; options?: ProgressOptions };\n\n constructor(\n readonly requestId: string,\n options: { signal?: AbortSignal; headers?: HeadersInit } = {},\n ) {\n this.headers = new Headers(options.headers);\n this.signal = options.signal ?? new AbortController().signal;\n }\n\n readonly state: RequestState = {\n set: async (key, value) => {\n validateRequestStateKey(key);\n this.values.set(key, serializeRequestStateValue(value).slice());\n },\n get: async <T>(key: string, defaultValue?: T) => {\n validateRequestStateKey(key);\n const value = this.values.get(key);\n return value == null ? defaultValue : deserializeJSON(value) as T;\n },\n };\n\n readonly metrics: RequestMetrics = {\n counter: async (name, value = 1) => {\n validateCounterMetric(name, value);\n this.counters.set(name, (this.counters.get(name) ?? 0) + value);\n },\n timer: async (name, value) => {\n validateTimerMetric(name, value);\n const values = this.timers.get(name) ?? [];\n values.push(value);\n this.timers.set(name, values);\n },\n };\n\n readonly progress: FunctionProgress = {\n update: async (current, total, options) => {\n validateProgressUpdate(current, total, options);\n this.lastProgress = { current, total, options };\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { DeserializationError, SerializationError } from \"./errors.js\";\nimport { isFile } from \"./file.js\";\nimport { isHttpBody } from \"./http-body.js\";\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\nexport interface SerializedValue {\n data: Uint8Array;\n contentType: string;\n encoding: \"json\" | \"raw\";\n}\n\nfunction assertJSONValue(value: unknown, path: string, seen: Set<object>): void {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SerializationError(`${path} contains a non-finite number`);\n return;\n }\n if (typeof value !== \"object\") {\n throw new SerializationError(`${path} contains unsupported ${typeof value}`);\n }\n if (isFile(value)) {\n throw new SerializationError(`${path} contains a nested File; File is only supported as a direct value`);\n }\n if (isHttpBody(value)) {\n throw new SerializationError(\n `${path} contains a nested HttpBody; HttpBody is only supported as a direct value`,\n );\n }\n if (seen.has(value)) throw new SerializationError(`${path} contains a cycle`);\n if (Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {\n throw new SerializationError(`${path} contains unsupported ${value.constructor?.name ?? \"object\"}`);\n }\n seen.add(value);\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n throw new SerializationError(`${path} contains a sparse array entry at index ${index}`);\n }\n assertJSONValue(value[index], `${path}[${index}]`, seen);\n }\n } else {\n for (const [key, item] of Object.entries(value)) {\n assertJSONValue(item, `${path}.${key}`, seen);\n }\n }\n seen.delete(value);\n}\n\nexport function serializeValue(value: unknown): SerializedValue {\n if (isFile(value)) {\n return { data: value.content, contentType: value.contentType, encoding: \"raw\" };\n }\n if (isHttpBody(value)) {\n return {\n data: value.content,\n contentType: value.contentType ?? \"\",\n encoding: \"raw\",\n };\n }\n try {\n assertJSONValue(value, \"value\", new Set());\n return {\n data: textEncoder.encode(JSON.stringify(value)),\n contentType: \"application/json; charset=UTF-8\",\n encoding: \"json\",\n };\n } catch (error) {\n if (error instanceof SerializationError) throw error;\n throw new SerializationError(\"Failed to serialize JSON value\", { cause: error });\n }\n}\n\nexport function deserializeJSON(data: Uint8Array): unknown {\n try {\n return JSON.parse(textDecoder.decode(data));\n } catch (error) {\n throw new DeserializationError(\"Failed to deserialize JSON value\", { cause: error });\n }\n}\n\nexport function jsonRoundTrip<T>(value: T): T {\n const serialized = serializeValue(value);\n if (serialized.encoding !== \"json\") return value;\n return deserializeJSON(serialized.data) as T;\n}\n\nexport function canonicalJSON(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalJSON).join(\",\")}]`;\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) => a.localeCompare(b));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJSON(item)}`).join(\",\")}}`;\n}\n\nexport function sha256(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n executeHandler,\n type FunctionFuture,\n type FunctionRuntime,\n type RegisteredDefinition,\n type RegisteredFunction,\n runWithFunctionRuntime,\n} from \"./function.js\";\nimport {\n FunctionError,\n SDKUsageError,\n TimeoutError,\n isRequestError,\n} from \"./errors.js\";\nimport {\n MemoryRequestContext,\n runWithRequestContext,\n waitWithAbortSignal,\n} from \"./context.js\";\nimport { File, isFile } from \"./file.js\";\nimport { HttpBody, isHttpBody } from \"./http-body.js\";\nimport { jsonRoundTrip } from \"./serialization.js\";\n\nexport class LocalRequest<T> {\n constructor(\n readonly id: string,\n private readonly value: Promise<T>,\n private readonly cancelRequest: (reason?: unknown) => void,\n ) {}\n\n output(): Promise<T> {\n return this.value;\n }\n\n cancel(reason?: unknown): void {\n this.cancelRequest(reason);\n }\n}\n\nfunction boundaryCopy<T>(value: T): T {\n if (isFile(value)) {\n return new File(new Uint8Array(value.content), value.contentType) as T;\n }\n if (isHttpBody(value)) {\n return new HttpBody(new Uint8Array(value.content), value.contentType) as T;\n }\n return jsonRoundTrip(value);\n}\n\nexport class LocalRuntime implements FunctionRuntime {\n readonly requestContext: MemoryRequestContext;\n private readonly application: RegisteredDefinition;\n private readonly controller = new AbortController();\n\n constructor(application: RegisteredDefinition, requestId = `local-${randomUUID()}`) {\n this.application = application;\n this.requestContext = new MemoryRequestContext(requestId, {\n signal: this.controller.signal,\n });\n }\n\n cancel(reason: unknown = new FunctionError(\"Local request was cancelled\")): void {\n if (!this.controller.signal.aborted) this.controller.abort(reason);\n }\n\n invoke<T>(definition: RegisteredDefinition, args: readonly unknown[]): Promise<T> {\n return this.execute<T>(definition, args);\n }\n\n async runFuture<T>(future: FunctionFuture<T>): Promise<T> {\n if (future.delaySeconds > 0) {\n let timer: NodeJS.Timeout | undefined;\n try {\n await waitWithAbortSignal(\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, future.delaySeconds * 1000);\n }),\n this.requestContext.signal,\n );\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n }\n return this.execute<T>(future.definition, future.args);\n }\n\n async reduce<T>(\n definition: RegisteredDefinition,\n items: readonly unknown[],\n initial: unknown,\n hasInitial: boolean,\n ): Promise<T> {\n let reduceItems = items;\n let reduceInitial = initial;\n if (!hasInitial) {\n if (items.length === 0) {\n throw new SDKUsageError(\"reduce of empty iterable with no initial value\");\n }\n [reduceInitial, ...reduceItems] = items;\n }\n let accumulator = boundaryCopy(reduceInitial);\n for (const item of reduceItems) {\n accumulator = await this.execute<T>(definition, [accumulator, item]);\n }\n return accumulator as T;\n }\n\n private async execute<T>(definition: RegisteredDefinition, rawArgs: readonly unknown[]): Promise<T> {\n const originalArgs = rawArgs.map(boundaryCopy);\n const maxRetries = definition.options.retries?.maxRetries\n ?? this.application.application?.retries.maxRetries\n ?? 0;\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n const args = originalArgs.map(boundaryCopy);\n try {\n const value = await runWithFunctionRuntime(this, () =>\n runWithRequestContext(this.requestContext, () =>\n waitWithAbortSignal(\n this.withTimeout(executeHandler<T>(definition, args), definition.options.timeout),\n this.controller.signal,\n ),\n ),\n );\n return boundaryCopy(value);\n } catch (error) {\n if (isRequestError(error)) throw error;\n if (this.controller.signal.aborted) throw this.controller.signal.reason;\n lastError = error;\n }\n }\n throw lastError instanceof Error\n ? new FunctionError(`${definition.name} failed: ${lastError.message}`, { cause: lastError })\n : new FunctionError(`${definition.name} failed`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutSeconds: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new TimeoutError()),\n timeoutSeconds * 1000,\n );\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n }\n}\n\nexport async function runLocal<Args extends readonly unknown[], Result>(\n application: RegisteredFunction<Args, Result>,\n ...args: Args\n): Promise<LocalRequest<Result>> {\n if (application.definition.application == null) {\n throw new SDKUsageError(`${application.definition.name} is not a Tensorlake application`);\n }\n const runtime = new LocalRuntime(application.definition);\n const output = runtime.invoke<Result>(application.definition, args);\n return new LocalRequest(\n runtime.requestContext.requestId,\n output,\n (reason) => runtime.cancel(reason),\n );\n}\n","import { APIClient } from \"../api-client.js\";\nimport type { CloudClientOptions, RequestInput, RequestOutput } from \"../cloud-models.js\";\nimport { RequestExecutionError, RequestFailedError } from \"../errors.js\";\nimport type { RegisteredFunction } from \"./function.js\";\nimport { FunctionError, RequestError, SDKUsageError } from \"./errors.js\";\nimport { File } from \"./file.js\";\nimport { deserializeJSON, serializeValue } from \"./serialization.js\";\n\nconst CLOUD_CLIENT_OPTION_KEYS = new Set<keyof CloudClientOptions>([\n \"apiUrl\",\n \"apiKey\",\n \"organizationId\",\n \"projectId\",\n \"namespace\",\n \"maxRetries\",\n \"retryBackoffMs\",\n]);\n\nconst REMOTE_OPTIONS_BRAND: unique symbol = Symbol.for(\n \"tensorlake.applications.remote-options.v1\",\n);\n\n/** Explicitly marks client options when one or more application arguments are omitted. */\nexport interface RemoteOptions {\n readonly [REMOTE_OPTIONS_BRAND]: true;\n readonly clientOptions: CloudClientOptions;\n}\n\ntype RemoteInvocation<Args extends readonly unknown[]> =\n | [...Args]\n | [...Required<Args>, CloudClientOptions]\n | [...Partial<Args>, RemoteOptions];\n\nfunction isCloudClientOptions(value: unknown): value is CloudClientOptions {\n if (typeof value !== \"object\" || value == null || Array.isArray(value)) return false;\n const entries = Object.entries(value);\n return entries.every(([key, option]) => {\n if (!CLOUD_CLIENT_OPTION_KEYS.has(key as keyof CloudClientOptions)) return false;\n if (option === undefined) return true;\n if (key === \"maxRetries\" || key === \"retryBackoffMs\") {\n return typeof option === \"number\";\n }\n return typeof option === \"string\";\n });\n}\n\nfunction isRemoteOptions(value: unknown): value is RemoteOptions {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Partial<RemoteOptions>;\n return candidate[REMOTE_OPTIONS_BRAND] === true\n && isCloudClientOptions(candidate.clientOptions);\n}\n\nexport function remoteOptions(options: CloudClientOptions = {}): RemoteOptions {\n if (!isCloudClientOptions(options)) {\n throw new SDKUsageError(\"remoteOptions requires valid CloudClientOptions\");\n }\n return Object.freeze({\n [REMOTE_OPTIONS_BRAND]: true as const,\n clientOptions: Object.freeze({ ...options }),\n });\n}\n\nexport class RemoteRequest<T> {\n constructor(\n readonly id: string,\n private readonly applicationName: string,\n private readonly client: APIClient,\n private readonly outputIsFile?: boolean,\n ) {}\n\n async output(): Promise<T> {\n let output: RequestOutput;\n try {\n await this.client.waitOnRequestCompletion(this.applicationName, this.id);\n output = await this.client.requestOutput(this.applicationName, this.id);\n } catch (error) {\n if (error instanceof RequestExecutionError) {\n throw new RequestError(error.message, { cause: error });\n }\n if (error instanceof RequestFailedError) {\n throw new FunctionError(error.message, { cause: error });\n }\n throw error;\n }\n if (this.outputIsFile === true) {\n return new File(output.serializedValue, output.contentType) as T;\n }\n if (this.outputIsFile === false || output.contentType.toLowerCase().startsWith(\"application/json\")) {\n return deserializeJSON(output.serializedValue) as T;\n }\n return new File(output.serializedValue, output.contentType) as T;\n }\n}\n\nexport function runRemote<Result = unknown>(\n application: string,\n ...args: unknown[]\n): Promise<RemoteRequest<Result>>;\nexport async function runRemote<Args extends readonly unknown[], Result>(\n application: RegisteredFunction<Args, Result>,\n ...argsAndOptions: RemoteInvocation<Args>\n): Promise<RemoteRequest<Result>>;\nexport async function runRemote(\n application: RegisteredFunction<readonly unknown[], unknown> | string,\n ...argsAndOptions: unknown[]\n): Promise<RemoteRequest<unknown>> {\n const definition = typeof application === \"string\" ? undefined : application.definition;\n if (definition != null && definition.application == null) {\n throw new SDKUsageError(`${definition.name} is not a Tensorlake application`);\n }\n const applicationName = typeof application === \"string\" ? application : definition!.name;\n let options: CloudClientOptions | undefined;\n const args = [...argsAndOptions];\n const candidate = args.at(-1);\n if (typeof application === \"string\") {\n if (isRemoteOptions(candidate)) {\n options = candidate.clientOptions;\n args.pop();\n }\n } else {\n const parameters = definition!.parameters;\n const expectedArgs = parameters.length;\n if (isRemoteOptions(candidate)) {\n const suppliedApplicationArgs = args.length - 1;\n const omitted = parameters.slice(suppliedApplicationArgs);\n if (omitted.some((parameter) => parameter.required)) {\n throw new SDKUsageError(\n `${definition!.name} is missing a required application argument before remoteOptions`,\n );\n }\n options = candidate.clientOptions;\n args.pop();\n } else if (args.length === expectedArgs + 1) {\n if (candidate !== undefined && !isCloudClientOptions(candidate)) {\n throw new SDKUsageError(\"The trailing runRemote argument must be CloudClientOptions\");\n }\n options = args.pop() as CloudClientOptions | undefined;\n }\n }\n const client = new APIClient(options);\n const inputs: RequestInput[] = args.map((value, index) => {\n const serialized = serializeValue(value);\n return { name: String(index), data: serialized.data, contentType: serialized.contentType };\n });\n const id = await client.runRequest(applicationName, inputs);\n return new RemoteRequest<unknown>(id, applicationName, client, definition?.returns._file);\n}\n","import { Buffer } from \"node:buffer\";\nimport type { JSONSchema, Parameter } from \"./schema.js\";\nimport { parameterJSONSchema } from \"./schema.js\";\nimport { getApplications, getFunctions } from \"./registry.js\";\nimport type {\n ApplicationCapability,\n RegisteredDefinition,\n} from \"./function.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\nexport const TYPESCRIPT_DESCRIPTOR_FORMAT = \"tensorlake.typescript.json-schema.v1\";\n\nexport interface ParameterManifest {\n name: string;\n data_type: JSONSchema;\n description?: string;\n required: boolean;\n}\n\nexport interface FunctionManifest {\n name: string;\n description: string;\n docstring: string;\n secret_names: string[];\n initialization_timeout_sec: number;\n timeout_sec: number;\n resources: {\n cpus: number;\n memory_mb: number;\n ephemeral_disk_mb: number;\n gpus: { count: number; model: string }[];\n };\n retry_policy: {\n max_retries: number;\n initial_delay_sec: number;\n max_delay_sec: number;\n delay_multiplier: number;\n };\n cache_key: null;\n parameters: ParameterManifest[];\n return_type: JSONSchema | null;\n placement_constraints: { filter_expressions: string[] };\n max_concurrency: number;\n warm_containers?: number;\n min_containers?: number;\n max_containers?: number;\n image?: string;\n}\n\nexport interface ApplicationManifest {\n [key: string]: unknown;\n name: string;\n description: string;\n tags: Record<string, string>;\n allow: ApplicationCapability[];\n public_endpoint_id?: string;\n version: string;\n runtime: \"typescript\";\n functions: Record<string, FunctionManifest>;\n entrypoint: {\n function_name: string;\n input_serializer: \"json\";\n inputs_base64: string;\n output_serializer: \"json\";\n output_type_hints_base64: string;\n };\n}\n\nfunction encodeDescriptor(value: unknown): string {\n return Buffer.from(JSON.stringify({ format: TYPESCRIPT_DESCRIPTOR_FORMAT, value }), \"utf8\").toString(\"base64\");\n}\n\nexport function decodeDescriptor<T>(encoded: string): T {\n const envelope = JSON.parse(Buffer.from(encoded, \"base64\").toString(\"utf8\")) as {\n format?: string;\n value?: T;\n };\n if (envelope.format !== TYPESCRIPT_DESCRIPTOR_FORMAT) {\n throw new SDKUsageError(\"Application manifest does not contain TypeScript schema descriptors\");\n }\n return envelope.value as T;\n}\n\nfunction parseGPU(value: string): { count: number; model: string } {\n const [model, countText, ...extra] = value.split(\":\");\n if (!model || extra.length > 0) throw new SDKUsageError(`Invalid GPU setting '${value}'`);\n const count = countText == null ? 1 : Number(countText);\n if (!Number.isInteger(count) || count <= 0) throw new SDKUsageError(`Invalid GPU count in '${value}'`);\n return { count, model };\n}\n\nfunction parameterManifest(parameter: Parameter<unknown>): ParameterManifest {\n return {\n name: parameter.name,\n data_type: parameterJSONSchema(parameter),\n description: parameter.description,\n required: parameter.required,\n };\n}\n\nfunction functionManifest(\n application: RegisteredDefinition,\n definition: RegisteredDefinition,\n): FunctionManifest {\n const retries = definition.options.retries ?? application.application?.retries ?? { maxRetries: 0 };\n const gpu = definition.options.gpu == null\n ? []\n : (Array.isArray(definition.options.gpu) ? definition.options.gpu : [definition.options.gpu]).map(parseGPU);\n const result: FunctionManifest = {\n name: definition.name,\n description: definition.options.description,\n docstring: \"\",\n secret_names: [...definition.options.secrets],\n initialization_timeout_sec: definition.options.timeout,\n timeout_sec: definition.options.timeout,\n resources: {\n cpus: definition.options.cpu,\n memory_mb: Math.ceil(definition.options.memory * 1024),\n ephemeral_disk_mb: Math.ceil(definition.options.ephemeralDisk * 1024),\n gpus: gpu,\n },\n retry_policy: {\n max_retries: retries.maxRetries,\n initial_delay_sec: 1,\n max_delay_sec: 60,\n delay_multiplier: 2,\n },\n cache_key: null,\n parameters: definition.application == null ? [] : definition.parameters.map(parameterManifest),\n return_type: definition.application == null ? null : { ...definition.returns.jsonSchema, title: \"Return value\" },\n placement_constraints: {\n filter_expressions: (definition.options.region ?? application.options.region) == null\n ? []\n : [`region==${definition.options.region ?? application.options.region}`],\n },\n max_concurrency: 1,\n };\n if (definition.options.warmContainers != null) result.warm_containers = definition.options.warmContainers;\n if (definition.options.minContainers != null) result.min_containers = definition.options.minContainers;\n if (definition.options.maxContainers != null) result.max_containers = definition.options.maxContainers;\n if (definition.options.image != null) result.image = definition.options.image.name;\n return result;\n}\n\nexport function createApplicationManifest(application: RegisteredDefinition): ApplicationManifest {\n if (application.application == null) throw new SDKUsageError(`${application.name} is not an application`);\n const functions = Object.fromEntries(\n getFunctions().map((definition) => [definition.name, functionManifest(application, definition)]),\n );\n return {\n name: application.name,\n description: application.options.description,\n tags: { ...application.application.tags },\n allow: [...application.application.allow],\n version: application.application.version,\n runtime: \"typescript\",\n functions,\n entrypoint: {\n function_name: application.name,\n input_serializer: \"json\",\n inputs_base64: encodeDescriptor(application.parameters.map((parameter) => ({\n name: parameter.name,\n schema: parameter.schema.jsonSchema,\n required: parameter.required,\n hasDefault: parameter.hasDefault,\n defaultValue: parameter.defaultValue,\n }))),\n output_serializer: \"json\",\n output_type_hints_base64: encodeDescriptor(application.returns.jsonSchema),\n },\n };\n}\n\nexport function createApplicationManifests(): ApplicationManifest[] {\n return getApplications().map(createApplicationManifest);\n}\n\nexport interface CodeManifest {\n format_version: 2;\n runtime: \"typescript\";\n minimum_node_major: 24;\n module: string;\n functions: Record<string, { name: string }>;\n}\n\nexport function createCodeManifest(module = \"runtime.mjs\"): CodeManifest {\n return {\n format_version: 2,\n runtime: \"typescript\",\n minimum_node_major: 24,\n module,\n functions: Object.fromEntries(getFunctions().map((definition) => [definition.name, { name: definition.name }])),\n };\n}\n"],"mappings":"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AAA,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;AAAA,QAAG;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","names":["resolve","resolve","SandboxStatus","SnapshotStatus","ProcessStatus","StdinMode","OutputMode","ContainerState","resolve","buttonMask","validatePort","secondsToMillis","resolve","WebSocket","resolve","SandboxClient","process","path","fs","secondsToMillis","sleep","resolve","path","trimTrailingSlashes","path","createSandboxImage","detectLinuxLibc","fs","read","count","createRequire","path","fileURLToPath","require","path","existsSync","DEFAULT_IMAGE_NAME","path","translateNativeError","callNative","path","path","resolveRequestTimeoutMs","secondsToMillis","validateTimeoutMs","randomUUID","randomUUID","resolve","registry","parameter","randomUUID","close","AsyncLocalStorage","path","AsyncLocalStorage","randomUUID","randomUUID","resolve","parameter","Buffer"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/defaults.ts","../src/errors.ts","../src/native-worker-protocol.ts","../src/url.ts","../src/native-worker-client.ts","../src/native-sandbox.ts","../src/models.ts","../src/pending-sandbox.ts","../src/tunnel.ts","../src/desktop.ts","../src/sdk-timings.ts","../src/sandbox.ts","../src/client.ts","../src/native-cloud.ts","../src/cloud-client.ts","../src/image.ts","../lib/libc.cjs","../src/native-binding.ts","../src/sandbox-image.ts","../src/index.ts","../src/api-client.ts","../src/filesystem.ts","../src/mount-cli.ts","../src/filesystem-models.ts","../src/repositories.ts","../src/repository-mount.ts","../src/file-system.ts","../src/applications/index.ts","../src/applications/function.ts","../src/applications/errors.ts","../src/applications/schema.ts","../src/applications/file.ts","../src/applications/http-body.ts","../src/applications/registry.ts","../src/applications/headers.ts","../src/applications/context.ts","../src/applications/serialization.ts","../src/applications/local.ts","../src/applications/remote.ts","../src/applications/manifest.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","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;\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/**\n * General sandbox operation error.\n *\n * `reason` carries the server's reason when the error describes a sandbox\n * that failed or terminated: `no_capacity` when a `maxPendingSecs` bound\n * expired, `cancelled` when a pending sandbox was deleted, or a startup\n * reason such as `ConfigurationError`. It is undefined for errors that are\n * not about a sandbox's fate.\n */\nexport class SandboxError extends SandboxException {\n readonly reason?: string;\n readonly sandboxId?: string;\n\n constructor(\n message: string,\n options?: { reason?: string; sandboxId?: string },\n ) {\n super(message);\n this.name = \"SandboxError\";\n if (options?.reason !== undefined) this.reason = options.reason;\n if (options?.sandboxId !== undefined) this.sandboxId = options.sandboxId;\n }\n}\n\n/**\n * The wait budget ran out while the sandbox was still queued.\n *\n * Thrown by `Sandbox.create`, `createAndConnect`, `PendingSandbox.ready` and\n * a lazy `connect` when their timeout elapses before the sandbox is running.\n * **The sandbox is not deleted**: it keeps its place in the queue and starts\n * whenever capacity arrives. Call `ready()` again to keep waiting,\n * `Sandbox.connect` from any other process, or `delete` it to give up.\n * `pendingReason` is the last reason the scheduler recorded (`scheduling`,\n * `no_resources_available`, `pool_at_capacity`, ...).\n */\nexport class SandboxPending extends SandboxError {\n declare readonly sandboxId: string;\n readonly pendingReason?: string;\n readonly timeout?: number;\n\n constructor(\n sandboxId: string,\n options?: { pendingReason?: string; timeout?: number },\n ) {\n let message = `Sandbox ${sandboxId} is still pending`;\n if (options?.timeout !== undefined) message += ` after ${options.timeout}s`;\n if (options?.pendingReason) message += ` (${options.pendingReason})`;\n message +=\n \"; it keeps its place in the queue. Wait again with ready() or \" +\n `Sandbox.connect({ sandboxId: '${sandboxId}' }), or delete it to cancel.`;\n super(message, { reason: options?.pendingReason, sandboxId });\n this.name = \"SandboxPending\";\n this.pendingReason = options?.pendingReason;\n this.timeout = options?.timeout;\n }\n}\n\n/**\n * Raised when the client cannot complete a request against the API server.\n *\n * The original transport error 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. Transport\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 declare readonly sandboxId: string;\n\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, { sandboxId });\n this.name = \"SandboxNotFoundError\";\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\nexport function 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\n/** Raised when the remote API returns an error. */\nexport class RemoteAPIError extends SandboxError {\n readonly statusCode: number;\n /** Original response body, retained for compatibility and diagnostics. */\n readonly responseMessage: string;\n declare readonly sandboxId?: string;\n /** Server reason, including unknown future reasons. */\n declare readonly reason?: string;\n readonly errorDetails?: unknown;\n\n constructor(statusCode: number, message: string) {\n let failure: Record<string, unknown> | undefined;\n try {\n const payload: unknown = JSON.parse(message);\n if (payload && typeof payload === \"object\" && !Array.isArray(payload)) {\n const record = payload as Record<string, unknown>;\n if (\n typeof record.sandbox_id === \"string\" &&\n record.sandbox_id.trim() &&\n (record.status === \"failed\" || record.status === \"terminated\")\n )\n failure = record;\n }\n } catch {\n // Non-JSON errors keep their existing message.\n }\n const sandboxId = failure?.sandbox_id as string | undefined;\n const rawReason = failure?.reason ?? failure?.termination_reason;\n const reason = typeof rawReason === \"string\" ? rawReason : undefined;\n const errorDetails = failure?.error_details;\n let displayMessage = message;\n if (failure) {\n displayMessage = `Sandbox ${sandboxId} ${failure.status}`;\n if (reason) displayMessage += ` (${reason})`;\n const detail = formatErrorDetails(errorDetails);\n if (detail) displayMessage += `: ${detail}`;\n if (!reason && !detail) displayMessage = message;\n }\n super(`API error (status ${statusCode}): ${displayMessage}`, {\n reason,\n sandboxId,\n });\n this.errorDetails = errorDetails;\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","/** Internal protocol. Native objects never cross an isolate boundary. */\nexport type NativeClientKind =\n | \"NativeCloudClient\"\n | \"NativeSandboxClient\"\n | \"NativeSandboxProxyClient\"\n | \"NativeRepositoryClient\";\n\nexport interface NativeHandle {\n id: number;\n kind: NativeClientKind;\n args: unknown[];\n parent?: NativeHandle;\n}\n\nexport type WorkerRequest =\n | { type: \"create\"; handle: Omit<NativeHandle, \"parent\">; parentId?: number }\n | {\n type: \"call\";\n id: number;\n handleId?: number;\n method: string;\n args: unknown[];\n stream: boolean;\n }\n | { type: \"release\"; handleId: number }\n | { type: \"ack\" | \"cancel\"; id: number };\n\nexport type WorkerResponse =\n | { type: \"result\"; id: number; value: unknown }\n | {\n type: \"error\";\n id: number;\n error: { name: string; message: string; stack?: string };\n }\n | { type: \"event\"; id: number; value: string };\n\nexport const cancelNativeCall = Symbol.for(\"tensorlake.native.cancel.v1\");\nexport const closeNativeHandle = Symbol.for(\"tensorlake.native.close.v1\");\nexport type NativeCall<T> = Promise<T> & { [cancelNativeCall]?: () => void };\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 { createRequire } from \"node:module\";\nimport { Worker } from \"node:worker_threads\";\nimport type { NativeEmit, NativeSandboxBinding } from \"./native-sandbox.js\";\nimport {\n cancelNativeCall,\n closeNativeHandle,\n type NativeCall,\n type NativeHandle,\n type WorkerRequest,\n type WorkerResponse,\n} from \"./native-worker-protocol.js\";\nimport { resolveProxyTarget } from \"./url.js\";\n\ninterface PendingCall {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n emit?: NativeEmit;\n // Keep descriptors (and their parents) alive until the operation settles.\n handle?: NativeHandle;\n}\n\n/** One persistent worker per SDK installation and calling isolate. */\nexport class NativeWorkerClient {\n private worker?: Worker;\n private nextId = 1;\n private registered = new Set<number>();\n private pending = new Map<number, PendingCall>();\n private finalizers = new FinalizationRegistry<number>((id) =>\n this.release(id),\n );\n\n constructor(\n private readonly workerPath: () => string | URL = () =>\n createRequire(import.meta.url).resolve(\n \"tensorlake/internal/native-worker\",\n ),\n ) {}\n\n handle(\n kind: NativeHandle[\"kind\"],\n args: unknown[],\n parent?: NativeHandle,\n ): object {\n const handle: NativeHandle = { id: this.nextId++, kind, args, parent };\n this.finalizers.register(handle, handle.id);\n let closed = false;\n return new Proxy(\n {},\n {\n get: (_target, method) => {\n if (method === \"then\") return undefined;\n if (method === closeNativeHandle)\n return () => {\n closed = true;\n this.release(handle.id);\n };\n if (method === \"connectProxy\")\n return (...proxyArgs: unknown[]) => {\n if (closed) throw new Error(\"Tensorlake native client is closed\");\n return this.handle(\"NativeSandboxProxyClient\", proxyArgs, handle);\n };\n if (method === \"baseUrl\")\n return () =>\n resolveProxyTarget(String(args[0]), String(args[1])).baseUrl;\n if (typeof method !== \"string\") return undefined;\n return (...callArgs: unknown[]) => {\n if (closed)\n return Promise.reject(\n new Error(\"Tensorlake native client is closed\"),\n );\n const emit =\n typeof callArgs.at(-1) === \"function\"\n ? (callArgs.pop() as NativeEmit)\n : undefined;\n return this.call(handle, method, callArgs, emit);\n };\n },\n },\n );\n }\n\n call(\n handle: NativeHandle | undefined,\n method: string,\n args: unknown[],\n emit?: NativeEmit,\n ): NativeCall<any> {\n const id = this.nextId++;\n let worker: Worker | undefined;\n const promise: NativeCall<any> = new Promise((resolve, reject) => {\n try {\n worker = this.getWorker();\n this.pending.set(id, { resolve, reject, emit, handle });\n worker.ref();\n if (handle) this.register(handle, worker);\n this.send(worker, {\n type: \"call\",\n id,\n handleId: handle?.id,\n method,\n args,\n stream: !!emit,\n });\n } catch (error) {\n this.pending.delete(id);\n this.unrefIfIdle();\n reject(error);\n }\n });\n promise[cancelNativeCall] = () => {\n const pending = this.pending.get(id);\n if (pending && worker) {\n pending.emit = undefined;\n this.send(worker, { type: \"cancel\", id });\n }\n };\n return promise;\n }\n\n private getWorker(): Worker {\n if (this.worker) return this.worker;\n const worker = new Worker(this.workerPath(), {\n // The bundled worker needs no application loaders or telemetry preloads.\n // NODE_OPTIONS is parsed independently of execArgv by Node.\n execArgv: [],\n env: { ...process.env, NODE_OPTIONS: \"\" },\n name: \"tensorlake-native\",\n });\n this.worker = worker;\n worker.on(\"message\", (message: WorkerResponse) => {\n const pending = this.pending.get(message.id);\n if (!pending || this.worker !== worker) return;\n if (message.type === \"event\") {\n // Acknowledge only when the consumer asks for the next event. At most\n // one event per stream is outstanding across Rust, worker and caller.\n Promise.resolve()\n .then(() => pending.emit?.(message.value))\n .then(\n () => {\n if (this.worker === worker)\n this.send(worker, { type: \"ack\", id: message.id });\n },\n (error: Error) => {\n this.send(worker, { type: \"cancel\", id: message.id });\n pending.reject(error);\n },\n );\n return;\n }\n this.pending.delete(message.id);\n if (message.type === \"error\") {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n error.stack = message.error.stack ?? error.stack;\n pending.reject(error);\n } else {\n pending.resolve(message.value);\n }\n this.unrefIfIdle();\n });\n const fail = (error: Error) => {\n if (this.worker !== worker) return;\n this.worker = undefined;\n this.registered.clear();\n for (const pending of this.pending.values()) pending.reject(error);\n this.pending.clear();\n // Never replay an in-flight request: it may already have taken effect.\n // A subsequent explicit call starts a fresh worker from descriptors.\n void worker.terminate();\n };\n worker.on(\"error\", fail);\n worker.on(\"messageerror\", fail);\n worker.on(\"exit\", (code) =>\n fail(\n new Error(\n `Tensorlake native worker exited (${code}); in-flight operations were not retried`,\n ),\n ),\n );\n worker.unref();\n return worker;\n }\n\n private register(handle: NativeHandle, worker: Worker): void {\n if (this.registered.has(handle.id)) return;\n if (handle.parent) this.register(handle.parent, worker);\n this.send(worker, {\n type: \"create\",\n handle: { id: handle.id, kind: handle.kind, args: handle.args },\n parentId: handle.parent?.id,\n });\n this.registered.add(handle.id);\n }\n\n private release(handleId: number): void {\n if (this.worker && this.registered.delete(handleId))\n this.send(this.worker, { type: \"release\", handleId });\n }\n\n private send(worker: Worker, message: WorkerRequest): void {\n worker.postMessage(message);\n }\n private unrefIfIdle(): void {\n if (this.pending.size === 0) this.worker?.unref();\n }\n}\n\nexport function createWorkerBinding(\n runtime: NativeWorkerClient,\n): NativeSandboxBinding {\n return {\n NativeCloudClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeCloudClient\", args);\n }\n },\n NativeSandboxClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeSandboxClient\", args);\n }\n },\n NativeSandboxProxyClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeSandboxProxyClient\", args);\n }\n },\n NativeRepositoryClient: class {\n constructor(...args: unknown[]) {\n return runtime.handle(\"NativeRepositoryClient\", args);\n }\n },\n validateManagedName: (name: string) =>\n runtime.call(undefined, \"validateManagedName\", [name]),\n } as unknown as NativeSandboxBinding;\n}\n\n// ESM and CJS can coexist in one application. Share the worker across bundles\n// of this SDK version, while keeping incompatible installed versions separate.\ndeclare const __SDK_VERSION__: string;\nconst runtimeKey = Symbol.for(\n `tensorlake.native.worker.${typeof __SDK_VERSION__ === \"undefined\" ? \"source\" : __SDK_VERSION__}.v1`,\n);\nconst runtimes = globalThis as typeof globalThis & {\n [runtimeKey]?: NativeWorkerClient;\n};\nexport function workerBinding(): NativeSandboxBinding {\n return createWorkerBinding(\n (runtimes[runtimeKey] ??= new NativeWorkerClient()),\n );\n}\n\n/** Runtime capsules supply the worker alongside their bundled application SDK. */\nexport function configureNativeWorker(workerPath: () => string | URL): void {\n runtimes[runtimeKey] ??= new NativeWorkerClient(workerPath);\n}\n\nexport function releaseNativeHandle(handle: object | null): void {\n (handle as { [closeNativeHandle]?: () => void } | null)?.[\n closeNativeHandle\n ]?.();\n}\n","import {\n PoolInUseError,\n PoolNotFoundError,\n RemoteAPIError,\n SandboxConnectionError,\n SandboxError,\n SandboxNotFoundError,\n} from \"./errors.js\";\nimport { workerBinding } from \"./native-worker-client.js\";\nimport type { NativeCloudClient } from \"./native-cloud.js\";\nimport { cancelNativeCall, type NativeCall } from \"./native-worker-protocol.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: Uint8Array;\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 | Promise<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 /** Wait-free create (`wait: false`, ADR 0086). */\n createSandboxNoWait(requestJson: string): Promise<TracedJson>;\n /** Poll the sandbox until it leaves `pending` or the budget runs out; resolves with the last `SandboxInfo`. */\n waitForSandbox(\n sandboxId: string,\n timeoutSec: number,\n pollIntervalSec?: number | null,\n ): Promise<TracedJson>;\n claimSandbox(poolId: string, requestJson?: 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 readOnly?: boolean | null,\n prefetch?: boolean | null,\n snapshotId?: string | null,\n owner?: string | null,\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 | Promise<string>;\n}\n\nexport interface NativeRepositoryClient {\n gitRepoUrl(repo: string): Promise<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 NativeCloudClient?: new (optionsJson: string) => NativeCloudClient;\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 | Promise<void>;\n}\n\n// ---- Binding loader -------------------------------------------------------\n\nlet cachedBinding: NativeSandboxBinding | undefined;\nexport function loadNativeSandboxBinding(): NativeSandboxBinding {\n return cachedBinding ??= workerBinding();\n}\n\n/** Test seam: replace (or clear) the native binding. */\nexport function __setNativeSandboxBindingForTest(\n binding: NativeSandboxBinding | undefined,\n): void {\n cachedBinding = binding;\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. Each emit\n * resolves only after consumption, propagating backpressure through the worker\n * to Rust. Cancellation drops the upstream response, including quiet streams.\n */\nexport async function* nativeEventStream(\n start: (emit: NativeEmit) => Promise<string>,\n context?: NativeErrorContext,\n signal?: AbortSignal,\n): AsyncGenerator<Record<string, unknown>> {\n if (signal?.aborted) return;\n const queue: Array<{ value: string; consumed: () => void }> = [];\n let wake: (() => void) | undefined;\n let finished = false;\n let stopped = false;\n let failure: unknown;\n const notify = () => { const resolve = wake; wake = undefined; resolve?.(); };\n const emit: NativeEmit = (value) => {\n if (stopped) return Promise.resolve();\n return new Promise<void>((consumed) => { queue.push({ value, consumed }); notify(); });\n };\n let call: NativeCall<string> | undefined;\n const onAbort = () => { stopped = true; call?.[cancelNativeCall]?.(); notify(); };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n call = start(emit);\n void call.catch((error: unknown) => { failure = error; }).finally(() => { finished = true; notify(); });\n while (!stopped) {\n const event = queue.shift();\n if (event) {\n try { yield JSON.parse(event.value) as Record<string, unknown>; }\n finally { event.consumed(); }\n } else if (finished) {\n break;\n } else {\n await new Promise<void>((resolve) => { wake = resolve; });\n }\n }\n if (!stopped && failure !== undefined) throw translateNativeError(failure, context);\n } finally {\n stopped = true;\n signal?.removeEventListener(\"abort\", onAbort);\n call?.[cancelNativeCall]?.();\n for (const event of queue) event.consumed();\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 /** Terminal status used by blocking create/claim responses. */\n FAILED = \"failed\",\n}\n\n/**\n * Why a pending sandbox is waiting (`pendingReason`). The wire value is a\n * snake_case string; unknown future reasons arrive as plain strings.\n */\nexport enum SandboxPendingReason {\n SCHEDULING = \"scheduling\",\n WAITING_FOR_CONTAINER = \"waiting_for_container\",\n NO_EXECUTORS_AVAILABLE = \"no_executors_available\",\n NO_RESOURCES_AVAILABLE = \"no_resources_available\",\n POOL_AT_CAPACITY = \"pool_at_capacity\",\n MAX_CAPACITY_REACHED = \"max_capacity_reached\",\n NO_EXECUTOR_FOR_SNAPSHOT_LOCATION = \"no_executor_for_snapshot_location\",\n /** The autoscaler reported that no fleet can ever place this shape. */\n UNPLACEABLE = \"unplaceable\",\n}\n\n/** `terminationReason` when a `maxPendingSecs` bound expired, or the shape is unplaceable. */\nexport const TERMINATION_REASON_NO_CAPACITY = \"no_capacity\";\n/** `terminationReason` when a pending sandbox was deleted before it ran. */\nexport const TERMINATION_REASON_CANCELLED = \"cancelled\";\n\n/** Whether a sandbox status is one a readiness wait keeps polling through. */\nexport function isSandboxPending(status: SandboxStatus | string): boolean {\n return String(status) === SandboxStatus.PENDING;\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 diskMb: number;\n}\n\n/** GPU models supported by the sandbox scheduler. */\nexport type GpuModel =\n | \"A100-40GB\"\n | \"A100-80GB\"\n | \"H100\"\n | \"T4\"\n | \"A6000\"\n | \"RTX-PRO-6000\"\n | \"L40\"\n | \"A10\";\n\n/** A homogeneous GPU allocation for a sandbox. */\nexport interface GpuRequest {\n count: number;\n model: GpuModel;\n}\n\nexport interface GPUResources {\n count: number;\n model: string;\n}\n\n/**\n * Egress network access control policy for a sandbox.\n *\n * `denyOut` takes precedence over `allowOut`: a destination matched by both is\n * blocked. Entries may be IPv4 addresses, CIDR ranges, or DNS hostnames;\n * hostname rules are followed across DNS changes. The policy can be changed on\n * a running sandbox via `Sandbox.update({ network })` (pass `null` to clear).\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 Artifact Storage file-system name created with\n * `tl fs create <name>` and `mountPath` is an absolute, unique guest path\n * (e.g. `/mnt/skills`).\n *\n * `readOnly` and `prefetch` are optional mount modes; they are sent on the\n * wire only when `true` (older servers reject unknown mount fields, so\n * `false` is expressed by omission).\n *\n * `snapshotId` pins the mount to a specific filesystem snapshot. A pinned\n * mount must also set `readOnly: true` (the server rejects a writable pin\n * with HTTP 400). It is sent only when set, for the same compatibility\n * reason as the mount modes.\n *\n * `owner` presents the mounted files as owned by a guest user: `NAME`,\n * `UID`, `NAME:GROUP`, or `UID:GID` (e.g. `\"agent\"` or `\"1001:1001\"`),\n * resolved against the sandbox image's own user database when the mount\n * attaches. Unset keeps the image default (the baked `tl-user` account when\n * the image has one, otherwise root). It is sent only when set, for the\n * same compatibility reason as the mount modes.\n */\nexport interface FileSystemMount {\n fileSystemId: string;\n mountPath: string;\n /** Mount the file system read-only. */\n readOnly?: boolean;\n /** Eagerly download the file system's contents. */\n prefetch?: boolean;\n /** Pin the mount to a specific filesystem snapshot (requires `readOnly`). */\n snapshotId?: string;\n /** Present the mounted files as owned by this guest user spec. */\n owner?: string;\n}\n\n/** Optional mount modes for attaching a file system to a running sandbox. */\nexport interface AttachFileSystemOptions {\n /** Mount the file system read-only. */\n readOnly?: boolean;\n /** Eagerly download the file system's contents. */\n prefetch?: boolean;\n /** Pin the mount to a specific filesystem snapshot (requires `readOnly`). */\n snapshotId?: string;\n /** Present the mounted files as owned by this guest user spec. */\n owner?: string;\n}\n\nexport interface ClaimSandboxOptions {\n /** File systems to mount before the claimed sandbox is reported as running. */\n fileSystems?: FileSystemMount[];\n}\n\n// --- Sandbox lifecycle ---\n\nexport interface CreateSandboxOptions {\n /** Optional sandbox image name. GPU sandboxes require a CAS image; when omitted with a GPU request, Tensorlake uses the server's configured GPU default. */\n image?: string;\n /** CPU count. Defaults to 1 for fresh creates; snapshot restores inherit it when omitted. */\n cpus?: number;\n /** Memory in MB. Defaults to 1024 for fresh creates; snapshot restores inherit it when omitted. */\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. Defaults to A10 unless gpuModel is set. GPU sandboxes require a CAS image. */\n gpus?: number;\n /** GPU model to allocate. The string arm preserves compatibility with existing callers; values are validated at runtime. */\n gpuModel?: GpuModel | (string & {});\n /** Typed GPU model and count request. Cannot be combined with gpus or gpuModel. */\n gpu?: GpuRequest;\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 on fresh creation or warm-pool claim, each at its own absolute, unique guest mount path. */\n fileSystems?: FileSystemMount[];\n /**\n * `false` returns a `PendingSandbox` handle as soon as the sandbox is\n * durable, without waiting for it to run: `pending.ready()` waits,\n * `pending.status()` looks, and `Sandbox.connect(pending.sandboxId)`\n * collects it from any other process. `true` / unset waits as before.\n */\n wait?: boolean;\n /**\n * Longest the sandbox may wait for capacity before the server fails it with\n * reason `no_capacity`. `0` fails at once when it cannot be placed; unset\n * (the default) waits indefinitely. Applies to capacity waits only, not to\n * image pull or boot. A bound shorter than the fleet's boot time (up to 20\n * minutes on metal hosts) expires the very demand that made the autoscaler\n * launch a host; 30 minutes or more is recommended for capacity waits.\n */\n maxPendingSecs?: number;\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 * Egress network policy for the running sandbox, applied to the live VM's\n * firewall in one atomic swap. Omit to keep the current policy, set to\n * replace it, or pass `null` to clear it to unrestricted egress.\n */\n network?: NetworkConfig | null;\n}\n\n/**\n * Response from a blocking create or a pool claim.\n *\n * The server waits for readiness for at most the request timeout and can\n * already report `running`; a `pending` answer carries a `pendingReason`.\n * Use `connect(sandboxId)` to wait for a pending sandbox, or\n * `create({ wait: false })` for a `PendingSandbox` handle.\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 pendingReason?: string;\n}\n\n/**\n * The acknowledgement of a `create({ wait: false })`: the wire record of a\n * sandbox that is durable and starts whenever capacity allows. The\n * `PendingSandbox` class in `pending-sandbox.ts` wraps it with `ready()` /\n * `status()`. A server that predates `wait: false` answers the blocking\n * create's shape instead, so `state` may already be `running`.\n */\nexport interface PendingSandboxRecord {\n sandboxId: string;\n name?: string;\n state: SandboxStatus;\n pendingReason?: string;\n routingHint?: string;\n ingressEndpoint?: string;\n sandboxUrl?: string;\n reason?: string;\n terminationReason?: string;\n errorDetails?: unknown;\n}\n\nexport interface ReadyOptions {\n /** Seconds to wait; defaults to the client requestTimeout. `0` observes the current state once. */\n timeout?: number;\n /** Seconds between `GET /sandboxes/{id}` polls. Default: 2. */\n pollInterval?: number;\n /**\n * Delete the sandbox when `timeout` runs out while it is still pending,\n * then throw `SandboxError` (the pre-ADR-0086 behaviour). Default false:\n * throw `SandboxPending` and leave the sandbox queued.\n */\n cancelOnTimeout?: boolean;\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 /** Egress network policy currently applied to the sandbox. */\n networkPolicy?: NetworkConfig;\n poolId?: string;\n outcome?: string;\n terminationReason?: string;\n errorDetails?: unknown;\n /** Why a pending sandbox is waiting, in snake_case. */\n pendingReason?: string;\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\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"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 /** Root disk size in megabytes. Omit to use the registered image's size. */\n diskMb?: number;\n timeoutSecs?: number;\n entrypoint?: string[];\n maxContainers?: number;\n warmContainers?: number;\n /** Network policy for each container. Can be replaced later via updatePool. */\n network?: NetworkConfig;\n}\n\nexport interface UpdatePoolOptions {\n /**\n * Network policy for each container. Omit to keep the pool's current policy,\n * set to replace it, or pass `null` to remove it (unclaimed warm containers\n * are recycled onto the new policy).\n */\n network?: NetworkConfig | null;\n /** Sandbox image name, such as `tensorlake/ubuntu-minimal` or a registered Sandbox Image. */\n image: string;\n cpus?: number;\n memoryMb?: number;\n /** Root disk size in megabytes. Omit to use the registered image's size. */\n diskMb?: 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 /** The network policy that applies to each container in the pool. */\n networkPolicy?: NetworkConfig;\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\" | \"running\" | \"backing_off\" | \"stopped\";\n\nexport type ManagedProcessHealthStatus =\n \"disabled\" | \"starting\" | \"healthy\" | \"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 * Delete the sandbox when `requestTimeout` runs out while it is still\n * pending, then throw `SandboxError` (the pre-ADR-0086 behaviour). Default\n * false: throw `SandboxPending` and leave the sandbox queued.\n */\n cancelOnTimeout?: boolean;\n /** Seconds between readiness polls. Default: 2. */\n pollInterval?: number;\n}\n\n/**\n * Options for `Sandbox.getOrCreate`: everything `create` accepts (used only\n * when a new sandbox must be created; `name` comes from the first argument),\n * plus `resume`. `poolId` is excluded: a pool claim cannot carry a name, so\n * a claimed sandbox could never be found again by a later call.\n */\nexport interface GetOrCreateOptions\n extends Omit<CreateAndConnectOptions, \"name\" | \"poolId\"> {\n /** Resume a suspended sandbox before returning. Default: true. */\n resume?: boolean;\n}\n\n/**\n * What `Sandbox.getOrCreate` did to bind the name, exposed as\n * `sandbox.bindOutcome`:\n *\n * - `\"created\"`: nothing held the name; the call created a new sandbox.\n * - `\"attached\"`: a sandbox already held the name and needed no resume.\n * Includes a sandbox that was still starting (the call waited for it)\n * and a suspended sandbox when `resume: false`.\n * - `\"resumed\"`: the sandbox was suspended when the call found it and is\n * running now.\n */\nexport type GetOrCreateOutcome = \"created\" | \"attached\" | \"resumed\";\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(obj: unknown, idField?: string): unknown {\n if (Array.isArray(obj))\n 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 type { SandboxClient } from \"./client.js\";\nimport type {\n PendingSandboxRecord,\n ReadyOptions,\n SandboxInfo,\n SandboxStatus,\n} from \"./models.js\";\nimport type { Sandbox } from \"./sandbox.js\";\nimport type { Traced } from \"./traced.js\";\n\n/** @internal How a client binds a handle it issued. */\nexport interface PendingSandboxBinding {\n client: SandboxClient;\n proxyUrl?: string;\n requestTimeout?: number;\n requestedName?: string | null;\n ownsSandbox: boolean;\n traceId: string;\n}\n\n/**\n * A sandbox requested with `wait: false`: the handle returned by\n * `Sandbox.create({ wait: false })` / `SandboxClient.create({ wait: false })`.\n *\n * The sandbox is durable and starts whenever capacity allows. Collect it\n * with {@link PendingSandbox.ready}, look at it with\n * {@link PendingSandbox.status}, or from any other process with\n * `Sandbox.connect({ sandboxId })` (which waits while it is pending) or\n * `client.list()`. `pendingReason` is `scheduling` at create time; the\n * capacity reasons appear after the first scheduler pass.\n */\nexport class PendingSandbox implements PendingSandboxRecord {\n readonly sandboxId: string;\n readonly name?: string;\n readonly state: SandboxStatus;\n readonly pendingReason?: string;\n readonly routingHint?: string;\n readonly ingressEndpoint?: string;\n readonly sandboxUrl?: string;\n readonly reason?: string;\n readonly terminationReason?: string;\n readonly errorDetails?: unknown;\n /** W3C trace id of the create request. */\n readonly traceId: string;\n\n /** @internal */\n constructor(\n record: PendingSandboxRecord,\n private readonly binding: PendingSandboxBinding,\n ) {\n this.sandboxId = record.sandboxId;\n this.name = record.name;\n this.state = record.state;\n this.pendingReason = record.pendingReason;\n this.routingHint = record.routingHint;\n this.ingressEndpoint = record.ingressEndpoint;\n this.sandboxUrl = record.sandboxUrl;\n this.reason = record.reason;\n this.terminationReason = record.terminationReason;\n this.errorDetails = record.errorDetails;\n this.traceId = binding.traceId;\n }\n\n /** Fetch the sandbox's current state with one `GET`. */\n async status(): Promise<Traced<SandboxInfo>> {\n return this.binding.client.get(this.sandboxId);\n }\n\n /**\n * Wait for the sandbox to be running and return a connected `Sandbox`.\n *\n * Polls `GET /sandboxes/{id}` every `pollInterval` seconds (default 2).\n * Call it again after a `SandboxPending` to keep waiting.\n *\n * @throws {SandboxPending} `timeout` elapsed while the sandbox was still\n * pending. It keeps its place in the queue; the error carries\n * `sandboxId` and `pendingReason`.\n * @throws {SandboxError} The sandbox settled somewhere else: `terminated`\n * or `failed` (`reason` is the server's, such as `no_capacity` or\n * `cancelled`), or `suspended`.\n */\n async ready(options?: ReadyOptions): Promise<Sandbox> {\n return this.binding.client._ready(this.sandboxId, this.binding, options);\n }\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 { releaseNativeHandle } from \"./native-worker-client.js\";\nimport type { SandboxClient } from \"./client.js\";\nimport {\n type ConnectDesktopOptions,\n Desktop,\n} from \"./desktop.js\";\nimport {\n RemoteAPIError,\n SandboxError,\n SandboxNotFoundError,\n SandboxPending,\n} from \"./errors.js\";\nimport { type Traced } from \"./traced.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 GetOrCreateOptions,\n type GetOrCreateOutcome,\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 AttachFileSystemOptions,\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 type { PendingSandbox } from \"./pending-sandbox.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 private closed = false;\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.closed) throw new SandboxError(\"Sandbox connection is closed\");\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 const resolving = this.resolveProxyInfo(identifier)\n .then(async (info) => {\n if (generation !== this.resolveGeneration) {\n return;\n }\n const proxyUrl = await 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 if (generation !== this.resolveGeneration) return;\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 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 if (this.resolvePromise === resolving) this.resolvePromise = null;\n });\n this.resolvePromise = resolving;\n return resolving;\n }\n\n hasExplicitProxyUrl(): boolean {\n return this.explicitProxyUrl != null;\n }\n\n async refreshFromInfo(info: Traced<SandboxInfo>): Promise<void> {\n if (this.closed) throw new SandboxError(\"Sandbox connection is closed\");\n const generation = ++this.resolveGeneration;\n const routingHint = info.routingHint ?? this.optionRoutingHint;\n const proxyUrl = await 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 if (generation !== this.resolveGeneration) return;\n const state = this.buildProxyState(\n proxyUrl,\n info.sandboxId,\n routingHint,\n );\n this.resolvePromise = null;\n this.routingHint = routingHint;\n releaseNativeHandle(this.nativeProxy);\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.closed) throw new SandboxError(\"Sandbox connection is closed\");\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 this.closed = true;\n this.resolveGeneration += 1;\n releaseNativeHandle(this.nativeProxy);\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 */\n// `getOrCreate`: how many connect-or-create attempts to make when a named\n// sandbox is caught mid-handoff (for example, its previous holder is still\n// terminating), and the base delay between attempts.\nconst GET_OR_CREATE_ATTEMPTS = 4;\nconst GET_OR_CREATE_RETRY_DELAY_MS = 500;\n\n// `bindOutcome` is read-only for callers; `getOrCreate` is the one writer.\nfunction markBindOutcome(sandbox: Sandbox, outcome: GetOrCreateOutcome): Sandbox {\n (sandbox as { bindOutcome: GetOrCreateOutcome }).bindOutcome = outcome;\n return sandbox;\n}\n\nexport class Sandbox {\n traceId: string | null = null;\n /**\n * What {@link Sandbox.getOrCreate} did to bind the name: `\"created\"`,\n * `\"attached\"`, or `\"resumed\"`. `null` for handles from `create` or\n * `connect`.\n */\n readonly bindOutcome: GetOrCreateOutcome | 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.lifecycleIdentifier = options.sandboxId;\n this.proxy = new SandboxProxyConnection(this, options);\n }\n\n /**\n * The server-assigned sandbox ID.\n *\n * A handle opened by name (`connect({ sandboxId: name })`) reports the\n * name until its first server response, then the canonical ID. Handles\n * from `create` and `getOrCreate` carry the canonical ID from the start.\n */\n get sandboxId(): string {\n return this.lifecycleIdentifier;\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 /** @internal Used by PendingSandbox.ready for a non-owning handle. */\n _setLifecycleClient(client: SandboxClient): void {\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`). With `wait` unset or `true` it blocks until the sandbox\n * is `Running`: the create is sent with `wait: false` and the sandbox is\n * polled every two seconds, with `requestTimeout` as the wait budget.\n *\n * With `wait: false` it returns a {@link PendingSandbox} at once:\n * `pending.ready()` waits for it, `pending.status()` looks at it, and\n * `Sandbox.connect({ sandboxId: pending.sandboxId })` collects it from any\n * other process. This is the call for requesting many sandboxes ahead of\n * capacity. `wait: false` cannot be combined with `poolId`.\n *\n * **When the wait runs out the sandbox is not deleted.** A\n * `SandboxPending` is thrown carrying the sandbox id; the sandbox keeps\n * its place in the queue and starts whenever capacity arrives. Collect it\n * later with `Sandbox.connect` or delete it to give up. Pass\n * `cancelOnTimeout: true` for the previous delete-then-throw behaviour,\n * or `maxPendingSecs` to let the server fail it after a bound.\n *\n * When `name` is already claimed, the server rejects the create with\n * HTTP 409 (`RemoteAPIError`). To attach to the existing sandbox\n * instead, use {@link Sandbox.getOrCreate}.\n */\n static async create<\n O extends CreateAndConnectOptions & Partial<SandboxClientOptions> =\n CreateAndConnectOptions & Partial<SandboxClientOptions>,\n >(options?: O): Promise<O extends { wait: false } ? PendingSandbox : Sandbox>;\n static async create(\n options?: CreateAndConnectOptions & Partial<SandboxClientOptions>,\n ): Promise<PendingSandbox | 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 if (options?.wait === false) {\n if (options.poolId != null) {\n throw new SandboxError(\n \"wait: false cannot be combined with poolId: a pool claim is answered synchronously\",\n );\n }\n const requestTimeout =\n options.requestTimeout ?? options.startupTimeout ?? undefined;\n return client.requestPending(options, {\n proxyUrl: options.proxyUrl,\n requestTimeout,\n ownsSandbox: true,\n });\n }\n return client.createAndConnect(options);\n }\n\n /**\n * Attach to an existing sandbox and return a connected handle.\n *\n * The handle is lazy: when `proxyUrl` is omitted, the sandbox is resolved\n * on the first request so the handle uses the correct cloud/region ingress\n * endpoint. Connecting does not verify that the sandbox exists. Does\n * **not** auto-resume a suspended sandbox — call `sandbox.resume()`\n * 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 /**\n * Return the one sandbox bound to `name`. Create it on first use.\n *\n * This is the recommended call for an agent session that derives its\n * sandbox name from its session ID. It declares the intent \"this name is\n * my session's sandbox\": when a sandbox already holds the name, the call\n * attaches to it instead of failing with HTTP 409 the way `create` does.\n *\n * The steps, all handled internally:\n *\n * 1. `connect` by name — finds the sandbox, running or suspended.\n * 2. When nothing holds the name, `create` with the given configuration.\n * 3. When that create loses a race against another caller (HTTP 409),\n * connect to the winner.\n * 4. When the sandbox is still starting (another caller's create is in\n * flight), wait until it is `Running`, the same way `create` blocks\n * for its own caller.\n * 5. When the sandbox is suspended, `resume()` it. Disable with\n * `resume: false`.\n *\n * Concurrent callers that use the same name all converge on the same\n * sandbox. The configuration options (`image`, `cpus`, ...) apply only\n * when the call creates a new sandbox; an existing sandbox is returned\n * as-is, with whatever configuration it already has.\n *\n * The returned handle carries the canonical `sandboxId` (not the name)\n * and records what the call did in `bindOutcome`: `\"created\"`,\n * `\"attached\"`, or `\"resumed\"`. See {@link GetOrCreateOutcome}.\n *\n * For about a second after `terminate()`, the name still resolves and\n * the sandbox still reports `running`. A `getOrCreate` in that window\n * attaches to the dying sandbox. When you recreate right after a\n * terminate, check `status()` after the call, or wait for the old\n * sandbox to report `terminated` first.\n *\n * `poolId` is not accepted: a pool claim cannot carry a name, so a\n * claimed sandbox could never be found again by a later call. To use a\n * warm pool, `create` with `poolId` and name the sandbox afterwards\n * with `client.update(sandboxId, { name })`.\n *\n * @param name Sandbox name; unique within the namespace. Derive it\n * deterministically from your session ID, for example\n * `agent-${sessionId}`.\n * @param options Create options plus `resume` (default true: resume a\n * suspended sandbox before returning). Used only when a new sandbox\n * must be created, except connection-level options.\n * @throws {SandboxError} If the name stays claimed but its sandbox cannot\n * be attached to after several attempts (for example, the previous\n * holder is stuck terminating), or if a sandbox that is still starting\n * does not reach `Running` within `requestTimeout`.\n * @throws {RemoteAPIError} If the create step fails with a non-409 error.\n */\n static async getOrCreate(\n name: string,\n options?: GetOrCreateOptions & Partial<SandboxClientOptions>,\n ): Promise<Sandbox> {\n const { resume = true, ...createOptions } = options ?? {};\n // The type omits poolId, but plain-JS callers can still pass it. Reject\n // it here: the claim request has no name field on the wire, so the\n // claimed sandbox would be unnamed and every later call would claim\n // another one instead of converging.\n if ((createOptions as { poolId?: string }).poolId != null) {\n throw new SandboxError(\n \"getOrCreate does not accept poolId: a pool claim cannot name the \" +\n \"sandbox. Use create({ poolId }) and then \" +\n \"client.update(sandboxId, { name }).\",\n );\n }\n let lastConflict: RemoteAPIError | undefined;\n for (let attempt = 0; attempt < GET_OR_CREATE_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n // Reachable only after a lost create race whose winner is not\n // connectable yet (for example, the name's previous holder is\n // still terminating). Give the server a moment.\n await sleep(GET_OR_CREATE_RETRY_DELAY_MS * attempt);\n }\n try {\n const sandbox = await Sandbox.connect({\n ...createOptions,\n sandboxId: name,\n });\n // connect returns a lazy handle without checking that the name\n // exists; this status fetch is the existence check that routes a\n // free name to the create step below.\n const status = await sandbox.status();\n if (status === SandboxStatus.PENDING) {\n // Another caller's create is still starting this sandbox. Match\n // create(): block until Running, then pick up fresh proxy\n // routing before handing the sandbox out.\n const waitTimeout = createOptions.requestTimeout ?? 300;\n await sandbox.refreshRoutingWhenRunning(\n Date.now() + waitTimeout * 1000,\n 0.5,\n waitTimeout,\n );\n } else if (\n resume &&\n (status === SandboxStatus.SUSPENDED ||\n status === SandboxStatus.SUSPENDING)\n ) {\n const waitTimeout = createOptions.requestTimeout ?? 300;\n let settled: SandboxStatus = status;\n if (settled === SandboxStatus.SUSPENDING) {\n // The server rejects resume while a suspend is still in\n // progress; wait for the suspend to settle first.\n settled = await sandbox.waitOutSuspending(waitTimeout, name);\n }\n if (settled === SandboxStatus.SUSPENDED) {\n await sandbox.resume({ timeout: waitTimeout });\n } else if (settled === SandboxStatus.TERMINATED) {\n // The sandbox died while suspending; the name may be free\n // again. Retry the loop.\n continue;\n } else {\n // Another caller resumed it first. The resumed sandbox may\n // live elsewhere, so this handle's routing from before the\n // suspend is stale. Match the PENDING branch: block until\n // Running with fresh proxy routing.\n await sandbox.refreshRoutingWhenRunning(\n Date.now() + waitTimeout * 1000,\n 0.5,\n waitTimeout,\n );\n }\n return markBindOutcome(sandbox, \"resumed\");\n }\n return markBindOutcome(sandbox, \"attached\");\n } catch (err) {\n if (!(err instanceof SandboxNotFoundError)) throw err;\n try {\n const created = await Sandbox.create({ ...createOptions, name });\n return markBindOutcome(created, \"created\");\n } catch (createErr) {\n if (\n createErr instanceof RemoteAPIError &&\n createErr.statusCode === 409\n ) {\n // Lost the create race: another caller claimed the name first.\n // Loop back and attach to the winner.\n lastConflict = createErr;\n continue;\n }\n throw createErr;\n }\n }\n }\n const giveUp = new SandboxError(\n `getOrCreate('${name}'): the name is claimed, but its sandbox could ` +\n `not be attached to after ${GET_OR_CREATE_ATTEMPTS} attempts`,\n );\n giveUp.cause = lastConflict;\n throw giveUp;\n }\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, and\n * egress network policy).\n *\n * Naming an ephemeral sandbox makes it non-ephemeral and enables\n * suspend/resume. For `network`, omit to keep the current policy, pass an\n * object to replace it, or pass `null` to clear it to unrestricted egress.\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 await this.refreshRoutingWhenRunning(deadline, pollInterval, timeout);\n }\n\n /**\n * Poll until the sandbox leaves `Suspending`.\n *\n * The lifecycle API rejects resume while a suspend is still in progress,\n * so `getOrCreate` must wait for the suspend to settle before it can\n * resume the sandbox.\n */\n private async waitOutSuspending(\n waitTimeout: number,\n name: string,\n ): Promise<SandboxStatus> {\n const deadline = Date.now() + waitTimeout * 1000;\n while (Date.now() < deadline) {\n await sleep(500);\n const status = await this.status();\n if (status !== SandboxStatus.SUSPENDING) return status;\n }\n throw new SandboxError(\n `getOrCreate('${name}'): the sandbox holding the name did not finish ` +\n `suspending within ${waitTimeout}s`,\n );\n }\n\n /**\n * Poll until the sandbox is `Running` with routing info, then rebind this\n * handle's cached proxy routing. Shared by `resume()` and the\n * `getOrCreate` path that attaches to a still-starting sandbox.\n */\n private async refreshRoutingWhenRunning(\n deadline: number,\n pollInterval: number,\n timeout: number,\n ): Promise<void> {\n const client = this.requireLifecycleClient(\"refresh proxy routing\");\n let last: SandboxInfo | undefined;\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 await 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 { reason: info.terminationReason, sandboxId: info.sandboxId },\n );\n }\n last = info;\n await sleep(Math.min(pollInterval * 1000, Math.max(0, deadline - Date.now())));\n }\n if (last?.status === SandboxStatus.PENDING) {\n // Still queued for capacity: it keeps its place, the caller decides.\n throw new SandboxPending(last.sandboxId, {\n pendingReason: last.pendingReason,\n timeout,\n });\n }\n throw new SandboxError(\n `Sandbox ${this.lifecycleIdentifier} did not provide refreshed proxy routing within ${timeout}s`,\n { sandboxId: this.lifecycleIdentifier },\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`. `options.snapshotId` pins the mount to a specific\n * filesystem snapshot and requires `options.readOnly: true`.\n */\n async attachFileSystem(\n fileSystemId: string,\n mountPath: string,\n options?: AttachFileSystemOptions,\n ): Promise<Traced<SandboxInfo>> {\n const client = this.requireLifecycleClient(\"attachFileSystem\");\n const info = await client.attachFileSystem(\n this.lifecycleIdentifier,\n fileSystemId,\n mountPath,\n options,\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 await 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, SandboxPending, formatErrorDetails } from \"./errors.js\";\nimport type { Traced } from \"./traced.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport {\n callNative,\n loadNativeSandboxBinding,\n type NativeErrorContext,\n type NativeSandboxClient,\n} from \"./native-sandbox.js\";\nimport {\n type ArchivedSandboxInfo,\n type AttachFileSystemOptions,\n type CopySandboxOptions,\n type CopySandboxResponse,\n type ClaimSandboxOptions,\n type CreateAndConnectOptions,\n type CreatePoolOptions,\n type CreateSandboxOptions,\n type CreateSandboxPoolResponse,\n type CreateSandboxResponse,\n type CreateSnapshotResponse,\n type FileSystemMount,\n type GetSandboxLogsOptions,\n type GpuRequest,\n type ListArchivedSandboxesOptions,\n type ListArchivedSandboxesResponse,\n type SandboxClientOptions,\n type SandboxInfo,\n type SandboxLogsResponse,\n type PendingSandboxRecord,\n type ReadyOptions,\n type SandboxPortAccess,\n type SandboxPoolInfo,\n type SandboxProcessLogFiltersResponse,\n SandboxStatus,\n isSandboxPending,\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 toSnakeKeys,\n} from \"./models.js\";\nimport { PendingSandbox, type PendingSandboxBinding } from \"./pending-sandbox.js\";\nimport { Sandbox } from \"./sandbox.js\";\nimport { nowMs, logSdkTimingEvent, logSdkTiming } from \"./sdk-timings.js\";\nimport { explicitProxyUrlOverride } from \"./url.js\";\n\n/** Seconds between `GET /sandboxes/{id}` polls while waiting for a sandbox to run (ADR 0086). */\nexport const DEFAULT_WAIT_POLL_INTERVAL_SEC = 2;\n\nconst GPU_MODELS = new Set<string>([\n \"A100-40GB\",\n \"A100-80GB\",\n \"H100\",\n \"T4\",\n \"A6000\",\n \"RTX-PRO-6000\",\n \"L40\",\n \"A10\",\n]);\n\n/**\n * Client-side mirror of the server's HTTP 400 for invalid snapshot pins: a\n * mount that pins `snapshotId` must also be `readOnly`, so callers fail fast\n * (and offline) instead of round-tripping to the server.\n */\nfunction requireReadOnlySnapshotPin(\n fileSystemId: string,\n mountPath: string,\n readOnly: boolean | undefined,\n snapshotId: string | undefined,\n): void {\n if (snapshotId != null && readOnly !== true) {\n throw new SandboxError(\n `file system mount '${fileSystemId}' at '${mountPath}' sets snapshotId ` +\n \"without readOnly: snapshot-pinned mounts are read-only\",\n );\n }\n}\n\n/**\n * Map a `FileSystemMount` to its wire form. `read_only` and `prefetch` are\n * included only when `true`, and `snapshot_id` only when set: older servers\n * deserialize mount bodies with `deny_unknown_fields` and would reject an\n * explicit `false` (or an unknown pin field).\n */\nfunction fileSystemMountToWire(fs: FileSystemMount): Record<string, unknown> {\n requireReadOnlySnapshotPin(fs.fileSystemId, fs.mountPath, fs.readOnly, fs.snapshotId);\n return {\n file_system_id: fs.fileSystemId,\n mount_path: fs.mountPath,\n ...(fs.readOnly === true ? { read_only: true } : {}),\n ...(fs.prefetch === true ? { prefetch: true } : {}),\n ...(fs.snapshotId != null ? { snapshot_id: fs.snapshotId } : {}),\n ...(fs.owner != null ? { owner: fs.owner } : {}),\n };\n}\n\nfunction gpuRequest(\n gpu: GpuRequest | undefined,\n gpus: number | undefined,\n gpuModel: string | undefined,\n): Array<{ count: number; model: string }> | undefined {\n if (gpu != null) {\n if (gpus != null || gpuModel != null) {\n throw new SandboxError(\"gpu cannot be combined with gpus or gpuModel\");\n }\n gpus = gpu.count;\n gpuModel = gpu.model;\n }\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 (!GPU_MODELS.has(gpuModel)) {\n throw new SandboxError(`unsupported GPU model: ${gpuModel}`);\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 /**\n * Create an API-key client for TensorLake Cloud. Ingress selects the authorized\n * organization/project; explicit scope options are forwarded only as compatibility headers.\n */\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 releaseNativeHandle(this.native);\n }\n\n private withRequestTimeout(\n requestTimeout: number | undefined,\n ): 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 {\n apiUrl: this.apiUrl,\n apiKey: this.apiKey,\n organizationId: this.organizationId,\n projectId: this.projectId,\n namespace: this.namespace,\n timeoutMs,\n },\n /* _internal */ true,\n );\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 /**\n * Create a new sandbox.\n *\n * With `wait` unset or `true` the server waits for readiness for at most\n * the request timeout and answers the blocking create's record (`status`\n * may already be `running`); this is the wire behaviour unchanged. With\n * `wait: false` the server answers as soon as the sandbox is durable and\n * this returns a {@link PendingSandbox} at once: `pending.ready()` waits\n * for it, `pending.status()` looks at it, and `connect(sandboxId)`\n * collects it from any other process. Give the sandbox a `name` when a\n * retry of this call must not create a second one: a repeated name is an\n * HTTP 409, and `Sandbox.getOrCreate` resolves it. Use\n * `createAndConnect()` for a blocking, ready-to-use handle.\n */\n async create<O extends CreateSandboxOptions = CreateSandboxOptions>(\n options?: O,\n ): Promise<\n O extends { wait: false } ? PendingSandbox : Traced<CreateSandboxResponse>\n >;\n async create(\n options?: CreateSandboxOptions,\n ): Promise<PendingSandbox | Traced<CreateSandboxResponse>> {\n if (options?.wait === false) {\n return this.requestPending(options, { ownsSandbox: false });\n }\n const body = SandboxClient.buildCreateRequestBody(options);\n return this.tracedJson<CreateSandboxResponse>(\n () => this.native.createSandbox(JSON.stringify(body)),\n \"sandboxId\",\n );\n }\n\n /**\n * @internal Send the create with `wait: false` and return the pending\n * handle, bound to this client so `ready()` / `status()` work.\n */\n async requestPending(\n options: CreateSandboxOptions | undefined,\n binding: {\n proxyUrl?: string;\n requestTimeout?: number;\n ownsSandbox: boolean;\n },\n ): Promise<PendingSandbox> {\n const body = SandboxClient.buildCreateRequestBody({\n ...options,\n wait: false,\n });\n const record = await this.tracedJson<PendingSandboxRecord>(() =>\n this.native.createSandboxNoWait(JSON.stringify(body)),\n );\n return new PendingSandbox(record, {\n client: this,\n proxyUrl: binding.proxyUrl,\n requestTimeout: binding.requestTimeout,\n requestedName: options?.name ?? null,\n ownsSandbox: binding.ownsSandbox,\n traceId: record.traceId,\n });\n }\n\n /** @internal Implementation of `PendingSandbox.ready`. */\n async _ready(\n sandboxId: string,\n binding: PendingSandboxBinding,\n options?: ReadyOptions,\n ): Promise<Sandbox> {\n const budget = options?.timeout ?? this.requestTimeoutMs / 1000;\n const observed = await this.waitForSandbox(\n sandboxId,\n budget,\n options?.pollInterval ?? DEFAULT_WAIT_POLL_INTERVAL_SEC,\n );\n return this.settleWait(observed, {\n budget,\n proxyUrl: binding.proxyUrl,\n requestTimeout: binding.requestTimeout,\n cancelOnTimeout: options?.cancelOnTimeout ?? false,\n requestedName: binding.requestedName,\n ownsSandbox: binding.ownsSandbox,\n traceId: binding.traceId,\n });\n }\n\n /**\n * Poll `get` every `pollInterval` seconds until the sandbox leaves\n * `pending` or `timeout` elapses, resolving with the last observation.\n * Never rejects for a timeout and never deletes.\n */\n private async waitForSandbox(\n sandboxId: string,\n timeout: number,\n pollInterval: number,\n ): Promise<Traced<SandboxInfo>> {\n if (!Number.isFinite(timeout) || timeout < 0) {\n throw new SandboxError(\"timeout must be a non-negative number of seconds\");\n }\n if (!Number.isFinite(pollInterval) || pollInterval <= 0) {\n throw new SandboxError(\"pollInterval must be a positive number of seconds\");\n }\n return this.tracedJson<SandboxInfo>(\n () => this.native.waitForSandbox(sandboxId, timeout, pollInterval),\n \"sandboxId\",\n { sandboxId, notFoundKind: \"sandbox\" },\n );\n }\n\n /** Turn the last observed sandbox state into a handle or an error. */\n private async settleWait(\n observed: Traced<SandboxInfo>,\n options: {\n budget: number;\n proxyUrl?: string;\n requestTimeout?: number;\n cancelOnTimeout: boolean;\n requestedName?: string | null;\n ownsSandbox?: boolean;\n traceId?: string;\n },\n ): Promise<Sandbox> {\n const { status, sandboxId } = observed;\n if (isSandboxPending(status)) {\n if (options.cancelOnTimeout) {\n try {\n await this.delete(sandboxId);\n } catch {\n // ignore cleanup failures\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} did not start within ${options.budget}s`,\n { reason: observed.pendingReason, sandboxId },\n );\n }\n throw new SandboxPending(sandboxId, {\n pendingReason: observed.pendingReason,\n timeout: options.budget,\n });\n }\n if (status === SandboxStatus.RUNNING) {\n const explicitProxyUrl =\n options.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = await this.native.selectSandboxProxyUrl(\n sandboxId,\n observed.sandboxUrl ?? null,\n observed.ingressEndpoint ?? null,\n explicitProxyUrl ?? null,\n );\n const sandbox = this.connect(\n sandboxId,\n selectedProxyUrl,\n observed.routingHint,\n options.requestTimeout,\n explicitProxyUrl,\n );\n if (options.ownsSandbox) sandbox._setOwner(this);\n else sandbox._setLifecycleClient(this);\n sandbox.traceId = options.traceId ?? observed.traceId;\n sandbox._setLifecycleIdentifier(sandboxId);\n sandbox._setName(observed.name ?? options.requestedName ?? null);\n return sandbox;\n }\n if (status === SandboxStatus.TERMINATED || status === SandboxStatus.FAILED) {\n throw startupFailure(sandboxId, status, {\n errorDetails: observed.errorDetails,\n terminationReason: observed.terminationReason,\n });\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} is ${status}, not running; ` +\n (status === SandboxStatus.SUSPENDED\n ? \"resume it to run it again\"\n : \"wait for it to settle\"),\n { reason: String(status), sandboxId },\n );\n }\n\n /**\n * Routing for a lazy `connect` handle. A sandbox that is still pending is\n * waited on here rather than failing: readiness is a property of the\n * sandbox, not of the create call that requested it.\n */\n private async resolveRoutingInfo(\n identifier: string,\n requestTimeout?: number,\n ): Promise<Traced<SandboxInfo>> {\n const info = await this.get(identifier);\n if (info.status !== SandboxStatus.PENDING) return info;\n const budget = requestTimeout ?? this.requestTimeoutMs / 1000;\n const observed = await this.waitForSandbox(\n info.sandboxId,\n budget,\n DEFAULT_WAIT_POLL_INTERVAL_SEC,\n );\n if (isSandboxPending(observed.status)) {\n throw new SandboxPending(observed.sandboxId, {\n pendingReason: observed.pendingReason,\n timeout: budget,\n });\n }\n if (\n observed.status === SandboxStatus.TERMINATED ||\n observed.status === SandboxStatus.FAILED\n ) {\n throw startupFailure(observed.sandboxId, observed.status, {\n errorDetails: observed.errorDetails,\n terminationReason: observed.terminationReason,\n });\n }\n return observed;\n }\n\n /** @internal Build the create wire body; shared by `create` and `createAndConnect`. */\n static buildCreateRequestBody(\n options?: CreateSandboxOptions,\n ): Record<string, unknown> {\n const gpuResources = gpuRequest(\n options?.gpu,\n options?.gpus,\n options?.gpuModel,\n );\n const restoringSnapshot = options?.snapshotId != null;\n const resources: Record<string, unknown> = {\n ...(!restoringSnapshot || options?.cpus != null\n ? { cpus: options?.cpus ?? 1.0 }\n : {}),\n ...(!restoringSnapshot || options?.memoryMb != null\n ? { memory_mb: options?.memoryMb ?? 1024 }\n : {}),\n ...(options?.diskMb != null ? { disk_mb: options.diskMb } : {}),\n ...(gpuResources != null ? { gpus: gpuResources } : {}),\n };\n const body: Record<string, unknown> = {};\n if (Object.keys(resources).length > 0) body.resources = resources;\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 (options?.fileSystems != null && options.fileSystems.length > 0) {\n body.file_systems = options.fileSystems.map(fileSystemMountToWire);\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 if (options?.maxPendingSecs != null) {\n if (\n !Number.isInteger(options.maxPendingSecs) ||\n options.maxPendingSecs < 0\n ) {\n throw new SandboxError(\"maxPendingSecs must be a non-negative integer\");\n }\n body.max_pending_secs = options.maxPendingSecs;\n }\n // Sent only when false so older servers keep accepting the body.\n if (options?.wait === false) body.wait = false;\n return body;\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(() =>\n this.native.listSandboxes(),\n );\n const parsed = JSON.parse(json) as {\n sandboxes?: Record<string, unknown>[];\n };\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(\n sandboxId: string,\n options: UpdateSandboxOptions,\n ): 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 // Tri-state network policy: omit to keep the current policy, `null` to\n // clear it to unrestricted egress, an object to replace it.\n if (options.network !== undefined) {\n body.network =\n options.network === null ? null : toSnakeKeys(options.network);\n }\n if (Object.keys(body).length === 0) {\n throw new SandboxError(\n \"At least one sandbox update field must be provided.\",\n );\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(\n (port) => !toRemove.has(port),\n );\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), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n sandboxId: string,\n options?: SuspendResumeOptions,\n ): Promise<void> {\n await callNative(() => this.native.suspendSandbox(sandboxId), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n `Sandbox ${sandboxId} terminated while waiting for suspend`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} did not suspend within ${timeout}s`,\n );\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(\n sandboxId: string,\n options?: SuspendResumeOptions,\n ): Promise<void> {\n await callNative(() => this.native.resumeSandbox(sandboxId), {\n sandboxId,\n notFoundKind: \"sandbox\",\n });\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(\n `Sandbox ${sandboxId} terminated while waiting for resume`,\n );\n }\n await sleep(pollInterval * 1000);\n }\n throw new SandboxError(\n `Sandbox ${sandboxId} did not resume within ${timeout}s`,\n );\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 * `options.snapshotId` pins the mount to a specific filesystem snapshot\n * and requires `options.readOnly: true`.\n */\n async attachFileSystem(\n sandboxId: string,\n fileSystemId: string,\n mountPath: string,\n options?: AttachFileSystemOptions,\n ): Promise<Traced<SandboxInfo>> {\n requireReadOnlySnapshotPin(\n fileSystemId,\n mountPath,\n options?.readOnly,\n options?.snapshotId,\n );\n return this.tracedJson<SandboxInfo>(\n () =>\n this.native.attachFileSystem(\n sandboxId,\n fileSystemId,\n mountPath,\n options?.readOnly === true,\n options?.prefetch === true,\n options?.snapshotId ?? null,\n options?.owner ?? null,\n ),\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 /**\n * Claim a warm sandbox from a pool, creating one if no warm containers are\n * available. Claim-specific file systems are ready before the sandbox is\n * reported as running.\n */\n async claim(\n poolId: string,\n options?: ClaimSandboxOptions,\n ): Promise<Traced<CreateSandboxResponse>> {\n const requestJson =\n options?.fileSystems != null && options.fileSystems.length > 0\n ? JSON.stringify({\n file_systems: options.fileSystems.map(fileSystemMountToWire),\n })\n : undefined;\n return this.tracedJson<CreateSandboxResponse>(\n () =>\n requestJson == null\n ? this.native.claimSandbox(poolId)\n : this.native.claimSandbox(poolId, requestJson),\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 () =>\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(() =>\n this.native.listSnapshots(),\n );\n const parsed = JSON.parse(json) as {\n snapshots?: Record<string, unknown>[];\n };\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))\n 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(\n options: CreatePoolOptions,\n ): 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 ...(options.diskMb != null ? { disk_mb: options.diskMb } : {}),\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null)\n body.max_containers = options.maxContainers;\n if (options.warmContainers != null)\n body.warm_containers = options.warmContainers;\n if (options.network != null) body.network = toSnakeKeys(options.network);\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 /**\n * Replace a pool configuration. Omit `network` to keep the pool's current\n * network policy, set it to replace the policy, or pass `null` to remove the\n * policy entirely. On a change the service recycles the pool's unclaimed\n * warm containers onto the new policy, while containers already claimed by\n * sandboxes keep the policy they booted with. CPU, memory, disk, image, and\n * entrypoint changes likewise recycle unclaimed warm containers\n * asynchronously. If suitable capacity is unavailable, stale warm\n * containers are not used as a fallback.\n */\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 ...(options.diskMb != null ? { disk_mb: options.diskMb } : {}),\n },\n timeout_secs: options.timeoutSecs ?? 0,\n };\n\n if (options.entrypoint != null) body.entrypoint = options.entrypoint;\n if (options.maxContainers != null)\n body.max_containers = options.maxContainers;\n if (options.warmContainers != null)\n body.warm_containers = options.warmContainers;\n // Tri-state: omit to keep the current policy, `null` to clear it, an\n // object to replace it.\n if (options.network !== undefined) {\n body.network =\n options.network === null ? null : toSnakeKeys(options.network);\n }\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), {\n poolId,\n notFoundKind: \"pool\",\n });\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) =>\n this.resolveRoutingInfo(currentIdentifier, requestTimeout),\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 * This is `create({ wait: false })` followed by `PendingSandbox.ready()`\n * polling every `pollInterval` seconds, with `requestTimeout` as the wait\n * budget, in one call. The returned `Sandbox` auto-terminates when\n * `terminate()` is called.\n *\n * **When the wait runs out the sandbox is not deleted.** A `SandboxPending`\n * is thrown with the sandbox id, and the sandbox keeps its place in the\n * queue and starts whenever capacity arrives; `connect` with that id to\n * collect it, or `delete` it to give up. Pass\n * `cancelOnTimeout: true` for the previous behaviour (delete, then throw\n * `SandboxError`), or set `maxPendingSecs` to let the server fail it after\n * a bound. A pool claim (`poolId`) answers from the server-side wait; a\n * claim that is still starting is then waited on the same way.\n */\n async createAndConnect(options?: CreateAndConnectOptions): 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 const deadline = Date.now() + secondsToMillis(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 requestedName =\n options?.poolId != null ? null : (options?.name ?? null);\n let sandboxId: string;\n let traceId: string;\n const createStart = nowMs();\n if (options?.poolId != null) {\n // Pool claims have no `wait: false`: the server answers from its own\n // wait, so a claim is often already running.\n const result = await requestClient.claim(options.poolId, {\n fileSystems: options.fileSystems,\n });\n logSdkTiming(\"sandbox.create\", \"claim_response\", createStart, {\n sandbox_id: result.sandboxId,\n status: result.status,\n server_trace_id: result.traceId,\n });\n if (result.status === SandboxStatus.RUNNING) {\n const explicitProxyUrl =\n options?.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = await this.native.selectSandboxProxyUrl(\n result.sandboxId,\n result.sandboxUrl ?? null,\n result.ingressEndpoint ?? null,\n explicitProxyUrl ?? null,\n );\n const sandbox = requestClient.connect(\n result.sandboxId,\n selectedProxyUrl,\n result.routingHint,\n requestTimeout,\n explicitProxyUrl,\n );\n sandbox._setOwner(requestClient);\n sandbox.traceId = result.traceId;\n sandbox._setLifecycleIdentifier(result.sandboxId);\n sandbox._setName(result.name ?? requestedName);\n logSdkTiming(\"sandbox.create\", \"complete\", opStart, {\n sandbox_id: result.sandboxId,\n status: SandboxStatus.RUNNING,\n server_trace_id: result.traceId,\n });\n return sandbox;\n }\n if (\n result.status === SandboxStatus.SUSPENDED ||\n result.status === SandboxStatus.TERMINATED ||\n result.status === SandboxStatus.FAILED\n ) {\n throw startupFailure(result.sandboxId, result.status, {\n errorDetails: result.errorDetails,\n terminationReason: result.terminationReason ?? result.reason,\n });\n }\n sandboxId = result.sandboxId;\n traceId = result.traceId;\n } else {\n const pending = await requestClient.requestPending(options, {\n ownsSandbox: true,\n });\n logSdkTiming(\"sandbox.create\", \"create_response\", createStart, {\n sandbox_id: pending.sandboxId,\n status: pending.state,\n server_trace_id: pending.traceId,\n });\n sandboxId = pending.sandboxId;\n traceId = pending.traceId;\n // Fast path: a server without `wait: false` may already answer running,\n // with a short-lived routing hint worth using directly.\n if (pending.state === SandboxStatus.RUNNING) {\n const explicitProxyUrl =\n options?.proxyUrl ?? explicitProxyUrlOverride() ?? undefined;\n const selectedProxyUrl = await this.native.selectSandboxProxyUrl(\n sandboxId,\n pending.sandboxUrl ?? null,\n pending.ingressEndpoint ?? null,\n explicitProxyUrl ?? null,\n );\n const sandbox = requestClient.connect(\n sandboxId,\n selectedProxyUrl,\n pending.routingHint,\n requestTimeout,\n explicitProxyUrl,\n );\n sandbox._setOwner(requestClient);\n sandbox.traceId = traceId;\n sandbox._setLifecycleIdentifier(sandboxId);\n sandbox._setName(pending.name ?? requestedName);\n logSdkTiming(\"sandbox.create\", \"complete\", opStart, {\n sandbox_id: sandboxId,\n status: SandboxStatus.RUNNING,\n server_trace_id: traceId,\n });\n return sandbox;\n }\n if (\n pending.state === SandboxStatus.TERMINATED ||\n pending.state === SandboxStatus.FAILED\n ) {\n throw startupFailure(sandboxId, pending.state, {\n errorDetails: pending.errorDetails,\n terminationReason: pending.terminationReason ?? pending.reason,\n });\n }\n }\n\n // A `timeout` claim or a pending create: the sandbox exists and keeps its\n // place in the queue. Poll it with whatever budget is left (a zero budget\n // observes its state once without sleeping).\n const remaining = Math.max(0, (deadline - Date.now()) / 1000);\n const observed = await requestClient.waitForSandbox(\n sandboxId,\n remaining,\n options?.pollInterval ?? DEFAULT_WAIT_POLL_INTERVAL_SEC,\n );\n const sandbox = await requestClient.settleWait(observed, {\n budget: requestTimeout,\n proxyUrl: options?.proxyUrl,\n requestTimeout,\n cancelOnTimeout: options?.cancelOnTimeout ?? false,\n requestedName,\n ownsSandbox: true,\n traceId,\n });\n logSdkTiming(\"sandbox.create\", \"complete\", opStart, {\n sandbox_id: sandboxId,\n status: SandboxStatus.RUNNING,\n server_trace_id: traceId,\n routing_hint: observed.routingHint,\n ingress_endpoint: observed.ingressEndpoint,\n sandbox_url: observed.sandboxUrl,\n });\n return sandbox;\n }\n}\n\nfunction startupFailure(\n sandboxId: string,\n status: SandboxStatus | string,\n options: { errorDetails?: unknown; terminationReason?: string },\n): SandboxError {\n return new SandboxError(formatStartupFailureMessage(sandboxId, status, options), {\n reason: options.terminationReason,\n sandboxId,\n });\n}\n\nfunction resolveRequestTimeoutMs(options?: {\n requestTimeout?: number;\n 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(\n \"requestTimeout must be a positive number of seconds\",\n );\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(\n \"timeoutMs must be a positive number of milliseconds\",\n );\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 (\n status === SnapshotStatus.LOCAL_READY ||\n status === SnapshotStatus.COMPLETED\n );\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 let prefix =\n status === SandboxStatus.TERMINATED\n ? `Sandbox ${sandboxId} terminated during startup`\n : `Sandbox ${sandboxId} became ${status} during startup`;\n if (options.terminationReason) {\n prefix += ` (${options.terminationReason})`;\n }\n const detail = formatErrorDetails(options.errorDetails);\n if (detail) {\n return `${prefix}: ${detail}`;\n }\n return prefix;\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 { callNative, loadNativeSandboxBinding, nativeEventStream, type NativeEmit } from \"./native-sandbox.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport type { Traced } from \"./traced.js\";\n\nexport interface NativeCloudPart {\n name: string;\n data: Buffer;\n filename?: string;\n contentType?: string;\n}\n\nexport interface NativeCloudRequest {\n method: string;\n path: string;\n headersJson: string;\n body?: Buffer;\n parts?: NativeCloudPart[];\n statusOnlyCodes: number[];\n}\n\nexport interface NativeCloudResponse {\n status: number;\n headersJson: string;\n data: Uint8Array;\n traceId: string;\n}\n\nexport interface NativeCloudClient {\n request(request: NativeCloudRequest): Promise<NativeCloudResponse>;\n stream(request: NativeCloudRequest, emit: NativeEmit): Promise<string>;\n}\n\ninterface CloudTransportOptions {\n baseUrl: string;\n apiKey?: string;\n organizationId?: string;\n projectId?: string;\n userAgent: string;\n maxRetries: number;\n retryBackoffMs: number;\n timeoutMs: number;\n}\n\ninterface RequestOptions {\n body?: string | Blob | ArrayBuffer | Uint8Array | FormData;\n json?: unknown;\n headers?: Record<string, string>;\n /** Return these statuses without consuming their unused diagnostic bodies. */\n statusOnlyCodes?: Set<number>;\n}\n\n/** Only marshals values across the worker boundary; Rust owns all HTTP I/O. */\nexport class NativeCloudTransport {\n private native?: NativeCloudClient;\n private closed = false;\n\n constructor(private readonly options: CloudTransportOptions) {\n if (!Number.isSafeInteger(options.maxRetries) || options.maxRetries < 0 || options.maxRetries > 0xffff_ffff) {\n throw new RangeError(\"maxRetries must be a non-negative 32-bit integer\");\n }\n if (!Number.isFinite(options.retryBackoffMs) || options.retryBackoffMs < 0) {\n throw new RangeError(\"retryBackoffMs must be a non-negative finite number\");\n }\n }\n\n private client(): NativeCloudClient {\n if (this.closed) throw new Error(\"Tensorlake native client is closed\");\n if (this.native) return this.native;\n const ctor = loadNativeSandboxBinding().NativeCloudClient;\n if (!ctor) throw new Error(\"Native binding does not export NativeCloudClient; rebuild with 'npm run build:native'\");\n return this.native = new ctor(JSON.stringify(this.options));\n }\n\n close(): void {\n this.closed = true;\n releaseNativeHandle(this.native ?? null);\n this.native = undefined;\n }\n\n async requestResponse(method: string, path: string, options?: RequestOptions): Promise<Traced<Response>> {\n const request = await serializeRequest(method, path, options);\n const raw = await callNative(() => this.client().request(request));\n const response = new Response(\n [204, 205, 304].includes(raw.status) ? null : Uint8Array.from(raw.data).buffer,\n { status: raw.status, headers: JSON.parse(raw.headersJson) as Record<string, string> },\n );\n return Object.assign(response, { traceId: raw.traceId });\n }\n\n async requestJson<T>(method: string, path: string): Promise<Traced<T>> {\n const response = await this.requestResponse(method, path);\n const text = await response.text();\n const value = text ? JSON.parse(text) : null;\n return Object.assign(value ?? {}, { traceId: response.traceId }) as Traced<T>;\n }\n\n async *stream(method: string, path: string, signal?: AbortSignal): AsyncGenerator<Record<string, unknown>> {\n if (signal?.aborted) return;\n const request = await serializeRequest(method, path, { headers: { Accept: \"text/event-stream\" } });\n yield* nativeEventStream((emit) => this.client().stream(request, emit), undefined, signal);\n }\n}\n\nasync function serializeRequest(method: string, path: string, options?: RequestOptions): Promise<NativeCloudRequest> {\n const headers = { ...options?.headers };\n let body = options?.body;\n if (options?.json !== undefined) {\n body = JSON.stringify(options.json);\n if (!Object.keys(headers).some((key) => key.toLowerCase() === \"content-type\")) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n const request: NativeCloudRequest = {\n method,\n path,\n headersJson: JSON.stringify(headers),\n statusOnlyCodes: [...(options?.statusOnlyCodes ?? [])],\n };\n if (body instanceof FormData) {\n request.parts = [];\n for (const [name, value] of body.entries()) {\n request.parts.push(typeof value === \"string\"\n ? { name, data: Buffer.from(value) }\n : { name, data: Buffer.from(await value.arrayBuffer()), filename: value.name, contentType: value.type || \"application/octet-stream\" });\n }\n } else if (body !== undefined) {\n if (body instanceof Blob) request.body = Buffer.from(await body.arrayBuffer());\n else if (typeof body === \"string\") request.body = Buffer.from(body);\n else if (body instanceof ArrayBuffer) request.body = Buffer.from(new Uint8Array(body));\n else request.body = Buffer.from(body);\n }\n return request;\n}\n","import { nanoid } from \"nanoid\";\n\nimport * as defaults from \"./defaults.js\";\nimport { NativeCloudTransport } from \"./native-cloud.js\";\nimport { fromSnakeKeys } from \"./models.js\";\nimport type {\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 StartImageBuildRequest,\n UpsertSecretResponse,\n} from \"./cloud-models.js\";\n\nexport class CloudClient {\n private readonly transport: NativeCloudTransport;\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.transport = new NativeCloudTransport({\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 timeoutMs: defaults.DEFAULT_HTTP_TIMEOUT_MS,\n userAgent: `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n });\n }\n\n static forCloud(options?: CloudClientOptions): CloudClient {\n return new CloudClient(options);\n }\n\n close(): void {\n this.transport.close();\n }\n\n async upsertApplication(\n manifest: ApplicationManifest,\n codeZip: BinaryPayload,\n upgradeRunningRequests = false,\n ): Promise<void> {\n const applicationManifest = { ...manifest };\n let publicEndpointId = publicEndpointIdFromManifest(applicationManifest);\n if (\n applicationAllowsUnauthenticatedRequests(applicationManifest) &&\n publicEndpointId === undefined\n ) {\n const applicationName = applicationManifest.name;\n if (typeof applicationName === \"string\" && applicationName.length > 0) {\n publicEndpointId =\n await this.existingApplicationPublicEndpointId(applicationName);\n }\n publicEndpointId ??= generatePublicEndpointId();\n }\n if (publicEndpointId !== undefined) {\n applicationManifest.public_endpoint_id = publicEndpointId;\n delete applicationManifest.publicEndpointId;\n }\n\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(applicationManifest));\n form.append(\n \"upgrade_requests_to_latest_code\",\n String(upgradeRunningRequests),\n );\n\n await this.transport.requestResponse(\"POST\", this.namespacePath(\"applications\"), {\n body: form,\n });\n }\n\n async deleteApplication(applicationName: string): Promise<void> {\n await this.transport.requestResponse(\n \"DELETE\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n );\n }\n\n async deleteSandboxImage(imageName: string): Promise<void> {\n await this.transport.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 * API-key clients may omit organization/project IDs and use the\n * token-scoped Platform API route directly. Explicit scope remains\n * available for PAT callers.\n */\n async findSandboxImageByName(\n imageName: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate | null> {\n const base = this.platformProjectPath(\n \"sandbox-templates\",\n options?.organizationId,\n options?.projectId,\n );\n const response = await this.transport.requestResponse(\n \"GET\",\n `${base}/by-name/${encodeURIComponent(imageName)}`,\n { statusOnlyCodes: 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. API-key clients may omit organization/project IDs and use the\n * token-scoped Platform API route directly.\n */\n async listSandboxImages(\n options?: { organizationId?: string; projectId?: string },\n ): Promise<SandboxTemplate[]> {\n const base = this.platformProjectPath(\n \"sandbox-templates\",\n options?.organizationId,\n options?.projectId,\n );\n let path: string | null = `${base}?pageSize=100`;\n const templates: SandboxTemplate[] = [];\n while (path !== null) {\n const page: SandboxTemplatesPage = await this.transport.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 async applications(): Promise<ApplicationSummary[]> {\n const raw = await this.transport.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.transport.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.transport.requestResponse(\"POST\", path, {\n body: new Uint8Array(),\n headers: { Accept: \"application/json\" },\n })\n : inputs.length === 1 && inputs[0].name === \"0\"\n ? await this.transport.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 = this.transport.stream(\n \"GET\",\n this.namespacePath(\n `applications/${encodeURIComponent(applicationName)}/requests/${encodeURIComponent(requestId)}/progress`,\n ),\n );\n\n for await (const event of 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.transport.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.transport.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 listSecrets(options?: {\n organizationId?: string;\n projectId?: string;\n pageSize?: number;\n }): Promise<SecretsList> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n const raw = await this.transport.requestJson<SecretMetadata[]>(\"GET\", base);\n const pageSize = Math.max(0, options?.pageSize ?? 100);\n return Object.assign(\n {\n items: raw.slice(0, pageSize).map(secretFromMetadata),\n pagination: { total: raw.length },\n },\n { traceId: raw.traceId },\n );\n }\n\n async getSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<Secret> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n const raw = await this.transport.requestJson<SecretMetadata>(\n \"GET\",\n `${base}/${encodeURIComponent(secretId)}`,\n );\n return Object.assign(secretFromMetadata(raw), { traceId: raw.traceId });\n }\n\n async upsertSecrets(\n secrets: NewSecret | NewSecret[],\n options?: { organizationId?: string; projectId?: string },\n ): Promise<UpsertSecretResponse> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n if (Array.isArray(secrets)) {\n const results: Secret[] = [];\n for (const secret of secrets) {\n results.push(await this.upsertSecret(base, secret));\n }\n return results;\n }\n return this.upsertSecret(base, secrets);\n }\n\n async deleteSecret(\n secretId: string,\n options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n const base = this.secretCollectionPath(\n options?.organizationId,\n options?.projectId,\n );\n await this.transport.requestResponse(\n \"DELETE\",\n `${base}/${encodeURIComponent(secretId)}`,\n );\n }\n\n private async upsertSecret(base: string, secret: NewSecret): Promise<Secret> {\n let response = await this.transport.requestResponse(\"POST\", base, {\n json: secret,\n headers: { \"Idempotency-Key\": nanoid() },\n statusOnlyCodes: new Set([409]),\n });\n if (response.status === 409) {\n const prefix = base.slice(0, -\"/secrets\".length);\n const existing = await this.transport.requestJson<{ id: string }>(\n \"GET\",\n `${prefix}/secret-names/${encodeURIComponent(secret.name)}`,\n );\n response = await this.transport.requestResponse(\n \"POST\",\n `${base}/${encodeURIComponent(existing.id)}/versions`,\n {\n json: { value: secret.value },\n headers: { \"Idempotency-Key\": nanoid() },\n },\n );\n }\n const metadata = await parseJsonResponse<SecretMetadata>(response);\n return Object.assign(secretFromMetadata(metadata), {\n traceId: response.traceId,\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.transport.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.transport.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.transport.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.transport.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.transport.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.transport.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 = this.transport.stream(\n \"GET\",\n `${trimTrailingSlashes(buildServicePath)}/builds/${encodeURIComponent(buildId)}/logs`,\n signal,\n );\n for await (const event of stream) {\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.transport.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 async existingApplicationPublicEndpointId(\n applicationName: string,\n ): Promise<string | undefined> {\n const response = await this.transport.requestResponse(\n \"GET\",\n this.namespacePath(`applications/${encodeURIComponent(applicationName)}`),\n { statusOnlyCodes: new Set([404]) },\n );\n if (response.status === 404) {\n return undefined;\n }\n\n const application =\n await parseJsonResponse<Record<string, unknown>>(response);\n return publicEndpointIdFromManifest(application);\n }\n\n private platformProjectPath(\n resource: \"sandbox-templates\",\n organizationId?: string,\n projectId?: string,\n ): string {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId && !resolvedProjectId) {\n return `/platform/v1/${resource}`;\n }\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\n \"organizationId and projectId must be provided together\",\n );\n }\n return `/platform/v1/organizations/${encodeURIComponent(resolvedOrganizationId)}/projects/${encodeURIComponent(resolvedProjectId)}/${resource}`;\n }\n\n private secretCollectionPath(\n organizationId?: string,\n projectId?: string,\n ): string {\n const resolvedOrganizationId = organizationId ?? this.organizationId;\n const resolvedProjectId = projectId ?? this.projectId;\n if (!resolvedOrganizationId && !resolvedProjectId) {\n return this.namespacePath(\"secrets\");\n }\n if (!resolvedOrganizationId || !resolvedProjectId) {\n throw new Error(\"organizationId and projectId must be provided together\");\n }\n return this.namespacePath(\"secrets\");\n }\n}\n\ntype SecretMetadata = {\n id: string;\n name: string;\n created_at_ms: number;\n};\n\nfunction secretFromMetadata(metadata: SecretMetadata): Secret {\n return {\n id: metadata.id,\n name: metadata.name,\n createdAt: new Date(metadata.created_at_ms),\n };\n}\n\nconst UNAUTHENTICATED_REQUESTS = \"unauthenticated_requests\";\n\nfunction applicationAllowsUnauthenticatedRequests(\n manifest: ApplicationManifest,\n): boolean {\n return (\n Array.isArray(manifest.allow) &&\n manifest.allow.includes(UNAUTHENTICATED_REQUESTS)\n );\n}\n\nfunction publicEndpointIdFromManifest(\n manifest: ApplicationManifest,\n): string | undefined {\n for (const key of [\"public_endpoint_id\", \"publicEndpointId\"]) {\n const value = manifest[key];\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction generatePublicEndpointId(): string {\n return `endpoint_${nanoid()}`;\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/**\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","// Read the ELF interpreter, rather than generating a process-wide diagnostic\n// report. Both supported Linux architectures use little-endian ELF64. Reads\n// are bounded to the header, program headers, and interpreter pathname.\nfunction detectLinuxLibc(fs, executable = process.execPath) {\n const override = process.env.TENSORLAKE_NODE_LIBC;\n if (override != null) {\n if (override === \"gnu\" || override === \"musl\") return override;\n throw new Error(\"TENSORLAKE_NODE_LIBC must be 'gnu' or 'musl'.\");\n }\n\n let fd;\n try {\n fd = fs.openSync(executable, \"r\");\n function read(size, offset) {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new Error(\"Invalid ELF offset\");\n }\n const buffer = Buffer.alloc(size);\n let count = 0;\n while (count < size) {\n const bytes = fs.readSync(fd, buffer, count, size - count, offset + count);\n if (bytes === 0) throw new Error(\"Truncated ELF executable\");\n count += bytes;\n }\n return buffer;\n }\n\n const header = read(64, 0);\n if (header.readUInt32BE(0) !== 0x7f454c46 || header[4] !== 2 || header[5] !== 1) {\n throw new Error(\"Expected a little-endian ELF64 executable\");\n }\n const entrySize = header.readUInt16LE(54);\n const count = header.readUInt16LE(56);\n if (entrySize !== 56 || count === 0 || count > 128) {\n throw new Error(\"Unsupported ELF program headers\");\n }\n const entries = read(entrySize * count, Number(header.readBigUInt64LE(32)));\n for (let i = 0; i < count; i++) {\n const offset = i * entrySize;\n if (entries.readUInt32LE(offset) !== 3) continue; // PT_INTERP\n const size = Number(entries.readBigUInt64LE(offset + 32));\n if (size < 2 || size > 4096) throw new Error(\"Invalid ELF interpreter size\");\n const interpreter = read(size, Number(entries.readBigUInt64LE(offset + 8)));\n if (interpreter[size - 1] !== 0) throw new Error(\"Unterminated ELF interpreter\");\n const name = interpreter.subarray(0, -1).toString(\"utf8\").split(\"/\").at(-1);\n if (name.startsWith(\"ld-musl-\")) return \"musl\";\n if (name.startsWith(\"ld-linux-\")) return \"gnu\";\n throw new Error(\"Unrecognized ELF interpreter\");\n }\n throw new Error(\"No ELF interpreter (statically linked executable)\");\n } catch (cause) {\n throw new Error(\n \"Unable to detect Linux libc from the Node executable. Set TENSORLAKE_NODE_LIBC to 'gnu' or 'musl' for a nonstandard runtime.\",\n { cause },\n );\n } finally {\n if (fd != null) fs.closeSync(fd);\n }\n}\n\nmodule.exports = { detectLinuxLibc };\n","import { detectLinuxLibc } from \"../lib/libc.cjs\";\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface RuntimeReport {\n header?: {\n glibcVersionRuntime?: string;\n };\n}\n\ninterface TargetOptions {\n libc?: \"gnu\" | \"musl\";\n report?: RuntimeReport;\n}\n\ninterface NativeBindingPathOptions extends TargetOptions {\n packageRoot?: string;\n platform?: NodeJS.Platform;\n arch?: string;\n}\n\nconst NATIVE_PACKAGES: Readonly<Record<string, string>> = {\n \"darwin-arm64\": \"tensorlake-native-darwin-arm64\",\n \"linux-arm64\": \"tensorlake-native-linux-arm64-gnu\",\n \"linux-arm64-musl\": \"tensorlake-native-linux-arm64-musl\",\n \"linux-x64\": \"tensorlake-native-linux-x64-gnu\",\n \"linux-x64-musl\": \"tensorlake-native-linux-x64-musl\",\n \"win32-x64\": \"tensorlake-native-win32-x64\",\n};\n\nfunction packageRoot(): string {\n const parent = fileURLToPath(new URL(\"../\", import.meta.url));\n if (fs.existsSync(path.join(parent, \"package.json\"))) return parent;\n const grandparent = fileURLToPath(new URL(\"../../\", import.meta.url));\n if (fs.existsSync(path.join(grandparent, \"package.json\"))) return grandparent;\n return parent;\n}\n\nlet cachedLinuxLibc: \"gnu\" | \"musl\" | undefined;\n\nfunction linuxLibcFamily(options: TargetOptions): \"gnu\" | \"musl\" {\n if (options.libc != null) return options.libc;\n if (options.report != null) {\n return options.report.header?.glibcVersionRuntime ? \"gnu\" : \"musl\";\n }\n if (cachedLinuxLibc != null) return cachedLinuxLibc;\n\n cachedLinuxLibc = detectLinuxLibc(fs);\n return cachedLinuxLibc;\n}\n\nexport function nativeTargetId(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch,\n options: TargetOptions = {},\n): string {\n const target = `${platform}-${arch}`;\n if (platform !== \"linux\") return target;\n if (options.libc == null && options.report == null && platform !== process.platform) {\n return target;\n }\n return linuxLibcFamily(options) === \"musl\" ? `${target}-musl` : target;\n}\n\nexport function nativeBindingPath(options: NativeBindingPathOptions = {}): string {\n const platform = options.platform ?? process.platform;\n const arch = options.arch ?? process.arch;\n return path.join(\n options.packageRoot ?? packageRoot(),\n \"dist\",\n \"native\",\n nativeTargetId(platform, arch, options),\n \"tensorlake-node.node\",\n );\n}\n\nexport function nativePackageName(\n platform: NodeJS.Platform = process.platform,\n arch: string = process.arch,\n options: TargetOptions = {},\n): string | undefined {\n return NATIVE_PACKAGES[nativeTargetId(platform, arch, options)];\n}\n\nexport function loadNative<T>(): T {\n const target = nativeTargetId();\n const bindingPath = nativeBindingPath();\n const require = createRequire(import.meta.url);\n\n // Local source builds stage the addon here. Published packages intentionally\n // omit this directory and resolve the platform-specific optional dependency.\n if (fs.existsSync(bindingPath)) return require(bindingPath) as T;\n\n const packageName = nativePackageName();\n if (!packageName) {\n throw new Error(\n `Tensorlake does not provide a native binding for ${target}.`,\n );\n }\n\n let packageEntry: string;\n try {\n packageEntry = require.resolve(packageName);\n } catch (cause) {\n throw new Error(\n `Missing native binding package ${packageName} for ${target}. Reinstall tensorlake without omitting optional dependencies, and install dependencies on the machine where they will run.`,\n { cause },\n );\n }\n return require(packageEntry) as T;\n}\n","import 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\";\nimport { loadNative } from \"./native-binding.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 the platform-specific native binding,\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 /** @internal Standalone CLI entry points allow PAT auth; SDK callers do not. */\n _allowPat?: boolean;\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\nlet cachedNativeBinding: NativeBinding | undefined;\nlet cachedNativeBindingError: Error | undefined;\n\nfunction loadNativeBinding(): NativeBinding {\n if (cachedNativeBinding) return cachedNativeBinding;\n if (cachedNativeBindingError) throw cachedNativeBindingError;\n try {\n cachedNativeBinding = loadNative<NativeBinding>();\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 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 usePat = deps._allowPat === true && context.apiKey == null;\n const bearerToken = context.apiKey ?? (usePat ? context.personalAccessToken : undefined);\n if (!bearerToken) {\n if (context.personalAccessToken && !deps._allowPat) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\n deps._allowPat\n ? \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\"\n : \"Missing TENSORLAKE_API_KEY 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: usePat ? context.organizationId : undefined,\n projectId: usePat ? context.projectId : undefined,\n namespace: context.namespace,\n useScopeHeaders: usePat,\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 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 usePat = deps._allowPat === true && context.apiKey == null;\n const bearerToken = context.apiKey ?? (usePat ? context.personalAccessToken : undefined);\n if (!bearerToken) {\n if (context.personalAccessToken && !deps._allowPat) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\n deps._allowPat\n ? \"Missing TENSORLAKE_API_KEY or TENSORLAKE_PAT credentials.\"\n : \"Missing TENSORLAKE_API_KEY credentials.\",\n );\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: usePat ? context.organizationId : undefined,\n projectId: usePat ? context.projectId : undefined,\n namespace: context.namespace,\n useScopeHeaders: usePat,\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;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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`. Ingress derives project scope from the API key.\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;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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`. Ingress derives project scope from the API key.\n */\nexport async function listSandboxImages(): Promise<SandboxTemplate[]> {\n const context = buildContextFromEnv();\n const bearerToken = context.apiKey;\n if (!bearerToken) {\n if (context.personalAccessToken) {\n throw new Error(\n \"Sandbox image SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new Error(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\n\n const client = new CloudClient({\n apiUrl: context.apiUrl,\n apiKey: bearerToken,\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, _allowPat: true },\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, _allowPat: true },\n );\n}\n","// Public API\nexport { SandboxClient } from \"./client.js\";\nexport { Sandbox } from \"./sandbox.js\";\nexport { PendingSandbox } from \"./pending-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 { RepositoryMount } from \"./repository-mount.js\";\nexport type {\n RepositoryMountOptions,\n RepositoryMountStatus,\n RepositoryUnmountOptions,\n} from \"./repository-mount.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 ReadOnlyMountNotSupportedError,\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\";\nexport {\n registerApplication,\n registerFunction,\n retries,\n schema,\n File,\n HttpBody,\n Headers,\n RequestContext,\n Future,\n runLocal,\n runRemote,\n remoteOptions,\n} from \"./applications/index.js\";\nexport type {\n ApplicationCapability,\n ApplicationOptions,\n FunctionOptions,\n SimpleApplicationOptions,\n SimpleFunctionOptions,\n RegisteredFunction,\n Schema,\n Parameter,\n HeadersInit,\n RemoteOptions,\n TailCall,\n} from \"./applications/index.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 SandboxPending,\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 SandboxPendingReason,\n SnapshotStatus,\n ProcessStatus,\n StdinMode,\n OutputMode,\n ContainerState,\n TERMINATION_REASON_NO_CAPACITY,\n TERMINATION_REASON_CANCELLED,\n isSandboxPending,\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 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 AttachFileSystemOptions,\n ClaimSandboxOptions,\n CopySandboxOptions,\n CopiedSandboxResponse,\n CopySandboxResponse,\n CreateSandboxOptions,\n GpuModel,\n GpuRequest,\n GPUResources,\n CreateSandboxResponse,\n PendingSandboxRecord,\n ReadyOptions,\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 GetOrCreateOptions,\n GetOrCreateOutcome,\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 { FilesystemClient } from \"./filesystem.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 private readonly filesystemOptions: {\n apiKey?: string;\n apiUrl?: string;\n organizationId?: string;\n projectId?: string;\n };\n\n constructor(options?: CloudClientOptions) {\n this.cloudClient = new CloudClient(options);\n this.filesystemOptions = {\n apiKey: options?.apiKey,\n apiUrl: options?.apiUrl,\n organizationId: options?.organizationId,\n projectId: options?.projectId,\n };\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 const filesystem = await new FilesystemClient(this.filesystemOptions).create(name);\n return {\n id: filesystem.name,\n name: filesystem.name,\n description,\n status: \"ready\",\n };\n }\n\n async listFileSystems(_options?: {\n organizationId?: string;\n projectId?: string;\n }): Promise<FileSystem[]> {\n const filesystems = await new FilesystemClient(this.filesystemOptions).list();\n return filesystems.map((filesystem) => ({\n id: filesystem.name,\n name: filesystem.name,\n status: filesystem.status,\n }));\n }\n\n async deleteFileSystem(\n fileSystemId: string,\n _options?: { organizationId?: string; projectId?: string },\n ): Promise<void> {\n await new FilesystemClient(this.filesystemOptions).delete(fileSystemId);\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","/**\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 { randomBytes } from \"node:crypto\";\nimport { MountCli } from \"./mount-cli.js\";\nimport * as defaults from \"./defaults.js\";\nimport {\n FileNotFoundInFilesystemError,\n FilesystemAPIError,\n FilesystemError,\n FilesystemNotFoundError,\n MountError,\n ReadOnlyMountNotSupportedError,\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 FILESYSTEM_REPO_KIND = \"filesystem\";\n\nexport interface FilesystemClientOptions {\n apiKey?: string;\n apiUrl?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\n organizationId?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\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 extends MountCli {\n constructor(envOverrides: Record<string, string>) {\n super(\"fs\", envOverrides);\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 if (readonly) {\n // `tl fs mount` has no --ro flag; shelling it out anyway would surface\n // an opaque CLI parse error. Fail honestly instead.\n throw new ReadOnlyMountNotSupportedError();\n }\n await this.run([\"mount\", \"--\", filesystem, localPath]);\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 * The SDK authenticates with `apiKey` or `TENSORLAKE_API_KEY`. Project scope is selected by\n * ingress from the API key; no organization/project lookup is performed. Organization/project\n * options are retained only for the separately installed `tl` CLI used by local mounts.\n */\n constructor(options: FilesystemClientOptions = {}) {\n const context = buildContextFromEnv();\n const token = options.apiKey ?? context.apiKey;\n if (!token) {\n if (context.personalAccessToken) {\n throw new FilesystemError(\n \"Filesystem SDKs require TENSORLAKE_API_KEY. Personal access tokens are CLI-only.\",\n );\n }\n throw new FilesystemError(\n \"Missing TENSORLAKE_API_KEY credentials.\",\n );\n }\n const organizationId = options.organizationId ?? context.organizationId;\n const projectId = options.projectId ?? context.projectId;\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 null,\n null,\n `tensorlake-typescript-sdk/${defaults.SDK_VERSION}`,\n null,\n );\n }\n const envOverrides: Record<string, string> = {\n TENSORLAKE_API_KEY: token,\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 (organizationId) envOverrides.TENSORLAKE_ORGANIZATION_ID = organizationId;\n if (projectId) envOverrides.TENSORLAKE_PROJECT_ID = projectId;\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 /**\n * Mount a filesystem to a local path (requires the `tl` CLI).\n *\n * `readonly: true` is not supported for local mounts and throws\n * {@link ReadOnlyMountNotSupportedError}; use a sandbox read-only mount\n * (`readOnly: true`) or `tl git mount --ro` instead.\n */\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 /**\n * Mount this filesystem to a local path (requires the `tl` CLI).\n *\n * `readonly: true` is not supported for local mounts and throws\n * {@link ReadOnlyMountNotSupportedError}; use a sandbox read-only mount\n * (`readOnly: true`) or `tl git mount --ro` instead.\n */\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","import { execFile } from \"node:child_process\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { CliNotFoundError, MountError } from \"./filesystem-models.js\";\n\nconst execFileAsync = promisify(execFile);\n\n/** Shared command runner for the separately installed local mount daemon. */\nexport class MountCli {\n private binary: string | null = null;\n\n constructor(\n private readonly command: \"fs\" | \"git\",\n private readonly envOverrides: Record<string, string>,\n ) {}\n\n private async findCli(): Promise<string> {\n const candidates: string[] = [];\n if (process.env.TENSORLAKE_CLI) candidates.push(process.env.TENSORLAKE_CLI);\n candidates.push(\"tl\");\n const installed = join(homedir(), \".tensorlake\", \"bin\", \"tl\");\n try {\n // Probe present-but-broken installs too, so they report an upgrade error.\n accessSync(installed, constants.F_OK);\n candidates.push(installed);\n } catch {\n // Not installed at the default path.\n }\n const support = this.command === \"git\" ? \"git mount\" : \"fs\";\n const probe = this.command === \"git\" ? [\"git\", \"mount\", \"--help\"] : [\"fs\", \"--help\"];\n let unsupported: string | null = null;\n for (const candidate of candidates) {\n try {\n await execFileAsync(candidate, probe, { timeout: 15_000 });\n return candidate;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") unsupported = candidate;\n }\n }\n throw new CliNotFoundError(\n unsupported\n ? `\\`tl\\` at ${unsupported} does not support \\`tl ${support}\\` (upgrade required)`\n : \"`tl` was not found on PATH\",\n support,\n );\n }\n\n protected async run(args: string[], timeoutMs = 300_000): Promise<string> {\n if (this.binary === null) this.binary = await this.findCli();\n try {\n const { stdout } = await execFileAsync(this.binary, [this.command, ...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 ${this.command} ${args[0]}\\` timed out after ${timeoutMs}ms`);\n }\n const detail = (failure.stderr || failure.stdout || String(error)).trim();\n throw new MountError(`\\`tl ${this.command} ${args.join(\" \")}\\` failed: ${detail}`);\n }\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 ||\n raw.file_system ||\n raw.repository ||\n null) as string | 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 ReadOnlyMountNotSupportedError extends MountError {\n constructor() {\n super(\n \"read-only local mounts are not supported: `tl fs mount` has no --ro \" +\n \"mode. Mount the filesystem into a sandbox read-only instead \" +\n \"(readOnly: true / `tl sbx create -f NAME:PATH:ro`), or use \" +\n \"`tl git mount --ro` for repositories.\",\n );\n this.name = \"ReadOnlyMountNotSupportedError\";\n }\n}\n\nexport class CliNotFoundError extends MountError {\n constructor(detail: string, command: \"fs\" | \"git mount\" = \"fs\") {\n super(\n `Mount operations require the Tensorlake CLI (\\`tl\\`) with \\`tl ${command}\\` ` +\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","import * as defaults from \"./defaults.js\";\nimport { releaseNativeHandle } from \"./native-worker-client.js\";\nimport { SandboxError } from \"./errors.js\";\nimport type { Traced } from \"./traced.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\";\nimport {\n GitCli,\n type RepositoryMount,\n type RepositoryMountOptions,\n type RepositoryMountStatus,\n type RepositoryUnmountOptions,\n} from \"./repository-mount.js\";\n\nexport interface RepositoryClientOptions {\n apiUrl?: string;\n apiKey?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\n organizationId?: string;\n /** @deprecated Scope is selected by ingress for SDK API keys; used only by local `tl` mounts. */\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 private readonly cli: GitCli;\n\n constructor(options?: RepositoryClientOptions) {\n this.requestTimeoutMs = resolveRequestTimeoutMs(options);\n const apiKey = options?.apiKey ?? defaults.API_KEY;\n if (!apiKey) {\n throw new SandboxError(\"Missing TENSORLAKE_API_KEY credentials.\");\n }\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 apiKey,\n null,\n null,\n null,\n this.requestTimeoutMs / 1000,\n );\n const context = buildContextFromEnv();\n const envOverrides: Record<string, string> = {\n TENSORLAKE_API_KEY: apiKey,\n TENSORLAKE_API_URL: options?.apiUrl ?? defaults.API_URL,\n };\n const organizationId = options?.organizationId ?? context.organizationId;\n const projectId = options?.projectId ?? context.projectId;\n if (organizationId) envOverrides.TENSORLAKE_ORGANIZATION_ID = organizationId;\n if (projectId) envOverrides.TENSORLAKE_PROJECT_ID = projectId;\n this.cli = new GitCli(envOverrides);\n }\n\n static forCloud(options?: RepositoryClientOptions): RepositoryClient {\n return new RepositoryClient({\n ...options,\n apiUrl: options?.apiUrl ?? \"https://api.tensorlake.ai\",\n apiKey: options?.apiKey,\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 organizationId: context.organizationId,\n projectId: context.projectId,\n });\n }\n\n close(): void {\n releaseNativeHandle(this.native);\n }\n\n /**\n * Mount `repo[:branch|tag|full-commit][//subtree]` to a local directory.\n * Requires the separately installed `tl` CLI with mount support. Mounts\n * live on the machine running Node.js and must be explicitly unmounted.\n */\n async mount(\n target: string,\n localPath: string,\n options?: RepositoryMountOptions,\n ): Promise<RepositoryMount> {\n return this.cli.mount(target, localPath, options);\n }\n\n /** Detach a local repository mount, optionally deleting its private workspace. */\n async unmount(localPath: string, options?: RepositoryUnmountOptions): Promise<void> {\n await this.cli.unmount(localPath, options);\n }\n\n /** Inspect a local mount; defaults to the mount containing the current directory. */\n async mountStatus(localPath?: string): Promise<RepositoryMountStatus> {\n return this.cli.status(localPath);\n }\n\n async url(repo: string): Promise<string> {\n return callNative(() => 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","import { resolve } from \"node:path\";\nimport { MountError } from \"./filesystem-models.js\";\nimport { MountCli } from \"./mount-cli.js\";\n\nexport interface RepositoryMountOptions {\n /** Stateless read-only view; cannot be combined with publish or workspace. */\n readOnly?: boolean;\n /** Publish each explicit snapshot onto the mounted branch. */\n publish?: boolean;\n /** Resume a private workspace; cannot be combined with publish or readOnly. */\n workspace?: string;\n}\n\nexport interface RepositoryUnmountOptions {\n /** Delete the private server workspace after detaching. Defaults to false. */\n deleteWorkspace?: boolean;\n /** Drop unpublished local state. Defaults to false. */\n discard?: boolean;\n}\n\n/** Stable fields from `tl git status --json`, with the full payload in raw. */\nexport interface RepositoryMountStatus {\n path: string;\n repository: string | null;\n reference: string | null;\n workspaceId: string | null;\n state: string | null;\n localChanges: boolean | null;\n raw: Record<string, unknown>;\n}\n\nfunction requireNonEmpty(value: string, name: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${name} must be a non-empty string`);\n }\n}\n\n/** @internal CLI implementation; obtain mounts through RepositoryClient. */\nexport class GitCli extends MountCli {\n constructor(envOverrides: Record<string, string>) {\n super(\"git\", envOverrides);\n }\n\n async mount(\n target: string,\n localPath: string,\n options: RepositoryMountOptions = {},\n ): Promise<RepositoryMount> {\n requireNonEmpty(target, \"target\");\n requireNonEmpty(localPath, \"localPath\");\n if (options.workspace !== undefined) requireNonEmpty(options.workspace, \"workspace\");\n if (\n (options.readOnly && (options.publish || options.workspace !== undefined)) ||\n (options.publish && options.workspace !== undefined)\n ) {\n throw new TypeError(\"readOnly, publish, and workspace are mutually exclusive\");\n }\n // Keep the handle attached to this path if the caller later changes CWD.\n const path = resolve(localPath);\n const args = [\"mount\"];\n if (options.readOnly) args.push(\"--ro\");\n if (options.publish) args.push(\"--publish\");\n if (options.workspace !== undefined) args.push(`--workspace=${options.workspace}`);\n // No shell: preserve refs, subtrees, whitespace, and option-like names literally.\n args.push(\"--\", target, path);\n await this.run(args);\n return new RepositoryMount(this, target, path, options.readOnly ?? false);\n }\n\n async unmount(localPath: string, options: RepositoryUnmountOptions = {}): Promise<void> {\n requireNonEmpty(localPath, \"localPath\");\n const args = [\"unmount\"];\n if (options.deleteWorkspace) args.push(\"--delete\");\n if (options.discard) args.push(\"--discard\");\n args.push(\"--\", resolve(localPath));\n await this.run(args);\n }\n\n async status(localPath?: string): Promise<RepositoryMountStatus> {\n const args = [\"status\", \"--json\"];\n if (localPath !== undefined) {\n requireNonEmpty(localPath, \"localPath\");\n args.push(\"--\", resolve(localPath));\n }\n const output = await this.run(args, 60_000);\n let raw: Record<string, unknown>;\n try {\n const payload: unknown = JSON.parse(output);\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n throw new Error(\"expected a JSON object\");\n }\n raw = payload as Record<string, unknown>;\n } catch {\n throw new MountError(`\\`tl git status --json\\` returned invalid JSON: ${output.slice(0, 200)}`);\n }\n const stringField = (key: string): string | null =>\n typeof raw[key] === \"string\" ? raw[key] : null;\n return {\n path: stringField(\"mountpoint\") ?? (localPath === undefined ? \"\" : resolve(localPath)),\n repository: stringField(\"repository\"),\n reference: stringField(\"reference\"),\n workspaceId: stringField(\"workspace\"),\n state: stringField(\"state\"),\n localChanges: typeof raw.local_changes === \"boolean\" ? raw.local_changes : null,\n raw,\n };\n }\n\n async snapshot(path: string, message?: string): Promise<void> {\n const args = [\"snapshot\"];\n if (message !== undefined) args.push(`--message=${message}`);\n args.push(\"--\", path);\n await this.run(args);\n }\n\n async sync(path: string, target?: string): Promise<void> {\n const args = [\"sync\", \"--\", path];\n if (target !== undefined) {\n requireNonEmpty(target, \"target\");\n args.push(target);\n }\n await this.run(args);\n }\n\n async rebase(path: string, target: string, failOnConflict: boolean): Promise<void> {\n requireNonEmpty(target, \"target\");\n const args = [\"rebase\"];\n if (failOnConflict) args.push(\"--fail-on-conflict\");\n args.push(\"--\", path, target);\n await this.run(args);\n }\n\n async promote(path: string, branch: string, merge: boolean): Promise<void> {\n requireNonEmpty(branch, \"branch\");\n const args = [\"promote\"];\n if (merge) args.push(\"--merge\");\n args.push(\"--\", path, branch);\n await this.run(args);\n }\n\n async prefetch(path: string): Promise<void> {\n await this.run([\"prefetch\", \"--\", path]);\n }\n}\n\n/** A repository mounted on the machine running Node.js via the `tl` CLI daemon. */\nexport class RepositoryMount {\n /** @internal Obtain instances via RepositoryClient.mount(). */\n constructor(\n private readonly cli: GitCli,\n /** Initial source (`repo[:ref][//subtree]`); sync/rebase can change the base. */\n readonly target: string,\n readonly path: string,\n readonly readOnly: boolean,\n ) {}\n\n /** Inspect workspace state, pending changes, and daemon diagnostics. */\n async status(): Promise<RepositoryMountStatus> {\n return this.cli.status(this.path);\n }\n\n /** Materialize autosaved edits as a commit; publish mounts also update their branch. */\n async snapshot(message?: string): Promise<void> {\n await this.cli.snapshot(this.path, message);\n }\n\n /** Refresh the current source, or switch an unsnapshotted workspace to a new base. */\n async sync(target?: string): Promise<void> {\n await this.cli.sync(this.path, target);\n }\n\n /** Replay snapshots and pending edits onto another base. Conflicts become diff3 markers by default. */\n async rebase(target: string, options?: { failOnConflict?: boolean }): Promise<void> {\n await this.cli.rebase(this.path, target, options?.failOnConflict ?? false);\n }\n\n /** Publish the workspace to a branch; merge allows landing when the branch moved. */\n async promote(branch: string, options?: { merge?: boolean }): Promise<void> {\n await this.cli.promote(this.path, branch, options?.merge ?? false);\n }\n\n /** Download and verify the mounted working set for network-free reads. */\n async prefetch(): Promise<void> {\n await this.cli.prefetch(this.path);\n }\n\n /** Detach, retaining the private workspace and unpublished state unless explicitly requested. */\n async unmount(options?: RepositoryUnmountOptions): Promise<void> {\n await this.cli.unmount(this.path, options);\n }\n}\n","import type { FileSystem } from \"./cloud-models.js\";\nimport { FilesystemClient } from \"./filesystem.js\";\n\n/**\n * Compatibility helpers for Artifact Storage filesystems.\n *\n * New code should use {@link FilesystemClient} directly. These helpers retain\n * the original create/list/delete API and authenticate with\n * `TENSORLAKE_API_KEY`; ingress selects the project scope.\n *\n * To mount a registered file system into a sandbox, pass\n * `fileSystems` to `Sandbox.create()` (including warm-pool claims) or call\n * `sandbox.attachFileSystem()` / `sandbox.detachFileSystem()` on a\n * running sandbox.\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 filesystem = await new FilesystemClient().create(name);\n return {\n id: filesystem.name,\n name: filesystem.name,\n description,\n status: \"ready\",\n };\n}\n\n/** List all registered file systems for the current project. */\nexport async function listFileSystems(): Promise<FileSystem[]> {\n const filesystems = await new FilesystemClient().list();\n return filesystems.map((filesystem) => ({\n id: filesystem.name,\n name: filesystem.name,\n status: filesystem.status,\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 await new FilesystemClient().delete(fileSystemId);\n}\n","export {\n registerApplication,\n registerFunction,\n retries,\n FunctionFuture as Future,\n type ApplicationCapability,\n type ApplicationOptions,\n type FunctionOptions,\n type SimpleApplicationOptions,\n type SimpleFunctionOptions,\n type RegisteredFunction,\n type TailCall,\n type WaitOptions,\n type WaitResult,\n} from \"./function.js\";\nexport { schema, type Schema, type Parameter, type Infer, type ParameterValues } from \"./schema.js\";\nexport { File } from \"./file.js\";\nexport { HttpBody } from \"./http-body.js\";\nexport { Headers, type HeadersInit } from \"./headers.js\";\nexport { Image } from \"../image.js\";\nexport { SDK_VERSION } from \"../defaults.js\";\nexport { RequestContext, type RequestContextValue } from \"./context.js\";\nexport { runLocal, LocalRequest } from \"./local.js\";\nexport {\n runRemote,\n remoteOptions,\n RemoteRequest,\n type RemoteOptions,\n} from \"./remote.js\";\nexport {\n TensorlakeApplicationError,\n SDKUsageError,\n SerializationError,\n DeserializationError,\n FunctionError,\n TimeoutError,\n RequestError,\n ReplayMismatchError,\n} from \"./errors.js\";\nexport {\n createApplicationManifest,\n createApplicationManifests,\n createCodeManifest,\n decodeDescriptor,\n type ApplicationManifest,\n type FunctionManifest,\n type CodeManifest,\n} from \"./manifest.js\";\nexport { getApplications, getFunctions, getFunction } from \"./registry.js\";\n","import { AsyncLocalStorage, executionAsyncId } from \"node:async_hooks\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Image } from \"../image.js\";\nimport { SDKUsageError } from \"./errors.js\";\nimport type { Parameter, ParameterValues, Schema } from \"./schema.js\";\nimport { schema, validateWithSchema } from \"./schema.js\";\nimport { registerDefinition } from \"./registry.js\";\n\nexport interface Retries {\n maxRetries: number;\n}\n\nexport function retries(options: Retries): Retries {\n if (\n typeof options !== \"object\"\n || options == null\n || !Number.isInteger(options.maxRetries)\n || options.maxRetries < 0\n || options.maxRetries > 10\n ) {\n throw new SDKUsageError(\"maxRetries must be an integer between 0 and 10\");\n }\n return Object.freeze({ ...options });\n}\n\nexport type Region = \"us-east-1\" | \"eu-west-1\";\n\nexport type ApplicationCapability = \"unauthenticated_requests\";\n\nexport interface FunctionOptions<\n P extends readonly Parameter<unknown>[],\n R,\n> {\n name?: string;\n parameters: P;\n returns: Schema<R>;\n description?: string;\n cpu?: number;\n memory?: number;\n ephemeralDisk?: number;\n gpu?: string | string[] | null;\n timeout?: number;\n image?: Image;\n secrets?: string[];\n retries?: Retries;\n region?: Region;\n warmContainers?: number;\n minContainers?: number;\n maxContainers?: number;\n}\n\nexport interface ApplicationOptions<\n P extends readonly Parameter<unknown>[],\n R,\n> extends FunctionOptions<P, R> {\n tags?: Record<string, string>;\n applicationRetries?: Retries;\n allow?: readonly ApplicationCapability[];\n}\n\n/** Options available when parameter and return schemas use the JSON defaults. */\nexport type SimpleFunctionOptions = Omit<\n FunctionOptions<readonly Parameter<unknown>[], unknown>,\n \"name\" | \"parameters\" | \"returns\"\n>;\n\n/** Application options available when parameter and return schemas use the JSON defaults. */\nexport type SimpleApplicationOptions = Omit<\n ApplicationOptions<readonly Parameter<unknown>[], unknown>,\n \"name\" | \"parameters\" | \"returns\"\n>;\n\nexport interface NormalizedFunctionOptions {\n description: string;\n cpu: number;\n memory: number;\n ephemeralDisk: number;\n gpu: string | string[] | null;\n timeout: number;\n image?: Image;\n secrets: string[];\n retries?: Retries;\n region?: Region;\n warmContainers?: number;\n minContainers?: number;\n maxContainers?: number;\n}\n\nexport interface ApplicationConfiguration {\n tags: Record<string, string>;\n retries: Retries;\n allow: ApplicationCapability[];\n version: string;\n}\n\nexport interface RegisteredDefinition {\n readonly name: string;\n readonly handler: (...args: unknown[]) => Promise<unknown>;\n readonly parameters: readonly Parameter<unknown>[];\n readonly returns: Schema<unknown>;\n readonly options: NormalizedFunctionOptions;\n readonly application?: ApplicationConfiguration;\n}\n\n// A string discriminator alone is valid user JSON and cannot safely identify\n// an SDK control-flow value. Symbol.for keeps the brand stable when the user\n// application and executor load separate copies of the SDK in one process.\nconst TAIL_CALL_BRAND: unique symbol = Symbol.for(\n \"tensorlake.applications.tail-call.v1\",\n);\n\nexport interface TailCall<T> {\n readonly [TAIL_CALL_BRAND]: true;\n readonly kind: \"tensorlake-tail-call\";\n readonly definition: RegisteredDefinition;\n readonly args: readonly unknown[];\n readonly _result?: T;\n}\n\nexport interface WaitOptions {\n timeout?: number;\n returnWhen?: \"all_completed\" | \"first_completed\" | \"first_failure\";\n}\n\nexport interface WaitResult<T> {\n done: FunctionFuture<T>[];\n notDone: FunctionFuture<T>[];\n}\n\nexport interface FunctionRuntime {\n invoke<T>(definition: RegisteredDefinition, args: readonly unknown[]): Promise<T>;\n runFuture<T>(future: FunctionFuture<T>): Promise<T>;\n wrapFutureWait?<T>(promise: Promise<T>): Promise<T>;\n trackMixedPromiseRace?(\n promise: Promise<unknown>,\n producers?: readonly Promise<unknown>[],\n ): void;\n trackPromiseSettlement?(\n promise: Promise<unknown>,\n onSettled: () => void,\n ): boolean;\n trackDurablePromiseConsumption?(promise: Promise<unknown>): void;\n runPromiseAggregateConstruction?<T>(callback: () => T): T;\n reduce<T>(\n definition: RegisteredDefinition,\n items: readonly unknown[],\n initial: unknown,\n hasInitial: boolean,\n ): Promise<T>;\n}\n\n// FunctionFuture observes durable promises to update its public completion\n// fields. That bookkeeping must not look like an application-level await to\n// the strict replay causality tracker. Symbol.for keeps the private observer\n// available when the application and executor use separate SDK bundles.\nexport const DURABLE_PROMISE_OBSERVER = Symbol.for(\n \"tensorlake.applications.durable-promise-observer.v1\",\n);\n\n// SDK combinators must be able to compose durable promises without making\n// their private bookkeeping look like a user continuation. The aggregate\n// returned to user code is wrapped separately.\nexport const DURABLE_PROMISE_INTERNAL_THEN = Symbol.for(\n \"tensorlake.applications.durable-promise-internal-then.v1\",\n);\n\ninterface ObservableDurablePromise<T> extends Promise<T> {\n [DURABLE_PROMISE_OBSERVER]?: (\n onfulfilled: (value: T) => void,\n onrejected: (reason: unknown) => void,\n ) => void;\n [DURABLE_PROMISE_INTERNAL_THEN]?: <TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ) => Promise<TResult1 | TResult2>;\n}\n\n// The user application and function executor are separate bundles loaded into\n// one Node process. Store the runtime on globalThis so durable calls made by the\n// application SDK copy reach the executor SDK copy that installed the runtime.\nconst FUNCTION_RUNTIME_STORAGE_KEY = Symbol.for(\n \"tensorlake.applications.function-runtime-storage.v1\",\n);\n\nconst PROMISE_INSTRUMENTED_KEY = Symbol.for(\n \"tensorlake.applications.promise-instrumented.v3\",\n);\n\nconst PROMISE_THEN_INSTRUMENTED_KEY = Symbol.for(\n \"tensorlake.applications.promise-then-instrumented.v1\",\n);\n\nconst DURABLE_THENABLE_REGISTRY_KEY = Symbol.for(\n \"tensorlake.applications.durable-thenable-registry.v2\",\n);\n\nconst INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY = Symbol.for(\n \"tensorlake.applications.internal-promise-aggregate-depth.v1\",\n);\n\ninterface DurableAssimilationRegistration {\n active: boolean;\n readonly detach: () => void;\n}\n\ninterface DurableThenableMetadata {\n readonly aggregateExpectations: DurableAggregateExpectation[];\n readonly provenanceExpectations: DurableProvenanceExpectation[];\n}\n\ninterface DurableThenableProvenance {\n readonly metadata: DurableThenableMetadata;\n readonly assimilation?: DurableAssimilationRegistration;\n readonly detached?: true;\n}\n\ninterface DurableAggregateScope {\n settled: boolean;\n readonly metadata: Set<DurableThenableMetadata>;\n}\n\ninterface DurableAggregateExpectation {\n readonly scope: DurableAggregateScope;\n readonly creatorAsyncId: number;\n}\n\ninterface DurableProvenanceExpectation {\n readonly value: object;\n readonly creatorAsyncId: number;\n}\n\nexport interface DurableAssimilation {\n finish(): void;\n link<T extends object>(value: T): T;\n}\n\nlet futureCompletionCounter = 0;\n\nfunction runtimeStorage(): AsyncLocalStorage<FunctionRuntime> {\n const target = globalThis as typeof globalThis & {\n [FUNCTION_RUNTIME_STORAGE_KEY]?: AsyncLocalStorage<FunctionRuntime>;\n };\n target[FUNCTION_RUNTIME_STORAGE_KEY] ??= new AsyncLocalStorage<FunctionRuntime>();\n return target[FUNCTION_RUNTIME_STORAGE_KEY];\n}\n\nexport function currentFunctionRuntime(): FunctionRuntime | undefined {\n return runtimeStorage().getStore();\n}\n\nexport function runWithFunctionRuntime<T>(\n runtime: FunctionRuntime,\n callback: () => Promise<T>,\n): Promise<T> {\n return runtimeStorage().run(runtime, callback);\n}\n\nexport class FunctionFuture<T> implements PromiseLike<T> {\n readonly id = randomUUID();\n readonly definition: RegisteredDefinition;\n readonly args: readonly unknown[];\n private promise?: Promise<T>;\n private startDelaySeconds = 0;\n private completionOrder?: number;\n private failed = false;\n exception?: unknown;\n done = false;\n\n constructor(definition: RegisteredDefinition, args: readonly unknown[]) {\n this.definition = definition;\n this.args = args;\n registerDurableThenable(this);\n }\n\n run(): this {\n if (this.promise != null) throw new SDKUsageError(`Future ${this.id} is already running`);\n const runtime = currentFunctionRuntime();\n const promise = runtime == null\n ? executeHandler<T>(this.definition, this.args)\n : runtime.runFuture(this);\n // The future and its runtime promise are two views of the same durable\n // operation. Sharing provenance lets Promise.resolve/fan-in wrappers keep\n // the exact durable contender identity.\n registerDurableThenable(promise, this);\n this.promise = promise;\n const onfulfilled = (value: T) => {\n this.done = true;\n this.completionOrder = futureCompletionCounter;\n futureCompletionCounter += 1;\n return value;\n };\n const onrejected = (error: unknown) => {\n this.done = true;\n this.failed = true;\n this.exception = error;\n this.completionOrder = futureCompletionCounter;\n futureCompletionCounter += 1;\n };\n const observer = (promise as ObservableDurablePromise<T>)[DURABLE_PROMISE_OBSERVER];\n if (observer != null) {\n observer.call(promise, onfulfilled, onrejected);\n } else {\n void promise.then(\n (value) => {\n onfulfilled(value);\n },\n (error) => {\n onrejected(error);\n },\n );\n }\n // The completion observer handles rejection without changing `this.promise`,\n // so result()/await still receive the original rejection while Node does not\n // treat an intentionally unawaited future as an unhandled rejection.\n return this;\n }\n\n runLater(delaySeconds: number): this {\n if (!Number.isFinite(delaySeconds) || delaySeconds < 0) {\n throw new SDKUsageError(\"Future delay must be a non-negative finite number\");\n }\n if (this.promise != null) {\n throw new SDKUsageError(`Future ${this.id} is already running`);\n }\n this.startDelaySeconds = delaySeconds;\n return this.run();\n }\n\n get delaySeconds(): number {\n return this.startDelaySeconds;\n }\n\n result(): Promise<T> {\n if (this.promise == null) this.run();\n return this.promise as Promise<T>;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.result().then(onfulfilled, onrejected);\n }\n\n static wait<T>(futures: FunctionFuture<T>[], options: WaitOptions = {}): Promise<WaitResult<T>> {\n const completion = FunctionFuture.waitForFutures(futures, options);\n // Returning the runtime wrapper lets strict replay observe when user code\n // awaits this aggregate promise. Merely creating a Future.wait remains\n // fire-and-forget and must not trigger a mismatch.\n return currentFunctionRuntime()?.wrapFutureWait?.(completion) ?? completion;\n }\n\n private static async waitForFutures<T>(\n futures: FunctionFuture<T>[],\n options: WaitOptions,\n ): Promise<WaitResult<T>> {\n const returnWhen = options.returnWhen ?? \"all_completed\";\n if (![\"all_completed\", \"first_completed\", \"first_failure\"].includes(returnWhen)) {\n throw new SDKUsageError(`Unsupported Future.wait returnWhen value '${returnWhen}'`);\n }\n if (options.timeout != null && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n throw new SDKUsageError(\"Future.wait timeout must be a non-negative finite number\");\n }\n futures.forEach((future) => {\n if (future.promise == null) future.run();\n });\n const alreadyDone = futures.filter((future) => future.done);\n if (\n alreadyDone.length > 0\n && (\n returnWhen === \"first_completed\"\n || (\n returnWhen === \"first_failure\"\n && alreadyDone.some((future) => future.failed)\n )\n )\n ) {\n return {\n done: alreadyDone,\n notDone: futures.filter((future) => !future.done),\n };\n }\n const pending = futures.filter((future) => !future.done);\n if (pending.length === 0) {\n return { done: [...futures], notDone: [] };\n }\n let wait: Promise<FutureWaitOutcome<T>>;\n if (returnWhen === \"all_completed\") {\n wait = internalPromiseAll(\n pending.map((future) => internalDurableThen(future.result(),\n () => undefined,\n () => undefined,\n )),\n ).then(() => ({ kind: \"all_completed\" }));\n } else if (returnWhen === \"first_completed\") {\n wait = internalPromiseRace(\n pending.map((future) => internalDurableThen(future.result(),\n () => ({ kind: \"cutoff\", future } as const),\n () => ({ kind: \"cutoff\", future } as const),\n )),\n );\n } else {\n wait = new Promise((resolve) => {\n let remaining = pending.length;\n for (const future of pending) {\n void internalDurableThen(\n future.result(),\n () => {\n remaining -= 1;\n if (remaining === 0) resolve({ kind: \"all_completed\" });\n },\n () => resolve({ kind: \"cutoff\", future }),\n );\n }\n });\n }\n const outcome = await waitUntilOrTimeout(wait, options.timeout);\n if (outcome.kind === \"cutoff\") {\n const completionCutoff = outcome.future.completionOrder;\n if (completionCutoff == null) {\n throw new SDKUsageError(\"Future.wait winner has no completion order\");\n }\n const doneSet = new Set(alreadyDone);\n for (const future of pending) {\n if (\n future.done\n && future.completionOrder != null\n && future.completionOrder <= completionCutoff\n ) {\n doneSet.add(future);\n }\n }\n return {\n done: futures.filter((future) => doneSet.has(future)),\n notDone: futures.filter((future) => !doneSet.has(future)),\n };\n }\n return {\n done: futures.filter((future) => future.done),\n notDone: futures.filter((future) => !future.done),\n };\n }\n}\n\ntype FutureWaitOutcome<T> =\n | { kind: \"all_completed\" }\n | { kind: \"cutoff\"; future: FunctionFuture<T> };\n\nasync function waitUntilOrTimeout<T>(\n promise: Promise<T>,\n timeoutSeconds?: number,\n): Promise<T | { kind: \"timeout\" }> {\n if (timeoutSeconds == null) {\n return promise;\n }\n let timer: NodeJS.Timeout | undefined;\n try {\n return await internalPromiseRace<T | { kind: \"timeout\" }>([\n promise,\n new Promise<{ kind: \"timeout\" }>((resolve) => {\n timer = setTimeout(() => resolve({ kind: \"timeout\" }), timeoutSeconds * 1000);\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\ntype Awaitable<T> = T | PromiseLike<T>;\ntype AwaitableIterable<T> = Iterable<Awaitable<T>> | PromiseLike<Iterable<Awaitable<T>>>;\n\nfunction isDurableThenable(value: unknown): boolean {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value == null) {\n return false;\n }\n return durableThenableRegistry().has(value);\n}\n\nexport function isDetachedDurableThenable(value: unknown): boolean {\n const provenance = provenanceForDurableThenable(value);\n return provenance?.detached === true\n || (provenance?.assimilation != null && !provenance.assimilation.active);\n}\n\nfunction durableThenableRegistry(): WeakMap<object, DurableThenableProvenance> {\n const target = globalThis as typeof globalThis & {\n [DURABLE_THENABLE_REGISTRY_KEY]?: WeakMap<object, DurableThenableProvenance>;\n };\n target[DURABLE_THENABLE_REGISTRY_KEY] ??=\n new WeakMap<object, DurableThenableProvenance>();\n return target[DURABLE_THENABLE_REGISTRY_KEY];\n}\n\nfunction newDurableThenableMetadata(): DurableThenableMetadata {\n return {\n aggregateExpectations: [],\n provenanceExpectations: [],\n };\n}\n\nfunction metadataForDurableThenable(value: unknown): DurableThenableMetadata | undefined {\n return provenanceForDurableThenable(value)?.metadata;\n}\n\nfunction provenanceForDurableThenable(\n value: unknown,\n): DurableThenableProvenance | undefined {\n if ((typeof value !== \"object\" && typeof value !== \"function\") || value == null) {\n return undefined;\n }\n return durableThenableRegistry().get(value);\n}\n\nexport function registerDurableThenable<T extends object>(\n value: T,\n source?: object,\n): T {\n const registry = durableThenableRegistry();\n const metadata = source == null\n ? registry.get(value)?.metadata ?? newDurableThenableMetadata()\n : registry.get(source)?.metadata ?? newDurableThenableMetadata();\n registry.set(value, { metadata });\n if (source != null && !registry.has(source)) registry.set(source, { metadata });\n return value;\n}\n\nfunction registerDetachedDurableThenable<T extends object>(value: T): T {\n const registry = durableThenableRegistry();\n registry.set(value, {\n metadata: registry.get(value)?.metadata ?? newDurableThenableMetadata(),\n detached: true,\n });\n return value;\n}\n\nfunction inheritDurableThenable<T extends object>(value: T, source: object): T {\n const provenance = durableThenableRegistry().get(source);\n if (provenance == null) return value;\n durableThenableRegistry().set(value, provenance);\n if (provenance.assimilation == null) {\n provenance.metadata.provenanceExpectations.push({\n value,\n creatorAsyncId: executionAsyncId(),\n });\n }\n return value;\n}\n\n/**\n * Associates a replay-aware durable assimilation with its durable provenance.\n *\n * The returned handle marks normal settlement and links derived promises to\n * this exact assimilation. Promise aggregate construction can detach the\n * aggregate's internal reaction so it is not mistaken for application code\n * awaiting the returned aggregate.\n */\nexport function registerDurableAssimilation(\n value: object,\n detach: () => void,\n): DurableAssimilation {\n const metadata = metadataForDurableThenable(value);\n if (metadata == null) {\n return {\n finish: () => undefined,\n link: (linked) => linked,\n };\n }\n const registration: DurableAssimilationRegistration = {\n active: true,\n detach,\n };\n const provenanceIndex = metadata.provenanceExpectations.findIndex((expectation) =>\n expectation.creatorAsyncId !== executionAsyncId()\n );\n if (provenanceIndex >= 0) {\n const [expectation] = metadata.provenanceExpectations.splice(provenanceIndex, 1);\n durableThenableRegistry().set(expectation.value, {\n metadata,\n assimilation: registration,\n });\n }\n const expectationIndex = metadata.aggregateExpectations.findIndex((expectation) =>\n !expectation.scope.settled\n && expectation.creatorAsyncId !== executionAsyncId()\n );\n if (expectationIndex >= 0) {\n const [expectation] = metadata.aggregateExpectations.splice(expectationIndex, 1);\n associateAssimilationWithAggregate(registration, expectation.scope);\n }\n return {\n finish: () => finishDurableAssimilation(registration),\n link: <T extends object>(linked: T): T => {\n durableThenableRegistry().set(linked, {\n metadata,\n assimilation: registration,\n });\n return linked;\n },\n };\n}\n\nfunction associateAssimilationWithAggregate(\n registration: DurableAssimilationRegistration,\n scope: DurableAggregateScope,\n): void {\n if (!registration.active || scope.settled) return;\n finishDurableAssimilation(registration);\n registration.detach();\n}\n\nfunction finishDurableAssimilation(registration: DurableAssimilationRegistration): void {\n if (!registration.active) return;\n registration.active = false;\n}\n\nfunction trackDurableAggregate(\n runtime: FunctionRuntime,\n result: Promise<unknown>,\n durableContenders: readonly unknown[],\n markResult: boolean,\n): void {\n const scope: DurableAggregateScope = {\n settled: false,\n metadata: new Set<DurableThenableMetadata>(),\n };\n if (markResult) {\n // Constructing an aggregate attaches internal reactions to its durable\n // inputs, but that does not mean application code is awaiting the result.\n // Mark the aggregate itself as detached so a later user reaction becomes\n // the durable assimilation observed by strict replay.\n registerDetachedDurableThenable(result);\n }\n const creatorAsyncId = executionAsyncId();\n for (const contender of durableContenders) {\n const provenance = provenanceForDurableThenable(contender);\n if (provenance == null) continue;\n if (provenance.assimilation != null) {\n associateAssimilationWithAggregate(provenance.assimilation, scope);\n } else {\n provenance.metadata.aggregateExpectations.push({\n scope,\n creatorAsyncId,\n });\n }\n if (scope.metadata.has(provenance.metadata)) continue;\n const { metadata } = provenance;\n scope.metadata.add(metadata);\n }\n const settle = () => {\n if (scope.settled) return;\n scope.settled = true;\n for (const metadata of scope.metadata) {\n for (let index = metadata.aggregateExpectations.length - 1; index >= 0; index -= 1) {\n if (metadata.aggregateExpectations[index].scope === scope) {\n metadata.aggregateExpectations.splice(index, 1);\n }\n }\n }\n scope.metadata.clear();\n };\n // Promise.prototype.then still performs a user-observable Symbol.species\n // lookup even when invoked directly. The executor observes the native\n // promiseResolve async hook instead, so bookkeeping cannot call user code or\n // construct an extra subclass promise.\n if (runtime.trackPromiseSettlement?.(result, settle) !== true) settle();\n}\n\ninterface PromiseAggregateObservation {\n readonly ordinaryLifetime: Promise<void>;\n allOrdinaryValuesObservable: boolean;\n observeFulfillment(): void;\n observeRejection(): void;\n finishIteration(contenderCount: number): void;\n}\n\nfunction promiseAggregateObservation(\n kind: \"all\" | \"all_settled\" | \"any\",\n): PromiseAggregateObservation {\n let settleLifetime!: () => void;\n const ordinaryLifetime = new Promise<void>((resolve) => {\n settleLifetime = resolve;\n });\n let contenderCount: number | undefined;\n let fulfillmentCount = 0;\n let rejectionCount = 0;\n let settled = false;\n const maybeSettle = () => {\n if (settled) return;\n const canNoLongerAdvance = kind === \"any\"\n ? contenderCount != null && rejectionCount === contenderCount\n : kind === \"all\"\n ? rejectionCount > 0\n || (contenderCount != null && fulfillmentCount === contenderCount)\n : contenderCount != null\n && fulfillmentCount + rejectionCount === contenderCount;\n if (!canNoLongerAdvance) return;\n settled = true;\n settleLifetime();\n };\n return {\n ordinaryLifetime,\n allOrdinaryValuesObservable: true,\n observeFulfillment: () => {\n fulfillmentCount += 1;\n maybeSettle();\n },\n observeRejection: () => {\n rejectionCount += 1;\n maybeSettle();\n },\n finishIteration: (count) => {\n contenderCount = count;\n maybeSettle();\n },\n };\n}\n\nfunction observePromiseAggregateContender(\n normalized: unknown,\n observation: PromiseAggregateObservation,\n): unknown {\n if (\n (typeof normalized !== \"object\" && typeof normalized !== \"function\")\n || normalized == null\n ) {\n observation.allOrdinaryValuesObservable = false;\n return normalized;\n }\n let observedSettled = false;\n const observed = Object.create(null) as object;\n Object.defineProperty(observed, \"then\", {\n configurable: true,\n get: () => {\n const then = Reflect.get(normalized, \"then\", normalized) as unknown;\n if (typeof then !== \"function\") return then;\n return function observedThen(\n this: unknown,\n onfulfilled: unknown,\n onrejected: unknown,\n ): unknown {\n return Reflect.apply(then, normalized, [\n function observedFulfillment(this: unknown, value: unknown): unknown {\n if (!observedSettled) {\n observedSettled = true;\n observation.observeFulfillment();\n }\n return typeof onfulfilled === \"function\"\n ? Reflect.apply(onfulfilled, this, [value])\n : undefined;\n },\n function observedRejection(this: unknown, reason: unknown): unknown {\n if (!observedSettled) {\n observedSettled = true;\n observation.observeRejection();\n }\n if (typeof onrejected === \"function\") {\n return Reflect.apply(onrejected, this, [reason]);\n }\n throw reason;\n },\n ]);\n };\n },\n });\n return observed;\n}\n\n/**\n * Lets a native Promise aggregate algorithm retain control of iteration and\n * settlement while exposing each constructor-normalized contender.\n *\n * The facade constructs the real Promise subclass and delegates its `resolve`\n * lookup and calls back to that subclass. This preserves custom static resolve\n * behavior and the public result type without resolving an input twice.\n */\nfunction observedPromiseConstructor(\n constructor: PromiseConstructor,\n observeNormalized: (normalized: unknown) => unknown,\n): PromiseConstructor {\n const facade = function PromiseAggregateObservedConstructor(\n executor: (\n resolve: (value: unknown) => void,\n reject: (reason?: unknown) => void,\n ) => void,\n ): Promise<unknown> {\n return Reflect.construct(\n constructor,\n [executor],\n constructor,\n ) as Promise<unknown>;\n } as unknown as PromiseConstructor;\n Object.defineProperty(facade, \"resolve\", {\n configurable: true,\n get: () => {\n const promiseResolve = Reflect.get(constructor, \"resolve\", constructor) as unknown;\n if (typeof promiseResolve !== \"function\") return promiseResolve;\n return (value: unknown): unknown => {\n const normalized = Reflect.apply(promiseResolve, constructor, [value]) as unknown;\n return observeNormalized(normalized);\n };\n },\n });\n return facade;\n}\n\nfunction internalDurableThen<T, TResult1 = T, TResult2 = never>(\n promise: Promise<T>,\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n): Promise<TResult1 | TResult2> {\n const internalThen = (promise as ObservableDurablePromise<T>)[DURABLE_PROMISE_INTERNAL_THEN];\n if (internalThen != null) {\n return internalThen.call(\n promise,\n onfulfilled,\n onrejected,\n ) as Promise<TResult1 | TResult2>;\n }\n return promise.then(onfulfilled, onrejected);\n}\n\nfunction internalAwaitable<T>(value: Awaitable<T>): Promise<T> {\n if ((typeof value === \"object\" || typeof value === \"function\") && value != null) {\n const internalThen = (\n value as Partial<ObservableDurablePromise<T>>\n )[DURABLE_PROMISE_INTERNAL_THEN];\n if (internalThen != null) {\n return internalThen.call(\n value,\n (resolved) => resolved,\n (error) => {\n throw error;\n },\n ) as Promise<T>;\n }\n }\n return Promise.resolve(value);\n}\n\nasync function resolveAwaitableIterable<T>(\n items: AwaitableIterable<T>,\n): Promise<T[]> {\n const iterable = await internalAwaitable(items);\n return internalPromiseAll([...iterable].map((item) => internalAwaitable(item)));\n}\n\nfunction wrapDurableAggregate<T>(completion: Promise<T>): Promise<T> {\n return currentFunctionRuntime()?.wrapFutureWait?.(completion) ?? completion;\n}\n\nfunction runInternalPromiseAggregate<T>(callback: () => T): T {\n const target = globalThis as typeof globalThis & {\n [INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY]?: number;\n };\n target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] =\n (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 0) + 1;\n try {\n return callback();\n } finally {\n const remaining = (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 1) - 1;\n if (remaining === 0) delete target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY];\n else target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] = remaining;\n }\n}\n\nfunction isInternalPromiseAggregate(): boolean {\n const target = globalThis as typeof globalThis & {\n [INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY]?: number;\n };\n return (target[INTERNAL_PROMISE_AGGREGATE_DEPTH_KEY] ?? 0) > 0;\n}\n\nfunction internalPromiseAll<T>(\n values: Iterable<T | PromiseLike<T>>,\n): Promise<Awaited<T>[]> {\n return runInternalPromiseAggregate(() => Promise.all(values));\n}\n\nfunction internalPromiseRace<T>(\n values: Iterable<T | PromiseLike<T>>,\n): Promise<Awaited<T>> {\n return runInternalPromiseAggregate(() => Promise.race(values));\n}\n\nexport function installPromiseInstrumentation(): void {\n const target = globalThis as typeof globalThis & {\n [PROMISE_INSTRUMENTED_KEY]?: true;\n [PROMISE_THEN_INSTRUMENTED_KEY]?: true;\n };\n if (target[PROMISE_THEN_INSTRUMENTED_KEY] !== true) {\n const originalThen = Promise.prototype.then;\n Object.defineProperty(Promise.prototype, \"then\", {\n ...Object.getOwnPropertyDescriptor(Promise.prototype, \"then\"),\n value: function then(\n this: Promise<unknown>,\n onfulfilled?: ((value: unknown) => unknown) | null,\n onrejected?: ((reason: unknown) => unknown) | null,\n ): Promise<unknown> {\n const result = Reflect.apply(\n originalThen,\n this,\n [onfulfilled, onrejected],\n ) as Promise<unknown>;\n if (isDetachedDurableThenable(this)) {\n currentFunctionRuntime()?.trackDurablePromiseConsumption?.(result);\n }\n return result;\n },\n });\n target[PROMISE_THEN_INSTRUMENTED_KEY] = true;\n }\n if (target[PROMISE_INSTRUMENTED_KEY] === true) return;\n const originalRace = Promise.race;\n const originalAny = Promise.any;\n const originalAll = Promise.all;\n const originalAllSettled = Promise.allSettled;\n const originalResolve = Promise.resolve;\n\n // Promise.resolve normally hides a durable Promise subclass inside a native\n // Promise. Preserve the durable provenance on that wrapper so a subsequent\n // all/allSettled/race/any can still distinguish it from an independent\n // contender.\n Object.defineProperty(Promise, \"resolve\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"resolve\"),\n value: function resolve<T>(\n this: PromiseConstructor,\n value: T | PromiseLike<T>,\n ): Promise<Awaited<T>> {\n const result = Reflect.apply(originalResolve, this, [value]) as Promise<Awaited<T>>;\n if (isDurableThenable(value)) inheritDurableThenable(result, value as object);\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"race\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"race\"),\n value: function race<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalRace, this, [values]) as Promise<Awaited<T>>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n } else {\n ordinaryContenderCount += 1;\n }\n return normalized;\n },\n );\n const construct = () =>\n Reflect.apply(\n originalRace,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (\n durableContenders.length > 0\n && ordinaryContenderCount > 0\n ) {\n runtime.trackMixedPromiseRace(result);\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"any\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"any\"),\n value: function any<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalAny, this, [values]) as Promise<Awaited<T>>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"any\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAny,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (\n observation.allOrdinaryValuesObservable\n ) {\n // Once every ordinary contender rejects, only a durable contender\n // can advance Promise.any. A fulfillment may itself be a pending\n // promise that the public aggregate adopts, so the ordinary gate\n // must not expire merely because its fulfillment callback ran.\n // Stop treating the ordinary path as a producer when either it or\n // the public aggregate settles. The latter covers a durable winner\n // as well as fulfilled-value adoption and abrupt iterator failures.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n // A non-object custom resolve result makes native Promise.any reject\n // the aggregate. Retain that aggregate as the producer until the\n // rejection becomes observable.\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"all\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"all\"),\n value: function all<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<Awaited<T>[]> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(originalAll, this, [values]) as Promise<Awaited<T>[]>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"all\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) {\n yield value;\n }\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAll,\n observedConstructor,\n [trackedValues],\n ) as Promise<Awaited<T>[]>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (\n observation.allOrdinaryValuesObservable\n ) {\n // Ordinary inputs can advance Promise.all until one rejects or all\n // fulfill. The non-rejecting lifetime gate models that boundary\n // without observing the public result or invoking a thenable twice.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n // A custom resolve result that is not thenable makes the public\n // aggregate reject. Its own settlement is the only observable\n // producer boundary available.\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n\n Object.defineProperty(Promise, \"allSettled\", {\n ...Object.getOwnPropertyDescriptor(Promise, \"allSettled\"),\n value: function allSettled<T>(\n this: PromiseConstructor,\n values: Iterable<T | PromiseLike<T>>,\n ): Promise<PromiseSettledResult<Awaited<T>>[]> {\n const runtime = currentFunctionRuntime();\n if (runtime?.trackMixedPromiseRace == null) {\n return Reflect.apply(\n originalAllSettled,\n this,\n [values],\n ) as Promise<PromiseSettledResult<Awaited<T>>[]>;\n }\n const durableContenders: unknown[] = [];\n let ordinaryContenderCount = 0;\n const observation = promiseAggregateObservation(\"all_settled\");\n const trackedValues = {\n *[Symbol.iterator](): Iterator<T | PromiseLike<T>> {\n for (const value of values) yield value;\n },\n };\n const observedConstructor = observedPromiseConstructor(\n this,\n (normalized) => {\n if (isDurableThenable(normalized)) {\n durableContenders.push(normalized);\n return normalized;\n }\n ordinaryContenderCount += 1;\n return observePromiseAggregateContender(normalized, observation);\n },\n );\n const construct = () =>\n Reflect.apply(\n originalAllSettled,\n observedConstructor,\n [trackedValues],\n ) as Promise<PromiseSettledResult<Awaited<T>>[]>;\n const result = runtime.runPromiseAggregateConstruction?.(construct) ?? construct();\n observation.finishIteration(ordinaryContenderCount);\n if (durableContenders.length > 0) {\n trackDurableAggregate(\n runtime,\n result,\n durableContenders,\n !isInternalPromiseAggregate(),\n );\n }\n if (durableContenders.length > 0 && ordinaryContenderCount > 0) {\n if (observation.allOrdinaryValuesObservable) {\n // Ordinary inputs can advance Promise.allSettled until every one has\n // settled. The aggregate itself covers abrupt iterator/resolve\n // failures and durable completion.\n runtime.trackMixedPromiseRace(result, [observation.ordinaryLifetime, result]);\n } else {\n runtime.trackMixedPromiseRace(result);\n }\n }\n return result;\n },\n });\n target[PROMISE_INSTRUMENTED_KEY] = true;\n}\n\nexport interface RegisteredFunction<Args extends readonly unknown[], Result> {\n (...args: Args): Promise<Result>;\n readonly definition: RegisteredDefinition;\n future(...args: Args): FunctionFuture<Result>;\n map(items: AwaitableIterable<Args[0]>): Promise<Result[]>;\n reduce(\n items: AwaitableIterable<Args[1]>,\n initial?: Args[0],\n ): Promise<Result>;\n tailCall(...args: Args): TailCall<Result>;\n}\n\nfunction normalizeOptions(options: FunctionOptions<readonly Parameter<unknown>[], unknown>): NormalizedFunctionOptions {\n validateGPUOption(options.gpu);\n if (options.secrets != null && !Array.isArray(options.secrets)) {\n throw new SDKUsageError(\"secrets must be an array of non-empty strings\");\n }\n const normalizedRetries = options.retries == null\n ? undefined\n : retries(options.retries);\n const result: NormalizedFunctionOptions = {\n description: options.description ?? \"\",\n cpu: options.cpu ?? 1,\n memory: options.memory ?? 1,\n ephemeralDisk: options.ephemeralDisk ?? 10,\n gpu: Array.isArray(options.gpu) ? [...options.gpu] : options.gpu ?? null,\n timeout: options.timeout ?? 300,\n image: options.image,\n secrets: [...(options.secrets ?? [])],\n retries: normalizedRetries,\n region: options.region,\n warmContainers: options.warmContainers,\n minContainers: options.minContainers,\n maxContainers: options.maxContainers,\n };\n if (!Number.isFinite(result.cpu) || result.cpu <= 0) throw new SDKUsageError(\"cpu must be greater than zero\");\n if (!Number.isFinite(result.memory) || result.memory <= 0) throw new SDKUsageError(\"memory must be greater than zero\");\n if (!Number.isFinite(result.ephemeralDisk) || result.ephemeralDisk <= 0) throw new SDKUsageError(\"ephemeralDisk must be greater than zero\");\n if (!Number.isInteger(result.timeout) || result.timeout <= 0 || result.timeout > 86_400) {\n throw new SDKUsageError(\"timeout must be an integer between 1 and 86400 seconds\");\n }\n for (const [label, value] of [\n [\"warmContainers\", result.warmContainers],\n [\"minContainers\", result.minContainers],\n [\"maxContainers\", result.maxContainers],\n ] as const) {\n if (value != null && (!Number.isInteger(value) || value < 0)) {\n throw new SDKUsageError(`${label} must be a non-negative integer`);\n }\n }\n if (result.minContainers != null && result.maxContainers != null && result.minContainers > result.maxContainers) {\n throw new SDKUsageError(\"minContainers cannot exceed maxContainers\");\n }\n if (result.warmContainers != null && result.maxContainers != null && result.warmContainers > result.maxContainers) {\n throw new SDKUsageError(\"warmContainers cannot exceed maxContainers\");\n }\n if (result.region != null && ![\"us-east-1\", \"eu-west-1\"].includes(result.region)) {\n throw new SDKUsageError(`Unsupported region '${result.region}'`);\n }\n if (result.secrets.some((secret) => typeof secret !== \"string\" || secret.length === 0)) {\n throw new SDKUsageError(\"secrets must contain non-empty strings\");\n }\n return result;\n}\n\nfunction validateGPUOption(value: unknown): void {\n if (value == null) return;\n const values = Array.isArray(value) ? value : [value];\n for (const setting of values) {\n if (typeof setting !== \"string\") {\n throw new SDKUsageError(\"gpu must be a GPU model or an array of GPU models\");\n }\n const [model, countText, ...extra] = setting.split(\":\");\n const count = countText == null ? 1 : Number(countText);\n if (\n !model\n || extra.length > 0\n || !Number.isInteger(count)\n || count <= 0\n || (countText != null && String(count) !== countText)\n ) {\n throw new SDKUsageError(`Invalid GPU setting '${setting}'`);\n }\n }\n}\n\nfunction validateArguments(definition: RegisteredDefinition, supplied: readonly unknown[]): unknown[] {\n const args = [...supplied];\n if (args.length > definition.parameters.length) {\n throw new SDKUsageError(`${definition.name} expected at most ${definition.parameters.length} arguments, received ${args.length}`);\n }\n definition.parameters.forEach((parameter, index) => {\n if (index >= args.length || args[index] === undefined) {\n if (parameter.hasDefault) args[index] = parameter.defaultValue;\n else if (parameter.required) throw new SDKUsageError(`${definition.name} is missing argument '${parameter.name}'`);\n return;\n }\n validateWithSchema(parameter.schema, args[index], `${definition.name}.${parameter.name}`);\n });\n return args;\n}\n\nexport async function executeHandler<T>(\n definition: RegisteredDefinition,\n suppliedArgs: readonly unknown[],\n): Promise<T> {\n const output = await executeHandlerResult<T>(definition, suppliedArgs);\n if (isTailCall(output)) {\n const runtime = currentFunctionRuntime();\n if (runtime == null) return executeHandler<T>(output.definition, output.args);\n return runtime.invoke<T>(output.definition, output.args);\n }\n return output;\n}\n\n/** Runs one handler frame without resolving a tail call. Used by language executors. */\nexport async function executeHandlerResult<T>(\n definition: RegisteredDefinition,\n suppliedArgs: readonly unknown[],\n): Promise<T | TailCall<T>> {\n const args = validateArguments(definition, suppliedArgs);\n const result = definition.handler(...args);\n if (result == null || typeof (result as PromiseLike<unknown>).then !== \"function\") {\n throw new SDKUsageError(`Tensorlake handler '${definition.name}' must be async and return a Promise`);\n }\n const output = await result;\n if (isTailCall(output)) {\n return output as TailCall<T>;\n }\n validateWithSchema(definition.returns, output, `${definition.name} return value`);\n return output as T;\n}\n\nexport function isTailCall(value: unknown): value is TailCall<unknown> {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Partial<TailCall<unknown>>;\n return candidate[TAIL_CALL_BRAND] === true\n && candidate.kind === \"tensorlake-tail-call\"\n && typeof candidate.definition === \"object\"\n && candidate.definition != null\n && Array.isArray(candidate.args);\n}\n\nfunction createRegisteredFunction<Args extends readonly unknown[], Result>(\n definition: RegisteredDefinition,\n): RegisteredFunction<Args, Result> {\n const callable = ((...args: Args): Promise<Result> => {\n const runtime = currentFunctionRuntime();\n return runtime == null\n ? executeHandler<Result>(definition, args)\n : runtime.invoke<Result>(definition, args);\n }) as RegisteredFunction<Args, Result>;\n Object.defineProperties(callable, {\n definition: { value: definition, enumerable: true },\n future: { value: (...args: Args) => new FunctionFuture<Result>(definition, args) },\n map: {\n value: (items: AwaitableIterable<Args[0]>) => {\n // Resolve inputs before assigning durable IDs. Awaiting each input inside\n // the invocation loop would make call order depend on promise timing,\n // allowing strict replay to associate a recorded result with a different\n // input while still matching the durable event sequence.\n const completion = (async () => {\n const resolvedItems = await resolveAwaitableIterable(items);\n return internalPromiseAll(\n resolvedItems.map((item) =>\n internalAwaitable(callable(...([item] as unknown as Args)))\n ),\n );\n })();\n return wrapDurableAggregate(completion);\n },\n },\n reduce: {\n value: (\n items: AwaitableIterable<Args[1]>,\n ...initialValues: [] | [Args[0]]\n ) => {\n const completion = (async () => {\n let values = await resolveAwaitableIterable(items);\n const hasInitial = initialValues.length > 0;\n let initial: unknown = initialValues[0];\n const runtime = currentFunctionRuntime();\n if (runtime != null) {\n return internalAwaitable(\n runtime.reduce<Result>(definition, values, initial, hasInitial),\n );\n }\n if (!hasInitial) {\n if (values.length === 0) {\n throw new SDKUsageError(\"reduce of empty iterable with no initial value\");\n }\n [initial, ...values] = values;\n }\n let accumulator = initial as Result | Args[0];\n for (const item of values) {\n accumulator = await internalAwaitable(\n callable(...([accumulator, item] as unknown as Args)),\n );\n }\n return accumulator as Result;\n })();\n return wrapDurableAggregate(completion);\n },\n },\n tailCall: {\n value: (...args: Args): TailCall<Result> => ({\n [TAIL_CALL_BRAND]: true,\n kind: \"tensorlake-tail-call\",\n definition,\n args,\n }),\n },\n });\n return callable;\n}\n\nfunction register<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: FunctionOptions<P, Result> | ApplicationOptions<P, Result>,\n application: boolean,\n): RegisteredFunction<ParameterValues<P>, Result> {\n const name = options.name ?? handler.name;\n if (!name) throw new SDKUsageError(\"Anonymous Tensorlake handlers require an explicit name\");\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) throw new SDKUsageError(`Invalid Tensorlake function name '${name}'`);\n let applicationRetries: Retries | undefined;\n if (application) {\n const appOptions = options as ApplicationOptions<P, Result>;\n applicationRetries = retries(appOptions.applicationRetries ?? { maxRetries: 0 });\n if (\n appOptions.allow != null\n && (\n !Array.isArray(appOptions.allow)\n || appOptions.allow.some((capability) =>\n capability !== \"unauthenticated_requests\"\n )\n )\n ) {\n throw new SDKUsageError(\n \"Application allow must contain only 'unauthenticated_requests'\",\n );\n }\n const tags = appOptions.tags;\n const tagsPrototype = tags == null || typeof tags !== \"object\"\n ? undefined\n : Object.getPrototypeOf(tags);\n if (\n tags != null\n && (\n typeof tags !== \"object\"\n || Array.isArray(tags)\n || (tagsPrototype !== Object.prototype && tagsPrototype !== null)\n || Reflect.ownKeys(tags).some((key) =>\n typeof key !== \"string\"\n || !key\n || typeof (tags as Record<PropertyKey, unknown>)[key] !== \"string\"\n )\n )\n ) {\n throw new SDKUsageError(\"Application tags require non-empty string keys and string values\");\n }\n }\n if (!Array.isArray(options.parameters)) {\n throw new SDKUsageError(\"Tensorlake registration parameters must be an array\");\n }\n if (\n typeof options.returns !== \"object\"\n || options.returns == null\n || typeof options.returns.jsonSchema !== \"object\"\n || options.returns.jsonSchema == null\n ) {\n throw new SDKUsageError(\"Tensorlake registration returns must be a schema\");\n }\n const parameterNames = new Set<string>();\n for (const parameter of options.parameters) {\n if (\n typeof parameter !== \"object\"\n || parameter == null\n || typeof parameter.name !== \"string\"\n || typeof parameter.schema !== \"object\"\n || parameter.schema == null\n || typeof parameter.schema.jsonSchema !== \"object\"\n || parameter.schema.jsonSchema == null\n || typeof parameter.required !== \"boolean\"\n || typeof parameter.hasDefault !== \"boolean\"\n ) {\n throw new SDKUsageError(\n \"Tensorlake registration parameters must be created with schema.parameter()\",\n );\n }\n if (parameterNames.has(parameter.name)) {\n throw new SDKUsageError(`Duplicate Tensorlake parameter name '${parameter.name}'`);\n }\n parameterNames.add(parameter.name);\n }\n const httpBodyParameter = options.parameters.find(\n (parameter) => parameter.schema._httpBody,\n );\n if (httpBodyParameter != null && !application) {\n throw new SDKUsageError(\n \"HttpBody is only supported for application parameters\",\n );\n }\n if (options.returns._httpBody) {\n throw new SDKUsageError(\n \"HttpBody is only supported for application parameters; \"\n + \"use schema.file() or a JSON-compatible return schema instead\",\n );\n }\n const definition: RegisteredDefinition = {\n name,\n handler: handler as (...args: unknown[]) => Promise<unknown>,\n parameters: [...options.parameters],\n returns: options.returns as Schema<unknown>,\n options: normalizeOptions(options as FunctionOptions<readonly Parameter<unknown>[], unknown>),\n application: application\n ? {\n tags: { ...((options as ApplicationOptions<P, Result>).tags ?? {}) },\n retries: applicationRetries as Retries,\n allow: [...((options as ApplicationOptions<P, Result>).allow ?? [])],\n version: randomUUID().replaceAll(\"-\", \"\"),\n }\n : undefined,\n };\n registerDefinition(definition, application);\n return createRegisteredFunction(definition);\n}\n\ntype SimpleResult<Output> = Output extends TailCall<infer Result> ? Result : Output;\ntype RuntimeHandler = (...args: never[]) => Promise<unknown>;\n\nfunction hasExplicitSchemas(\n value: unknown,\n): value is FunctionOptions<readonly Parameter<unknown>[], unknown> {\n if (typeof value !== \"object\" || value == null) return false;\n const hasParameters = Object.prototype.hasOwnProperty.call(value, \"parameters\");\n const hasReturns = Object.prototype.hasOwnProperty.call(value, \"returns\");\n if (hasParameters !== hasReturns) {\n throw new SDKUsageError(\"Tensorlake registrations must specify both parameters and returns\");\n }\n return hasParameters;\n}\n\nfunction skipJavaScriptLiteral(source: string, start: number): number {\n const quote = source[start];\n let escaped = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n if (escaped) {\n escaped = false;\n } else if (character === \"\\\\\") {\n escaped = true;\n } else if (character === quote) {\n return index;\n }\n }\n return source.length - 1;\n}\n\nfunction skipJavaScriptComment(source: string, start: number): number | undefined {\n if (source[start] !== \"/\") return undefined;\n if (source[start + 1] === \"/\") {\n const newline = source.indexOf(\"\\n\", start + 2);\n return newline < 0 ? source.length - 1 : newline;\n }\n if (source[start + 1] === \"*\") {\n const end = source.indexOf(\"*/\", start + 2);\n return end < 0 ? source.length - 1 : end + 1;\n }\n return undefined;\n}\n\nfunction skipJavaScriptTrivia(source: string, start: number): number {\n let index = start;\n while (index < source.length) {\n while (index < source.length && /\\s/.test(source[index])) index += 1;\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd == null) break;\n index = commentEnd + 1;\n }\n return index;\n}\n\nconst REGEX_PREFIX_KEYWORDS = new Set([\n \"await\",\n \"case\",\n \"delete\",\n \"in\",\n \"instanceof\",\n \"new\",\n \"return\",\n \"throw\",\n \"typeof\",\n \"void\",\n \"yield\",\n]);\n\nfunction regexLiteralStartsAt(source: string, start: number): boolean {\n let expectsExpression = true;\n for (let index = 0; index < start; index += 1) {\n const character = source[index];\n if (/\\s/.test(character)) continue;\n if (character === \"\\\"\" || character === \"'\" || character === \"`\") {\n index = skipJavaScriptLiteral(source, index);\n expectsExpression = false;\n continue;\n }\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd != null) {\n index = commentEnd;\n continue;\n }\n if (/[A-Za-z_$]/.test(character)) {\n let tokenEnd = index + 1;\n while (tokenEnd < start && /[A-Za-z0-9_$]/.test(source[tokenEnd])) tokenEnd += 1;\n expectsExpression = REGEX_PREFIX_KEYWORDS.has(source.slice(index, tokenEnd));\n index = tokenEnd - 1;\n continue;\n }\n if (/[0-9]/.test(character) || (character === \".\" && /[0-9]/.test(source[index + 1]))) {\n while (index + 1 < start && /[A-Za-z0-9_.]/.test(source[index + 1])) index += 1;\n expectsExpression = false;\n continue;\n }\n if (character === \"/\") {\n if (expectsExpression) {\n index = skipJavaScriptRegex(source, index);\n expectsExpression = false;\n } else {\n if (source[index + 1] === \"=\") index += 1;\n expectsExpression = true;\n }\n continue;\n }\n if (character === \")\" || character === \"]\" || character === \"}\") {\n expectsExpression = false;\n continue;\n }\n if (character === \".\") {\n if (source.slice(index, index + 3) === \"...\") {\n index += 2;\n expectsExpression = true;\n } else {\n expectsExpression = false;\n }\n continue;\n }\n if ((character === \"+\" || character === \"-\") && source[index + 1] === character) {\n index += 1;\n continue;\n }\n expectsExpression = true;\n }\n return expectsExpression;\n}\n\nfunction skipJavaScriptRegex(source: string, start: number): number {\n let escaped = false;\n let characterClass = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index];\n if (escaped) {\n escaped = false;\n } else if (character === \"\\\\\") {\n escaped = true;\n } else if (character === \"[\") {\n characterClass = true;\n } else if (character === \"]\") {\n characterClass = false;\n } else if (character === \"/\" && !characterClass) {\n while (index + 1 < source.length && /[A-Za-z]/.test(source[index + 1])) index += 1;\n return index;\n }\n }\n return source.length - 1;\n}\n\nfunction skipJavaScriptValue(source: string, index: number): number | undefined {\n const character = source[index];\n if (character === \"\\\"\" || character === \"'\" || character === \"`\") {\n return skipJavaScriptLiteral(source, index);\n }\n const commentEnd = skipJavaScriptComment(source, index);\n if (commentEnd != null) return commentEnd;\n if (character === \"/\" && regexLiteralStartsAt(source, index)) {\n return skipJavaScriptRegex(source, index);\n }\n return undefined;\n}\n\nfunction findTopLevelArrow(source: string): number {\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length - 1; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") {\n // A top-level block before an arrow is a classic function or method\n // body. Its nested arrows cannot describe the handler parameters.\n if (parentheses === 0 && brackets === 0 && braces === 0) return -1;\n braces += 1;\n }\n else if (character === \"}\") braces -= 1;\n else if (character === \"=\" && source[index + 1] === \">\" && parentheses === 0 && brackets === 0 && braces === 0) {\n return index;\n }\n }\n return -1;\n}\n\nfunction findClosingParenthesis(source: string, open: number): number {\n let depth = 0;\n for (let index = open; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") depth += 1;\n else if (character === \")\" && --depth === 0) return index;\n }\n return -1;\n}\n\nfunction findOpeningParenthesis(source: string): number {\n for (let index = 0; index < source.length; index += 1) {\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (source[index] === \"(\") return index;\n }\n return -1;\n}\n\nfunction splitTopLevelParameters(source: string): string[] {\n if (source.trim() === \"\") return [];\n const result: string[] = [];\n let start = 0;\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") braces += 1;\n else if (character === \"}\") braces -= 1;\n else if (character === \",\" && parentheses === 0 && brackets === 0 && braces === 0) {\n result.push(source.slice(start, index).trim());\n start = index + 1;\n }\n }\n const final = source.slice(start).trim();\n if (final !== \"\") result.push(final);\n return result;\n}\n\nfunction hasTopLevelDefault(source: string): boolean {\n let parentheses = 0;\n let brackets = 0;\n let braces = 0;\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n const valueEnd = skipJavaScriptValue(source, index);\n if (valueEnd != null) {\n index = valueEnd;\n continue;\n }\n if (character === \"(\") parentheses += 1;\n else if (character === \")\") parentheses -= 1;\n else if (character === \"[\") brackets += 1;\n else if (character === \"]\") brackets -= 1;\n else if (character === \"{\") braces += 1;\n else if (character === \"}\") braces -= 1;\n else if (character === \"=\" && parentheses === 0 && brackets === 0 && braces === 0) return true;\n }\n return false;\n}\n\nfunction declaredHandlerParameters(handler: RuntimeHandler): string[] {\n const source = Function.prototype.toString.call(handler).trim();\n if (source.includes(\"[native code]\")) {\n throw new SDKUsageError(\"Schema-free registration cannot inspect a native or bound handler; specify parameters and returns\");\n }\n const arrow = findTopLevelArrow(source);\n if (arrow >= 0) {\n let header = source.slice(0, arrow).trim();\n if (\n header.startsWith(\"async\")\n && !/[A-Za-z0-9_$]/.test(header[\"async\".length] ?? \"\")\n ) {\n header = header.slice(skipJavaScriptTrivia(header, \"async\".length));\n }\n if (!header.startsWith(\"(\")) return [header];\n const close = findClosingParenthesis(header, 0);\n if (close < 0) throw new SDKUsageError(\"Schema-free registration could not inspect handler parameters\");\n return splitTopLevelParameters(header.slice(1, close));\n }\n const open = findOpeningParenthesis(source);\n const close = open < 0 ? -1 : findClosingParenthesis(source, open);\n if (open < 0 || close < 0) {\n throw new SDKUsageError(\"Schema-free registration could not inspect handler parameters\");\n }\n return splitTopLevelParameters(source.slice(open + 1, close));\n}\n\nfunction inferredJSONParameters(handler: RuntimeHandler): readonly Parameter<unknown>[] {\n const parameters = declaredHandlerParameters(handler);\n if (parameters.some((parameter) => {\n let index = 0;\n while (index < parameter.length) {\n while (index < parameter.length && /\\s/.test(parameter[index])) index += 1;\n const commentEnd = skipJavaScriptComment(parameter, index);\n if (commentEnd == null) break;\n index = commentEnd + 1;\n }\n return parameter.slice(index).startsWith(\"...\");\n })) {\n throw new SDKUsageError(\n \"Schema-free registration does not support rest parameters; specify explicit parameters and returns\",\n );\n }\n return parameters.map((parameter, index) => schema.parameter(\n parameters.length === 1 ? \"input\" : `arg${index}`,\n schema.json(),\n hasTopLevelDefault(parameter) ? { optional: true } : {},\n ));\n}\n\nfunction registerWithDefaults(\n name: string,\n handler: RuntimeHandler,\n options: SimpleFunctionOptions | SimpleApplicationOptions,\n application: boolean,\n): RegisteredFunction<readonly unknown[], unknown> {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n {\n ...options,\n name,\n parameters: inferredJSONParameters(handler),\n returns: schema.json(),\n },\n application,\n );\n}\n\nexport function registerFunction<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: FunctionOptions<P, Result>,\n): RegisteredFunction<ParameterValues<P>, Result>;\n\nexport function registerFunction<\n const Args extends readonly unknown[],\n Output,\n>(\n name: string,\n handler: (...args: Args) => Promise<Output>,\n options?: SimpleFunctionOptions,\n): RegisteredFunction<Args, SimpleResult<Output>>;\nexport function registerFunction(\n handlerOrName: unknown,\n handlerOrOptions?: unknown,\n options: SimpleFunctionOptions = {},\n): RegisteredFunction<readonly unknown[], unknown> {\n if (typeof handlerOrName === \"string\") {\n if (typeof handlerOrOptions !== \"function\") {\n throw new SDKUsageError(\"registerFunction(name, handler) requires an async handler\");\n }\n return registerWithDefaults(\n handlerOrName,\n handlerOrOptions as RuntimeHandler,\n options,\n false,\n );\n }\n if (typeof handlerOrName !== \"function\") {\n throw new SDKUsageError(\"registerFunction requires an async handler\");\n }\n const handler = handlerOrName as RuntimeHandler;\n if (typeof handlerOrOptions === \"function\") {\n throw new SDKUsageError(\"registerFunction received an unexpected second handler\");\n }\n if (hasExplicitSchemas(handlerOrOptions)) {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n handlerOrOptions,\n false,\n );\n }\n throw new SDKUsageError(\n \"Schema-free functions require an explicit stable name: registerFunction(name, handler)\",\n );\n}\n\nexport function registerApplication<\n const P extends readonly Parameter<unknown>[],\n Result,\n>(\n handler: (...args: ParameterValues<P>) => Promise<Result | TailCall<Result>>,\n options: ApplicationOptions<P, Result>,\n): RegisteredFunction<ParameterValues<P>, Result>;\nexport function registerApplication<\n const Args extends readonly unknown[],\n Output,\n>(\n name: string,\n handler: (...args: Args) => Promise<Output>,\n options?: SimpleApplicationOptions,\n): RegisteredFunction<Args, SimpleResult<Output>>;\nexport function registerApplication(\n handlerOrName: unknown,\n handlerOrOptions?: unknown,\n options: SimpleApplicationOptions = {},\n): RegisteredFunction<readonly unknown[], unknown> {\n if (typeof handlerOrName === \"string\") {\n if (typeof handlerOrOptions !== \"function\") {\n throw new SDKUsageError(\"registerApplication(name, handler) requires an async handler\");\n }\n return registerWithDefaults(\n handlerOrName,\n handlerOrOptions as RuntimeHandler,\n options,\n true,\n );\n }\n if (typeof handlerOrName !== \"function\") {\n throw new SDKUsageError(\"registerApplication requires an async handler\");\n }\n const handler = handlerOrName as RuntimeHandler;\n if (typeof handlerOrOptions === \"function\") {\n throw new SDKUsageError(\"registerApplication received an unexpected second handler\");\n }\n if (hasExplicitSchemas(handlerOrOptions)) {\n return register(\n handler as (...args: readonly unknown[]) => Promise<unknown>,\n handlerOrOptions,\n true,\n );\n }\n throw new SDKUsageError(\n \"Schema-free applications require an explicit stable name: registerApplication(name, handler)\",\n );\n}\n","const SDK_USAGE_ERROR_BRAND = Symbol.for(\"tensorlake.applications.sdk-usage-error.v1\");\nconst REQUEST_ERROR_BRAND = Symbol.for(\"tensorlake.applications.request-error.v1\");\nconst FUNCTION_ERROR_BRAND = Symbol.for(\"tensorlake.applications.function-error.v1\");\nconst TIMEOUT_ERROR_BRAND = Symbol.for(\"tensorlake.applications.timeout-error.v1\");\n\nexport class TensorlakeApplicationError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"TensorlakeApplicationError\";\n }\n}\n\nexport class SDKUsageError extends TensorlakeApplicationError {\n readonly [SDK_USAGE_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== SDKUsageError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isSDKUsageError(value);\n }\n\n constructor(message: string) {\n super(message);\n this.name = \"SDKUsageError\";\n }\n}\n\n/** Recognizes SDKUsageError instances thrown by independently bundled SDK copies. */\nfunction isSDKUsageError(value: unknown): value is SDKUsageError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[SDK_USAGE_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class SerializationError extends TensorlakeApplicationError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"SerializationError\";\n }\n}\n\nexport class DeserializationError extends TensorlakeApplicationError {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"DeserializationError\";\n }\n}\n\nexport class FunctionError extends TensorlakeApplicationError {\n readonly [FUNCTION_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== FunctionError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isFunctionError(value);\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"FunctionError\";\n }\n}\n\nexport class TimeoutError extends TensorlakeApplicationError {\n readonly [TIMEOUT_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== TimeoutError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isTimeoutError(value);\n }\n\n constructor() {\n super(\"Timed out.\");\n this.name = \"TimeoutError\";\n }\n}\n\n/** Recognizes TimeoutError instances thrown by independently bundled SDK copies. */\nfunction isTimeoutError(value: unknown): value is TimeoutError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[TIMEOUT_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\n/** Recognizes FunctionError instances thrown by independently bundled SDK copies. */\nfunction isFunctionError(value: unknown): value is FunctionError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[FUNCTION_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class RequestError extends TensorlakeApplicationError {\n readonly [REQUEST_ERROR_BRAND] = true;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== RequestError) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isRequestError(value);\n }\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** Recognizes RequestError instances thrown by independently bundled SDK copies. */\nexport function isRequestError(value: unknown): value is RequestError {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[REQUEST_ERROR_BRAND] === true && typeof candidate.message === \"string\";\n}\n\nexport class ReplayMismatchError extends TensorlakeApplicationError {\n constructor(message = \"Function execution diverged from its durable event history\") {\n super(message);\n this.name = \"ReplayMismatchError\";\n }\n}\n","import Ajv, { type ValidateFunction } from \"ajv\";\nimport Ajv2020 from \"ajv/dist/2020.js\";\nimport { File, isFile } from \"./file.js\";\nimport { HttpBody, isHttpBody } from \"./http-body.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\nexport type JSONSchema = Record<string, unknown>;\n\nconst TYPE = Symbol(\"tensorlake.schema.type\");\n// SDK-generated schemas use JSON Schema 2020-12 features such as prefixItems.\n// Validate with the same dialect that we emit into application manifests so\n// local/executor checks cannot silently accept values the public schema rejects.\nconst ajvDraft7 = new Ajv({ allErrors: true, strict: false });\nconst ajv2020 = new Ajv2020({ allErrors: true, strict: false });\n\nexport interface Schema<T> {\n readonly jsonSchema: JSONSchema;\n readonly [TYPE]?: T;\n readonly _file?: boolean;\n readonly _httpBody?: boolean;\n}\n\nexport type Infer<S extends Schema<unknown>> = S extends Schema<infer T> ? T : never;\n\nexport interface ParameterOptions<T> {\n description?: string;\n optional?: boolean;\n default?: T;\n}\n\nexport interface Parameter<T> {\n readonly name: string;\n readonly schema: Schema<T>;\n readonly description?: string;\n readonly required: boolean;\n readonly hasDefault: boolean;\n readonly defaultValue?: T;\n}\n\nexport type ParameterValues<P extends readonly Parameter<unknown>[]> = {\n [K in keyof P]: P[K] extends Parameter<infer T> ? T : never;\n};\n\nfunction snapshotJSONValue(\n value: unknown,\n label: string,\n ancestors: Set<object>,\n freeze: boolean,\n): unknown {\n if (\n value == null\n || typeof value === \"string\"\n || typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new SDKUsageError(`${label} contains a non-finite number`);\n }\n return value;\n }\n if (typeof value !== \"object\") {\n throw new SDKUsageError(`${label} contains unsupported ${typeof value}`);\n }\n if (ancestors.has(value)) {\n throw new SDKUsageError(`${label} contains a cycle`);\n }\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) {\n throw new SDKUsageError(\n `${label} contains unsupported ${value.constructor?.name ?? \"object\"}`,\n );\n }\n\n ancestors.add(value);\n let result: unknown[] | Record<string, unknown>;\n if (Array.isArray(value)) {\n result = [];\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n throw new SDKUsageError(`${label} contains a sparse array entry at index ${index}`);\n }\n result.push(snapshotJSONValue(\n value[index],\n `${label}[${index}]`,\n ancestors,\n freeze,\n ));\n }\n } else {\n result = Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n snapshotJSONValue(item, `${label}.${key}`, ancestors, freeze),\n ]),\n );\n }\n ancestors.delete(value);\n return freeze ? Object.freeze(result) : result;\n}\n\nfunction snapshotJSONSchema(jsonSchema: JSONSchema): JSONSchema {\n return snapshotJSONValue(\n jsonSchema,\n \"JSON schema\",\n new Set(),\n true,\n ) as JSONSchema;\n}\n\nfunction snapshotDefault<T>(valueSchema: Schema<T>, value: T): T {\n if (valueSchema._file) {\n if (!isFile(value)) {\n throw new SDKUsageError(\"parameter default must be a Tensorlake File\");\n }\n return new File(new Uint8Array(value.content), value.contentType) as T;\n }\n if (valueSchema._httpBody) {\n if (!isHttpBody(value)) {\n throw new SDKUsageError(\"parameter default must be a Tensorlake HttpBody\");\n }\n return new HttpBody(new Uint8Array(value.content), value.contentType) as T;\n }\n return snapshotJSONValue(\n value,\n \"parameter default\",\n new Set(),\n false,\n ) as T;\n}\n\nfunction makeSchema<T>(\n jsonSchema: JSONSchema,\n rawBody?: \"file\" | \"httpBody\",\n): Schema<T> {\n return Object.freeze({\n jsonSchema: snapshotJSONSchema(jsonSchema),\n _file: rawBody === \"file\",\n _httpBody: rawBody === \"httpBody\",\n });\n}\n\nfunction rejectRawBodyComposition(\n operation: string,\n values: readonly Schema<unknown>[],\n): void {\n const rawBody = values.find((value) => value._file || value._httpBody);\n if (rawBody != null) {\n const factory = rawBody._httpBody ? \"httpBody\" : \"file\";\n const type = rawBody._httpBody ? \"HttpBody\" : \"File\";\n const supportedPosition = rawBody._httpBody\n ? \"as a direct application parameter\"\n : \"as a direct parameter or return value\";\n throw new SDKUsageError(\n `schema.${operation} cannot contain schema.${factory}(); ${type} is only supported`\n + ` ${supportedPosition}`,\n );\n }\n}\n\nfunction parameter<T>(\n name: string,\n valueSchema: Schema<T>,\n options: ParameterOptions<T> = {},\n): Parameter<T> {\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) {\n throw new SDKUsageError(`Invalid parameter name '${name}'`);\n }\n const hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n if (hasDefault) validateWithSchema(valueSchema, options.default, `default for '${name}'`);\n const defaultSnapshot = hasDefault\n ? snapshotDefault(valueSchema, options.default as T)\n : undefined;\n return Object.freeze({\n name,\n schema: valueSchema,\n description: options.description,\n required: options.optional !== true && !hasDefault,\n hasDefault,\n // Defaults cross two public boundaries: callers can inspect the registered\n // definition, and every invocation receives the default when an argument is\n // omitted. Return a fresh boundary copy so neither path can mutate the\n // registration snapshot, later invocations, or generated manifests.\n get defaultValue(): T | undefined {\n return hasDefault\n ? snapshotDefault(valueSchema, defaultSnapshot as T)\n : undefined;\n },\n });\n}\n\nexport const schema = {\n /** Any JSON-serializable value. Useful when strict runtime validation is not needed. */\n json: <T = unknown>() => makeSchema<T>({}),\n string: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<string>({ ...options, type: \"string\" }),\n number: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<number>({ ...options, type: \"number\" }),\n integer: (options: Omit<JSONSchema, \"type\"> = {}) =>\n makeSchema<number>({ ...options, type: \"integer\" }),\n boolean: () => makeSchema<boolean>({ type: \"boolean\" }),\n null: () => makeSchema<null>({ type: \"null\" }),\n literal: <T extends string | number | boolean | null>(value: T) =>\n makeSchema<T>({ const: value }),\n enum: <const T extends readonly (string | number)[]>(values: T) =>\n makeSchema<T[number]>({ enum: [...values] }),\n array: <S extends Schema<unknown>>(item: S, options: Omit<JSONSchema, \"type\" | \"items\"> = {}) => {\n rejectRawBodyComposition(\"array\", [item]);\n return makeSchema<Infer<S>[]>({ ...options, type: \"array\", items: item.jsonSchema });\n },\n tuple: <const S extends readonly Schema<unknown>[]>(items: S) => {\n rejectRawBodyComposition(\"tuple\", items);\n return makeSchema<{ [K in keyof S]: S[K] extends Schema<infer T> ? T : never }>({\n type: \"array\",\n prefixItems: items.map((item) => item.jsonSchema),\n minItems: items.length,\n maxItems: items.length,\n });\n },\n record: <S extends Schema<unknown>>(value: S) => {\n rejectRawBodyComposition(\"record\", [value]);\n return makeSchema<Record<string, Infer<S>>>({\n type: \"object\",\n additionalProperties: value.jsonSchema,\n });\n },\n object: <const P extends Record<string, Schema<unknown>>>(properties: P) => {\n rejectRawBodyComposition(\"object\", Object.values(properties));\n return makeSchema<{ [K in keyof P]: P[K] extends Schema<infer T> ? T : never }>({\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(properties).map(([key, item]) => [key, item.jsonSchema]),\n ),\n required: Object.keys(properties),\n additionalProperties: false,\n });\n },\n union: <const S extends readonly Schema<unknown>[]>(...choices: S) => {\n rejectRawBodyComposition(\"union\", choices);\n return makeSchema<Infer<S[number]>>({ anyOf: choices.map((choice) => choice.jsonSchema) });\n },\n nullable: <S extends Schema<unknown>>(value: S) => {\n rejectRawBodyComposition(\"nullable\", [value]);\n return makeSchema<Infer<S> | null>({ anyOf: [value.jsonSchema, { type: \"null\" }] });\n },\n file: () => makeSchema<File>({ type: \"tensorlake_file\" }, \"file\"),\n httpBody: () =>\n makeSchema<HttpBody>({ type: \"tensorlake_http_body\" }, \"httpBody\"),\n custom: <T>(jsonSchema: JSONSchema) => makeSchema<T>({ ...jsonSchema }),\n parameter,\n};\n\ninterface CachedValidator {\n readonly validate: ValidateFunction;\n readonly errorsText: (errors: ValidateFunction[\"errors\"]) => string;\n}\n\nconst validatorCache = new WeakMap<object, CachedValidator>();\n\nfunction compileValidator(jsonSchema: JSONSchema): CachedValidator {\n // Earlier SDK versions validated custom schemas with Ajv's draft-07\n // default. Preserve that behavior for explicitly declared draft-07 schemas\n // while using 2020-12 for SDK-generated schemas and custom schemas without a\n // dialect declaration.\n const dialect = jsonSchema.$schema;\n const engine = typeof dialect === \"string\" && /\\/draft-07\\/schema#?$/.test(dialect)\n ? ajvDraft7\n : ajv2020;\n const validate = engine.compile(jsonSchema);\n return {\n validate,\n errorsText: (errors) => engine.errorsText(errors, { separator: \"; \" }),\n };\n}\n\nexport function validateWithSchema<T>(valueSchema: Schema<T>, value: unknown, label: string): T {\n if (valueSchema._file) {\n if (!isFile(value)) {\n throw new SDKUsageError(`${label} must be a Tensorlake File`);\n }\n return value as T;\n }\n if (valueSchema._httpBody) {\n if (!isHttpBody(value)) {\n throw new SDKUsageError(`${label} must be a Tensorlake HttpBody`);\n }\n return value as T;\n }\n if (isFile(value)) {\n throw new SDKUsageError(`${label} must use schema.file() for a Tensorlake File`);\n }\n if (isHttpBody(value)) {\n throw new SDKUsageError(\n `${label} must use schema.httpBody() for a Tensorlake HttpBody`,\n );\n }\n let cached = validatorCache.get(valueSchema as object);\n if (cached == null) {\n try {\n cached = compileValidator(valueSchema.jsonSchema);\n } catch (error) {\n const details = error instanceof Error ? error.message : String(error);\n throw new SDKUsageError(`${label} uses an invalid JSON schema: ${details}`);\n }\n validatorCache.set(valueSchema as object, cached);\n }\n if (!cached.validate(value)) {\n const details = cached.errorsText(cached.validate.errors);\n throw new SDKUsageError(`${label} does not match its schema: ${details}`);\n }\n return value as T;\n}\n\nexport function parameterJSONSchema(parameter: Parameter<unknown>): JSONSchema {\n const result: JSONSchema = {\n ...parameter.schema.jsonSchema,\n title: parameter.name,\n parameter_kind: \"POSITIONAL_OR_KEYWORD\",\n };\n if (parameter.description != null) result.description = parameter.description;\n if (parameter.hasDefault) {\n result.default = parameter.schema._file || parameter.schema._httpBody\n ? true\n : parameter.defaultValue;\n }\n return result;\n}\n","import { SDKUsageError } from \"./errors.js\";\n\nconst FILE_BRAND = Symbol.for(\"tensorlake.applications.file.v1\");\n\nexport class File {\n readonly [FILE_BRAND] = true;\n readonly content: Uint8Array;\n readonly contentType: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== File) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isFile(value);\n }\n\n constructor(content: Uint8Array | ArrayBuffer, contentType: string) {\n if (!contentType.trim()) {\n throw new SDKUsageError(\"File contentType cannot be empty\");\n }\n this.content = content instanceof Uint8Array ? content : new Uint8Array(content);\n this.contentType = contentType;\n }\n}\n\n/**\n * Recognizes Tensorlake Files across independently bundled SDK copies.\n *\n * Deployed application code and the function executor are separate bundles\n * loaded into one Node process, so their `File` constructors are not\n * referentially equal. The shared brand and `Symbol.hasInstance` keep\n * `instanceof File` useful across that boundary.\n */\nexport function isFile(value: unknown): value is File {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[FILE_BRAND] === true\n && candidate.content instanceof Uint8Array\n && typeof candidate.contentType === \"string\"\n && candidate.contentType.trim().length > 0;\n}\n","const HTTP_BODY_BRAND = Symbol.for(\"tensorlake.applications.http-body.v1\");\n\nexport class HttpBody {\n readonly [HTTP_BODY_BRAND] = true;\n readonly content: Uint8Array;\n readonly contentType?: string;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== HttpBody) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isHttpBody(value);\n }\n\n constructor(\n content: Uint8Array | ArrayBuffer,\n contentType?: string,\n ) {\n this.content = content instanceof Uint8Array\n ? content\n : new Uint8Array(content);\n this.contentType = contentType;\n }\n\n text(encoding = \"utf-8\"): string {\n return new TextDecoder(encoding, { fatal: true }).decode(this.content);\n }\n\n json<T = unknown>(): T {\n return JSON.parse(this.text()) as T;\n }\n}\n\n/**\n * Recognizes Tensorlake HTTP bodies across independently bundled SDK copies.\n *\n * Deployed application code and the function executor are separate bundles\n * loaded into one Node process, so their `HttpBody` constructors are not\n * referentially equal.\n */\nexport function isHttpBody(value: unknown): value is HttpBody {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[HTTP_BODY_BRAND] === true\n && candidate.content instanceof Uint8Array\n && (\n candidate.contentType === undefined\n || typeof candidate.contentType === \"string\"\n );\n}\n","import type { RegisteredDefinition } from \"./function.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\ninterface RegistryState {\n functions: Map<string, RegisteredDefinition>;\n applications: Map<string, RegisteredDefinition>;\n}\n\nexport interface RegistrySnapshot {\n functions: Map<string, RegisteredDefinition>;\n applications: Map<string, RegisteredDefinition>;\n}\n\nconst REGISTRY_KEY = Symbol.for(\"tensorlake.applications.registry.v1\");\n\nfunction registry(): RegistryState {\n const target = globalThis as typeof globalThis & { [REGISTRY_KEY]?: RegistryState };\n target[REGISTRY_KEY] ??= { functions: new Map(), applications: new Map() };\n return target[REGISTRY_KEY];\n}\n\nexport function registerDefinition(definition: RegisteredDefinition, isApplication: boolean): void {\n const state = registry();\n const existing = state.functions.get(definition.name);\n if (existing != null && existing !== definition) {\n throw new SDKUsageError(`Multiple Tensorlake functions are named '${definition.name}'`);\n }\n state.functions.set(definition.name, definition);\n if (isApplication) {\n const app = state.applications.get(definition.name);\n if (app != null && app !== definition) {\n throw new SDKUsageError(`Multiple Tensorlake applications are named '${definition.name}'`);\n }\n state.applications.set(definition.name, definition);\n }\n}\n\nexport function getFunction(name: string): RegisteredDefinition {\n const result = registry().functions.get(name);\n if (result == null) throw new SDKUsageError(`Tensorlake function '${name}' is not registered`);\n return result;\n}\n\nexport function getFunctions(): RegisteredDefinition[] {\n return [...registry().functions.values()];\n}\n\nexport function getApplications(): RegisteredDefinition[] {\n return [...registry().applications.values()];\n}\n\nexport function snapshotRegistry(): RegistrySnapshot {\n const state = registry();\n return {\n functions: new Map(state.functions),\n applications: new Map(state.applications),\n };\n}\n\nexport function restoreRegistry(snapshot: RegistrySnapshot): void {\n const state = registry();\n state.functions.clear();\n state.applications.clear();\n for (const [name, definition] of snapshot.functions) state.functions.set(name, definition);\n for (const [name, definition] of snapshot.applications) state.applications.set(name, definition);\n}\n\nexport function clearRegistryForTest(): void {\n registry().functions.clear();\n registry().applications.clear();\n}\n","export type HeadersInit =\n | Headers\n | Record<string, string>\n | Iterable<readonly [string, string]>;\n\nconst HEADERS_BRAND = Symbol.for(\"tensorlake.applications.headers.v1\");\n\n/** Immutable, case-insensitive application request headers. */\nexport class Headers implements Iterable<readonly [string, string]> {\n readonly [HEADERS_BRAND] = true;\n readonly #items: readonly (readonly [string, string])[];\n readonly #lookup: ReadonlyMap<string, readonly string[]>;\n\n static [Symbol.hasInstance](value: unknown): boolean {\n if (this !== Headers) {\n return Function.prototype[Symbol.hasInstance].call(this, value);\n }\n return isHeaders(value);\n }\n\n constructor(headers: HeadersInit = []) {\n const entries = headers instanceof Headers\n ? [...headers]\n : Symbol.iterator in Object(headers)\n ? [...headers as Iterable<readonly [string, string]>]\n : Object.entries(headers);\n const lookup = new Map<string, string[]>();\n this.#items = Object.freeze(entries.map(([name, value]) => {\n if (typeof name !== \"string\" || typeof value !== \"string\") {\n throw new TypeError(\"Headers require string names and values\");\n }\n const item = Object.freeze([name, value] as const);\n const key = name.toLowerCase();\n lookup.set(key, [...(lookup.get(key) ?? []), value]);\n return item;\n }));\n this.#lookup = lookup;\n Object.freeze(this);\n }\n\n get(name: string): string | undefined {\n return this.#lookup.get(name.toLowerCase())?.at(-1);\n }\n\n getAll(name: string): readonly string[] {\n return Object.freeze([...(this.#lookup.get(name.toLowerCase()) ?? [])]);\n }\n\n has(name: string): boolean {\n return this.#lookup.has(name.toLowerCase());\n }\n\n entries(): IterableIterator<readonly [string, string]> {\n return this.#items[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<readonly [string, string]> {\n return this.entries();\n }\n}\n\n/** Recognizes immutable request headers across independently bundled SDK copies. */\nexport function isHeaders(value: unknown): value is Headers {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Record<PropertyKey, unknown>;\n return candidate[HEADERS_BRAND] === true\n && typeof candidate.get === \"function\"\n && typeof candidate.getAll === \"function\"\n && typeof candidate.has === \"function\"\n && typeof candidate[Symbol.iterator] === \"function\";\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { SDKUsageError } from \"./errors.js\";\nimport { Headers, type HeadersInit } from \"./headers.js\";\nimport { deserializeJSON, serializeValue } from \"./serialization.js\";\n\nexport interface ProgressOptions {\n message?: string;\n attributes?: Record<string, string>;\n}\n\nexport interface RequestState {\n set(key: string, value: unknown): Promise<void>;\n get<T>(key: string, defaultValue?: T): Promise<T | undefined>;\n}\n\nexport interface RequestMetrics {\n timer(name: string, value: number): Promise<void>;\n counter(name: string, value?: number): Promise<void>;\n}\n\nexport interface FunctionProgress {\n update(current: number, total: number, options?: ProgressOptions): Promise<void>;\n}\n\nexport function validateRequestStateKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\") {\n throw new SDKUsageError(`State key must be a string, got: ${String(key)}`);\n }\n}\n\nexport function serializeRequestStateValue(value: unknown): Uint8Array {\n const serialized = serializeValue(value);\n if (serialized.encoding !== \"json\") {\n throw new SDKUsageError(\"Request state values must be JSON values\");\n }\n return serialized.data;\n}\n\nexport function validateCounterMetric(name: unknown, value: unknown): void {\n if (typeof name !== \"string\") {\n throw new SDKUsageError(`Counter name must be a string, got: ${String(name)}`);\n }\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n throw new SDKUsageError(`Counter value must be an int, got: ${String(value)}`);\n }\n if (!Number.isSafeInteger(value)) {\n throw new SDKUsageError(`Counter value must be a safe int, got: ${String(value)}`);\n }\n}\n\nexport function validateTimerMetric(name: unknown, value: unknown): void {\n if (typeof name !== \"string\") {\n throw new SDKUsageError(`Timer name must be a string, got: ${String(name)}`);\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new SDKUsageError(`Timer value must be a finite number, got: ${String(value)}`);\n }\n}\n\nfunction isPlainRecord(value: unknown): value is Record<PropertyKey, unknown> {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function validateProgressUpdate(\n current: number,\n total: number,\n options?: ProgressOptions,\n): void {\n if (!Number.isFinite(current) || !Number.isFinite(total) || total < 0 || current < 0) {\n throw new SDKUsageError(\"Progress current and total must be non-negative finite numbers\");\n }\n if (options != null && !isPlainRecord(options)) {\n throw new SDKUsageError(\"Progress options must be an object\");\n }\n if (options?.message != null && typeof options.message !== \"string\") {\n throw new SDKUsageError(\"Progress message must be a string\");\n }\n if (options?.attributes != null) {\n if (!isPlainRecord(options.attributes)) {\n throw new SDKUsageError(\"Progress attributes must be an object of string key/value pairs\");\n }\n for (const key of Reflect.ownKeys(options.attributes)) {\n if (typeof key !== \"string\") {\n throw new SDKUsageError(\"Progress attributes must contain only string keys and values\");\n }\n const value = options.attributes[key];\n if (typeof value !== \"string\") {\n throw new SDKUsageError(\"Progress attributes must contain only string keys and values\");\n }\n }\n }\n}\n\nexport interface RequestContextValue {\n readonly requestId: string;\n readonly headers: Headers;\n readonly signal: AbortSignal;\n readonly state: RequestState;\n readonly metrics: RequestMetrics;\n readonly progress: FunctionProgress;\n}\n\n// A deployed application bundle contains its own copy of the applications SDK,\n// while the function executor has another copy in its runtime capsule. Both\n// copies execute in the same Node process and must observe the same context.\n// Symbol.for keeps the AsyncLocalStorage process-global without exposing it as\n// public API or coupling the application bundle to the executor package.\nconst REQUEST_CONTEXT_STORAGE_KEY = Symbol.for(\n \"tensorlake.applications.request-context-storage.v1\",\n);\n\nfunction requestContextStorage(): AsyncLocalStorage<RequestContextValue> {\n const target = globalThis as typeof globalThis & {\n [REQUEST_CONTEXT_STORAGE_KEY]?: AsyncLocalStorage<RequestContextValue>;\n };\n target[REQUEST_CONTEXT_STORAGE_KEY] ??= new AsyncLocalStorage<RequestContextValue>();\n return target[REQUEST_CONTEXT_STORAGE_KEY];\n}\n\nexport class RequestContext {\n static get(): RequestContextValue {\n const context = requestContextStorage().getStore();\n if (context == null) {\n throw new SDKUsageError(\"RequestContext.get() can only be called from a running Tensorlake function\");\n }\n return context;\n }\n}\n\nexport function runWithRequestContext<T>(\n context: RequestContextValue,\n callback: () => Promise<T>,\n): Promise<T> {\n return requestContextStorage().run(context, callback);\n}\n\nexport async function waitWithAbortSignal<T>(\n value: Promise<T>,\n signal: AbortSignal,\n): Promise<T> {\n if (signal.aborted) throw signal.reason;\n let onAbort: (() => void) | undefined;\n try {\n return await Promise.race([\n value,\n new Promise<never>((_resolve, reject) => {\n onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }),\n ]);\n } finally {\n if (onAbort != null) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nexport class MemoryRequestContext implements RequestContextValue {\n readonly headers: Headers;\n readonly signal: AbortSignal;\n private readonly values = new Map<string, Uint8Array>();\n private readonly counters = new Map<string, number>();\n private readonly timers = new Map<string, number[]>();\n private lastProgress?: { current: number; total: number; options?: ProgressOptions };\n\n constructor(\n readonly requestId: string,\n options: { signal?: AbortSignal; headers?: HeadersInit } = {},\n ) {\n this.headers = new Headers(options.headers);\n this.signal = options.signal ?? new AbortController().signal;\n }\n\n readonly state: RequestState = {\n set: async (key, value) => {\n validateRequestStateKey(key);\n this.values.set(key, serializeRequestStateValue(value).slice());\n },\n get: async <T>(key: string, defaultValue?: T) => {\n validateRequestStateKey(key);\n const value = this.values.get(key);\n return value == null ? defaultValue : deserializeJSON(value) as T;\n },\n };\n\n readonly metrics: RequestMetrics = {\n counter: async (name, value = 1) => {\n validateCounterMetric(name, value);\n this.counters.set(name, (this.counters.get(name) ?? 0) + value);\n },\n timer: async (name, value) => {\n validateTimerMetric(name, value);\n const values = this.timers.get(name) ?? [];\n values.push(value);\n this.timers.set(name, values);\n },\n };\n\n readonly progress: FunctionProgress = {\n update: async (current, total, options) => {\n validateProgressUpdate(current, total, options);\n this.lastProgress = { current, total, options };\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { DeserializationError, SerializationError } from \"./errors.js\";\nimport { isFile } from \"./file.js\";\nimport { isHttpBody } from \"./http-body.js\";\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true });\n\nexport interface SerializedValue {\n data: Uint8Array;\n contentType: string;\n encoding: \"json\" | \"raw\";\n}\n\nfunction assertJSONValue(value: unknown, path: string, seen: Set<object>): void {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") return;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SerializationError(`${path} contains a non-finite number`);\n return;\n }\n if (typeof value !== \"object\") {\n throw new SerializationError(`${path} contains unsupported ${typeof value}`);\n }\n if (isFile(value)) {\n throw new SerializationError(`${path} contains a nested File; File is only supported as a direct value`);\n }\n if (isHttpBody(value)) {\n throw new SerializationError(\n `${path} contains a nested HttpBody; HttpBody is only supported as a direct value`,\n );\n }\n if (seen.has(value)) throw new SerializationError(`${path} contains a cycle`);\n if (Object.getPrototypeOf(value) !== Object.prototype && !Array.isArray(value)) {\n throw new SerializationError(`${path} contains unsupported ${value.constructor?.name ?? \"object\"}`);\n }\n seen.add(value);\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n if (!Object.prototype.hasOwnProperty.call(value, index)) {\n throw new SerializationError(`${path} contains a sparse array entry at index ${index}`);\n }\n assertJSONValue(value[index], `${path}[${index}]`, seen);\n }\n } else {\n for (const [key, item] of Object.entries(value)) {\n assertJSONValue(item, `${path}.${key}`, seen);\n }\n }\n seen.delete(value);\n}\n\nexport function serializeValue(value: unknown): SerializedValue {\n if (isFile(value)) {\n return { data: value.content, contentType: value.contentType, encoding: \"raw\" };\n }\n if (isHttpBody(value)) {\n return {\n data: value.content,\n contentType: value.contentType ?? \"\",\n encoding: \"raw\",\n };\n }\n try {\n assertJSONValue(value, \"value\", new Set());\n return {\n data: textEncoder.encode(JSON.stringify(value)),\n contentType: \"application/json; charset=UTF-8\",\n encoding: \"json\",\n };\n } catch (error) {\n if (error instanceof SerializationError) throw error;\n throw new SerializationError(\"Failed to serialize JSON value\", { cause: error });\n }\n}\n\nexport function deserializeJSON(data: Uint8Array): unknown {\n try {\n return JSON.parse(textDecoder.decode(data));\n } catch (error) {\n throw new DeserializationError(\"Failed to deserialize JSON value\", { cause: error });\n }\n}\n\nexport function jsonRoundTrip<T>(value: T): T {\n const serialized = serializeValue(value);\n if (serialized.encoding !== \"json\") return value;\n return deserializeJSON(serialized.data) as T;\n}\n\nexport function canonicalJSON(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalJSON).join(\",\")}]`;\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) => a.localeCompare(b));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJSON(item)}`).join(\",\")}}`;\n}\n\nexport function sha256(data: Uint8Array): string {\n return createHash(\"sha256\").update(data).digest(\"hex\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n executeHandler,\n type FunctionFuture,\n type FunctionRuntime,\n type RegisteredDefinition,\n type RegisteredFunction,\n runWithFunctionRuntime,\n} from \"./function.js\";\nimport {\n FunctionError,\n SDKUsageError,\n TimeoutError,\n isRequestError,\n} from \"./errors.js\";\nimport {\n MemoryRequestContext,\n runWithRequestContext,\n waitWithAbortSignal,\n} from \"./context.js\";\nimport { File, isFile } from \"./file.js\";\nimport { HttpBody, isHttpBody } from \"./http-body.js\";\nimport { jsonRoundTrip } from \"./serialization.js\";\n\nexport class LocalRequest<T> {\n constructor(\n readonly id: string,\n private readonly value: Promise<T>,\n private readonly cancelRequest: (reason?: unknown) => void,\n ) {}\n\n output(): Promise<T> {\n return this.value;\n }\n\n cancel(reason?: unknown): void {\n this.cancelRequest(reason);\n }\n}\n\nfunction boundaryCopy<T>(value: T): T {\n if (isFile(value)) {\n return new File(new Uint8Array(value.content), value.contentType) as T;\n }\n if (isHttpBody(value)) {\n return new HttpBody(new Uint8Array(value.content), value.contentType) as T;\n }\n return jsonRoundTrip(value);\n}\n\nexport class LocalRuntime implements FunctionRuntime {\n readonly requestContext: MemoryRequestContext;\n private readonly application: RegisteredDefinition;\n private readonly controller = new AbortController();\n\n constructor(application: RegisteredDefinition, requestId = `local-${randomUUID()}`) {\n this.application = application;\n this.requestContext = new MemoryRequestContext(requestId, {\n signal: this.controller.signal,\n });\n }\n\n cancel(reason: unknown = new FunctionError(\"Local request was cancelled\")): void {\n if (!this.controller.signal.aborted) this.controller.abort(reason);\n }\n\n invoke<T>(definition: RegisteredDefinition, args: readonly unknown[]): Promise<T> {\n return this.execute<T>(definition, args);\n }\n\n async runFuture<T>(future: FunctionFuture<T>): Promise<T> {\n if (future.delaySeconds > 0) {\n let timer: NodeJS.Timeout | undefined;\n try {\n await waitWithAbortSignal(\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, future.delaySeconds * 1000);\n }),\n this.requestContext.signal,\n );\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n }\n return this.execute<T>(future.definition, future.args);\n }\n\n async reduce<T>(\n definition: RegisteredDefinition,\n items: readonly unknown[],\n initial: unknown,\n hasInitial: boolean,\n ): Promise<T> {\n let reduceItems = items;\n let reduceInitial = initial;\n if (!hasInitial) {\n if (items.length === 0) {\n throw new SDKUsageError(\"reduce of empty iterable with no initial value\");\n }\n [reduceInitial, ...reduceItems] = items;\n }\n let accumulator = boundaryCopy(reduceInitial);\n for (const item of reduceItems) {\n accumulator = await this.execute<T>(definition, [accumulator, item]);\n }\n return accumulator as T;\n }\n\n private async execute<T>(definition: RegisteredDefinition, rawArgs: readonly unknown[]): Promise<T> {\n const originalArgs = rawArgs.map(boundaryCopy);\n const maxRetries = definition.options.retries?.maxRetries\n ?? this.application.application?.retries.maxRetries\n ?? 0;\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n const args = originalArgs.map(boundaryCopy);\n try {\n const value = await runWithFunctionRuntime(this, () =>\n runWithRequestContext(this.requestContext, () =>\n waitWithAbortSignal(\n this.withTimeout(executeHandler<T>(definition, args), definition.options.timeout),\n this.controller.signal,\n ),\n ),\n );\n return boundaryCopy(value);\n } catch (error) {\n if (isRequestError(error)) throw error;\n if (this.controller.signal.aborted) throw this.controller.signal.reason;\n lastError = error;\n }\n }\n throw lastError instanceof Error\n ? new FunctionError(`${definition.name} failed: ${lastError.message}`, { cause: lastError })\n : new FunctionError(`${definition.name} failed`);\n }\n\n private async withTimeout<T>(promise: Promise<T>, timeoutSeconds: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new TimeoutError()),\n timeoutSeconds * 1000,\n );\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n }\n}\n\nexport async function runLocal<Args extends readonly unknown[], Result>(\n application: RegisteredFunction<Args, Result>,\n ...args: Args\n): Promise<LocalRequest<Result>> {\n if (application.definition.application == null) {\n throw new SDKUsageError(`${application.definition.name} is not a Tensorlake application`);\n }\n const runtime = new LocalRuntime(application.definition);\n const output = runtime.invoke<Result>(application.definition, args);\n return new LocalRequest(\n runtime.requestContext.requestId,\n output,\n (reason) => runtime.cancel(reason),\n );\n}\n","import { APIClient } from \"../api-client.js\";\nimport type { CloudClientOptions, RequestInput, RequestOutput } from \"../cloud-models.js\";\nimport { RequestExecutionError, RequestFailedError } from \"../errors.js\";\nimport type { RegisteredFunction } from \"./function.js\";\nimport { FunctionError, RequestError, SDKUsageError } from \"./errors.js\";\nimport { File } from \"./file.js\";\nimport { deserializeJSON, serializeValue } from \"./serialization.js\";\n\nconst CLOUD_CLIENT_OPTION_KEYS = new Set<keyof CloudClientOptions>([\n \"apiUrl\",\n \"apiKey\",\n \"organizationId\",\n \"projectId\",\n \"namespace\",\n \"maxRetries\",\n \"retryBackoffMs\",\n]);\n\nconst REMOTE_OPTIONS_BRAND: unique symbol = Symbol.for(\n \"tensorlake.applications.remote-options.v1\",\n);\n\n/** Explicitly marks client options when one or more application arguments are omitted. */\nexport interface RemoteOptions {\n readonly [REMOTE_OPTIONS_BRAND]: true;\n readonly clientOptions: CloudClientOptions;\n}\n\ntype RemoteInvocation<Args extends readonly unknown[]> =\n | [...Args]\n | [...Required<Args>, CloudClientOptions]\n | [...Partial<Args>, RemoteOptions];\n\nfunction isCloudClientOptions(value: unknown): value is CloudClientOptions {\n if (typeof value !== \"object\" || value == null || Array.isArray(value)) return false;\n const entries = Object.entries(value);\n return entries.every(([key, option]) => {\n if (!CLOUD_CLIENT_OPTION_KEYS.has(key as keyof CloudClientOptions)) return false;\n if (option === undefined) return true;\n if (key === \"maxRetries\" || key === \"retryBackoffMs\") {\n return typeof option === \"number\";\n }\n return typeof option === \"string\";\n });\n}\n\nfunction isRemoteOptions(value: unknown): value is RemoteOptions {\n if (typeof value !== \"object\" || value == null) return false;\n const candidate = value as Partial<RemoteOptions>;\n return candidate[REMOTE_OPTIONS_BRAND] === true\n && isCloudClientOptions(candidate.clientOptions);\n}\n\nexport function remoteOptions(options: CloudClientOptions = {}): RemoteOptions {\n if (!isCloudClientOptions(options)) {\n throw new SDKUsageError(\"remoteOptions requires valid CloudClientOptions\");\n }\n return Object.freeze({\n [REMOTE_OPTIONS_BRAND]: true as const,\n clientOptions: Object.freeze({ ...options }),\n });\n}\n\nexport class RemoteRequest<T> {\n constructor(\n readonly id: string,\n private readonly applicationName: string,\n private readonly client: APIClient,\n private readonly outputIsFile?: boolean,\n ) {}\n\n async output(): Promise<T> {\n let output: RequestOutput;\n try {\n await this.client.waitOnRequestCompletion(this.applicationName, this.id);\n output = await this.client.requestOutput(this.applicationName, this.id);\n } catch (error) {\n if (error instanceof RequestExecutionError) {\n throw new RequestError(error.message, { cause: error });\n }\n if (error instanceof RequestFailedError) {\n throw new FunctionError(error.message, { cause: error });\n }\n throw error;\n }\n if (this.outputIsFile === true) {\n return new File(output.serializedValue, output.contentType) as T;\n }\n if (this.outputIsFile === false || output.contentType.toLowerCase().startsWith(\"application/json\")) {\n return deserializeJSON(output.serializedValue) as T;\n }\n return new File(output.serializedValue, output.contentType) as T;\n }\n}\n\nexport function runRemote<Result = unknown>(\n application: string,\n ...args: unknown[]\n): Promise<RemoteRequest<Result>>;\nexport async function runRemote<Args extends readonly unknown[], Result>(\n application: RegisteredFunction<Args, Result>,\n ...argsAndOptions: RemoteInvocation<Args>\n): Promise<RemoteRequest<Result>>;\nexport async function runRemote(\n application: RegisteredFunction<readonly unknown[], unknown> | string,\n ...argsAndOptions: unknown[]\n): Promise<RemoteRequest<unknown>> {\n const definition = typeof application === \"string\" ? undefined : application.definition;\n if (definition != null && definition.application == null) {\n throw new SDKUsageError(`${definition.name} is not a Tensorlake application`);\n }\n const applicationName = typeof application === \"string\" ? application : definition!.name;\n let options: CloudClientOptions | undefined;\n const args = [...argsAndOptions];\n const candidate = args.at(-1);\n if (typeof application === \"string\") {\n if (isRemoteOptions(candidate)) {\n options = candidate.clientOptions;\n args.pop();\n }\n } else {\n const parameters = definition!.parameters;\n const expectedArgs = parameters.length;\n if (isRemoteOptions(candidate)) {\n const suppliedApplicationArgs = args.length - 1;\n const omitted = parameters.slice(suppliedApplicationArgs);\n if (omitted.some((parameter) => parameter.required)) {\n throw new SDKUsageError(\n `${definition!.name} is missing a required application argument before remoteOptions`,\n );\n }\n options = candidate.clientOptions;\n args.pop();\n } else if (args.length === expectedArgs + 1) {\n if (candidate !== undefined && !isCloudClientOptions(candidate)) {\n throw new SDKUsageError(\"The trailing runRemote argument must be CloudClientOptions\");\n }\n options = args.pop() as CloudClientOptions | undefined;\n }\n }\n const client = new APIClient(options);\n const inputs: RequestInput[] = args.map((value, index) => {\n const serialized = serializeValue(value);\n return { name: String(index), data: serialized.data, contentType: serialized.contentType };\n });\n const id = await client.runRequest(applicationName, inputs);\n return new RemoteRequest<unknown>(id, applicationName, client, definition?.returns._file);\n}\n","import { Buffer } from \"node:buffer\";\nimport type { JSONSchema, Parameter } from \"./schema.js\";\nimport { parameterJSONSchema } from \"./schema.js\";\nimport { getApplications, getFunctions } from \"./registry.js\";\nimport type {\n ApplicationCapability,\n RegisteredDefinition,\n} from \"./function.js\";\nimport { SDKUsageError } from \"./errors.js\";\n\nexport const TYPESCRIPT_DESCRIPTOR_FORMAT = \"tensorlake.typescript.json-schema.v1\";\n\nexport interface ParameterManifest {\n name: string;\n data_type: JSONSchema;\n description?: string;\n required: boolean;\n}\n\nexport interface FunctionManifest {\n name: string;\n description: string;\n docstring: string;\n secret_names: string[];\n initialization_timeout_sec: number;\n timeout_sec: number;\n resources: {\n cpus: number;\n memory_mb: number;\n ephemeral_disk_mb: number;\n gpus: { count: number; model: string }[];\n };\n retry_policy: {\n max_retries: number;\n initial_delay_sec: number;\n max_delay_sec: number;\n delay_multiplier: number;\n };\n cache_key: null;\n parameters: ParameterManifest[];\n return_type: JSONSchema | null;\n placement_constraints: { filter_expressions: string[] };\n max_concurrency: number;\n warm_containers?: number;\n min_containers?: number;\n max_containers?: number;\n image?: string;\n}\n\nexport interface ApplicationManifest {\n [key: string]: unknown;\n name: string;\n description: string;\n tags: Record<string, string>;\n allow: ApplicationCapability[];\n public_endpoint_id?: string;\n version: string;\n runtime: \"typescript\";\n functions: Record<string, FunctionManifest>;\n entrypoint: {\n function_name: string;\n input_serializer: \"json\";\n inputs_base64: string;\n output_serializer: \"json\";\n output_type_hints_base64: string;\n };\n}\n\nfunction encodeDescriptor(value: unknown): string {\n return Buffer.from(JSON.stringify({ format: TYPESCRIPT_DESCRIPTOR_FORMAT, value }), \"utf8\").toString(\"base64\");\n}\n\nexport function decodeDescriptor<T>(encoded: string): T {\n const envelope = JSON.parse(Buffer.from(encoded, \"base64\").toString(\"utf8\")) as {\n format?: string;\n value?: T;\n };\n if (envelope.format !== TYPESCRIPT_DESCRIPTOR_FORMAT) {\n throw new SDKUsageError(\"Application manifest does not contain TypeScript schema descriptors\");\n }\n return envelope.value as T;\n}\n\nfunction parseGPU(value: string): { count: number; model: string } {\n const [model, countText, ...extra] = value.split(\":\");\n if (!model || extra.length > 0) throw new SDKUsageError(`Invalid GPU setting '${value}'`);\n const count = countText == null ? 1 : Number(countText);\n if (!Number.isInteger(count) || count <= 0) throw new SDKUsageError(`Invalid GPU count in '${value}'`);\n return { count, model };\n}\n\nfunction parameterManifest(parameter: Parameter<unknown>): ParameterManifest {\n return {\n name: parameter.name,\n data_type: parameterJSONSchema(parameter),\n description: parameter.description,\n required: parameter.required,\n };\n}\n\nfunction functionManifest(\n application: RegisteredDefinition,\n definition: RegisteredDefinition,\n): FunctionManifest {\n const retries = definition.options.retries ?? application.application?.retries ?? { maxRetries: 0 };\n const gpu = definition.options.gpu == null\n ? []\n : (Array.isArray(definition.options.gpu) ? definition.options.gpu : [definition.options.gpu]).map(parseGPU);\n const result: FunctionManifest = {\n name: definition.name,\n description: definition.options.description,\n docstring: \"\",\n secret_names: [...definition.options.secrets],\n initialization_timeout_sec: definition.options.timeout,\n timeout_sec: definition.options.timeout,\n resources: {\n cpus: definition.options.cpu,\n memory_mb: Math.ceil(definition.options.memory * 1024),\n ephemeral_disk_mb: Math.ceil(definition.options.ephemeralDisk * 1024),\n gpus: gpu,\n },\n retry_policy: {\n max_retries: retries.maxRetries,\n initial_delay_sec: 1,\n max_delay_sec: 60,\n delay_multiplier: 2,\n },\n cache_key: null,\n parameters: definition.application == null ? [] : definition.parameters.map(parameterManifest),\n return_type: definition.application == null ? null : { ...definition.returns.jsonSchema, title: \"Return value\" },\n placement_constraints: {\n filter_expressions: (definition.options.region ?? application.options.region) == null\n ? []\n : [`region==${definition.options.region ?? application.options.region}`],\n },\n max_concurrency: 1,\n };\n if (definition.options.warmContainers != null) result.warm_containers = definition.options.warmContainers;\n if (definition.options.minContainers != null) result.min_containers = definition.options.minContainers;\n if (definition.options.maxContainers != null) result.max_containers = definition.options.maxContainers;\n if (definition.options.image != null) result.image = definition.options.image.name;\n return result;\n}\n\nexport function createApplicationManifest(application: RegisteredDefinition): ApplicationManifest {\n if (application.application == null) throw new SDKUsageError(`${application.name} is not an application`);\n const functions = Object.fromEntries(\n getFunctions().map((definition) => [definition.name, functionManifest(application, definition)]),\n );\n return {\n name: application.name,\n description: application.options.description,\n tags: { ...application.application.tags },\n allow: [...application.application.allow],\n version: application.application.version,\n runtime: \"typescript\",\n functions,\n entrypoint: {\n function_name: application.name,\n input_serializer: \"json\",\n inputs_base64: encodeDescriptor(application.parameters.map((parameter) => ({\n name: parameter.name,\n schema: parameter.schema.jsonSchema,\n required: parameter.required,\n hasDefault: parameter.hasDefault,\n defaultValue: parameter.defaultValue,\n }))),\n output_serializer: \"json\",\n output_type_hints_base64: encodeDescriptor(application.returns.jsonSchema),\n },\n };\n}\n\nexport function createApplicationManifests(): ApplicationManifest[] {\n return getApplications().map(createApplicationManifest);\n}\n\nexport interface CodeManifest {\n format_version: 2;\n runtime: \"typescript\";\n minimum_node_major: 24;\n module: string;\n functions: Record<string, { name: string }>;\n}\n\nexport function createCodeManifest(module = \"runtime.mjs\"): CodeManifest {\n return {\n format_version: 2,\n runtime: \"typescript\",\n minimum_node_major: 24,\n module,\n functions: Object.fromEntries(getFunctions().map((definition) => [definition.name, { name: definition.name }])),\n };\n}\n"],"mappings":"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AAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,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;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;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,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,MACpD;AAAA,MACA;AAAA,QACE;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QACnD;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AAAA,QAAG;AAAA,QAAI;AAAA,QAAG;AA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","names":["resolve","resolve","SandboxStatus","SandboxPendingReason","SnapshotStatus","ProcessStatus","StdinMode","OutputMode","ContainerState","resolve","buttonMask","validatePort","secondsToMillis","resolve","WebSocket","resolve","SandboxClient","process","path","fs","secondsToMillis","sleep","resolve","sandbox","path","trimTrailingSlashes","path","createSandboxImage","detectLinuxLibc","fs","read","count","createRequire","path","fileURLToPath","require","path","existsSync","DEFAULT_IMAGE_NAME","path","translateNativeError","callNative","path","path","resolveRequestTimeoutMs","secondsToMillis","validateTimeoutMs","randomUUID","randomUUID","resolve","registry","parameter","randomUUID","close","AsyncLocalStorage","path","AsyncLocalStorage","randomUUID","randomUUID","resolve","parameter","Buffer"]}
|