@computesdk/opencomputer 1.0.11 → 1.0.12
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 +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -175,21 +175,21 @@ async function createSandbox(config, options) {
|
|
|
175
175
|
envs: opts.envs,
|
|
176
176
|
secretStore: opts.secretStore
|
|
177
177
|
});
|
|
178
|
-
return {
|
|
178
|
+
return { instance: sandbox2, instanceId: sandbox2.sandboxId || sandbox2.id };
|
|
179
179
|
}
|
|
180
180
|
const sandbox = await Sandbox.create(opts);
|
|
181
|
-
return { sandbox,
|
|
181
|
+
return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };
|
|
182
182
|
}
|
|
183
183
|
var _provider = (0, import_provider.defineProvider)({
|
|
184
184
|
name: "opencomputer",
|
|
185
185
|
methods: {
|
|
186
|
-
|
|
186
|
+
instances: {
|
|
187
187
|
create: createSandbox,
|
|
188
188
|
getById: async (config, sandboxId) => {
|
|
189
189
|
const Sandbox = await loadSandbox();
|
|
190
190
|
try {
|
|
191
191
|
const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));
|
|
192
|
-
return { sandbox,
|
|
192
|
+
return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id || sandboxId };
|
|
193
193
|
} catch (error) {
|
|
194
194
|
if (error instanceof Error && (error.message.includes("404") || error.message.includes("not found"))) {
|
|
195
195
|
return null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * OpenComputer Provider - Factory-based Implementation\n *\n * Wraps the official `@opencomputer/sdk` so OpenComputer sandboxes can be used\n * through the ComputeSDK provider interface.\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateSandboxOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n SandboxInfo,\n} from '@computesdk/provider';\n\ninterface OpenComputerSandboxOpts {\n template?: string;\n timeout?: number;\n apiKey?: string;\n apiUrl?: string;\n envs?: Record<string, string>;\n metadata?: Record<string, string>;\n cpuCount?: number;\n memoryMB?: number;\n diskMB?: number;\n secretStore?: string;\n snapshot?: string;\n burst?: boolean;\n sandboxFamily?: 'spot';\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n webhooks?: Array<{ url: string; secret?: string; eventTypes?: string[] }>;\n}\n\ninterface OpenComputerProcessResult {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}\n\ninterface OpenComputerExecSession {\n sessionId: string;\n}\n\ninterface OpenComputerEntryInfo {\n name: string;\n isDir: boolean;\n path: string;\n size: number;\n}\n\ninterface OpenComputerCheckpointInfo {\n id: string;\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n createdAt?: string;\n sandboxConfig?: Record<string, unknown>;\n}\n\ninterface OpenComputerPreviewURLResult {\n hostname?: string;\n customHostname?: string;\n port: number;\n}\n\ninterface OpenComputerNativeSandbox {\n readonly sandboxId: string;\n readonly id: string;\n readonly status: string;\n readonly previewAuthToken?: string;\n readonly webhooks?: Array<{ id: string; url: string; secret?: string }>;\n readonly commands: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n };\n readonly exec?: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n background?(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerExecSession>;\n };\n readonly files: {\n read(path: string): Promise<string>;\n write(path: string, content: string): Promise<void>;\n makeDir(path: string): Promise<void>;\n list(path?: string): Promise<OpenComputerEntryInfo[]>;\n exists(path: string): Promise<boolean>;\n remove(path: string): Promise<void>;\n };\n getPreviewDomain(port: number): string;\n createPreviewURL(opts: { port: number; domain?: string; authConfig?: Record<string, unknown> }): Promise<OpenComputerPreviewURLResult>;\n listPreviewURLs(): Promise<OpenComputerPreviewURLResult[]>;\n kill(): Promise<void>;\n isRunning(): Promise<boolean>;\n createCheckpoint(name: string, opts?: { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }): Promise<OpenComputerCheckpointInfo>;\n listCheckpoints(): Promise<OpenComputerCheckpointInfo[]>;\n deleteCheckpoint(checkpointId: string): Promise<void>;\n}\n\ninterface OpenComputerSandboxStatic {\n create(opts?: OpenComputerSandboxOpts): Promise<OpenComputerNativeSandbox>;\n connect(sandboxId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'>): Promise<OpenComputerNativeSandbox>;\n createFromCheckpoint(checkpointId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>): Promise<OpenComputerNativeSandbox>;\n}\n\n// `@opencomputer/sdk` initialises at import. Starting it here rather than in\n// loadSandbox() means that happens before the first create, not during it.\n//\n// Dynamic, not static: the SDK is ESM-only with top-level await, so a static\n// import compiles to require() in the CJS build and fails to load.\nconst _sdkPromise: Promise<OpenComputerSandboxStatic> = import('@opencomputer/sdk')\n .then((mod) => (mod as { Sandbox: OpenComputerSandboxStatic }).Sandbox);\n\n// Nothing has awaited this yet, so an early failure would surface as an\n// unhandled rejection. The real error still reaches loadSandbox()'s caller.\nvoid _sdkPromise.catch(() => {});\n\nasync function loadSandbox(): Promise<OpenComputerSandboxStatic> {\n return _sdkPromise;\n}\n\nexport interface OpenComputerConfig {\n /** OpenComputer API key - falls back to OPENCOMPUTER_API_KEY. */\n apiKey?: string;\n /** OpenComputer API URL - falls back to OPENCOMPUTER_API_URL, then production. */\n apiUrl?: string;\n /** Default template for new sandboxes. Defaults to OpenComputer's `base` template. */\n template?: string;\n /** Default idle timeout in milliseconds. OpenComputer receives this as seconds. */\n timeout?: number;\n /** Default environment variables for new sandboxes. */\n envs?: Record<string, string>;\n /** Default metadata for new sandboxes. */\n metadata?: Record<string, string>;\n /** OpenComputer CPU count for new sandboxes. */\n cpuCount?: number;\n /** OpenComputer memory size in MB for new sandboxes. */\n memoryMB?: number;\n /** OpenComputer workspace disk size in MB for new sandboxes. */\n diskMB?: number;\n /** Secret store to attach to new sandboxes. */\n secretStore?: string;\n /** Create Burst sandboxes by default. */\n burst?: boolean;\n /** Require bearer auth on preview URLs. */\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n}\n\nexport interface OpenComputerSnapshot {\n id: string;\n provider: 'opencomputer';\n createdAt: Date;\n metadata: {\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n sandboxConfig?: Record<string, unknown>;\n };\n}\n\nfunction env(name: string): string | undefined {\n return typeof process !== 'undefined' ? process.env?.[name] : undefined;\n}\n\nfunction baseOpts(config: OpenComputerConfig): Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'> {\n return {\n apiKey: config.apiKey || env('OPENCOMPUTER_API_KEY'),\n apiUrl: config.apiUrl || env('OPENCOMPUTER_API_URL'),\n };\n}\n\nfunction toSeconds(milliseconds: number | undefined): number | undefined {\n return milliseconds == null ? undefined : Math.ceil(milliseconds / 1000);\n}\n\nfunction stringifyMetadata(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n if (!metadata) return undefined;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value == null || typeof value === 'function' || typeof value === 'symbol') {\n continue;\n }\n if (typeof value === 'string') {\n out[key] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n out[key] = String(value);\n continue;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized !== undefined) {\n out[key] = serialized;\n }\n } catch {\n // Skip metadata values that cannot be represented as JSON strings.\n }\n }\n return out;\n}\n\nfunction redactWebhooks(webhooks: OpenComputerNativeSandbox['webhooks']): Array<{ id: string; url: string; hasSecret: boolean }> | undefined {\n return webhooks?.map((webhook) => ({\n id: webhook.id,\n url: webhook.url,\n hasSecret: typeof webhook.secret === 'string' && webhook.secret.length > 0,\n }));\n}\n\nfunction createOpts(config: OpenComputerConfig, options?: CreateSandboxOptions): OpenComputerSandboxOpts {\n return {\n ...baseOpts(config),\n template: options?.templateId || config.template,\n timeout: toSeconds(options?.timeout ?? config.timeout),\n envs: { ...config.envs, ...options?.envs },\n metadata: { ...config.metadata, ...stringifyMetadata(options?.metadata) },\n cpuCount: (options as any)?.cpuCount ?? config.cpuCount,\n memoryMB: (options as any)?.memoryMB ?? (options as any)?.memory ?? config.memoryMB,\n diskMB: (options as any)?.diskMB ?? config.diskMB,\n secretStore: (options as any)?.secretStore ?? config.secretStore,\n burst: (options as any)?.burst ?? config.burst,\n sandboxFamily: (options as any)?.sandboxFamily,\n previewAuth: (options as any)?.previewAuth ?? config.previewAuth,\n webhooks: (options as any)?.webhooks,\n };\n}\n\nfunction snapshotToCompute(snapshot: OpenComputerCheckpointInfo): OpenComputerSnapshot {\n const id = snapshot.sandboxId ? `${snapshot.sandboxId}:${snapshot.id}` : snapshot.id;\n return {\n id,\n provider: 'opencomputer',\n createdAt: snapshot.createdAt ? new Date(snapshot.createdAt) : new Date(),\n metadata: {\n sandboxId: snapshot.sandboxId,\n orgId: snapshot.orgId,\n name: snapshot.name,\n status: snapshot.status,\n sizeBytes: snapshot.sizeBytes,\n sandboxConfig: snapshot.sandboxConfig,\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitForCheckpointReady(\n sandbox: OpenComputerNativeSandbox,\n checkpoint: OpenComputerCheckpointInfo,\n timeoutMs = 300_000,\n): Promise<OpenComputerCheckpointInfo> {\n if (checkpoint.status === 'ready') return checkpoint;\n if (checkpoint.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n if (Date.now() >= deadline) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} was not ready after ${timeoutMs}ms.`);\n }\n\n const checkpoints = await sandbox.listCheckpoints();\n const current = checkpoints.find((candidate) => candidate.id === checkpoint.id);\n if (!current) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} disappeared while waiting for readiness.`);\n }\n if (current.status === 'ready') return current;\n if (current.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n}\n\nfunction isCheckpointIndexMiss(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('404') && message.includes('checkpoint') && message.includes('not found');\n}\n\nasync function createFromCheckpointWithRetry(\n Sandbox: OpenComputerSandboxStatic,\n checkpointId: string,\n opts: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>,\n timeoutMs = 60_000,\n): Promise<OpenComputerNativeSandbox> {\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n try {\n return await Sandbox.createFromCheckpoint(checkpointId, opts);\n } catch (error) {\n if (!isCheckpointIndexMiss(error) || Date.now() >= deadline) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n }\n}\n\nasync function createSandbox(config: OpenComputerConfig, options?: CreateSandboxOptions) {\n const Sandbox = await loadSandbox();\n const opts = createOpts(config, options);\n\n if (options?.snapshotId) {\n const checkpointId = options.snapshotId.includes(':')\n ? options.snapshotId.slice(options.snapshotId.indexOf(':') + 1)\n : options.snapshotId;\n const sandbox = await createFromCheckpointWithRetry(Sandbox, checkpointId, {\n ...baseOpts(config),\n timeout: opts.timeout,\n envs: opts.envs,\n secretStore: opts.secretStore,\n });\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id };\n }\n\n const sandbox = await Sandbox.create(opts);\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id };\n}\n\nconst _provider = defineProvider<OpenComputerNativeSandbox, OpenComputerConfig, any, OpenComputerSnapshot>({\n name: 'opencomputer',\n methods: {\n sandbox: {\n create: createSandbox,\n\n getById: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id || sandboxId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return null;\n }\n throw new Error(`Failed to get OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n list: async () => {\n throw new Error('OpenComputer provider does not support listing sandboxes via the TypeScript SDK.');\n },\n\n destroy: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.kill();\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return;\n }\n throw new Error(`Failed to destroy OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n runCommand: async (sandbox: OpenComputerNativeSandbox, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n const runOptions = {\n cwd: options?.cwd,\n env: options?.env,\n timeout: toSeconds(options?.timeout),\n timeoutMs: options?.timeout,\n };\n if (options?.background && sandbox.exec?.background) {\n const session = await sandbox.exec.background(command, runOptions);\n return {\n stdout: session.sessionId,\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await (sandbox.exec ?? sandbox.commands).run(command, runOptions);\n return {\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n exitCode: result.exitCode ?? 0,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n throw new Error(`OpenComputer command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getInfo: async (sandbox: OpenComputerNativeSandbox): Promise<SandboxInfo> => {\n let status = sandbox.status;\n try {\n status = (await sandbox.isRunning()) ? 'running' : sandbox.status;\n } catch {\n status = sandbox.status;\n }\n\n return {\n id: sandbox.sandboxId || sandbox.id,\n provider: 'opencomputer',\n status: status === 'running' ? 'running' : status === 'error' ? 'error' : 'stopped',\n createdAt: new Date(),\n timeout: 0,\n metadata: {\n opencomputerSandboxId: sandbox.sandboxId || sandbox.id,\n previewAuthEnabled: Boolean(sandbox.previewAuthToken),\n webhooks: redactWebhooks(sandbox.webhooks),\n },\n };\n },\n\n getUrl: async (sandbox: OpenComputerNativeSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n const protocol = options.protocol || 'https';\n const domain = sandbox.getPreviewDomain(options.port);\n if (domain) {\n return `${protocol}://${domain}`;\n }\n\n const preview = await sandbox.createPreviewURL({ port: options.port });\n const hostname = preview.customHostname || preview.hostname;\n if (!hostname) {\n throw new Error(`OpenComputer did not return a preview hostname for port ${options.port}.`);\n }\n return `${protocol}://${hostname}`;\n },\n\n filesystem: {\n readFile: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<string> =>\n sandbox.files.read(path),\n writeFile: async (sandbox: OpenComputerNativeSandbox, path: string, content: string): Promise<void> => {\n await sandbox.files.write(path, content);\n },\n mkdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.makeDir(path);\n },\n readdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<FileEntry[]> => {\n const entries = await sandbox.files.list(path);\n return entries.map((entry) => ({\n name: entry.name,\n type: entry.isDir ? 'directory' as const : 'file' as const,\n size: entry.size,\n modified: new Date(),\n }));\n },\n exists: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<boolean> =>\n sandbox.files.exists(path),\n remove: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.remove(path);\n },\n },\n\n getInstance: (sandbox: OpenComputerNativeSandbox): OpenComputerNativeSandbox => sandbox,\n },\n\n snapshot: {\n create: async (config: OpenComputerConfig, sandboxId: string, options?: CreateSnapshotOptions) => {\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n const metadata = options?.metadata as\n | { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }\n | undefined;\n const kind = metadata?.kind ?? 'disk_only';\n const snapshot = await sandbox.createCheckpoint(options?.name || `snapshot-${Date.now()}`, {\n kind,\n promoteToFull: metadata?.promoteToFull ?? (kind === 'disk_only' ? true : undefined),\n retentionPolicy: metadata?.retentionPolicy,\n });\n return snapshotToCompute(await waitForCheckpointReady(sandbox, snapshot));\n },\n list: async (config: OpenComputerConfig, options?: ListSnapshotsOptions) => {\n if (!options?.sandboxId) {\n throw new Error('OpenComputer snapshots are scoped to a sandbox. Pass `sandboxId` to list snapshots.');\n }\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(options.sandboxId, baseOpts(config));\n const snapshots = await sandbox.listCheckpoints();\n return snapshots.map(snapshotToCompute);\n },\n delete: async (config: OpenComputerConfig, snapshotId: string) => {\n const sandboxId = snapshotId.split(':', 1)[0];\n if (!sandboxId || sandboxId === snapshotId) {\n throw new Error('OpenComputer snapshot deletion requires a sandbox-scoped id in the form `sandboxId:checkpointId`.');\n }\n const checkpointId = snapshotId.slice(sandboxId.length + 1);\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.deleteCheckpoint(checkpointId);\n },\n },\n },\n});\n\nexport const opencomputer = (config: OpenComputerConfig = {}) => _provider(config);\nexport type { OpenComputerNativeSandbox };\n"],"mappings":"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","names":["sandbox"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * OpenComputer Provider - Factory-based Implementation\n *\n * Wraps the official `@opencomputer/sdk` so OpenComputer sandboxes can be used\n * through the ComputeSDK provider interface.\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateInstanceOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n InstanceInfo,\n} from '@computesdk/provider';\n\ninterface OpenComputerSandboxOpts {\n template?: string;\n timeout?: number;\n apiKey?: string;\n apiUrl?: string;\n envs?: Record<string, string>;\n metadata?: Record<string, string>;\n cpuCount?: number;\n memoryMB?: number;\n diskMB?: number;\n secretStore?: string;\n snapshot?: string;\n burst?: boolean;\n sandboxFamily?: 'spot';\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n webhooks?: Array<{ url: string; secret?: string; eventTypes?: string[] }>;\n}\n\ninterface OpenComputerProcessResult {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}\n\ninterface OpenComputerExecSession {\n sessionId: string;\n}\n\ninterface OpenComputerEntryInfo {\n name: string;\n isDir: boolean;\n path: string;\n size: number;\n}\n\ninterface OpenComputerCheckpointInfo {\n id: string;\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n createdAt?: string;\n sandboxConfig?: Record<string, unknown>;\n}\n\ninterface OpenComputerPreviewURLResult {\n hostname?: string;\n customHostname?: string;\n port: number;\n}\n\ninterface OpenComputerNativeSandbox {\n readonly sandboxId: string;\n readonly id: string;\n readonly status: string;\n readonly previewAuthToken?: string;\n readonly webhooks?: Array<{ id: string; url: string; secret?: string }>;\n readonly commands: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n };\n readonly exec?: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n background?(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerExecSession>;\n };\n readonly files: {\n read(path: string): Promise<string>;\n write(path: string, content: string): Promise<void>;\n makeDir(path: string): Promise<void>;\n list(path?: string): Promise<OpenComputerEntryInfo[]>;\n exists(path: string): Promise<boolean>;\n remove(path: string): Promise<void>;\n };\n getPreviewDomain(port: number): string;\n createPreviewURL(opts: { port: number; domain?: string; authConfig?: Record<string, unknown> }): Promise<OpenComputerPreviewURLResult>;\n listPreviewURLs(): Promise<OpenComputerPreviewURLResult[]>;\n kill(): Promise<void>;\n isRunning(): Promise<boolean>;\n createCheckpoint(name: string, opts?: { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }): Promise<OpenComputerCheckpointInfo>;\n listCheckpoints(): Promise<OpenComputerCheckpointInfo[]>;\n deleteCheckpoint(checkpointId: string): Promise<void>;\n}\n\ninterface OpenComputerSandboxStatic {\n create(opts?: OpenComputerSandboxOpts): Promise<OpenComputerNativeSandbox>;\n connect(sandboxId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'>): Promise<OpenComputerNativeSandbox>;\n createFromCheckpoint(checkpointId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>): Promise<OpenComputerNativeSandbox>;\n}\n\n// `@opencomputer/sdk` initialises at import. Starting it here rather than in\n// loadSandbox() means that happens before the first create, not during it.\n//\n// Dynamic, not static: the SDK is ESM-only with top-level await, so a static\n// import compiles to require() in the CJS build and fails to load.\nconst _sdkPromise: Promise<OpenComputerSandboxStatic> = import('@opencomputer/sdk')\n .then((mod) => (mod as { Sandbox: OpenComputerSandboxStatic }).Sandbox);\n\n// Nothing has awaited this yet, so an early failure would surface as an\n// unhandled rejection. The real error still reaches loadSandbox()'s caller.\nvoid _sdkPromise.catch(() => {});\n\nasync function loadSandbox(): Promise<OpenComputerSandboxStatic> {\n return _sdkPromise;\n}\n\nexport interface OpenComputerConfig {\n /** OpenComputer API key - falls back to OPENCOMPUTER_API_KEY. */\n apiKey?: string;\n /** OpenComputer API URL - falls back to OPENCOMPUTER_API_URL, then production. */\n apiUrl?: string;\n /** Default template for new sandboxes. Defaults to OpenComputer's `base` template. */\n template?: string;\n /** Default idle timeout in milliseconds. OpenComputer receives this as seconds. */\n timeout?: number;\n /** Default environment variables for new sandboxes. */\n envs?: Record<string, string>;\n /** Default metadata for new sandboxes. */\n metadata?: Record<string, string>;\n /** OpenComputer CPU count for new sandboxes. */\n cpuCount?: number;\n /** OpenComputer memory size in MB for new sandboxes. */\n memoryMB?: number;\n /** OpenComputer workspace disk size in MB for new sandboxes. */\n diskMB?: number;\n /** Secret store to attach to new sandboxes. */\n secretStore?: string;\n /** Create Burst sandboxes by default. */\n burst?: boolean;\n /** Require bearer auth on preview URLs. */\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n}\n\nexport interface OpenComputerSnapshot {\n id: string;\n provider: 'opencomputer';\n createdAt: Date;\n metadata: {\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n sandboxConfig?: Record<string, unknown>;\n };\n}\n\nfunction env(name: string): string | undefined {\n return typeof process !== 'undefined' ? process.env?.[name] : undefined;\n}\n\nfunction baseOpts(config: OpenComputerConfig): Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'> {\n return {\n apiKey: config.apiKey || env('OPENCOMPUTER_API_KEY'),\n apiUrl: config.apiUrl || env('OPENCOMPUTER_API_URL'),\n };\n}\n\nfunction toSeconds(milliseconds: number | undefined): number | undefined {\n return milliseconds == null ? undefined : Math.ceil(milliseconds / 1000);\n}\n\nfunction stringifyMetadata(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n if (!metadata) return undefined;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value == null || typeof value === 'function' || typeof value === 'symbol') {\n continue;\n }\n if (typeof value === 'string') {\n out[key] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n out[key] = String(value);\n continue;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized !== undefined) {\n out[key] = serialized;\n }\n } catch {\n // Skip metadata values that cannot be represented as JSON strings.\n }\n }\n return out;\n}\n\nfunction redactWebhooks(webhooks: OpenComputerNativeSandbox['webhooks']): Array<{ id: string; url: string; hasSecret: boolean }> | undefined {\n return webhooks?.map((webhook) => ({\n id: webhook.id,\n url: webhook.url,\n hasSecret: typeof webhook.secret === 'string' && webhook.secret.length > 0,\n }));\n}\n\nfunction createOpts(config: OpenComputerConfig, options?: CreateInstanceOptions): OpenComputerSandboxOpts {\n return {\n ...baseOpts(config),\n template: options?.templateId || config.template,\n timeout: toSeconds(options?.timeout ?? config.timeout),\n envs: { ...config.envs, ...options?.envs },\n metadata: { ...config.metadata, ...stringifyMetadata(options?.metadata) },\n cpuCount: (options as any)?.cpuCount ?? config.cpuCount,\n memoryMB: (options as any)?.memoryMB ?? (options as any)?.memory ?? config.memoryMB,\n diskMB: (options as any)?.diskMB ?? config.diskMB,\n secretStore: (options as any)?.secretStore ?? config.secretStore,\n burst: (options as any)?.burst ?? config.burst,\n sandboxFamily: (options as any)?.sandboxFamily,\n previewAuth: (options as any)?.previewAuth ?? config.previewAuth,\n webhooks: (options as any)?.webhooks,\n };\n}\n\nfunction snapshotToCompute(snapshot: OpenComputerCheckpointInfo): OpenComputerSnapshot {\n const id = snapshot.sandboxId ? `${snapshot.sandboxId}:${snapshot.id}` : snapshot.id;\n return {\n id,\n provider: 'opencomputer',\n createdAt: snapshot.createdAt ? new Date(snapshot.createdAt) : new Date(),\n metadata: {\n sandboxId: snapshot.sandboxId,\n orgId: snapshot.orgId,\n name: snapshot.name,\n status: snapshot.status,\n sizeBytes: snapshot.sizeBytes,\n sandboxConfig: snapshot.sandboxConfig,\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitForCheckpointReady(\n sandbox: OpenComputerNativeSandbox,\n checkpoint: OpenComputerCheckpointInfo,\n timeoutMs = 300_000,\n): Promise<OpenComputerCheckpointInfo> {\n if (checkpoint.status === 'ready') return checkpoint;\n if (checkpoint.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n if (Date.now() >= deadline) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} was not ready after ${timeoutMs}ms.`);\n }\n\n const checkpoints = await sandbox.listCheckpoints();\n const current = checkpoints.find((candidate) => candidate.id === checkpoint.id);\n if (!current) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} disappeared while waiting for readiness.`);\n }\n if (current.status === 'ready') return current;\n if (current.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n}\n\nfunction isCheckpointIndexMiss(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('404') && message.includes('checkpoint') && message.includes('not found');\n}\n\nasync function createFromCheckpointWithRetry(\n Sandbox: OpenComputerSandboxStatic,\n checkpointId: string,\n opts: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>,\n timeoutMs = 60_000,\n): Promise<OpenComputerNativeSandbox> {\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n try {\n return await Sandbox.createFromCheckpoint(checkpointId, opts);\n } catch (error) {\n if (!isCheckpointIndexMiss(error) || Date.now() >= deadline) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n }\n}\n\nasync function createSandbox(config: OpenComputerConfig, options?: CreateInstanceOptions) {\n const Sandbox = await loadSandbox();\n const opts = createOpts(config, options);\n\n if (options?.snapshotId) {\n const checkpointId = options.snapshotId.includes(':')\n ? options.snapshotId.slice(options.snapshotId.indexOf(':') + 1)\n : options.snapshotId;\n const sandbox = await createFromCheckpointWithRetry(Sandbox, checkpointId, {\n ...baseOpts(config),\n timeout: opts.timeout,\n envs: opts.envs,\n secretStore: opts.secretStore,\n });\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };\n }\n\n const sandbox = await Sandbox.create(opts);\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };\n}\n\nconst _provider = defineProvider<OpenComputerNativeSandbox, OpenComputerConfig, any, OpenComputerSnapshot>({\n name: 'opencomputer',\n methods: {\n instances: {\n create: createSandbox,\n\n getById: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id || sandboxId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return null;\n }\n throw new Error(`Failed to get OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n list: async () => {\n throw new Error('OpenComputer provider does not support listing sandboxes via the TypeScript SDK.');\n },\n\n destroy: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.kill();\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return;\n }\n throw new Error(`Failed to destroy OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n runCommand: async (sandbox: OpenComputerNativeSandbox, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n const runOptions = {\n cwd: options?.cwd,\n env: options?.env,\n timeout: toSeconds(options?.timeout),\n timeoutMs: options?.timeout,\n };\n if (options?.background && sandbox.exec?.background) {\n const session = await sandbox.exec.background(command, runOptions);\n return {\n stdout: session.sessionId,\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await (sandbox.exec ?? sandbox.commands).run(command, runOptions);\n return {\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n exitCode: result.exitCode ?? 0,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n throw new Error(`OpenComputer command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getInfo: async (sandbox: OpenComputerNativeSandbox): Promise<InstanceInfo> => {\n let status = sandbox.status;\n try {\n status = (await sandbox.isRunning()) ? 'running' : sandbox.status;\n } catch {\n status = sandbox.status;\n }\n\n return {\n id: sandbox.sandboxId || sandbox.id,\n provider: 'opencomputer',\n status: status === 'running' ? 'running' : status === 'error' ? 'error' : 'stopped',\n createdAt: new Date(),\n timeout: 0,\n metadata: {\n opencomputerSandboxId: sandbox.sandboxId || sandbox.id,\n previewAuthEnabled: Boolean(sandbox.previewAuthToken),\n webhooks: redactWebhooks(sandbox.webhooks),\n },\n };\n },\n\n getUrl: async (sandbox: OpenComputerNativeSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n const protocol = options.protocol || 'https';\n const domain = sandbox.getPreviewDomain(options.port);\n if (domain) {\n return `${protocol}://${domain}`;\n }\n\n const preview = await sandbox.createPreviewURL({ port: options.port });\n const hostname = preview.customHostname || preview.hostname;\n if (!hostname) {\n throw new Error(`OpenComputer did not return a preview hostname for port ${options.port}.`);\n }\n return `${protocol}://${hostname}`;\n },\n\n filesystem: {\n readFile: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<string> =>\n sandbox.files.read(path),\n writeFile: async (sandbox: OpenComputerNativeSandbox, path: string, content: string): Promise<void> => {\n await sandbox.files.write(path, content);\n },\n mkdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.makeDir(path);\n },\n readdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<FileEntry[]> => {\n const entries = await sandbox.files.list(path);\n return entries.map((entry) => ({\n name: entry.name,\n type: entry.isDir ? 'directory' as const : 'file' as const,\n size: entry.size,\n modified: new Date(),\n }));\n },\n exists: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<boolean> =>\n sandbox.files.exists(path),\n remove: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.remove(path);\n },\n },\n\n getInstance: (sandbox: OpenComputerNativeSandbox): OpenComputerNativeSandbox => sandbox,\n },\n\n snapshot: {\n create: async (config: OpenComputerConfig, sandboxId: string, options?: CreateSnapshotOptions) => {\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n const metadata = options?.metadata as\n | { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }\n | undefined;\n const kind = metadata?.kind ?? 'disk_only';\n const snapshot = await sandbox.createCheckpoint(options?.name || `snapshot-${Date.now()}`, {\n kind,\n promoteToFull: metadata?.promoteToFull ?? (kind === 'disk_only' ? true : undefined),\n retentionPolicy: metadata?.retentionPolicy,\n });\n return snapshotToCompute(await waitForCheckpointReady(sandbox, snapshot));\n },\n list: async (config: OpenComputerConfig, options?: ListSnapshotsOptions) => {\n if (!options?.sandboxId) {\n throw new Error('OpenComputer snapshots are scoped to a sandbox. Pass `sandboxId` to list snapshots.');\n }\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(options.sandboxId, baseOpts(config));\n const snapshots = await sandbox.listCheckpoints();\n return snapshots.map(snapshotToCompute);\n },\n delete: async (config: OpenComputerConfig, snapshotId: string) => {\n const sandboxId = snapshotId.split(':', 1)[0];\n if (!sandboxId || sandboxId === snapshotId) {\n throw new Error('OpenComputer snapshot deletion requires a sandbox-scoped id in the form `sandboxId:checkpointId`.');\n }\n const checkpointId = snapshotId.slice(sandboxId.length + 1);\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.deleteCheckpoint(checkpointId);\n },\n },\n },\n});\n\nexport const opencomputer = (config: OpenComputerConfig = {}) => _provider(config);\nexport type { OpenComputerNativeSandbox };\n"],"mappings":"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","names":["sandbox"]}
|
package/dist/index.mjs
CHANGED
|
@@ -141,21 +141,21 @@ async function createSandbox(config, options) {
|
|
|
141
141
|
envs: opts.envs,
|
|
142
142
|
secretStore: opts.secretStore
|
|
143
143
|
});
|
|
144
|
-
return {
|
|
144
|
+
return { instance: sandbox2, instanceId: sandbox2.sandboxId || sandbox2.id };
|
|
145
145
|
}
|
|
146
146
|
const sandbox = await Sandbox.create(opts);
|
|
147
|
-
return { sandbox,
|
|
147
|
+
return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };
|
|
148
148
|
}
|
|
149
149
|
var _provider = defineProvider({
|
|
150
150
|
name: "opencomputer",
|
|
151
151
|
methods: {
|
|
152
|
-
|
|
152
|
+
instances: {
|
|
153
153
|
create: createSandbox,
|
|
154
154
|
getById: async (config, sandboxId) => {
|
|
155
155
|
const Sandbox = await loadSandbox();
|
|
156
156
|
try {
|
|
157
157
|
const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));
|
|
158
|
-
return { sandbox,
|
|
158
|
+
return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id || sandboxId };
|
|
159
159
|
} catch (error) {
|
|
160
160
|
if (error instanceof Error && (error.message.includes("404") || error.message.includes("not found"))) {
|
|
161
161
|
return null;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * OpenComputer Provider - Factory-based Implementation\n *\n * Wraps the official `@opencomputer/sdk` so OpenComputer sandboxes can be used\n * through the ComputeSDK provider interface.\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateSandboxOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n SandboxInfo,\n} from '@computesdk/provider';\n\ninterface OpenComputerSandboxOpts {\n template?: string;\n timeout?: number;\n apiKey?: string;\n apiUrl?: string;\n envs?: Record<string, string>;\n metadata?: Record<string, string>;\n cpuCount?: number;\n memoryMB?: number;\n diskMB?: number;\n secretStore?: string;\n snapshot?: string;\n burst?: boolean;\n sandboxFamily?: 'spot';\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n webhooks?: Array<{ url: string; secret?: string; eventTypes?: string[] }>;\n}\n\ninterface OpenComputerProcessResult {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}\n\ninterface OpenComputerExecSession {\n sessionId: string;\n}\n\ninterface OpenComputerEntryInfo {\n name: string;\n isDir: boolean;\n path: string;\n size: number;\n}\n\ninterface OpenComputerCheckpointInfo {\n id: string;\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n createdAt?: string;\n sandboxConfig?: Record<string, unknown>;\n}\n\ninterface OpenComputerPreviewURLResult {\n hostname?: string;\n customHostname?: string;\n port: number;\n}\n\ninterface OpenComputerNativeSandbox {\n readonly sandboxId: string;\n readonly id: string;\n readonly status: string;\n readonly previewAuthToken?: string;\n readonly webhooks?: Array<{ id: string; url: string; secret?: string }>;\n readonly commands: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n };\n readonly exec?: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n background?(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerExecSession>;\n };\n readonly files: {\n read(path: string): Promise<string>;\n write(path: string, content: string): Promise<void>;\n makeDir(path: string): Promise<void>;\n list(path?: string): Promise<OpenComputerEntryInfo[]>;\n exists(path: string): Promise<boolean>;\n remove(path: string): Promise<void>;\n };\n getPreviewDomain(port: number): string;\n createPreviewURL(opts: { port: number; domain?: string; authConfig?: Record<string, unknown> }): Promise<OpenComputerPreviewURLResult>;\n listPreviewURLs(): Promise<OpenComputerPreviewURLResult[]>;\n kill(): Promise<void>;\n isRunning(): Promise<boolean>;\n createCheckpoint(name: string, opts?: { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }): Promise<OpenComputerCheckpointInfo>;\n listCheckpoints(): Promise<OpenComputerCheckpointInfo[]>;\n deleteCheckpoint(checkpointId: string): Promise<void>;\n}\n\ninterface OpenComputerSandboxStatic {\n create(opts?: OpenComputerSandboxOpts): Promise<OpenComputerNativeSandbox>;\n connect(sandboxId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'>): Promise<OpenComputerNativeSandbox>;\n createFromCheckpoint(checkpointId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>): Promise<OpenComputerNativeSandbox>;\n}\n\n// `@opencomputer/sdk` initialises at import. Starting it here rather than in\n// loadSandbox() means that happens before the first create, not during it.\n//\n// Dynamic, not static: the SDK is ESM-only with top-level await, so a static\n// import compiles to require() in the CJS build and fails to load.\nconst _sdkPromise: Promise<OpenComputerSandboxStatic> = import('@opencomputer/sdk')\n .then((mod) => (mod as { Sandbox: OpenComputerSandboxStatic }).Sandbox);\n\n// Nothing has awaited this yet, so an early failure would surface as an\n// unhandled rejection. The real error still reaches loadSandbox()'s caller.\nvoid _sdkPromise.catch(() => {});\n\nasync function loadSandbox(): Promise<OpenComputerSandboxStatic> {\n return _sdkPromise;\n}\n\nexport interface OpenComputerConfig {\n /** OpenComputer API key - falls back to OPENCOMPUTER_API_KEY. */\n apiKey?: string;\n /** OpenComputer API URL - falls back to OPENCOMPUTER_API_URL, then production. */\n apiUrl?: string;\n /** Default template for new sandboxes. Defaults to OpenComputer's `base` template. */\n template?: string;\n /** Default idle timeout in milliseconds. OpenComputer receives this as seconds. */\n timeout?: number;\n /** Default environment variables for new sandboxes. */\n envs?: Record<string, string>;\n /** Default metadata for new sandboxes. */\n metadata?: Record<string, string>;\n /** OpenComputer CPU count for new sandboxes. */\n cpuCount?: number;\n /** OpenComputer memory size in MB for new sandboxes. */\n memoryMB?: number;\n /** OpenComputer workspace disk size in MB for new sandboxes. */\n diskMB?: number;\n /** Secret store to attach to new sandboxes. */\n secretStore?: string;\n /** Create Burst sandboxes by default. */\n burst?: boolean;\n /** Require bearer auth on preview URLs. */\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n}\n\nexport interface OpenComputerSnapshot {\n id: string;\n provider: 'opencomputer';\n createdAt: Date;\n metadata: {\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n sandboxConfig?: Record<string, unknown>;\n };\n}\n\nfunction env(name: string): string | undefined {\n return typeof process !== 'undefined' ? process.env?.[name] : undefined;\n}\n\nfunction baseOpts(config: OpenComputerConfig): Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'> {\n return {\n apiKey: config.apiKey || env('OPENCOMPUTER_API_KEY'),\n apiUrl: config.apiUrl || env('OPENCOMPUTER_API_URL'),\n };\n}\n\nfunction toSeconds(milliseconds: number | undefined): number | undefined {\n return milliseconds == null ? undefined : Math.ceil(milliseconds / 1000);\n}\n\nfunction stringifyMetadata(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n if (!metadata) return undefined;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value == null || typeof value === 'function' || typeof value === 'symbol') {\n continue;\n }\n if (typeof value === 'string') {\n out[key] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n out[key] = String(value);\n continue;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized !== undefined) {\n out[key] = serialized;\n }\n } catch {\n // Skip metadata values that cannot be represented as JSON strings.\n }\n }\n return out;\n}\n\nfunction redactWebhooks(webhooks: OpenComputerNativeSandbox['webhooks']): Array<{ id: string; url: string; hasSecret: boolean }> | undefined {\n return webhooks?.map((webhook) => ({\n id: webhook.id,\n url: webhook.url,\n hasSecret: typeof webhook.secret === 'string' && webhook.secret.length > 0,\n }));\n}\n\nfunction createOpts(config: OpenComputerConfig, options?: CreateSandboxOptions): OpenComputerSandboxOpts {\n return {\n ...baseOpts(config),\n template: options?.templateId || config.template,\n timeout: toSeconds(options?.timeout ?? config.timeout),\n envs: { ...config.envs, ...options?.envs },\n metadata: { ...config.metadata, ...stringifyMetadata(options?.metadata) },\n cpuCount: (options as any)?.cpuCount ?? config.cpuCount,\n memoryMB: (options as any)?.memoryMB ?? (options as any)?.memory ?? config.memoryMB,\n diskMB: (options as any)?.diskMB ?? config.diskMB,\n secretStore: (options as any)?.secretStore ?? config.secretStore,\n burst: (options as any)?.burst ?? config.burst,\n sandboxFamily: (options as any)?.sandboxFamily,\n previewAuth: (options as any)?.previewAuth ?? config.previewAuth,\n webhooks: (options as any)?.webhooks,\n };\n}\n\nfunction snapshotToCompute(snapshot: OpenComputerCheckpointInfo): OpenComputerSnapshot {\n const id = snapshot.sandboxId ? `${snapshot.sandboxId}:${snapshot.id}` : snapshot.id;\n return {\n id,\n provider: 'opencomputer',\n createdAt: snapshot.createdAt ? new Date(snapshot.createdAt) : new Date(),\n metadata: {\n sandboxId: snapshot.sandboxId,\n orgId: snapshot.orgId,\n name: snapshot.name,\n status: snapshot.status,\n sizeBytes: snapshot.sizeBytes,\n sandboxConfig: snapshot.sandboxConfig,\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitForCheckpointReady(\n sandbox: OpenComputerNativeSandbox,\n checkpoint: OpenComputerCheckpointInfo,\n timeoutMs = 300_000,\n): Promise<OpenComputerCheckpointInfo> {\n if (checkpoint.status === 'ready') return checkpoint;\n if (checkpoint.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n if (Date.now() >= deadline) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} was not ready after ${timeoutMs}ms.`);\n }\n\n const checkpoints = await sandbox.listCheckpoints();\n const current = checkpoints.find((candidate) => candidate.id === checkpoint.id);\n if (!current) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} disappeared while waiting for readiness.`);\n }\n if (current.status === 'ready') return current;\n if (current.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n}\n\nfunction isCheckpointIndexMiss(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('404') && message.includes('checkpoint') && message.includes('not found');\n}\n\nasync function createFromCheckpointWithRetry(\n Sandbox: OpenComputerSandboxStatic,\n checkpointId: string,\n opts: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>,\n timeoutMs = 60_000,\n): Promise<OpenComputerNativeSandbox> {\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n try {\n return await Sandbox.createFromCheckpoint(checkpointId, opts);\n } catch (error) {\n if (!isCheckpointIndexMiss(error) || Date.now() >= deadline) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n }\n}\n\nasync function createSandbox(config: OpenComputerConfig, options?: CreateSandboxOptions) {\n const Sandbox = await loadSandbox();\n const opts = createOpts(config, options);\n\n if (options?.snapshotId) {\n const checkpointId = options.snapshotId.includes(':')\n ? options.snapshotId.slice(options.snapshotId.indexOf(':') + 1)\n : options.snapshotId;\n const sandbox = await createFromCheckpointWithRetry(Sandbox, checkpointId, {\n ...baseOpts(config),\n timeout: opts.timeout,\n envs: opts.envs,\n secretStore: opts.secretStore,\n });\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id };\n }\n\n const sandbox = await Sandbox.create(opts);\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id };\n}\n\nconst _provider = defineProvider<OpenComputerNativeSandbox, OpenComputerConfig, any, OpenComputerSnapshot>({\n name: 'opencomputer',\n methods: {\n sandbox: {\n create: createSandbox,\n\n getById: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n return { sandbox, sandboxId: sandbox.sandboxId || sandbox.id || sandboxId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return null;\n }\n throw new Error(`Failed to get OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n list: async () => {\n throw new Error('OpenComputer provider does not support listing sandboxes via the TypeScript SDK.');\n },\n\n destroy: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.kill();\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return;\n }\n throw new Error(`Failed to destroy OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n runCommand: async (sandbox: OpenComputerNativeSandbox, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n const runOptions = {\n cwd: options?.cwd,\n env: options?.env,\n timeout: toSeconds(options?.timeout),\n timeoutMs: options?.timeout,\n };\n if (options?.background && sandbox.exec?.background) {\n const session = await sandbox.exec.background(command, runOptions);\n return {\n stdout: session.sessionId,\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await (sandbox.exec ?? sandbox.commands).run(command, runOptions);\n return {\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n exitCode: result.exitCode ?? 0,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n throw new Error(`OpenComputer command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getInfo: async (sandbox: OpenComputerNativeSandbox): Promise<SandboxInfo> => {\n let status = sandbox.status;\n try {\n status = (await sandbox.isRunning()) ? 'running' : sandbox.status;\n } catch {\n status = sandbox.status;\n }\n\n return {\n id: sandbox.sandboxId || sandbox.id,\n provider: 'opencomputer',\n status: status === 'running' ? 'running' : status === 'error' ? 'error' : 'stopped',\n createdAt: new Date(),\n timeout: 0,\n metadata: {\n opencomputerSandboxId: sandbox.sandboxId || sandbox.id,\n previewAuthEnabled: Boolean(sandbox.previewAuthToken),\n webhooks: redactWebhooks(sandbox.webhooks),\n },\n };\n },\n\n getUrl: async (sandbox: OpenComputerNativeSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n const protocol = options.protocol || 'https';\n const domain = sandbox.getPreviewDomain(options.port);\n if (domain) {\n return `${protocol}://${domain}`;\n }\n\n const preview = await sandbox.createPreviewURL({ port: options.port });\n const hostname = preview.customHostname || preview.hostname;\n if (!hostname) {\n throw new Error(`OpenComputer did not return a preview hostname for port ${options.port}.`);\n }\n return `${protocol}://${hostname}`;\n },\n\n filesystem: {\n readFile: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<string> =>\n sandbox.files.read(path),\n writeFile: async (sandbox: OpenComputerNativeSandbox, path: string, content: string): Promise<void> => {\n await sandbox.files.write(path, content);\n },\n mkdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.makeDir(path);\n },\n readdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<FileEntry[]> => {\n const entries = await sandbox.files.list(path);\n return entries.map((entry) => ({\n name: entry.name,\n type: entry.isDir ? 'directory' as const : 'file' as const,\n size: entry.size,\n modified: new Date(),\n }));\n },\n exists: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<boolean> =>\n sandbox.files.exists(path),\n remove: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.remove(path);\n },\n },\n\n getInstance: (sandbox: OpenComputerNativeSandbox): OpenComputerNativeSandbox => sandbox,\n },\n\n snapshot: {\n create: async (config: OpenComputerConfig, sandboxId: string, options?: CreateSnapshotOptions) => {\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n const metadata = options?.metadata as\n | { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }\n | undefined;\n const kind = metadata?.kind ?? 'disk_only';\n const snapshot = await sandbox.createCheckpoint(options?.name || `snapshot-${Date.now()}`, {\n kind,\n promoteToFull: metadata?.promoteToFull ?? (kind === 'disk_only' ? true : undefined),\n retentionPolicy: metadata?.retentionPolicy,\n });\n return snapshotToCompute(await waitForCheckpointReady(sandbox, snapshot));\n },\n list: async (config: OpenComputerConfig, options?: ListSnapshotsOptions) => {\n if (!options?.sandboxId) {\n throw new Error('OpenComputer snapshots are scoped to a sandbox. Pass `sandboxId` to list snapshots.');\n }\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(options.sandboxId, baseOpts(config));\n const snapshots = await sandbox.listCheckpoints();\n return snapshots.map(snapshotToCompute);\n },\n delete: async (config: OpenComputerConfig, snapshotId: string) => {\n const sandboxId = snapshotId.split(':', 1)[0];\n if (!sandboxId || sandboxId === snapshotId) {\n throw new Error('OpenComputer snapshot deletion requires a sandbox-scoped id in the form `sandboxId:checkpointId`.');\n }\n const checkpointId = snapshotId.slice(sandboxId.length + 1);\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.deleteCheckpoint(checkpointId);\n },\n },\n },\n});\n\nexport const opencomputer = (config: OpenComputerConfig = {}) => _provider(config);\nexport type { OpenComputerNativeSandbox };\n"],"mappings":"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","names":["sandbox"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * OpenComputer Provider - Factory-based Implementation\n *\n * Wraps the official `@opencomputer/sdk` so OpenComputer sandboxes can be used\n * through the ComputeSDK provider interface.\n */\n\nimport { defineProvider } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateInstanceOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n InstanceInfo,\n} from '@computesdk/provider';\n\ninterface OpenComputerSandboxOpts {\n template?: string;\n timeout?: number;\n apiKey?: string;\n apiUrl?: string;\n envs?: Record<string, string>;\n metadata?: Record<string, string>;\n cpuCount?: number;\n memoryMB?: number;\n diskMB?: number;\n secretStore?: string;\n snapshot?: string;\n burst?: boolean;\n sandboxFamily?: 'spot';\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n webhooks?: Array<{ url: string; secret?: string; eventTypes?: string[] }>;\n}\n\ninterface OpenComputerProcessResult {\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}\n\ninterface OpenComputerExecSession {\n sessionId: string;\n}\n\ninterface OpenComputerEntryInfo {\n name: string;\n isDir: boolean;\n path: string;\n size: number;\n}\n\ninterface OpenComputerCheckpointInfo {\n id: string;\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n createdAt?: string;\n sandboxConfig?: Record<string, unknown>;\n}\n\ninterface OpenComputerPreviewURLResult {\n hostname?: string;\n customHostname?: string;\n port: number;\n}\n\ninterface OpenComputerNativeSandbox {\n readonly sandboxId: string;\n readonly id: string;\n readonly status: string;\n readonly previewAuthToken?: string;\n readonly webhooks?: Array<{ id: string; url: string; secret?: string }>;\n readonly commands: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n };\n readonly exec?: {\n run(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerProcessResult>;\n background?(command: string, opts?: { cwd?: string; env?: Record<string, string>; timeout?: number; timeoutMs?: number }): Promise<OpenComputerExecSession>;\n };\n readonly files: {\n read(path: string): Promise<string>;\n write(path: string, content: string): Promise<void>;\n makeDir(path: string): Promise<void>;\n list(path?: string): Promise<OpenComputerEntryInfo[]>;\n exists(path: string): Promise<boolean>;\n remove(path: string): Promise<void>;\n };\n getPreviewDomain(port: number): string;\n createPreviewURL(opts: { port: number; domain?: string; authConfig?: Record<string, unknown> }): Promise<OpenComputerPreviewURLResult>;\n listPreviewURLs(): Promise<OpenComputerPreviewURLResult[]>;\n kill(): Promise<void>;\n isRunning(): Promise<boolean>;\n createCheckpoint(name: string, opts?: { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }): Promise<OpenComputerCheckpointInfo>;\n listCheckpoints(): Promise<OpenComputerCheckpointInfo[]>;\n deleteCheckpoint(checkpointId: string): Promise<void>;\n}\n\ninterface OpenComputerSandboxStatic {\n create(opts?: OpenComputerSandboxOpts): Promise<OpenComputerNativeSandbox>;\n connect(sandboxId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'>): Promise<OpenComputerNativeSandbox>;\n createFromCheckpoint(checkpointId: string, opts?: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>): Promise<OpenComputerNativeSandbox>;\n}\n\n// `@opencomputer/sdk` initialises at import. Starting it here rather than in\n// loadSandbox() means that happens before the first create, not during it.\n//\n// Dynamic, not static: the SDK is ESM-only with top-level await, so a static\n// import compiles to require() in the CJS build and fails to load.\nconst _sdkPromise: Promise<OpenComputerSandboxStatic> = import('@opencomputer/sdk')\n .then((mod) => (mod as { Sandbox: OpenComputerSandboxStatic }).Sandbox);\n\n// Nothing has awaited this yet, so an early failure would surface as an\n// unhandled rejection. The real error still reaches loadSandbox()'s caller.\nvoid _sdkPromise.catch(() => {});\n\nasync function loadSandbox(): Promise<OpenComputerSandboxStatic> {\n return _sdkPromise;\n}\n\nexport interface OpenComputerConfig {\n /** OpenComputer API key - falls back to OPENCOMPUTER_API_KEY. */\n apiKey?: string;\n /** OpenComputer API URL - falls back to OPENCOMPUTER_API_URL, then production. */\n apiUrl?: string;\n /** Default template for new sandboxes. Defaults to OpenComputer's `base` template. */\n template?: string;\n /** Default idle timeout in milliseconds. OpenComputer receives this as seconds. */\n timeout?: number;\n /** Default environment variables for new sandboxes. */\n envs?: Record<string, string>;\n /** Default metadata for new sandboxes. */\n metadata?: Record<string, string>;\n /** OpenComputer CPU count for new sandboxes. */\n cpuCount?: number;\n /** OpenComputer memory size in MB for new sandboxes. */\n memoryMB?: number;\n /** OpenComputer workspace disk size in MB for new sandboxes. */\n diskMB?: number;\n /** Secret store to attach to new sandboxes. */\n secretStore?: string;\n /** Create Burst sandboxes by default. */\n burst?: boolean;\n /** Require bearer auth on preview URLs. */\n previewAuth?: { scheme?: 'bearer'; token?: 'auto' | string };\n}\n\nexport interface OpenComputerSnapshot {\n id: string;\n provider: 'opencomputer';\n createdAt: Date;\n metadata: {\n sandboxId?: string;\n orgId?: string;\n name?: string;\n status?: string;\n sizeBytes?: number;\n sandboxConfig?: Record<string, unknown>;\n };\n}\n\nfunction env(name: string): string | undefined {\n return typeof process !== 'undefined' ? process.env?.[name] : undefined;\n}\n\nfunction baseOpts(config: OpenComputerConfig): Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl'> {\n return {\n apiKey: config.apiKey || env('OPENCOMPUTER_API_KEY'),\n apiUrl: config.apiUrl || env('OPENCOMPUTER_API_URL'),\n };\n}\n\nfunction toSeconds(milliseconds: number | undefined): number | undefined {\n return milliseconds == null ? undefined : Math.ceil(milliseconds / 1000);\n}\n\nfunction stringifyMetadata(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n if (!metadata) return undefined;\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value == null || typeof value === 'function' || typeof value === 'symbol') {\n continue;\n }\n if (typeof value === 'string') {\n out[key] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {\n out[key] = String(value);\n continue;\n }\n try {\n const serialized = JSON.stringify(value);\n if (serialized !== undefined) {\n out[key] = serialized;\n }\n } catch {\n // Skip metadata values that cannot be represented as JSON strings.\n }\n }\n return out;\n}\n\nfunction redactWebhooks(webhooks: OpenComputerNativeSandbox['webhooks']): Array<{ id: string; url: string; hasSecret: boolean }> | undefined {\n return webhooks?.map((webhook) => ({\n id: webhook.id,\n url: webhook.url,\n hasSecret: typeof webhook.secret === 'string' && webhook.secret.length > 0,\n }));\n}\n\nfunction createOpts(config: OpenComputerConfig, options?: CreateInstanceOptions): OpenComputerSandboxOpts {\n return {\n ...baseOpts(config),\n template: options?.templateId || config.template,\n timeout: toSeconds(options?.timeout ?? config.timeout),\n envs: { ...config.envs, ...options?.envs },\n metadata: { ...config.metadata, ...stringifyMetadata(options?.metadata) },\n cpuCount: (options as any)?.cpuCount ?? config.cpuCount,\n memoryMB: (options as any)?.memoryMB ?? (options as any)?.memory ?? config.memoryMB,\n diskMB: (options as any)?.diskMB ?? config.diskMB,\n secretStore: (options as any)?.secretStore ?? config.secretStore,\n burst: (options as any)?.burst ?? config.burst,\n sandboxFamily: (options as any)?.sandboxFamily,\n previewAuth: (options as any)?.previewAuth ?? config.previewAuth,\n webhooks: (options as any)?.webhooks,\n };\n}\n\nfunction snapshotToCompute(snapshot: OpenComputerCheckpointInfo): OpenComputerSnapshot {\n const id = snapshot.sandboxId ? `${snapshot.sandboxId}:${snapshot.id}` : snapshot.id;\n return {\n id,\n provider: 'opencomputer',\n createdAt: snapshot.createdAt ? new Date(snapshot.createdAt) : new Date(),\n metadata: {\n sandboxId: snapshot.sandboxId,\n orgId: snapshot.orgId,\n name: snapshot.name,\n status: snapshot.status,\n sizeBytes: snapshot.sizeBytes,\n sandboxConfig: snapshot.sandboxConfig,\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function waitForCheckpointReady(\n sandbox: OpenComputerNativeSandbox,\n checkpoint: OpenComputerCheckpointInfo,\n timeoutMs = 300_000,\n): Promise<OpenComputerCheckpointInfo> {\n if (checkpoint.status === 'ready') return checkpoint;\n if (checkpoint.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n if (Date.now() >= deadline) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} was not ready after ${timeoutMs}ms.`);\n }\n\n const checkpoints = await sandbox.listCheckpoints();\n const current = checkpoints.find((candidate) => candidate.id === checkpoint.id);\n if (!current) {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} disappeared while waiting for readiness.`);\n }\n if (current.status === 'ready') return current;\n if (current.status === 'failed') {\n throw new Error(`OpenComputer checkpoint ${checkpoint.id} failed.`);\n }\n\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n}\n\nfunction isCheckpointIndexMiss(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n return message.includes('404') && message.includes('checkpoint') && message.includes('not found');\n}\n\nasync function createFromCheckpointWithRetry(\n Sandbox: OpenComputerSandboxStatic,\n checkpointId: string,\n opts: Pick<OpenComputerSandboxOpts, 'apiKey' | 'apiUrl' | 'timeout' | 'envs' | 'secretStore'>,\n timeoutMs = 60_000,\n): Promise<OpenComputerNativeSandbox> {\n const deadline = Date.now() + timeoutMs;\n let delay = 1_000;\n\n for (;;) {\n try {\n return await Sandbox.createFromCheckpoint(checkpointId, opts);\n } catch (error) {\n if (!isCheckpointIndexMiss(error) || Date.now() >= deadline) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, 5_000);\n }\n }\n}\n\nasync function createSandbox(config: OpenComputerConfig, options?: CreateInstanceOptions) {\n const Sandbox = await loadSandbox();\n const opts = createOpts(config, options);\n\n if (options?.snapshotId) {\n const checkpointId = options.snapshotId.includes(':')\n ? options.snapshotId.slice(options.snapshotId.indexOf(':') + 1)\n : options.snapshotId;\n const sandbox = await createFromCheckpointWithRetry(Sandbox, checkpointId, {\n ...baseOpts(config),\n timeout: opts.timeout,\n envs: opts.envs,\n secretStore: opts.secretStore,\n });\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };\n }\n\n const sandbox = await Sandbox.create(opts);\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id };\n}\n\nconst _provider = defineProvider<OpenComputerNativeSandbox, OpenComputerConfig, any, OpenComputerSnapshot>({\n name: 'opencomputer',\n methods: {\n instances: {\n create: createSandbox,\n\n getById: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n return { instance: sandbox, instanceId: sandbox.sandboxId || sandbox.id || sandboxId };\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return null;\n }\n throw new Error(`Failed to get OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n list: async () => {\n throw new Error('OpenComputer provider does not support listing sandboxes via the TypeScript SDK.');\n },\n\n destroy: async (config: OpenComputerConfig, sandboxId: string) => {\n const Sandbox = await loadSandbox();\n try {\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.kill();\n } catch (error) {\n if (error instanceof Error && (error.message.includes('404') || error.message.includes('not found'))) {\n return;\n }\n throw new Error(`Failed to destroy OpenComputer sandbox ${sandboxId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n runCommand: async (sandbox: OpenComputerNativeSandbox, command: string, options?: RunCommandOptions): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n const runOptions = {\n cwd: options?.cwd,\n env: options?.env,\n timeout: toSeconds(options?.timeout),\n timeoutMs: options?.timeout,\n };\n if (options?.background && sandbox.exec?.background) {\n const session = await sandbox.exec.background(command, runOptions);\n return {\n stdout: session.sessionId,\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await (sandbox.exec ?? sandbox.commands).run(command, runOptions);\n return {\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n exitCode: result.exitCode ?? 0,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n throw new Error(`OpenComputer command execution failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n\n getInfo: async (sandbox: OpenComputerNativeSandbox): Promise<InstanceInfo> => {\n let status = sandbox.status;\n try {\n status = (await sandbox.isRunning()) ? 'running' : sandbox.status;\n } catch {\n status = sandbox.status;\n }\n\n return {\n id: sandbox.sandboxId || sandbox.id,\n provider: 'opencomputer',\n status: status === 'running' ? 'running' : status === 'error' ? 'error' : 'stopped',\n createdAt: new Date(),\n timeout: 0,\n metadata: {\n opencomputerSandboxId: sandbox.sandboxId || sandbox.id,\n previewAuthEnabled: Boolean(sandbox.previewAuthToken),\n webhooks: redactWebhooks(sandbox.webhooks),\n },\n };\n },\n\n getUrl: async (sandbox: OpenComputerNativeSandbox, options: { port: number; protocol?: string }): Promise<string> => {\n const protocol = options.protocol || 'https';\n const domain = sandbox.getPreviewDomain(options.port);\n if (domain) {\n return `${protocol}://${domain}`;\n }\n\n const preview = await sandbox.createPreviewURL({ port: options.port });\n const hostname = preview.customHostname || preview.hostname;\n if (!hostname) {\n throw new Error(`OpenComputer did not return a preview hostname for port ${options.port}.`);\n }\n return `${protocol}://${hostname}`;\n },\n\n filesystem: {\n readFile: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<string> =>\n sandbox.files.read(path),\n writeFile: async (sandbox: OpenComputerNativeSandbox, path: string, content: string): Promise<void> => {\n await sandbox.files.write(path, content);\n },\n mkdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.makeDir(path);\n },\n readdir: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<FileEntry[]> => {\n const entries = await sandbox.files.list(path);\n return entries.map((entry) => ({\n name: entry.name,\n type: entry.isDir ? 'directory' as const : 'file' as const,\n size: entry.size,\n modified: new Date(),\n }));\n },\n exists: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<boolean> =>\n sandbox.files.exists(path),\n remove: async (sandbox: OpenComputerNativeSandbox, path: string): Promise<void> => {\n await sandbox.files.remove(path);\n },\n },\n\n getInstance: (sandbox: OpenComputerNativeSandbox): OpenComputerNativeSandbox => sandbox,\n },\n\n snapshot: {\n create: async (config: OpenComputerConfig, sandboxId: string, options?: CreateSnapshotOptions) => {\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n const metadata = options?.metadata as\n | { kind?: 'full' | 'disk_only'; promoteToFull?: boolean; retentionPolicy?: unknown }\n | undefined;\n const kind = metadata?.kind ?? 'disk_only';\n const snapshot = await sandbox.createCheckpoint(options?.name || `snapshot-${Date.now()}`, {\n kind,\n promoteToFull: metadata?.promoteToFull ?? (kind === 'disk_only' ? true : undefined),\n retentionPolicy: metadata?.retentionPolicy,\n });\n return snapshotToCompute(await waitForCheckpointReady(sandbox, snapshot));\n },\n list: async (config: OpenComputerConfig, options?: ListSnapshotsOptions) => {\n if (!options?.sandboxId) {\n throw new Error('OpenComputer snapshots are scoped to a sandbox. Pass `sandboxId` to list snapshots.');\n }\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(options.sandboxId, baseOpts(config));\n const snapshots = await sandbox.listCheckpoints();\n return snapshots.map(snapshotToCompute);\n },\n delete: async (config: OpenComputerConfig, snapshotId: string) => {\n const sandboxId = snapshotId.split(':', 1)[0];\n if (!sandboxId || sandboxId === snapshotId) {\n throw new Error('OpenComputer snapshot deletion requires a sandbox-scoped id in the form `sandboxId:checkpointId`.');\n }\n const checkpointId = snapshotId.slice(sandboxId.length + 1);\n const Sandbox = await loadSandbox();\n const sandbox = await Sandbox.connect(sandboxId, baseOpts(config));\n await sandbox.deleteCheckpoint(checkpointId);\n },\n },\n },\n});\n\nexport const opencomputer = (config: OpenComputerConfig = {}) => _provider(config);\nexport type { OpenComputerNativeSandbox };\n"],"mappings":"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","names":["sandbox"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/opencomputer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.12",
|
|
4
4
|
"description": "OpenComputer provider for ComputeSDK - persistent cloud VMs with checkpoints, preview URLs, command execution, and filesystem access",
|
|
5
5
|
"author": "ComputeSDK",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@opencomputer/sdk": "latest",
|
|
32
|
-
"@computesdk/provider": "2.1.
|
|
33
|
-
"computesdk": "4.1.
|
|
32
|
+
"@computesdk/provider": "2.1.13",
|
|
33
|
+
"computesdk": "4.1.11"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "^20.0.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"tsup": "^8.0.0",
|
|
41
41
|
"typescript": "^5.0.0",
|
|
42
42
|
"vitest": "^1.0.0",
|
|
43
|
-
"@computesdk/test-utils": "2.0.
|
|
43
|
+
"@computesdk/test-utils": "2.0.4"
|
|
44
44
|
},
|
|
45
45
|
"repository": {
|
|
46
46
|
"type": "git",
|