@alibaba-group/opensandbox 0.1.3-dev1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  SandboxesAdapter,
15
15
  createExecdClient,
16
16
  createLifecycleClient
17
- } from "./chunk-4EF4ODU2.js";
17
+ } from "./chunk-OYTPXLWE.js";
18
18
 
19
19
  // src/factory/defaultAdapterFactory.ts
20
20
  var DefaultAdapterFactory = class {
@@ -29,9 +29,13 @@ var DefaultAdapterFactory = class {
29
29
  return { sandboxes };
30
30
  }
31
31
  createExecdStack(opts) {
32
+ const headers = {
33
+ ...opts.connectionConfig.headers ?? {},
34
+ ...opts.endpointHeaders ?? {}
35
+ };
32
36
  const execdClient = createExecdClient({
33
37
  baseUrl: opts.execdBaseUrl,
34
- headers: opts.connectionConfig.headers,
38
+ headers,
35
39
  fetch: opts.connectionConfig.fetch
36
40
  });
37
41
  const health = new HealthAdapter(execdClient);
@@ -39,12 +43,12 @@ var DefaultAdapterFactory = class {
39
43
  const files = new FilesystemAdapter(execdClient, {
40
44
  baseUrl: opts.execdBaseUrl,
41
45
  fetch: opts.connectionConfig.fetch,
42
- headers: opts.connectionConfig.headers
46
+ headers
43
47
  });
44
48
  const commands = new CommandsAdapter(execdClient, {
45
49
  baseUrl: opts.execdBaseUrl,
46
50
  fetch: opts.connectionConfig.sseFetch,
47
- headers: opts.connectionConfig.headers
51
+ headers
48
52
  });
49
53
  return {
50
54
  commands,
@@ -69,7 +73,7 @@ var DEFAULT_TIMEOUT_SECONDS = 600;
69
73
  var DEFAULT_READY_TIMEOUT_SECONDS = 30;
70
74
  var DEFAULT_HEALTH_CHECK_POLLING_INTERVAL_MILLIS = 200;
71
75
  var DEFAULT_REQUEST_TIMEOUT_SECONDS = 30;
72
- var DEFAULT_USER_AGENT = "OpenSandbox-JS-SDK/0.1.1";
76
+ var DEFAULT_USER_AGENT = "OpenSandbox-JS-SDK/0.1.4";
73
77
 
74
78
  // src/config/connection.ts
75
79
  function isNodeRuntime() {
@@ -221,6 +225,10 @@ var ConnectionConfig = class _ConnectionConfig {
221
225
  requestTimeoutSeconds;
222
226
  debug;
223
227
  userAgent = DEFAULT_USER_AGENT;
228
+ /**
229
+ * Use sandbox server as proxy for endpoint requests (default false).
230
+ */
231
+ useServerProxy;
224
232
  _closeTransport;
225
233
  _closePromise = null;
226
234
  _transportInitialized = false;
@@ -241,6 +249,7 @@ var ConnectionConfig = class _ConnectionConfig {
241
249
  this.apiKey = opts.apiKey ?? envApiKey;
242
250
  this.requestTimeoutSeconds = typeof opts.requestTimeoutSeconds === "number" ? opts.requestTimeoutSeconds : 30;
243
251
  this.debug = !!opts.debug;
252
+ this.useServerProxy = !!opts.useServerProxy;
244
253
  const headers = { ...opts.headers ?? {} };
245
254
  if (this.apiKey && !headers["OPEN-SANDBOX-API-KEY"]) {
246
255
  headers["OPEN-SANDBOX-API-KEY"] = this.apiKey;
@@ -304,7 +313,8 @@ var ConnectionConfig = class _ConnectionConfig {
304
313
  apiKey: this.apiKey,
305
314
  headers: { ...this.headers },
306
315
  requestTimeoutSeconds: this.requestTimeoutSeconds,
307
- debug: this.debug
316
+ debug: this.debug,
317
+ useServerProxy: this.useServerProxy
308
318
  });
309
319
  clone.initializeTransport();
310
320
  return clone;
@@ -443,6 +453,21 @@ var Sandbox = class _Sandbox {
443
453
  await connectionConfig.closeTransport();
444
454
  throw err;
445
455
  }
456
+ if (opts.volumes) {
457
+ for (const vol of opts.volumes) {
458
+ const backendsSpecified = [vol.host, vol.pvc].filter((b) => b !== void 0).length;
459
+ if (backendsSpecified === 0) {
460
+ throw new Error(
461
+ `Volume '${vol.name}' must specify exactly one backend (host, pvc), but none was provided.`
462
+ );
463
+ }
464
+ if (backendsSpecified > 1) {
465
+ throw new Error(
466
+ `Volume '${vol.name}' must specify exactly one backend (host, pvc), but multiple were provided.`
467
+ );
468
+ }
469
+ }
470
+ }
446
471
  const req = {
447
472
  image: toImageSpec(opts.image),
448
473
  entrypoint: opts.entrypoint ?? DEFAULT_ENTRYPOINT,
@@ -454,6 +479,7 @@ var Sandbox = class _Sandbox {
454
479
  ...opts.networkPolicy,
455
480
  defaultAction: opts.networkPolicy.defaultAction ?? "deny"
456
481
  } : void 0,
482
+ volumes: opts.volumes,
457
483
  extensions: opts.extensions ?? {}
458
484
  };
459
485
  let sandboxId;
@@ -462,12 +488,14 @@ var Sandbox = class _Sandbox {
462
488
  sandboxId = created.id;
463
489
  const endpoint = await sandboxes.getSandboxEndpoint(
464
490
  sandboxId,
465
- DEFAULT_EXECD_PORT
491
+ DEFAULT_EXECD_PORT,
492
+ connectionConfig.useServerProxy
466
493
  );
467
494
  const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;
468
495
  const { commands, files, health, metrics } = adapterFactory.createExecdStack({
469
496
  connectionConfig,
470
- execdBaseUrl
497
+ execdBaseUrl,
498
+ endpointHeaders: endpoint.headers
471
499
  });
472
500
  const sbx = new _Sandbox({
473
501
  id: sandboxId,
@@ -518,12 +546,14 @@ var Sandbox = class _Sandbox {
518
546
  try {
519
547
  const endpoint = await sandboxes.getSandboxEndpoint(
520
548
  opts.sandboxId,
521
- DEFAULT_EXECD_PORT
549
+ DEFAULT_EXECD_PORT,
550
+ connectionConfig.useServerProxy
522
551
  );
523
552
  const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;
524
553
  const { commands, files, health, metrics } = adapterFactory.createExecdStack({
525
554
  connectionConfig,
526
- execdBaseUrl
555
+ execdBaseUrl,
556
+ endpointHeaders: endpoint.headers
527
557
  });
528
558
  const sbx = new _Sandbox({
529
559
  id: opts.sandboxId,
@@ -627,7 +657,11 @@ var Sandbox = class _Sandbox {
627
657
  * Get sandbox endpoint for a port (STRICT: no scheme), e.g. "localhost:44772" or "domain/route/.../44772".
628
658
  */
629
659
  async getEndpoint(port) {
630
- return await this.sandboxes.getSandboxEndpoint(this.id, port);
660
+ return await this.sandboxes.getSandboxEndpoint(
661
+ this.id,
662
+ port,
663
+ this.connectionConfig.useServerProxy
664
+ );
631
665
  }
632
666
  /**
633
667
  * Get absolute endpoint URL with scheme (convenience for HTTP clients).
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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\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 /**\n * Connection configuration for calling the OpenSandbox Lifecycle 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\nexport interface SandboxFilter {\n /**\n * Filter by sandbox lifecycle states.\n */\n states?: string[];\n /**\n * Filter by metadata key-value pairs.\n */\n metadata?: Record<string, string>;\n /**\n * Pagination page number (1-indexed).\n */\n page?: number;\n /**\n * Number of items per page.\n */\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 NetworkPolicy,\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 /**\n * Entrypoint command for the sandbox (defaults to tail -f /dev/null).\n */\n entrypoint?: string[];\n /**\n * Environment variables to inject into the sandbox runtime.\n */\n env?: Record<string, string>;\n /**\n * Custom metadata tags (used for filtering/management).\n */\n metadata?: Record<string, string>;\n /**\n * Optional outbound network policy for the sandbox.\n * If provided without defaultAction, defaults to \"deny\".\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Opaque extension parameters passed through to the server as-is.\n */\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 /**\n * Connection configuration for calling the OpenSandbox APIs.\n */\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n /**\n * Advanced override: inject a custom adapter factory (custom transports, dependency injection).\n */\n adapterFactory?: AdapterFactory;\n /**\n * ID of the existing sandbox to connect to.\n */\n sandboxId: SandboxId;\n\n /**\n * Skip readiness checks after connecting.\n */\n skipHealthCheck?: boolean;\n /**\n * Optional custom readiness check used by {@link Sandbox.waitUntilReady}.\n */\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n /**\n * Max time to wait for readiness.\n */\n readyTimeoutSeconds?: number;\n /**\n * Polling interval for readiness checks (milliseconds).\n */\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 networkPolicy: opts.networkPolicy\n ? {\n ...opts.networkPolicy,\n defaultAction: opts.networkPolicy.defaultAction ?? \"deny\",\n }\n : undefined,\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":[]}
1
+ {"version":3,"sources":["../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\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 headers: Record<string, string> = {\n ...(opts.connectionConfig.headers ?? {}),\n ...(opts.endpointHeaders ?? {}),\n };\n const execdClient = createExecdClient({\n baseUrl: opts.execdBaseUrl,\n 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,\n });\n const commands = new CommandsAdapter(execdClient, {\n baseUrl: opts.execdBaseUrl,\n fetch: opts.connectionConfig.sseFetch,\n 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.4\";","// 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 * Use sandbox server as proxy for process execd requests.\n * Useful when the client SDK cannot access the created sandbox directly.\n */\n useServerProxy?: 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 /**\n * Use sandbox server as proxy for endpoint requests (default false).\n */\n readonly useServerProxy: boolean;\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 this.useServerProxy = !!opts.useServerProxy;\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 useServerProxy: this.useServerProxy,\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 /**\n * Connection configuration for calling the OpenSandbox Lifecycle 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\nexport interface SandboxFilter {\n /**\n * Filter by sandbox lifecycle states.\n */\n states?: string[];\n /**\n * Filter by metadata key-value pairs.\n */\n metadata?: Record<string, string>;\n /**\n * Pagination page number (1-indexed).\n */\n page?: number;\n /**\n * Number of items per page.\n */\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 NetworkPolicy,\n RenewSandboxExpirationResponse,\n SandboxId,\n SandboxInfo,\n Volume,\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 /**\n * Entrypoint command for the sandbox (defaults to tail -f /dev/null).\n */\n entrypoint?: string[];\n /**\n * Environment variables to inject into the sandbox runtime.\n */\n env?: Record<string, string>;\n /**\n * Custom metadata tags (used for filtering/management).\n */\n metadata?: Record<string, string>;\n /**\n * Optional outbound network policy for the sandbox.\n * If provided without defaultAction, defaults to \"deny\".\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Optional list of volume mounts for persistent storage.\n * Each volume specifies a backend (host path or PVC) and mount configuration.\n */\n volumes?: Volume[];\n /**\n * Opaque extension parameters passed through to the server as-is.\n */\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 /**\n * Connection configuration for calling the OpenSandbox APIs.\n */\n connectionConfig?: ConnectionConfig | ConnectionConfigOptions;\n /**\n * Advanced override: inject a custom adapter factory (custom transports, dependency injection).\n */\n adapterFactory?: AdapterFactory;\n /**\n * ID of the existing sandbox to connect to.\n */\n sandboxId: SandboxId;\n\n /**\n * Skip readiness checks after connecting.\n */\n skipHealthCheck?: boolean;\n /**\n * Optional custom readiness check used by {@link Sandbox.waitUntilReady}.\n */\n healthCheck?: (sbx: Sandbox) => boolean | Promise<boolean>;\n /**\n * Max time to wait for readiness.\n */\n readyTimeoutSeconds?: number;\n /**\n * Polling interval for readiness checks (milliseconds).\n */\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 // Validate volumes: exactly one backend must be specified per volume\n if (opts.volumes) {\n for (const vol of opts.volumes) {\n const backendsSpecified = [vol.host, vol.pvc].filter((b) => b !== undefined).length;\n if (backendsSpecified === 0) {\n throw new Error(\n `Volume '${vol.name}' must specify exactly one backend (host, pvc), but none was provided.`\n );\n }\n if (backendsSpecified > 1) {\n throw new Error(\n `Volume '${vol.name}' must specify exactly one backend (host, pvc), but multiple were provided.`\n );\n }\n }\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 networkPolicy: opts.networkPolicy\n ? {\n ...opts.networkPolicy,\n defaultAction: opts.networkPolicy.defaultAction ?? \"deny\",\n }\n : undefined,\n volumes: opts.volumes,\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 connectionConfig.useServerProxy\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n endpointHeaders: endpoint.headers,\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 connectionConfig.useServerProxy\n );\n const execdBaseUrl = `${connectionConfig.protocol}://${endpoint.endpoint}`;\n const { commands, files, health, metrics } =\n adapterFactory.createExecdStack({\n connectionConfig,\n execdBaseUrl,\n endpointHeaders: endpoint.headers,\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(\n this.id,\n port,\n this.connectionConfig.useServerProxy\n );\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":[]}
@@ -1,5 +1,5 @@
1
1
  import { Client } from 'openapi-fetch';
2
- import { S as Sandboxes, m as CreateSandboxRequest, n as CreateSandboxResponse, d as SandboxId, e as SandboxInfo, u as ListSandboxesParams, L as ListSandboxesResponse, A as RenewSandboxExpirationRequest, R as RenewSandboxExpirationResponse, j as Endpoint, b as ExecdHealth, c as ExecdMetrics, i as SandboxMetrics, a as SandboxFiles, F as FileInfo, W as WriteEntry, J as SetPermissionEntry, v as MoveEntry, l as ContentReplaceEntry, H as SearchEntry, I as SearchFilesResponse, E as ExecdCommands, D as RunCommandOpts, h as ServerStreamEvent, g as ExecutionHandlers, k as CommandExecution } from './sandboxes-CLy12BN1.js';
2
+ import { S as Sandboxes, o as CreateSandboxRequest, p as CreateSandboxResponse, d as SandboxId, e as SandboxInfo, w as ListSandboxesParams, L as ListSandboxesResponse, G as RenewSandboxExpirationRequest, R as RenewSandboxExpirationResponse, j as Endpoint, b as ExecdHealth, c as ExecdMetrics, i as SandboxMetrics, a as SandboxFiles, F as FileInfo, W as WriteEntry, T as SetPermissionEntry, x as MoveEntry, n as ContentReplaceEntry, K as SearchEntry, Q as SearchFilesResponse, E as ExecdCommands, m as CommandStatus, l as CommandLogs, J as RunCommandOpts, h as ServerStreamEvent, g as ExecutionHandlers, k as CommandExecution } from './sandboxes-Dc0G4ShU.js';
3
3
 
4
4
  /**
5
5
  * This file was auto-generated by openapi-typescript.
@@ -382,7 +382,10 @@ interface paths$1 {
382
382
  */
383
383
  get: {
384
384
  parameters: {
385
- query?: never;
385
+ query?: {
386
+ /** @description Whether to return a server-proxied URL */
387
+ use_server_proxy?: boolean;
388
+ };
386
389
  header?: never;
387
390
  path: {
388
391
  /** @description Unique sandbox identifier */
@@ -629,6 +632,12 @@ interface components$1 {
629
632
  * the sidecar starts in allow-all mode until updated.
630
633
  */
631
634
  networkPolicy?: components$1["schemas"]["NetworkPolicy"];
635
+ /**
636
+ * @description Storage mounts for the sandbox. Each volume entry specifies a named backend-specific
637
+ * storage source and common mount settings. Exactly one backend type must be specified
638
+ * per volume entry.
639
+ */
640
+ volumes?: components$1["schemas"]["Volume"][];
632
641
  /**
633
642
  * @description Opaque container for provider-specific or transient parameters not supported by the core API.
634
643
  *
@@ -702,6 +711,10 @@ interface components$1 {
702
711
  * Example: endpoint.opensandbox.io/sandboxes/abc123/port/8080
703
712
  */
704
713
  endpoint: string;
714
+ /** @description Requests targeting the sandbox must include the corresponding header(s). */
715
+ headers?: {
716
+ [key: string]: string;
717
+ };
705
718
  };
706
719
  /**
707
720
  * @description Egress network policy matching the sidecar `/policy` request body.
@@ -729,6 +742,63 @@ interface components$1 {
729
742
  */
730
743
  target: string;
731
744
  };
745
+ /**
746
+ * @description Storage mount definition for a sandbox. Each volume entry contains:
747
+ * - A unique name identifier
748
+ * - Exactly one backend struct (host, pvc, etc.) with backend-specific fields
749
+ * - Common mount settings (mountPath, readOnly, subPath)
750
+ */
751
+ Volume: {
752
+ /**
753
+ * @description Unique identifier for the volume within the sandbox.
754
+ * Must be a valid DNS label (lowercase alphanumeric, hyphens allowed, max 63 chars).
755
+ */
756
+ name: string;
757
+ host?: components$1["schemas"]["Host"];
758
+ pvc?: components$1["schemas"]["PVC"];
759
+ /**
760
+ * @description Absolute path inside the container where the volume is mounted.
761
+ * Must start with '/'.
762
+ */
763
+ mountPath: string;
764
+ /**
765
+ * @description If true, the volume is mounted as read-only. Defaults to false (read-write).
766
+ * @default false
767
+ */
768
+ readOnly: boolean;
769
+ /**
770
+ * @description Optional subdirectory under the backend path to mount.
771
+ * Must be a relative path without '..' components.
772
+ */
773
+ subPath?: string;
774
+ };
775
+ /**
776
+ * @description Host path bind mount backend. Maps a directory on the host filesystem
777
+ * into the container. Only available when the runtime supports host mounts.
778
+ *
779
+ * Security note: Host paths are restricted by server-side allowlist.
780
+ * Users must specify paths under permitted prefixes.
781
+ */
782
+ Host: {
783
+ /**
784
+ * @description Absolute path on the host filesystem to mount.
785
+ * Must start with '/' and be under an allowed prefix.
786
+ */
787
+ path: string;
788
+ };
789
+ /**
790
+ * @description Kubernetes PersistentVolumeClaim mount backend. References an existing
791
+ * PVC in the same namespace as the sandbox pod.
792
+ *
793
+ * Only available in Kubernetes runtime.
794
+ */
795
+ PVC: {
796
+ /**
797
+ * @description Name of the PersistentVolumeClaim in the same namespace.
798
+ * Must be a valid Kubernetes resource name.
799
+ */
800
+ claimName: string;
801
+ };
732
802
  };
733
803
  responses: {
734
804
  /** @description Error response envelope */
@@ -987,6 +1057,8 @@ interface paths {
987
1057
  * @description Executes a shell command and streams the output in real-time using SSE (Server-Sent Events).
988
1058
  * The command can run in foreground or background mode. The response includes stdout, stderr,
989
1059
  * execution status, and completion events.
1060
+ * Optionally specify `timeout` (milliseconds) to enforce a maximum runtime; the server will
1061
+ * terminate the process when the timeout is reached.
990
1062
  */
991
1063
  post: operations["runCommand"];
992
1064
  /**
@@ -1348,6 +1420,12 @@ interface components {
1348
1420
  * @example false
1349
1421
  */
1350
1422
  background: boolean;
1423
+ /**
1424
+ * Format: int64
1425
+ * @description Maximum allowed execution time in milliseconds before the command is forcefully terminated by the server. If omitted, the server will not enforce any timeout.
1426
+ * @example 60000
1427
+ */
1428
+ timeout?: number;
1351
1429
  };
1352
1430
  /** @description Command execution status (foreground or background) */
1353
1431
  CommandStatusResponse: {
@@ -2431,7 +2509,7 @@ declare class SandboxesAdapter implements Sandboxes {
2431
2509
  pauseSandbox(sandboxId: SandboxId): Promise<void>;
2432
2510
  resumeSandbox(sandboxId: SandboxId): Promise<void>;
2433
2511
  renewSandboxExpiration(sandboxId: SandboxId, req: RenewSandboxExpirationRequest): Promise<RenewSandboxExpirationResponse>;
2434
- getSandboxEndpoint(sandboxId: SandboxId, port: number): Promise<Endpoint>;
2512
+ getSandboxEndpoint(sandboxId: SandboxId, port: number, useServerProxy?: boolean): Promise<Endpoint>;
2435
2513
  }
2436
2514
 
2437
2515
  declare class HealthAdapter implements ExecdHealth {
@@ -2509,6 +2587,8 @@ declare class CommandsAdapter implements ExecdCommands {
2509
2587
  private readonly fetch;
2510
2588
  constructor(client: ExecdClient, opts: CommandsAdapterOptions);
2511
2589
  interrupt(sessionId: string): Promise<void>;
2590
+ getCommandStatus(commandId: string): Promise<CommandStatus>;
2591
+ getBackgroundCommandLogs(commandId: string, cursor?: number): Promise<CommandLogs>;
2512
2592
  runStream(command: string, opts?: RunCommandOpts, signal?: AbortSignal): AsyncIterable<ServerStreamEvent>;
2513
2593
  run(command: string, opts?: RunCommandOpts, handlers?: ExecutionHandlers, signal?: AbortSignal): Promise<CommandExecution>;
2514
2594
  }
package/dist/internal.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  SandboxesAdapter,
7
7
  createExecdClient,
8
8
  createLifecycleClient
9
- } from "./chunk-4EF4ODU2.js";
9
+ } from "./chunk-OYTPXLWE.js";
10
10
  export {
11
11
  CommandsAdapter,
12
12
  FilesystemAdapter,