@alibaba-group/opensandbox 0.1.2-dev2 → 0.1.2-dev4
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/{chunk-NFNOESEY.js → chunk-4EF4ODU2.js} +5 -3
- package/dist/chunk-4EF4ODU2.js.map +1 -0
- package/dist/cjs/index.cjs +4 -2
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal.cjs +4 -2
- package/dist/cjs/internal.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.js +1 -1
- package/package.json +1 -1
- package/src/openapi/execdClient.ts +3 -1
- package/src/openapi/lifecycleClient.ts +6 -4
- package/dist/chunk-NFNOESEY.js.map +0 -1
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/core/exceptions.ts","../../src/openapi/execdClient.ts","../../src/openapi/lifecycleClient.ts","../../src/adapters/openapiError.ts","../../src/adapters/sse.ts","../../src/models/executionEventDispatcher.ts","../../src/adapters/commandsAdapter.ts","../../src/adapters/filesystemAdapter.ts","../../src/adapters/healthAdapter.ts","../../src/adapters/metricsAdapter.ts","../../src/adapters/sandboxesAdapter.ts","../../src/factory/defaultAdapterFactory.ts","../../src/core/constants.ts","../../src/config/connection.ts","../../src/manager.ts","../../src/sandbox.ts"],"sourcesContent":["// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport {\n InvalidArgumentException,\n SandboxApiException,\n SandboxError,\n SandboxException,\n SandboxInternalException,\n SandboxReadyTimeoutException,\n SandboxUnhealthyException,\n} from \"./core/exceptions.js\";\n\n// Factory pattern (stable public interface; does NOT expose OpenAPI generated models).\nexport type { AdapterFactory } from \"./factory/adapterFactory.js\";\nexport { DefaultAdapterFactory, createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\n\nexport { ConnectionConfig } from \"./config/connection.js\";\nexport type { ConnectionConfigOptions, ConnectionProtocol } from \"./config/connection.js\";\n\nexport type {\n CreateSandboxRequest,\n CreateSandboxResponse,\n Endpoint,\n ListSandboxesParams,\n ListSandboxesResponse,\n RenewSandboxExpirationRequest,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"./models/sandboxes.js\";\n\nexport type { Sandboxes } from \"./services/sandboxes.js\";\n\nexport { SandboxManager } from \"./manager.js\";\nexport type { SandboxFilter, SandboxManagerOptions } from \"./manager.js\";\n\nexport type { ExecdHealth } from \"./services/execdHealth.js\";\nexport type { ExecdMetrics } from \"./services/execdMetrics.js\";\nexport type {\n FileInfo,\n FileMetadata,\n Permission,\n RenameFileItem,\n ReplaceFileContentItem,\n SearchFilesResponse,\n FilesInfoResponse,\n} from \"./models/filesystem.js\";\n\nexport type {\n CommandExecution,\n RunCommandOpts,\n RunCommandRequest,\n ServerStreamEvent,\n CodeContextRequest,\n SupportedLanguage,\n Metrics,\n SandboxMetrics,\n PingResponse,\n} from \"./models/execd.js\";\nexport type { ExecdCommands } from \"./services/execdCommands.js\";\n\nexport type {\n Execution,\n ExecutionComplete,\n ExecutionError,\n ExecutionHandlers,\n ExecutionInit,\n ExecutionResult,\n OutputMessage,\n} from \"./models/execution.js\";\nexport { ExecutionEventDispatcher } from \"./models/executionEventDispatcher.js\";\n\nexport {\n DEFAULT_ENTRYPOINT,\n DEFAULT_EXECD_PORT,\n DEFAULT_RESOURCE_LIMITS,\n DEFAULT_TIMEOUT_SECONDS,\n DEFAULT_READY_TIMEOUT_SECONDS,\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n DEFAULT_REQUEST_TIMEOUT_SECONDS,\n} from \"./core/constants.js\";\n\nexport type {\n SandboxConnectOptions,\n SandboxCreateOptions,\n} from \"./sandbox.js\";\nexport { Sandbox } from \"./sandbox.js\";\n\nexport type {\n ContentReplaceEntry,\n MoveEntry,\n SearchEntry,\n SetPermissionEntry,\n WriteEntry,\n} from \"./models/filesystem.js\";\nexport type { SandboxFiles } from \"./services/filesystem.js\";","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport type SandboxErrorCode =\n | \"INTERNAL_UNKNOWN_ERROR\"\n | \"READY_TIMEOUT\"\n | \"UNHEALTHY\"\n | \"INVALID_ARGUMENT\"\n | \"UNEXPECTED_RESPONSE\"\n // Allow server-defined codes as well.\n | (string & {});\n\n/**\n * Structured error payload carried by {@link SandboxException}.\n *\n * - `code`: stable programmatic identifier\n * - `message`: optional human-readable message\n */\nexport class SandboxError {\n static readonly INTERNAL_UNKNOWN_ERROR: SandboxErrorCode = \"INTERNAL_UNKNOWN_ERROR\";\n static readonly READY_TIMEOUT: SandboxErrorCode = \"READY_TIMEOUT\";\n static readonly UNHEALTHY: SandboxErrorCode = \"UNHEALTHY\";\n static readonly INVALID_ARGUMENT: SandboxErrorCode = \"INVALID_ARGUMENT\";\n static readonly UNEXPECTED_RESPONSE: SandboxErrorCode = \"UNEXPECTED_RESPONSE\";\n\n constructor(\n readonly code: SandboxErrorCode,\n readonly message?: string,\n ) {}\n}\n\ninterface SandboxExceptionOpts {\n message?: string;\n cause?: unknown;\n error?: SandboxError;\n}\n\n/**\n * Base exception class for all SDK errors.\n *\n * All errors thrown by this SDK are subclasses of {@link SandboxException}.\n */\nexport class SandboxException extends Error {\n readonly name: string = \"SandboxException\";\n readonly error: SandboxError;\n readonly cause?: unknown;\n\n constructor(opts: SandboxExceptionOpts = {}) {\n super(opts.message);\n this.cause = opts.cause;\n this.error = opts.error ?? new SandboxError(SandboxError.INTERNAL_UNKNOWN_ERROR);\n }\n}\n\nexport class SandboxApiException extends SandboxException {\n readonly name: string = \"SandboxApiException\";\n readonly statusCode?: number;\n readonly requestId?: string;\n readonly rawBody?: unknown;\n\n constructor(opts: SandboxExceptionOpts & {\n statusCode?: number;\n requestId?: string;\n rawBody?: unknown;\n }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: opts.error ?? new SandboxError(SandboxError.UNEXPECTED_RESPONSE, opts.message),\n });\n this.statusCode = opts.statusCode;\n this.requestId = opts.requestId;\n this.rawBody = opts.rawBody;\n }\n}\n\nexport class SandboxInternalException extends SandboxException {\n readonly name: string = \"SandboxInternalException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.INTERNAL_UNKNOWN_ERROR, opts.message),\n });\n }\n}\n\nexport class SandboxUnhealthyException extends SandboxException {\n readonly name: string = \"SandboxUnhealthyException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.UNHEALTHY, opts.message),\n });\n }\n}\n\nexport class SandboxReadyTimeoutException extends SandboxException {\n readonly name: string = \"SandboxReadyTimeoutException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.READY_TIMEOUT, opts.message),\n });\n }\n}\n\nexport class InvalidArgumentException extends SandboxException {\n readonly name: string = \"InvalidArgumentException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.INVALID_ARGUMENT, opts.message),\n });\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\n\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\n\nexport type ExecdClient = Client<ExecdPaths>;\n\nexport interface CreateExecdClientOptions {\n /**\n * Base URL to the Execd API (no `/v1` prefix).\n * Examples:\n * - `http://localhost:44772`\n * - `http://api.opensandbox.io/sandboxes/<id>/port/44772`\n */\n baseUrl: string;\n /**\n * Extra headers applied to every request.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation.\n *\n * Useful for proxies, custom TLS, request tracing, retries, or running in environments\n * where a global `fetch` is not available.\n */\n fetch?: typeof fetch;\n}\n\nexport function createExecdClient(opts: CreateExecdClientOptions): ExecdClient {\n return createClient<ExecdPaths>({\n baseUrl: opts.baseUrl,\n headers: opts.headers,\n fetch: opts.fetch,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\n\nimport type { paths as LifecyclePaths } from \"../api/lifecycle.js\";\n\nexport type LifecycleClient = Client<LifecyclePaths>;\n\nexport interface CreateLifecycleClientOptions {\n /**\n * Base URL to OpenSandbox Lifecycle API, including the `/v1` prefix.\n * Example: `http://localhost:8080/v1`\n */\n baseUrl?: string;\n /**\n * API key for `OPEN-SANDBOX-API-KEY` header.\n * If omitted, reads from `process.env.OPEN_SANDBOX_API_KEY` when available.\n */\n apiKey?: string;\n /**\n * Extra headers applied to every request.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation.\n *\n * Useful for proxies, custom TLS, request tracing, retries, or running in environments\n * where a global `fetch` is not available.\n */\n fetch?: typeof fetch;\n}\n\nfunction readEnvApiKey(): string | undefined {\n // Avoid requiring @types/node by not referencing `process` directly.\n // In Node, `globalThis.process.env` exists; in browsers it won't.\n const env = (globalThis as any)?.process?.env;\n const v = env?.OPEN_SANDBOX_API_KEY;\n return typeof v === \"string\" && v.length ? v : undefined;\n}\n\nexport function createLifecycleClient(opts: CreateLifecycleClientOptions = {}): LifecycleClient {\n const apiKey = opts.apiKey ?? readEnvApiKey();\n\n const headers: Record<string, string> = {\n ...(opts.headers ?? {}),\n };\n\n if (apiKey && !headers[\"OPEN-SANDBOX-API-KEY\"]) {\n headers[\"OPEN-SANDBOX-API-KEY\"] = apiKey;\n }\n\n return createClient<LifecyclePaths>({\n baseUrl: opts.baseUrl ?? \"http://localhost:8080/v1\",\n headers,\n fetch: opts.fetch,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nexport function throwOnOpenApiFetchError(\n result: { error?: unknown; response: Response },\n fallbackMessage: string,\n): void {\n if (!result.error) return;\n\n const requestId = result.response.headers.get(\"x-request-id\") ?? undefined;\n const status = (result.response as any).status ?? 0;\n\n const err = result.error as any;\n const message =\n err?.message ??\n err?.error?.message ??\n fallbackMessage;\n\n const code = err?.code ?? err?.error?.code;\n const msg = err?.message ?? err?.error?.message ?? message;\n\n throw new SandboxApiException({\n message: msg,\n statusCode: status,\n requestId,\n error: code ? new SandboxError(String(code), String(msg ?? \"\")) : new SandboxError(SandboxError.UNEXPECTED_RESPONSE, String(msg ?? \"\")),\n rawBody: result.error,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nfunction tryParseJson(line: string): unknown | undefined {\n try {\n return JSON.parse(line);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parses an SSE-like stream that may be either:\n * - standard SSE frames (`data: {...}\\n\\n`)\n * - newline-delimited JSON (one JSON object per line)\n */\nexport async function* parseJsonEventStream<T>(\n res: Response,\n opts?: { fallbackErrorMessage?: string },\n): AsyncIterable<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const parsed = tryParseJson(text);\n const err = parsed && typeof parsed === \"object\" ? (parsed as any) : undefined;\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = err?.message ?? opts?.fallbackErrorMessage ?? `Stream request failed (status=${res.status})`;\n const code = err?.code ? String(err.code) : SandboxError.UNEXPECTED_RESPONSE;\n throw new SandboxApiException({\n message,\n statusCode: res.status,\n requestId,\n error: new SandboxError(code, err?.message ? String(err.message) : message),\n rawBody: parsed ?? text,\n });\n }\n\n if (!res.body) {\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buf = \"\";\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buf += decoder.decode(value, { stream: true });\n let idx: number;\n\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const rawLine = buf.slice(0, idx);\n buf = buf.slice(idx + 1);\n\n const line = rawLine.trim();\n if (!line) continue;\n\n // Support standard SSE \"data:\" prefix\n if (line.startsWith(\":\")) continue;\n if (line.startsWith(\"event:\") || line.startsWith(\"id:\") || line.startsWith(\"retry:\")) continue;\n\n const jsonLine = line.startsWith(\"data:\") ? line.slice(\"data:\".length).trim() : line;\n if (!jsonLine) continue;\n\n const parsed = tryParseJson(jsonLine);\n if (!parsed) continue;\n yield parsed as T;\n }\n }\n\n // Flush any buffered UTF-8 bytes from the decoder.\n buf += decoder.decode();\n\n // flush last line if exists\n const last = buf.trim();\n if (last) {\n const jsonLine = last.startsWith(\"data:\") ? last.slice(\"data:\".length).trim() : last;\n const parsed = tryParseJson(jsonLine);\n if (parsed) yield parsed as T;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { Execution, ExecutionComplete, ExecutionError, ExecutionHandlers, ExecutionInit, ExecutionResult, OutputMessage } from \"./execution.js\";\nimport type { ServerStreamEvent } from \"./execd.js\";\n\nfunction extractText(results: ServerStreamEvent[\"results\"] | undefined): string | undefined {\n if (!results || typeof results !== \"object\") return undefined;\n const r = results as any;\n const v = r[\"text/plain\"] ?? r.text ?? r.textPlain;\n return v == null ? undefined : String(v);\n}\n\n/**\n * Dispatches streamed execution events to handlers.\n *\n * This mutates the provided `execution` object (appending logs/results and setting fields like\n * `id`, `executionCount`, and `complete`) and invokes optional callbacks in {@link ExecutionHandlers}.\n */\nexport class ExecutionEventDispatcher {\n constructor(\n private readonly execution: Execution,\n private readonly handlers?: ExecutionHandlers,\n ) {}\n\n async dispatch(ev: ServerStreamEvent): Promise<void> {\n await this.handlers?.onEvent?.(ev);\n\n const ts = ev.timestamp ?? Date.now();\n switch (ev.type) {\n case \"init\": {\n const id = ev.text ?? \"\";\n if (id) this.execution.id = id;\n const init: ExecutionInit = { id, timestamp: ts };\n await this.handlers?.onInit?.(init);\n return;\n }\n case \"stdout\": {\n const msg: OutputMessage = { text: ev.text ?? \"\", timestamp: ts, isError: false };\n this.execution.logs.stdout.push(msg);\n await this.handlers?.onStdout?.(msg);\n return;\n }\n case \"stderr\": {\n const msg: OutputMessage = { text: ev.text ?? \"\", timestamp: ts, isError: true };\n this.execution.logs.stderr.push(msg);\n await this.handlers?.onStderr?.(msg);\n return;\n }\n case \"result\": {\n const r: ExecutionResult = { text: extractText(ev.results), timestamp: ts, raw: ev.results as any };\n this.execution.result.push(r);\n await this.handlers?.onResult?.(r);\n return;\n }\n case \"execution_count\": {\n const c = (ev as any).execution_count;\n if (typeof c === \"number\") this.execution.executionCount = c;\n return;\n }\n case \"execution_complete\": {\n const ms = (ev as any).execution_time;\n const complete: ExecutionComplete = { timestamp: ts, executionTimeMs: typeof ms === \"number\" ? ms : 0 };\n this.execution.complete = complete;\n await this.handlers?.onExecutionComplete?.(complete);\n return;\n }\n case \"error\": {\n const e = ev.error as any;\n if (e) {\n const err: ExecutionError = {\n name: String(e.ename ?? e.name ?? \"\"),\n value: String(e.evalue ?? e.value ?? \"\"),\n timestamp: ts,\n traceback: Array.isArray(e.traceback) ? e.traceback.map(String) : [],\n };\n this.execution.error = err;\n await this.handlers?.onError?.(err);\n }\n return;\n }\n default:\n return;\n }\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport { parseJsonEventStream } from \"./sse.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type { CommandExecution, RunCommandOpts, ServerStreamEvent } from \"../models/execd.js\";\nimport type { ExecdCommands } from \"../services/execdCommands.js\";\nimport type { ExecutionHandlers } from \"../models/execution.js\";\nimport { ExecutionEventDispatcher } from \"../models/executionEventDispatcher.js\";\n\nfunction joinUrl(baseUrl: string, pathname: string): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${base}${path}`;\n}\n\ntype ApiRunCommandRequest =\n ExecdPaths[\"/command\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\n\nfunction toRunCommandRequest(command: string, opts?: RunCommandOpts): ApiRunCommandRequest {\n return {\n command,\n cwd: opts?.workingDirectory,\n background: !!opts?.background,\n };\n}\n\nexport interface CommandsAdapterOptions {\n /**\n * Must match the baseUrl used by the ExecdClient.\n */\n baseUrl: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class CommandsAdapter implements ExecdCommands {\n private readonly fetch: typeof fetch;\n\n constructor(\n private readonly client: ExecdClient,\n private readonly opts: CommandsAdapterOptions,\n ) {\n this.fetch = opts.fetch ?? fetch;\n }\n\n async interrupt(sessionId: string): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/command\", {\n params: { query: { id: sessionId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Interrupt command failed\");\n }\n\n async *runStream(\n command: string,\n opts?: RunCommandOpts,\n signal?: AbortSignal,\n ): AsyncIterable<ServerStreamEvent> {\n const url = joinUrl(this.opts.baseUrl, \"/command\");\n const body = JSON.stringify(toRunCommandRequest(command, opts));\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"accept\": \"text/event-stream\",\n \"content-type\": \"application/json\",\n ...(this.opts.headers ?? {}),\n },\n body,\n signal,\n });\n\n for await (const ev of parseJsonEventStream<ServerStreamEvent>(res, { fallbackErrorMessage: \"Run command failed\" })) {\n yield ev;\n }\n }\n\n async run(\n command: string,\n opts?: RunCommandOpts,\n handlers?: ExecutionHandlers,\n signal?: AbortSignal,\n ): Promise<CommandExecution> {\n const execution: CommandExecution = {\n logs: { stdout: [], stderr: [] },\n result: [],\n };\n const dispatcher = new ExecutionEventDispatcher(execution, handlers);\n for await (const ev of this.runStream(command, opts, signal)) {\n // Keep legacy behavior: if server sends \"init\" with empty id, preserve previous id.\n if (ev.type === \"init\" && (ev.text ?? \"\") === \"\" && execution.id) {\n (ev as any).text = execution.id;\n }\n await dispatcher.dispatch(ev as any);\n }\n\n return execution;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { SandboxFiles } from \"../services/filesystem.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type {\n ContentReplaceEntry,\n FileInfo,\n FileMetadata,\n FilesInfoResponse,\n MoveEntry,\n Permission,\n RenameFileItem,\n ReplaceFileContentItem,\n SearchEntry,\n SearchFilesResponse,\n SetPermissionEntry,\n WriteEntry,\n} from \"../models/filesystem.js\";\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nfunction joinUrl(baseUrl: string, pathname: string): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${base}${path}`;\n}\n\nfunction toUploadBlob(data: Blob | Uint8Array | ArrayBuffer | string): Blob {\n if (typeof data === \"string\") return new Blob([data]);\n if (data instanceof Blob) return data;\n if (data instanceof ArrayBuffer) return new Blob([data]);\n // Copy into a new Uint8Array backed by ArrayBuffer (not SharedArrayBuffer)\n const copied = Uint8Array.from(data);\n return new Blob([copied.buffer]);\n}\n\nfunction isReadableStream(v: unknown): v is ReadableStream<Uint8Array> {\n return !!v && typeof (v as any).getReader === \"function\";\n}\n\nfunction isAsyncIterable(v: unknown): v is AsyncIterable<Uint8Array> {\n return !!v && typeof (v as any)[Symbol.asyncIterator] === \"function\";\n}\n\nfunction isNodeRuntime(): boolean {\n const p = (globalThis as any)?.process;\n return !!(p?.versions?.node);\n}\n\nasync function collectBytes(\n source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>\n): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n if (isReadableStream(source)) {\n const reader = source.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n total += value.length;\n }\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const chunk of source) {\n chunks.push(chunk);\n total += chunk.length;\n }\n }\n\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction toReadableStream(\n it: AsyncIterable<Uint8Array>\n): ReadableStream<Uint8Array> {\n const RS: any = ReadableStream as any;\n if (typeof RS?.from === \"function\") return RS.from(it);\n const iterator = it[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const r = await iterator.next();\n if (r.done) {\n controller.close();\n return;\n }\n controller.enqueue(r.value);\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction basename(p: string): string {\n const parts = p.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1] : \"file\";\n}\n\nfunction encodeUtf8(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\nasync function* multipartUploadBody(opts: {\n boundary: string;\n metadataJson: string;\n fileName: string;\n fileContentType: string;\n file: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>;\n}): AsyncIterable<Uint8Array> {\n const b = opts.boundary;\n\n // Part 1: metadata (application/json)\n yield encodeUtf8(`--${b}\\r\\n`);\n yield encodeUtf8(\n `Content-Disposition: form-data; name=\"metadata\"; filename=\"metadata\"\\r\\n`\n );\n yield encodeUtf8(`Content-Type: application/json\\r\\n\\r\\n`);\n yield encodeUtf8(opts.metadataJson);\n yield encodeUtf8(`\\r\\n`);\n\n // Part 2: file\n yield encodeUtf8(`--${b}\\r\\n`);\n yield encodeUtf8(\n `Content-Disposition: form-data; name=\"file\"; filename=\"${opts.fileName}\"\\r\\n`\n );\n yield encodeUtf8(`Content-Type: ${opts.fileContentType}\\r\\n\\r\\n`);\n\n if (isReadableStream(opts.file)) {\n const reader = opts.file.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) yield value;\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const chunk of opts.file) {\n yield chunk;\n }\n }\n\n yield encodeUtf8(`\\r\\n--${b}--\\r\\n`);\n}\n\nexport interface FilesystemAdapterOptions {\n /**\n * Must match the baseUrl used by the ExecdClient, used for binary endpoints\n * like download/upload where we bypass JSON parsing.\n */\n baseUrl: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nfunction toPermission(e: {\n mode?: number;\n owner?: string;\n group?: string;\n}): Permission {\n return {\n mode: e.mode ?? 755,\n owner: e.owner,\n group: e.group,\n } as Permission;\n}\n\n/**\n * Filesystem adapter that exposes user-facing file APIs (`sandbox.files`).\n *\n * This adapter owns all request/response conversions:\n * - Maps friendly method shapes to API payloads\n * - Parses timestamps into `Date`\n * - Implements streaming upload/download helpers\n */\nexport class FilesystemAdapter implements SandboxFiles {\n private readonly fetch: typeof fetch;\n\n private static readonly Api = {\n // This is intentionally derived from OpenAPI schema types so API changes surface quickly.\n SearchFilesOk:\n null as unknown as ExecdPaths[\"/files/search\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"],\n FilesInfoOk:\n null as unknown as ExecdPaths[\"/files/info\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"],\n MakeDirsRequest:\n null as unknown as ExecdPaths[\"/directories\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n SetPermissionsRequest:\n null as unknown as ExecdPaths[\"/files/permissions\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n MoveFilesRequest:\n null as unknown as ExecdPaths[\"/files/mv\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n ReplaceContentsRequest:\n null as unknown as ExecdPaths[\"/files/replace\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n };\n\n constructor(\n private readonly client: ExecdClient,\n private readonly opts: FilesystemAdapterOptions\n ) {\n this.fetch = opts.fetch ?? fetch;\n }\n\n private parseIsoDate(field: string, v: unknown): Date {\n if (typeof v !== \"string\" || !v) {\n throw new Error(`Invalid ${field}: expected ISO string, got ${typeof v}`);\n }\n const d = new Date(v);\n if (Number.isNaN(d.getTime())) {\n throw new Error(`Invalid ${field}: ${v}`);\n }\n return d;\n }\n\n private static readonly _ApiFileInfo =\n null as unknown as (typeof FilesystemAdapter.Api.SearchFilesOk)[number];\n\n private mapApiFileInfo(raw: typeof FilesystemAdapter._ApiFileInfo): FileInfo {\n const { path, size, created_at, modified_at, mode, owner, group, ...rest } =\n raw;\n\n return {\n ...rest,\n path,\n size,\n mode,\n owner,\n group,\n createdAt: created_at\n ? this.parseIsoDate(\"createdAt\", created_at)\n : undefined,\n modifiedAt: modified_at\n ? this.parseIsoDate(\"modifiedAt\", modified_at)\n : undefined,\n };\n }\n\n async getFileInfo(paths: string[]): Promise<Record<string, FileInfo>> {\n const { data, error, response } = await this.client.GET(\"/files/info\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get file info failed\");\n const raw = data as typeof FilesystemAdapter.Api.FilesInfoOk | undefined;\n if (!raw) return {} as FilesInfoResponse;\n if (typeof raw !== \"object\") {\n throw new Error(\n `Get file info failed: unexpected response shape (got ${typeof raw})`\n );\n }\n const out: Record<string, FileInfo> = {};\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (!v || typeof v !== \"object\") {\n throw new Error(\n `Get file info failed: invalid file info for path=${k}`\n );\n }\n out[k] = this.mapApiFileInfo(v as typeof FilesystemAdapter._ApiFileInfo);\n }\n return out as FilesInfoResponse;\n }\n\n async deleteFiles(paths: string[]): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/files\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete files failed\");\n }\n\n async createDirectories(\n entries: Pick<WriteEntry, \"path\" | \"mode\" | \"owner\" | \"group\">[]\n ): Promise<void> {\n const map: Record<string, Permission> = {};\n for (const e of entries) {\n map[e.path] = toPermission(e);\n }\n const body = map as unknown as typeof FilesystemAdapter.Api.MakeDirsRequest;\n const { error, response } = await this.client.POST(\"/directories\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Create directories failed\");\n }\n\n async deleteDirectories(paths: string[]): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/directories\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete directories failed\");\n }\n\n async setPermissions(entries: SetPermissionEntry[]): Promise<void> {\n const req: Record<string, Permission> = {};\n for (const e of entries) {\n req[e.path] = toPermission(e);\n }\n const body =\n req as unknown as typeof FilesystemAdapter.Api.SetPermissionsRequest;\n const { error, response } = await this.client.POST(\"/files/permissions\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Set permissions failed\");\n }\n\n async moveFiles(entries: MoveEntry[]): Promise<void> {\n const req: RenameFileItem[] = entries.map((e) => ({\n src: e.src,\n dest: e.dest,\n }));\n const body =\n req as unknown as typeof FilesystemAdapter.Api.MoveFilesRequest;\n const { error, response } = await this.client.POST(\"/files/mv\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Move files failed\");\n }\n\n async replaceContents(entries: ContentReplaceEntry[]): Promise<void> {\n const req: Record<string, ReplaceFileContentItem> = {};\n for (const e of entries) {\n req[e.path] = { old: e.oldContent, new: e.newContent };\n }\n const body =\n req as unknown as typeof FilesystemAdapter.Api.ReplaceContentsRequest;\n const { error, response } = await this.client.POST(\"/files/replace\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Replace contents failed\");\n }\n\n async search(entry: SearchEntry): Promise<SearchFilesResponse> {\n const { data, error, response } = await this.client.GET(\"/files/search\", {\n params: { query: { path: entry.path, pattern: entry.pattern } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Search files failed\");\n\n // Make the OpenAPI contract explicit (and fail loudly on unexpected shapes).\n const ok = data as typeof FilesystemAdapter.Api.SearchFilesOk | undefined;\n if (!ok) return [];\n if (!Array.isArray(ok)) {\n throw new Error(\n `Search files failed: unexpected response shape (expected array, got ${typeof ok})`\n );\n }\n return ok.map((x) => this.mapApiFileInfo(x));\n }\n\n private async uploadFile(\n meta: FileMetadata,\n data:\n | Blob\n | Uint8Array\n | ArrayBuffer\n | string\n | AsyncIterable<Uint8Array>\n | ReadableStream<Uint8Array>\n ): Promise<void> {\n const url = joinUrl(this.opts.baseUrl, \"/files/upload\");\n const fileName = basename(meta.path);\n const metadataJson = JSON.stringify(meta);\n\n // Streaming path (large files): build multipart body manually to avoid buffering.\n if (isReadableStream(data) || isAsyncIterable(data)) {\n // Browsers do not allow streaming multipart requests with custom boundaries.\n // Fall back to in-memory uploads when streaming is unavailable.\n if (!isNodeRuntime()) {\n const bytes = await collectBytes(data);\n return await this.uploadFile(meta, bytes);\n }\n const boundary = `opensandbox_${Math.random()\n .toString(16)\n .slice(2)}_${Date.now()}`;\n const bodyIt = multipartUploadBody({\n boundary,\n metadataJson,\n fileName,\n fileContentType: \"application/octet-stream\",\n file: data,\n });\n const stream = toReadableStream(bodyIt);\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": `multipart/form-data; boundary=${boundary}`,\n ...(this.opts.headers ?? {}),\n },\n body: stream as any,\n // Node fetch (undici) requires duplex for streaming request bodies.\n duplex: \"half\" as any,\n } as any);\n\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: `Upload failed (status=${res.status})`,\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Upload failed\"\n ),\n rawBody,\n });\n }\n return;\n }\n\n // In-memory path (small files): use FormData.\n const form = new FormData();\n form.append(\n \"metadata\",\n new Blob([metadataJson], { type: \"application/json\" }),\n \"metadata\"\n );\n\n if (typeof data === \"string\") {\n const textBlob = new Blob([data], { type: \"text/plain; charset=utf-8\" });\n form.append(\"file\", textBlob, fileName);\n } else {\n const blob = toUploadBlob(data);\n const fileBlob = blob.type\n ? blob\n : new Blob([blob], { type: \"application/octet-stream\" });\n form.append(\"file\", fileBlob, fileName);\n }\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n ...(this.opts.headers ?? {}),\n },\n body: form,\n });\n\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: `Upload failed (status=${res.status})`,\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Upload failed\"\n ),\n rawBody,\n });\n }\n }\n\n async readBytes(\n path: string,\n opts?: { range?: string }\n ): Promise<Uint8Array> {\n const url =\n joinUrl(this.opts.baseUrl, \"/files/download\") +\n `?path=${encodeURIComponent(path)}`;\n const res = await this.fetch(url, {\n method: \"GET\",\n headers: {\n ...(this.opts.headers ?? {}),\n ...(opts?.range ? { Range: opts.range } : {}),\n },\n });\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: \"Download failed\",\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Download failed\"\n ),\n rawBody,\n });\n }\n const ab = await res.arrayBuffer();\n return new Uint8Array(ab);\n }\n\n readBytesStream(\n path: string,\n opts?: { range?: string }\n ): AsyncIterable<Uint8Array> {\n return this.downloadStream(path, opts);\n }\n\n private async *downloadStream(\n path: string,\n opts?: { range?: string }\n ): AsyncIterable<Uint8Array> {\n const url =\n joinUrl(this.opts.baseUrl, \"/files/download\") +\n `?path=${encodeURIComponent(path)}`;\n const res = await this.fetch(url, {\n method: \"GET\",\n headers: {\n ...(this.opts.headers ?? {}),\n ...(opts?.range ? { Range: opts.range } : {}),\n },\n });\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: \"Download stream failed\",\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Download stream failed\"\n ),\n rawBody,\n });\n }\n\n const body = res.body as ReadableStream<Uint8Array> | null;\n if (!body) return;\n const reader = body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n if (value) yield value;\n }\n }\n\n async readFile(\n path: string,\n opts?: { encoding?: string; range?: string }\n ): Promise<string> {\n const bytes = await this.readBytes(path, { range: opts?.range });\n const encoding = opts?.encoding ?? \"utf-8\";\n return new TextDecoder(encoding).decode(bytes);\n }\n\n async writeFiles(entries: WriteEntry[]): Promise<void> {\n for (const e of entries) {\n const meta: FileMetadata = {\n path: e.path,\n owner: e.owner,\n group: e.group,\n mode: e.mode,\n };\n await this.uploadFile(meta, e.data ?? \"\");\n }\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { ExecdHealth } from \"../services/execdHealth.js\";\n\nexport class HealthAdapter implements ExecdHealth {\n constructor(private readonly client: ExecdClient) {}\n\n async ping(): Promise<boolean> {\n const { error, response } = await this.client.GET(\"/ping\");\n throwOnOpenApiFetchError({ error, response }, \"Execd ping failed\");\n return true;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type { SandboxMetrics } from \"../models/execd.js\";\nimport type { ExecdMetrics } from \"../services/execdMetrics.js\";\n\ntype ApiMetricsOk =\n ExecdPaths[\"/metrics\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction normalizeMetrics(m: ApiMetricsOk): SandboxMetrics {\n const cpuCount = m.cpu_count ?? 0;\n const cpuUsedPercentage = m.cpu_used_pct ?? 0;\n const memoryTotalMiB = m.mem_total_mib ?? 0;\n const memoryUsedMiB = m.mem_used_mib ?? 0;\n const timestamp = m.timestamp ?? 0;\n return {\n cpuCount: Number(cpuCount),\n cpuUsedPercentage: Number(cpuUsedPercentage),\n memoryTotalMiB: Number(memoryTotalMiB),\n memoryUsedMiB: Number(memoryUsedMiB),\n timestamp: Number(timestamp),\n };\n}\n\nexport class MetricsAdapter implements ExecdMetrics {\n constructor(private readonly client: ExecdClient) {}\n\n async getMetrics(): Promise<SandboxMetrics> {\n const { data, error, response } = await this.client.GET(\"/metrics\");\n throwOnOpenApiFetchError({ error, response }, \"Get execd metrics failed\");\n const ok = data as ApiMetricsOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get execd metrics failed: unexpected response shape\");\n }\n return normalizeMetrics(ok);\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { LifecycleClient } from \"../openapi/lifecycleClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { paths as LifecyclePaths } from \"../api/lifecycle.js\";\nimport type {\n Sandboxes,\n} from \"../services/sandboxes.js\";\nimport type {\n CreateSandboxRequest,\n CreateSandboxResponse,\n Endpoint,\n ListSandboxesParams,\n ListSandboxesResponse,\n RenewSandboxExpirationRequest,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"../models/sandboxes.js\";\n\ntype ApiCreateSandboxRequest =\n LifecyclePaths[\"/sandboxes\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\ntype ApiCreateSandboxOk =\n LifecyclePaths[\"/sandboxes\"][\"post\"][\"responses\"][202][\"content\"][\"application/json\"];\ntype ApiGetSandboxOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiListSandboxesOk =\n LifecyclePaths[\"/sandboxes\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiRenewSandboxExpirationRequest =\n LifecyclePaths[\"/sandboxes/{sandboxId}/renew-expiration\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\ntype ApiRenewSandboxExpirationOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}/renew-expiration\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiEndpointOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}/endpoints/{port}\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction encodeMetadataFilter(metadata: Record<string, string>): string {\n // The Lifecycle API expects a single `metadata` query parameter whose value is `k=v&k2=v2`.\n // The query serializer will URL-encode the value (e.g. `=` -> %3D and `&` -> %26).\n const parts: string[] = [];\n for (const [k, v] of Object.entries(metadata)) {\n parts.push(`${k}=${v}`);\n }\n return parts.join(\"&\");\n}\n\nexport class SandboxesAdapter implements Sandboxes {\n constructor(private readonly client: LifecycleClient) {}\n\n private parseIsoDate(field: string, v: unknown): Date {\n if (typeof v !== \"string\" || !v) {\n throw new Error(`Invalid ${field}: expected ISO string, got ${typeof v}`);\n }\n const d = new Date(v);\n if (Number.isNaN(d.getTime())) {\n throw new Error(`Invalid ${field}: ${v}`);\n }\n return d;\n }\n\n private mapSandboxInfo(raw: ApiGetSandboxOk): SandboxInfo {\n return {\n ...(raw ?? {}),\n createdAt: this.parseIsoDate(\"createdAt\", raw?.createdAt),\n expiresAt: this.parseIsoDate(\"expiresAt\", raw?.expiresAt),\n } as SandboxInfo;\n }\n\n async createSandbox(req: CreateSandboxRequest): Promise<CreateSandboxResponse> {\n // Make the OpenAPI contract explicit so backend schema changes surface quickly.\n const body: ApiCreateSandboxRequest = req as unknown as ApiCreateSandboxRequest;\n const { data, error, response } = await this.client.POST(\"/sandboxes\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Create sandbox failed\");\n const raw = data as ApiCreateSandboxOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Create sandbox failed: unexpected response shape\");\n }\n return {\n ...(raw ?? {}),\n createdAt: this.parseIsoDate(\"createdAt\", raw?.createdAt),\n expiresAt: this.parseIsoDate(\"expiresAt\", raw?.expiresAt),\n } as CreateSandboxResponse;\n }\n\n async getSandbox(sandboxId: SandboxId): Promise<SandboxInfo> {\n const { data, error, response } = await this.client.GET(\"/sandboxes/{sandboxId}\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get sandbox failed\");\n const ok = data as ApiGetSandboxOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get sandbox failed: unexpected response shape\");\n }\n return this.mapSandboxInfo(ok);\n }\n\n async listSandboxes(params: ListSandboxesParams = {}): Promise<ListSandboxesResponse> {\n const query: Record<string, string | number | boolean | undefined | null | (string | number)[]> = {};\n if (params.states?.length) query.state = params.states;\n if (params.metadata && Object.keys(params.metadata).length) {\n query.metadata = encodeMetadataFilter(params.metadata);\n }\n if (params.page != null) query.page = params.page;\n if (params.pageSize != null) query.pageSize = params.pageSize;\n\n const { data, error, response } = await this.client.GET(\"/sandboxes\", {\n params: { query },\n });\n throwOnOpenApiFetchError({ error, response }, \"List sandboxes failed\");\n const raw = data as ApiListSandboxesOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"List sandboxes failed: unexpected response shape\");\n }\n const itemsRaw = raw.items;\n if (!Array.isArray(itemsRaw)) throw new Error(\"List sandboxes failed: unexpected items shape\");\n return {\n ...(raw ?? {}),\n items: itemsRaw.map((x) => this.mapSandboxInfo(x)),\n } as ListSandboxesResponse;\n }\n\n async deleteSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/sandboxes/{sandboxId}\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete sandbox failed\");\n }\n\n async pauseSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/pause\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Pause sandbox failed\");\n }\n\n async resumeSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/resume\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Resume sandbox failed\");\n }\n\n async renewSandboxExpiration(\n sandboxId: SandboxId,\n req: RenewSandboxExpirationRequest,\n ): Promise<RenewSandboxExpirationResponse> {\n const body: ApiRenewSandboxExpirationRequest = req as unknown as ApiRenewSandboxExpirationRequest;\n const { data, error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/renew-expiration\", {\n params: { path: { sandboxId } },\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Renew sandbox expiration failed\");\n const raw = data as ApiRenewSandboxExpirationOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Renew sandbox expiration failed: unexpected response shape\");\n }\n return {\n ...(raw ?? {}),\n expiresAt: raw?.expiresAt ? this.parseIsoDate(\"expiresAt\", raw.expiresAt) : undefined,\n } as RenewSandboxExpirationResponse;\n }\n\n async getSandboxEndpoint(sandboxId: SandboxId, port: number): Promise<Endpoint> {\n const { data, error, response } = await this.client.GET(\"/sandboxes/{sandboxId}/endpoints/{port}\", {\n params: { path: { sandboxId, port } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get sandbox endpoint failed\");\n const ok = data as ApiEndpointOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get sandbox endpoint failed: unexpected response shape\");\n }\n return ok as unknown as Endpoint;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createExecdClient } from \"../openapi/execdClient.js\";\nimport { createLifecycleClient } from \"../openapi/lifecycleClient.js\";\n\nimport { CommandsAdapter } from \"../adapters/commandsAdapter.js\";\nimport { FilesystemAdapter } from \"../adapters/filesystemAdapter.js\";\nimport { HealthAdapter } from \"../adapters/healthAdapter.js\";\nimport { MetricsAdapter } from \"../adapters/metricsAdapter.js\";\nimport { SandboxesAdapter } from \"../adapters/sandboxesAdapter.js\";\n\nimport type { AdapterFactory, CreateExecdStackOptions, CreateLifecycleStackOptions, ExecdStack, LifecycleStack } from \"./adapterFactory.js\";\n\nexport class DefaultAdapterFactory implements AdapterFactory {\n createLifecycleStack(opts: CreateLifecycleStackOptions): LifecycleStack {\n const lifecycleClient = createLifecycleClient({\n baseUrl: opts.lifecycleBaseUrl,\n apiKey: opts.connectionConfig.apiKey,\n headers: opts.connectionConfig.headers,\n fetch: opts.connectionConfig.fetch,\n });\n const sandboxes = new SandboxesAdapter(lifecycleClient);\n return { sandboxes };\n }\n\n createExecdStack(opts: CreateExecdStackOptions): ExecdStack {\n const execdClient = createExecdClient({\n baseUrl: opts.execdBaseUrl,\n headers: opts.connectionConfig.headers,\n fetch: opts.connectionConfig.fetch,\n });\n\n const health = new HealthAdapter(execdClient);\n const metrics = new MetricsAdapter(execdClient);\n const files = new FilesystemAdapter(execdClient, {\n baseUrl: opts.execdBaseUrl,\n fetch: opts.connectionConfig.fetch,\n headers: opts.connectionConfig.headers,\n });\n const commands = new CommandsAdapter(execdClient, {\n baseUrl: opts.execdBaseUrl,\n fetch: opts.connectionConfig.sseFetch,\n headers: opts.connectionConfig.headers,\n });\n\n return {\n commands,\n files,\n health,\n metrics,\n };\n }\n}\n\nexport function createDefaultAdapterFactory(): AdapterFactory {\n return new DefaultAdapterFactory();\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const DEFAULT_EXECD_PORT = 44772;\n\nexport const DEFAULT_ENTRYPOINT: string[] = [\"tail\", \"-f\", \"/dev/null\"];\n\nexport const DEFAULT_RESOURCE_LIMITS: Record<string, string> = {\n cpu: \"1\",\n memory: \"2Gi\",\n};\n\nexport const DEFAULT_TIMEOUT_SECONDS = 600;\nexport const DEFAULT_READY_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS = 200;\n\nexport const DEFAULT_REQUEST_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_USER_AGENT = \"OpenSandbox-JS-SDK/0.1.1\";","// Copyright 2026 Alibaba Group Holding Ltd.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {DEFAULT_USER_AGENT} from \"../core/constants.js\";\n\nexport type ConnectionProtocol = \"http\" | \"https\";\n\n/**\n * Options for {@link ConnectionConfig}.\n *\n * Most users only need `domain`, `protocol`, and `apiKey`.\n */\nexport interface ConnectionConfigOptions {\n /**\n * API server domain (host[:port]) without scheme.\n * Examples:\n * - \"localhost:8080\"\n * - \"api.opensandbox.io\"\n *\n * You may also pass a full URL (e.g. \"http://localhost:8080\" or \"https://api.example.com\").\n * If the URL includes a path, it will be preserved and `/v1` will be appended automatically.\n */\n domain?: string;\n protocol?: ConnectionProtocol;\n apiKey?: string;\n headers?: Record<string, string>;\n\n /**\n * Request timeout applied to all SDK HTTP calls (best-effort; wraps fetch).\n * Defaults to 30 seconds.\n */\n requestTimeoutSeconds?: number;\n /**\n * Enable basic debug logging for HTTP requests (best-effort).\n */\n debug?: boolean;\n}\n\nfunction isNodeRuntime(): boolean {\n const p = (globalThis as any)?.process;\n return !!p?.versions?.node;\n}\n\nfunction redactHeaders(\n headers: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = { ...headers };\n for (const k of Object.keys(out)) {\n if (k.toLowerCase() === \"open-sandbox-api-key\") out[k] = \"***\";\n }\n return out;\n}\n\nfunction readEnv(name: string): string | undefined {\n const env = (globalThis as any)?.process?.env;\n const v = env?.[name];\n return typeof v === \"string\" && v.length ? v : undefined;\n}\n\nfunction stripTrailingSlashes(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\nfunction stripV1Suffix(s: string): string {\n const trimmed = stripTrailingSlashes(s);\n return trimmed.endsWith(\"/v1\") ? trimmed.slice(0, -3) : trimmed;\n}\n\nconst DEFAULT_KEEPALIVE_TIMEOUT_MS = 30_000;\n\nfunction normalizeDomainBase(input: string): {\n protocol?: ConnectionProtocol;\n domainBase: string;\n} {\n // Accept a full URL and preserve its path prefix (if any).\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n const u = new URL(input);\n const proto = u.protocol === \"https:\" ? \"https\" : \"http\";\n // Keep origin + pathname, drop query/hash.\n const base = `${u.origin}${u.pathname}`;\n return { protocol: proto, domainBase: stripV1Suffix(base) };\n }\n\n // No scheme: treat as \"host[:port]\" or \"host[:port]/prefix\" and normalize trailing \"/v1\" or \"/\".\n return { domainBase: stripV1Suffix(input) };\n}\n\nfunction createNodeFetch(): {\n fetch: typeof fetch;\n close: () => Promise<void>;\n} {\n if (!isNodeRuntime()) {\n return {\n fetch,\n close: async () => {\n // Browser fetch has no pooled dispatcher to close.\n },\n };\n }\n\n const baseFetch = fetch;\n let dispatcher: unknown | undefined;\n let dispatcherPromise: Promise<unknown> | null = null;\n\n const nodeFetch: typeof fetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n dispatcherPromise ??= (async () => {\n try {\n const mod = await import(\"undici\");\n const Agent = (mod as { Agent?: new (...args: any[]) => unknown }).Agent;\n if (!Agent) {\n return undefined;\n }\n dispatcher = new Agent({\n keepAliveTimeout: DEFAULT_KEEPALIVE_TIMEOUT_MS,\n keepAliveMaxTimeout: DEFAULT_KEEPALIVE_TIMEOUT_MS,\n });\n return dispatcher;\n } catch {\n return undefined;\n }\n })();\n\n if (dispatcherPromise) {\n await dispatcherPromise;\n }\n\n if (dispatcher) {\n const mergedInit = { ...(init ?? {}), dispatcher } as RequestInit & {\n dispatcher?: unknown;\n };\n return baseFetch(input, mergedInit as RequestInit);\n }\n\n return baseFetch(input, init);\n };\n\n return {\n fetch: nodeFetch,\n close: async () => {\n if (dispatcherPromise) {\n await dispatcherPromise.catch(() => undefined);\n }\n if (\n dispatcher &&\n typeof dispatcher === \"object\" &&\n typeof (dispatcher as any).close === \"function\"\n ) {\n try {\n await (dispatcher as any).close();\n } catch {\n // swallow close errors\n }\n }\n },\n };\n}\n\nfunction createTimedFetch(opts: {\n baseFetch: typeof fetch;\n timeoutSeconds: number;\n debug: boolean;\n defaultHeaders?: Record<string, string>;\n label: string;\n}): typeof fetch {\n const baseFetch = opts.baseFetch;\n const timeoutSeconds = opts.timeoutSeconds;\n const debug = opts.debug;\n const defaultHeaders = opts.defaultHeaders ?? {};\n const label = opts.label;\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = init?.method ?? \"GET\";\n const url =\n typeof input === \"string\"\n ? input\n : (input as any)?.toString?.() ?? String(input);\n\n const ac = new AbortController();\n const timeoutMs = Math.floor(timeoutSeconds * 1000);\n const t =\n Number.isFinite(timeoutMs) && timeoutMs > 0\n ? setTimeout(\n () =>\n ac.abort(\n new Error(\n `[${label}] Request timed out (timeoutSeconds=${timeoutSeconds})`\n )\n ),\n timeoutMs\n )\n : undefined;\n\n const onAbort = () =>\n ac.abort((init?.signal as any)?.reason ?? new Error(\"Aborted\"));\n if (init?.signal) {\n if (init.signal.aborted) onAbort();\n else\n init.signal.addEventListener(\"abort\", onAbort, { once: true } as any);\n }\n\n const mergedInit: RequestInit = {\n ...init,\n signal: ac.signal,\n };\n\n if (debug) {\n const mergedHeaders = {\n ...defaultHeaders,\n ...((init?.headers ?? {}) as any),\n };\n // eslint-disable-next-line no-console\n console.log(\n `[opensandbox:${label}] ->`,\n method,\n url,\n redactHeaders(mergedHeaders)\n );\n }\n\n try {\n const res = await baseFetch(input, mergedInit);\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[opensandbox:${label}] <-`, method, url, res.status);\n }\n return res;\n } finally {\n if (t) clearTimeout(t);\n if (init?.signal)\n init.signal.removeEventListener(\"abort\", onAbort as any);\n }\n };\n}\n\nexport class ConnectionConfig {\n readonly protocol: ConnectionProtocol;\n readonly domain: string;\n readonly apiKey?: string;\n readonly headers: Record<string, string>;\n private _fetch: typeof fetch | null;\n private _sseFetch: typeof fetch | null;\n readonly requestTimeoutSeconds: number;\n readonly debug: boolean;\n readonly userAgent: string = DEFAULT_USER_AGENT;\n private _closeTransport: () => Promise<void>;\n private _closePromise: Promise<void> | null = null;\n private _transportInitialized = false;\n\n /**\n * Create a connection configuration.\n *\n * Environment variables (optional):\n * - `OPEN_SANDBOX_DOMAIN` (default: `localhost:8080`)\n * - `OPEN_SANDBOX_API_KEY`\n */\n constructor(opts: ConnectionConfigOptions = {}) {\n const envDomain = readEnv(\"OPEN_SANDBOX_DOMAIN\");\n const envApiKey = readEnv(\"OPEN_SANDBOX_API_KEY\");\n\n const rawDomain = opts.domain ?? envDomain ?? \"localhost:8080\";\n const normalized = normalizeDomainBase(rawDomain);\n\n // If the domain includes a scheme, it overrides `protocol`.\n this.protocol = normalized.protocol ?? opts.protocol ?? \"http\";\n this.domain = normalized.domainBase;\n this.apiKey = opts.apiKey ?? envApiKey;\n this.requestTimeoutSeconds =\n typeof opts.requestTimeoutSeconds === \"number\"\n ? opts.requestTimeoutSeconds\n : 30;\n this.debug = !!opts.debug;\n\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n // Attach API key via header unless the user already provided one.\n if (this.apiKey && !headers[\"OPEN-SANDBOX-API-KEY\"]) {\n headers[\"OPEN-SANDBOX-API-KEY\"] = this.apiKey;\n }\n // Best-effort user-agent (Node only).\n if (\n isNodeRuntime() &&\n this.userAgent &&\n !headers[\"user-agent\"] &&\n !headers[\"User-Agent\"]\n ) {\n headers[\"user-agent\"] = this.userAgent;\n }\n this.headers = headers;\n this._fetch = null;\n this._sseFetch = null;\n this._closeTransport = async () => {\n // Init with empty close call\n };\n this._transportInitialized = false;\n }\n\n get fetch(): typeof fetch {\n return this._fetch ?? fetch;\n }\n\n get sseFetch(): typeof fetch {\n return this._sseFetch ?? fetch;\n }\n\n getBaseUrl(): string {\n // If `domain` already contains a scheme, treat it as a full base URL prefix.\n if (\n this.domain.startsWith(\"http://\") ||\n this.domain.startsWith(\"https://\")\n ) {\n return `${stripV1Suffix(this.domain)}/v1`;\n }\n return `${this.protocol}://${stripV1Suffix(this.domain)}/v1`;\n }\n\n private initializeTransport(): void {\n if (this._transportInitialized) return;\n\n const { fetch: baseFetch, close } = createNodeFetch();\n this._fetch = createTimedFetch({\n baseFetch,\n timeoutSeconds: this.requestTimeoutSeconds,\n debug: this.debug,\n defaultHeaders: this.headers,\n label: \"http\",\n });\n this._sseFetch = createTimedFetch({\n baseFetch,\n timeoutSeconds: 0,\n debug: this.debug,\n defaultHeaders: this.headers,\n label: \"sse\",\n });\n this._closeTransport = close;\n this._transportInitialized = true;\n }\n /**\n * Ensure this configuration has transport helpers (fetch/SSE) allocated.\n *\n * On Node.js this creates a dedicated `undici` dispatcher; on browsers it\n * simply reuses the global fetch. Returns either `this` or a cloned config\n * with the transport initialized.\n */\n withTransportIfMissing(): ConnectionConfig {\n if (this._transportInitialized) {\n return this;\n }\n\n const clone = new ConnectionConfig({\n domain: this.domain,\n protocol: this.protocol,\n apiKey: this.apiKey,\n headers: { ...this.headers },\n requestTimeoutSeconds: this.requestTimeoutSeconds,\n debug: this.debug,\n });\n clone.initializeTransport();\n return clone;\n }\n\n /**\n * Close the Node.js agent owned by this configuration.\n */\n async closeTransport(): Promise<void> {\n if (!this._transportInitialized) return;\n this._closePromise ??= this._closeTransport();\n await this._closePromise;\n }\n}\n","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ConnectionConfig, type ConnectionConfigOptions } from \"./config/connection.js\";\nimport { createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\nimport type { AdapterFactory } from \"./factory/adapterFactory.js\";\n\nimport type { ListSandboxesResponse, SandboxId, SandboxInfo } from \"./models/sandboxes.js\";\nimport type { Sandboxes } from \"./services/sandboxes.js\";\n\nexport interface SandboxManagerOptions {\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n adapterFactory?: AdapterFactory;\n}\n\nexport interface SandboxFilter {\n states?: string[];\n metadata?: Record<string, string>;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * Administrative interface for managing sandboxes (list/get/pause/resume/kill/renew).\n *\n * For interacting *inside* a sandbox, use {@link Sandbox}.\n */\nexport class SandboxManager {\n private readonly sandboxes: Sandboxes;\n private readonly connectionConfig: ConnectionConfig;\n\n private constructor(opts: { sandboxes: Sandboxes; connectionConfig: ConnectionConfig }) {\n this.sandboxes = opts.sandboxes;\n this.connectionConfig = opts.connectionConfig;\n }\n\n static create(opts: SandboxManagerOptions = {}): SandboxManager {\n const baseConnectionConfig = opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n void connectionConfig.closeTransport().catch(() => undefined);\n throw err;\n }\n return new SandboxManager({ sandboxes, connectionConfig });\n }\n\n listSandboxInfos(filter: SandboxFilter = {}): Promise<ListSandboxesResponse> {\n return this.sandboxes.listSandboxes({\n states: filter.states,\n metadata: filter.metadata,\n page: filter.page,\n pageSize: filter.pageSize,\n });\n }\n\n getSandboxInfo(sandboxId: SandboxId): Promise<SandboxInfo> {\n return this.sandboxes.getSandbox(sandboxId);\n }\n\n killSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.deleteSandbox(sandboxId);\n }\n\n pauseSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.pauseSandbox(sandboxId);\n }\n\n resumeSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.resumeSandbox(sandboxId);\n }\n\n /**\n * Renew expiration by setting expiresAt to now + timeoutSeconds.\n */\n async renewSandbox(sandboxId: SandboxId, timeoutSeconds: number): Promise<void> {\n const expiresAt = new Date(Date.now() + timeoutSeconds * 1000).toISOString();\n await this.sandboxes.renewSandboxExpiration(sandboxId, { expiresAt });\n }\n\n /**\n * Release the HTTP agent resources allocated for this manager instance.\n *\n * Each manager clone owns a scoped `ConnectionConfig` clone.\n *\n * This mirrors the Python SDK's default transport lifecycle.\n */\n async close(): Promise<void> {\n await this.connectionConfig.closeTransport();\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n DEFAULT_ENTRYPOINT,\n DEFAULT_EXECD_PORT,\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n DEFAULT_READY_TIMEOUT_SECONDS,\n DEFAULT_RESOURCE_LIMITS,\n DEFAULT_TIMEOUT_SECONDS,\n} from \"./core/constants.js\";\nimport { ConnectionConfig, type ConnectionConfigOptions } from \"./config/connection.js\";\nimport type { SandboxFiles } from \"./services/filesystem.js\";\nimport { createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\nimport type { AdapterFactory } from \"./factory/adapterFactory.js\";\n\nimport type { Sandboxes } from \"./services/sandboxes.js\";\nimport type { ExecdCommands } from \"./services/execdCommands.js\";\nimport type { ExecdHealth } from \"./services/execdHealth.js\";\nimport type { ExecdMetrics } from \"./services/execdMetrics.js\";\nimport type {\n CreateSandboxRequest,\n Endpoint,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"./models/sandboxes.js\";\nimport { SandboxReadyTimeoutException } from \"./core/exceptions.js\";\n\nexport interface SandboxCreateOptions {\n /**\n * Connection configuration for calling the OpenSandbox Lifecycle API and the sandbox's execd API.\n */\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n /**\n * Advanced override: inject a custom adapter factory (custom transports, dependency injection).\n */\n adapterFactory?: AdapterFactory;\n\n /**\n * Container image uri, e.g. `python:3.11`\n */\n image:\n | string\n | { uri: string; auth?: { username: string; password: string } };\n\n entrypoint?: string[];\n env?: Record<string, string>;\n metadata?: Record<string, string>;\n extensions?: Record<string, string>;\n\n /**\n * Resource limits applied to the sandbox container.\n *\n * This is forwarded to the Lifecycle API as `resourceLimits`.\n */\n resource?: Record<string, string>;\n /**\n * Sandbox timeout in seconds.\n */\n timeoutSeconds?: number;\n\n /**\n * Skip readiness checks during create/connect.\n *\n * When true, the SDK will not wait for lifecycle state `Running` or perform the health check.\n * The returned sandbox instance may not be ready yet.\n */\n skipHealthCheck?: boolean;\n /**\n * Optional custom readiness check used by {@link Sandbox.waitUntilReady}.\n *\n * If provided, the SDK will call this function during readiness checks instead of\n * using the default `execd` ping check.\n */\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n}\n\nexport interface SandboxConnectOptions {\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n adapterFactory?: AdapterFactory;\n sandboxId: SandboxId;\n\n skipHealthCheck?: boolean;\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction toImageSpec(\n image: SandboxCreateOptions[\"image\"]\n): CreateSandboxRequest[\"image\"] {\n if (typeof image === \"string\") return { uri: image };\n return { uri: image.uri, auth: image.auth };\n}\n\nexport class Sandbox {\n readonly id: SandboxId;\n readonly connectionConfig: ConnectionConfig;\n\n /**\n * Lifecycle (sandbox management) service.\n */\n readonly sandboxes: Sandboxes;\n\n /**\n * Execd services.\n */\n readonly commands: ExecdCommands;\n /**\n * High-level filesystem facade (JS-friendly).\n */\n readonly files: SandboxFiles;\n readonly health: ExecdHealth;\n readonly metrics: ExecdMetrics;\n\n /**\n * Internal state kept out of the public instance shape.\n *\n * This avoids nominal typing issues when multiple copies of the SDK exist in a dependency graph.\n */\n private static readonly _priv = new WeakMap<\n Sandbox,\n {\n adapterFactory: AdapterFactory;\n lifecycleBaseUrl: string;\n execdBaseUrl: string;\n }\n >();\n\n private constructor(opts: {\n id: SandboxId;\n connectionConfig: ConnectionConfig;\n adapterFactory: AdapterFactory;\n lifecycleBaseUrl: string;\n execdBaseUrl: string;\n sandboxes: Sandboxes;\n commands: ExecdCommands;\n files: SandboxFiles;\n health: ExecdHealth;\n metrics: ExecdMetrics;\n }) {\n this.id = opts.id;\n this.connectionConfig = opts.connectionConfig;\n Sandbox._priv.set(this, {\n adapterFactory: opts.adapterFactory,\n lifecycleBaseUrl: opts.lifecycleBaseUrl,\n execdBaseUrl: opts.execdBaseUrl,\n });\n\n this.sandboxes = opts.sandboxes;\n this.commands = opts.commands;\n this.files = opts.files;\n this.health = opts.health;\n this.metrics = opts.metrics;\n }\n\n static async create(opts: SandboxCreateOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n\n const req: CreateSandboxRequest = {\n image: toImageSpec(opts.image),\n entrypoint: opts.entrypoint ?? DEFAULT_ENTRYPOINT,\n timeout: Math.floor(opts.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS),\n resourceLimits: opts.resource ?? DEFAULT_RESOURCE_LIMITS,\n env: opts.env ?? {},\n metadata: opts.metadata ?? {},\n extensions: opts.extensions ?? {},\n };\n\n let sandboxId: SandboxId | undefined;\n try {\n const created = await sandboxes.createSandbox(req);\n sandboxId = created.id as SandboxId;\n\n const endpoint = await sandboxes.getSandboxEndpoint(\n sandboxId,\n DEFAULT_EXECD_PORT\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n });\n\n const sbx = new Sandbox({\n id: sandboxId,\n connectionConfig,\n adapterFactory,\n lifecycleBaseUrl,\n execdBaseUrl,\n sandboxes,\n commands,\n files,\n health,\n metrics,\n });\n\n if (!(opts.skipHealthCheck ?? false)) {\n await sbx.waitUntilReady({\n readyTimeoutSeconds:\n opts.readyTimeoutSeconds ?? DEFAULT_READY_TIMEOUT_SECONDS,\n pollingIntervalMillis:\n opts.healthCheckPollingInterval ??\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n healthCheck: opts.healthCheck,\n });\n }\n\n return sbx;\n } catch (err) {\n if (sandboxId) {\n try {\n await sandboxes.deleteSandbox(sandboxId);\n } catch {\n // Ignore cleanup failure; surface original error.\n }\n }\n await connectionConfig.closeTransport();\n throw err;\n }\n }\n\n static async connect(opts: SandboxConnectOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n\n try {\n const endpoint = await sandboxes.getSandboxEndpoint(\n opts.sandboxId,\n DEFAULT_EXECD_PORT\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n });\n\n const sbx = new Sandbox({\n id: opts.sandboxId,\n connectionConfig,\n adapterFactory,\n lifecycleBaseUrl,\n execdBaseUrl,\n sandboxes,\n commands,\n files,\n health,\n metrics,\n });\n\n if (!(opts.skipHealthCheck ?? false)) {\n await sbx.waitUntilReady({\n readyTimeoutSeconds:\n opts.readyTimeoutSeconds ?? DEFAULT_READY_TIMEOUT_SECONDS,\n pollingIntervalMillis:\n opts.healthCheckPollingInterval ??\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n healthCheck: opts.healthCheck,\n });\n }\n\n return sbx;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.sandboxes.getSandbox(this.id);\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n return await this.health.ping();\n } catch {\n return false;\n }\n }\n\n async getMetrics() {\n return await this.metrics.getMetrics();\n }\n\n async pause(): Promise<void> {\n await this.sandboxes.pauseSandbox(this.id);\n }\n\n /**\n * Resume a paused sandbox and return a fresh, connected Sandbox instance.\n *\n * After resume, the execd endpoint may change, so this method returns a new\n * {@link Sandbox} instance with a refreshed execd base URL.\n */\n async resume(\n opts: {\n skipHealthCheck?: boolean;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n } = {}\n ): Promise<Sandbox> {\n await this.sandboxes.resumeSandbox(this.id);\n return await Sandbox.connect({\n sandboxId: this.id,\n connectionConfig: this.connectionConfig,\n adapterFactory: Sandbox._priv.get(this)!.adapterFactory,\n skipHealthCheck: opts.skipHealthCheck ?? false,\n readyTimeoutSeconds: opts.readyTimeoutSeconds,\n healthCheckPollingInterval: opts.healthCheckPollingInterval,\n });\n }\n\n /**\n * Resume a paused sandbox by id, then connect to its execd endpoint.\n */\n static async resume(opts: SandboxConnectOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n const resumeConnectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = resumeConnectionConfig.getBaseUrl();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig: resumeConnectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n await sandboxes.resumeSandbox(opts.sandboxId);\n } catch (err) {\n await resumeConnectionConfig.closeTransport();\n throw err;\n }\n\n await resumeConnectionConfig.closeTransport();\n return await Sandbox.connect({ ...opts, connectionConfig: baseConnectionConfig, adapterFactory });\n }\n\n async kill(): Promise<void> {\n await this.sandboxes.deleteSandbox(this.id);\n }\n\n /**\n * Release any client-side resources (e.g. Node.js HTTP agents) owned by this Sandbox instance.\n */\n async close(): Promise<void> {\n await this.connectionConfig.closeTransport();\n }\n\n /**\n * Renew expiration by setting expiresAt to now + timeoutSeconds.\n */\n async renew(timeoutSeconds: number): Promise<RenewSandboxExpirationResponse> {\n const expiresAt = new Date(\n Date.now() + timeoutSeconds * 1000\n ).toISOString();\n return await this.sandboxes.renewSandboxExpiration(this.id, { expiresAt });\n }\n\n /**\n * Get sandbox endpoint for a port (STRICT: no scheme), e.g. \"localhost:44772\" or \"domain/route/.../44772\".\n */\n async getEndpoint(port: number): Promise<Endpoint> {\n return await this.sandboxes.getSandboxEndpoint(this.id, port);\n }\n\n /**\n * Get absolute endpoint URL with scheme (convenience for HTTP clients).\n */\n async getEndpointUrl(port: number): Promise<string> {\n const ep = await this.getEndpoint(port);\n return `${this.connectionConfig.protocol}://${ep.endpoint}`;\n }\n\n async waitUntilReady(opts: {\n readyTimeoutSeconds: number;\n pollingIntervalMillis: number;\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n }): Promise<void> {\n const deadline = Date.now() + opts.readyTimeoutSeconds * 1000;\n\n // Wait until execd becomes reachable and passes health check.\n while (true) {\n if (Date.now() > deadline) {\n throw new SandboxReadyTimeoutException({\n message: `Sandbox not ready: timed out waiting for health check (timeoutSeconds=${opts.readyTimeoutSeconds})`,\n });\n }\n try {\n if (opts.healthCheck) {\n const ok = await opts.healthCheck(this);\n if (ok) return;\n } else {\n const ok = await this.health.ping();\n if (ok) return;\n }\n } catch {\n // ignore and retry\n }\n await sleep(opts.pollingIntervalMillis);\n }\n }\n}"],"mappings":"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","names":["createClient","import_openapi_fetch","createClient","joinUrl","res","isNodeRuntime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/core/exceptions.ts","../../src/openapi/execdClient.ts","../../src/openapi/lifecycleClient.ts","../../src/adapters/openapiError.ts","../../src/adapters/sse.ts","../../src/models/executionEventDispatcher.ts","../../src/adapters/commandsAdapter.ts","../../src/adapters/filesystemAdapter.ts","../../src/adapters/healthAdapter.ts","../../src/adapters/metricsAdapter.ts","../../src/adapters/sandboxesAdapter.ts","../../src/factory/defaultAdapterFactory.ts","../../src/core/constants.ts","../../src/config/connection.ts","../../src/manager.ts","../../src/sandbox.ts"],"sourcesContent":["// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport {\n InvalidArgumentException,\n SandboxApiException,\n SandboxError,\n SandboxException,\n SandboxInternalException,\n SandboxReadyTimeoutException,\n SandboxUnhealthyException,\n} from \"./core/exceptions.js\";\n\n// Factory pattern (stable public interface; does NOT expose OpenAPI generated models).\nexport type { AdapterFactory } from \"./factory/adapterFactory.js\";\nexport { DefaultAdapterFactory, createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\n\nexport { ConnectionConfig } from \"./config/connection.js\";\nexport type { ConnectionConfigOptions, ConnectionProtocol } from \"./config/connection.js\";\n\nexport type {\n CreateSandboxRequest,\n CreateSandboxResponse,\n Endpoint,\n ListSandboxesParams,\n ListSandboxesResponse,\n RenewSandboxExpirationRequest,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"./models/sandboxes.js\";\n\nexport type { Sandboxes } from \"./services/sandboxes.js\";\n\nexport { SandboxManager } from \"./manager.js\";\nexport type { SandboxFilter, SandboxManagerOptions } from \"./manager.js\";\n\nexport type { ExecdHealth } from \"./services/execdHealth.js\";\nexport type { ExecdMetrics } from \"./services/execdMetrics.js\";\nexport type {\n FileInfo,\n FileMetadata,\n Permission,\n RenameFileItem,\n ReplaceFileContentItem,\n SearchFilesResponse,\n FilesInfoResponse,\n} from \"./models/filesystem.js\";\n\nexport type {\n CommandExecution,\n RunCommandOpts,\n RunCommandRequest,\n ServerStreamEvent,\n CodeContextRequest,\n SupportedLanguage,\n Metrics,\n SandboxMetrics,\n PingResponse,\n} from \"./models/execd.js\";\nexport type { ExecdCommands } from \"./services/execdCommands.js\";\n\nexport type {\n Execution,\n ExecutionComplete,\n ExecutionError,\n ExecutionHandlers,\n ExecutionInit,\n ExecutionResult,\n OutputMessage,\n} from \"./models/execution.js\";\nexport { ExecutionEventDispatcher } from \"./models/executionEventDispatcher.js\";\n\nexport {\n DEFAULT_ENTRYPOINT,\n DEFAULT_EXECD_PORT,\n DEFAULT_RESOURCE_LIMITS,\n DEFAULT_TIMEOUT_SECONDS,\n DEFAULT_READY_TIMEOUT_SECONDS,\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n DEFAULT_REQUEST_TIMEOUT_SECONDS,\n} from \"./core/constants.js\";\n\nexport type {\n SandboxConnectOptions,\n SandboxCreateOptions,\n} from \"./sandbox.js\";\nexport { Sandbox } from \"./sandbox.js\";\n\nexport type {\n ContentReplaceEntry,\n MoveEntry,\n SearchEntry,\n SetPermissionEntry,\n WriteEntry,\n} from \"./models/filesystem.js\";\nexport type { SandboxFiles } from \"./services/filesystem.js\";","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport type SandboxErrorCode =\n | \"INTERNAL_UNKNOWN_ERROR\"\n | \"READY_TIMEOUT\"\n | \"UNHEALTHY\"\n | \"INVALID_ARGUMENT\"\n | \"UNEXPECTED_RESPONSE\"\n // Allow server-defined codes as well.\n | (string & {});\n\n/**\n * Structured error payload carried by {@link SandboxException}.\n *\n * - `code`: stable programmatic identifier\n * - `message`: optional human-readable message\n */\nexport class SandboxError {\n static readonly INTERNAL_UNKNOWN_ERROR: SandboxErrorCode = \"INTERNAL_UNKNOWN_ERROR\";\n static readonly READY_TIMEOUT: SandboxErrorCode = \"READY_TIMEOUT\";\n static readonly UNHEALTHY: SandboxErrorCode = \"UNHEALTHY\";\n static readonly INVALID_ARGUMENT: SandboxErrorCode = \"INVALID_ARGUMENT\";\n static readonly UNEXPECTED_RESPONSE: SandboxErrorCode = \"UNEXPECTED_RESPONSE\";\n\n constructor(\n readonly code: SandboxErrorCode,\n readonly message?: string,\n ) {}\n}\n\ninterface SandboxExceptionOpts {\n message?: string;\n cause?: unknown;\n error?: SandboxError;\n}\n\n/**\n * Base exception class for all SDK errors.\n *\n * All errors thrown by this SDK are subclasses of {@link SandboxException}.\n */\nexport class SandboxException extends Error {\n readonly name: string = \"SandboxException\";\n readonly error: SandboxError;\n readonly cause?: unknown;\n\n constructor(opts: SandboxExceptionOpts = {}) {\n super(opts.message);\n this.cause = opts.cause;\n this.error = opts.error ?? new SandboxError(SandboxError.INTERNAL_UNKNOWN_ERROR);\n }\n}\n\nexport class SandboxApiException extends SandboxException {\n readonly name: string = \"SandboxApiException\";\n readonly statusCode?: number;\n readonly requestId?: string;\n readonly rawBody?: unknown;\n\n constructor(opts: SandboxExceptionOpts & {\n statusCode?: number;\n requestId?: string;\n rawBody?: unknown;\n }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: opts.error ?? new SandboxError(SandboxError.UNEXPECTED_RESPONSE, opts.message),\n });\n this.statusCode = opts.statusCode;\n this.requestId = opts.requestId;\n this.rawBody = opts.rawBody;\n }\n}\n\nexport class SandboxInternalException extends SandboxException {\n readonly name: string = \"SandboxInternalException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.INTERNAL_UNKNOWN_ERROR, opts.message),\n });\n }\n}\n\nexport class SandboxUnhealthyException extends SandboxException {\n readonly name: string = \"SandboxUnhealthyException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.UNHEALTHY, opts.message),\n });\n }\n}\n\nexport class SandboxReadyTimeoutException extends SandboxException {\n readonly name: string = \"SandboxReadyTimeoutException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.READY_TIMEOUT, opts.message),\n });\n }\n}\n\nexport class InvalidArgumentException extends SandboxException {\n readonly name: string = \"InvalidArgumentException\";\n\n constructor(opts: { message?: string; cause?: unknown }) {\n super({\n message: opts.message,\n cause: opts.cause,\n error: new SandboxError(SandboxError.INVALID_ARGUMENT, opts.message),\n });\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\n\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\n\nexport type ExecdClient = Client<ExecdPaths>;\n\nexport interface CreateExecdClientOptions {\n /**\n * Base URL to the Execd API (no `/v1` prefix).\n * Examples:\n * - `http://localhost:44772`\n * - `http://api.opensandbox.io/sandboxes/<id>/port/44772`\n */\n baseUrl: string;\n /**\n * Extra headers applied to every request.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation.\n *\n * Useful for proxies, custom TLS, request tracing, retries, or running in environments\n * where a global `fetch` is not available.\n */\n fetch?: typeof fetch;\n}\n\nexport function createExecdClient(opts: CreateExecdClientOptions): ExecdClient {\n const createClientFn =\n (createClient as unknown as { default?: typeof createClient }).default ?? createClient;\n return createClientFn<ExecdPaths>({\n baseUrl: opts.baseUrl,\n headers: opts.headers,\n fetch: opts.fetch,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport createClient from \"openapi-fetch\";\nimport type { Client } from \"openapi-fetch\";\n\nimport type { paths as LifecyclePaths } from \"../api/lifecycle.js\";\n\nexport type LifecycleClient = Client<LifecyclePaths>;\n\nexport interface CreateLifecycleClientOptions {\n /**\n * Base URL to OpenSandbox Lifecycle API, including the `/v1` prefix.\n * Example: `http://localhost:8080/v1`\n */\n baseUrl?: string;\n /**\n * API key for `OPEN-SANDBOX-API-KEY` header.\n * If omitted, reads from `process.env.OPEN_SANDBOX_API_KEY` when available.\n */\n apiKey?: string;\n /**\n * Extra headers applied to every request.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation.\n *\n * Useful for proxies, custom TLS, request tracing, retries, or running in environments\n * where a global `fetch` is not available.\n */\n fetch?: typeof fetch;\n}\n\nfunction readEnvApiKey(): string | undefined {\n // Avoid requiring @types/node by not referencing `process` directly.\n // In Node, `globalThis.process.env` exists; in browsers it won't.\n const env = (globalThis as any)?.process?.env;\n const v = env?.OPEN_SANDBOX_API_KEY;\n return typeof v === \"string\" && v.length ? v : undefined;\n}\n\nexport function createLifecycleClient(opts: CreateLifecycleClientOptions = {}): LifecycleClient {\n const apiKey = opts.apiKey ?? readEnvApiKey();\n\n const headers: Record<string, string> = {\n ...(opts.headers ?? {}),\n };\n\n if (apiKey && !headers[\"OPEN-SANDBOX-API-KEY\"]) {\n headers[\"OPEN-SANDBOX-API-KEY\"] = apiKey;\n }\n\n const createClientFn =\n (createClient as unknown as { default?: typeof createClient }).default ?? createClient;\n return createClientFn<LifecyclePaths>({\n baseUrl: opts.baseUrl ?? \"http://localhost:8080/v1\",\n headers,\n fetch: opts.fetch,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nexport function throwOnOpenApiFetchError(\n result: { error?: unknown; response: Response },\n fallbackMessage: string,\n): void {\n if (!result.error) return;\n\n const requestId = result.response.headers.get(\"x-request-id\") ?? undefined;\n const status = (result.response as any).status ?? 0;\n\n const err = result.error as any;\n const message =\n err?.message ??\n err?.error?.message ??\n fallbackMessage;\n\n const code = err?.code ?? err?.error?.code;\n const msg = err?.message ?? err?.error?.message ?? message;\n\n throw new SandboxApiException({\n message: msg,\n statusCode: status,\n requestId,\n error: code ? new SandboxError(String(code), String(msg ?? \"\")) : new SandboxError(SandboxError.UNEXPECTED_RESPONSE, String(msg ?? \"\")),\n rawBody: result.error,\n });\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nfunction tryParseJson(line: string): unknown | undefined {\n try {\n return JSON.parse(line);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Parses an SSE-like stream that may be either:\n * - standard SSE frames (`data: {...}\\n\\n`)\n * - newline-delimited JSON (one JSON object per line)\n */\nexport async function* parseJsonEventStream<T>(\n res: Response,\n opts?: { fallbackErrorMessage?: string },\n): AsyncIterable<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n const parsed = tryParseJson(text);\n const err = parsed && typeof parsed === \"object\" ? (parsed as any) : undefined;\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const message = err?.message ?? opts?.fallbackErrorMessage ?? `Stream request failed (status=${res.status})`;\n const code = err?.code ? String(err.code) : SandboxError.UNEXPECTED_RESPONSE;\n throw new SandboxApiException({\n message,\n statusCode: res.status,\n requestId,\n error: new SandboxError(code, err?.message ? String(err.message) : message),\n rawBody: parsed ?? text,\n });\n }\n\n if (!res.body) {\n return;\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buf = \"\";\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buf += decoder.decode(value, { stream: true });\n let idx: number;\n\n while ((idx = buf.indexOf(\"\\n\")) >= 0) {\n const rawLine = buf.slice(0, idx);\n buf = buf.slice(idx + 1);\n\n const line = rawLine.trim();\n if (!line) continue;\n\n // Support standard SSE \"data:\" prefix\n if (line.startsWith(\":\")) continue;\n if (line.startsWith(\"event:\") || line.startsWith(\"id:\") || line.startsWith(\"retry:\")) continue;\n\n const jsonLine = line.startsWith(\"data:\") ? line.slice(\"data:\".length).trim() : line;\n if (!jsonLine) continue;\n\n const parsed = tryParseJson(jsonLine);\n if (!parsed) continue;\n yield parsed as T;\n }\n }\n\n // Flush any buffered UTF-8 bytes from the decoder.\n buf += decoder.decode();\n\n // flush last line if exists\n const last = buf.trim();\n if (last) {\n const jsonLine = last.startsWith(\"data:\") ? last.slice(\"data:\".length).trim() : last;\n const parsed = tryParseJson(jsonLine);\n if (parsed) yield parsed as T;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { Execution, ExecutionComplete, ExecutionError, ExecutionHandlers, ExecutionInit, ExecutionResult, OutputMessage } from \"./execution.js\";\nimport type { ServerStreamEvent } from \"./execd.js\";\n\nfunction extractText(results: ServerStreamEvent[\"results\"] | undefined): string | undefined {\n if (!results || typeof results !== \"object\") return undefined;\n const r = results as any;\n const v = r[\"text/plain\"] ?? r.text ?? r.textPlain;\n return v == null ? undefined : String(v);\n}\n\n/**\n * Dispatches streamed execution events to handlers.\n *\n * This mutates the provided `execution` object (appending logs/results and setting fields like\n * `id`, `executionCount`, and `complete`) and invokes optional callbacks in {@link ExecutionHandlers}.\n */\nexport class ExecutionEventDispatcher {\n constructor(\n private readonly execution: Execution,\n private readonly handlers?: ExecutionHandlers,\n ) {}\n\n async dispatch(ev: ServerStreamEvent): Promise<void> {\n await this.handlers?.onEvent?.(ev);\n\n const ts = ev.timestamp ?? Date.now();\n switch (ev.type) {\n case \"init\": {\n const id = ev.text ?? \"\";\n if (id) this.execution.id = id;\n const init: ExecutionInit = { id, timestamp: ts };\n await this.handlers?.onInit?.(init);\n return;\n }\n case \"stdout\": {\n const msg: OutputMessage = { text: ev.text ?? \"\", timestamp: ts, isError: false };\n this.execution.logs.stdout.push(msg);\n await this.handlers?.onStdout?.(msg);\n return;\n }\n case \"stderr\": {\n const msg: OutputMessage = { text: ev.text ?? \"\", timestamp: ts, isError: true };\n this.execution.logs.stderr.push(msg);\n await this.handlers?.onStderr?.(msg);\n return;\n }\n case \"result\": {\n const r: ExecutionResult = { text: extractText(ev.results), timestamp: ts, raw: ev.results as any };\n this.execution.result.push(r);\n await this.handlers?.onResult?.(r);\n return;\n }\n case \"execution_count\": {\n const c = (ev as any).execution_count;\n if (typeof c === \"number\") this.execution.executionCount = c;\n return;\n }\n case \"execution_complete\": {\n const ms = (ev as any).execution_time;\n const complete: ExecutionComplete = { timestamp: ts, executionTimeMs: typeof ms === \"number\" ? ms : 0 };\n this.execution.complete = complete;\n await this.handlers?.onExecutionComplete?.(complete);\n return;\n }\n case \"error\": {\n const e = ev.error as any;\n if (e) {\n const err: ExecutionError = {\n name: String(e.ename ?? e.name ?? \"\"),\n value: String(e.evalue ?? e.value ?? \"\"),\n timestamp: ts,\n traceback: Array.isArray(e.traceback) ? e.traceback.map(String) : [],\n };\n this.execution.error = err;\n await this.handlers?.onError?.(err);\n }\n return;\n }\n default:\n return;\n }\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport { parseJsonEventStream } from \"./sse.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type { CommandExecution, RunCommandOpts, ServerStreamEvent } from \"../models/execd.js\";\nimport type { ExecdCommands } from \"../services/execdCommands.js\";\nimport type { ExecutionHandlers } from \"../models/execution.js\";\nimport { ExecutionEventDispatcher } from \"../models/executionEventDispatcher.js\";\n\nfunction joinUrl(baseUrl: string, pathname: string): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${base}${path}`;\n}\n\ntype ApiRunCommandRequest =\n ExecdPaths[\"/command\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\n\nfunction toRunCommandRequest(command: string, opts?: RunCommandOpts): ApiRunCommandRequest {\n return {\n command,\n cwd: opts?.workingDirectory,\n background: !!opts?.background,\n };\n}\n\nexport interface CommandsAdapterOptions {\n /**\n * Must match the baseUrl used by the ExecdClient.\n */\n baseUrl: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport class CommandsAdapter implements ExecdCommands {\n private readonly fetch: typeof fetch;\n\n constructor(\n private readonly client: ExecdClient,\n private readonly opts: CommandsAdapterOptions,\n ) {\n this.fetch = opts.fetch ?? fetch;\n }\n\n async interrupt(sessionId: string): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/command\", {\n params: { query: { id: sessionId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Interrupt command failed\");\n }\n\n async *runStream(\n command: string,\n opts?: RunCommandOpts,\n signal?: AbortSignal,\n ): AsyncIterable<ServerStreamEvent> {\n const url = joinUrl(this.opts.baseUrl, \"/command\");\n const body = JSON.stringify(toRunCommandRequest(command, opts));\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"accept\": \"text/event-stream\",\n \"content-type\": \"application/json\",\n ...(this.opts.headers ?? {}),\n },\n body,\n signal,\n });\n\n for await (const ev of parseJsonEventStream<ServerStreamEvent>(res, { fallbackErrorMessage: \"Run command failed\" })) {\n yield ev;\n }\n }\n\n async run(\n command: string,\n opts?: RunCommandOpts,\n handlers?: ExecutionHandlers,\n signal?: AbortSignal,\n ): Promise<CommandExecution> {\n const execution: CommandExecution = {\n logs: { stdout: [], stderr: [] },\n result: [],\n };\n const dispatcher = new ExecutionEventDispatcher(execution, handlers);\n for await (const ev of this.runStream(command, opts, signal)) {\n // Keep legacy behavior: if server sends \"init\" with empty id, preserve previous id.\n if (ev.type === \"init\" && (ev.text ?? \"\") === \"\" && execution.id) {\n (ev as any).text = execution.id;\n }\n await dispatcher.dispatch(ev as any);\n }\n\n return execution;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { SandboxFiles } from \"../services/filesystem.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type {\n ContentReplaceEntry,\n FileInfo,\n FileMetadata,\n FilesInfoResponse,\n MoveEntry,\n Permission,\n RenameFileItem,\n ReplaceFileContentItem,\n SearchEntry,\n SearchFilesResponse,\n SetPermissionEntry,\n WriteEntry,\n} from \"../models/filesystem.js\";\nimport { SandboxApiException, SandboxError } from \"../core/exceptions.js\";\n\nfunction joinUrl(baseUrl: string, pathname: string): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${base}${path}`;\n}\n\nfunction toUploadBlob(data: Blob | Uint8Array | ArrayBuffer | string): Blob {\n if (typeof data === \"string\") return new Blob([data]);\n if (data instanceof Blob) return data;\n if (data instanceof ArrayBuffer) return new Blob([data]);\n // Copy into a new Uint8Array backed by ArrayBuffer (not SharedArrayBuffer)\n const copied = Uint8Array.from(data);\n return new Blob([copied.buffer]);\n}\n\nfunction isReadableStream(v: unknown): v is ReadableStream<Uint8Array> {\n return !!v && typeof (v as any).getReader === \"function\";\n}\n\nfunction isAsyncIterable(v: unknown): v is AsyncIterable<Uint8Array> {\n return !!v && typeof (v as any)[Symbol.asyncIterator] === \"function\";\n}\n\nfunction isNodeRuntime(): boolean {\n const p = (globalThis as any)?.process;\n return !!(p?.versions?.node);\n}\n\nasync function collectBytes(\n source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>\n): Promise<Uint8Array> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n if (isReadableStream(source)) {\n const reader = source.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n chunks.push(value);\n total += value.length;\n }\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const chunk of source) {\n chunks.push(chunk);\n total += chunk.length;\n }\n }\n\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\nfunction toReadableStream(\n it: AsyncIterable<Uint8Array>\n): ReadableStream<Uint8Array> {\n const RS: any = ReadableStream as any;\n if (typeof RS?.from === \"function\") return RS.from(it);\n const iterator = it[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const r = await iterator.next();\n if (r.done) {\n controller.close();\n return;\n }\n controller.enqueue(r.value);\n },\n async cancel() {\n await iterator.return?.();\n },\n });\n}\n\nfunction basename(p: string): string {\n const parts = p.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1] : \"file\";\n}\n\nfunction encodeUtf8(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\nasync function* multipartUploadBody(opts: {\n boundary: string;\n metadataJson: string;\n fileName: string;\n fileContentType: string;\n file: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>;\n}): AsyncIterable<Uint8Array> {\n const b = opts.boundary;\n\n // Part 1: metadata (application/json)\n yield encodeUtf8(`--${b}\\r\\n`);\n yield encodeUtf8(\n `Content-Disposition: form-data; name=\"metadata\"; filename=\"metadata\"\\r\\n`\n );\n yield encodeUtf8(`Content-Type: application/json\\r\\n\\r\\n`);\n yield encodeUtf8(opts.metadataJson);\n yield encodeUtf8(`\\r\\n`);\n\n // Part 2: file\n yield encodeUtf8(`--${b}\\r\\n`);\n yield encodeUtf8(\n `Content-Disposition: form-data; name=\"file\"; filename=\"${opts.fileName}\"\\r\\n`\n );\n yield encodeUtf8(`Content-Type: ${opts.fileContentType}\\r\\n\\r\\n`);\n\n if (isReadableStream(opts.file)) {\n const reader = opts.file.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) yield value;\n }\n } finally {\n reader.releaseLock();\n }\n } else {\n for await (const chunk of opts.file) {\n yield chunk;\n }\n }\n\n yield encodeUtf8(`\\r\\n--${b}--\\r\\n`);\n}\n\nexport interface FilesystemAdapterOptions {\n /**\n * Must match the baseUrl used by the ExecdClient, used for binary endpoints\n * like download/upload where we bypass JSON parsing.\n */\n baseUrl: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nfunction toPermission(e: {\n mode?: number;\n owner?: string;\n group?: string;\n}): Permission {\n return {\n mode: e.mode ?? 755,\n owner: e.owner,\n group: e.group,\n } as Permission;\n}\n\n/**\n * Filesystem adapter that exposes user-facing file APIs (`sandbox.files`).\n *\n * This adapter owns all request/response conversions:\n * - Maps friendly method shapes to API payloads\n * - Parses timestamps into `Date`\n * - Implements streaming upload/download helpers\n */\nexport class FilesystemAdapter implements SandboxFiles {\n private readonly fetch: typeof fetch;\n\n private static readonly Api = {\n // This is intentionally derived from OpenAPI schema types so API changes surface quickly.\n SearchFilesOk:\n null as unknown as ExecdPaths[\"/files/search\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"],\n FilesInfoOk:\n null as unknown as ExecdPaths[\"/files/info\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"],\n MakeDirsRequest:\n null as unknown as ExecdPaths[\"/directories\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n SetPermissionsRequest:\n null as unknown as ExecdPaths[\"/files/permissions\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n MoveFilesRequest:\n null as unknown as ExecdPaths[\"/files/mv\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n ReplaceContentsRequest:\n null as unknown as ExecdPaths[\"/files/replace\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"],\n };\n\n constructor(\n private readonly client: ExecdClient,\n private readonly opts: FilesystemAdapterOptions\n ) {\n this.fetch = opts.fetch ?? fetch;\n }\n\n private parseIsoDate(field: string, v: unknown): Date {\n if (typeof v !== \"string\" || !v) {\n throw new Error(`Invalid ${field}: expected ISO string, got ${typeof v}`);\n }\n const d = new Date(v);\n if (Number.isNaN(d.getTime())) {\n throw new Error(`Invalid ${field}: ${v}`);\n }\n return d;\n }\n\n private static readonly _ApiFileInfo =\n null as unknown as (typeof FilesystemAdapter.Api.SearchFilesOk)[number];\n\n private mapApiFileInfo(raw: typeof FilesystemAdapter._ApiFileInfo): FileInfo {\n const { path, size, created_at, modified_at, mode, owner, group, ...rest } =\n raw;\n\n return {\n ...rest,\n path,\n size,\n mode,\n owner,\n group,\n createdAt: created_at\n ? this.parseIsoDate(\"createdAt\", created_at)\n : undefined,\n modifiedAt: modified_at\n ? this.parseIsoDate(\"modifiedAt\", modified_at)\n : undefined,\n };\n }\n\n async getFileInfo(paths: string[]): Promise<Record<string, FileInfo>> {\n const { data, error, response } = await this.client.GET(\"/files/info\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get file info failed\");\n const raw = data as typeof FilesystemAdapter.Api.FilesInfoOk | undefined;\n if (!raw) return {} as FilesInfoResponse;\n if (typeof raw !== \"object\") {\n throw new Error(\n `Get file info failed: unexpected response shape (got ${typeof raw})`\n );\n }\n const out: Record<string, FileInfo> = {};\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n if (!v || typeof v !== \"object\") {\n throw new Error(\n `Get file info failed: invalid file info for path=${k}`\n );\n }\n out[k] = this.mapApiFileInfo(v as typeof FilesystemAdapter._ApiFileInfo);\n }\n return out as FilesInfoResponse;\n }\n\n async deleteFiles(paths: string[]): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/files\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete files failed\");\n }\n\n async createDirectories(\n entries: Pick<WriteEntry, \"path\" | \"mode\" | \"owner\" | \"group\">[]\n ): Promise<void> {\n const map: Record<string, Permission> = {};\n for (const e of entries) {\n map[e.path] = toPermission(e);\n }\n const body = map as unknown as typeof FilesystemAdapter.Api.MakeDirsRequest;\n const { error, response } = await this.client.POST(\"/directories\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Create directories failed\");\n }\n\n async deleteDirectories(paths: string[]): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/directories\", {\n params: { query: { path: paths } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete directories failed\");\n }\n\n async setPermissions(entries: SetPermissionEntry[]): Promise<void> {\n const req: Record<string, Permission> = {};\n for (const e of entries) {\n req[e.path] = toPermission(e);\n }\n const body =\n req as unknown as typeof FilesystemAdapter.Api.SetPermissionsRequest;\n const { error, response } = await this.client.POST(\"/files/permissions\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Set permissions failed\");\n }\n\n async moveFiles(entries: MoveEntry[]): Promise<void> {\n const req: RenameFileItem[] = entries.map((e) => ({\n src: e.src,\n dest: e.dest,\n }));\n const body =\n req as unknown as typeof FilesystemAdapter.Api.MoveFilesRequest;\n const { error, response } = await this.client.POST(\"/files/mv\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Move files failed\");\n }\n\n async replaceContents(entries: ContentReplaceEntry[]): Promise<void> {\n const req: Record<string, ReplaceFileContentItem> = {};\n for (const e of entries) {\n req[e.path] = { old: e.oldContent, new: e.newContent };\n }\n const body =\n req as unknown as typeof FilesystemAdapter.Api.ReplaceContentsRequest;\n const { error, response } = await this.client.POST(\"/files/replace\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Replace contents failed\");\n }\n\n async search(entry: SearchEntry): Promise<SearchFilesResponse> {\n const { data, error, response } = await this.client.GET(\"/files/search\", {\n params: { query: { path: entry.path, pattern: entry.pattern } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Search files failed\");\n\n // Make the OpenAPI contract explicit (and fail loudly on unexpected shapes).\n const ok = data as typeof FilesystemAdapter.Api.SearchFilesOk | undefined;\n if (!ok) return [];\n if (!Array.isArray(ok)) {\n throw new Error(\n `Search files failed: unexpected response shape (expected array, got ${typeof ok})`\n );\n }\n return ok.map((x) => this.mapApiFileInfo(x));\n }\n\n private async uploadFile(\n meta: FileMetadata,\n data:\n | Blob\n | Uint8Array\n | ArrayBuffer\n | string\n | AsyncIterable<Uint8Array>\n | ReadableStream<Uint8Array>\n ): Promise<void> {\n const url = joinUrl(this.opts.baseUrl, \"/files/upload\");\n const fileName = basename(meta.path);\n const metadataJson = JSON.stringify(meta);\n\n // Streaming path (large files): build multipart body manually to avoid buffering.\n if (isReadableStream(data) || isAsyncIterable(data)) {\n // Browsers do not allow streaming multipart requests with custom boundaries.\n // Fall back to in-memory uploads when streaming is unavailable.\n if (!isNodeRuntime()) {\n const bytes = await collectBytes(data);\n return await this.uploadFile(meta, bytes);\n }\n const boundary = `opensandbox_${Math.random()\n .toString(16)\n .slice(2)}_${Date.now()}`;\n const bodyIt = multipartUploadBody({\n boundary,\n metadataJson,\n fileName,\n fileContentType: \"application/octet-stream\",\n file: data,\n });\n const stream = toReadableStream(bodyIt);\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": `multipart/form-data; boundary=${boundary}`,\n ...(this.opts.headers ?? {}),\n },\n body: stream as any,\n // Node fetch (undici) requires duplex for streaming request bodies.\n duplex: \"half\" as any,\n } as any);\n\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: `Upload failed (status=${res.status})`,\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Upload failed\"\n ),\n rawBody,\n });\n }\n return;\n }\n\n // In-memory path (small files): use FormData.\n const form = new FormData();\n form.append(\n \"metadata\",\n new Blob([metadataJson], { type: \"application/json\" }),\n \"metadata\"\n );\n\n if (typeof data === \"string\") {\n const textBlob = new Blob([data], { type: \"text/plain; charset=utf-8\" });\n form.append(\"file\", textBlob, fileName);\n } else {\n const blob = toUploadBlob(data);\n const fileBlob = blob.type\n ? blob\n : new Blob([blob], { type: \"application/octet-stream\" });\n form.append(\"file\", fileBlob, fileName);\n }\n\n const res = await this.fetch(url, {\n method: \"POST\",\n headers: {\n ...(this.opts.headers ?? {}),\n },\n body: form,\n });\n\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: `Upload failed (status=${res.status})`,\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Upload failed\"\n ),\n rawBody,\n });\n }\n }\n\n async readBytes(\n path: string,\n opts?: { range?: string }\n ): Promise<Uint8Array> {\n const url =\n joinUrl(this.opts.baseUrl, \"/files/download\") +\n `?path=${encodeURIComponent(path)}`;\n const res = await this.fetch(url, {\n method: \"GET\",\n headers: {\n ...(this.opts.headers ?? {}),\n ...(opts?.range ? { Range: opts.range } : {}),\n },\n });\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: \"Download failed\",\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Download failed\"\n ),\n rawBody,\n });\n }\n const ab = await res.arrayBuffer();\n return new Uint8Array(ab);\n }\n\n readBytesStream(\n path: string,\n opts?: { range?: string }\n ): AsyncIterable<Uint8Array> {\n return this.downloadStream(path, opts);\n }\n\n private async *downloadStream(\n path: string,\n opts?: { range?: string }\n ): AsyncIterable<Uint8Array> {\n const url =\n joinUrl(this.opts.baseUrl, \"/files/download\") +\n `?path=${encodeURIComponent(path)}`;\n const res = await this.fetch(url, {\n method: \"GET\",\n headers: {\n ...(this.opts.headers ?? {}),\n ...(opts?.range ? { Range: opts.range } : {}),\n },\n });\n if (!res.ok) {\n const requestId = res.headers.get(\"x-request-id\") ?? undefined;\n const rawBody = await res.text().catch(() => undefined);\n throw new SandboxApiException({\n message: \"Download stream failed\",\n statusCode: res.status,\n requestId,\n error: new SandboxError(\n SandboxError.UNEXPECTED_RESPONSE,\n \"Download stream failed\"\n ),\n rawBody,\n });\n }\n\n const body = res.body as ReadableStream<Uint8Array> | null;\n if (!body) return;\n const reader = body.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) return;\n if (value) yield value;\n }\n }\n\n async readFile(\n path: string,\n opts?: { encoding?: string; range?: string }\n ): Promise<string> {\n const bytes = await this.readBytes(path, { range: opts?.range });\n const encoding = opts?.encoding ?? \"utf-8\";\n return new TextDecoder(encoding).decode(bytes);\n }\n\n async writeFiles(entries: WriteEntry[]): Promise<void> {\n for (const e of entries) {\n const meta: FileMetadata = {\n path: e.path,\n owner: e.owner,\n group: e.group,\n mode: e.mode,\n };\n await this.uploadFile(meta, e.data ?? \"\");\n }\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { ExecdHealth } from \"../services/execdHealth.js\";\n\nexport class HealthAdapter implements ExecdHealth {\n constructor(private readonly client: ExecdClient) {}\n\n async ping(): Promise<boolean> {\n const { error, response } = await this.client.GET(\"/ping\");\n throwOnOpenApiFetchError({ error, response }, \"Execd ping failed\");\n return true;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { ExecdClient } from \"../openapi/execdClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { paths as ExecdPaths } from \"../api/execd.js\";\nimport type { SandboxMetrics } from \"../models/execd.js\";\nimport type { ExecdMetrics } from \"../services/execdMetrics.js\";\n\ntype ApiMetricsOk =\n ExecdPaths[\"/metrics\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction normalizeMetrics(m: ApiMetricsOk): SandboxMetrics {\n const cpuCount = m.cpu_count ?? 0;\n const cpuUsedPercentage = m.cpu_used_pct ?? 0;\n const memoryTotalMiB = m.mem_total_mib ?? 0;\n const memoryUsedMiB = m.mem_used_mib ?? 0;\n const timestamp = m.timestamp ?? 0;\n return {\n cpuCount: Number(cpuCount),\n cpuUsedPercentage: Number(cpuUsedPercentage),\n memoryTotalMiB: Number(memoryTotalMiB),\n memoryUsedMiB: Number(memoryUsedMiB),\n timestamp: Number(timestamp),\n };\n}\n\nexport class MetricsAdapter implements ExecdMetrics {\n constructor(private readonly client: ExecdClient) {}\n\n async getMetrics(): Promise<SandboxMetrics> {\n const { data, error, response } = await this.client.GET(\"/metrics\");\n throwOnOpenApiFetchError({ error, response }, \"Get execd metrics failed\");\n const ok = data as ApiMetricsOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get execd metrics failed: unexpected response shape\");\n }\n return normalizeMetrics(ok);\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport type { LifecycleClient } from \"../openapi/lifecycleClient.js\";\nimport { throwOnOpenApiFetchError } from \"./openapiError.js\";\nimport type { paths as LifecyclePaths } from \"../api/lifecycle.js\";\nimport type {\n Sandboxes,\n} from \"../services/sandboxes.js\";\nimport type {\n CreateSandboxRequest,\n CreateSandboxResponse,\n Endpoint,\n ListSandboxesParams,\n ListSandboxesResponse,\n RenewSandboxExpirationRequest,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"../models/sandboxes.js\";\n\ntype ApiCreateSandboxRequest =\n LifecyclePaths[\"/sandboxes\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\ntype ApiCreateSandboxOk =\n LifecyclePaths[\"/sandboxes\"][\"post\"][\"responses\"][202][\"content\"][\"application/json\"];\ntype ApiGetSandboxOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiListSandboxesOk =\n LifecyclePaths[\"/sandboxes\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiRenewSandboxExpirationRequest =\n LifecyclePaths[\"/sandboxes/{sandboxId}/renew-expiration\"][\"post\"][\"requestBody\"][\"content\"][\"application/json\"];\ntype ApiRenewSandboxExpirationOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}/renew-expiration\"][\"post\"][\"responses\"][200][\"content\"][\"application/json\"];\ntype ApiEndpointOk =\n LifecyclePaths[\"/sandboxes/{sandboxId}/endpoints/{port}\"][\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction encodeMetadataFilter(metadata: Record<string, string>): string {\n // The Lifecycle API expects a single `metadata` query parameter whose value is `k=v&k2=v2`.\n // The query serializer will URL-encode the value (e.g. `=` -> %3D and `&` -> %26).\n const parts: string[] = [];\n for (const [k, v] of Object.entries(metadata)) {\n parts.push(`${k}=${v}`);\n }\n return parts.join(\"&\");\n}\n\nexport class SandboxesAdapter implements Sandboxes {\n constructor(private readonly client: LifecycleClient) {}\n\n private parseIsoDate(field: string, v: unknown): Date {\n if (typeof v !== \"string\" || !v) {\n throw new Error(`Invalid ${field}: expected ISO string, got ${typeof v}`);\n }\n const d = new Date(v);\n if (Number.isNaN(d.getTime())) {\n throw new Error(`Invalid ${field}: ${v}`);\n }\n return d;\n }\n\n private mapSandboxInfo(raw: ApiGetSandboxOk): SandboxInfo {\n return {\n ...(raw ?? {}),\n createdAt: this.parseIsoDate(\"createdAt\", raw?.createdAt),\n expiresAt: this.parseIsoDate(\"expiresAt\", raw?.expiresAt),\n } as SandboxInfo;\n }\n\n async createSandbox(req: CreateSandboxRequest): Promise<CreateSandboxResponse> {\n // Make the OpenAPI contract explicit so backend schema changes surface quickly.\n const body: ApiCreateSandboxRequest = req as unknown as ApiCreateSandboxRequest;\n const { data, error, response } = await this.client.POST(\"/sandboxes\", {\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Create sandbox failed\");\n const raw = data as ApiCreateSandboxOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Create sandbox failed: unexpected response shape\");\n }\n return {\n ...(raw ?? {}),\n createdAt: this.parseIsoDate(\"createdAt\", raw?.createdAt),\n expiresAt: this.parseIsoDate(\"expiresAt\", raw?.expiresAt),\n } as CreateSandboxResponse;\n }\n\n async getSandbox(sandboxId: SandboxId): Promise<SandboxInfo> {\n const { data, error, response } = await this.client.GET(\"/sandboxes/{sandboxId}\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get sandbox failed\");\n const ok = data as ApiGetSandboxOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get sandbox failed: unexpected response shape\");\n }\n return this.mapSandboxInfo(ok);\n }\n\n async listSandboxes(params: ListSandboxesParams = {}): Promise<ListSandboxesResponse> {\n const query: Record<string, string | number | boolean | undefined | null | (string | number)[]> = {};\n if (params.states?.length) query.state = params.states;\n if (params.metadata && Object.keys(params.metadata).length) {\n query.metadata = encodeMetadataFilter(params.metadata);\n }\n if (params.page != null) query.page = params.page;\n if (params.pageSize != null) query.pageSize = params.pageSize;\n\n const { data, error, response } = await this.client.GET(\"/sandboxes\", {\n params: { query },\n });\n throwOnOpenApiFetchError({ error, response }, \"List sandboxes failed\");\n const raw = data as ApiListSandboxesOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"List sandboxes failed: unexpected response shape\");\n }\n const itemsRaw = raw.items;\n if (!Array.isArray(itemsRaw)) throw new Error(\"List sandboxes failed: unexpected items shape\");\n return {\n ...(raw ?? {}),\n items: itemsRaw.map((x) => this.mapSandboxInfo(x)),\n } as ListSandboxesResponse;\n }\n\n async deleteSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.DELETE(\"/sandboxes/{sandboxId}\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Delete sandbox failed\");\n }\n\n async pauseSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/pause\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Pause sandbox failed\");\n }\n\n async resumeSandbox(sandboxId: SandboxId): Promise<void> {\n const { error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/resume\", {\n params: { path: { sandboxId } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Resume sandbox failed\");\n }\n\n async renewSandboxExpiration(\n sandboxId: SandboxId,\n req: RenewSandboxExpirationRequest,\n ): Promise<RenewSandboxExpirationResponse> {\n const body: ApiRenewSandboxExpirationRequest = req as unknown as ApiRenewSandboxExpirationRequest;\n const { data, error, response } = await this.client.POST(\"/sandboxes/{sandboxId}/renew-expiration\", {\n params: { path: { sandboxId } },\n body,\n });\n throwOnOpenApiFetchError({ error, response }, \"Renew sandbox expiration failed\");\n const raw = data as ApiRenewSandboxExpirationOk | undefined;\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Renew sandbox expiration failed: unexpected response shape\");\n }\n return {\n ...(raw ?? {}),\n expiresAt: raw?.expiresAt ? this.parseIsoDate(\"expiresAt\", raw.expiresAt) : undefined,\n } as RenewSandboxExpirationResponse;\n }\n\n async getSandboxEndpoint(sandboxId: SandboxId, port: number): Promise<Endpoint> {\n const { data, error, response } = await this.client.GET(\"/sandboxes/{sandboxId}/endpoints/{port}\", {\n params: { path: { sandboxId, port } },\n });\n throwOnOpenApiFetchError({ error, response }, \"Get sandbox endpoint failed\");\n const ok = data as ApiEndpointOk | undefined;\n if (!ok || typeof ok !== \"object\") {\n throw new Error(\"Get sandbox endpoint failed: unexpected response shape\");\n }\n return ok as unknown as Endpoint;\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createExecdClient } from \"../openapi/execdClient.js\";\nimport { createLifecycleClient } from \"../openapi/lifecycleClient.js\";\n\nimport { CommandsAdapter } from \"../adapters/commandsAdapter.js\";\nimport { FilesystemAdapter } from \"../adapters/filesystemAdapter.js\";\nimport { HealthAdapter } from \"../adapters/healthAdapter.js\";\nimport { MetricsAdapter } from \"../adapters/metricsAdapter.js\";\nimport { SandboxesAdapter } from \"../adapters/sandboxesAdapter.js\";\n\nimport type { AdapterFactory, CreateExecdStackOptions, CreateLifecycleStackOptions, ExecdStack, LifecycleStack } from \"./adapterFactory.js\";\n\nexport class DefaultAdapterFactory implements AdapterFactory {\n createLifecycleStack(opts: CreateLifecycleStackOptions): LifecycleStack {\n const lifecycleClient = createLifecycleClient({\n baseUrl: opts.lifecycleBaseUrl,\n apiKey: opts.connectionConfig.apiKey,\n headers: opts.connectionConfig.headers,\n fetch: opts.connectionConfig.fetch,\n });\n const sandboxes = new SandboxesAdapter(lifecycleClient);\n return { sandboxes };\n }\n\n createExecdStack(opts: CreateExecdStackOptions): ExecdStack {\n const execdClient = createExecdClient({\n baseUrl: opts.execdBaseUrl,\n headers: opts.connectionConfig.headers,\n fetch: opts.connectionConfig.fetch,\n });\n\n const health = new HealthAdapter(execdClient);\n const metrics = new MetricsAdapter(execdClient);\n const files = new FilesystemAdapter(execdClient, {\n baseUrl: opts.execdBaseUrl,\n fetch: opts.connectionConfig.fetch,\n headers: opts.connectionConfig.headers,\n });\n const commands = new CommandsAdapter(execdClient, {\n baseUrl: opts.execdBaseUrl,\n fetch: opts.connectionConfig.sseFetch,\n headers: opts.connectionConfig.headers,\n });\n\n return {\n commands,\n files,\n health,\n metrics,\n };\n }\n}\n\nexport function createDefaultAdapterFactory(): AdapterFactory {\n return new DefaultAdapterFactory();\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const DEFAULT_EXECD_PORT = 44772;\n\nexport const DEFAULT_ENTRYPOINT: string[] = [\"tail\", \"-f\", \"/dev/null\"];\n\nexport const DEFAULT_RESOURCE_LIMITS: Record<string, string> = {\n cpu: \"1\",\n memory: \"2Gi\",\n};\n\nexport const DEFAULT_TIMEOUT_SECONDS = 600;\nexport const DEFAULT_READY_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS = 200;\n\nexport const DEFAULT_REQUEST_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_USER_AGENT = \"OpenSandbox-JS-SDK/0.1.1\";","// Copyright 2026 Alibaba Group Holding Ltd.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {DEFAULT_USER_AGENT} from \"../core/constants.js\";\n\nexport type ConnectionProtocol = \"http\" | \"https\";\n\n/**\n * Options for {@link ConnectionConfig}.\n *\n * Most users only need `domain`, `protocol`, and `apiKey`.\n */\nexport interface ConnectionConfigOptions {\n /**\n * API server domain (host[:port]) without scheme.\n * Examples:\n * - \"localhost:8080\"\n * - \"api.opensandbox.io\"\n *\n * You may also pass a full URL (e.g. \"http://localhost:8080\" or \"https://api.example.com\").\n * If the URL includes a path, it will be preserved and `/v1` will be appended automatically.\n */\n domain?: string;\n protocol?: ConnectionProtocol;\n apiKey?: string;\n headers?: Record<string, string>;\n\n /**\n * Request timeout applied to all SDK HTTP calls (best-effort; wraps fetch).\n * Defaults to 30 seconds.\n */\n requestTimeoutSeconds?: number;\n /**\n * Enable basic debug logging for HTTP requests (best-effort).\n */\n debug?: boolean;\n}\n\nfunction isNodeRuntime(): boolean {\n const p = (globalThis as any)?.process;\n return !!p?.versions?.node;\n}\n\nfunction redactHeaders(\n headers: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = { ...headers };\n for (const k of Object.keys(out)) {\n if (k.toLowerCase() === \"open-sandbox-api-key\") out[k] = \"***\";\n }\n return out;\n}\n\nfunction readEnv(name: string): string | undefined {\n const env = (globalThis as any)?.process?.env;\n const v = env?.[name];\n return typeof v === \"string\" && v.length ? v : undefined;\n}\n\nfunction stripTrailingSlashes(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\nfunction stripV1Suffix(s: string): string {\n const trimmed = stripTrailingSlashes(s);\n return trimmed.endsWith(\"/v1\") ? trimmed.slice(0, -3) : trimmed;\n}\n\nconst DEFAULT_KEEPALIVE_TIMEOUT_MS = 30_000;\n\nfunction normalizeDomainBase(input: string): {\n protocol?: ConnectionProtocol;\n domainBase: string;\n} {\n // Accept a full URL and preserve its path prefix (if any).\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n const u = new URL(input);\n const proto = u.protocol === \"https:\" ? \"https\" : \"http\";\n // Keep origin + pathname, drop query/hash.\n const base = `${u.origin}${u.pathname}`;\n return { protocol: proto, domainBase: stripV1Suffix(base) };\n }\n\n // No scheme: treat as \"host[:port]\" or \"host[:port]/prefix\" and normalize trailing \"/v1\" or \"/\".\n return { domainBase: stripV1Suffix(input) };\n}\n\nfunction createNodeFetch(): {\n fetch: typeof fetch;\n close: () => Promise<void>;\n} {\n if (!isNodeRuntime()) {\n return {\n fetch,\n close: async () => {\n // Browser fetch has no pooled dispatcher to close.\n },\n };\n }\n\n const baseFetch = fetch;\n let dispatcher: unknown | undefined;\n let dispatcherPromise: Promise<unknown> | null = null;\n\n const nodeFetch: typeof fetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n dispatcherPromise ??= (async () => {\n try {\n const mod = await import(\"undici\");\n const Agent = (mod as { Agent?: new (...args: any[]) => unknown }).Agent;\n if (!Agent) {\n return undefined;\n }\n dispatcher = new Agent({\n keepAliveTimeout: DEFAULT_KEEPALIVE_TIMEOUT_MS,\n keepAliveMaxTimeout: DEFAULT_KEEPALIVE_TIMEOUT_MS,\n });\n return dispatcher;\n } catch {\n return undefined;\n }\n })();\n\n if (dispatcherPromise) {\n await dispatcherPromise;\n }\n\n if (dispatcher) {\n const mergedInit = { ...(init ?? {}), dispatcher } as RequestInit & {\n dispatcher?: unknown;\n };\n return baseFetch(input, mergedInit as RequestInit);\n }\n\n return baseFetch(input, init);\n };\n\n return {\n fetch: nodeFetch,\n close: async () => {\n if (dispatcherPromise) {\n await dispatcherPromise.catch(() => undefined);\n }\n if (\n dispatcher &&\n typeof dispatcher === \"object\" &&\n typeof (dispatcher as any).close === \"function\"\n ) {\n try {\n await (dispatcher as any).close();\n } catch {\n // swallow close errors\n }\n }\n },\n };\n}\n\nfunction createTimedFetch(opts: {\n baseFetch: typeof fetch;\n timeoutSeconds: number;\n debug: boolean;\n defaultHeaders?: Record<string, string>;\n label: string;\n}): typeof fetch {\n const baseFetch = opts.baseFetch;\n const timeoutSeconds = opts.timeoutSeconds;\n const debug = opts.debug;\n const defaultHeaders = opts.defaultHeaders ?? {};\n const label = opts.label;\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = init?.method ?? \"GET\";\n const url =\n typeof input === \"string\"\n ? input\n : (input as any)?.toString?.() ?? String(input);\n\n const ac = new AbortController();\n const timeoutMs = Math.floor(timeoutSeconds * 1000);\n const t =\n Number.isFinite(timeoutMs) && timeoutMs > 0\n ? setTimeout(\n () =>\n ac.abort(\n new Error(\n `[${label}] Request timed out (timeoutSeconds=${timeoutSeconds})`\n )\n ),\n timeoutMs\n )\n : undefined;\n\n const onAbort = () =>\n ac.abort((init?.signal as any)?.reason ?? new Error(\"Aborted\"));\n if (init?.signal) {\n if (init.signal.aborted) onAbort();\n else\n init.signal.addEventListener(\"abort\", onAbort, { once: true } as any);\n }\n\n const mergedInit: RequestInit = {\n ...init,\n signal: ac.signal,\n };\n\n if (debug) {\n const mergedHeaders = {\n ...defaultHeaders,\n ...((init?.headers ?? {}) as any),\n };\n // eslint-disable-next-line no-console\n console.log(\n `[opensandbox:${label}] ->`,\n method,\n url,\n redactHeaders(mergedHeaders)\n );\n }\n\n try {\n const res = await baseFetch(input, mergedInit);\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[opensandbox:${label}] <-`, method, url, res.status);\n }\n return res;\n } finally {\n if (t) clearTimeout(t);\n if (init?.signal)\n init.signal.removeEventListener(\"abort\", onAbort as any);\n }\n };\n}\n\nexport class ConnectionConfig {\n readonly protocol: ConnectionProtocol;\n readonly domain: string;\n readonly apiKey?: string;\n readonly headers: Record<string, string>;\n private _fetch: typeof fetch | null;\n private _sseFetch: typeof fetch | null;\n readonly requestTimeoutSeconds: number;\n readonly debug: boolean;\n readonly userAgent: string = DEFAULT_USER_AGENT;\n private _closeTransport: () => Promise<void>;\n private _closePromise: Promise<void> | null = null;\n private _transportInitialized = false;\n\n /**\n * Create a connection configuration.\n *\n * Environment variables (optional):\n * - `OPEN_SANDBOX_DOMAIN` (default: `localhost:8080`)\n * - `OPEN_SANDBOX_API_KEY`\n */\n constructor(opts: ConnectionConfigOptions = {}) {\n const envDomain = readEnv(\"OPEN_SANDBOX_DOMAIN\");\n const envApiKey = readEnv(\"OPEN_SANDBOX_API_KEY\");\n\n const rawDomain = opts.domain ?? envDomain ?? \"localhost:8080\";\n const normalized = normalizeDomainBase(rawDomain);\n\n // If the domain includes a scheme, it overrides `protocol`.\n this.protocol = normalized.protocol ?? opts.protocol ?? \"http\";\n this.domain = normalized.domainBase;\n this.apiKey = opts.apiKey ?? envApiKey;\n this.requestTimeoutSeconds =\n typeof opts.requestTimeoutSeconds === \"number\"\n ? opts.requestTimeoutSeconds\n : 30;\n this.debug = !!opts.debug;\n\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n // Attach API key via header unless the user already provided one.\n if (this.apiKey && !headers[\"OPEN-SANDBOX-API-KEY\"]) {\n headers[\"OPEN-SANDBOX-API-KEY\"] = this.apiKey;\n }\n // Best-effort user-agent (Node only).\n if (\n isNodeRuntime() &&\n this.userAgent &&\n !headers[\"user-agent\"] &&\n !headers[\"User-Agent\"]\n ) {\n headers[\"user-agent\"] = this.userAgent;\n }\n this.headers = headers;\n this._fetch = null;\n this._sseFetch = null;\n this._closeTransport = async () => {\n // Init with empty close call\n };\n this._transportInitialized = false;\n }\n\n get fetch(): typeof fetch {\n return this._fetch ?? fetch;\n }\n\n get sseFetch(): typeof fetch {\n return this._sseFetch ?? fetch;\n }\n\n getBaseUrl(): string {\n // If `domain` already contains a scheme, treat it as a full base URL prefix.\n if (\n this.domain.startsWith(\"http://\") ||\n this.domain.startsWith(\"https://\")\n ) {\n return `${stripV1Suffix(this.domain)}/v1`;\n }\n return `${this.protocol}://${stripV1Suffix(this.domain)}/v1`;\n }\n\n private initializeTransport(): void {\n if (this._transportInitialized) return;\n\n const { fetch: baseFetch, close } = createNodeFetch();\n this._fetch = createTimedFetch({\n baseFetch,\n timeoutSeconds: this.requestTimeoutSeconds,\n debug: this.debug,\n defaultHeaders: this.headers,\n label: \"http\",\n });\n this._sseFetch = createTimedFetch({\n baseFetch,\n timeoutSeconds: 0,\n debug: this.debug,\n defaultHeaders: this.headers,\n label: \"sse\",\n });\n this._closeTransport = close;\n this._transportInitialized = true;\n }\n /**\n * Ensure this configuration has transport helpers (fetch/SSE) allocated.\n *\n * On Node.js this creates a dedicated `undici` dispatcher; on browsers it\n * simply reuses the global fetch. Returns either `this` or a cloned config\n * with the transport initialized.\n */\n withTransportIfMissing(): ConnectionConfig {\n if (this._transportInitialized) {\n return this;\n }\n\n const clone = new ConnectionConfig({\n domain: this.domain,\n protocol: this.protocol,\n apiKey: this.apiKey,\n headers: { ...this.headers },\n requestTimeoutSeconds: this.requestTimeoutSeconds,\n debug: this.debug,\n });\n clone.initializeTransport();\n return clone;\n }\n\n /**\n * Close the Node.js agent owned by this configuration.\n */\n async closeTransport(): Promise<void> {\n if (!this._transportInitialized) return;\n this._closePromise ??= this._closeTransport();\n await this._closePromise;\n }\n}\n","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ConnectionConfig, type ConnectionConfigOptions } from \"./config/connection.js\";\nimport { createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\nimport type { AdapterFactory } from \"./factory/adapterFactory.js\";\n\nimport type { ListSandboxesResponse, SandboxId, SandboxInfo } from \"./models/sandboxes.js\";\nimport type { Sandboxes } from \"./services/sandboxes.js\";\n\nexport interface SandboxManagerOptions {\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n adapterFactory?: AdapterFactory;\n}\n\nexport interface SandboxFilter {\n states?: string[];\n metadata?: Record<string, string>;\n page?: number;\n pageSize?: number;\n}\n\n/**\n * Administrative interface for managing sandboxes (list/get/pause/resume/kill/renew).\n *\n * For interacting *inside* a sandbox, use {@link Sandbox}.\n */\nexport class SandboxManager {\n private readonly sandboxes: Sandboxes;\n private readonly connectionConfig: ConnectionConfig;\n\n private constructor(opts: { sandboxes: Sandboxes; connectionConfig: ConnectionConfig }) {\n this.sandboxes = opts.sandboxes;\n this.connectionConfig = opts.connectionConfig;\n }\n\n static create(opts: SandboxManagerOptions = {}): SandboxManager {\n const baseConnectionConfig = opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n void connectionConfig.closeTransport().catch(() => undefined);\n throw err;\n }\n return new SandboxManager({ sandboxes, connectionConfig });\n }\n\n listSandboxInfos(filter: SandboxFilter = {}): Promise<ListSandboxesResponse> {\n return this.sandboxes.listSandboxes({\n states: filter.states,\n metadata: filter.metadata,\n page: filter.page,\n pageSize: filter.pageSize,\n });\n }\n\n getSandboxInfo(sandboxId: SandboxId): Promise<SandboxInfo> {\n return this.sandboxes.getSandbox(sandboxId);\n }\n\n killSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.deleteSandbox(sandboxId);\n }\n\n pauseSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.pauseSandbox(sandboxId);\n }\n\n resumeSandbox(sandboxId: SandboxId): Promise<void> {\n return this.sandboxes.resumeSandbox(sandboxId);\n }\n\n /**\n * Renew expiration by setting expiresAt to now + timeoutSeconds.\n */\n async renewSandbox(sandboxId: SandboxId, timeoutSeconds: number): Promise<void> {\n const expiresAt = new Date(Date.now() + timeoutSeconds * 1000).toISOString();\n await this.sandboxes.renewSandboxExpiration(sandboxId, { expiresAt });\n }\n\n /**\n * Release the HTTP agent resources allocated for this manager instance.\n *\n * Each manager clone owns a scoped `ConnectionConfig` clone.\n *\n * This mirrors the Python SDK's default transport lifecycle.\n */\n async close(): Promise<void> {\n await this.connectionConfig.closeTransport();\n }\n}","// Copyright 2026 Alibaba Group Holding Ltd.\n// \n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n// \n// http://www.apache.org/licenses/LICENSE-2.0\n// \n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n DEFAULT_ENTRYPOINT,\n DEFAULT_EXECD_PORT,\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n DEFAULT_READY_TIMEOUT_SECONDS,\n DEFAULT_RESOURCE_LIMITS,\n DEFAULT_TIMEOUT_SECONDS,\n} from \"./core/constants.js\";\nimport { ConnectionConfig, type ConnectionConfigOptions } from \"./config/connection.js\";\nimport type { SandboxFiles } from \"./services/filesystem.js\";\nimport { createDefaultAdapterFactory } from \"./factory/defaultAdapterFactory.js\";\nimport type { AdapterFactory } from \"./factory/adapterFactory.js\";\n\nimport type { Sandboxes } from \"./services/sandboxes.js\";\nimport type { ExecdCommands } from \"./services/execdCommands.js\";\nimport type { ExecdHealth } from \"./services/execdHealth.js\";\nimport type { ExecdMetrics } from \"./services/execdMetrics.js\";\nimport type {\n CreateSandboxRequest,\n Endpoint,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n} from \"./models/sandboxes.js\";\nimport { SandboxReadyTimeoutException } from \"./core/exceptions.js\";\n\nexport interface SandboxCreateOptions {\n /**\n * Connection configuration for calling the OpenSandbox Lifecycle API and the sandbox's execd API.\n */\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n /**\n * Advanced override: inject a custom adapter factory (custom transports, dependency injection).\n */\n adapterFactory?: AdapterFactory;\n\n /**\n * Container image uri, e.g. `python:3.11`\n */\n image:\n | string\n | { uri: string; auth?: { username: string; password: string } };\n\n entrypoint?: string[];\n env?: Record<string, string>;\n metadata?: Record<string, string>;\n extensions?: Record<string, string>;\n\n /**\n * Resource limits applied to the sandbox container.\n *\n * This is forwarded to the Lifecycle API as `resourceLimits`.\n */\n resource?: Record<string, string>;\n /**\n * Sandbox timeout in seconds.\n */\n timeoutSeconds?: number;\n\n /**\n * Skip readiness checks during create/connect.\n *\n * When true, the SDK will not wait for lifecycle state `Running` or perform the health check.\n * The returned sandbox instance may not be ready yet.\n */\n skipHealthCheck?: boolean;\n /**\n * Optional custom readiness check used by {@link Sandbox.waitUntilReady}.\n *\n * If provided, the SDK will call this function during readiness checks instead of\n * using the default `execd` ping check.\n */\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n}\n\nexport interface SandboxConnectOptions {\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n adapterFactory?: AdapterFactory;\n sandboxId: SandboxId;\n\n skipHealthCheck?: boolean;\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction toImageSpec(\n image: SandboxCreateOptions[\"image\"]\n): CreateSandboxRequest[\"image\"] {\n if (typeof image === \"string\") return { uri: image };\n return { uri: image.uri, auth: image.auth };\n}\n\nexport class Sandbox {\n readonly id: SandboxId;\n readonly connectionConfig: ConnectionConfig;\n\n /**\n * Lifecycle (sandbox management) service.\n */\n readonly sandboxes: Sandboxes;\n\n /**\n * Execd services.\n */\n readonly commands: ExecdCommands;\n /**\n * High-level filesystem facade (JS-friendly).\n */\n readonly files: SandboxFiles;\n readonly health: ExecdHealth;\n readonly metrics: ExecdMetrics;\n\n /**\n * Internal state kept out of the public instance shape.\n *\n * This avoids nominal typing issues when multiple copies of the SDK exist in a dependency graph.\n */\n private static readonly _priv = new WeakMap<\n Sandbox,\n {\n adapterFactory: AdapterFactory;\n lifecycleBaseUrl: string;\n execdBaseUrl: string;\n }\n >();\n\n private constructor(opts: {\n id: SandboxId;\n connectionConfig: ConnectionConfig;\n adapterFactory: AdapterFactory;\n lifecycleBaseUrl: string;\n execdBaseUrl: string;\n sandboxes: Sandboxes;\n commands: ExecdCommands;\n files: SandboxFiles;\n health: ExecdHealth;\n metrics: ExecdMetrics;\n }) {\n this.id = opts.id;\n this.connectionConfig = opts.connectionConfig;\n Sandbox._priv.set(this, {\n adapterFactory: opts.adapterFactory,\n lifecycleBaseUrl: opts.lifecycleBaseUrl,\n execdBaseUrl: opts.execdBaseUrl,\n });\n\n this.sandboxes = opts.sandboxes;\n this.commands = opts.commands;\n this.files = opts.files;\n this.health = opts.health;\n this.metrics = opts.metrics;\n }\n\n static async create(opts: SandboxCreateOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n\n const req: CreateSandboxRequest = {\n image: toImageSpec(opts.image),\n entrypoint: opts.entrypoint ?? DEFAULT_ENTRYPOINT,\n timeout: Math.floor(opts.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS),\n resourceLimits: opts.resource ?? DEFAULT_RESOURCE_LIMITS,\n env: opts.env ?? {},\n metadata: opts.metadata ?? {},\n extensions: opts.extensions ?? {},\n };\n\n let sandboxId: SandboxId | undefined;\n try {\n const created = await sandboxes.createSandbox(req);\n sandboxId = created.id as SandboxId;\n\n const endpoint = await sandboxes.getSandboxEndpoint(\n sandboxId,\n DEFAULT_EXECD_PORT\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n });\n\n const sbx = new Sandbox({\n id: sandboxId,\n connectionConfig,\n adapterFactory,\n lifecycleBaseUrl,\n execdBaseUrl,\n sandboxes,\n commands,\n files,\n health,\n metrics,\n });\n\n if (!(opts.skipHealthCheck ?? false)) {\n await sbx.waitUntilReady({\n readyTimeoutSeconds:\n opts.readyTimeoutSeconds ?? DEFAULT_READY_TIMEOUT_SECONDS,\n pollingIntervalMillis:\n opts.healthCheckPollingInterval ??\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n healthCheck: opts.healthCheck,\n });\n }\n\n return sbx;\n } catch (err) {\n if (sandboxId) {\n try {\n await sandboxes.deleteSandbox(sandboxId);\n } catch {\n // Ignore cleanup failure; surface original error.\n }\n }\n await connectionConfig.closeTransport();\n throw err;\n }\n }\n\n static async connect(opts: SandboxConnectOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const connectionConfig = baseConnectionConfig.withTransportIfMissing();\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n const lifecycleBaseUrl = connectionConfig.getBaseUrl();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n\n try {\n const endpoint = await sandboxes.getSandboxEndpoint(\n opts.sandboxId,\n DEFAULT_EXECD_PORT\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n });\n\n const sbx = new Sandbox({\n id: opts.sandboxId,\n connectionConfig,\n adapterFactory,\n lifecycleBaseUrl,\n execdBaseUrl,\n sandboxes,\n commands,\n files,\n health,\n metrics,\n });\n\n if (!(opts.skipHealthCheck ?? false)) {\n await sbx.waitUntilReady({\n readyTimeoutSeconds:\n opts.readyTimeoutSeconds ?? DEFAULT_READY_TIMEOUT_SECONDS,\n pollingIntervalMillis:\n opts.healthCheckPollingInterval ??\n DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS,\n healthCheck: opts.healthCheck,\n });\n }\n\n return sbx;\n } catch (err) {\n await connectionConfig.closeTransport();\n throw err;\n }\n }\n\n async getInfo(): Promise<SandboxInfo> {\n return await this.sandboxes.getSandbox(this.id);\n }\n\n async isHealthy(): Promise<boolean> {\n try {\n return await this.health.ping();\n } catch {\n return false;\n }\n }\n\n async getMetrics() {\n return await this.metrics.getMetrics();\n }\n\n async pause(): Promise<void> {\n await this.sandboxes.pauseSandbox(this.id);\n }\n\n /**\n * Resume a paused sandbox and return a fresh, connected Sandbox instance.\n *\n * After resume, the execd endpoint may change, so this method returns a new\n * {@link Sandbox} instance with a refreshed execd base URL.\n */\n async resume(\n opts: {\n skipHealthCheck?: boolean;\n readyTimeoutSeconds?: number;\n healthCheckPollingInterval?: number;\n } = {}\n ): Promise<Sandbox> {\n await this.sandboxes.resumeSandbox(this.id);\n return await Sandbox.connect({\n sandboxId: this.id,\n connectionConfig: this.connectionConfig,\n adapterFactory: Sandbox._priv.get(this)!.adapterFactory,\n skipHealthCheck: opts.skipHealthCheck ?? false,\n readyTimeoutSeconds: opts.readyTimeoutSeconds,\n healthCheckPollingInterval: opts.healthCheckPollingInterval,\n });\n }\n\n /**\n * Resume a paused sandbox by id, then connect to its execd endpoint.\n */\n static async resume(opts: SandboxConnectOptions): Promise<Sandbox> {\n const baseConnectionConfig =\n opts.connectionConfig instanceof ConnectionConfig\n ? opts.connectionConfig\n : new ConnectionConfig(opts.connectionConfig);\n const adapterFactory = opts.adapterFactory ?? createDefaultAdapterFactory();\n const resumeConnectionConfig = baseConnectionConfig.withTransportIfMissing();\n const lifecycleBaseUrl = resumeConnectionConfig.getBaseUrl();\n\n let sandboxes: Sandboxes;\n try {\n sandboxes = adapterFactory.createLifecycleStack({\n connectionConfig: resumeConnectionConfig,\n lifecycleBaseUrl,\n }).sandboxes;\n await sandboxes.resumeSandbox(opts.sandboxId);\n } catch (err) {\n await resumeConnectionConfig.closeTransport();\n throw err;\n }\n\n await resumeConnectionConfig.closeTransport();\n return await Sandbox.connect({ ...opts, connectionConfig: baseConnectionConfig, adapterFactory });\n }\n\n async kill(): Promise<void> {\n await this.sandboxes.deleteSandbox(this.id);\n }\n\n /**\n * Release any client-side resources (e.g. Node.js HTTP agents) owned by this Sandbox instance.\n */\n async close(): Promise<void> {\n await this.connectionConfig.closeTransport();\n }\n\n /**\n * Renew expiration by setting expiresAt to now + timeoutSeconds.\n */\n async renew(timeoutSeconds: number): Promise<RenewSandboxExpirationResponse> {\n const expiresAt = new Date(\n Date.now() + timeoutSeconds * 1000\n ).toISOString();\n return await this.sandboxes.renewSandboxExpiration(this.id, { expiresAt });\n }\n\n /**\n * Get sandbox endpoint for a port (STRICT: no scheme), e.g. \"localhost:44772\" or \"domain/route/.../44772\".\n */\n async getEndpoint(port: number): Promise<Endpoint> {\n return await this.sandboxes.getSandboxEndpoint(this.id, port);\n }\n\n /**\n * Get absolute endpoint URL with scheme (convenience for HTTP clients).\n */\n async getEndpointUrl(port: number): Promise<string> {\n const ep = await this.getEndpoint(port);\n return `${this.connectionConfig.protocol}://${ep.endpoint}`;\n }\n\n async waitUntilReady(opts: {\n readyTimeoutSeconds: number;\n pollingIntervalMillis: number;\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n }): Promise<void> {\n const deadline = Date.now() + opts.readyTimeoutSeconds * 1000;\n\n // Wait until execd becomes reachable and passes health check.\n while (true) {\n if (Date.now() > deadline) {\n throw new SandboxReadyTimeoutException({\n message: `Sandbox not ready: timed out waiting for health check (timeoutSeconds=${opts.readyTimeoutSeconds})`,\n });\n }\n try {\n if (opts.healthCheck) {\n const ok = await opts.healthCheck(this);\n if (ok) return;\n } else {\n const ok = await this.health.ping();\n if (ok) return;\n }\n } catch {\n // ignore and retry\n }\n await sleep(opts.pollingIntervalMillis);\n }\n }\n}"],"mappings":"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","names":["createClient","import_openapi_fetch","createClient","joinUrl","res","isNodeRuntime"]}
|