instavm 0.15.0 → 0.17.0
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/README.md +133 -9
- package/dist/InstaVM-DjkmUcaP.d.mts +1393 -0
- package/dist/InstaVM-DjkmUcaP.d.ts +1393 -0
- package/dist/_instavmToolsCore-34H4iqVZ.d.mts +26 -0
- package/dist/_instavmToolsCore-BuaJyxXB.d.ts +26 -0
- package/dist/cli.js +7973 -2227
- package/dist/cli.js.map +1 -1
- package/dist/index.d.mts +12 -919
- package/dist/index.d.ts +12 -919
- package/dist/index.js +1465 -141
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1450 -136
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/azure-openai.d.mts +18 -0
- package/dist/integrations/azure-openai.d.ts +18 -0
- package/dist/integrations/azure-openai.js +332 -0
- package/dist/integrations/azure-openai.js.map +1 -0
- package/dist/integrations/azure-openai.mjs +299 -0
- package/dist/integrations/azure-openai.mjs.map +1 -0
- package/dist/integrations/langchain.d.mts +7 -0
- package/dist/integrations/langchain.d.ts +7 -0
- package/dist/integrations/langchain.js +364 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/langchain.mjs +327 -0
- package/dist/integrations/langchain.mjs.map +1 -0
- package/dist/integrations/llamaindex.d.mts +11 -0
- package/dist/integrations/llamaindex.d.ts +11 -0
- package/dist/integrations/llamaindex.js +415 -0
- package/dist/integrations/llamaindex.js.map +1 -0
- package/dist/integrations/llamaindex.mjs +378 -0
- package/dist/integrations/llamaindex.mjs.map +1 -0
- package/dist/integrations/ollama.d.mts +35 -0
- package/dist/integrations/ollama.d.ts +35 -0
- package/dist/integrations/ollama.js +421 -0
- package/dist/integrations/ollama.js.map +1 -0
- package/dist/integrations/ollama.mjs +391 -0
- package/dist/integrations/ollama.mjs.map +1 -0
- package/dist/integrations/openai.d.mts +19 -0
- package/dist/integrations/openai.d.ts +19 -0
- package/dist/integrations/openai.js +302 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/integrations/openai.mjs +272 -0
- package/dist/integrations/openai.mjs.map +1 -0
- package/package.json +46 -4
- package/dist/integrations/openai/index.d.mts +0 -16
- package/dist/integrations/openai/index.d.ts +0 -16
- package/dist/integrations/openai/index.js +0 -38
- package/dist/integrations/openai/index.js.map +0 -1
- package/dist/integrations/openai/index.mjs +0 -12
- package/dist/integrations/openai/index.mjs.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/client/HTTPClient.ts","../src/errors/BaseError.ts","../src/utils/retry.ts","../src/client/BrowserSession.ts","../src/client/BrowserManager.ts","../src/utils/path.ts","../src/client/VMsManager.ts","../src/client/SnapshotsManager.ts","../src/client/SharesManager.ts","../src/client/CustomDomainsManager.ts","../src/client/ComputerUseManager.ts","../src/client/APIKeysManager.ts","../src/client/AuditManager.ts","../src/client/WebhooksManager.ts","../src/client/VolumesManager.ts","../src/client/InstaVM.ts","../src/cli/config.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { spawnSync, type SpawnSyncReturns } from 'child_process';\nimport { Command, CommanderError } from 'commander';\nimport { InstaVM, type InstaVMOptions } from './client/InstaVM';\nimport {\n ConfigError,\n DEFAULT_BILLING_URL,\n DEFAULT_DOCS_URL,\n getActiveProfile,\n redactSecret,\n resolveRuntimeConfig,\n updateProfileSettings,\n type CLIConfig,\n type RuntimeConfig,\n} from './cli/config';\n\ntype Writeable = Pick<NodeJS.WriteStream, 'write'>;\n\ninterface CliDeps {\n stdout: Writeable;\n stderr: Writeable;\n spawnSync: typeof spawnSync;\n resolveRuntimeConfig: typeof resolveRuntimeConfig;\n updateProfileSettings: typeof updateProfileSettings;\n clientFactory: (apiKey: string, options: InstaVMOptions) => InstaVM;\n promptSecret: (prompt: string) => Promise<string>;\n readStdin: () => Promise<string>;\n writeFile: (outputPath: string, content: Buffer) => void;\n}\n\nconst defaultDeps: CliDeps = {\n stdout: process.stdout,\n stderr: process.stderr,\n spawnSync,\n resolveRuntimeConfig,\n updateProfileSettings,\n clientFactory: (apiKey, options) => new InstaVM(apiKey, options),\n promptSecret,\n readStdin,\n writeFile: (outputPath, content) => {\n fs.writeFileSync(outputPath, content);\n },\n};\n\nfunction printJson(deps: CliDeps, payload: unknown): void {\n deps.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction printLines(deps: CliDeps, lines: string[]): void {\n for (const line of lines) {\n deps.stdout.write(`${line}\\n`);\n }\n}\n\nfunction emitOutput(\n deps: CliDeps,\n options: { json?: boolean },\n payload: unknown,\n textLines: string[],\n): number {\n if (options.json) {\n printJson(deps, payload);\n } else {\n printLines(deps, textLines);\n }\n return 0;\n}\n\nfunction addRuntimeOptions(command: Command, options: { includeJson?: boolean; includeSshHost?: boolean } = {}): Command {\n command.option('--api-key <apiKey>', 'Override the InstaVM API key for this command');\n command.option('--base-url <baseUrl>', 'Override the InstaVM API base URL for this command');\n if (options.includeSshHost) {\n command.option('--ssh-host <sshHost>', 'Override the SSH gateway host for this command');\n }\n if (options.includeJson !== false) {\n command.option('-j, --json', 'Emit JSON output');\n }\n return command;\n}\n\nfunction parseSize(value: string): number {\n const raw = value.trim().toLowerCase();\n if (!raw) {\n throw new Error('size is required');\n }\n const units: Array<[string, number]> = [\n ['tb', 1024 ** 4],\n ['gb', 1024 ** 3],\n ['mb', 1024 ** 2],\n ['kb', 1024],\n ['b', 1],\n ];\n for (const [suffix, multiplier] of units) {\n if (raw.endsWith(suffix) && raw !== suffix) {\n const number = raw.slice(0, -suffix.length).trim();\n return Math.floor(Number.parseFloat(number) * multiplier);\n }\n }\n return Number.parseInt(raw, 10);\n}\n\nfunction humanBytes(value?: number | null): string {\n let amount = Number(value || 0);\n for (const unit of ['B', 'KB', 'MB', 'GB', 'TB']) {\n if (amount < 1024 || unit === 'TB') {\n if (unit === 'B') {\n return `${Math.trunc(amount)}${unit}`;\n }\n return `${amount.toFixed(1)}${unit}`;\n }\n amount /= 1024;\n }\n return `${Math.trunc(Number(value || 0))}B`;\n}\n\nfunction parseEnvPairs(values?: string[]): Record<string, string> {\n const pairs: Record<string, string> = {};\n for (const entry of values || []) {\n const separatorIndex = entry.indexOf('=');\n if (separatorIndex < 1) {\n throw new Error(`Expected KEY=VALUE, got: ${entry}`);\n }\n const key = entry.slice(0, separatorIndex).trim();\n const value = entry.slice(separatorIndex + 1);\n if (!key) {\n throw new Error(`Invalid env key: ${entry}`);\n }\n pairs[key] = value;\n }\n return pairs;\n}\n\nfunction parseVolumeSpec(spec: string): Record<string, string | null> {\n const parts = spec.split(':');\n if (parts.length < 2) {\n throw new Error('volume mounts must use <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]');\n }\n const volumeId = parts[0].trim();\n const mountPath = parts[1].trim();\n let mode = 'rw';\n let checkpointId: string | null = null;\n if (parts[2]?.trim()) {\n mode = parts[2].trim().toLowerCase();\n }\n if (parts[3]?.trim()) {\n checkpointId = parts[3].trim();\n }\n if (parts.length > 4) {\n throw new Error('volume mounts must use <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]');\n }\n if (!['rw', 'ro'].includes(mode)) {\n throw new Error('volume mount mode must be rw or ro');\n }\n if (mode === 'rw' && checkpointId) {\n throw new Error('checkpoint_id is only allowed for ro mounts');\n }\n if (mode === 'ro' && !checkpointId) {\n checkpointId = 'latest';\n }\n return {\n volume_id: volumeId,\n mount_path: mountPath,\n mode,\n checkpoint_id: checkpointId,\n };\n}\n\nfunction looksLikeUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction statusPayload(deps: CliDeps, options: { apiKey?: string; baseUrl?: string; sshHost?: string }) {\n const settings = deps.resolveRuntimeConfig({\n apiKey: options.apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n const profile = getActiveProfile(settings.config as CLIConfig);\n const storedKey = profile.auth?.api_key ? String(profile.auth.api_key) : undefined;\n\n return {\n config_path: settings.configPath,\n active_profile: settings.config.active_profile,\n api_key: {\n configured: Boolean(settings.apiKey),\n redacted: redactSecret(settings.apiKey),\n source: settings.apiKeySource,\n stored: Boolean(storedKey),\n },\n base_url: {\n value: settings.baseURL,\n source: settings.baseURLSource,\n },\n ssh_host: {\n value: settings.sshHost,\n source: settings.sshHostSource,\n },\n };\n}\n\nfunction statusText(payload: ReturnType<typeof statusPayload>): string[] {\n const lines = [\n `Config path: ${payload.config_path}`,\n `Active profile: ${payload.active_profile}`,\n `API key: ${payload.api_key.redacted || 'not configured'} (${payload.api_key.source})`,\n `Base URL: ${payload.base_url.value} (${payload.base_url.source})`,\n `SSH host: ${payload.ssh_host.value} (${payload.ssh_host.source})`,\n ];\n if (payload.api_key.stored) {\n lines.push('Stored key: present');\n }\n return lines;\n}\n\nfunction resolveSettings(deps: CliDeps, options: { apiKey?: string; baseUrl?: string; sshHost?: string }): RuntimeConfig {\n return deps.resolveRuntimeConfig({\n apiKey: options.apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n}\n\nfunction requireClient(\n deps: CliDeps,\n options: { apiKey?: string; baseUrl?: string; sshHost?: string },\n): { client: InstaVM; settings: RuntimeConfig } {\n const settings = resolveSettings(deps, options);\n if (!settings.apiKey) {\n throw new Error('No InstaVM API key configured. Run `instavm auth set-key` or export INSTAVM_API_KEY.');\n }\n return {\n client: deps.clientFactory(settings.apiKey, { baseURL: settings.baseURL }),\n settings,\n };\n}\n\nasync function resolveDesktopTarget(client: InstaVM, target: string): Promise<Record<string, any>> {\n if (looksLikeUuid(target)) {\n const status = await client.getSessionStatus(target);\n return { ...status, session_id: target };\n }\n\n const vm = await client.vms.get(target);\n const sessionId = vm.session_id ? String(vm.session_id) : null;\n if (sessionId) {\n const status = await client.getSessionStatus(sessionId);\n return {\n ...status,\n session_id: sessionId,\n vm_id: status.vm_id || vm.vm_id,\n };\n }\n\n return {\n session_id: null,\n vm_id: vm.vm_id,\n vm_status: vm.status,\n vm_alive: vm.status === 'active',\n };\n}\n\nasync function desktopPayload(client: InstaVM, target: string): Promise<Record<string, any>> {\n const payload = await resolveDesktopTarget(client, target);\n if (payload.vm_alive && payload.session_id) {\n try {\n Object.assign(payload, await client.computerUse.viewerUrl(String(payload.session_id)));\n } catch (error) {\n // Ignore viewer lookup failures for non-desktop sessions in status calls.\n }\n }\n return payload;\n}\n\nexport function createProgram(deps: CliDeps = defaultDeps): Command {\n const program = new Command();\n program\n .name('instavm')\n .description('InstaVM CLI for VM, snapshot, volume, desktop, identity, and sharing workflows.')\n .showHelpAfterError()\n .showSuggestionAfterError()\n .configureOutput({\n writeOut: (str: string) => deps.stdout.write(str),\n writeErr: (str: string) => deps.stderr.write(str),\n })\n .addHelpCommand('help [command]', 'Show help for the CLI or a subcommand')\n .exitOverride();\n\n const auth = program.command('auth').description('Manage stored auth for the installed CLI');\n\n addRuntimeOptions(\n auth\n .command('set-key')\n .description('Store an InstaVM API key in ~/.instavm/config.json from a hidden prompt or stdin')\n .action(async (options: any) => {\n const apiKey = process.stdin.isTTY\n ? (await deps.promptSecret('InstaVM API key: ')).trim()\n : (await deps.readStdin()).trim();\n if (!apiKey) {\n throw new Error('API key is required. Enter it at the prompt or pipe it over stdin.');\n }\n\n const configPath = deps.updateProfileSettings({\n apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n const payload = {\n status: 'stored',\n config_path: configPath,\n api_key: redactSecret(apiKey),\n base_url: options.baseUrl || null,\n ssh_host: options.sshHost || null,\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Stored API key in ${configPath}`,\n `API key: ${payload.api_key}`,\n ...(options.baseUrl ? [`Default base URL: ${options.baseUrl}`] : []),\n ...(options.sshHost ? [`Default SSH host: ${options.sshHost}`] : []),\n ],\n );\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n auth\n .command('status')\n .description('Show the effective CLI auth and endpoint settings')\n .action(async (options: any) => {\n const payload = statusPayload(deps, options);\n emitOutput(deps, options, payload, statusText(payload));\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n auth\n .command('logout')\n .description('Remove the stored API key from the local CLI config')\n .action(async (options: any) => {\n const settings = resolveSettings(deps, options);\n const configPath = deps.updateProfileSettings({ clearApiKey: true });\n const payload = {\n status: 'logged_out',\n config_path: configPath,\n env_key_active: settings.apiKeySource === 'env',\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Removed the stored API key from ${configPath}`,\n ...(payload.env_key_active\n ? ['INSTAVM_API_KEY is still set in the environment and will remain active.']\n : []),\n ],\n );\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n program\n .command('whoami')\n .description('Show the current account and SSH key registrations')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const [user, sshKeys] = await Promise.all([client.getCurrentUser(), client.listSshKeys()]);\n const payload = {\n id: user.id,\n email: user.email,\n name: user.name,\n is_verified: user.is_verified,\n ssh_keys: sshKeys,\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Email: ${payload.email || '-'}`,\n `User ID: ${payload.id}`,\n `Name: ${payload.name || '-'}`,\n `Verified: ${payload.is_verified ? 'yes' : 'no'}`,\n 'SSH Keys:',\n ...(sshKeys.length\n ? sshKeys.map((key) => ` ${key.id}\\t${key.fingerprint}\\t${key.comment || ''}`.trimEnd())\n : [' none']),\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('create')\n .alias('new')\n .description('Create a new VM or desktop')\n .option('--type <type>', 'VM type', 'standard')\n .option('--timeout <seconds>', 'VM lifetime in seconds')\n .option('--memory <mb>', 'Memory in MB')\n .option('--vcpu <count>', 'vCPU count')\n .option('--snapshot <snapshotId>', 'Snapshot ID to boot from')\n .option('--session <sessionId>', 'Session ID to attach or respawn')\n .option('--volume <spec>', 'Volume spec: <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]', (value, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .action(async (options: any) => {\n const { client, settings } = requireClient(deps, options);\n const payload: Record<string, any> = {};\n if (options.type === 'computer-use') {\n payload.image_variant = 'computer-use';\n }\n if (options.timeout) {\n payload.vm_lifetime_seconds = Number.parseInt(options.timeout, 10);\n }\n if (options.memory) {\n payload.memory_mb = Number.parseInt(options.memory, 10);\n }\n if (options.vcpu) {\n payload.vcpu_count = Number.parseInt(options.vcpu, 10);\n }\n if (options.snapshot) {\n payload.snapshot_id = options.snapshot;\n }\n if (options.session) {\n payload.session_id = options.session;\n }\n if (options.volume.length > 0) {\n payload.volumes = options.volume.map(parseVolumeSpec);\n }\n const result = await client.vms.create(payload, true);\n emitOutput(\n deps,\n options,\n result,\n [\n `VM: ${result.vm_id || '-'}`,\n `Session: ${result.session_id || '-'}`,\n `Status: ${result.status || '-'}`,\n ...(result.vm_id ? [`SSH: ssh ${result.vm_id}@${settings.sshHost}`] : []),\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('ls')\n .alias('list')\n .description('List your VMs')\n .option('--all', 'Include all VM records, not just active VMs')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const vms = options.all ? await client.vms.listAllRecords() : await client.vms.list();\n emitOutput(\n deps,\n options,\n { vms },\n vms.length > 0\n ? vms.map((vm) => `${vm.vm_id}\\t${vm.status || '-'}\\t${vm.created_at || '-'}\\t${vm.ssh_host || '-'}`)\n : ['No VMs.'],\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('rm')\n .alias('delete')\n .description('Delete one or more VMs')\n .argument('<vmIds...>')\n .action(async (vmIds: string[], options: any) => {\n const { client } = requireClient(deps, options);\n const results: Array<Record<string, any>> = [];\n for (const vmId of vmIds) {\n results.push({ vm_id: vmId, ...(await client.vms.delete(vmId)) });\n }\n emitOutput(\n deps,\n options,\n { results },\n results.map((entry) => `${entry.vm_id}: ${entry.status || 'ok'}`),\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('clone')\n .description('Clone a VM via snapshot')\n .argument('<vmId>')\n .option('--name <name>', 'Snapshot name used during clone')\n .action(async (vmId: string, options: any) => {\n const { client, settings } = requireClient(deps, options);\n const result = await client.vms.clone(vmId, options.name ? { snapshot_name: options.name } : {}, true);\n emitOutput(\n deps,\n options,\n result,\n [\n `VM: ${result.vm_id || '-'}`,\n `Session: ${result.session_id || '-'}`,\n `Status: ${result.status || '-'}`,\n ...(result.vm_id ? [`SSH: ssh ${result.vm_id}@${settings.sshHost}`] : []),\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('connect')\n .description('SSH into a VM with the local ssh client')\n .argument('<vmId>')\n .argument('[sshArgs...]')\n .action(async (vmId: string, sshArgs: string[], options: any) => {\n const settings = resolveSettings(deps, options);\n const sshBinary = process.platform === 'win32'\n ? (findExecutable(deps, 'ssh.exe') || findExecutable(deps, 'ssh'))\n : (findExecutable(deps, 'ssh') || findExecutable(deps, 'ssh.exe'));\n if (!sshBinary) {\n throw new Error('ssh client not found on PATH');\n }\n\n const passthroughArgs = [...(sshArgs || [])];\n if (passthroughArgs[0] === '--') {\n passthroughArgs.shift();\n }\n const command = [sshBinary, `${vmId}@${settings.sshHost}`, ...passthroughArgs];\n if (options.json) {\n printJson(deps, { command });\n return;\n }\n\n const result = deps.spawnSync(command[0], command.slice(1), { stdio: 'inherit' });\n if (result.error) {\n throw result.error;\n }\n if ((result.status ?? 0) !== 0) {\n throw new CommanderError(result.status ?? 1, 'ssh.exit', `ssh exited with status ${result.status ?? 1}`);\n }\n }),\n { includeSshHost: true },\n );\n\n const snapshot = program.command('snapshot').description('List, inspect, build, create, and delete snapshots');\n\n addRuntimeOptions(\n snapshot\n .command('ls')\n .alias('list')\n .description('List snapshots')\n .option('--type <type>', 'Snapshot type filter')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const snapshots = await client.snapshots.list(options.type ? { type: options.type } : {});\n emitOutput(\n deps,\n options,\n { snapshots },\n snapshots.length > 0\n ? snapshots.map((snap) => `${snap.id}\\t${snap.name || '-'}\\t${snap.status || '-'}\\t${snap.type || '-'}`)\n : ['No snapshots.'],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('create')\n .description('Create a snapshot from a running VM')\n .argument('<vmId>')\n .option('--name <name>', 'Snapshot name')\n .action(async (vmId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.vms.snapshot(vmId, options.name ? { name: options.name } : {}, true);\n emitOutput(\n deps,\n options,\n result,\n [`Snapshot: ${result.snapshot_id || result.id || '-'}`, `Status: ${result.status || '-'}`],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('build')\n .description('Build a snapshot from an OCI image')\n .argument('<ociImage>')\n .option('--name <name>', 'Snapshot name')\n .option('--vcpu <count>', 'vCPU count')\n .option('--memory <mb>', 'Memory in MB')\n .option('--disk-size <gb>', 'Snapshot disk size in GB')\n .option('--env <pair>', 'Build environment variable in KEY=VALUE form', (value: string, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .option('--git-clone <url>', 'Git repository to clone during build')\n .option('--git-branch <branch>', 'Git branch to checkout')\n .option('--run <command>', 'Command to run after the image is prepared')\n .option('--apt <packages>', 'Extra apt packages')\n .option('--pip <packages>', 'Extra pip packages')\n .option('--npm <packages>', 'Extra npm packages')\n .option('--type <type>', 'Snapshot type', 'user')\n .action(async (ociImage: string, options: any) => {\n const { client } = requireClient(deps, options);\n const buildArgs: Record<string, any> = {};\n if (options.apt) buildArgs.extra_apt_packages = options.apt;\n if (options.pip) buildArgs.extra_pip_packages = options.pip;\n if (options.npm) buildArgs.extra_npm_packages = options.npm;\n if (options.gitClone) buildArgs.git_clone_url = options.gitClone;\n if (options.gitBranch) buildArgs.git_clone_branch = options.gitBranch;\n if (options.diskSize) buildArgs.disk_size_gb = Number.parseInt(options.diskSize, 10);\n if (options.run) buildArgs.post_build_cmd = options.run;\n if (options.env.length > 0) buildArgs.envs = parseEnvPairs(options.env);\n\n const result = await client.snapshots.create({\n oci_image: ociImage,\n name: options.name,\n vcpu_count: options.vcpu ? Number.parseInt(options.vcpu, 10) : undefined,\n memory_mb: options.memory ? Number.parseInt(options.memory, 10) : undefined,\n build_args: Object.keys(buildArgs).length > 0 ? buildArgs : undefined,\n type: options.type,\n });\n emitOutput(\n deps,\n options,\n result,\n [`Snapshot: ${result.id || '-'}`, `Name: ${result.name || '-'}`, `Status: ${result.status || '-'}`],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('get')\n .description('Get a snapshot by ID')\n .argument('<snapshotId>')\n .action(async (snapshotId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.snapshots.get(snapshotId);\n emitOutput(\n deps,\n options,\n result,\n [\n `Snapshot: ${result.id || '-'}`,\n `Name: ${result.name || '-'}`,\n `Status: ${result.status || '-'}`,\n `Type: ${result.type || '-'}`,\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('rm')\n .alias('delete')\n .description('Delete a snapshot')\n .argument('<snapshotId>')\n .action(async (snapshotId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.snapshots.delete(snapshotId);\n emitOutput(deps, options, { snapshot_id: snapshotId, ...result }, [`Deleted snapshot ${snapshotId}`]);\n }),\n );\n\n const share = program.command('share').description('Create and manage VM shares');\n\n addRuntimeOptions(\n share\n .command('create')\n .description('Create a share for a VM and port')\n .argument('<vmId>')\n .argument('<port>')\n .option('--public', 'Create the share as public')\n .action(async (vmId: string, port: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.shares.create({\n vm_id: vmId,\n port: Number.parseInt(port, 10),\n is_public: Boolean(options.public),\n });\n emitOutput(\n deps,\n options,\n result,\n [\n `Share: ${result.share_id}`,\n `URL: ${result.url}`,\n `Port: ${result.port}`,\n `Visibility: ${result.is_public ? 'public' : 'private'}`,\n ],\n );\n }),\n );\n\n const addShareUpdateCommand = (name: string, description: string, mode: 'public' | 'private' | 'revoke') => {\n addRuntimeOptions(\n share\n .command(name)\n .description(description)\n .argument('<shareId>')\n .action(async (shareId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.shares.update(\n shareId,\n mode === 'revoke'\n ? { revoke: true }\n : { is_public: mode === 'public' },\n );\n emitOutput(\n deps,\n options,\n { share_id: shareId, ...result },\n [mode === 'revoke' ? `Revoked share ${shareId}` : `Updated share ${shareId} to ${mode}`],\n );\n }),\n );\n };\n\n addShareUpdateCommand('set-public', 'Set a share to public visibility', 'public');\n addShareUpdateCommand('set-private', 'Set a share to private visibility', 'private');\n addShareUpdateCommand('revoke', 'Revoke a share by share ID', 'revoke');\n\n const sshKey = program.command('ssh-key').alias('sshkey').description('Manage SSH keys on your account');\n\n addRuntimeOptions(\n sshKey\n .command('list')\n .description('List active SSH keys')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const keys = await client.listSshKeys();\n emitOutput(\n deps,\n options,\n { keys },\n keys.length > 0\n ? keys.map((key) => `${key.id}\\t${key.fingerprint}\\t${key.comment || ''}`.trimEnd())\n : ['No SSH keys.'],\n );\n }),\n );\n\n addRuntimeOptions(\n sshKey\n .command('add')\n .description('Add an SSH public key')\n .argument('[publicKey]')\n .action(async (publicKey: string | undefined, options: any) => {\n const { client } = requireClient(deps, options);\n const value = publicKey?.trim() || (!process.stdin.isTTY ? (await deps.readStdin()).trim() : '');\n if (!value) {\n throw new Error('Public key is required');\n }\n const result = await client.addSshKey(value);\n emitOutput(deps, options, result, [`Added ${result.fingerprint || result.id}`]);\n }),\n );\n\n addRuntimeOptions(\n sshKey\n .command('remove')\n .description('Remove an SSH key by key ID')\n .argument('<keyId>')\n .action(async (keyId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.deleteSshKey(Number.parseInt(keyId, 10));\n emitOutput(deps, options, { key_id: Number.parseInt(keyId, 10), ...result }, [`Removed ${keyId}`]);\n }),\n );\n\n const desktop = program.command('desktop').description('Manage computer-use desktops and viewer handoff');\n\n const addDesktopCommand = (name: string, description: string, action: (target: string, options: any) => Promise<void>) => {\n addRuntimeOptions(\n desktop\n .command(name)\n .description(description)\n .argument('<target>')\n .action(action),\n );\n };\n\n addDesktopCommand('status', 'Show desktop status for a VM or session', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n emitOutput(\n deps,\n options,\n payload,\n [\n `Session: ${payload.session_id || '-'}`,\n `VM: ${payload.vm_id || '-'}`,\n `Status: ${payload.vm_status || (payload.vm_alive ? 'active' : 'stopped')}`,\n ...(payload.viewer_url ? [`Viewer: ${payload.viewer_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('viewer', 'Get the noVNC viewer URL for a running desktop', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (!payload.session_id || !payload.vm_alive) {\n throw new Error('Desktop is not running.');\n }\n if (!payload.viewer_url) {\n Object.assign(payload, await client.computerUse.viewerUrl(String(payload.session_id)));\n }\n emitOutput(\n deps,\n options,\n payload,\n [\n `Session: ${payload.session_id}`,\n `VM: ${payload.vm_id || '-'}`,\n `Viewer URL: ${payload.viewer_url}`,\n ...(payload.websocket_url ? [`WebSocket: ${payload.websocket_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('start', 'Start a computer-use desktop for a session', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (payload.vm_alive) {\n emitOutput(\n deps,\n options,\n payload,\n [`Desktop already running: ${payload.vm_id || '-'}`, `Session: ${payload.session_id || '-'}`],\n );\n return;\n }\n if (!payload.session_id) {\n throw new Error('Desktop start requires a session-backed VM or session ID.');\n }\n const result = await client.vms.create({ session_id: String(payload.session_id), image_variant: 'computer-use' }, true);\n const merged = await desktopPayload(client, String(result.session_id || payload.session_id));\n Object.assign(merged, result);\n emitOutput(\n deps,\n options,\n merged,\n [\n `Desktop started: ${merged.vm_id || result.vm_id || '-'}`,\n `Session: ${merged.session_id || result.session_id || '-'}`,\n ...(merged.viewer_url ? [`Viewer: ${merged.viewer_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('stop', 'Stop a running desktop VM', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (!payload.vm_alive) {\n emitOutput(deps, options, payload, ['Desktop is already stopped.']);\n return;\n }\n const result = payload.session_id\n ? await client.kill(String(payload.session_id))\n : await client.vms.delete(String(payload.vm_id));\n emitOutput(\n deps,\n options,\n { session_id: payload.session_id, vm_id: payload.vm_id, ...result },\n [`Stopping ${payload.vm_id || payload.session_id}...`],\n );\n });\n\n const volume = program.command('volume').alias('volumes').description('Manage persistent volumes');\n\n addRuntimeOptions(\n volume\n .command('ls')\n .alias('list')\n .description('List volumes')\n .option('--refresh', 'Refresh usage before listing')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const volumes = await client.volumes.list(Boolean(options.refresh));\n emitOutput(\n deps,\n options,\n { volumes },\n volumes.length > 0\n ? volumes.map((entry) => `${entry.id}\\t${entry.name}\\t${humanBytes(entry.used_bytes)}/${humanBytes(entry.quota_bytes)}\\t${entry.status}`)\n : ['No volumes.'],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('get')\n .description('Get a volume')\n .argument('<volumeId>')\n .option('--refresh', 'Refresh usage before reading')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.get(volumeId, Boolean(options.refresh));\n emitOutput(\n deps,\n options,\n result,\n [\n `ID: ${result.id}`,\n `Name: ${result.name}`,\n `Status: ${result.status}`,\n `Quota: ${humanBytes(result.quota_bytes)}`,\n `Used: ${humanBytes(result.used_bytes)}`,\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('create')\n .description('Create a volume')\n .argument('<name>')\n .requiredOption('--quota <size>', 'Quota in bytes or units like 5gb')\n .action(async (name: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.create({ name, quota_bytes: parseSize(options.quota) });\n emitOutput(\n deps,\n options,\n result,\n [`Volume: ${result.id}`, `Name: ${result.name}`, `Quota: ${humanBytes(result.quota_bytes)}`],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('update')\n .description('Update a volume')\n .argument('<volumeId>')\n .option('--name <name>', 'Updated volume name')\n .option('--quota <size>', 'Updated quota in bytes or units like 5gb')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const payload: Record<string, any> = {};\n if (options.name) payload.name = options.name;\n if (options.quota) payload.quota_bytes = parseSize(options.quota);\n if (Object.keys(payload).length === 0) {\n throw new Error('Provide --name and/or --quota');\n }\n const result = await client.volumes.update(volumeId, payload);\n emitOutput(deps, options, result, [`Updated volume ${result.id || volumeId}`]);\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('rm')\n .alias('delete')\n .description('Delete a volume')\n .argument('<volumeId>')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.delete(volumeId);\n emitOutput(deps, options, { volume_id: volumeId, ...result }, [`Deleted ${volumeId}`]);\n }),\n );\n\n const checkpoint = volume.command('checkpoint').description('Manage checkpoints for a volume');\n\n addRuntimeOptions(\n checkpoint\n .command('ls')\n .alias('list')\n .description('List checkpoints for a volume')\n .argument('<volumeId>')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const checkpoints = await client.volumes.listCheckpoints(volumeId);\n emitOutput(\n deps,\n options,\n { checkpoints },\n checkpoints.length > 0\n ? checkpoints.map((entry) => `${entry.id}\\t${entry.name || '-'}\\t${entry.status || '-'}`)\n : ['No checkpoints.'],\n );\n }),\n );\n\n addRuntimeOptions(\n checkpoint\n .command('create')\n .description('Create a checkpoint for a volume')\n .argument('<volumeId>')\n .option('--name <name>', 'Checkpoint name')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.createCheckpoint(volumeId, options.name ? { name: options.name } : {});\n emitOutput(deps, options, result, [`Created checkpoint ${result.id || '-'}`]);\n }),\n );\n\n addRuntimeOptions(\n checkpoint\n .command('rm')\n .alias('delete')\n .description('Delete a checkpoint')\n .argument('<volumeId>')\n .argument('<checkpointId>')\n .action(async (volumeId: string, checkpointId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.deleteCheckpoint(volumeId, checkpointId);\n emitOutput(deps, options, { checkpoint_id: checkpointId, ...result }, [`Deleted checkpoint ${checkpointId}`]);\n }),\n );\n\n const files = volume.command('files').description('Manage files stored inside a volume');\n\n addRuntimeOptions(\n files\n .command('ls')\n .alias('list')\n .description('List files inside a volume')\n .argument('<volumeId>')\n .option('--prefix <prefix>', 'Path prefix filter')\n .option('--limit <limit>', 'Maximum number of entries', '1000')\n .option('--no-recursive', 'Do not recurse into subdirectories')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.listFiles(volumeId, {\n prefix: options.prefix || '',\n recursive: options.recursive,\n limit: Number.parseInt(options.limit, 10),\n });\n emitOutput(\n deps,\n options,\n { files: result },\n result.length > 0 ? result.map((entry) => `${entry.path}\\t${humanBytes(entry.size)}`) : ['No files.'],\n );\n }),\n );\n\n addRuntimeOptions(\n files\n .command('upload')\n .description('Upload a file into a volume')\n .argument('<volumeId>')\n .argument('<localPath>')\n .option('--path <remotePath>', 'Remote path inside the volume')\n .option('--overwrite', 'Overwrite if the path already exists')\n .action(async (volumeId: string, localPath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const remotePath = options.path || path.basename(localPath);\n const result = await client.volumes.uploadFile(volumeId, {\n filePath: localPath,\n path: remotePath,\n overwrite: Boolean(options.overwrite),\n });\n emitOutput(deps, options, result, [`Uploaded ${localPath} -> ${remotePath}`]);\n }),\n );\n\n addRuntimeOptions(\n files\n .command('download')\n .description('Download a file from a volume')\n .argument('<volumeId>')\n .argument('<remotePath>')\n .option('--out <outputPath>', 'Local output path')\n .action(async (volumeId: string, remotePath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.downloadFile(volumeId, remotePath);\n const outputPath = options.out || path.basename(remotePath);\n deps.writeFile(outputPath, result.content);\n emitOutput(\n deps,\n options,\n {\n path: result.path,\n filename: result.filename,\n size: result.size,\n local_path: outputPath,\n },\n [`Downloaded ${remotePath} -> ${outputPath}`],\n );\n }),\n );\n\n addRuntimeOptions(\n files\n .command('rm')\n .alias('delete')\n .description('Delete a file from a volume')\n .argument('<volumeId>')\n .argument('<remotePath>')\n .action(async (volumeId: string, remotePath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.deleteFile(volumeId, remotePath);\n emitOutput(deps, options, { path: remotePath, ...result }, [`Deleted ${remotePath}`]);\n }),\n );\n\n program\n .command('doc')\n .alias('docs')\n .description('Show InstaVM documentation links')\n .option('-j, --json', 'Emit JSON output')\n .action((options: any) => {\n emitOutput(deps, options, { url: DEFAULT_DOCS_URL }, [DEFAULT_DOCS_URL]);\n });\n\n program\n .command('billing')\n .description('Show the billing portal URL')\n .option('-j, --json', 'Emit JSON output')\n .action((options: any) => {\n emitOutput(deps, options, { url: DEFAULT_BILLING_URL }, [DEFAULT_BILLING_URL]);\n });\n\n return program;\n}\n\nexport async function runCli(argv: string[], deps: CliDeps = defaultDeps): Promise<number> {\n const program = createProgram(deps);\n try {\n await program.parseAsync(['node', 'instavm', ...argv]);\n return 0;\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code === 'commander.helpDisplayed') {\n return error.exitCode;\n }\n deps.stderr.write(`${error.message}\\n`);\n return error.exitCode || 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n deps.stderr.write(`Error: ${message}\\n`);\n return 1;\n }\n}\n\nfunction findExecutable(deps: CliDeps, binary: string): string | null {\n const result = deps.spawnSync(process.platform === 'win32' ? 'where' : 'which', [binary], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n if (result.status === 0) {\n const output = (result.stdout || '').toString().split(/\\r?\\n/).find(Boolean);\n return output || null;\n }\n return null;\n}\n\nasync function promptSecret(prompt: string): Promise<string> {\n if (!process.stdin.isTTY) {\n return '';\n }\n\n return new Promise<string>((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n let value = '';\n\n const cleanup = () => {\n stdin.removeListener('data', onData);\n stdin.pause();\n if (typeof stdin.setRawMode === 'function') {\n stdin.setRawMode(false);\n }\n stdout.write('\\n');\n };\n\n const onData = (chunk: Buffer | string) => {\n const input = chunk.toString('utf8');\n for (const character of input) {\n if (character === '\\u0003') {\n cleanup();\n reject(new Error('Interrupted.'));\n return;\n }\n if (character === '\\r' || character === '\\n') {\n cleanup();\n resolve(value);\n return;\n }\n if (character === '\\u007f') {\n value = value.slice(0, -1);\n continue;\n }\n value += character;\n }\n };\n\n stdout.write(prompt);\n stdin.resume();\n stdin.setEncoding('utf8');\n if (typeof stdin.setRawMode === 'function') {\n stdin.setRawMode(true);\n }\n stdin.on('data', onData);\n });\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return '';\n }\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n process.stdin.on('error', reject);\n });\n}\n\nasync function main(): Promise<void> {\n const exitCode = await runCli(process.argv.slice(2));\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n}\n\nif (require.main === module) {\n void main();\n}\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport FormData from 'form-data';\nimport {\n InstaVMError,\n AuthenticationError,\n RateLimitError,\n QuotaExceededError,\n NetworkError,\n} from '../errors/BaseError';\nimport { withRetry } from '../utils/retry';\nimport type { HttpClientConfig, RequestConfig } from '../types/api';\n\n/**\n * HTTP client with authentication, retry logic, and error handling\n */\nexport class HTTPClient {\n private client: AxiosInstance;\n private config: HttpClientConfig;\n\n get apiKey(): string {\n return this.config.apiKey;\n }\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n \n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': 'instavm-js-sdk/0.15.0',\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Request interceptor - add authentication\n this.client.interceptors.request.use(\n (config) => {\n // Add API key to headers for browser endpoints\n if (config.url?.includes('/browser/')) {\n config.headers['X-API-Key'] = this.config.apiKey;\n }\n \n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const axiosError = error;\n const status = axiosError.response?.status;\n const data = axiosError.response?.data;\n const message = data?.message || data?.error || data?.detail || axiosError.message;\n\n switch (status) {\n case 401:\n throw new AuthenticationError(message, {\n statusCode: status,\n response: data,\n });\n case 402:\n throw new QuotaExceededError(message, {\n statusCode: status,\n response: data,\n });\n case 429: {\n const retryAfter = parseInt(\n axiosError.response?.headers['retry-after'] || '60'\n );\n // Use detail from response if available, otherwise use default message\n const rateLimitMessage = data?.detail || message;\n throw new RateLimitError(rateLimitMessage, retryAfter, {\n statusCode: status,\n response: data,\n });\n }\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(message, {\n statusCode: status,\n response: data,\n });\n default:\n if (axiosError.code === 'ECONNABORTED') {\n throw new NetworkError('Request timeout', {\n code: axiosError.code,\n });\n }\n throw new InstaVMError(message, {\n statusCode: status,\n response: data,\n code: axiosError.code,\n });\n }\n }\n );\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n async request<T = any>(requestConfig: RequestConfig): Promise<T> {\n const axiosConfig: AxiosRequestConfig = {\n method: requestConfig.method,\n url: requestConfig.url,\n headers: requestConfig.headers,\n data: requestConfig.data,\n params: requestConfig.params,\n timeout: requestConfig.timeout || this.config.timeout,\n };\n\n const makeRequest = async (): Promise<T> => {\n const response: AxiosResponse<T> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n\n /**\n * POST request with JSON body\n */\n async post<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers,\n timeout,\n });\n }\n\n /**\n * POST request for code execution (uses X-API-Key header like Python client)\n */\n async postExecution<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n timeout,\n });\n }\n\n /**\n * POST request with form data (for file uploads)\n */\n async postFormData<T = any>(\n url: string,\n formData: FormData,\n headers?: Record<string, string>\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...formData.getHeaders(),\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: formData,\n headers: requestHeaders,\n });\n }\n\n /**\n * POST request with URL-encoded form data (like Python requests data= parameter)\n */\n async postFormUrlEncoded<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>\n ): Promise<T> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(data)) {\n params.append(key, String(value));\n }\n\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: params.toString(),\n headers: requestHeaders,\n });\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n url: string,\n params?: Record<string, any>,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url,\n params,\n headers,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n url: string,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url,\n headers,\n });\n }\n\n /**\n * PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url,\n data,\n headers,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n url,\n data,\n headers,\n });\n }\n\n /**\n * OPTIONS request\n */\n async options<T = any>(\n url: string,\n headers?: Record<string, string>,\n params?: Record<string, any>\n ): Promise<T> {\n return this.request<T>({\n method: 'OPTIONS',\n url,\n headers,\n params,\n });\n }\n\n /**\n * POST request that returns raw binary data (for file downloads)\n */\n async postRaw(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<ArrayBuffer> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n const axiosConfig: AxiosRequestConfig = {\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n responseType: 'arraybuffer',\n timeout: this.config.timeout,\n };\n\n const makeRequest = async (): Promise<ArrayBuffer> => {\n const response: AxiosResponse<ArrayBuffer> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n}\n","/**\n * Base error class for all InstaVM SDK errors\n */\nexport class InstaVMError extends Error {\n public readonly name: string;\n public readonly code?: string;\n public readonly statusCode?: number;\n public readonly response?: any;\n\n constructor(\n message: string,\n options?: {\n code?: string;\n statusCode?: number;\n response?: any;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = options?.code;\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n // Capture stack trace, excluding constructor call from it\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication-related errors (401, invalid API key, etc.)\n */\nexport class AuthenticationError extends InstaVMError {\n constructor(message: string = 'Authentication failed', options?: any) {\n super(message, { ...options, statusCode: 401 });\n }\n}\n\n/**\n * Rate limiting errors (429)\n */\nexport class RateLimitError extends InstaVMError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n options?: any\n ) {\n super(message, { ...options, statusCode: 429 });\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Quota/usage limit exceeded errors\n */\nexport class QuotaExceededError extends InstaVMError {\n constructor(message: string = 'Usage quota exceeded', options?: any) {\n super(message, { ...options, statusCode: 402 });\n }\n}\n\n/**\n * Network-related errors (timeouts, connection issues, 5xx errors)\n */\nexport class NetworkError extends InstaVMError {\n constructor(message: string = 'Network error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Code execution errors\n */\nexport class ExecutionError extends InstaVMError {\n public readonly executionOutput?: string;\n public readonly executionTime?: number;\n\n constructor(\n message: string,\n executionOutput?: string,\n executionTime?: number,\n options?: any\n ) {\n super(message, options);\n this.executionOutput = executionOutput;\n this.executionTime = executionTime;\n }\n}\n\n/**\n * Session management errors\n */\nexport class SessionError extends InstaVMError {\n constructor(message: string = 'Session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser automation base error\n */\nexport class BrowserError extends InstaVMError {\n constructor(message: string = 'Browser error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser session management errors\n */\nexport class BrowserSessionError extends BrowserError {\n constructor(message: string = 'Browser session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser interaction errors (click, type, etc.)\n */\nexport class BrowserInteractionError extends BrowserError {\n constructor(message: string = 'Browser interaction error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser timeout errors\n */\nexport class BrowserTimeoutError extends BrowserError {\n constructor(message: string = 'Browser operation timed out', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser navigation errors\n */\nexport class BrowserNavigationError extends BrowserError {\n constructor(message: string = 'Browser navigation error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Element not found errors\n */\nexport class ElementNotFoundError extends BrowserError {\n public readonly selector?: string;\n\n constructor(\n message: string = 'Element not found',\n selector?: string,\n options?: any\n ) {\n super(message, options);\n this.selector = selector;\n }\n}\n\n/**\n * Unsupported operation error (e.g., operations not available in local mode)\n */\nexport class UnsupportedOperationError extends InstaVMError {\n constructor(message: string = 'Operation not supported', options?: any) {\n super(message, options);\n }\n}","import { NetworkError, RateLimitError } from '../errors/BaseError';\n\nexport interface RetryOptions {\n retries: number;\n retryDelay: number;\n maxRetryDelay?: number;\n retryCondition?: (error: any) => boolean;\n}\n\n/**\n * Default retry condition - retry on network errors and 5xx server errors\n */\nexport function defaultRetryCondition(error: any): boolean {\n if (error instanceof NetworkError) return true;\n if (error instanceof RateLimitError) return true;\n \n // Axios error with status code\n if (error.response?.status >= 500) return true;\n \n // Network/timeout errors\n if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') return true;\n if (error.code === 'ECONNRESET' || error.code === 'ENOTFOUND') return true;\n \n return false;\n}\n\n/**\n * Calculate exponential backoff delay\n */\nexport function calculateRetryDelay(\n attempt: number,\n baseDelay: number,\n maxDelay = 30000\n): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const jitteredDelay = exponentialDelay * (0.5 + Math.random() * 0.5);\n return Math.min(jitteredDelay, maxDelay);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n const {\n retries,\n retryDelay,\n maxRetryDelay = 30000,\n retryCondition = defaultRetryCondition,\n } = options;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= retries + 1; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry on last attempt\n if (attempt === retries + 1) {\n break;\n }\n\n // Check if we should retry this error\n if (!retryCondition(error)) {\n break;\n }\n\n // Calculate delay for this attempt\n const delay = calculateRetryDelay(attempt, retryDelay, maxRetryDelay);\n \n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}","import { EventEmitter } from 'eventemitter3';\nimport type { HTTPClient } from './HTTPClient';\nimport {\n BrowserError,\n BrowserInteractionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport type {\n NavigateOptions,\n NavigationResult,\n ClickOptions,\n TypeOptions,\n FillOptions,\n ScrollOptions,\n ScreenshotOptions,\n WaitCondition,\n ExtractedElement,\n ExtractOptions,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Browser session for automation\n */\nexport class BrowserSession extends EventEmitter {\n public readonly sessionId: string;\n private httpClient: HTTPClient;\n private _isActive: boolean = true;\n\n constructor(sessionId: string, httpClient: HTTPClient) {\n super();\n this.sessionId = sessionId;\n this.httpClient = httpClient;\n }\n\n /**\n * Navigate to a URL\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n this.ensureActive();\n\n const requestData = {\n url,\n session_id: this.sessionId,\n wait_timeout: options.waitTimeout || 30000,\n wait_until: options.waitUntil || 'load',\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n const result: NavigationResult = {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n\n this.emit('navigation', result);\n return result;\n } catch (error) {\n const navigationError = new BrowserNavigationError(\n `Navigation failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n this.emit('error', navigationError);\n throw navigationError;\n }\n }\n\n /**\n * Click an element\n */\n async click(selector: string, options: ClickOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n button: options.button || 'left',\n click_count: options.clickCount || 1,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/click',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Click timeout: ${selector}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Click failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Type text into an element\n */\n async type(\n selector: string,\n text: string,\n options: TypeOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n text,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n delay: options.delay || 0,\n clear: options.clear !== false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/type',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Type failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Fill a form field\n */\n async fill(\n selector: string,\n value: string,\n options: FillOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n value,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/fill',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Fill failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Scroll the page\n */\n async scroll(options: ScrollOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n x: options.x || 0,\n y: options.y || 500,\n behavior: options.behavior || 'auto',\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/scroll',\n requestData\n );\n } catch (error) {\n throw new BrowserInteractionError(\n `Scroll failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Take a screenshot\n */\n async screenshot(options: ScreenshotOptions = {}): Promise<string> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n full_page: options.fullPage !== false,\n format: options.format || 'png',\n quality: options.quality || 90,\n clip: options.clip,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/screenshot',\n requestData\n );\n\n if (!response.screenshot) {\n throw new BrowserError('Screenshot data not returned');\n }\n\n return response.screenshot;\n } catch (error) {\n throw new BrowserInteractionError(\n `Screenshot failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract elements from the page\n */\n async extractElements(\n selector: string,\n attributes: string[] = ['text'],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n this.ensureActive();\n\n const requestData = {\n selector,\n attributes,\n session_id: this.sessionId,\n max_results: options.maxResults || 100,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/extract',\n requestData\n );\n\n return response.elements || [];\n } catch (error) {\n throw new BrowserInteractionError(\n `Element extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content from the current page\n *\n * Returns clean article content, interactive elements, and content anchors\n * for intelligent browser automation with LLMs.\n *\n * @param options - Content extraction options\n * @returns Extracted content with readable text, interactive elements, and content anchors\n *\n * @example\n * ```typescript\n * const content = await session.extractContent();\n *\n * // LLM reads clean content\n * const article = content.readableContent.content;\n *\n * // LLM finds \"Sign Up\" in content and uses anchors to get selector\n * const signUpAnchor = content.contentAnchors?.find(\n * anchor => anchor.text.toLowerCase().includes('sign up')\n * );\n * if (signUpAnchor) {\n * await session.click(signUpAnchor.selector);\n * }\n * ```\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n throw new BrowserInteractionError(\n `Content extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Wait for a condition\n */\n async wait(condition: WaitCondition, timeout = 10000): Promise<void> {\n this.ensureActive();\n\n let requestData: any = {\n session_id: this.sessionId,\n timeout,\n };\n\n if (condition.type === 'timeout') {\n // Simple timeout wait\n await new Promise(resolve => setTimeout(resolve, condition.ms));\n return;\n }\n\n requestData = {\n ...requestData,\n condition: condition.type,\n selector: 'selector' in condition ? condition.selector : undefined,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/wait',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Wait condition timeout: ${condition.type}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Wait failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close the browser session\n */\n async close(): Promise<void> {\n if (!this._isActive) {\n return;\n }\n\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${this.sessionId}`);\n } catch (error) {\n // Don't throw on close errors - session might already be closed\n console.warn(`Failed to close browser session ${this.sessionId}:`, getErrorMessage(error));\n } finally {\n this._isActive = false;\n this.emit('close');\n }\n }\n\n /**\n * Check if session is active\n */\n get isActive(): boolean {\n return this._isActive;\n }\n\n /**\n * Ensure session is active before operations\n */\n private ensureActive(): void {\n if (!this._isActive) {\n throw new BrowserError('Browser session is not active');\n }\n }\n}","import type { HTTPClient } from './HTTPClient';\nimport { BrowserSession } from './BrowserSession';\nimport { BrowserSessionError, BrowserNavigationError, BrowserInteractionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n BrowserSessionOptions,\n BrowserSessionInfo,\n NavigateOptions,\n NavigationResult,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\n/**\n * Browser automation manager\n */\nexport class BrowserManager {\n private httpClient: HTTPClient;\n private activeSessions: Map<string, BrowserSession> = new Map();\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n /**\n * Create a new browser session\n */\n async createSession(\n options: BrowserSessionOptions = {}\n ): Promise<BrowserSession> {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Browser session management is not supported in local mode. Use navigate() or extractContent() with URL directly.'\n );\n }\n\n const requestData = {\n viewport_width: options.viewportWidth || 1920,\n viewport_height: options.viewportHeight || 1080,\n user_agent: options.userAgent,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/sessions/',\n requestData\n );\n\n if (!response.session_id) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n\n const session = new BrowserSession(response.session_id, this.httpClient);\n this.activeSessions.set(response.session_id, session);\n\n // Clean up session from our tracking when it's closed\n session.on('close', () => {\n this.activeSessions.delete(response.session_id);\n });\n\n return session;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to create browser session: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get information about a specific session\n */\n async getSession(sessionId: string): Promise<BrowserSessionInfo> {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/browser/sessions/${sessionId}`\n );\n\n return {\n sessionId: response.session_id,\n status: response.status || 'active',\n createdAt: response.created_at,\n viewportWidth: response.viewport_width,\n viewportHeight: response.viewport_height,\n userAgent: response.user_agent,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to get session info: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * List all browser sessions\n */\n async listSessions(): Promise<BrowserSessionInfo[]> {\n try {\n const response = await this.httpClient.get<any>('/v1/browser/sessions/');\n\n if (!Array.isArray(response.sessions)) {\n return [];\n }\n\n return response.sessions.map((session: any) => ({\n sessionId: session.session_id,\n status: session.status || 'active',\n createdAt: session.created_at,\n viewportWidth: session.viewport_width,\n viewportHeight: session.viewport_height,\n userAgent: session.user_agent,\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(\n `Failed to list sessions: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get a locally tracked session\n */\n getLocalSession(sessionId: string): BrowserSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n /**\n * Get all locally tracked sessions\n */\n getLocalSessions(): BrowserSession[] {\n return Array.from(this.activeSessions.values());\n }\n\n /**\n * Close all active sessions\n */\n async closeAllSessions(): Promise<void> {\n const sessions = Array.from(this.activeSessions.values());\n \n await Promise.allSettled(\n sessions.map(session => session.close())\n );\n \n this.activeSessions.clear();\n }\n\n /**\n * Navigate to a URL (local mode support - no session required)\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n if (!this.local) {\n throw new UnsupportedOperationError(\n 'navigate() without session is only supported in local mode. In cloud mode, create a session first.'\n );\n }\n\n const requestData = {\n url,\n wait_timeout: options.waitTimeout || 30000,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n return {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(\n `Navigation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content (local mode support - no session required)\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n if (!this.local) {\n throw new UnsupportedOperationError(\n 'extractContent() without session is only supported in local mode. In cloud mode, create a session first.'\n );\n }\n\n if (!options.url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n\n const requestData = {\n url: options.url,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(\n `Content extraction failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n await this.closeAllSessions();\n }\n}","export function encodePathSegment(value: string | number): string {\n const segment = String(value);\n if (segment === '.' || segment === '..') {\n throw new Error('Path traversal not allowed in path segment');\n }\n return encodeURIComponent(segment);\n}\n\nexport function encodePathSegments(path: string): string {\n const segments = path\n .replace(/^\\/+/, '')\n .split('/')\n .filter((segment) => segment.length > 0 && segment !== '.');\n\n if (segments.some((segment) => segment === '..')) {\n throw new Error('Path traversal not allowed in proxy path');\n }\n\n return segments.map((segment) => encodeURIComponent(segment)).join('/');\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VMCreateRequest,\n VMUpdateRequest,\n VMCloneRequest,\n VMSnapshotRequest,\n VMVolumeMountRequest,\n VMMountedVolumeResponse,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VMsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VMCreateRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM creation');\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: '/v1/vms',\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listAll(): Promise<JsonMap[]> {\n return this.listAllRecords();\n }\n\n /**\n * Calls GET /v1/vms/ (trailing slash), a distinct route from GET /v1/vms.\n */\n async listAllRecords(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: string | number): Promise<JsonMap> {\n this.ensureCloud('VM lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<JsonMap>(\n `/v1/vms/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(vmId: string, payload: VMUpdateRequest = {}): Promise<JsonMap> {\n this.ensureCloud('VM update');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.patch<JsonMap>(\n `/v1/vms/${safeVmId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(vmId: string): Promise<JsonMap> {\n this.ensureCloud('VM deletion');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${safeVmId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async clone(vmId: string, payload: VMCloneRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM clone');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/clone`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async snapshot(vmId: string, payload: VMSnapshotRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM snapshot');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/snapshot`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async mountVolume(\n vmId: string,\n payload: VMVolumeMountRequest,\n wait: boolean = true\n ): Promise<VMMountedVolumeResponse> {\n this.ensureCloud('VM volume mount');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<VMMountedVolumeResponse>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/volumes`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async listVolumes(vmId: string): Promise<VMMountedVolumeResponse[]> {\n this.ensureCloud('VM volume listing');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.get<VMMountedVolumeResponse[]>(\n `/v1/vms/${safeVmId}/volumes`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async unmountVolume(\n vmId: string,\n volumeId: string,\n mountPath: string,\n wait: boolean = true\n ): Promise<JsonMap> {\n this.ensureCloud('VM volume unmount');\n const safeVmId = encodePathSegment(vmId);\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/vms/${safeVmId}/volumes/${safeVolumeId}`,\n params: { mount_path: mountPath, wait },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n SnapshotCreateRequest,\n SnapshotQueryOptions,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SnapshotsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: SnapshotCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Snapshot creation');\n return this.httpClient.post<JsonMap>(\n '/v1/snapshots',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(options: SnapshotQueryOptions = {}): Promise<JsonMap[]> {\n this.ensureCloud('Snapshot listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/snapshots',\n options,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot lookup');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.get<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot deletion');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.delete<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { SessionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n ShareCreateRequest,\n ShareUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SharesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getSessionId: () => string | null;\n\n constructor(\n httpClient: HTTPClient,\n local: boolean = false,\n getSessionId: () => string | null = () => null\n ) {\n this.httpClient = httpClient;\n this.local = local;\n this.getSessionId = getSessionId;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: ShareCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Share creation');\n\n const body: ShareCreateRequest = { ...payload };\n if (!body.session_id && !body.vm_id) {\n const sid = this.getSessionId();\n if (!sid) {\n throw new SessionError(\n 'Provide session_id/vm_id or create a session before creating a share.'\n );\n }\n body.session_id = sid;\n }\n\n return this.httpClient.post<JsonMap>(\n '/v1/shares',\n body,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(shareId: string, payload: ShareUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Share update');\n const safeShareId = encodePathSegment(shareId);\n return this.httpClient.patch<JsonMap>(\n `/v1/shares/${safeShareId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { JsonMap, CustomDomainCreateRequest } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class CustomDomainsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: CustomDomainCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Custom domain creation');\n return this.httpClient.post<JsonMap>(\n '/v1/custom-domains',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('Custom domain listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/custom-domains',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async health(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain health');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.get<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/health`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verify(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain verification');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.post<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain deletion');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.delete<JsonMap>(\n `/v1/custom-domains/${safeDomainId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { ComputerUseProxyOptions, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment, encodePathSegments } from '../utils/path';\n\ntype ProxyMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ComputerUseManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async viewerUrl(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use viewer URL');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/viewer-url`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async proxy(\n sessionId: string,\n path: string,\n method: ProxyMethod = 'GET',\n options: ComputerUseProxyOptions = {}\n ): Promise<any> {\n this.ensureCloud('Computer-use proxy');\n const safeSessionId = encodePathSegment(sessionId);\n const cleanPath = encodePathSegments(path);\n\n return this.httpClient.request<any>({\n method,\n url: `/v1/computeruse/${safeSessionId}/${cleanPath}`,\n params: options.params,\n data: options.body,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async get(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'GET', { params });\n }\n\n async post(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'POST', { body });\n }\n\n async put(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PUT', { body });\n }\n\n async patch(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PATCH', { body });\n }\n\n async delete(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'DELETE', { params });\n }\n\n async options(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'OPTIONS', { params });\n }\n\n async head(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'HEAD', { params });\n }\n\n /**\n * Get the VNC WebSocket URL for a computer-use session.\n * Returns the URL to connect to; the actual connection requires a WebSocket client.\n */\n async vncWebsockify(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use VNC websockify');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/vnc/websockify`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { APIKey, APIKeyCreateRequest, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class APIKeysManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: APIKeyCreateRequest = {}): Promise<APIKey> {\n this.ensureCloud('API key creation');\n return this.httpClient.post<APIKey>(\n '/v1/api-keys/',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<APIKey[]> {\n this.ensureCloud('API key listing');\n return this.httpClient.get<APIKey[]>(\n '/v1/api-keys/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: number): Promise<APIKey> {\n this.ensureCloud('API key lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(itemId: number, payload: APIKeyCreateRequest): Promise<APIKey> {\n this.ensureCloud('API key update');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.patch<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(itemId: number): Promise<JsonMap> {\n this.ensureCloud('API key deletion');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.delete<JsonMap>(\n `/v1/api-keys/${safeItemId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { AuditEventQuery, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class AuditManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async catalog(): Promise<JsonMap> {\n this.ensureCloud('Audit catalog');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/catalog',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async events(query: AuditEventQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Audit event listing');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/events',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEvent(eventId: string): Promise<JsonMap> {\n this.ensureCloud('Audit event lookup');\n const safeEventId = encodePathSegment(eventId);\n return this.httpClient.get<JsonMap>(\n `/v1/audit/events/${safeEventId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n WebhookDeliveryQuery,\n WebhookEndpointCreateRequest,\n WebhookEndpointUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class WebhooksManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async createEndpoint(payload: WebhookEndpointCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint creation');\n return this.httpClient.post<JsonMap>(\n '/v1/webhooks/endpoints',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listEndpoints(): Promise<JsonMap[]> {\n this.ensureCloud('Webhook endpoint listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/webhooks/endpoints',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint lookup');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.get<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async updateEndpoint(endpointId: string, payload: WebhookEndpointUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint update');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.patch<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint deletion');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.delete<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async rotateSecret(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook secret rotation');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/rotate-secret`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async sendTestEvent(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook test event');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/test`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verifyEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint verification');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listDeliveries(query: WebhookDeliveryQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery listing');\n return this.httpClient.get<JsonMap>(\n '/v1/webhooks/deliveries',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async replayDelivery(deliveryId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery replay');\n const safeDeliveryId = encodePathSegment(deliveryId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/deliveries/${safeDeliveryId}/replay`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport FormData from 'form-data';\nimport type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VolumeCreateRequest,\n VolumeUpdateRequest,\n VolumeResponse,\n VolumeCheckpointCreateRequest,\n VolumeCheckpointResponse,\n VolumeFileEntry,\n VolumeFileUploadRequest,\n VolumeFileDownloadResponse,\n VolumeFileListQuery,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VolumesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VolumeCreateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume creation');\n\n return this.httpClient.post<VolumeResponse>(\n '/v1/volumes',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(refreshUsage: boolean = false): Promise<VolumeResponse[]> {\n this.ensureCloud('Volume listing');\n\n return this.httpClient.get<VolumeResponse[]>(\n '/v1/volumes',\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(volumeId: string, refreshUsage: boolean = false): Promise<VolumeResponse> {\n this.ensureCloud('Volume lookup');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(volumeId: string, payload: VolumeUpdateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume update');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.patch<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(volumeId: string): Promise<JsonMap> {\n this.ensureCloud('Volume deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async createCheckpoint(\n volumeId: string,\n payload: VolumeCheckpointCreateRequest = {}\n ): Promise<VolumeCheckpointResponse> {\n this.ensureCloud('Volume checkpoint creation');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.post<VolumeCheckpointResponse>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listCheckpoints(volumeId: string): Promise<VolumeCheckpointResponse[]> {\n this.ensureCloud('Volume checkpoint listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeCheckpointResponse[]>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteCheckpoint(volumeId: string, checkpointId: string): Promise<JsonMap> {\n this.ensureCloud('Volume checkpoint deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n const safeCheckpointId = encodePathSegment(checkpointId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}/checkpoints/${safeCheckpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async uploadFile(volumeId: string, payload: VolumeFileUploadRequest): Promise<VolumeFileEntry> {\n this.ensureCloud('Volume file upload');\n\n if (!payload.path || payload.path.trim().length === 0) {\n throw new Error('payload.path is required');\n }\n\n const hasFilePath = typeof payload.filePath === 'string' && payload.filePath.length > 0;\n const hasFileContent = payload.fileContent !== undefined;\n\n if (hasFilePath === hasFileContent) {\n throw new Error('Provide exactly one of payload.filePath or payload.fileContent');\n }\n\n const safeVolumeId = encodePathSegment(volumeId);\n const formData = new FormData();\n\n if (hasFilePath) {\n const sourcePath = payload.filePath as string;\n const filename = payload.filename || path.basename(sourcePath);\n formData.append('file', fs.createReadStream(sourcePath), { filename });\n } else {\n const filename = payload.filename || 'upload.bin';\n const raw = payload.fileContent as Buffer | string;\n const buffer = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n formData.append('file', buffer, { filename });\n }\n\n formData.append('path', payload.path);\n if (payload.overwrite !== undefined) {\n formData.append('overwrite', String(payload.overwrite));\n }\n\n return this.httpClient.postFormData<VolumeFileEntry>(\n `/v1/volumes/${safeVolumeId}/files/upload`,\n formData\n );\n }\n\n async downloadFile(volumeId: string, path: string): Promise<VolumeFileDownloadResponse> {\n this.ensureCloud('Volume file download');\n const safeVolumeId = encodePathSegment(volumeId);\n\n const response = await this.httpClient.post<{\n path: string;\n filename: string;\n size: number;\n content: string;\n }>(\n `/v1/volumes/${safeVolumeId}/files/download`,\n { path },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n path: response.path,\n filename: response.filename,\n size: response.size,\n content: Buffer.from(response.content || '', 'base64'),\n };\n }\n\n async listFiles(\n volumeId: string,\n options: VolumeFileListQuery = {}\n ): Promise<VolumeFileEntry[]> {\n this.ensureCloud('Volume file listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeFileEntry[]>(\n `/v1/volumes/${safeVolumeId}/files`,\n {\n prefix: options.prefix ?? '',\n recursive: options.recursive ?? true,\n limit: options.limit ?? 1000,\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteFile(volumeId: string, targetPath: string): Promise<JsonMap> {\n this.ensureCloud('Volume file deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/volumes/${safeVolumeId}/files`,\n params: { path: targetPath },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import { HTTPClient } from './HTTPClient';\nimport { BrowserManager } from './BrowserManager';\nimport { VMsManager } from './VMsManager';\nimport { SnapshotsManager } from './SnapshotsManager';\nimport { SharesManager } from './SharesManager';\nimport { CustomDomainsManager } from './CustomDomainsManager';\nimport { ComputerUseManager } from './ComputerUseManager';\nimport { APIKeysManager } from './APIKeysManager';\nimport { AuditManager } from './AuditManager';\nimport { WebhooksManager } from './WebhooksManager';\nimport { VolumesManager } from './VolumesManager';\nimport FormData from 'form-data';\nimport {\n SessionError,\n ExecutionError,\n UnsupportedOperationError,\n AuthenticationError,\n RateLimitError,\n NetworkError,\n} from '../errors/BaseError';\nimport type {\n ExecuteOptions,\n ExecutionResult,\n AsyncExecutionResult,\n TaskResult,\n FileUpload,\n UploadOptions,\n UploadResult,\n UsageStats,\n DownloadOptions,\n DownloadResult,\n} from '../types/execution';\nimport type { EgressPolicy, EgressPolicyOptions } from '../types/egress';\nimport type { SSHKey } from '../types/ssh';\nimport type { CurrentUserResponse, SessionStatusResponse } from '../types/account';\n\nexport interface InstaVMOptions {\n baseURL?: string;\n /**\n * Timeout in milliseconds. Used for HTTP request timeout and sent to API as VM lifetime (in seconds).\n * Default: 300000 (5 minutes)\n */\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n local?: boolean;\n localURL?: string;\n /** VM memory in megabytes (optional). Range: 128-8192 MB */\n memory_mb?: number;\n /** VM vCPU count (optional). Valid values: 1, 2, 4, 6, 8 */\n cpu_count?: number;\n /** Optional user-defined metadata for filtering */\n metadata?: Record<string, any>;\n /** Optional environment variables to set in the VM */\n env?: Record<string, any>;\n}\n\n/**\n * Main InstaVM client class\n */\nexport class InstaVM {\n private httpClient: HTTPClient;\n private _sessionId: string | null = null;\n public readonly browser: BrowserManager;\n public readonly vms: VMsManager;\n public readonly snapshots: SnapshotsManager;\n public readonly shares: SharesManager;\n public readonly customDomains: CustomDomainsManager;\n public readonly computerUse: ComputerUseManager;\n public readonly apiKeys: APIKeysManager;\n public readonly audit: AuditManager;\n public readonly webhooks: WebhooksManager;\n public readonly volumes: VolumesManager;\n public readonly local: boolean;\n private readonly timeout: number;\n public readonly memory_mb?: number;\n public readonly cpu_count?: number;\n public readonly metadata?: Record<string, any>;\n public readonly env?: Record<string, any>;\n private _vmUsed: boolean = false;\n\n constructor(apiKey: string, options: InstaVMOptions = {}) {\n this.local = options.local || false;\n this.timeout = options.timeout || 300000; // 300000 milliseconds (5 minutes)\n this.memory_mb = options.memory_mb;\n this.cpu_count = options.cpu_count;\n this.metadata = options.metadata;\n this.env = options.env;\n\n // In local mode, API key is optional\n if (!this.local && !apiKey) {\n throw new AuthenticationError('API key is required for cloud mode');\n }\n\n const config = {\n baseURL: this.local\n ? (options.localURL || 'http://coderunner.local:8222')\n : (options.baseURL || 'https://api.instavm.io'),\n timeout: this.timeout,\n maxRetries: options.maxRetries || 3,\n retryDelay: options.retryDelay || 1000,\n apiKey: apiKey || '',\n };\n\n this.httpClient = new HTTPClient(config);\n this.browser = new BrowserManager(this.httpClient, this.local);\n this.vms = new VMsManager(this.httpClient, this.local);\n this.snapshots = new SnapshotsManager(this.httpClient, this.local);\n this.shares = new SharesManager(this.httpClient, this.local, () => this._sessionId);\n this.customDomains = new CustomDomainsManager(this.httpClient, this.local);\n this.computerUse = new ComputerUseManager(this.httpClient, this.local);\n this.apiKeys = new APIKeysManager(this.httpClient, this.local);\n this.audit = new AuditManager(this.httpClient, this.local);\n this.webhooks = new WebhooksManager(this.httpClient, this.local);\n this.volumes = new VolumesManager(this.httpClient, this.local);\n }\n\n /**\n * Ensure operation is not called in local mode\n */\n private ensureNotLocal(operationName: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operationName} is not supported in local mode. This operation is only available when using the cloud API.`\n );\n }\n }\n\n /**\n * Execute code synchronously\n *\n * @param command - Command to execute\n * @param options - Execution options\n * @param options.timeout - Request timeout in milliseconds (used for HTTP request timeout and sent to API in seconds)\n * @returns Execution result\n */\n async execute(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<ExecutionResult> {\n // In local mode, session_id is not required\n let sessionId = options.sessionId || this._sessionId;\n if (!this.local && !sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData: any = {\n command,\n language: options.language || 'python',\n };\n\n // Add timeout to request data if provided (convert milliseconds to seconds for API)\n if (options.timeout !== undefined) {\n requestData.timeout = Math.floor(options.timeout / 1000);\n }\n\n // Only include session_id in cloud mode\n if (!this.local && sessionId) {\n requestData.session_id = sessionId;\n }\n\n // Use custom timeout for this request, or fall back to instance default (in milliseconds)\n const requestTimeout = options.timeout !== undefined ? options.timeout : this.timeout;\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute',\n requestData,\n undefined,\n requestTimeout\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n if (!this.local) {\n this._vmUsed = true;\n }\n\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n success: response.success !== false,\n executionTime: response.execution_time,\n cpuTime: response.cpu_time,\n createdAt: response.created_at,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Execute code asynchronously\n */\n async executeAsync(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<AsyncExecutionResult> {\n this.ensureNotLocal('Async execution');\n\n // Auto-create session if none exists (like Python client)\n let sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData = {\n command,\n language: options.language || 'python',\n timeout: options.timeout || 15,\n session_id: sessionId,\n };\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute_async',\n requestData\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n this._vmUsed = true;\n\n return {\n taskId: response.task_id,\n status: response.status || 'pending',\n output: response.stdout || response.output,\n success: response.success,\n executionTime: response.execution_time,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Async code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Poll for async task result\n *\n * @param taskId - The task ID from executeAsync\n * @param pollInterval - Seconds between polls (default: 1)\n * @param timeout - Maximum seconds to wait (default: 60)\n * @returns Task result with stdout, stderr, execution time, etc.\n * @throws Error if task doesn't complete within timeout\n */\n async getTaskResult(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 60\n ): Promise<TaskResult> {\n this.ensureNotLocal('Async task result retrieval');\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout * 1000) {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/executions/${taskId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n if (response.is_complete) {\n // Output is already decoded as string (not base64 despite field name)\n return {\n stdout: response.serialized_stdout || '',\n stderr: response.serialized_stderr || '',\n cpuTime: response.cpu_time,\n executionTime: response.execution_time,\n createdAt: response.created_at,\n };\n }\n\n // Wait before polling again\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n } catch (error) {\n // Don't retry on auth, rate limit, or network errors\n if (\n error instanceof AuthenticationError ||\n error instanceof RateLimitError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Continue polling on transient errors\n if (Date.now() - startTime >= timeout * 1000) {\n throw new ExecutionError(\n `Failed to get task result: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n }\n }\n\n throw new ExecutionError(`Task ${taskId} timed out after ${timeout}s`);\n }\n\n /**\n * Upload files to the execution environment\n */\n async upload(\n files: FileUpload[],\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureNotLocal('File upload');\n\n // Require explicit session (matches Python SDK behavior)\n const sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n throw new SessionError('Session ID not set. Please create a session first using createSession().');\n }\n\n const formData = new FormData();\n\n // Add files to form data\n for (const file of files) {\n if (Buffer.isBuffer(file.content)) {\n formData.append('files', file.content, file.name);\n } else {\n formData.append('files', Buffer.from(file.content), file.name);\n }\n\n if (file.path) {\n formData.append('paths', file.path);\n }\n }\n\n // Add options\n formData.append('session_id', sessionId);\n if (options.remotePath) {\n formData.append('remote_path', options.remotePath);\n }\n if (options.recursive !== undefined) {\n formData.append('recursive', String(options.recursive));\n }\n\n try {\n const response = await this.httpClient.postFormData<any>(\n '/upload',\n formData\n );\n\n return {\n success: response.success !== false,\n files: response.files || [],\n message: response.message,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File upload failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Create a new execution session\n */\n async createSession(): Promise<string> {\n this.ensureNotLocal('Session management');\n\n try {\n // Send API key and VM lifetime in JSON body for session creation\n // Convert timeout from milliseconds to seconds for the API\n const requestBody: Record<string, any> = {\n api_key: this.httpClient.apiKey,\n vm_lifetime_seconds: Math.floor(this.timeout / 1000),\n };\n\n if (this.memory_mb !== undefined) {\n requestBody.memory_mb = this.memory_mb;\n }\n if (this.cpu_count !== undefined) {\n requestBody.vcpu_count = this.cpu_count;\n }\n if (this.metadata !== undefined) {\n requestBody.metadata = this.metadata;\n }\n if (this.env !== undefined) {\n requestBody.env = this.env;\n }\n\n const response = await this.httpClient.post<any>(\n '/v1/sessions/session',\n requestBody\n );\n\n if (response.session_id) {\n this._sessionId = response.session_id;\n return response.session_id;\n }\n\n throw new SessionError('Session creation failed: No session ID returned');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Session creation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close a session\n * Note: Sessions auto-expire on the server side. This just clears local state.\n */\n async closeSession(sessionId?: string): Promise<void> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return; // No session to close\n }\n\n // Clear local session state\n // Sessions will auto-expire on server side, no API call needed\n if (targetSessionId === this._sessionId) {\n this._sessionId = null;\n }\n }\n\n /**\n * Check if current session is still active by checking VM status\n *\n * @returns true if session is active, false otherwise\n */\n async isSessionActive(sessionId?: string): Promise<boolean> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return false;\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response.vm_status === 'active';\n } catch (error) {\n if (\n error instanceof SessionError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return false;\n }\n return false;\n }\n }\n\n /**\n * Get the app URL for a session\n *\n * @param sessionId - Session ID (uses current session if not provided)\n * @param port - Port to expose (1-65535, default: 80)\n */\n async getSessionAppUrl(\n sessionId?: string,\n port?: number\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Session app URL');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const params: Record<string, any> = {};\n if (port !== undefined) {\n params.port = port;\n }\n\n return this.httpClient.get<Record<string, any>>(\n `/v1/sessions/app-url/${targetSessionId}`,\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * List sandbox records with optional filtering\n *\n * @param options.metadata - JSON-serializable metadata filters\n * @param options.limit - Maximum number of results (1-1000, default: 100)\n */\n async listSandboxes(options: {\n metadata?: Record<string, any>;\n limit?: number;\n } = {}): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Sandbox listing');\n\n const params: Record<string, any> = {};\n if (options.metadata !== undefined) {\n params.metadata = JSON.stringify(options.metadata);\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n return this.httpClient.get<Record<string, any>[]>(\n '/v1/sessions/sandboxes',\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get usage statistics for a session\n */\n async getUsage(sessionId?: string): Promise<UsageStats> {\n this.ensureNotLocal('Usage tracking');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to get usage for');\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/usage/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n sessionsUsed: response.sessions_used || 0,\n executionTime: response.execution_time || 0,\n quotaRemaining: response.quota_remaining || 0,\n quotaLimit: response.quota_limit || 0,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to get usage stats: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current user profile.\n */\n async getCurrentUser(): Promise<CurrentUserResponse> {\n this.ensureNotLocal('User profile lookup');\n\n return this.httpClient.get<CurrentUserResponse>(\n '/v1/me',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get the current status of a session.\n */\n async getSessionStatus(sessionId?: string): Promise<SessionStatusResponse> {\n this.ensureNotLocal('Session management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n return this.httpClient.get<SessionStatusResponse>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Download a file from the remote VM\n */\n async download(\n filename: string,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n this.ensureNotLocal('File download');\n\n const targetSessionId = options.sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to download from');\n }\n\n try {\n // Use postFormUrlEncoded to match Python SDK behavior (sends form-urlencoded data)\n const response = await this.httpClient.postFormUrlEncoded<any>('/download', {\n filename,\n session_id: targetSessionId,\n });\n\n // Parse and decode base64 content from JSON response\n const encodedContent = response.content || '';\n const content = encodedContent\n ? Buffer.from(encodedContent, 'base64')\n : Buffer.from(response); // Fallback for backward compatibility\n\n return {\n success: true,\n filename,\n content,\n size: content.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File download failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current session ID\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Kill the VM associated with a session\n *\n * @param sessionId - The session UUID whose VM should be killed. If not provided, uses current sessionId\n * @returns Result containing success message and killed VM ID\n */\n async kill(sessionId?: string): Promise<{ success: boolean; killed: string }> {\n this.ensureNotLocal('VM kill operation');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please provide a sessionId or start a session first.');\n }\n\n try {\n const response = await this.httpClient.post<{ success: boolean; killed: string }>(\n '/kill',\n { session_id: targetSessionId },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n // Clear session_id if we killed the current session\n if (!sessionId && this._sessionId === targetSessionId) {\n this._sessionId = null;\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && 'statusCode' in error) {\n const statusCode = (error as { statusCode?: number }).statusCode;\n if (statusCode === 403) {\n throw new AuthenticationError(\"You don't own this session\", { cause: error });\n }\n if (statusCode === 404) {\n throw new SessionError(\"Session not found or no VM assigned to session (has execute() been called?)\", { cause: error });\n }\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to kill VM: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n // --- Egress Policy Methods ---\n\n /**\n * Set egress policy for a session\n */\n async setSessionEgress(\n options: EgressPolicyOptions = {},\n sessionId?: string\n ): Promise<{ status: string; sessionId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const response = await this.httpClient.post<any>(\n `/v1/egress/session/${targetSessionId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a session\n */\n async getSessionEgress(sessionId?: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const response = await this.httpClient.get<any>(\n `/v1/egress/session/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n /**\n * Set egress policy for a specific VM\n */\n async setVmEgress(\n vmId: string,\n options: EgressPolicyOptions = {}\n ): Promise<{ status: string; vmId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const response = await this.httpClient.post<any>(\n `/v1/egress/vm/${vmId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a specific VM\n */\n async getVmEgress(vmId: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const response = await this.httpClient.get<any>(\n `/v1/egress/vm/${vmId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n // --- SSH Key Methods ---\n\n /**\n * Add an SSH public key\n */\n async addSshKey(publicKey: string): Promise<SSHKey> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.post<any>(\n '/v1/ssh-keys',\n { public_key: publicKey },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n id: response.id,\n fingerprint: response.fingerprint,\n keyType: response.key_type,\n comment: response.comment ?? null,\n createdAt: response.created_at,\n };\n }\n\n /**\n * List all active SSH keys\n */\n async listSshKeys(): Promise<SSHKey[]> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.get<any>(\n '/v1/ssh-keys',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n const keys = response.keys || [];\n return keys.map((k: any) => ({\n id: k.id,\n fingerprint: k.fingerprint,\n keyType: k.key_type,\n comment: k.comment ?? null,\n createdAt: k.created_at,\n }));\n }\n\n /**\n * Delete an SSH key by ID\n */\n async deleteSshKey(keyId: number): Promise<{ status: string }> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.delete<any>(\n `/v1/ssh-keys/${keyId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n if (this._sessionId && !this.local && this._vmUsed) {\n try {\n await this.kill();\n } catch (e) {\n // Ignore kill errors during disposal\n }\n } else if (this._sessionId) {\n await this.closeSession();\n }\n await this.browser.dispose();\n }\n}\n","import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { URL } from 'url';\n\nexport const CONFIG_DIRNAME = '.instavm';\nexport const CONFIG_FILENAME = 'config.json';\nexport const SCHEMA_VERSION = 1;\n\nexport const DEFAULT_BASE_URL = 'https://api.instavm.io';\nexport const DEFAULT_DOCS_URL = 'https://docs.instavm.io';\nexport const DEFAULT_BILLING_URL = 'https://dashboard.instavm.io/billing';\nexport const DEFAULT_SSH_HOST = 'instavm.dev';\n\nexport interface ProfileConfig {\n auth: Record<string, any>;\n base_url?: string;\n ssh_host?: string;\n [key: string]: any;\n}\n\nexport interface CLIConfig {\n schema_version: number;\n active_profile: string;\n profiles: Record<string, ProfileConfig>;\n}\n\nexport interface RuntimeConfig {\n apiKey?: string;\n baseURL: string;\n sshHost: string;\n apiKeySource: 'flag' | 'env' | 'config' | 'missing';\n baseURLSource: 'flag' | 'env' | 'config' | 'default';\n sshHostSource: 'flag' | 'env' | 'config' | 'derived';\n configPath: string;\n config: CLIConfig;\n}\n\nexport class ConfigError extends Error {}\n\nexport function getConfigDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, CONFIG_DIRNAME);\n}\n\nexport function getConfigPath(homeDir: string = os.homedir()): string {\n return path.join(getConfigDir(homeDir), CONFIG_FILENAME);\n}\n\nexport function defaultConfig(): CLIConfig {\n return {\n schema_version: SCHEMA_VERSION,\n active_profile: 'default',\n profiles: {\n default: {\n auth: {\n type: 'api_key',\n api_key: null,\n },\n },\n },\n };\n}\n\nfunction normalizeProfile(profile: Record<string, any>): ProfileConfig {\n const normalized = { ...profile } as ProfileConfig;\n const auth = typeof profile.auth === 'object' && profile.auth !== null ? { ...profile.auth } : {};\n auth.type = String(auth.type || 'api_key').trim() || 'api_key';\n auth.api_key = auth.api_key ? String(auth.api_key).trim() : null;\n normalized.auth = auth;\n\n for (const field of ['base_url', 'ssh_host']) {\n const rawValue = normalized[field];\n if (typeof rawValue !== 'string') {\n delete normalized[field];\n continue;\n }\n const cleaned = rawValue.trim();\n if (cleaned) {\n normalized[field] = cleaned;\n } else {\n delete normalized[field];\n }\n }\n\n return normalized;\n}\n\nexport function normalizeConfig(rawConfig?: Record<string, any> | null): CLIConfig {\n const config = defaultConfig();\n if (!rawConfig || typeof rawConfig !== 'object') {\n return config;\n }\n\n if (Number.isInteger(rawConfig.schema_version)) {\n config.schema_version = Number(rawConfig.schema_version);\n }\n\n if (rawConfig.profiles && typeof rawConfig.profiles === 'object') {\n config.profiles = {};\n for (const [name, profile] of Object.entries(rawConfig.profiles)) {\n if (typeof name === 'string' && profile && typeof profile === 'object') {\n config.profiles[name] = normalizeProfile(profile as Record<string, any>);\n }\n }\n }\n\n if (!config.profiles.default) {\n config.profiles.default = defaultConfig().profiles.default;\n }\n\n if (\n typeof rawConfig.active_profile === 'string' &&\n Object.prototype.hasOwnProperty.call(config.profiles, rawConfig.active_profile)\n ) {\n config.active_profile = rawConfig.active_profile;\n }\n\n return config;\n}\n\nexport function loadConfig(configPath: string = getConfigPath()): CLIConfig {\n if (!fs.existsSync(configPath)) {\n return defaultConfig();\n }\n\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n return normalizeConfig(JSON.parse(raw));\n } catch (error) {\n throw new ConfigError(`Unable to load CLI config from ${configPath}`);\n }\n}\n\nfunction applyPosixMode(targetPath: string, mode: number): void {\n if (process.platform !== 'win32') {\n fs.chmodSync(targetPath, mode);\n }\n}\n\nexport function saveConfig(config: CLIConfig, configPath: string = getConfigPath()): string {\n const configDir = path.dirname(configPath);\n\n try {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n applyPosixMode(configDir, 0o700);\n\n const normalized = normalizeConfig(config);\n const tempPath = path.join(configDir, `.${path.basename(configPath)}.${process.pid}.${Date.now()}.tmp`);\n fs.writeFileSync(tempPath, `${JSON.stringify(normalized, null, 2)}\\n`, 'utf8');\n applyPosixMode(tempPath, 0o600);\n fs.renameSync(tempPath, configPath);\n applyPosixMode(configPath, 0o600);\n } catch (error) {\n throw new ConfigError(`Unable to write CLI config to ${configPath}`);\n }\n\n return configPath;\n}\n\nexport function getActiveProfile(config: CLIConfig): ProfileConfig {\n return config.profiles[config.active_profile] || config.profiles.default;\n}\n\nexport function redactSecret(secret?: string | null): string | null {\n if (!secret) {\n return null;\n }\n const trimmed = secret.trim();\n if (trimmed.length <= 8) {\n return '*'.repeat(trimmed.length);\n }\n return `${trimmed.slice(0, 8)}...${trimmed.slice(-4)}`;\n}\n\nexport function deriveSshHost(baseURL: string): string {\n try {\n const parsed = new URL(baseURL);\n const host = parsed.hostname.trim().toLowerCase();\n if (!host) {\n return DEFAULT_SSH_HOST;\n }\n if (host === 'localhost' || host === '127.0.0.1') {\n return host;\n }\n if (host.includes('staging') && host.includes('instavm')) {\n return 'staging.instavm.dev';\n }\n if (host.startsWith('api.') && host.includes('instavm')) {\n return DEFAULT_SSH_HOST;\n }\n if (host.includes('instavm')) {\n return DEFAULT_SSH_HOST;\n }\n return host;\n } catch (error) {\n return DEFAULT_SSH_HOST;\n }\n}\n\nexport function resolveRuntimeConfig(options: {\n apiKey?: string;\n baseURL?: string;\n sshHost?: string;\n env?: NodeJS.ProcessEnv;\n configPath?: string;\n config?: CLIConfig;\n} = {}): RuntimeConfig {\n const env = options.env || process.env;\n const configPath = options.configPath || getConfigPath();\n const config = normalizeConfig(options.config || loadConfig(configPath));\n const profile = getActiveProfile(config);\n const storedKey = profile.auth?.api_key ? String(profile.auth.api_key).trim() : undefined;\n\n let apiKey: string | undefined;\n let apiKeySource: RuntimeConfig['apiKeySource'] = 'missing';\n if (options.apiKey) {\n apiKey = options.apiKey.trim();\n apiKeySource = 'flag';\n } else if (env.INSTAVM_API_KEY) {\n apiKey = env.INSTAVM_API_KEY.trim();\n apiKeySource = 'env';\n } else if (storedKey) {\n apiKey = storedKey;\n apiKeySource = 'config';\n }\n\n let baseURL = DEFAULT_BASE_URL;\n let baseURLSource: RuntimeConfig['baseURLSource'] = 'default';\n if (options.baseURL) {\n baseURL = options.baseURL.trim();\n baseURLSource = 'flag';\n } else if (env.INSTAVM_BASE_URL) {\n baseURL = env.INSTAVM_BASE_URL.trim();\n baseURLSource = 'env';\n } else if (profile.base_url) {\n baseURL = String(profile.base_url).trim();\n baseURLSource = 'config';\n }\n\n let sshHost = deriveSshHost(baseURL);\n let sshHostSource: RuntimeConfig['sshHostSource'] = 'derived';\n if (options.sshHost) {\n sshHost = options.sshHost.trim();\n sshHostSource = 'flag';\n } else if (env.INSTAVM_SSH_HOST) {\n sshHost = env.INSTAVM_SSH_HOST.trim();\n sshHostSource = 'env';\n } else if (profile.ssh_host) {\n sshHost = String(profile.ssh_host).trim();\n sshHostSource = 'config';\n }\n\n return {\n apiKey,\n baseURL,\n sshHost,\n apiKeySource,\n baseURLSource,\n sshHostSource,\n configPath,\n config,\n };\n}\n\nexport function updateProfileSettings(options: {\n apiKey?: string;\n clearApiKey?: boolean;\n baseURL?: string;\n sshHost?: string;\n configPath?: string;\n}): string {\n const configPath = options.configPath || getConfigPath();\n const config = loadConfig(configPath);\n const profileName = config.active_profile || 'default';\n const existing = config.profiles[profileName] || { auth: { type: 'api_key', api_key: null } };\n const profile = normalizeProfile(existing);\n const auth = { ...(profile.auth || {}) };\n auth.type = String(auth.type || 'api_key');\n\n if (options.clearApiKey) {\n auth.api_key = null;\n } else if (options.apiKey !== undefined) {\n auth.api_key = options.apiKey.trim() || null;\n }\n\n if (options.baseURL !== undefined) {\n const cleaned = options.baseURL.trim();\n if (cleaned) {\n profile.base_url = cleaned;\n } else {\n delete profile.base_url;\n }\n }\n\n if (options.sshHost !== undefined) {\n const cleaned = options.sshHost.trim();\n if (cleaned) {\n profile.ssh_host = cleaned;\n } else {\n delete profile.ssh_host;\n }\n }\n\n profile.auth = auth;\n config.profiles[profileName] = profile;\n return saveConfig(config, configPath);\n}\n"],"mappings":"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","names":["import_fs","import_path","axios","path","path","import_path","FormData","path","fs","import_form_data","FormData","import_fs","import_path","os","path","fs","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/config.ts","../src/cli/cookbook.ts","../src/cli/vaultCookbook.ts","../src/cli.ts","../src/client/HTTPClient.ts","../src/errors/BaseError.ts","../src/utils/retry.ts","../src/version.ts","../src/client/BrowserSession.ts","../src/utils/path.ts","../src/client/BrowserManager.ts","../src/client/VMsManager.ts","../src/client/SnapshotsManager.ts","../src/client/SharesManager.ts","../src/client/CustomDomainsManager.ts","../src/client/ComputerUseManager.ts","../src/client/APIKeysManager.ts","../src/client/AuditManager.ts","../src/client/WebhooksManager.ts","../src/client/VolumesManager.ts","../src/client/TapesManager.ts","../src/client/VaultsManager.ts","../src/client/PTYManager.ts","../src/client/RecordingsManager.ts","../src/client/CreditsManager.ts","../src/client/TapeContext.ts","../src/client/ToolCallRecorder.ts","../src/client/InstaVM.ts","../src/cli/billing.ts","../src/cli/login.ts","../src/cli/pty.ts","../src/cli/tape.ts","../src/cli/vault.ts","../src/cli/detect.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { URL } from 'url';\n\nexport const CONFIG_DIRNAME = '.instavm';\nexport const CONFIG_FILENAME = 'config.json';\nexport const SCHEMA_VERSION = 1;\n\nexport const DEFAULT_BASE_URL = 'https://api.instavm.io';\nexport const DEFAULT_DOCS_URL = 'https://docs.instavm.io';\nexport const DEFAULT_BILLING_URL = 'https://dashboard.instavm.io/billing';\nexport const DEFAULT_SSH_HOST = 'instavm.dev';\n\nexport interface ProfileConfig {\n auth: Record<string, any>;\n base_url?: string;\n ssh_host?: string;\n [key: string]: any;\n}\n\nexport interface CLIConfig {\n schema_version: number;\n active_profile: string;\n profiles: Record<string, ProfileConfig>;\n}\n\nexport interface RuntimeConfig {\n apiKey?: string;\n baseURL: string;\n sshHost: string;\n apiKeySource: 'flag' | 'env' | 'config' | 'missing';\n baseURLSource: 'flag' | 'env' | 'config' | 'default';\n sshHostSource: 'flag' | 'env' | 'config' | 'derived';\n configPath: string;\n config: CLIConfig;\n}\n\nexport class ConfigError extends Error {}\n\nexport function getConfigDir(homeDir: string = os.homedir()): string {\n return path.join(homeDir, CONFIG_DIRNAME);\n}\n\nexport function getConfigPath(homeDir: string = os.homedir()): string {\n return path.join(getConfigDir(homeDir), CONFIG_FILENAME);\n}\n\nexport function defaultConfig(): CLIConfig {\n return {\n schema_version: SCHEMA_VERSION,\n active_profile: 'default',\n profiles: {\n default: {\n auth: {\n type: 'api_key',\n api_key: null,\n },\n },\n },\n };\n}\n\nfunction normalizeProfile(profile: Record<string, any>): ProfileConfig {\n const normalized = { ...profile } as ProfileConfig;\n const auth = typeof profile.auth === 'object' && profile.auth !== null ? { ...profile.auth } : {};\n auth.type = String(auth.type || 'api_key').trim() || 'api_key';\n auth.api_key = auth.api_key ? String(auth.api_key).trim() : null;\n normalized.auth = auth;\n\n for (const field of ['base_url', 'ssh_host']) {\n const rawValue = normalized[field];\n if (typeof rawValue !== 'string') {\n delete normalized[field];\n continue;\n }\n const cleaned = rawValue.trim();\n if (cleaned) {\n normalized[field] = cleaned;\n } else {\n delete normalized[field];\n }\n }\n\n return normalized;\n}\n\nexport function normalizeConfig(rawConfig?: Record<string, any> | null): CLIConfig {\n const config = defaultConfig();\n if (!rawConfig || typeof rawConfig !== 'object') {\n return config;\n }\n\n if (Number.isInteger(rawConfig.schema_version)) {\n config.schema_version = Number(rawConfig.schema_version);\n }\n\n if (rawConfig.profiles && typeof rawConfig.profiles === 'object') {\n config.profiles = {};\n for (const [name, profile] of Object.entries(rawConfig.profiles)) {\n if (typeof name === 'string' && profile && typeof profile === 'object') {\n config.profiles[name] = normalizeProfile(profile as Record<string, any>);\n }\n }\n }\n\n if (!config.profiles.default) {\n config.profiles.default = defaultConfig().profiles.default;\n }\n\n if (\n typeof rawConfig.active_profile === 'string' &&\n Object.prototype.hasOwnProperty.call(config.profiles, rawConfig.active_profile)\n ) {\n config.active_profile = rawConfig.active_profile;\n }\n\n return config;\n}\n\nexport function loadConfig(configPath: string = getConfigPath()): CLIConfig {\n if (!fs.existsSync(configPath)) {\n return defaultConfig();\n }\n\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n return normalizeConfig(JSON.parse(raw));\n } catch (error) {\n throw new ConfigError(`Unable to load CLI config from ${configPath}`);\n }\n}\n\nfunction applyPosixMode(targetPath: string, mode: number): void {\n if (process.platform !== 'win32') {\n fs.chmodSync(targetPath, mode);\n }\n}\n\nexport function saveConfig(config: CLIConfig, configPath: string = getConfigPath()): string {\n const configDir = path.dirname(configPath);\n\n try {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n applyPosixMode(configDir, 0o700);\n\n const normalized = normalizeConfig(config);\n const tempPath = path.join(configDir, `.${path.basename(configPath)}.${process.pid}.${Date.now()}.tmp`);\n fs.writeFileSync(tempPath, `${JSON.stringify(normalized, null, 2)}\\n`, 'utf8');\n applyPosixMode(tempPath, 0o600);\n fs.renameSync(tempPath, configPath);\n applyPosixMode(configPath, 0o600);\n } catch (error) {\n throw new ConfigError(`Unable to write CLI config to ${configPath}`);\n }\n\n return configPath;\n}\n\nexport function getActiveProfile(config: CLIConfig): ProfileConfig {\n return config.profiles[config.active_profile] || config.profiles.default;\n}\n\nexport function redactSecret(secret?: string | null): string | null {\n if (!secret) {\n return null;\n }\n const trimmed = secret.trim();\n if (trimmed.length <= 8) {\n return '*'.repeat(trimmed.length);\n }\n return `${trimmed.slice(0, 8)}...${trimmed.slice(-4)}`;\n}\n\nexport function deriveSshHost(baseURL: string): string {\n try {\n const parsed = new URL(baseURL);\n const host = parsed.hostname.trim().toLowerCase();\n if (!host) {\n return DEFAULT_SSH_HOST;\n }\n if (host === 'localhost' || host === '127.0.0.1') {\n return host;\n }\n if (host.includes('staging') && host.includes('instavm')) {\n return 'staging.instavm.dev';\n }\n if (host.startsWith('api.') && host.includes('instavm')) {\n return DEFAULT_SSH_HOST;\n }\n if (host.includes('instavm')) {\n return DEFAULT_SSH_HOST;\n }\n return host;\n } catch (error) {\n return DEFAULT_SSH_HOST;\n }\n}\n\nexport function resolveRuntimeConfig(options: {\n apiKey?: string;\n baseURL?: string;\n sshHost?: string;\n env?: NodeJS.ProcessEnv;\n configPath?: string;\n config?: CLIConfig;\n} = {}): RuntimeConfig {\n const env = options.env || process.env;\n const configPath = options.configPath || getConfigPath();\n const config = normalizeConfig(options.config || loadConfig(configPath));\n const profile = getActiveProfile(config);\n const storedKey = profile.auth?.api_key ? String(profile.auth.api_key).trim() : undefined;\n\n let apiKey: string | undefined;\n let apiKeySource: RuntimeConfig['apiKeySource'] = 'missing';\n if (options.apiKey) {\n apiKey = options.apiKey.trim();\n apiKeySource = 'flag';\n } else if (env.INSTAVM_API_KEY) {\n apiKey = env.INSTAVM_API_KEY.trim();\n apiKeySource = 'env';\n } else if (storedKey) {\n apiKey = storedKey;\n apiKeySource = 'config';\n }\n\n let baseURL = DEFAULT_BASE_URL;\n let baseURLSource: RuntimeConfig['baseURLSource'] = 'default';\n if (options.baseURL) {\n baseURL = options.baseURL.trim();\n baseURLSource = 'flag';\n } else if (env.INSTAVM_BASE_URL) {\n baseURL = env.INSTAVM_BASE_URL.trim();\n baseURLSource = 'env';\n } else if (profile.base_url) {\n baseURL = String(profile.base_url).trim();\n baseURLSource = 'config';\n }\n\n let sshHost = deriveSshHost(baseURL);\n let sshHostSource: RuntimeConfig['sshHostSource'] = 'derived';\n if (options.sshHost) {\n sshHost = options.sshHost.trim();\n sshHostSource = 'flag';\n } else if (env.INSTAVM_SSH_HOST) {\n sshHost = env.INSTAVM_SSH_HOST.trim();\n sshHostSource = 'env';\n } else if (profile.ssh_host) {\n sshHost = String(profile.ssh_host).trim();\n sshHostSource = 'config';\n }\n\n return {\n apiKey,\n baseURL,\n sshHost,\n apiKeySource,\n baseURLSource,\n sshHostSource,\n configPath,\n config,\n };\n}\n\nexport function updateProfileSettings(options: {\n apiKey?: string;\n clearApiKey?: boolean;\n baseURL?: string;\n sshHost?: string;\n configPath?: string;\n}): string {\n const configPath = options.configPath || getConfigPath();\n const config = loadConfig(configPath);\n const profileName = config.active_profile || 'default';\n const existing = config.profiles[profileName] || { auth: { type: 'api_key', api_key: null } };\n const profile = normalizeProfile(existing);\n const auth = { ...(profile.auth || {}) };\n auth.type = String(auth.type || 'api_key');\n\n if (options.clearApiKey) {\n auth.api_key = null;\n } else if (options.apiKey !== undefined) {\n auth.api_key = options.apiKey.trim() || null;\n }\n\n if (options.baseURL !== undefined) {\n const cleaned = options.baseURL.trim();\n if (cleaned) {\n profile.base_url = cleaned;\n } else {\n delete profile.base_url;\n }\n }\n\n if (options.sshHost !== undefined) {\n const cleaned = options.sshHost.trim();\n if (cleaned) {\n profile.ssh_host = cleaned;\n } else {\n delete profile.ssh_host;\n }\n }\n\n profile.auth = auth;\n config.profiles[profileName] = profile;\n return saveConfig(config, configPath);\n}\n","import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport crypto from 'crypto';\nimport { type SpawnSyncReturns, type spawnSync } from 'child_process';\nimport readline from 'readline';\nimport { parse as parseYaml } from 'yaml';\nimport { getConfigDir, type RuntimeConfig } from './config';\nimport type { InstaVM } from '../client/InstaVM';\n\nexport interface CookbookDeps {\n stdout: Pick<NodeJS.WriteStream, 'write'>;\n stderr: Pick<NodeJS.WriteStream, 'write'>;\n spawnSync: typeof spawnSync;\n promptSecret: (prompt: string) => Promise<string>;\n}\n\nexport interface CookbookJsonOptions {\n json?: boolean;\n}\n\nexport interface CookbookDeployOptions extends CookbookJsonOptions {\n apiKey?: string;\n baseUrl?: string;\n sshHost?: string;\n /** Explicit vault IDs to attach (repeatable CLI flag). */\n vault?: string[];\n noVault?: boolean;\n noSetupVault?: boolean;\n}\n\nexport interface CookbookVaultDeployOptions {\n vaultIdsOverride?: string[];\n skipVaultDiscovery?: boolean;\n /** When false, refuse interactive vault bootstrap (CI / non-TTY). */\n allowVaultBootstrap?: boolean;\n}\n\nexport class CookbookError extends Error {}\n\nexport class CookbookDeployError extends CookbookError {\n public readonly payload: Record<string, any>;\n\n constructor(message: string, payload: Record<string, any>) {\n super(message);\n this.payload = payload;\n }\n}\n\nexport interface CookbookManifest {\n path: string;\n schema_version: number;\n slug: string;\n title: string;\n version: string;\n summary: string;\n category: string;\n runtime: string;\n deploy: { kind: 'published_snapshot' | 'upload_and_run' };\n vm: {\n memory_mb: number;\n vcpu_count: number;\n timeout_seconds?: number;\n image_variant?: string;\n };\n app: {\n port: number;\n healthcheck_path: string;\n share_public_default: boolean;\n readiness_timeout_seconds: number;\n };\n run: {\n workdir: string;\n start_command: string;\n logs_hint?: string;\n };\n secrets: Array<{\n name: string;\n required: boolean;\n prompt: string;\n env_name: string;\n }>;\n post_deploy_notes: string[];\n artifact?: {\n oci_image: string;\n snapshot_name: string;\n snapshot_visibility: string;\n };\n build?: {\n context: string;\n dockerfile: string;\n target?: string;\n };\n source?: {\n include: string[];\n exclude: string[];\n setup_command: string;\n };\n /** Optional egress-proxy vault contract (0.23+). */\n vault?: {\n required: boolean;\n hosts: string[];\n };\n}\n\nconst DEFAULT_COOKBOOK_REPO_URL = 'https://github.com/instavm/cookbooks.git';\nconst DEFAULT_COOKBOOK_REF = 'main';\nconst DEFAULT_REMOTE_ROOT = '.instavm-cookbooks';\nconst DEFAULT_SOURCE_EXCLUDES = [\n '.git',\n '__pycache__',\n '.pytest_cache',\n '.venv',\n 'venv',\n 'node_modules',\n '.next',\n 'dist',\n 'build',\n '.DS_Store',\n];\n\nexport function getCookbookCacheDir(homeDir: string = os.homedir()): string {\n return path.join(getConfigDir(homeDir), 'cookbooks');\n}\n\nexport function getCookbookRepoDir(homeDir: string = os.homedir()): string {\n return path.join(getCookbookCacheDir(homeDir), 'repo');\n}\n\nexport function resolveCookbookRoot(\n deps: CookbookDeps,\n progress?: (message: string) => void,\n homeDir: string = os.homedir(),\n): string {\n const override = process.env.INSTAVM_COOKBOOKS_DIR;\n if (override) {\n const resolved = path.resolve(override);\n if (!fs.existsSync(resolved)) {\n throw new CookbookError(`Cookbook directory override does not exist: ${resolved}`);\n }\n return resolved;\n }\n\n return syncCookbookRepo(deps, progress, homeDir);\n}\n\nexport function syncCookbookRepo(\n deps: CookbookDeps,\n progress?: (message: string) => void,\n homeDir: string = os.homedir(),\n): string {\n const repoUrl = process.env.INSTAVM_COOKBOOKS_REPO || DEFAULT_COOKBOOK_REPO_URL;\n const repoRef = process.env.INSTAVM_COOKBOOKS_REF || DEFAULT_COOKBOOK_REF;\n const repoDir = getCookbookRepoDir(homeDir);\n fs.mkdirSync(path.dirname(repoDir), { recursive: true });\n\n if (progress) {\n progress(`Syncing cookbook catalog from ${repoUrl}`);\n }\n\n if (!fs.existsSync(path.join(repoDir, '.git'))) {\n runCommand(\n deps,\n 'git',\n ['clone', '--depth', '1', '--branch', repoRef, repoUrl, repoDir],\n 'Failed to clone the cookbook catalog.',\n );\n return repoDir;\n }\n\n runCommand(deps, 'git', ['-C', repoDir, 'fetch', '--depth', '1', 'origin', repoRef], 'Failed to update the cookbook catalog.');\n runCommand(deps, 'git', ['-C', repoDir, 'checkout', repoRef], 'Failed to check out the cookbook catalog branch.');\n runCommand(deps, 'git', ['-C', repoDir, 'reset', '--hard', 'FETCH_HEAD'], 'Failed to reset the cookbook catalog to the latest remote state.');\n return repoDir;\n}\n\nexport function discoverCookbooks(root: string): CookbookManifest[] {\n if (!fs.existsSync(root)) {\n return [];\n }\n\n return fs.readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && fs.existsSync(path.join(root, entry.name, 'instavm.yaml')))\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((entry) => loadManifest(path.join(root, entry.name, 'instavm.yaml')));\n}\n\nexport function loadManifest(manifestPath: string): CookbookManifest {\n let raw: any;\n try {\n raw = parseYaml(fs.readFileSync(manifestPath, 'utf8'));\n } catch (error) {\n throw new CookbookError(`Invalid cookbook manifest: ${manifestPath}`);\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new CookbookError(`Manifest root must be an object: ${manifestPath}`);\n }\n\n const requireObject = (value: any, field: string): Record<string, any> => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new CookbookError(`Manifest field \\`${field}\\` must be an object.`);\n }\n return value;\n };\n\n const requireString = (value: any, field: string): string => {\n if (typeof value !== 'string' || !value.trim()) {\n throw new CookbookError(`Manifest field \\`${field}\\` must be a non-empty string.`);\n }\n return value.trim();\n };\n\n const requireInt = (value: any, field: string): number => {\n if (!Number.isInteger(value)) {\n throw new CookbookError(`Manifest field \\`${field}\\` must be an integer.`);\n }\n return Number(value);\n };\n\n const requiredFields = [\n 'schema_version',\n 'slug',\n 'title',\n 'version',\n 'summary',\n 'category',\n 'runtime',\n 'deploy',\n 'vm',\n 'app',\n 'run',\n 'secrets',\n 'post_deploy_notes',\n ];\n const missing = requiredFields.filter((field) => !(field in raw));\n if (missing.length > 0) {\n throw new CookbookError(`Manifest is missing required fields: ${missing.join(', ')}`);\n }\n\n const deploy = requireObject(raw.deploy, 'deploy');\n const vm = requireObject(raw.vm, 'vm');\n const app = requireObject(raw.app, 'app');\n const run = requireObject(raw.run, 'run');\n const secrets = Array.isArray(raw.secrets) ? raw.secrets : [];\n\n const manifest: CookbookManifest = {\n path: path.dirname(manifestPath),\n schema_version: requireInt(raw.schema_version, 'schema_version'),\n slug: requireString(raw.slug, 'slug'),\n title: requireString(raw.title, 'title'),\n version: requireString(raw.version, 'version'),\n summary: requireString(raw.summary, 'summary'),\n category: requireString(raw.category, 'category'),\n runtime: requireString(raw.runtime, 'runtime'),\n deploy: {\n kind: requireString(deploy.kind, 'deploy.kind') as CookbookManifest['deploy']['kind'],\n },\n vm: {\n memory_mb: requireInt(vm.memory_mb, 'vm.memory_mb'),\n vcpu_count: requireInt(vm.vcpu_count, 'vm.vcpu_count'),\n timeout_seconds: Number.isInteger(vm.timeout_seconds) ? Number(vm.timeout_seconds) : undefined,\n image_variant: typeof vm.image_variant === 'string' ? vm.image_variant.trim() || undefined : undefined,\n },\n app: {\n port: requireInt(app.port, 'app.port'),\n healthcheck_path: requireString(app.healthcheck_path, 'app.healthcheck_path'),\n share_public_default: Boolean(app.share_public_default),\n readiness_timeout_seconds: requireInt(app.readiness_timeout_seconds, 'app.readiness_timeout_seconds'),\n },\n run: {\n workdir: requireString(run.workdir, 'run.workdir'),\n start_command: requireString(run.start_command, 'run.start_command'),\n logs_hint: typeof run.logs_hint === 'string' ? run.logs_hint.trim() || undefined : undefined,\n },\n secrets: secrets.map((secret: any, index: number) => {\n const obj = requireObject(secret, `secrets[${index}]`);\n return {\n name: requireString(obj.name, `secrets[${index}].name`),\n required: obj.required !== false,\n prompt: requireString(obj.prompt, `secrets[${index}].prompt`),\n env_name: requireString(obj.env_name, `secrets[${index}].env_name`),\n };\n }),\n post_deploy_notes: typeof raw.post_deploy_notes === 'string'\n ? [raw.post_deploy_notes.trim()].filter(Boolean)\n : (Array.isArray(raw.post_deploy_notes) ? raw.post_deploy_notes.map((entry: any) => requireString(entry, 'post_deploy_notes[]')) : []),\n artifact: raw.artifact ? {\n oci_image: requireString(raw.artifact.oci_image, 'artifact.oci_image'),\n snapshot_name: requireString(raw.artifact.snapshot_name, 'artifact.snapshot_name'),\n snapshot_visibility: requireString(raw.artifact.snapshot_visibility, 'artifact.snapshot_visibility'),\n } : undefined,\n build: raw.build ? {\n context: requireString(raw.build.context, 'build.context'),\n dockerfile: requireString(raw.build.dockerfile, 'build.dockerfile'),\n target: typeof raw.build.target === 'string' ? raw.build.target.trim() || undefined : undefined,\n } : undefined,\n source: raw.source ? {\n include: Array.isArray(raw.source.include) ? raw.source.include.map((entry: any) => requireString(entry, 'source.include[]')) : [],\n exclude: Array.isArray(raw.source.exclude) ? raw.source.exclude.map((entry: any) => requireString(entry, 'source.exclude[]')) : [],\n setup_command: requireString(raw.source.setup_command, 'source.setup_command'),\n } : undefined,\n vault: (() => {\n if (!raw.vault || typeof raw.vault !== 'object' || Array.isArray(raw.vault)) {\n return undefined;\n }\n const vr = raw.vault as Record<string, unknown>;\n const hostsRaw = vr.hosts;\n const hosts: string[] = [];\n if (Array.isArray(hostsRaw)) {\n for (const h of hostsRaw) {\n if (typeof h === 'string' && h.trim()) hosts.push(h.trim());\n }\n }\n if (hosts.length === 0) return undefined;\n return { required: Boolean(vr.required), hosts };\n })(),\n };\n\n if (!['published_snapshot', 'upload_and_run'].includes(manifest.deploy.kind)) {\n throw new CookbookError('Manifest field `deploy.kind` must be `published_snapshot` or `upload_and_run`.');\n }\n if (manifest.schema_version !== 1) {\n throw new CookbookError('Unsupported cookbook schema version. Expected `schema_version: 1`.');\n }\n if (!manifest.app.healthcheck_path.startsWith('/')) {\n throw new CookbookError('Manifest field `app.healthcheck_path` must start with `/`.');\n }\n if (manifest.deploy.kind === 'published_snapshot' && !manifest.artifact) {\n throw new CookbookError('Published snapshot cookbooks require `artifact` config.');\n }\n if (manifest.deploy.kind === 'published_snapshot' && manifest.artifact?.snapshot_visibility !== 'public_system') {\n throw new CookbookError('Manifest field `artifact.snapshot_visibility` must be `public_system`.');\n }\n if (manifest.deploy.kind === 'published_snapshot' && manifest.build) {\n if (!fs.existsSync(path.join(path.dirname(manifestPath), manifest.build.context))) {\n throw new CookbookError(`Build context does not exist: ${path.join(path.dirname(manifestPath), manifest.build.context)}`);\n }\n if (!fs.existsSync(path.join(path.dirname(manifestPath), manifest.build.dockerfile))) {\n throw new CookbookError(`Dockerfile does not exist: ${path.join(path.dirname(manifestPath), manifest.build.dockerfile)}`);\n }\n }\n if (manifest.deploy.kind === 'upload_and_run' && !manifest.source) {\n throw new CookbookError('Upload-and-run cookbooks require `source` config.');\n }\n if (manifest.deploy.kind === 'upload_and_run' && manifest.source && manifest.source.include.length === 0) {\n throw new CookbookError('Manifest field `source.include` must contain at least one path or glob.');\n }\n\n return manifest;\n}\n\nexport function manifestDisplayRecord(manifest: CookbookManifest): Record<string, any> {\n return {\n slug: manifest.slug,\n title: manifest.title,\n summary: manifest.summary,\n runtime: manifest.runtime,\n category: manifest.category,\n deploy_kind: manifest.deploy.kind,\n port: manifest.app.port,\n requires_secrets: manifest.secrets.length > 0,\n version: manifest.version,\n ...(manifest.vault\n ? {\n vault: {\n required: manifest.vault.required,\n hosts: manifest.vault.hosts,\n },\n }\n : {}),\n };\n}\n\nexport function preflightTools(deps: CookbookDeps): Record<string, string> {\n const found: Record<string, string> = {};\n const missing: string[] = [];\n\n for (const binary of ['git', 'ssh', 'scp', 'tar']) {\n const resolved = findExecutable(deps, binary);\n if (resolved) {\n found[binary] = resolved;\n } else {\n missing.push(binary);\n }\n }\n\n if (missing.length > 0) {\n throw new CookbookError(`Missing required local tools: ${missing.join(', ')}`);\n }\n return found;\n}\n\nexport function scanPublicKeys(homeDir: string = os.homedir()): string[] {\n const sshDir = path.join(homeDir, '.ssh');\n if (!fs.existsSync(sshDir)) {\n return [];\n }\n\n return fs.readdirSync(sshDir)\n .filter((entry) => entry.endsWith('.pub'))\n .map((entry) => path.join(sshDir, entry))\n .filter((entry) => fs.statSync(entry).isFile())\n .sort();\n}\n\nfunction publicKeyFingerprint(publicKeyPath: string): string | undefined {\n let content = '';\n try {\n content = fs.readFileSync(publicKeyPath, 'utf8').trim();\n } catch (error) {\n return undefined;\n }\n const parts = content.split(/\\s+/);\n if (parts.length < 2) {\n return undefined;\n }\n try {\n const keyBlob = Buffer.from(parts[1], 'base64');\n const digest = crypto.createHash('sha256').update(keyBlob).digest('base64').replace(/=+$/g, '');\n return `SHA256:${digest}`;\n } catch (error) {\n return undefined;\n }\n}\n\nfunction matchingLocalPublicKey(keys: Array<Record<string, any>>, candidates: string[]): string | undefined {\n const fingerprints = new Set(\n keys\n .map((key) => String(key.fingerprint || '').trim())\n .filter(Boolean),\n );\n if (fingerprints.size === 0) {\n return undefined;\n }\n return candidates.find((candidate) => {\n const fingerprint = publicKeyFingerprint(candidate);\n return fingerprint ? fingerprints.has(fingerprint) : false;\n });\n}\n\nexport async function ensureAccountSshKey(\n client: InstaVM,\n deps: CookbookDeps,\n progress?: (message: string) => void,\n homeDir: string = os.homedir(),\n): Promise<Record<string, any>> {\n const keys = await client.listSshKeys();\n const candidates = scanPublicKeys(homeDir);\n if (keys.length > 0) {\n const selectedPath = matchingLocalPublicKey(keys, candidates);\n if (progress && selectedPath) {\n progress(`Using local SSH identity from ${selectedPath}`);\n }\n return { configured: true, auto_added: false, keys, selected_path: selectedPath };\n }\n\n if (candidates.length === 0) {\n throw new CookbookError(\n 'No SSH key is registered on your account, and no local public key was found in ~/.ssh. Generate one with `ssh-keygen -t ed25519` and rerun the command.',\n );\n }\n\n if (progress) {\n progress('No account SSH key found. Selecting a local public key to register.');\n }\n\n let selected = candidates[0];\n if (candidates.length > 1 && process.stdin.isTTY) {\n deps.stdout.write('Select a public key to add:\\n');\n candidates.forEach((candidate, index) => {\n deps.stdout.write(` ${index + 1}. ${candidate}\\n`);\n });\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const choice = (await question(rl, 'Choose a key [1]: ')).trim();\n if (choice) {\n const index = Number.parseInt(choice, 10) - 1;\n if (!Number.isInteger(index) || index < 0 || index >= candidates.length) {\n throw new CookbookError('Invalid SSH key selection.');\n }\n selected = candidates[index];\n }\n } finally {\n rl.close();\n }\n }\n\n const orderedCandidates = [selected, ...candidates.filter((candidate) => candidate !== selected)];\n const failures: string[] = [];\n for (const candidate of orderedCandidates) {\n const publicKey = fs.readFileSync(candidate, 'utf8').trim();\n if (!publicKey) {\n failures.push(`${candidate}: empty file`);\n continue;\n }\n try {\n const result = await client.addSshKey(publicKey);\n if (progress) {\n progress(`Registered SSH key from ${candidate}`);\n }\n return { configured: true, auto_added: true, selected_path: candidate, result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n failures.push(`${candidate}: ${message}`);\n }\n }\n\n throw new CookbookError(`Unable to register any local public SSH key. Tried: ${failures.join('; ')}`);\n}\n\nexport async function resolveSecretValues(\n manifest: CookbookManifest,\n deps: CookbookDeps,\n): Promise<{ values: Record<string, string>; configuredNames: string[] }> {\n const values: Record<string, string> = {};\n const configuredNames: string[] = [];\n\n for (const secret of manifest.secrets) {\n let value = (process.env[secret.env_name] || '').trim();\n if (!value && secret.required) {\n if (!process.stdin.isTTY) {\n throw new CookbookError(\n `Secret \\`${secret.env_name}\\` is required for \\`${manifest.slug}\\`. Set it in the environment or rerun interactively.`,\n );\n }\n value = (await deps.promptSecret(`${secret.prompt}: `)).trim();\n }\n\n if (value) {\n values[secret.env_name] = value;\n configuredNames.push(secret.env_name);\n } else if (secret.required) {\n throw new CookbookError(`Secret \\`${secret.env_name}\\` is required for \\`${manifest.slug}\\`.`);\n }\n }\n\n return { values, configuredNames };\n}\n\nexport async function resolveSnapshotId(client: InstaVM, manifest: CookbookManifest): Promise<string> {\n if (!manifest.artifact) {\n throw new CookbookError('Published snapshot deploys require `artifact` config.');\n }\n const snapshots = await client.snapshots.list({ type: 'system' });\n const found = snapshots.find((snapshot) =>\n snapshot.name === manifest.artifact?.snapshot_name\n && snapshot.status === 'ready'\n && snapshot.is_public\n );\n if (!found?.id) {\n throw new CookbookError(`Public system snapshot \\`${manifest.artifact.snapshot_name}\\` was not found or is not ready.`);\n }\n return String(found.id);\n}\n\nfunction buildVmPayload(manifest: CookbookManifest, snapshotId?: string, vaultIds?: string[]): Record<string, any> {\n const payload: Record<string, any> = {\n memory_mb: manifest.vm.memory_mb,\n vcpu_count: manifest.vm.vcpu_count,\n vm_lifetime_seconds: manifest.vm.timeout_seconds,\n };\n if (manifest.vm.image_variant) {\n payload.image_variant = manifest.vm.image_variant;\n }\n if (snapshotId) {\n payload.snapshot_id = snapshotId;\n }\n if (vaultIds?.length) {\n payload.vault_ids = [...new Set(vaultIds.map((v) => String(v).trim()).filter(Boolean))];\n }\n return Object.fromEntries(Object.entries(payload).filter(([, value]) => value !== undefined && value !== null));\n}\n\nfunction isResourceTierError(error: unknown): boolean {\n // The API currently returns a free-form error message here rather than a\n // stable code, so the fallback retry has to key off the returned text.\n const message = error instanceof Error ? error.message : String(error);\n const normalized = message.toLowerCase();\n return normalized.includes('free tier') && (normalized.includes('configurable cpu') || normalized.includes('configurable memory'));\n}\n\nfunction planLifetimeLimitSeconds(error: unknown): number | undefined {\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/vm lifetime cannot exceed\\s+(\\d+)s/i);\n if (!match) {\n return undefined;\n }\n return Number.parseInt(match[1], 10);\n}\n\nasync function createVm(\n client: InstaVM,\n manifest: CookbookManifest,\n snapshotId: string | undefined,\n progress?: (message: string) => void,\n vaultIds?: string[],\n): Promise<Record<string, any>> {\n let payload = buildVmPayload(manifest, snapshotId, vaultIds);\n let adjustedForTier = false;\n let adjustedForLifetime = false;\n while (true) {\n try {\n return await client.vms.create(payload, true);\n } catch (error) {\n let nextPayload = { ...payload };\n\n if (isResourceTierError(error) && ('memory_mb' in nextPayload || 'vcpu_count' in nextPayload)) {\n nextPayload = Object.fromEntries(\n Object.entries(nextPayload).filter(([key]) => key !== 'memory_mb' && key !== 'vcpu_count'),\n );\n if (progress && !adjustedForTier) {\n progress('Requested CPU or memory exceeds the current account tier.');\n progress('Retrying VM creation with platform defaults');\n }\n adjustedForTier = true;\n }\n\n const lifetimeLimit = planLifetimeLimitSeconds(error);\n const currentLifetime = typeof nextPayload.vm_lifetime_seconds === 'number' ? nextPayload.vm_lifetime_seconds : undefined;\n if (lifetimeLimit && currentLifetime && currentLifetime > lifetimeLimit) {\n nextPayload.vm_lifetime_seconds = lifetimeLimit;\n if (progress && !adjustedForLifetime) {\n progress('Requested VM lifetime exceeds the current account tier.');\n progress(`Retrying VM creation with a ${lifetimeLimit}s lifetime`);\n }\n adjustedForLifetime = true;\n }\n\n if (JSON.stringify(nextPayload) === JSON.stringify(payload)) {\n throw error;\n }\n payload = nextPayload;\n }\n }\n}\n\nexport async function runDeploy(\n manifest: CookbookManifest,\n client: InstaVM,\n settings: RuntimeConfig,\n deps: CookbookDeps,\n progress?: (message: string) => void,\n snapshotIdOverride?: string,\n vaultOpts?: CookbookVaultDeployOptions,\n): Promise<Record<string, any>> {\n preflightTools(deps);\n const sshKeyInfo = await ensureAccountSshKey(client, deps, progress);\n const { values: secretValues, configuredNames } = await resolveSecretValues(manifest, deps);\n\n let snapshotId: string | undefined = snapshotIdOverride;\n if (!snapshotId && manifest.deploy.kind === 'published_snapshot') {\n if (progress) {\n progress(`Resolving public snapshot ${manifest.artifact?.snapshot_name}`);\n }\n snapshotId = await resolveSnapshotId(client, manifest);\n }\n\n const vopt = vaultOpts ?? {};\n let selectedVaultIds: string[] = [];\n if (vopt.vaultIdsOverride?.length) {\n selectedVaultIds = [...new Set(vopt.vaultIdsOverride.map((x) => String(x).trim()).filter(Boolean))];\n if (progress && selectedVaultIds.length) {\n progress(\n `Binding ${selectedVaultIds.length} vault(s) from --vault override: ${selectedVaultIds.join(', ')}`,\n );\n }\n } else if (manifest.vault && !vopt.skipVaultDiscovery) {\n const vc = await import('./vaultCookbook');\n const slice = { slug: manifest.slug, vault: manifest.vault };\n let vaultPlan = await vc.discoverMatchingVaults(client, slice, progress);\n selectedVaultIds = [...vaultPlan.vaultIds];\n if (progress && vaultPlan.hostToVault.length) {\n for (const p of vaultPlan.hostToVault) {\n progress(`Binding ${p.host} via vault ${p.vaultId} (${p.vaultName})`);\n }\n }\n if (\n manifest.vault.required\n && (vaultPlan.unmatchedHosts.length > 0 || vaultPlan.vaultIds.length === 0)\n ) {\n const missingHosts = vaultPlan.unmatchedHosts.length > 0 ? vaultPlan.unmatchedHosts : manifest.vault.hosts;\n if (vopt.allowVaultBootstrap !== false && process.stdin.isTTY) {\n if (progress) {\n progress(`No vault covers: ${missingHosts.join(', ')} — entering interactive setup`);\n }\n const bootstrapped = await vc.bootstrapVaultForManifest(client, slice, {\n missingHosts,\n matchedPairs: vaultPlan.hostToVault,\n progress,\n promptSecret: deps.promptSecret,\n });\n vaultPlan = await vc.discoverMatchingVaults(client, slice, progress);\n selectedVaultIds = [...new Set([...bootstrapped, ...vaultPlan.vaultIds])];\n if (vaultPlan.unmatchedHosts.length > 0) {\n throw new CookbookError(\n `Vault bootstrap finished but the following host(s) are still uncovered: ${vaultPlan.unmatchedHosts.join(', ')}\\n\\n`\n + vc.formatVaultSetupHint(manifest, vaultPlan.unmatchedHosts),\n );\n }\n } else {\n throw new CookbookError(\n `This cookbook requires an org vault for: ${missingHosts.join(', ')}.\\n\\n${vc.formatVaultSetupHint(manifest, missingHosts)}`,\n );\n }\n } else if (progress && vaultPlan.unmatchedHosts.length > 0 && !manifest.vault.required) {\n progress(\n `No org vault binding found for: ${vaultPlan.unmatchedHosts.join(', ')} (deploy continues — credentials must be injected another way)`,\n );\n }\n }\n\n if (progress) {\n progress('Creating VM');\n }\n const vm = await createVm(\n client,\n manifest,\n snapshotId,\n progress,\n selectedVaultIds.length > 0 ? selectedVaultIds : undefined,\n );\n const vmId = String(vm.vm_id || '');\n const sessionId = String(vm.session_id || '');\n if (!vmId) {\n throw new CookbookError('VM creation did not return a VM ID.');\n }\n\n const sshTarget = `${vmId}@${settings.sshHost}`;\n const identityFile = resolveIdentityFile(sshKeyInfo.selected_path);\n let remoteBase = `/home/appuser/${DEFAULT_REMOTE_ROOT}`;\n let remoteRoot = `${remoteBase}/${manifest.slug}`;\n let workdir = remoteWorkdir(manifest, remoteRoot);\n const connectCommand = buildConnectCommand(vmId, settings.sshHost, identityFile);\n let serviceMode = 'unknown';\n let serviceName = `instavm-cookbook-${manifest.slug}`;\n\n try {\n if (progress) {\n progress('Waiting for SSH access');\n }\n waitForSshReady(deps, sshTarget, identityFile);\n remoteBase = resolveRemoteBase(deps, sshTarget, identityFile);\n remoteRoot = `${remoteBase}/${manifest.slug}`;\n workdir = remoteWorkdir(manifest, remoteRoot);\n\n if (manifest.deploy.kind === 'upload_and_run') {\n const archivePath = packageSource(manifest, deps);\n try {\n const remoteTarball = `/tmp/${manifest.slug}-${Date.now()}.tar.gz`;\n if (progress) {\n progress('Uploading cookbook source');\n }\n runScp(deps, archivePath, `${sshTarget}:${remoteTarball}`, 'Failed to upload the cookbook bundle to the VM.', identityFile);\n runSsh(\n deps,\n sshTarget,\n `mkdir -p ${shellEscape(remoteRoot)} && tar -xzf ${shellEscape(remoteTarball)} -C ${shellEscape(remoteRoot)} && rm -f ${shellEscape(remoteTarball)}`,\n 'Failed to extract the cookbook bundle.',\n false,\n identityFile,\n );\n if (progress) {\n progress('Running cookbook setup');\n }\n runSsh(deps, sshTarget, `cd ${shellEscape(workdir)} && ${manifest.source?.setup_command}`, 'Cookbook setup command failed.', false, identityFile);\n } finally {\n fs.rmSync(archivePath, { force: true });\n }\n }\n\n if (progress) {\n progress('Starting application service');\n }\n const started = startRemoteService(deps, sshTarget, manifest, remoteRoot, workdir, secretValues, identityFile);\n serviceName = started.serviceName;\n serviceMode = started.serviceMode;\n\n if (progress) {\n progress('Waiting for application healthcheck');\n }\n waitForInternalHealth(deps, sshTarget, manifest.app.port, manifest.app.healthcheck_path, manifest.app.readiness_timeout_seconds, identityFile);\n\n if (progress) {\n progress('Creating public share');\n }\n const share = await client.shares.create({\n vm_id: vmId,\n port: manifest.app.port,\n is_public: manifest.app.share_public_default,\n });\n const shareUrl = String(share.url || '');\n if (!shareUrl) {\n throw new CookbookError('Share creation did not return a URL.');\n }\n\n if (progress) {\n progress('Verifying public share URL');\n }\n const healthcheckUrl = new URL(manifest.app.healthcheck_path.replace(/^\\//, ''), shareUrl.endsWith('/') ? shareUrl : `${shareUrl}/`).toString();\n await verifyPublicShare(healthcheckUrl, manifest.app.readiness_timeout_seconds);\n\n return {\n slug: manifest.slug,\n version: manifest.version,\n deploy_kind: manifest.deploy.kind,\n vm_id: vmId,\n session_id: sessionId,\n vault_ids: selectedVaultIds,\n service_name: serviceName,\n service_mode: serviceMode,\n port: manifest.app.port,\n share_url: shareUrl,\n healthcheck_url: healthcheckUrl,\n connect_command: connectCommand,\n logs_command: logsCommand(vmId, settings.sshHost, manifest.slug, serviceName, serviceMode, remoteBase, manifest.run.logs_hint, identityFile),\n destroy_command: `instavm rm ${vmId}`,\n configured_secrets: configuredNames,\n notes: manifest.post_deploy_notes,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CookbookDeployError(message, {\n slug: manifest.slug,\n version: manifest.version,\n deploy_kind: manifest.deploy.kind,\n vm_id: vmId,\n session_id: sessionId,\n vault_ids: selectedVaultIds,\n service_name: serviceName,\n service_mode: serviceMode,\n port: manifest.app.port,\n connect_command: connectCommand,\n logs_command: logsCommand(vmId, settings.sshHost, manifest.slug, serviceName, serviceMode, remoteBase, manifest.run.logs_hint, identityFile),\n destroy_command: `instavm rm ${vmId}`,\n configured_secrets: configuredNames,\n });\n }\n}\n\nexport async function deployCookbook(\n manifest: CookbookManifest,\n client: InstaVM,\n settings: RuntimeConfig,\n deps: CookbookDeps,\n progress?: (message: string) => void,\n vaultOpts?: CookbookVaultDeployOptions,\n): Promise<Record<string, any>> {\n return runDeploy(manifest, client, settings, deps, progress, undefined, vaultOpts);\n}\n\nfunction packageSource(manifest: CookbookManifest, deps: CookbookDeps): string {\n if (!manifest.source) {\n throw new CookbookError('Upload-and-run cookbooks require `source` config.');\n }\n\n const stagingRoot = fs.mkdtempSync(path.join(os.tmpdir(), `${manifest.slug}-src-`));\n const archivePath = path.join(os.tmpdir(), `${manifest.slug}-${Date.now()}.tar.gz`);\n try {\n const excludes = new Set([...DEFAULT_SOURCE_EXCLUDES, ...manifest.source.exclude]);\n copySelectedTree(manifest.path, stagingRoot, manifest.source.include, excludes);\n runCommand(deps, 'tar', ['-czf', archivePath, '-C', stagingRoot, '.'], 'Failed to package the cookbook source.');\n } finally {\n fs.rmSync(stagingRoot, { recursive: true, force: true });\n }\n return archivePath;\n}\n\nfunction copySelectedTree(sourceRoot: string, targetRoot: string, include: string[], exclude: Set<string>): void {\n const visit = (currentSource: string, currentRelative: string): void => {\n const entries = fs.readdirSync(currentSource, { withFileTypes: true });\n for (const entry of entries) {\n const relative = currentRelative ? `${currentRelative}/${entry.name}` : entry.name;\n if (!shouldInclude(relative, include, exclude)) {\n continue;\n }\n const sourcePath = path.join(currentSource, entry.name);\n const targetPath = path.join(targetRoot, relative);\n if (entry.isDirectory()) {\n fs.mkdirSync(targetPath, { recursive: true });\n visit(sourcePath, relative);\n } else {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n };\n\n visit(sourceRoot, '');\n}\n\nfunction shouldInclude(relative: string, include: string[], exclude: Set<string>): boolean {\n const normalized = relative.replace(/\\\\/g, '/');\n for (const pattern of exclude) {\n if (matchesPattern(normalized, pattern)) {\n return false;\n }\n }\n if (include.length === 0) {\n return true;\n }\n return include.some((pattern) => matchesPattern(normalized, pattern) || normalized.startsWith(`${pattern.replace(/\\/$/, '')}/`));\n}\n\n// Cookbook manifests intentionally support a small glob surface here: `*`\n// matches within a single path segment, and directory prefixes are handled\n// explicitly in `shouldInclude`.\nfunction matchesPattern(value: string, pattern: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n return new RegExp(`^${escaped}$`).test(value);\n}\n\nfunction startRemoteService(\n deps: CookbookDeps,\n sshTarget: string,\n manifest: CookbookManifest,\n remoteRoot: string,\n workdir: string,\n secretValues: Record<string, string>,\n identityFile?: string,\n): { serviceName: string; serviceMode: string } {\n const serviceName = `instavm-cookbook-${manifest.slug}`;\n const remoteBase = remoteRoot.slice(0, remoteRoot.lastIndexOf('/'));\n const logFile = `${remoteBase}/logs/${manifest.slug}.log`;\n const environment = Object.entries(secretValues)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}=${shellEscape(value)}`)\n .join(' ');\n const launchBody = `cd ${shellEscape(workdir)} && ${environment} ${manifest.run.start_command}`.trim();\nconst remoteScript = `\nset -e\nmkdir -p ${shellEscape(`${remoteBase}/logs`)}\nmkdir -p ${shellEscape(remoteRoot)}\nif command -v systemd-run >/dev/null 2>&1 && [ -d /run/systemd/system ]; then\n if systemd-run --unit ${shellEscape(serviceName)} --collect --quiet --property=WorkingDirectory=${shellEscape(workdir)} /bin/bash -lc ${shellEscape(launchBody)} >/dev/null 2>&1; then\n printf '%s' 'systemd'\n exit 0\n fi\nfi\nnohup /bin/bash -lc ${shellEscape(launchBody)} > ${shellEscape(logFile)} 2>&1 < /dev/null &\necho $! > ${shellEscape(`${remoteBase}/logs/${manifest.slug}.pid`)}\nprintf '%s' 'nohup'\n`.trim();\n const result = runSsh(deps, sshTarget, remoteScript, 'Failed to start the cookbook service.', true, identityFile);\n const stdout = typeof result.stdout === 'string' ? result.stdout : result.stdout?.toString('utf8') || '';\n return {\n serviceName,\n serviceMode: stdout.trim() || 'nohup',\n };\n}\n\nfunction waitForInternalHealth(\n deps: CookbookDeps,\n sshTarget: string,\n port: number,\n healthcheckPath: string,\n timeoutSeconds: number,\n identityFile?: string,\n): void {\n const url = `http://127.0.0.1:${port}${healthcheckPath}`;\n const attempts = Math.max(Math.floor(timeoutSeconds / 2), 1);\n const remoteScript = `\nset -e\nURL=${shellEscape(url)}\nfor _ in $(seq 1 ${attempts}); do\n if command -v curl >/dev/null 2>&1; then\n curl -fsS \"$URL\" >/dev/null && exit 0\n elif command -v wget >/dev/null 2>&1; then\n wget -q -O /dev/null \"$URL\" && exit 0\n elif command -v python3 >/dev/null 2>&1; then\n python3 - <<'PY' && exit 0\nfrom urllib.request import urlopen\nwith urlopen(${JSON.stringify(url)}, timeout=3) as response:\n if response.status >= 400:\n raise SystemExit(1)\nPY\n fi\n sleep 2\ndone\nexit 1\n`.trim();\n runSsh(deps, sshTarget, remoteScript, 'Timed out waiting for the app healthcheck.', false, identityFile);\n}\n\nasync function verifyPublicShare(url: string, timeoutSeconds: number): Promise<void> {\n const deadline = Date.now() + timeoutSeconds * 1000;\n while (Date.now() < deadline) {\n try {\n const response = await fetch(url, { redirect: 'follow' });\n if (response.ok) {\n return;\n }\n } catch (error) {\n // Retry until timeout.\n }\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n throw new CookbookError(`Timed out verifying the public share URL: ${url}`);\n}\n\nfunction runSsh(\n deps: CookbookDeps,\n sshTarget: string,\n remoteCommand: string,\n errorMessage: string,\n captureOutput: boolean = false,\n identityFile?: string,\n): SpawnSyncReturns<Buffer | string> {\n const args = ['-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=accept-new'];\n if (identityFile) {\n args.push('-o', 'IdentitiesOnly=yes', '-i', identityFile);\n }\n args.push(sshTarget, remoteCommand);\n return runCommand(\n deps,\n 'ssh',\n args,\n errorMessage,\n captureOutput,\n );\n}\n\nfunction runScp(\n deps: CookbookDeps,\n localPath: string,\n remotePath: string,\n errorMessage: string,\n identityFile?: string,\n): SpawnSyncReturns<Buffer | string> {\n // Force legacy SCP mode because the gateway path does not behave correctly\n // with OpenSSH's default SFTP-based SCP transport.\n const args = ['-O', '-q'];\n if (identityFile) {\n args.push('-o', 'IdentitiesOnly=yes', '-i', identityFile);\n }\n args.push(localPath, remotePath);\n return runCommand(deps, 'scp', args, errorMessage);\n}\n\nexport function waitForSshReady(\n deps: CookbookDeps,\n sshTarget: string,\n identityFile?: string,\n timeoutSeconds: number = 90,\n): void {\n const deadline = Date.now() + timeoutSeconds * 1000;\n let lastError: string | undefined;\n while (Date.now() < deadline) {\n try {\n runSsh(deps, sshTarget, 'true', 'Timed out waiting for SSH access to the VM.', true, identityFile);\n return;\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n sleepMs(2000);\n }\n if (lastError) {\n throw new CookbookError(`Timed out waiting for SSH access to the VM: ${sshTarget}. Last SSH error: ${lastError}`);\n }\n throw new CookbookError(`Timed out waiting for SSH access to the VM: ${sshTarget}`);\n}\n\nexport function emitCookbookDeployError(\n deps: CookbookDeps,\n options: CookbookJsonOptions,\n payload: Record<string, any>,\n): void {\n if (options.json) {\n deps.stdout.write(`${JSON.stringify(payload)}\\n`);\n return;\n }\n deps.stderr.write(`Deploy failed: ${payload.error}\\n`);\n for (const [label, value] of [\n ['VM', payload.vm_id],\n ['Connect', payload.connect_command],\n ['Logs', payload.logs_command],\n ['Destroy', payload.destroy_command],\n ] as Array<[string, string | undefined]>) {\n deps.stderr.write(`${label}: ${value || '-'}\\n`);\n }\n}\n\nfunction runCommand(\n deps: CookbookDeps,\n command: string,\n args: string[],\n errorMessage: string,\n captureOutput: boolean = false,\n): SpawnSyncReturns<Buffer | string> {\n const result = deps.spawnSync(command, args, {\n encoding: 'utf8',\n stdio: captureOutput ? ['ignore', 'pipe', 'pipe'] : ['ignore', 'ignore', 'pipe'],\n });\n\n if (result.error) {\n throw new CookbookError(errorMessage);\n }\n if ((result.status ?? 0) !== 0) {\n const stderr = typeof result.stderr === 'string' ? result.stderr : String(result.stderr || '');\n const detail = stderr.trim() ? ` ${stderr.trim()}` : '';\n throw new CookbookError(`${errorMessage}${detail}`);\n }\n return result;\n}\n\nfunction logsCommand(\n vmId: string,\n sshHost: string,\n slug: string,\n serviceName: string,\n serviceMode: string,\n remoteBase: string,\n logsHint?: string,\n identityFile?: string,\n): string {\n if (logsHint) {\n return logsHint;\n }\n const sshPrefix = buildSshPrefix(vmId, sshHost, identityFile);\n if (serviceMode === 'systemd') {\n return `${sshPrefix} journalctl --no-pager -u ${serviceName} -n 200`;\n }\n return `${sshPrefix} tail -n 200 ${shellEscape(`${remoteBase}/logs/${slug}.log`)}`;\n}\n\nfunction remoteWorkdir(manifest: CookbookManifest, remoteRoot: string): string {\n if (manifest.run.workdir.startsWith('/')) {\n return manifest.run.workdir;\n }\n if (manifest.run.workdir === '.' || manifest.run.workdir === './') {\n return remoteRoot;\n }\n return `${remoteRoot}/${manifest.run.workdir.replace(/^\\.\\//, '').replace(/\\/$/, '')}`;\n}\n\nfunction resolveRemoteBase(deps: CookbookDeps, sshTarget: string, identityFile?: string): string {\n const result = runSsh(\n deps,\n sshTarget,\n 'printf %s \"$HOME\"',\n 'Failed to determine the remote home directory.',\n true,\n identityFile,\n );\n const stdout = typeof result.stdout === 'string' ? result.stdout : result.stdout?.toString('utf8') || '';\n const remoteHome = stdout.trim() || '/tmp';\n return `${remoteHome}/${DEFAULT_REMOTE_ROOT}`;\n}\n\nfunction findExecutable(deps: CookbookDeps, binary: string): string | null {\n const result = deps.spawnSync(process.platform === 'win32' ? 'where' : 'which', [binary], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n if ((result.status ?? 1) !== 0) {\n return null;\n }\n const stdout = typeof result.stdout === 'string' ? result.stdout : String(result.stdout || '');\n const output = stdout.split(/\\r?\\n/).find(Boolean);\n return output || null;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\"'\\\"'`)}'`;\n}\n\nfunction resolveIdentityFile(selectedPath?: string): string | undefined {\n if (!selectedPath) {\n return undefined;\n }\n const candidate = selectedPath.endsWith('.pub') ? selectedPath.slice(0, -4) : selectedPath;\n return fs.existsSync(candidate) ? candidate : undefined;\n}\n\nfunction buildSshPrefix(vmId: string, sshHost: string, identityFile?: string): string {\n if (identityFile) {\n return `ssh -o IdentitiesOnly=yes -i ${shellEscape(identityFile)} ${vmId}@${sshHost}`;\n }\n return `ssh ${vmId}@${sshHost}`;\n}\n\nfunction buildConnectCommand(vmId: string, sshHost: string, identityFile?: string): string {\n if (identityFile) {\n return buildSshPrefix(vmId, sshHost, identityFile);\n }\n return `instavm connect ${vmId}`;\n}\n\nfunction sleepMs(durationMs: number): void {\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, durationMs);\n}\n\nfunction question(rl: readline.Interface, prompt: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(prompt, resolve);\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport readline from 'node:readline/promises';\nimport { parse as parseYaml } from 'yaml';\nimport type { InstaVM } from '../client/InstaVM';\nimport { CookbookError } from './cookbook';\n\n/** Copy-pasteable setup hint (parity with Python `_format_vault_setup_hint`). */\nexport function formatVaultSetupHint(manifest: { slug: string }, hosts: string[]): string {\n const lines = [\n `\\`${manifest.slug}\\` requires an org vault that maps the following host(s):`,\n ...hosts.map((h) => ` • ${h}`),\n '',\n 'Easiest path (interactive, since 0.23.0):',\n ' instavm deploy # offers to create+bind the vault on the spot',\n ' instavm vault setup . # same flow, without provisioning a VM',\n '',\n 'Or wire it up manually:',\n ' VID=$(instavm vault create cookbook-org -j | node -e \"let s=\\'\\';process.stdin.on(\\'data\\',d=>s+=d);process.stdin.on(\\'end\\',()=>console.log(JSON.parse(s).id))\")',\n ];\n const primaryHost = hosts[0] || 'api.example.com';\n const credName = primaryHost.includes('openai') ? 'OPENAI_API_KEY' : 'API_KEY';\n lines.push(` instavm vault secret set \"$VID\" ${credName}`);\n lines.push(\n ` instavm vault service add \"$VID\" --host ${primaryHost} --auth-type bearer --credential ${credName}`,\n );\n lines.push('Then re-run `instavm deploy`.');\n return lines.join('\\n');\n}\n\nexport interface ManifestVaultSlice {\n slug: string;\n vault: { required: boolean; hosts: string[] } | null;\n}\n\nexport interface VaultBindingPlan {\n vaultIds: string[];\n hostToVault: Array<{ host: string; vaultId: string; vaultName: string }>;\n unmatchedHosts: string[];\n}\n\nfunction normalizeVaultHost(host: unknown): string | null {\n if (typeof host !== 'string') return null;\n const cleaned = host.trim().toLowerCase();\n return cleaned || null;\n}\n\nfunction fnmatch(pattern: string, value: string): boolean {\n const p = pattern.toLowerCase();\n const v = value.toLowerCase();\n if (!p.includes('*') && !p.includes('?')) {\n return p === v;\n }\n const escaped = p.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*').replace(/\\?/g, '.');\n return new RegExp(`^${escaped}$`, 'i').test(v);\n}\n\nexport function loadManifestVaultSlice(cookbookDir: string): ManifestVaultSlice {\n const root = path.resolve(cookbookDir);\n const manifestPath = path.join(root, 'instavm.yaml');\n if (!fs.existsSync(manifestPath)) {\n throw new CookbookError(`no instavm.yaml found at ${manifestPath}`);\n }\n let raw: unknown;\n try {\n raw = parseYaml(fs.readFileSync(manifestPath, 'utf8'));\n } catch {\n throw new CookbookError(`Invalid cookbook manifest: ${manifestPath}`);\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new CookbookError(`Manifest root must be an object: ${manifestPath}`);\n }\n const obj = raw as Record<string, unknown>;\n const slug = typeof obj.slug === 'string' && obj.slug.trim() ? obj.slug.trim() : 'cookbook';\n const vaultRaw = obj.vault;\n if (!vaultRaw || typeof vaultRaw !== 'object' || Array.isArray(vaultRaw)) {\n return { slug, vault: null };\n }\n const v = vaultRaw as Record<string, unknown>;\n const hostsIn = v.hosts;\n const hosts: string[] = [];\n if (Array.isArray(hostsIn)) {\n for (const h of hostsIn) {\n if (typeof h === 'string' && h.trim()) hosts.push(h.trim());\n }\n }\n if (hosts.length === 0) {\n return { slug, vault: null };\n }\n const required = Boolean(v.required);\n return { slug, vault: { required, hosts } };\n}\n\nexport async function discoverMatchingVaults(\n client: InstaVM,\n manifest: ManifestVaultSlice,\n progress?: (message: string) => void,\n): Promise<VaultBindingPlan> {\n if (!manifest.vault?.hosts?.length) {\n return { vaultIds: [], hostToVault: [], unmatchedHosts: [] };\n }\n\n const declaredHosts = [...manifest.vault.hosts];\n const declaredSet = new Set(declaredHosts.map((h) => h.toLowerCase()));\n\n if (progress) {\n progress(`Scanning org vaults for ${declaredHosts.join(', ')}`);\n }\n\n let rawVaults: unknown[] = [];\n try {\n rawVaults = await client.listVaults();\n } catch {\n rawVaults = [];\n }\n const matchedIds: string[] = [];\n const matchedPairs: Array<{ host: string; vaultId: string; vaultName: string }> = [];\n const coveredHosts = new Set<string>();\n\n for (const vault of rawVaults) {\n if (!vault || typeof vault !== 'object') continue;\n const rec = vault as Record<string, unknown>;\n const vaultId = String(rec.id || '').trim();\n if (!vaultId) continue;\n const vaultName = String(rec.name || vaultId);\n let services: unknown[] = [];\n try {\n services = await client.listVaultServices(vaultId);\n } catch {\n services = [];\n }\n for (const service of services) {\n if (!service || typeof service !== 'object') continue;\n const s = service as Record<string, unknown>;\n if (s.enabled === false) continue;\n const hostCandidate = normalizeVaultHost(s.host);\n if (!hostCandidate || !declaredSet.has(hostCandidate)) continue;\n if (coveredHosts.has(hostCandidate)) continue;\n coveredHosts.add(hostCandidate);\n matchedPairs.push({ host: hostCandidate, vaultId, vaultName });\n if (!matchedIds.includes(vaultId)) matchedIds.push(vaultId);\n }\n }\n\n const unmatchedHosts = declaredHosts.filter((h) => !coveredHosts.has(h.toLowerCase()));\n return {\n vaultIds: matchedIds,\n hostToVault: matchedPairs,\n unmatchedHosts,\n };\n}\n\ninterface ResolvedTemplate {\n host: string;\n templateId: string | null;\n authType: string;\n credentialKey: string;\n header: string | null;\n prefix: string | null;\n label: string;\n}\n\nfunction credentialKeyForHost(host: string): string {\n let label = host.toLowerCase();\n for (const prefix of ['api.', 'www.']) {\n if (label.startsWith(prefix)) label = label.slice(prefix.length);\n }\n label = label.split('.')[0] || label;\n label = label.replace(/[^a-z0-9]+/gi, '_').replace(/^_+|_+$/g, '') || 'service';\n return `${label.toUpperCase()}_API_KEY`;\n}\n\nconst FALLBACK_TEMPLATES: Array<Record<string, unknown>> = [\n {\n id: 'openai',\n host: 'api.openai.com',\n auth_type: 'bearer',\n credential_key: 'OPENAI_API_KEY',\n name: 'OpenAI',\n },\n {\n id: 'anthropic',\n host: 'api.anthropic.com',\n auth_type: 'api-key',\n header: 'x-api-key',\n credential_key: 'ANTHROPIC_API_KEY',\n name: 'Anthropic',\n },\n {\n id: 'openrouter',\n host: 'openrouter.ai',\n auth_type: 'bearer',\n credential_key: 'OPENROUTER_API_KEY',\n name: 'OpenRouter',\n },\n {\n id: 'gemini',\n host: 'generativelanguage.googleapis.com',\n auth_type: 'api-key',\n header: 'x-goog-api-key',\n credential_key: 'GOOGLE_API_KEY',\n name: 'Google Gemini',\n },\n];\n\nfunction catalogEntryMatches(entryHost: string, hostLower: string): boolean {\n const eh = entryHost.toLowerCase();\n if (!eh) return false;\n if (eh.includes('*')) return fnmatch(eh, hostLower);\n return eh === hostLower;\n}\n\nfunction resolveTemplateForHost(host: string, catalog: Array<Record<string, unknown>>): ResolvedTemplate {\n const hostLower = host.toLowerCase();\n\n for (const entry of catalog) {\n const eh = String(entry.host || '');\n if (!catalogEntryMatches(eh, hostLower)) continue;\n return {\n host: String(entry.host || hostLower),\n templateId: String(entry.id || '') || null,\n authType: String(entry.auth_type || 'bearer'),\n credentialKey: String(entry.credential_key || credentialKeyForHost(hostLower)),\n header: entry.header != null ? String(entry.header) : null,\n prefix: entry.prefix != null ? String(entry.prefix) : null,\n label: String(entry.name || entry.id || hostLower),\n };\n }\n\n for (const entry of FALLBACK_TEMPLATES) {\n const eh = String(entry.host || '');\n if (!catalogEntryMatches(eh, hostLower)) continue;\n return {\n host: hostLower,\n templateId: String(entry.id || '') || null,\n authType: String(entry.auth_type),\n credentialKey: String(entry.credential_key),\n header: entry.header != null ? String(entry.header) : null,\n prefix: entry.prefix != null ? String(entry.prefix) : null,\n label: String(entry.name || hostLower),\n };\n }\n\n return {\n host: hostLower,\n templateId: null,\n authType: 'bearer',\n credentialKey: credentialKeyForHost(hostLower),\n header: null,\n prefix: null,\n label: hostLower,\n };\n}\n\nfunction authConfigForResolved(r: ResolvedTemplate): Record<string, unknown> {\n if (r.authType === 'bearer') {\n return { type: 'bearer', token: r.credentialKey };\n }\n if (r.authType === 'api-key' || r.authType === 'header') {\n const cfg: Record<string, unknown> = {\n type: 'api-key',\n header: r.header || 'Authorization',\n key: r.credentialKey,\n };\n if (r.prefix) cfg.prefix = r.prefix;\n return cfg;\n }\n if (r.authType === 'basic') {\n return {\n type: 'basic',\n username: `${r.credentialKey}_USER`,\n password: r.credentialKey,\n };\n }\n return { type: 'passthrough' };\n}\n\nfunction existingCredentialId(creds: unknown[], name: string): string | null {\n for (const cred of creds) {\n if (!cred || typeof cred !== 'object') continue;\n const c = cred as Record<string, unknown>;\n if (String(c.name || '') !== name) continue;\n const cid = String(c.id || '').trim();\n if (cid) return cid;\n }\n return null;\n}\n\nasync function bootstrapTargetVault(\n client: InstaVM,\n manifest: ManifestVaultSlice,\n matchedPairs: Array<{ host: string; vaultId: string; vaultName: string }>,\n progress: ((s: string) => void) | undefined,\n promptConfirm: (text: string, defaultYes: boolean) => Promise<boolean>,\n): Promise<{ vaultId: string; vaultName: string; created: boolean }> {\n if (matchedPairs.length > 0) {\n const { host, vaultId, vaultName } = matchedPairs[0];\n if (progress) {\n progress(`Extending existing vault ${vaultName} (${vaultId}) — already covers ${host}`);\n }\n return { vaultId, vaultName, created: false };\n }\n\n const defaultName = `${manifest.slug}-vault`;\n const ok = await promptConfirm(\n `No org vault matches the cookbook's hosts. Create a new vault named '${defaultName}' now?`,\n true,\n );\n if (!ok) {\n throw new CookbookError('Vault setup cancelled by user.');\n }\n\n if (progress) progress(`Creating vault ${defaultName}`);\n const record = await client.createVault(\n defaultName,\n `Auto-created by \\`instavm deploy\\` for cookbook ${manifest.slug}.`,\n );\n const vaultId = String((record as Record<string, unknown>).id || '').trim();\n if (!vaultId) {\n throw new CookbookError('create_vault returned no vault ID.');\n }\n return { vaultId, vaultName: defaultName, created: true };\n}\n\nasync function defaultPromptConfirm(text: string, defaultYes: boolean): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const suffix = defaultYes ? ' [Y/n] ' : ' [y/N] ';\n try {\n const ans = (await rl.question(text + suffix)).trim().toLowerCase();\n if (!ans) return defaultYes;\n return ans === 'y' || ans === 'yes';\n } catch {\n return defaultYes;\n } finally {\n rl.close();\n }\n}\n\n/**\n * Interactive vault wiring for a cookbook manifest (parity with Python `bootstrap_vault_for_manifest`).\n */\nexport async function bootstrapVaultForManifest(\n client: InstaVM,\n manifest: ManifestVaultSlice,\n options: {\n missingHosts: string[];\n matchedPairs: Array<{ host: string; vaultId: string; vaultName: string }>;\n progress?: (message: string) => void;\n promptSecret: (prompt: string) => Promise<string>;\n promptConfirm?: (text: string, defaultYes: boolean) => Promise<boolean>;\n },\n): Promise<string[]> {\n const { missingHosts, matchedPairs, progress, promptSecret } = options;\n const promptConfirm = options.promptConfirm ?? defaultPromptConfirm;\n\n if (missingHosts.length === 0) {\n return matchedPairs.map((p) => p.vaultId).filter((id, i, a) => a.indexOf(id) === i);\n }\n\n let catalog: Array<Record<string, unknown>> = [];\n try {\n const raw = await client.getVaultCatalog();\n catalog = ((raw || []) as unknown[]).filter((c) => !!c && typeof c === 'object') as Array<Record<string, unknown>>;\n } catch {\n catalog = [];\n }\n\n const resolved = missingHosts.map((h) => resolveTemplateForHost(h, catalog));\n\n if (progress) {\n for (const r of resolved) {\n const note = r.templateId\n ? `will use catalog template '${r.templateId}'`\n : `will create custom binding (${r.authType})`;\n progress(` • ${r.host} → \\${${r.credentialKey}} (${note})`);\n }\n }\n\n const ok = await promptConfirm(\n `Bootstrap a vault now and walk through ${resolved.length} secret(s)?`,\n true,\n );\n if (!ok) {\n throw new CookbookError(\n 'Vault setup declined; deploy aborted. See `instavm vault setup --help` to run the same flow later.',\n );\n }\n\n const { vaultId: targetVaultId, vaultName: targetVaultName } = await bootstrapTargetVault(\n client,\n manifest,\n matchedPairs,\n progress,\n promptConfirm,\n );\n\n let existingCreds: unknown[] = [];\n try {\n existingCreds = await client.listVaultCredentials(targetVaultId);\n } catch {\n existingCreds = [];\n }\n\n const boundTemplateIds: string[] = [];\n\n for (const r of resolved) {\n const existingId = existingCredentialId(existingCreds, r.credentialKey);\n if (existingId == null) {\n const value = await promptSecret(` Value for ${r.label} (${r.credentialKey}): `);\n if (!value) {\n throw new CookbookError(`Empty value for ${r.credentialKey}; vault setup aborted.`);\n }\n try {\n await client.addVaultCredential(targetVaultId, r.credentialKey, value, {\n description: `Created by \\`instavm deploy\\` for ${manifest.slug} → ${r.host}`,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new CookbookError(`Could not store ${r.credentialKey} in vault ${targetVaultId}: ${msg}`);\n }\n if (progress) progress(` Stored ${r.credentialKey} (value not echoed)`);\n } else if (progress) {\n progress(` Reusing existing credential ${r.credentialKey} (${existingId}) already in ${targetVaultName}`);\n }\n\n if (r.templateId) {\n boundTemplateIds.push(r.templateId);\n continue;\n }\n\n try {\n await client.addVaultService(targetVaultId, r.host, authConfigForResolved(r), {\n description: `Bound by \\`instavm deploy\\` for ${manifest.slug}`,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new CookbookError(`Could not bind ${r.host} on vault ${targetVaultId}: ${msg}`);\n }\n if (progress) progress(` Bound ${r.host} → ${targetVaultName}`);\n }\n\n if (boundTemplateIds.length > 0) {\n const unique = [...new Set(boundTemplateIds)];\n try {\n await client.addVaultServicesFromTemplates(targetVaultId, unique);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new CookbookError(`Could not bind catalog templates ${unique.join(', ')} on vault ${targetVaultId}: ${msg}`);\n }\n if (progress) {\n for (const tid of unique) {\n progress(` Bound template '${tid}' → ${targetVaultName}`);\n }\n }\n }\n\n if (progress) progress(`Vault ${targetVaultId} ready (extends ${targetVaultName})`);\n\n const out: string[] = [targetVaultId];\n for (const p of matchedPairs) {\n if (!out.includes(p.vaultId)) out.push(p.vaultId);\n }\n return out;\n}\n","import fs from 'fs';\nimport crypto from 'crypto';\nimport path from 'path';\nimport { spawnSync, type SpawnSyncReturns } from 'child_process';\nimport { Command, CommanderError } from 'commander';\nimport { InstaVM, type InstaVMOptions } from './client/InstaVM';\nimport { registerBillingCommands } from './cli/billing';\nimport { registerLoginCommand } from './cli/login';\nimport { registerPtyCommand } from './cli/pty';\nimport { registerTapeCommands } from './cli/tape';\nimport { registerVaultCommands } from './cli/vault';\nimport {\n CookbookDeployError,\n CookbookError,\n type CookbookDeployOptions,\n type CookbookVaultDeployOptions,\n emitCookbookDeployError,\n deployCookbook,\n runDeploy,\n discoverCookbooks,\n loadManifest,\n manifestDisplayRecord,\n resolveCookbookRoot,\n type CookbookJsonOptions,\n} from './cli/cookbook';\nimport { detectProject, planToManifest, type DeployPlan } from './cli/detect';\nimport {\n ConfigError,\n DEFAULT_BILLING_URL,\n DEFAULT_DOCS_URL,\n getActiveProfile,\n getConfigDir,\n redactSecret,\n resolveRuntimeConfig,\n updateProfileSettings,\n type CLIConfig,\n type RuntimeConfig,\n} from './cli/config';\n\ntype Writeable = Pick<NodeJS.WriteStream, 'write'> & Partial<Pick<NodeJS.WriteStream, 'isTTY'>>;\n\n/** Stream-only slice passed into helpers also used from `cli/billing.ts` (avoids contravariance issues). */\ntype CliStreamDeps = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\nexport interface CliDeps {\n stdout: Writeable;\n stderr: Writeable;\n spawnSync: typeof spawnSync;\n resolveRuntimeConfig: typeof resolveRuntimeConfig;\n updateProfileSettings: typeof updateProfileSettings;\n clientFactory: (apiKey: string, options: InstaVMOptions) => InstaVM;\n promptSecret: (prompt: string) => Promise<string>;\n readStdin: () => Promise<string>;\n writeFile: (outputPath: string, content: Buffer) => void;\n}\n\nconst defaultDeps: CliDeps = {\n stdout: process.stdout,\n stderr: process.stderr,\n spawnSync,\n resolveRuntimeConfig,\n updateProfileSettings,\n clientFactory: (apiKey, options) => new InstaVM(apiKey, options),\n promptSecret,\n readStdin,\n writeFile: (outputPath, content) => {\n fs.writeFileSync(outputPath, content);\n },\n};\n\nconst ACTIVE_VM_STATUSES = new Set(['active', 'running', 'creating']);\nconst INTERACTIVE_PROGRESS_PREFIXES = ['Resolving public snapshot ', 'Reusing saved snapshot ', 'Retrying VM creation '];\nconst INTERACTIVE_PROGRESS_STEPS = new Set([\n 'Creating VM',\n 'Waiting for SSH access',\n 'Uploading cookbook source',\n 'Uploading source',\n 'Running cookbook setup',\n 'Running setup',\n 'Starting application service',\n 'Starting service',\n 'Waiting for application healthcheck',\n 'Waiting for healthcheck',\n 'Creating public share',\n 'Verifying public share URL',\n 'Detecting project',\n 'Creating snapshot',\n]);\n\nfunction printJson(deps: CliStreamDeps, payload: unknown): void {\n deps.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction printLines(deps: CliStreamDeps, lines: string[]): void {\n for (const line of lines) {\n deps.stdout.write(`${line}\\n`);\n }\n}\n\nfunction printErrorLines(deps: CliStreamDeps, lines: string[]): void {\n for (const line of lines) {\n deps.stderr.write(`${line}\\n`);\n }\n}\n\nfunction supportsAnsi(stream: Writeable): boolean {\n return Boolean(stream.isTTY) && !process.env.NO_COLOR && process.env.TERM !== 'dumb';\n}\n\nfunction styleText(text: string, codes: string[], enabled: boolean): string {\n if (!enabled || codes.length === 0) {\n return text;\n }\n return `\\u001B[${codes.join(';')}m${text}\\u001B[0m`;\n}\n\nfunction statusBadge(status: unknown, enabled: boolean): string {\n const label = displayValue(status);\n const normalized = label.toLowerCase();\n let badge = '●';\n let codes = ['31'];\n if (ACTIVE_VM_STATUSES.has(normalized) || normalized === 'ready') {\n codes = ['32'];\n } else if (normalized === 'building' || normalized === 'creating' || normalized === 'pending') {\n codes = ['33'];\n }\n badge = styleText(badge, codes, enabled);\n return `${badge} ${label}`;\n}\n\nfunction parseWatchSeconds(value: unknown): number | null {\n if (value === undefined || value === false) {\n return null;\n }\n if (value === true) {\n return 5;\n }\n const seconds = Number.parseInt(String(value), 10);\n if (Number.isNaN(seconds) || seconds <= 0) {\n throw new Error('--watch must be a positive integer');\n }\n return seconds;\n}\n\nasync function emitWatchOutput(\n deps: CliDeps,\n options: { json?: boolean; watch?: unknown },\n render: () => Promise<{ payload: unknown; textLines: string[] }>,\n): Promise<number> {\n const watchSeconds = parseWatchSeconds(options.watch);\n const clearBetweenFrames = !options.json && supportsAnsi(deps.stdout);\n let first = true;\n\n while (true) {\n const { payload, textLines } = await render();\n if (!first && clearBetweenFrames) {\n deps.stdout.write('\\u001Bc');\n }\n emitOutput(deps, options, payload, textLines);\n if (watchSeconds === null) {\n return 0;\n }\n first = false;\n await new Promise((resolve) => setTimeout(resolve, watchSeconds * 1000));\n }\n}\n\nasync function withSpinner<T>(\n deps: CliDeps,\n options: { json?: boolean },\n message: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const renderer = new ProgressRenderer(deps, options);\n try {\n renderer.step(message);\n return await callback();\n } finally {\n renderer.stop();\n }\n}\n\nfunction titleCaseLabel(value: string): string {\n return value\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\nfunction displayValue(value: unknown, fallback: string = '-'): string {\n if (value === null || value === undefined) {\n return fallback;\n }\n const text = String(value).trim();\n return text || fallback;\n}\n\nfunction formatTable(headers: string[], rows: string[][]): string[] {\n const widths = headers.map((header) => header.length);\n const normalizedRows = rows.map((row) => row.map((cell) => displayValue(cell)));\n\n for (const row of normalizedRows) {\n row.forEach((cell, index) => {\n widths[index] = Math.max(widths[index], cell.length);\n });\n }\n\n const formatRow = (row: string[]) => ` ${row.map((cell, index) => cell.padEnd(widths[index], ' ')).join(' ')}`;\n const separator = ` ${widths.map((width) => '-'.repeat(width)).join(' ')}`;\n return [formatRow(headers), separator, ...normalizedRows.map((row) => formatRow(row))];\n}\n\nfunction formatCookbookList(cookbooks: Array<Record<string, any>>): string[] {\n if (cookbooks.length === 0) {\n return ['No cookbooks found.'];\n }\n\n const categoryOrder = new Map([\n ['web', 0],\n ['graphics', 1],\n ['agents', 2],\n ]);\n const sorted = [...cookbooks].sort((left, right) => {\n const leftCategory = String(left.category || 'other');\n const rightCategory = String(right.category || 'other');\n const categoryRankCompare = (categoryOrder.get(leftCategory) ?? 99) - (categoryOrder.get(rightCategory) ?? 99);\n if (categoryRankCompare !== 0) {\n return categoryRankCompare;\n }\n const categoryCompare = leftCategory.localeCompare(rightCategory);\n if (categoryCompare !== 0) {\n return categoryCompare;\n }\n const secretCompare = Number(Boolean(left.requires_secrets)) - Number(Boolean(right.requires_secrets));\n if (secretCompare !== 0) {\n return secretCompare;\n }\n return String(left.title || left.slug || '').localeCompare(String(right.title || right.slug || ''));\n });\n const featured = sorted.filter((entry) => !entry.requires_secrets);\n\n const titleWidth = Math.min(\n 20,\n Math.max(...sorted.map((entry) => String(entry.title || '').length), 'Title'.length),\n );\n const slugWidth = Math.max(...sorted.map((entry) => String(entry.slug || '').length), 'Slug'.length);\n\n const renderEntry = (entry: Record<string, any>) => {\n const title = String(entry.title || '').padEnd(titleWidth, ' ');\n const slug = String(entry.slug || '').padEnd(slugWidth, ' ');\n const secretState = entry.requires_secrets ? 'key' : 'no key';\n return ` ${title} ${slug} :${entry.port} ${secretState}`;\n };\n\n const lines = [`Cookbooks (${cookbooks.length})`];\n\n if (featured.length > 0) {\n lines.push('', 'Try first');\n for (const entry of featured) {\n lines.push(renderEntry(entry));\n }\n }\n\n let currentCategory: string | null = null;\n for (const entry of sorted) {\n if (!entry.requires_secrets) {\n continue;\n }\n const category = String(entry.category || 'other');\n if (category !== currentCategory) {\n lines.push('', titleCaseLabel(category));\n currentCategory = category;\n }\n lines.push(renderEntry(entry));\n }\n\n lines.push('', 'Use `instavm cookbook info <slug>` for details.', 'Use `instavm cookbook deploy <slug>` to launch one.');\n return lines;\n}\n\nfunction formatWhoamiOutput(payload: Record<string, any>): string[] {\n const sshKeys = Array.isArray(payload.ssh_keys) ? payload.ssh_keys : [];\n const lines = [\n 'Account',\n ` Email: ${displayValue(payload.email)}`,\n ` User ID: ${displayValue(payload.id)}`,\n ` Name: ${displayValue(payload.name)}`,\n ` Verified: ${payload.is_verified ? 'yes' : 'no'}`,\n '',\n `SSH Keys (${sshKeys.length})`,\n ];\n\n if (sshKeys.length > 0) {\n lines.push(...formatTable(\n ['ID', 'Fingerprint', 'Comment'],\n sshKeys.map((key: Record<string, any>) => [\n displayValue(key.id),\n displayValue(key.fingerprint),\n displayValue(key.comment),\n ]),\n ));\n } else {\n lines.push(' none');\n }\n\n return lines;\n}\n\nfunction formatVmList(vms: Array<Record<string, any>>, includeAll: boolean, colorEnabled: boolean = false): string[] {\n return [\n includeAll ? `VMs (${vms.length})` : `Active VMs (${vms.length})`,\n ...(includeAll ? [] : ['Use `instavm ls --all` to include terminated VMs.']),\n '',\n ...formatTable(\n ['ID', 'Status', 'Created', 'SSH'],\n vms.map((vm) => [\n displayValue(vm.vm_id),\n statusBadge(vm.status, colorEnabled),\n displayValue(vm.created_at),\n displayValue(vm.ssh_host),\n ]),\n ),\n ];\n}\n\nfunction formatSnapshotList(snapshots: Array<Record<string, any>>): string[] {\n return [\n `Snapshots (${snapshots.length})`,\n '',\n ...formatTable(\n ['ID', 'Name', 'Status', 'Type'],\n snapshots.map((snapshot) => [\n displayValue(snapshot.id),\n displayValue(snapshot.name),\n displayValue(snapshot.status),\n displayValue(snapshot.type),\n ]),\n ),\n ];\n}\n\nfunction formatDurationSeconds(value: unknown): string {\n if (value == null) return '-';\n const seconds = Number(value);\n if (Number.isNaN(seconds)) return String(value);\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n if (m < 60) return `${m}m${String(s).padStart(2, '0')}s`;\n const h = Math.floor(m / 60);\n const mm = m % 60;\n return `${h}h${String(mm).padStart(2, '0')}m`;\n}\n\nfunction formatRecordingList(recordings: Array<Record<string, any>>): string[] {\n if (!recordings.length) return ['No recordings.'];\n return [\n `Recordings (${recordings.length})`,\n '',\n ...formatTable(\n ['ID', 'Session', 'Status', 'Duration'],\n recordings.map((r) => [\n displayValue(r.id),\n displayValue(r.session_id ?? r.sessionId),\n displayValue(r.status),\n formatDurationSeconds(r.duration_seconds ?? r.durationSeconds),\n ]),\n ),\n ];\n}\n\nfunction formatRecordingDetail(rec: Record<string, any>): string[] {\n return [\n `ID: ${displayValue(rec.id)}`,\n `Session: ${displayValue(rec.session_id ?? rec.sessionId)}`,\n `Status: ${displayValue(rec.status)}`,\n `Duration: ${formatDurationSeconds(rec.duration_seconds ?? rec.durationSeconds)}`,\n `Content type: ${displayValue(rec.content_type ?? rec.contentType)}`,\n `Created: ${displayValue(rec.created_at ?? rec.createdAt)}`,\n `Updated: ${displayValue(rec.updated_at ?? rec.updatedAt)}`,\n `Download URL: ${displayValue(rec.download_url ?? rec.downloadUrl)}`,\n ];\n}\n\nfunction formatSshKeyList(keys: Array<Record<string, any>>): string[] {\n return [\n `SSH Keys (${keys.length})`,\n '',\n ...formatTable(\n ['ID', 'Fingerprint', 'Comment'],\n keys.map((key) => [\n displayValue(key.id),\n displayValue(key.fingerprint),\n displayValue(key.comment),\n ]),\n ),\n ];\n}\n\nfunction formatVolumeList(volumes: Array<Record<string, any>>): string[] {\n return [\n `Volumes (${volumes.length})`,\n '',\n ...formatTable(\n ['ID', 'Name', 'Usage', 'Status'],\n volumes.map((entry) => [\n displayValue(entry.id),\n displayValue(entry.name),\n `${humanBytes(entry.used_bytes)} / ${humanBytes(entry.quota_bytes)}`,\n displayValue(entry.status),\n ]),\n ),\n ];\n}\n\nfunction formatCheckpointList(checkpoints: Array<Record<string, any>>): string[] {\n return [\n `Checkpoints (${checkpoints.length})`,\n '',\n ...formatTable(\n ['ID', 'Name', 'Status'],\n checkpoints.map((entry) => [\n displayValue(entry.id),\n displayValue(entry.name),\n displayValue(entry.status),\n ]),\n ),\n ];\n}\n\nfunction formatFileList(files: Array<Record<string, any>>): string[] {\n return [\n `Files (${files.length})`,\n '',\n ...formatTable(\n ['Path', 'Size'],\n files.map((entry) => [\n displayValue(entry.path),\n humanBytes(entry.size),\n ]),\n ),\n ];\n}\n\nfunction normalizeEgressPayload(payload: Record<string, any>, targetType: 'session' | 'vm', targetId: string): Record<string, any> {\n const normalized: Record<string, any> = {\n target_type: targetType,\n target_id: targetId,\n allow_package_managers: payload.allow_package_managers ?? payload.allow_public_repos ?? payload.allowPackageManagers ?? true,\n allow_http: payload.allow_http ?? payload.allowHttp ?? true,\n allow_https: payload.allow_https ?? payload.allowHttps ?? true,\n allowed_domains: payload.allowed_domains ?? payload.allowedDomains ?? [],\n allowed_cidrs: payload.allowed_cidrs ?? payload.allowedCidrs ?? [],\n };\n if (payload.status !== undefined) {\n normalized.status = payload.status;\n }\n return normalized;\n}\n\nfunction formatEgressText(payload: Record<string, any>): string[] {\n const lines = [`Target: ${payload.target_type} ${payload.target_id}`];\n if (payload.status) {\n lines.push(`Status: ${payload.status}`);\n }\n lines.push(\n `Package managers: ${payload.allow_package_managers ? 'allowed' : 'blocked'}`,\n `HTTP: ${payload.allow_http ? 'allowed' : 'blocked'}`,\n `HTTPS: ${payload.allow_https ? 'allowed' : 'blocked'}`,\n `Domains: ${(payload.allowed_domains || []).join(', ') || 'none'}`,\n `CIDRs: ${(payload.allowed_cidrs || []).join(', ') || 'none'}`,\n );\n return lines;\n}\n\nfunction appendOutputBlock(lines: string[], label: string, value: unknown): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n const text = String(value);\n if (!text) {\n return false;\n }\n lines.push('', label, ...text.replace(/\\n$/, '').split('\\n'));\n return true;\n}\n\nfunction formatExecText(payload: Record<string, any>): string[] {\n const lines: string[] = [];\n if (payload.task_id) {\n lines.push(`Task: ${payload.task_id}`);\n }\n if (payload.session_id) {\n lines.push(`Session: ${payload.session_id}`);\n }\n if (payload.language) {\n lines.push(`Language: ${payload.language}`);\n }\n if (payload.created_at) {\n lines.push(`Created: ${payload.created_at}`);\n }\n if (payload.execution_time !== undefined) {\n lines.push(`Execution time: ${payload.execution_time}`);\n }\n if (payload.cpu_time !== undefined) {\n lines.push(`CPU time: ${payload.cpu_time}`);\n }\n let hasOutput = false;\n hasOutput = appendOutputBlock(lines, 'Stdout', payload.stdout ?? payload.output) || hasOutput;\n hasOutput = appendOutputBlock(lines, 'Stderr', payload.stderr) || hasOutput;\n if (!hasOutput) {\n lines.push('No output.');\n }\n return lines;\n}\n\nfunction formatBrowserReadText(payload: Record<string, any>): string[] {\n const readable = payload.readable_content || {};\n const navigation = payload.navigation || {};\n const title = readable.title || navigation.title || '-';\n const url = readable.url || navigation.url || payload.url || '-';\n const content = String(readable.content || '').trim();\n return [\n `Session: ${payload.session_id || '-'}`,\n `URL: ${url}`,\n `Title: ${title}`,\n `Interactive elements: ${(payload.interactive_elements || []).length}`,\n `Anchors: ${(payload.content_anchors || []).length}`,\n '',\n ...(content ? content.split('\\n') : ['No readable content.']),\n ];\n}\n\nclass ProgressRenderer {\n private readonly enabled: boolean;\n\n private currentMessage: string | null = null;\n\n private startedAt = 0;\n\n private timer: NodeJS.Timeout | null = null;\n\n private frame = 0;\n\n constructor(private readonly deps: CliDeps, private readonly options: { json?: boolean }) {\n this.enabled = !options.json && supportsAnsi(deps.stderr);\n }\n\n step(message: string): void {\n if (this.options.json) {\n return;\n }\n if (!this.enabled) {\n this.note(`${message}...`);\n return;\n }\n if (message !== this.currentMessage) {\n this.startedAt = Date.now();\n this.frame = 0;\n }\n this.currentMessage = message;\n if (!this.timer) {\n this.timer = setInterval(() => this.render(), 180);\n this.render();\n }\n }\n\n note(message: string): void {\n if (this.options.json) {\n return;\n }\n if (!this.enabled) {\n this.deps.stderr.write(`${message}\\n`);\n return;\n }\n this.currentMessage = null;\n this.startedAt = 0;\n this.clearLine();\n this.deps.stderr.write(`${message}\\n`);\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n if (this.enabled) {\n this.currentMessage = null;\n this.clearLine();\n }\n }\n\n private render(): void {\n if (!this.currentMessage) {\n return;\n }\n const suffixes = ['', '.', '..', '...'];\n const elapsed = this.startedAt ? Math.floor((Date.now() - this.startedAt) / 1000) : 0;\n this.deps.stderr.write(`\\r\\u001B[2K${this.currentMessage}${suffixes[this.frame % suffixes.length]} ${elapsed}s`);\n this.frame += 1;\n }\n\n private clearLine(): void {\n this.deps.stderr.write('\\r\\u001B[2K');\n }\n}\n\nfunction filterActiveVms(vms: Array<Record<string, any>>): Array<Record<string, any>> {\n return vms.filter((vm) => ACTIVE_VM_STATUSES.has(String(vm.status || '').toLowerCase()));\n}\n\nfunction normalizeArgv(argv: string[]): string[] {\n return argv.map((token) => (token === '-all' ? '--all' : token));\n}\n\nfunction emitOutput(\n deps: CliStreamDeps,\n options: { json?: boolean },\n payload: unknown,\n textLines: string[],\n): number {\n if (options.json) {\n printJson(deps, payload);\n } else {\n printLines(deps, textLines);\n }\n return 0;\n}\n\nfunction progress(deps: CliDeps, options: { json?: boolean }, message: string): void {\n if (!options.json) {\n deps.stderr.write(`${message}\\n`);\n }\n}\n\nfunction shouldSpin(message: string): boolean {\n return INTERACTIVE_PROGRESS_STEPS.has(message) || INTERACTIVE_PROGRESS_PREFIXES.some((prefix) => message.startsWith(prefix));\n}\n\nfunction cookbookProgress(renderer: ProgressRenderer, message: string): void {\n if (shouldSpin(message)) {\n renderer.step(message);\n } else {\n renderer.note(message);\n }\n}\n\nfunction formatCookbookDeploySuccess(options: { json?: boolean }, deps: CliDeps, payload: Record<string, any>): string[] {\n const colorEnabled = !options.json && supportsAnsi(deps.stdout);\n const vmId = String(payload.vm_id || '');\n const slug = String(payload.slug || '');\n const displayUrl = String(payload.share_url || '').replace(/\\/$/, '');\n const connectHint = vmId ? `instavm connect ${vmId}` : '-';\n const logsHint = slug ? `After connecting: tail -n 200 ~/.instavm-cookbooks/logs/${slug}.log` : '-';\n return [\n styleText('Cookbook ready', ['1', '32'], colorEnabled),\n '',\n ` Cookbook ${slug}`,\n ` VM ${vmId}`,\n ` URL ${styleText(displayUrl, ['32', '4'], colorEnabled)}`,\n ` Connect ${connectHint}`,\n ` Logs ${logsHint}`,\n ` Destroy ${payload.destroy_command}`,\n ...(payload.notes?.length ? ['', ' Notes', ...payload.notes.map((note: string) => ` - ${note}`)] : []),\n ];\n}\n\nfunction formatCookbookDeployFailure(options: { json?: boolean }, deps: CliDeps, message: string, payload: Record<string, any>): string[] {\n const colorEnabled = !options.json && supportsAnsi(deps.stderr);\n const vmId = String(payload.vm_id || '');\n const slug = String(payload.slug || '');\n const connectHint = vmId ? `instavm connect ${vmId}` : '-';\n const logsHint = vmId && slug ? `After connecting: tail -n 200 ~/.instavm-cookbooks/logs/${slug}.log` : '-';\n return [\n styleText('Deploy failed', ['1', '31'], colorEnabled),\n ` Error ${message}`,\n ` VM ${vmId || '-'}`,\n ` Connect ${connectHint}`,\n ` Logs ${logsHint}`,\n ` Destroy ${payload.destroy_command || '-'}`,\n ];\n}\n\nfunction emitCookbookStyleFailure(\n deps: CliDeps,\n options: { json?: boolean },\n error: unknown,\n commanderCode: string,\n fallbackPayload: Record<string, any> = {},\n): never {\n if (!(error instanceof CookbookError)) {\n throw error;\n }\n\n const payload = {\n status: 'failed',\n error: error.message,\n ...fallbackPayload,\n ...(error instanceof CookbookDeployError ? error.payload : {}),\n };\n\n if (options.json) {\n emitCookbookDeployError(deps, options, payload);\n } else {\n printErrorLines(deps, formatCookbookDeployFailure(options, deps, error.message, payload));\n }\n throw new CommanderError(1, commanderCode, '');\n}\n\nfunction printDeployPlan(deps: CliDeps, plan: DeployPlan): void {\n const runtimeLabel: Record<string, string> = { node: 'Node.js', python: 'Python', static: 'Static Site', go: 'Go', deno: 'Deno' };\n const label = runtimeLabel[plan.runtime] || plan.runtime;\n const lines = [\n '',\n ` Detected: ${label} (${plan.packageManager})`,\n '',\n ` Install: ${plan.installCommand}`,\n ];\n if (plan.buildCommand) lines.push(` Build: ${plan.buildCommand}`);\n lines.push(\n ` Start: ${plan.startCommand}`,\n ` Port: ${plan.port}`,\n ` Health: ${plan.healthPath}`,\n );\n if (plan.secrets.length > 0) {\n lines.push('', ' Secrets:');\n for (const s of plan.secrets) {\n const envVal = process.env[s.env_name] || '';\n if (envVal) {\n lines.push(` ${s.env_name}: set (from environment)`);\n } else {\n lines.push(` ${s.env_name}: (not set — will prompt)`);\n }\n }\n }\n lines.push('');\n printLines(deps, lines);\n}\n\nfunction getDeployCacheDir(): string {\n const cacheDir = path.join(getConfigDir(), 'deploys');\n fs.mkdirSync(cacheDir, { recursive: true, mode: 0o700 });\n try {\n fs.chmodSync(cacheDir, 0o700);\n } catch {\n // ignore chmod failures on unsupported platforms/filesystems\n }\n return cacheDir;\n}\n\nfunction getDeployCachePath(projectPath: string): string {\n const digest = crypto.createHash('sha256').update(path.resolve(projectPath)).digest('hex');\n return path.join(getDeployCacheDir(), `${digest}.json`);\n}\n\nfunction deployFingerprint(plan: DeployPlan): string {\n return crypto.createHash('sha256').update(JSON.stringify({\n slug: plan.slug,\n runtime: plan.runtime,\n package_manager: plan.packageManager,\n install_command: plan.installCommand,\n build_command: plan.buildCommand,\n start_command: plan.startCommand,\n port: plan.port,\n health_path: plan.healthPath,\n })).digest('hex');\n}\n\nfunction loadDeployRecord(projectPath: string): Record<string, any> | null {\n const recordPath = getDeployCachePath(projectPath);\n if (!fs.existsSync(recordPath)) return null;\n try {\n return JSON.parse(fs.readFileSync(recordPath, 'utf8'));\n } catch {\n return null;\n }\n}\n\nfunction saveDeployRecord(projectPath: string, record: Record<string, any>): void {\n const recordPath = getDeployCachePath(projectPath);\n fs.writeFileSync(recordPath, `${JSON.stringify(record, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 });\n try {\n fs.chmodSync(recordPath, 0o600);\n } catch {\n // ignore chmod failures on unsupported platforms/filesystems\n }\n}\n\nasync function resolveSavedSnapshot(\n client: InstaVM,\n projectPath: string,\n plan: DeployPlan,\n progress?: (message: string) => void,\n): Promise<string | undefined> {\n const record = loadDeployRecord(projectPath);\n if (!record) return undefined;\n const snapshotId = String(record.snapshot_id || '').trim();\n if (!snapshotId || record.fingerprint !== deployFingerprint(plan)) return undefined;\n try {\n const snapshot = await client.snapshots.get(snapshotId);\n const status = String(snapshot.status || '').toLowerCase();\n if (status && status !== 'ready') return undefined;\n } catch {\n return undefined;\n }\n progress?.(`Reusing saved snapshot ${snapshotId}`);\n return snapshotId;\n}\n\nasync function createDeploySnapshot(\n client: InstaVM,\n projectPath: string,\n plan: DeployPlan,\n payload: Record<string, any>,\n progress?: (message: string) => void,\n): Promise<string | undefined> {\n const vmId = String(payload.vm_id || '').trim();\n if (!vmId) return undefined;\n progress?.('Creating snapshot');\n let result: Record<string, any>;\n try {\n result = await client.vms.snapshot(vmId, { name: `deploy/${plan.slug}` }, true);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CookbookError(`Failed to create deploy snapshot: ${message}`);\n }\n const snapshotId = String(result.snapshot_id || result.id || '').trim();\n if (!snapshotId) return undefined;\n saveDeployRecord(projectPath, {\n slug: plan.slug,\n project_path: path.resolve(projectPath),\n snapshot_id: snapshotId,\n vm_id: vmId,\n share_url: payload.share_url || null,\n last_deployed: new Date().toISOString(),\n fingerprint: deployFingerprint(plan),\n plan: {\n runtime: plan.runtime,\n package_manager: plan.packageManager,\n install_command: plan.installCommand,\n build_command: plan.buildCommand,\n start_command: plan.startCommand,\n port: plan.port,\n health_path: plan.healthPath,\n },\n });\n return snapshotId;\n}\n\nfunction formatDeploySuccess(options: { json?: boolean }, deps: CliDeps, payload: Record<string, any>): string[] {\n const colorEnabled = !options.json && supportsAnsi(deps.stdout);\n const vmId = String(payload.vm_id || '');\n const slug = String(payload.slug || '');\n const displayUrl = String(payload.share_url || '').replace(/\\/$/, '');\n const connectHint = vmId ? `instavm connect ${vmId}` : '-';\n return [\n styleText('Deployed', ['1', '32'], colorEnabled),\n '',\n ` App ${slug}`,\n ` VM ${vmId}`,\n ` URL ${styleText(displayUrl, ['32', '4'], colorEnabled)}`,\n ` Connect ${connectHint}`,\n ` Destroy ${payload.destroy_command || ''}`,\n ...(payload.reused_snapshot_id ? [` Snapshot reused ${payload.reused_snapshot_id}`] : []),\n ...(payload.saved_snapshot_id ? [` Snapshot saved ${payload.saved_snapshot_id}`] : []),\n ];\n}\n\nfunction addRuntimeOptions(command: Command, options: { includeJson?: boolean; includeSshHost?: boolean } = {}): Command {\n command.option('--api-key <apiKey>', 'Override the InstaVM API key for this command');\n command.option('--base-url <baseUrl>', 'Override the InstaVM API base URL for this command');\n if (options.includeSshHost) {\n command.option('--ssh-host <sshHost>', 'Override the SSH gateway host for this command');\n }\n if (options.includeJson !== false) {\n command.option('-j, --json', 'Emit JSON output');\n }\n return command;\n}\n\nfunction parseSize(value: string): number {\n const raw = value.trim().toLowerCase();\n if (!raw) {\n throw new Error('size is required');\n }\n const units: Array<[string, number]> = [\n ['tb', 1024 ** 4],\n ['gb', 1024 ** 3],\n ['mb', 1024 ** 2],\n ['kb', 1024],\n ['b', 1],\n ];\n for (const [suffix, multiplier] of units) {\n if (raw.endsWith(suffix) && raw !== suffix) {\n const number = raw.slice(0, -suffix.length).trim();\n return Math.floor(Number.parseFloat(number) * multiplier);\n }\n }\n return Number.parseInt(raw, 10);\n}\n\nfunction humanBytes(value?: number | null): string {\n let amount = Number(value || 0);\n for (const unit of ['B', 'KB', 'MB', 'GB', 'TB']) {\n if (amount < 1024 || unit === 'TB') {\n if (unit === 'B') {\n return `${Math.trunc(amount)}${unit}`;\n }\n return `${amount.toFixed(1)}${unit}`;\n }\n amount /= 1024;\n }\n return `${Math.trunc(Number(value || 0))}B`;\n}\n\nfunction parseEnvPairs(values?: string[]): Record<string, string> {\n const pairs: Record<string, string> = {};\n for (const entry of values || []) {\n const separatorIndex = entry.indexOf('=');\n if (separatorIndex < 1) {\n throw new Error(`Expected KEY=VALUE, got: ${entry}`);\n }\n const key = entry.slice(0, separatorIndex).trim();\n const value = entry.slice(separatorIndex + 1);\n if (!key) {\n throw new Error(`Invalid env key: ${entry}`);\n }\n pairs[key] = value;\n }\n return pairs;\n}\n\nfunction parseVolumeSpec(spec: string): Record<string, string | null> {\n const parts = spec.split(':');\n if (parts.length < 2) {\n throw new Error('volume mounts must use <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]');\n }\n const volumeId = parts[0].trim();\n const mountPath = parts[1].trim();\n let mode = 'rw';\n let checkpointId: string | null = null;\n if (parts[2]?.trim()) {\n mode = parts[2].trim().toLowerCase();\n }\n if (parts[3]?.trim()) {\n checkpointId = parts[3].trim();\n }\n if (parts.length > 4) {\n throw new Error('volume mounts must use <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]');\n }\n if (!['rw', 'ro'].includes(mode)) {\n throw new Error('volume mount mode must be rw or ro');\n }\n if (mode === 'rw' && checkpointId) {\n throw new Error('checkpoint_id is only allowed for ro mounts');\n }\n if (mode === 'ro' && !checkpointId) {\n checkpointId = 'latest';\n }\n return {\n volume_id: volumeId,\n mount_path: mountPath,\n mode,\n checkpoint_id: checkpointId,\n };\n}\n\nfunction looksLikeUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction statusPayload(deps: CliDeps, options: { apiKey?: string; baseUrl?: string; sshHost?: string }) {\n const settings = deps.resolveRuntimeConfig({\n apiKey: options.apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n const profile = getActiveProfile(settings.config as CLIConfig);\n const storedKey = profile.auth?.api_key ? String(profile.auth.api_key) : undefined;\n\n return {\n config_path: settings.configPath,\n active_profile: settings.config.active_profile,\n api_key: {\n configured: Boolean(settings.apiKey),\n redacted: redactSecret(settings.apiKey),\n source: settings.apiKeySource,\n stored: Boolean(storedKey),\n },\n base_url: {\n value: settings.baseURL,\n source: settings.baseURLSource,\n },\n ssh_host: {\n value: settings.sshHost,\n source: settings.sshHostSource,\n },\n };\n}\n\nfunction statusText(payload: ReturnType<typeof statusPayload>): string[] {\n const lines = [\n `Config path: ${payload.config_path}`,\n `Active profile: ${payload.active_profile}`,\n `API key: ${payload.api_key.redacted || 'not configured'} (${payload.api_key.source})`,\n `Base URL: ${payload.base_url.value} (${payload.base_url.source})`,\n `SSH host: ${payload.ssh_host.value} (${payload.ssh_host.source})`,\n ];\n if (payload.api_key.stored) {\n lines.push('Stored key: present');\n }\n return lines;\n}\n\nfunction resolveSettings(deps: CliDeps, options: { apiKey?: string; baseUrl?: string; sshHost?: string }): RuntimeConfig {\n return deps.resolveRuntimeConfig({\n apiKey: options.apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n}\n\nfunction requireClient(\n deps: CliDeps,\n options: { apiKey?: string; baseUrl?: string; sshHost?: string },\n extraInstaOptions: InstaVMOptions = {},\n): { client: InstaVM; settings: RuntimeConfig } {\n const settings = resolveSettings(deps, options);\n if (!settings.apiKey) {\n throw new Error('No InstaVM API key configured. Run `instavm auth set-key` or export INSTAVM_API_KEY.');\n }\n return {\n client: deps.clientFactory(settings.apiKey, {\n baseURL: settings.baseURL,\n auto_start_session: false,\n ...extraInstaOptions,\n }),\n settings,\n };\n}\n\nfunction resolveTargetScope(options: { session?: string; vm?: string }): { targetType: 'session' | 'vm'; targetId: string } {\n if (options.session && options.vm) {\n throw new Error('Choose either --session or --vm, not both.');\n }\n if (options.session) {\n return { targetType: 'session', targetId: options.session };\n }\n if (options.vm) {\n return { targetType: 'vm', targetId: options.vm };\n }\n throw new Error('Provide either --session <id> or --vm <id>.');\n}\n\nfunction inferExecLanguage(sourcePath: string): string | undefined {\n const extension = path.extname(sourcePath).toLowerCase();\n if (extension === '.py') {\n return 'python';\n }\n if (extension === '.sh' || extension === '.bash') {\n return 'bash';\n }\n return undefined;\n}\n\nfunction resolveExecSource(options: { cmd?: string; source?: string; language?: string }): { command: string; language?: string; sourcePath?: string } {\n if (options.cmd && options.source) {\n throw new Error('Provide either --cmd or a file path, not both.');\n }\n if (options.cmd) {\n return { command: options.cmd, language: options.language };\n }\n if (!options.source) {\n throw new Error('Provide either --cmd or a file path.');\n }\n const sourcePath = path.resolve(options.source);\n const command = fs.readFileSync(sourcePath, 'utf8');\n return {\n command,\n language: options.language || inferExecLanguage(sourcePath),\n sourcePath,\n };\n}\n\nasync function resolveBrowserSession(\n client: InstaVM,\n options: { session?: string; url?: string },\n): Promise<{ session: any; temporary: boolean; navigation?: Record<string, any> }> {\n let temporary = false;\n const session = options.session\n ? client.browser.attachSession(options.session)\n : await client.browser.createSession();\n if (!options.session) {\n temporary = true;\n }\n let navigation: Record<string, any> | undefined;\n if (options.url) {\n navigation = await session.navigate(options.url);\n }\n return { session, temporary, navigation };\n}\n\nfunction writeScreenshotFile(deps: CliDeps, outputPath: string, base64Payload: string): string {\n const resolvedPath = path.resolve(outputPath);\n deps.writeFile(resolvedPath, Buffer.from(base64Payload, 'base64'));\n return resolvedPath;\n}\n\nasync function resolveDesktopTarget(client: InstaVM, target: string): Promise<Record<string, any>> {\n if (looksLikeUuid(target)) {\n const status = await client.getSessionStatus(target);\n return { ...status, session_id: target };\n }\n\n const vm = await client.vms.get(target);\n const sessionId = vm.session_id ? String(vm.session_id) : null;\n if (sessionId) {\n const status = await client.getSessionStatus(sessionId);\n return {\n ...status,\n session_id: sessionId,\n vm_id: status.vm_id || vm.vm_id,\n };\n }\n\n return {\n session_id: null,\n vm_id: vm.vm_id,\n vm_status: vm.status,\n vm_alive: vm.status === 'active',\n };\n}\n\nasync function desktopPayload(client: InstaVM, target: string): Promise<Record<string, any>> {\n const payload = await resolveDesktopTarget(client, target);\n if (payload.vm_alive && payload.session_id) {\n try {\n Object.assign(payload, await client.computerUse.viewerUrl(String(payload.session_id)));\n } catch (error) {\n // Ignore viewer lookup failures for non-desktop sessions in status calls.\n }\n }\n return payload;\n}\n\nexport function createProgram(deps: CliDeps = defaultDeps): Command {\n const program = new Command();\n program\n .name('instavm')\n .description('InstaVM CLI for VM, snapshot, volume, desktop, identity, and sharing workflows.')\n .showHelpAfterError()\n .showSuggestionAfterError()\n .configureOutput({\n writeOut: (str: string) => deps.stdout.write(str),\n writeErr: (str: string) => deps.stderr.write(str),\n })\n .addHelpCommand('help [command]', 'Show help for the CLI or a subcommand')\n .exitOverride();\n\n const auth = program.command('auth').description('Manage stored auth for the installed CLI');\n\n addRuntimeOptions(\n auth\n .command('set-key')\n .description('Store an InstaVM API key in ~/.instavm/config.json from a hidden prompt or stdin')\n .action(async (options: any) => {\n const apiKey = process.stdin.isTTY\n ? (await deps.promptSecret('InstaVM API key: ')).trim()\n : (await deps.readStdin()).trim();\n if (!apiKey) {\n throw new Error('API key is required. Enter it at the prompt or pipe it over stdin.');\n }\n\n const configPath = deps.updateProfileSettings({\n apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n const payload = {\n status: 'stored',\n config_path: configPath,\n api_key: redactSecret(apiKey),\n base_url: options.baseUrl || null,\n ssh_host: options.sshHost || null,\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Stored API key in ${configPath}`,\n `API key: ${payload.api_key}`,\n ...(options.baseUrl ? [`Default base URL: ${options.baseUrl}`] : []),\n ...(options.sshHost ? [`Default SSH host: ${options.sshHost}`] : []),\n ],\n );\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n auth\n .command('status')\n .description('Show the effective CLI auth and endpoint settings')\n .action(async (options: any) => {\n const payload = statusPayload(deps, options);\n emitOutput(deps, options, payload, statusText(payload));\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n auth\n .command('logout')\n .description('Remove the stored API key from the local CLI config')\n .action(async (options: any) => {\n const settings = resolveSettings(deps, options);\n const configPath = deps.updateProfileSettings({ clearApiKey: true });\n const payload = {\n status: 'logged_out',\n config_path: configPath,\n env_key_active: settings.apiKeySource === 'env',\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Removed the stored API key from ${configPath}`,\n ...(payload.env_key_active\n ? ['INSTAVM_API_KEY is still set in the environment and will remain active.']\n : []),\n ],\n );\n }),\n { includeSshHost: true },\n );\n\n addRuntimeOptions(\n program\n .command('whoami')\n .description('Show the current account and SSH key registrations')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const [user, sshKeys] = await Promise.all([client.getCurrentUser(), client.listSshKeys()]);\n const payload = {\n id: user.id,\n email: user.email,\n name: user.name,\n is_verified: user.is_verified,\n ssh_keys: sshKeys,\n };\n emitOutput(deps, options, payload, formatWhoamiOutput(payload));\n }),\n );\n\n registerLoginCommand(program, deps);\n registerBillingCommands(program, deps, (o, e) => requireClient(deps, o, e), emitOutput, addRuntimeOptions);\n registerTapeCommands(program, deps, (o, e) => requireClient(deps, o, e), emitOutput, addRuntimeOptions);\n registerVaultCommands(program, deps, (o, e) => requireClient(deps, o, e), emitOutput, addRuntimeOptions);\n registerPtyCommand(program, deps, (o, e) => requireClient(deps, o, e), addRuntimeOptions);\n\n addRuntimeOptions(\n program\n .command('create')\n .alias('new')\n .description('Create a new VM or desktop')\n .option('--type <type>', 'VM type', 'standard')\n .option('--timeout <seconds>', 'VM lifetime in seconds')\n .option('--memory <mb>', 'Memory in MB')\n .option('--vcpu <count>', 'vCPU count')\n .option('--snapshot <snapshotId>', 'Snapshot ID to boot from')\n .option('--session <sessionId>', 'Session ID to attach or respawn')\n .option('--volume <spec>', 'Volume spec: <volume_id>:<mount_path>[:rw|ro[:checkpoint_id]]', (value, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .action(async (options: any) => {\n const { client, settings } = requireClient(deps, options);\n const payload: Record<string, any> = {};\n if (options.type === 'computer-use') {\n payload.image_variant = 'computer-use';\n }\n if (options.timeout) {\n payload.vm_lifetime_seconds = Number.parseInt(options.timeout, 10);\n }\n if (options.memory) {\n payload.memory_mb = Number.parseInt(options.memory, 10);\n }\n if (options.vcpu) {\n payload.vcpu_count = Number.parseInt(options.vcpu, 10);\n }\n if (options.snapshot) {\n payload.snapshot_id = options.snapshot;\n }\n if (options.session) {\n payload.session_id = options.session;\n }\n if (options.volume.length > 0) {\n payload.volumes = options.volume.map(parseVolumeSpec);\n }\n const result = await client.vms.create(payload, true);\n emitOutput(\n deps,\n options,\n result,\n [\n `VM: ${result.vm_id || '-'}`,\n `Session: ${result.session_id || '-'}`,\n `Status: ${result.status || '-'}`,\n ...(result.vm_id ? [`SSH: ssh ${result.vm_id}@${settings.sshHost}`] : []),\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('ls')\n .alias('list')\n .description('List active VMs by default')\n .option('-a, --all', 'Include all VM records, including terminated VMs')\n .option('--watch [seconds]', 'Refresh every N seconds (default: 5)')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n await emitWatchOutput(deps, options, async () => {\n const listedVms = options.all ? await client.vms.listAllRecords() : await client.vms.list();\n const vms = options.all ? listedVms : filterActiveVms(listedVms);\n return {\n payload: { vms },\n textLines: vms.length > 0\n ? formatVmList(vms, Boolean(options.all), supportsAnsi(deps.stdout))\n : [options.all ? 'No VMs.' : 'No active VMs. Use `instavm ls -a` or `instavm ls --all` to include terminated VMs.'],\n };\n });\n }),\n );\n\n addRuntimeOptions(\n program\n .command('rm')\n .alias('delete')\n .description('Delete one or more VMs')\n .argument('<vmIds...>')\n .action(async (vmIds: string[], options: any) => {\n const { client } = requireClient(deps, options);\n const results: Array<Record<string, any>> = [];\n for (const vmId of vmIds) {\n results.push({ vm_id: vmId, ...(await client.vms.delete(vmId)) });\n }\n emitOutput(\n deps,\n options,\n { results },\n results.map((entry) => `${entry.vm_id}: ${entry.status || 'ok'}`),\n );\n }),\n );\n\n addRuntimeOptions(\n program\n .command('clone')\n .description('Clone a VM via snapshot')\n .argument('<vmId>')\n .option('--name <name>', 'Snapshot name used during clone')\n .action(async (vmId: string, options: any) => {\n const { client, settings } = requireClient(deps, options);\n const result = await client.vms.clone(vmId, options.name ? { snapshot_name: options.name } : {}, true);\n emitOutput(\n deps,\n options,\n result,\n [\n `VM: ${result.vm_id || '-'}`,\n `Session: ${result.session_id || '-'}`,\n `Status: ${result.status || '-'}`,\n ...(result.vm_id ? [`SSH: ssh ${result.vm_id}@${settings.sshHost}`] : []),\n ],\n );\n }),\n );\n\n const vmCmd = program.command('vm').alias('vms').description('VM-scoped operations (mirrors client.vms.* in the SDK)');\n\n addRuntimeOptions(\n vmCmd\n .command('update')\n .description('Update a running VM (memory, auto-snapshot-on-terminate, snapshot name)')\n .argument('<vmId>', 'VM ID to update')\n .option('--memory-mb <mb>', 'New memory ceiling in MB (128–8192, multiple of 2)')\n .option('--snapshot-on-terminate', 'Snapshot the VM automatically when it is terminated', false)\n .option('--no-snapshot-on-terminate', 'Disable auto-snapshot-on-terminate', false)\n .option('--snapshot-name <name>', 'Name for the auto-snapshot (paired with --snapshot-on-terminate)')\n .action(async (vmId: string, options: any) => {\n const { client } = requireClient(deps, options);\n if (options.snapshotOnTerminate && options.noSnapshotOnTerminate) {\n throw new Error('Use either --snapshot-on-terminate or --no-snapshot-on-terminate, not both.');\n }\n const payload: Record<string, any> = {};\n if (options.memoryMb != null && options.memoryMb !== '') {\n payload.memory_mb = Number.parseInt(String(options.memoryMb), 10);\n }\n if (options.snapshotOnTerminate) {\n payload.snapshot_on_terminate = true;\n } else if (options.noSnapshotOnTerminate) {\n payload.snapshot_on_terminate = false;\n }\n if (options.snapshotName) {\n payload.snapshot_name = options.snapshotName;\n }\n if (Object.keys(payload).length === 0) {\n throw new Error(\n 'Nothing to update. Pass at least one of --memory-mb / --snapshot-on-terminate / '\n + '--no-snapshot-on-terminate / --snapshot-name.',\n );\n }\n const result = await client.vms.update(vmId, payload);\n const summary = Object.entries(payload)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n emitOutput(deps, options, result || { status: 'ok' }, [\n `Updated VM ${vmId}: ${summary}`,\n `Status: ${displayValue((result || {}).status ?? 'ok')}`,\n ]);\n }),\n );\n\n addRuntimeOptions(\n program\n .command('connect')\n .description('SSH into a VM with the local ssh client')\n .argument('<vmId>')\n .argument('[sshArgs...]')\n .action(async (vmId: string, sshArgs: string[], options: any) => {\n const settings = resolveSettings(deps, options);\n const sshBinary = process.platform === 'win32'\n ? (findExecutable(deps, 'ssh.exe') || findExecutable(deps, 'ssh'))\n : (findExecutable(deps, 'ssh') || findExecutable(deps, 'ssh.exe'));\n if (!sshBinary) {\n throw new Error('ssh client not found on PATH');\n }\n\n const passthroughArgs = [...(sshArgs || [])];\n if (passthroughArgs[0] === '--') {\n passthroughArgs.shift();\n }\n const command = [sshBinary, `${vmId}@${settings.sshHost}`, ...passthroughArgs];\n if (options.json) {\n printJson(deps, { command });\n return;\n }\n\n const result = deps.spawnSync(command[0], command.slice(1), { stdio: 'inherit' });\n if (result.error) {\n throw result.error;\n }\n if ((result.status ?? 0) !== 0) {\n throw new CommanderError(result.status ?? 1, 'ssh.exit', `ssh exited with status ${result.status ?? 1}`);\n }\n }),\n { includeSshHost: true },\n );\n\n const snapshot = program.command('snapshot').description('List, inspect, build, create, and delete snapshots');\n\n addRuntimeOptions(\n snapshot\n .command('ls')\n .alias('list')\n .description('List snapshots')\n .option('--type <type>', 'Snapshot type filter')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const snapshots = await client.snapshots.list(options.type ? { type: options.type } : {});\n emitOutput(\n deps,\n options,\n { snapshots },\n snapshots.length > 0 ? formatSnapshotList(snapshots) : ['No snapshots.'],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('create')\n .description('Create a snapshot from a running VM')\n .argument('<vmId>')\n .option('--name <name>', 'Snapshot name')\n .action(async (vmId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.vms.snapshot(vmId, options.name ? { name: options.name } : {}, true);\n emitOutput(\n deps,\n options,\n result,\n [`Snapshot: ${result.snapshot_id || result.id || '-'}`, `Status: ${result.status || '-'}`],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('build')\n .description('Build a snapshot from an OCI image')\n .argument('<ociImage>')\n .option('--name <name>', 'Snapshot name')\n .option('--vcpu <count>', 'vCPU count')\n .option('--memory <mb>', 'Memory in MB')\n .option('--disk-size <gb>', 'Snapshot disk size in GB')\n .option('--env <pair>', 'Build environment variable in KEY=VALUE form', (value: string, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .option('--git-clone <url>', 'Git repository to clone during build')\n .option('--git-branch <branch>', 'Git branch to checkout')\n .option('--run <command>', 'Command to run after the image is prepared')\n .option('--apt <packages>', 'Extra apt packages')\n .option('--pip <packages>', 'Extra pip packages')\n .option('--npm <packages>', 'Extra npm packages')\n .option('--type <type>', 'Snapshot type', 'user')\n .action(async (ociImage: string, options: any) => {\n const { client } = requireClient(deps, options);\n const buildArgs: Record<string, any> = {};\n if (options.apt) buildArgs.extra_apt_packages = options.apt;\n if (options.pip) buildArgs.extra_pip_packages = options.pip;\n if (options.npm) buildArgs.extra_npm_packages = options.npm;\n if (options.gitClone) buildArgs.git_clone_url = options.gitClone;\n if (options.gitBranch) buildArgs.git_clone_branch = options.gitBranch;\n if (options.diskSize) buildArgs.disk_size_gb = Number.parseInt(options.diskSize, 10);\n if (options.run) buildArgs.post_build_cmd = options.run;\n if (options.env.length > 0) buildArgs.envs = parseEnvPairs(options.env);\n\n const result = await withSpinner(deps, options, 'Building snapshot', () => client.snapshots.create({\n oci_image: ociImage,\n name: options.name,\n vcpu_count: options.vcpu ? Number.parseInt(options.vcpu, 10) : undefined,\n memory_mb: options.memory ? Number.parseInt(options.memory, 10) : undefined,\n build_args: Object.keys(buildArgs).length > 0 ? buildArgs : undefined,\n type: options.type,\n }));\n emitOutput(\n deps,\n options,\n result,\n [`Snapshot: ${result.id || '-'}`, `Name: ${result.name || '-'}`, `Status: ${result.status || '-'}`],\n );\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('get')\n .description('Get a snapshot by ID')\n .argument('<snapshotId>')\n .option('--watch [seconds]', 'Refresh every N seconds (default: 5)')\n .action(async (snapshotId: string, options: any) => {\n const { client } = requireClient(deps, options);\n await emitWatchOutput(deps, options, async () => {\n const result = await client.snapshots.get(snapshotId);\n return {\n payload: result,\n textLines: [\n `Snapshot: ${result.id || '-'}`,\n `Name: ${result.name || '-'}`,\n `Status: ${result.status || '-'}`,\n `Type: ${result.type || '-'}`,\n ],\n };\n });\n }),\n );\n\n addRuntimeOptions(\n snapshot\n .command('rm')\n .alias('delete')\n .description('Delete a snapshot')\n .argument('<snapshotId>')\n .action(async (snapshotId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.snapshots.delete(snapshotId);\n emitOutput(deps, options, { snapshot_id: snapshotId, ...result }, [`Deleted snapshot ${snapshotId}`]);\n }),\n );\n\n const egress = program.command('egress').description('Get and set VM or session egress policies');\n\n addRuntimeOptions(\n egress\n .command('get')\n .description('Get egress policy for a session or VM')\n .option('--session <sessionId>', 'Session ID')\n .option('--vm <vmId>', 'VM ID')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const { targetType, targetId } = resolveTargetScope(options);\n const result = targetType === 'session'\n ? await client.getSessionEgress(targetId)\n : await client.getVmEgress(targetId);\n const payload = normalizeEgressPayload(result, targetType, targetId);\n emitOutput(deps, options, payload, formatEgressText(payload));\n }),\n );\n\n addRuntimeOptions(\n egress\n .command('set')\n .description('Set egress policy for a session or VM')\n .option('--session <sessionId>', 'Session ID')\n .option('--vm <vmId>', 'VM ID')\n .option('--allow-package-managers', 'Allow package-manager/public repository traffic')\n .option('--no-allow-package-managers', 'Block package-manager/public repository traffic')\n .option('--allow-http', 'Allow HTTP egress')\n .option('--deny-http', 'Block HTTP egress')\n .option('--allow-https', 'Allow HTTPS egress')\n .option('--deny-https', 'Block HTTPS egress')\n .option('--domain <domain>', 'Allow a domain', (value: string, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .option('--cidr <cidr>', 'Allow a CIDR block', (value: string, all: string[]) => {\n all.push(value);\n return all;\n }, [] as string[])\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const { targetType, targetId } = resolveTargetScope(options);\n const policy = {\n allowPackageManagers: options.allowPackageManagers,\n allowHttp: options.denyHttp ? false : options.allowHttp,\n allowHttps: options.denyHttps ? false : options.allowHttps,\n allowedDomains: options.domain,\n allowedCidrs: options.cidr,\n };\n const result = targetType === 'session'\n ? await client.setSessionEgress(policy, targetId)\n : await client.setVmEgress(targetId, policy);\n const payload = normalizeEgressPayload({ ...policy, ...result }, targetType, targetId);\n emitOutput(deps, options, payload, formatEgressText(payload));\n }),\n );\n\n addRuntimeOptions(\n program\n .command('exec')\n .description('Execute inline code or a local file in a session-backed VM')\n .argument('[source]', 'Local file path or the keyword `result`')\n .argument('[taskId]', 'Task ID when using `instavm exec result <task_id>`')\n .option('--cmd <command>', 'Inline command or source code to execute')\n .option('--language <language>', 'Execution language override')\n .option('--session <sessionId>', 'Reuse an existing session ID')\n .option('--timeout <seconds>', 'Execution timeout in seconds')\n .option('--async', 'Run asynchronously')\n .option('--poll-interval <seconds>', 'Polling interval in seconds for result lookup', '1')\n .action(async (source: string | undefined, taskId: string | undefined, options: any) => {\n const timeoutSeconds = options.timeout ? Number.parseInt(options.timeout, 10) : undefined;\n\n if (source === 'result') {\n if (options.cmd) {\n throw new Error('Use `instavm exec result <task_id>` without --cmd.');\n }\n if (!taskId) {\n throw new Error('Task ID is required: `instavm exec result <task_id>`.');\n }\n const { client } = requireClient(deps, options);\n const result = await client.getTaskResult(\n taskId,\n Number.parseInt(options.pollInterval, 10),\n timeoutSeconds !== undefined ? timeoutSeconds : 60,\n );\n const payload = {\n task_id: taskId,\n stdout: result.stdout,\n stderr: result.stderr,\n execution_time: result.executionTime,\n cpu_time: result.cpuTime,\n created_at: result.createdAt,\n };\n emitOutput(deps, options, payload, formatExecText(payload));\n return;\n }\n\n const resolved = resolveExecSource({ cmd: options.cmd, source, language: options.language });\n const { client } = requireClient(deps, options);\n\n if (options.async) {\n const result = await client.executeAsync(resolved.command, {\n language: resolved.language as 'python' | 'bash' | undefined,\n sessionId: options.session,\n timeout: timeoutSeconds,\n });\n const payload = {\n task_id: result.taskId,\n session_id: result.sessionId,\n language: resolved.language,\n output: result.output,\n stderr: result.error,\n execution_time: result.executionTime,\n source_path: resolved.sourcePath,\n status: result.status,\n };\n const textLines = formatExecText(payload);\n textLines.push('', 'Use `instavm exec result <task_id>` to wait for completion.');\n emitOutput(deps, options, payload, textLines);\n return;\n }\n\n const result = await client.execute(resolved.command, {\n language: resolved.language as 'python' | 'bash' | undefined,\n sessionId: options.session,\n timeout: timeoutSeconds ? timeoutSeconds * 1000 : undefined,\n });\n const payload = {\n session_id: result.sessionId,\n language: resolved.language,\n stdout: result.stdout,\n stderr: result.stderr,\n execution_time: result.executionTime,\n cpu_time: result.cpuTime,\n created_at: result.createdAt,\n source_path: resolved.sourcePath,\n };\n emitOutput(deps, options, payload, formatExecText(payload));\n }),\n );\n\n const share = program.command('share').description('Create and manage VM shares');\n\n addRuntimeOptions(\n share\n .command('create')\n .description('Create a share for a VM and port')\n .argument('<vmId>')\n .argument('<port>')\n .option('--public', 'Create the share as public')\n .action(async (vmId: string, port: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.shares.create({\n vm_id: vmId,\n port: Number.parseInt(port, 10),\n is_public: Boolean(options.public),\n });\n emitOutput(\n deps,\n options,\n result,\n [\n `Share: ${result.share_id}`,\n `URL: ${result.url}`,\n `Port: ${result.port}`,\n `Visibility: ${result.is_public ? 'public' : 'private'}`,\n ],\n );\n }),\n );\n\n const addShareUpdateCommand = (name: string, description: string, mode: 'public' | 'private' | 'revoke') => {\n addRuntimeOptions(\n share\n .command(name)\n .description(description)\n .argument('<shareId>')\n .action(async (shareId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.shares.update(\n shareId,\n mode === 'revoke'\n ? { revoke: true }\n : { is_public: mode === 'public' },\n );\n emitOutput(\n deps,\n options,\n { share_id: shareId, ...result },\n [mode === 'revoke' ? `Revoked share ${shareId}` : `Updated share ${shareId} to ${mode}`],\n );\n }),\n );\n };\n\n addShareUpdateCommand('set-public', 'Set a share to public visibility', 'public');\n addShareUpdateCommand('set-private', 'Set a share to private visibility', 'private');\n addShareUpdateCommand('revoke', 'Revoke a share by share ID', 'revoke');\n\n const sshKey = program.command('ssh-key').alias('sshkey').description('Manage SSH keys on your account');\n\n addRuntimeOptions(\n sshKey\n .command('list')\n .description('List active SSH keys')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const keys = await client.listSshKeys();\n emitOutput(\n deps,\n options,\n { keys },\n keys.length > 0 ? formatSshKeyList(keys) : ['No SSH keys.'],\n );\n }),\n );\n\n addRuntimeOptions(\n sshKey\n .command('add')\n .description('Add an SSH public key')\n .argument('[publicKey]')\n .action(async (publicKey: string | undefined, options: any) => {\n const { client } = requireClient(deps, options);\n const value = publicKey?.trim() || (!process.stdin.isTTY ? (await deps.readStdin()).trim() : '');\n if (!value) {\n throw new Error('Public key is required');\n }\n const result = await client.addSshKey(value);\n emitOutput(deps, options, result, [`Added ${result.fingerprint || result.id}`]);\n }),\n );\n\n addRuntimeOptions(\n sshKey\n .command('remove')\n .description('Remove an SSH key by key ID')\n .argument('<keyId>')\n .action(async (keyId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.deleteSshKey(Number.parseInt(keyId, 10));\n emitOutput(deps, options, { key_id: Number.parseInt(keyId, 10), ...result }, [`Removed ${keyId}`]);\n }),\n );\n\n const desktop = program\n .command('desktop')\n .description('Manage computer-use desktops, viewer handoff, and session recordings');\n\n const addDesktopCommand = (name: string, description: string, action: (target: string, options: any) => Promise<void>) => {\n addRuntimeOptions(\n desktop\n .command(name)\n .description(description)\n .argument('<target>')\n .action(action),\n );\n };\n\n addDesktopCommand('status', 'Show desktop status for a VM or session', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n emitOutput(\n deps,\n options,\n payload,\n [\n `Session: ${payload.session_id || '-'}`,\n `VM: ${payload.vm_id || '-'}`,\n `Status: ${payload.vm_status || (payload.vm_alive ? 'active' : 'stopped')}`,\n ...(payload.viewer_url ? [`Viewer: ${payload.viewer_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('viewer', 'Get the noVNC viewer URL for a running desktop', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (!payload.session_id || !payload.vm_alive) {\n throw new Error('Desktop is not running.');\n }\n if (!payload.viewer_url) {\n Object.assign(payload, await client.computerUse.viewerUrl(String(payload.session_id)));\n }\n emitOutput(\n deps,\n options,\n payload,\n [\n `Session: ${payload.session_id}`,\n `VM: ${payload.vm_id || '-'}`,\n `Viewer URL: ${payload.viewer_url}`,\n ...(payload.websocket_url ? [`WebSocket: ${payload.websocket_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('start', 'Start a computer-use desktop for a session', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (payload.vm_alive) {\n emitOutput(\n deps,\n options,\n payload,\n [`Desktop already running: ${payload.vm_id || '-'}`, `Session: ${payload.session_id || '-'}`],\n );\n return;\n }\n if (!payload.session_id) {\n throw new Error('Desktop start requires a session-backed VM or session ID.');\n }\n const result = await client.vms.create({ session_id: String(payload.session_id), image_variant: 'computer-use' }, true);\n const merged = await desktopPayload(client, String(result.session_id || payload.session_id));\n Object.assign(merged, result);\n emitOutput(\n deps,\n options,\n merged,\n [\n `Desktop started: ${merged.vm_id || result.vm_id || '-'}`,\n `Session: ${merged.session_id || result.session_id || '-'}`,\n ...(merged.viewer_url ? [`Viewer: ${merged.viewer_url}`] : []),\n ],\n );\n });\n\n addDesktopCommand('stop', 'Stop a running desktop VM', async (target, options) => {\n const { client } = requireClient(deps, options);\n const payload = await desktopPayload(client, target);\n if (!payload.vm_alive) {\n emitOutput(deps, options, payload, ['Desktop is already stopped.']);\n return;\n }\n const result = payload.session_id\n ? await client.kill(String(payload.session_id))\n : await client.vms.delete(String(payload.vm_id));\n emitOutput(\n deps,\n options,\n { session_id: payload.session_id, vm_id: payload.vm_id, ...result },\n [`Stopping ${payload.vm_id || payload.session_id}...`],\n );\n });\n\n const desktopRecordings = desktop\n .command('recordings')\n .alias('recording')\n .description('List, inspect, and download captured desktop session videos');\n\n addRuntimeOptions(\n desktopRecordings\n .command('ls')\n .alias('list')\n .description('List recordings')\n .option('--session-id <sessionId>', 'Filter by session ID')\n .option('--status <status>', 'Filter by status (uploading, ready, failed)')\n .option('--limit <n>', 'Maximum rows to return', '50')\n .option('--offset <n>', 'Pagination offset', '0')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const recordings = await client.recordings.list({\n sessionId: options.sessionId,\n status: options.status,\n limit: Number.parseInt(String(options.limit), 10) || 50,\n offset: Number.parseInt(String(options.offset), 10) || 0,\n });\n emitOutput(deps, options, { recordings }, formatRecordingList(recordings as Array<Record<string, any>>));\n }),\n );\n\n addRuntimeOptions(\n desktopRecordings\n .command('get')\n .description('Show recording metadata')\n .argument('<recordingId>', 'Recording ID')\n .action(async (recordingId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const rec = await client.recordings.get(recordingId);\n emitOutput(deps, options, rec, formatRecordingDetail(rec as Record<string, any>));\n }),\n );\n\n addRuntimeOptions(\n desktopRecordings\n .command('download')\n .description('Resolve download URL or save recording bytes to a file')\n .argument('<recordingId>', 'Recording ID')\n .option('--output <path>', 'Write recording to this path (otherwise print presigned URL)')\n .action(async (recordingId: string, options: any) => {\n const { client } = requireClient(deps, options);\n if (options.output) {\n const result = await client.recordings.download(recordingId, options.output);\n emitOutput(deps, options, result, [\n `Saved ${recordingId} -> ${result.path} (${humanBytes(result.bytes)})`,\n ]);\n return;\n }\n const url = await client.recordings.getDownloadUrl(recordingId);\n emitOutput(deps, options, { recording_id: recordingId, download_url: url }, [url]);\n }),\n );\n\n addRuntimeOptions(\n desktopRecordings\n .command('rm')\n .alias('delete')\n .description('Delete a recording')\n .argument('<recordingId>', 'Recording ID')\n .action(async (recordingId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.recordings.delete(recordingId);\n emitOutput(deps, options, { recording_id: recordingId, ...result }, [`Deleted recording ${recordingId}`]);\n }),\n );\n\n const browser = program.command('browser').description('Headless browser: read, screenshot, sessions, and interactions');\n\n addRuntimeOptions(\n browser\n .command('read')\n .description('Extract readable content from a page or browser session')\n .argument('[url]')\n .option('--session <browserSessionId>', 'Reuse an existing browser session')\n .option('--no-interactive', 'Skip interactive element extraction')\n .option('--no-anchors', 'Skip content anchor extraction')\n .option('--max-anchors <count>', 'Maximum content anchors to return', '50')\n .action(async (url: string | undefined, options: any) => {\n const { client } = requireClient(deps, options);\n const { session, temporary, navigation } = await resolveBrowserSession(client, { session: options.session, url });\n try {\n const content = await session.extractContent({\n includeInteractive: !options.noInteractive,\n includeAnchors: !options.noAnchors,\n maxAnchors: Number.parseInt(options.maxAnchors, 10),\n });\n const payload = {\n session_id: session.sessionId,\n url,\n navigation,\n readable_content: {\n content: content.readableContent?.content || '',\n title: content.readableContent?.title,\n byline: content.readableContent?.byline,\n excerpt: content.readableContent?.excerpt,\n site_name: content.readableContent?.siteName,\n },\n interactive_elements: content.interactiveElements || [],\n content_anchors: content.contentAnchors || [],\n };\n emitOutput(deps, options, payload, formatBrowserReadText(payload));\n } finally {\n if (temporary) {\n await session.close();\n }\n }\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('screenshot')\n .description('Save a browser screenshot to a local file')\n .argument('[url]')\n .requiredOption('--out <path>', 'Output file path')\n .option('--session <browserSessionId>', 'Reuse an existing browser session')\n .option('--format <format>', 'Image format', 'png')\n .option('--quality <quality>', 'JPEG quality (1-100)', '90')\n .option('--no-full-page', 'Capture only the current viewport')\n .action(async (url: string | undefined, options: any) => {\n const { client } = requireClient(deps, options);\n const { session, temporary } = await resolveBrowserSession(client, { session: options.session, url });\n try {\n const screenshot = await session.screenshot({\n fullPage: options.fullPage,\n format: options.format,\n quality: Number.parseInt(options.quality, 10),\n });\n const outputPath = writeScreenshotFile(deps, options.out, screenshot);\n const size = fs.statSync(outputPath).size;\n const payload = {\n session_id: session.sessionId,\n url,\n format: options.format,\n local_path: outputPath,\n size,\n };\n emitOutput(\n deps,\n options,\n payload,\n [\n `Saved screenshot: ${outputPath}`,\n `Session: ${session.sessionId}`,\n `Format: ${options.format}`,\n `Size: ${humanBytes(size)}`,\n ],\n );\n } finally {\n if (temporary) {\n await session.close();\n }\n }\n }),\n );\n\n const browserSession = browser.command('session').description('Manage browser sessions');\n\n addRuntimeOptions(\n browserSession\n .command('create')\n .description('Create a new browser session')\n .option('--viewport-width <px>', 'Viewport width', '1920')\n .option('--viewport-height <px>', 'Viewport height', '1080')\n .option('--user-agent <ua>', 'Custom user agent string')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const sid = await client.createBrowserSession(\n Number.parseInt(String(options.viewportWidth), 10) || 1920,\n Number.parseInt(String(options.viewportHeight), 10) || 1080,\n options.userAgent,\n );\n emitOutput(deps, options, { session_id: sid }, [`session_id=${sid}`]);\n }),\n );\n\n addRuntimeOptions(\n browserSession\n .command('close')\n .description('Close a browser session')\n .argument('<sessionId>', 'Browser session ID')\n .action(async (sessionId: string, options: any) => {\n const { client } = requireClient(deps, options);\n await client.closeBrowserSession(sessionId);\n emitOutput(deps, options, { closed: true, session_id: sessionId }, [`Closed ${sessionId}`]);\n }),\n );\n\n addRuntimeOptions(\n browserSession\n .command('ls')\n .alias('list')\n .description('List active browser sessions')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const sessions = await client.listBrowserSessions();\n const rows = (sessions as Array<Record<string, any>>).map((s) => [\n displayValue(s.session_id ?? s.id),\n displayValue(s.status),\n displayValue(s.created_at ?? s.createdAt),\n ]);\n emitOutput(\n deps,\n options,\n { sessions },\n sessions.length > 0\n ? [`Browser sessions (${sessions.length})`, '', ...formatTable(['Session', 'Status', 'Created'], rows)]\n : ['No browser sessions.'],\n );\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('navigate')\n .description('Navigate to a URL')\n .argument('<url>', 'URL to navigate to')\n .option('--session <browserSessionId>', 'Browser session ID (creates temp session if omitted)')\n .option('--keep-session', 'Do not close a temporary session after navigating', false)\n .option('--wait-timeout <ms>', 'Navigation timeout in ms', '30000')\n .action(async (url: string, options: any) => {\n const { client } = requireClient(deps, options);\n let sid = options.session as string | undefined;\n let temp = false;\n if (!sid) {\n sid = await client.createBrowserSession();\n temp = true;\n }\n try {\n const waitTimeout = Number.parseInt(String(options.waitTimeout ?? 30000), 10);\n const result = await client.browserNavigate(url, sid, waitTimeout);\n emitOutput(deps, options, result, [`Navigated to ${url}`, `Session: ${sid}`]);\n } finally {\n if (temp && !options.keepSession) {\n await client.closeBrowserSession(sid!);\n }\n }\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('click')\n .description('Click an element')\n .argument('<selector>', 'CSS selector of the element to click')\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--force', 'Force click even if element is obscured', false)\n .option('--timeout <ms>', 'Timeout in ms', '30000')\n .action(async (selector: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.browserClick(\n selector,\n options.session,\n Boolean(options.force),\n Number.parseInt(String(options.timeout ?? 30000), 10),\n );\n emitOutput(deps, options, result, [`Clicked ${selector}`]);\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('type')\n .description('Type text into an element')\n .argument('<selector>', 'CSS selector of the input element')\n .argument('<text>', 'Text to type')\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--delay <ms>', 'Delay between keystrokes in ms', '100')\n .option('--timeout <ms>', 'Timeout in ms', '30000')\n .action(async (selector: string, text: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.browserType(\n selector,\n text,\n options.session,\n Number.parseInt(String(options.delay ?? 100), 10),\n Number.parseInt(String(options.timeout ?? 30000), 10),\n );\n emitOutput(deps, options, result, [`Typed into ${selector}`]);\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('fill')\n .description('Fill a form field (clears existing value first)')\n .argument('<selector>', 'CSS selector of the input element')\n .argument('<value>', 'Value to fill')\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--timeout <ms>', 'Timeout in ms', '30000')\n .action(async (selector: string, value: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.browserFill(\n selector,\n value,\n options.session,\n Number.parseInt(String(options.timeout ?? 30000), 10),\n );\n emitOutput(deps, options, result, [`Filled ${selector}`]);\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('scroll')\n .description('Scroll the page or an element')\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--selector <css>', 'CSS selector to scroll into view')\n .option('--x <pixels>', 'Horizontal scroll offset')\n .option('--y <pixels>', 'Vertical scroll offset')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const x = options.x != null && options.x !== '' ? Number.parseInt(String(options.x), 10) : undefined;\n const y = options.y != null && options.y !== '' ? Number.parseInt(String(options.y), 10) : undefined;\n const result = await client.browserScroll(options.session, options.selector || null, x ?? null, y ?? null);\n emitOutput(deps, options, result, ['Scrolled']);\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('wait')\n .description('Wait for a condition to be met')\n .argument('<condition>', \"Condition (e.g. 'visible', 'hidden', 'networkidle')\")\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--selector <css>', 'CSS selector for element-based conditions')\n .option('--timeout <ms>', 'Timeout in ms', '30000')\n .action(async (condition: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.browserWait(\n condition,\n options.session,\n options.selector || null,\n Number.parseInt(String(options.timeout ?? 30000), 10),\n );\n emitOutput(deps, options, result, [`Wait satisfied: ${condition}`]);\n }),\n );\n\n addRuntimeOptions(\n browser\n .command('extract')\n .description('Extract DOM elements from the page')\n .requiredOption('--session <browserSessionId>', 'Browser session ID')\n .option('--selector <css>', 'CSS selector to filter elements')\n .option('--attributes <list>', 'Comma-separated list of attributes to extract')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const attrs = options.attributes\n ? String(options.attributes).split(',').map((s: string) => s.trim()).filter(Boolean)\n : null;\n const elements = await client.browserExtractElements(options.session, options.selector || null, attrs);\n emitOutput(deps, options, { elements }, [JSON.stringify({ elements }, null, 2)]);\n }),\n );\n\n const volume = program.command('volume').alias('volumes').description('Manage persistent volumes');\n\n addRuntimeOptions(\n volume\n .command('ls')\n .alias('list')\n .description('List volumes')\n .option('--refresh', 'Refresh usage before listing')\n .action(async (options: any) => {\n const { client } = requireClient(deps, options);\n const volumes = await client.volumes.list(Boolean(options.refresh));\n emitOutput(\n deps,\n options,\n { volumes },\n volumes.length > 0 ? formatVolumeList(volumes) : ['No volumes.'],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('get')\n .description('Get a volume')\n .argument('<volumeId>')\n .option('--refresh', 'Refresh usage before reading')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.get(volumeId, Boolean(options.refresh));\n emitOutput(\n deps,\n options,\n result,\n [\n `ID: ${result.id}`,\n `Name: ${result.name}`,\n `Status: ${result.status}`,\n `Quota: ${humanBytes(result.quota_bytes)}`,\n `Used: ${humanBytes(result.used_bytes)}`,\n ],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('create')\n .description('Create a volume')\n .argument('<name>')\n .requiredOption('--quota <size>', 'Quota in bytes or units like 5gb')\n .action(async (name: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.create({ name, quota_bytes: parseSize(options.quota) });\n emitOutput(\n deps,\n options,\n result,\n [`Volume: ${result.id}`, `Name: ${result.name}`, `Quota: ${humanBytes(result.quota_bytes)}`],\n );\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('update')\n .description('Update a volume')\n .argument('<volumeId>')\n .option('--name <name>', 'Updated volume name')\n .option('--quota <size>', 'Updated quota in bytes or units like 5gb')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const payload: Record<string, any> = {};\n if (options.name) payload.name = options.name;\n if (options.quota) payload.quota_bytes = parseSize(options.quota);\n if (Object.keys(payload).length === 0) {\n throw new Error('Provide --name and/or --quota');\n }\n const result = await client.volumes.update(volumeId, payload);\n emitOutput(deps, options, result, [`Updated volume ${result.id || volumeId}`]);\n }),\n );\n\n addRuntimeOptions(\n volume\n .command('rm')\n .alias('delete')\n .description('Delete a volume')\n .argument('<volumeId>')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.delete(volumeId);\n emitOutput(deps, options, { volume_id: volumeId, ...result }, [`Deleted ${volumeId}`]);\n }),\n );\n\n const checkpoint = volume.command('checkpoint').description('Manage checkpoints for a volume');\n\n addRuntimeOptions(\n checkpoint\n .command('ls')\n .alias('list')\n .description('List checkpoints for a volume')\n .argument('<volumeId>')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const checkpoints = await client.volumes.listCheckpoints(volumeId);\n emitOutput(\n deps,\n options,\n { checkpoints },\n checkpoints.length > 0 ? formatCheckpointList(checkpoints) : ['No checkpoints.'],\n );\n }),\n );\n\n addRuntimeOptions(\n checkpoint\n .command('create')\n .description('Create a checkpoint for a volume')\n .argument('<volumeId>')\n .option('--name <name>', 'Checkpoint name')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.createCheckpoint(volumeId, options.name ? { name: options.name } : {});\n emitOutput(deps, options, result, [`Created checkpoint ${result.id || '-'}`]);\n }),\n );\n\n addRuntimeOptions(\n checkpoint\n .command('rm')\n .alias('delete')\n .description('Delete a checkpoint')\n .argument('<volumeId>')\n .argument('<checkpointId>')\n .action(async (volumeId: string, checkpointId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.deleteCheckpoint(volumeId, checkpointId);\n emitOutput(deps, options, { checkpoint_id: checkpointId, ...result }, [`Deleted checkpoint ${checkpointId}`]);\n }),\n );\n\n const files = volume.command('files').description('Manage files stored inside a volume');\n\n addRuntimeOptions(\n files\n .command('ls')\n .alias('list')\n .description('List files inside a volume')\n .argument('<volumeId>')\n .option('--prefix <prefix>', 'Path prefix filter')\n .option('--limit <limit>', 'Maximum number of entries', '1000')\n .option('--no-recursive', 'Do not recurse into subdirectories')\n .action(async (volumeId: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.listFiles(volumeId, {\n prefix: options.prefix || '',\n recursive: options.recursive,\n limit: Number.parseInt(options.limit, 10),\n });\n emitOutput(\n deps,\n options,\n { files: result },\n result.length > 0 ? formatFileList(result) : ['No files.'],\n );\n }),\n );\n\n addRuntimeOptions(\n files\n .command('upload')\n .description('Upload a file into a volume')\n .argument('<volumeId>')\n .argument('<localPath>')\n .option('--path <remotePath>', 'Remote path inside the volume')\n .option('--overwrite', 'Overwrite if the path already exists')\n .action(async (volumeId: string, localPath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const remotePath = options.path || path.basename(localPath);\n const result = await client.volumes.uploadFile(volumeId, {\n filePath: localPath,\n path: remotePath,\n overwrite: Boolean(options.overwrite),\n });\n emitOutput(deps, options, result, [`Uploaded ${localPath} -> ${remotePath}`]);\n }),\n );\n\n addRuntimeOptions(\n files\n .command('download')\n .description('Download a file from a volume')\n .argument('<volumeId>')\n .argument('<remotePath>')\n .option('--out <outputPath>', 'Local output path')\n .action(async (volumeId: string, remotePath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.downloadFile(volumeId, remotePath);\n const outputPath = options.out || path.basename(remotePath);\n deps.writeFile(outputPath, result.content);\n emitOutput(\n deps,\n options,\n {\n path: result.path,\n filename: result.filename,\n size: result.size,\n local_path: outputPath,\n },\n [`Downloaded ${remotePath} -> ${outputPath}`],\n );\n }),\n );\n\n addRuntimeOptions(\n files\n .command('rm')\n .alias('delete')\n .description('Delete a file from a volume')\n .argument('<volumeId>')\n .argument('<remotePath>')\n .action(async (volumeId: string, remotePath: string, options: any) => {\n const { client } = requireClient(deps, options);\n const result = await client.volumes.deleteFile(volumeId, remotePath);\n emitOutput(deps, options, { path: remotePath, ...result }, [`Deleted ${remotePath}`]);\n }),\n );\n\n program\n .command('doc')\n .alias('docs')\n .description('Show InstaVM documentation links')\n .option('-j, --json', 'Emit JSON output')\n .action((options: any) => {\n emitOutput(deps, options, { url: DEFAULT_DOCS_URL }, [DEFAULT_DOCS_URL]);\n });\n\n // --- deploy command ---\n addRuntimeOptions(\n program\n .command('deploy')\n .description('Detect and deploy an app from a local directory')\n .argument('[path]', 'Project directory', '.')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--env <key=value...>', 'Set environment variable (repeatable)', (val: string, prev: string[]) => [...prev, val], [] as string[])\n .option('--port <port>', 'Override detected port', parseInt)\n .option('--health-path <path>', 'Override detected health check path')\n .option('--start-command <cmd>', 'Override detected start command')\n .option('--install-command <cmd>', 'Override detected install command')\n .option('--build-command <cmd>', 'Override detected build command')\n .option('--plan', 'Show detected plan and exit (dry-run)')\n .option('--private', \"Don't create public share\")\n .option('--save-snapshot', 'Create VM snapshot after successful deploy')\n .option('--vault <vaultId>', 'Attach org vault ID to the new VM (repeatable)', (val: string, prev: string[]) => [...prev, val], [] as string[])\n .option('--no-vault', 'Skip vault auto-discovery for manifest vault.hosts', false)\n .option('--no-setup-vault', 'Disable interactive vault bootstrap when vault.required is true', false)\n .action(async (projectPath: string, options: any) => {\n const resolved = path.resolve(projectPath);\n let plan: DeployPlan;\n try {\n plan = detectProject(resolved);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n deps.stderr.write(`Error: ${msg}\\n`);\n throw new CommanderError(1, 'deploy.detect.failed', '');\n }\n\n // Apply overrides\n if (options.port) plan.port = options.port;\n if (options.healthPath) plan.healthPath = options.healthPath;\n if (options.startCommand) plan.startCommand = options.startCommand;\n if (options.installCommand) plan.installCommand = options.installCommand;\n if (options.buildCommand !== undefined) plan.buildCommand = options.buildCommand;\n\n // Inject --env values\n for (const kv of options.env || []) {\n const eqIdx = kv.indexOf('=');\n if (eqIdx > 0) process.env[kv.slice(0, eqIdx)] = kv.slice(eqIdx + 1);\n }\n\n if (options.plan) {\n if (options.json) {\n printJson(deps, {\n slug: plan.slug,\n runtime: plan.runtime,\n package_manager: plan.packageManager,\n install_command: plan.installCommand,\n build_command: plan.buildCommand,\n start_command: plan.startCommand,\n port: plan.port,\n health_path: plan.healthPath,\n secrets: plan.secrets.map((s) => s.env_name),\n });\n } else {\n printDeployPlan(deps, plan);\n }\n return;\n }\n\n if (!options.yes && deps.stdout.isTTY) {\n printDeployPlan(deps, plan);\n const rl = (await import('readline')).createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => rl.question(' Deploy? [Y/n] ', resolve));\n rl.close();\n if (answer.trim().toLowerCase() === 'n') return;\n }\n\n const manifest = planToManifest(plan, resolved);\n if (options.private) manifest.app.share_public_default = false;\n\n const { client, settings } = requireClient(deps, options);\n const progressRenderer = new ProgressRenderer(deps, options);\n const reusedSnapshotId = await resolveSavedSnapshot(\n client,\n resolved,\n plan,\n (message) => cookbookProgress(progressRenderer, message),\n );\n try {\n const vaultOpts: CookbookVaultDeployOptions = {\n vaultIdsOverride: options.vault?.length ? options.vault : undefined,\n skipVaultDiscovery: Boolean(options.noVault),\n allowVaultBootstrap: !options.noSetupVault,\n };\n const payload = await runDeploy(\n manifest,\n client,\n settings,\n deps,\n (message) => cookbookProgress(progressRenderer, message),\n reusedSnapshotId,\n vaultOpts,\n );\n if (reusedSnapshotId) {\n payload.reused_snapshot_id = reusedSnapshotId;\n }\n if (options.saveSnapshot) {\n const savedSnapshotId = await createDeploySnapshot(\n client,\n resolved,\n plan,\n payload,\n (message) => cookbookProgress(progressRenderer, message),\n );\n if (savedSnapshotId) {\n payload.saved_snapshot_id = savedSnapshotId;\n }\n }\n progressRenderer.stop();\n emitOutput(deps, options, payload, formatDeploySuccess(options, deps, payload));\n } catch (error) {\n progressRenderer.stop();\n emitCookbookStyleFailure(deps, options, error, 'deploy.failed');\n }\n }),\n { includeSshHost: true },\n );\n\n const cookbook = program.command('cookbook').description('Discover and deploy curated cookbook applications');\n\n cookbook\n .command('list')\n .description('List available cookbooks')\n .option('-j, --json', 'Emit JSON output')\n .action(async (options: CookbookJsonOptions) => {\n const root = resolveCookbookRoot(deps);\n const cookbooks = discoverCookbooks(root).map(manifestDisplayRecord);\n emitOutput(\n deps,\n options,\n { cookbooks },\n formatCookbookList(cookbooks),\n );\n });\n\n cookbook\n .command('info')\n .description('Show cookbook details and required secrets')\n .argument('<slug>')\n .option('-j, --json', 'Emit JSON output')\n .action(async (slug: string, options: CookbookJsonOptions) => {\n const root = resolveCookbookRoot(deps);\n const manifest = loadManifest(path.join(root, slug, 'instavm.yaml'));\n emitOutput(\n deps,\n options,\n {\n ...manifestDisplayRecord(manifest),\n vm: manifest.vm,\n app: manifest.app,\n run: manifest.run,\n secrets: manifest.secrets,\n notes: manifest.post_deploy_notes,\n },\n [\n `Slug: ${manifest.slug}`,\n `Title: ${manifest.title}`,\n `Summary: ${manifest.summary}`,\n `Runtime: ${manifest.runtime}`,\n `Deploy: ${manifest.deploy.kind}`,\n `VM: ${manifest.vm.vcpu_count} vCPU, ${manifest.vm.memory_mb}MB`,\n `Port: ${manifest.app.port}`,\n `Healthcheck: ${manifest.app.healthcheck_path}`,\n `Secrets: ${manifest.secrets.map((secret) => secret.env_name).join(', ') || 'none'}`,\n ...(manifest.vault\n ? [\n `Vault: required=${manifest.vault.required} hosts=${manifest.vault.hosts.join(', ')}`,\n ]\n : []),\n ...(manifest.post_deploy_notes.length > 0 ? ['Notes:', ...manifest.post_deploy_notes.map((note) => ` - ${note}`)] : []),\n ],\n );\n });\n\n addRuntimeOptions(\n cookbook\n .command('deploy')\n .description('Create a VM, start the cookbook app, and return the public share URL')\n .argument('<slug>')\n .option('--vault <vaultId>', 'Attach org vault ID to the new VM (repeatable)', (val: string, prev: string[]) => [...prev, val], [] as string[])\n .option('--no-vault', 'Skip vault auto-discovery for manifest vault.hosts', false)\n .option('--no-setup-vault', 'Disable interactive vault bootstrap when vault.required is true', false)\n .action(async (slug: string, options: CookbookDeployOptions) => {\n const progressRenderer = new ProgressRenderer(deps, options);\n try {\n const root = resolveCookbookRoot(deps, (message) => cookbookProgress(progressRenderer, message));\n const manifest = loadManifest(path.join(root, slug, 'instavm.yaml'));\n const { client, settings } = requireClient(deps, options);\n const vaultOpts: CookbookVaultDeployOptions = {\n vaultIdsOverride: options.vault?.length ? options.vault : undefined,\n skipVaultDiscovery: Boolean(options.noVault),\n allowVaultBootstrap: !options.noSetupVault,\n };\n const payload = await deployCookbook(\n manifest,\n client,\n settings,\n deps,\n (message) => cookbookProgress(progressRenderer, message),\n vaultOpts,\n );\n progressRenderer.stop();\n emitOutput(deps, options, payload, formatCookbookDeploySuccess(options, deps, payload));\n } catch (error) {\n progressRenderer.stop();\n emitCookbookStyleFailure(deps, options, error, 'cookbook.deploy.failed', { slug });\n }\n }),\n { includeSshHost: true },\n );\n\n return program;\n}\n\nexport async function runCli(argv: string[], deps: CliDeps = defaultDeps): Promise<number> {\n const program = createProgram(deps);\n try {\n await program.parseAsync(['node', 'instavm', ...normalizeArgv(argv)]);\n return 0;\n } catch (error) {\n if (error instanceof CommanderError) {\n if (error.code === 'commander.helpDisplayed') {\n return error.exitCode;\n }\n if (error.message) {\n deps.stderr.write(`${error.message}\\n`);\n }\n return error.exitCode || 1;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n deps.stderr.write(`Error: ${message}\\n`);\n return 1;\n }\n}\n\nfunction findExecutable(deps: CliDeps, binary: string): string | null {\n const result = deps.spawnSync(process.platform === 'win32' ? 'where' : 'which', [binary], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n if (result.status === 0) {\n const output = (result.stdout || '').toString().split(/\\r?\\n/).find(Boolean);\n return output || null;\n }\n return null;\n}\n\nasync function promptSecret(prompt: string): Promise<string> {\n if (!process.stdin.isTTY) {\n return '';\n }\n\n return new Promise<string>((resolve, reject) => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n let value = '';\n\n const cleanup = () => {\n stdin.removeListener('data', onData);\n stdin.pause();\n if (typeof stdin.setRawMode === 'function') {\n stdin.setRawMode(false);\n }\n stdout.write('\\n');\n };\n\n const onData = (chunk: Buffer | string) => {\n const input = chunk.toString('utf8');\n for (const character of input) {\n if (character === '\\u0003') {\n cleanup();\n reject(new Error('Interrupted.'));\n return;\n }\n if (character === '\\r' || character === '\\n') {\n cleanup();\n resolve(value);\n return;\n }\n if (character === '\\u007f') {\n value = value.slice(0, -1);\n continue;\n }\n value += character;\n }\n };\n\n stdout.write(prompt);\n stdin.resume();\n stdin.setEncoding('utf8');\n if (typeof stdin.setRawMode === 'function') {\n stdin.setRawMode(true);\n }\n stdin.on('data', onData);\n });\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return '';\n }\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n process.stdin.on('error', reject);\n });\n}\n\nasync function main(): Promise<void> {\n const exitCode = await runCli(process.argv.slice(2));\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n}\n\nif (require.main === module) {\n void main();\n}\n","import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport FormData from 'form-data';\nimport {\n InstaVMError,\n AuthenticationError,\n RateLimitError,\n QuotaExceededError,\n ForbiddenError,\n NetworkError,\n} from '../errors/BaseError';\nimport { withRetry } from '../utils/retry';\nimport type { HttpClientConfig, RequestConfig } from '../types/api';\nimport { INSTAVM_JS_SDK_VERSION } from '../version';\n\n/**\n * HTTP client with authentication, retry logic, and error handling\n */\nexport class HTTPClient {\n private client: AxiosInstance;\n private config: HttpClientConfig;\n\n get apiKey(): string {\n return this.config.apiKey;\n }\n\n get baseURL(): string {\n return this.config.baseURL;\n }\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n \n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': `instavm-js-sdk/${INSTAVM_JS_SDK_VERSION}`,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Request interceptor - add authentication\n this.client.interceptors.request.use(\n (config) => {\n // Add API key to headers for browser endpoints\n if (config.url?.includes('/browser/')) {\n config.headers['X-API-Key'] = this.config.apiKey;\n }\n \n return config;\n },\n (error) => Promise.reject(error)\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error) => {\n const axiosError = error;\n const status = axiosError.response?.status;\n const data = axiosError.response?.data;\n const message = data?.message || data?.error || data?.detail || axiosError.message;\n\n switch (status) {\n case 401:\n throw new AuthenticationError(message, {\n statusCode: status,\n response: data,\n });\n case 402:\n throw new QuotaExceededError(message, {\n statusCode: status,\n response: data,\n });\n case 403:\n throw new ForbiddenError(message, {\n statusCode: status,\n response: data,\n });\n case 429: {\n const retryAfter = parseInt(\n axiosError.response?.headers['retry-after'] || '60'\n );\n // Use detail from response if available, otherwise use default message\n const rateLimitMessage = data?.detail || message;\n throw new RateLimitError(rateLimitMessage, retryAfter, {\n statusCode: status,\n response: data,\n });\n }\n case 500:\n case 502:\n case 503:\n case 504:\n throw new NetworkError(message, {\n statusCode: status,\n response: data,\n });\n default:\n if (axiosError.code === 'ECONNABORTED') {\n throw new NetworkError('Request timeout', {\n code: axiosError.code,\n });\n }\n throw new InstaVMError(message, {\n statusCode: status,\n response: data,\n code: axiosError.code,\n });\n }\n }\n );\n }\n\n /**\n * Make an HTTP request with retry logic\n */\n async request<T = any>(requestConfig: RequestConfig): Promise<T> {\n const axiosConfig: AxiosRequestConfig = {\n method: requestConfig.method,\n url: requestConfig.url,\n headers: requestConfig.headers,\n data: requestConfig.data,\n params: requestConfig.params,\n timeout: requestConfig.timeout || this.config.timeout,\n };\n\n const makeRequest = async (): Promise<T> => {\n const response: AxiosResponse<T> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n\n /**\n * POST request with JSON body\n */\n async post<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers,\n timeout,\n });\n }\n\n /**\n * POST request for code execution (uses X-API-Key header like Python client)\n */\n async postExecution<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>,\n timeout?: number\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n timeout,\n });\n }\n\n /**\n * POST request with form data (for file uploads)\n */\n async postFormData<T = any>(\n url: string,\n formData: FormData,\n headers?: Record<string, string>\n ): Promise<T> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...formData.getHeaders(),\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: formData,\n headers: requestHeaders,\n });\n }\n\n /**\n * POST request with URL-encoded form data (like Python requests data= parameter)\n */\n async postFormUrlEncoded<T = any>(\n url: string,\n data: any,\n headers?: Record<string, string>\n ): Promise<T> {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(data)) {\n params.append(key, String(value));\n }\n\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers,\n };\n\n return this.request<T>({\n method: 'POST',\n url,\n data: params.toString(),\n headers: requestHeaders,\n });\n }\n\n /**\n * GET request\n */\n async get<T = any>(\n url: string,\n params?: Record<string, any>,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n url,\n params,\n headers,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T = any>(\n url: string,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n url,\n headers,\n });\n }\n\n /**\n * PUT request\n */\n async put<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PUT',\n url,\n data,\n headers,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T = any>(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n url,\n data,\n headers,\n });\n }\n\n /**\n * OPTIONS request\n */\n async options<T = any>(\n url: string,\n headers?: Record<string, string>,\n params?: Record<string, any>\n ): Promise<T> {\n return this.request<T>({\n method: 'OPTIONS',\n url,\n headers,\n params,\n });\n }\n\n /**\n * POST request that returns raw binary data (for file downloads)\n */\n async postRaw(\n url: string,\n data?: any,\n headers?: Record<string, string>\n ): Promise<ArrayBuffer> {\n const requestHeaders = {\n 'X-API-Key': this.config.apiKey,\n ...headers,\n };\n\n const axiosConfig: AxiosRequestConfig = {\n method: 'POST',\n url,\n data,\n headers: requestHeaders,\n responseType: 'arraybuffer',\n timeout: this.config.timeout,\n };\n\n const makeRequest = async (): Promise<ArrayBuffer> => {\n const response: AxiosResponse<ArrayBuffer> = await this.client.request(axiosConfig);\n return response.data;\n };\n\n return withRetry(makeRequest, {\n retries: this.config.maxRetries,\n retryDelay: this.config.retryDelay,\n });\n }\n}\n","/**\n * Base error class for all InstaVM SDK errors\n */\nexport class InstaVMError extends Error {\n public readonly name: string;\n public readonly code?: string;\n public readonly statusCode?: number;\n public readonly response?: any;\n\n constructor(\n message: string,\n options?: {\n code?: string;\n statusCode?: number;\n response?: any;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = this.constructor.name;\n this.code = options?.code;\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n\n // Capture stack trace, excluding constructor call from it\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication-related errors (401, invalid API key, etc.)\n */\nexport class AuthenticationError extends InstaVMError {\n constructor(message: string = 'Authentication failed', options?: any) {\n super(message, { ...options, statusCode: 401 });\n }\n}\n\n/**\n * Rate limiting errors (429)\n */\nexport class RateLimitError extends InstaVMError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n options?: any\n ) {\n super(message, { ...options, statusCode: 429 });\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Quota/usage limit exceeded errors\n */\nexport class QuotaExceededError extends InstaVMError {\n constructor(message: string = 'Usage quota exceeded', options?: any) {\n super(message, { ...options, statusCode: 402 });\n }\n}\n\n/**\n * Forbidden errors (403, tier limits, ownership mismatch).\n */\nexport class ForbiddenError extends InstaVMError {\n constructor(message: string = 'Forbidden', options?: any) {\n super(message, { ...options, statusCode: 403 });\n }\n}\n\n/**\n * Network-related errors (timeouts, connection issues, 5xx errors)\n */\nexport class NetworkError extends InstaVMError {\n constructor(message: string = 'Network error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Code execution errors\n */\nexport class ExecutionError extends InstaVMError {\n public readonly executionOutput?: string;\n public readonly executionTime?: number;\n\n constructor(\n message: string,\n executionOutput?: string,\n executionTime?: number,\n options?: any\n ) {\n super(message, options);\n this.executionOutput = executionOutput;\n this.executionTime = executionTime;\n }\n}\n\n/**\n * Session management errors\n */\nexport class SessionError extends InstaVMError {\n constructor(message: string = 'Session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser automation base error\n */\nexport class BrowserError extends InstaVMError {\n constructor(message: string = 'Browser error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser session management errors\n */\nexport class BrowserSessionError extends BrowserError {\n constructor(message: string = 'Browser session error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser interaction errors (click, type, etc.)\n */\nexport class BrowserInteractionError extends BrowserError {\n constructor(message: string = 'Browser interaction error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser timeout errors\n */\nexport class BrowserTimeoutError extends BrowserError {\n constructor(message: string = 'Browser operation timed out', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Browser navigation errors\n */\nexport class BrowserNavigationError extends BrowserError {\n constructor(message: string = 'Browser navigation error', options?: any) {\n super(message, options);\n }\n}\n\n/**\n * Element not found errors\n */\nexport class ElementNotFoundError extends BrowserError {\n public readonly selector?: string;\n\n constructor(\n message: string = 'Element not found',\n selector?: string,\n options?: any\n ) {\n super(message, options);\n this.selector = selector;\n }\n}\n\n/**\n * Unsupported operation error (e.g., operations not available in local mode)\n */\nexport class UnsupportedOperationError extends InstaVMError {\n constructor(message: string = 'Operation not supported', options?: any) {\n super(message, options);\n }\n}","import { NetworkError, RateLimitError } from '../errors/BaseError';\n\nexport interface RetryOptions {\n retries: number;\n retryDelay: number;\n maxRetryDelay?: number;\n retryCondition?: (error: any) => boolean;\n}\n\n/**\n * Default retry condition - retry on network errors and 5xx server errors\n */\nexport function defaultRetryCondition(error: any): boolean {\n if (error instanceof NetworkError) return true;\n if (error instanceof RateLimitError) return true;\n \n // Axios error with status code\n if (error.response?.status >= 500) return true;\n \n // Network/timeout errors\n if (error.code === 'ECONNABORTED' || error.code === 'ETIMEDOUT') return true;\n if (error.code === 'ECONNRESET' || error.code === 'ENOTFOUND') return true;\n \n return false;\n}\n\n/**\n * Calculate exponential backoff delay\n */\nexport function calculateRetryDelay(\n attempt: number,\n baseDelay: number,\n maxDelay = 30000\n): number {\n const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);\n const jitteredDelay = exponentialDelay * (0.5 + Math.random() * 0.5);\n return Math.min(jitteredDelay, maxDelay);\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n const {\n retries,\n retryDelay,\n maxRetryDelay = 30000,\n retryCondition = defaultRetryCondition,\n } = options;\n\n let lastError: any;\n\n for (let attempt = 1; attempt <= retries + 1; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry on last attempt\n if (attempt === retries + 1) {\n break;\n }\n\n // Check if we should retry this error\n if (!retryCondition(error)) {\n break;\n }\n\n // Calculate delay for this attempt\n const delay = calculateRetryDelay(attempt, retryDelay, maxRetryDelay);\n \n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}","/** Keep in sync with root `package.json` `version`. */\nexport const INSTAVM_JS_SDK_VERSION = '0.17.0';\n","import { EventEmitter } from 'eventemitter3';\nimport type { HTTPClient } from './HTTPClient';\nimport {\n BrowserError,\n BrowserInteractionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport type {\n NavigateOptions,\n NavigationResult,\n ClickOptions,\n TypeOptions,\n FillOptions,\n ScrollOptions,\n ScreenshotOptions,\n WaitCondition,\n ExtractedElement,\n ExtractOptions,\n ExtractContentOptions,\n ExtractedContent,\n} from '../types/browser';\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * Browser session for automation\n */\nexport class BrowserSession extends EventEmitter {\n public readonly sessionId: string;\n private httpClient: HTTPClient;\n private _isActive: boolean = true;\n\n constructor(sessionId: string, httpClient: HTTPClient) {\n super();\n this.sessionId = sessionId;\n this.httpClient = httpClient;\n }\n\n /**\n * Navigate to a URL\n */\n async navigate(\n url: string,\n options: NavigateOptions = {}\n ): Promise<NavigationResult> {\n this.ensureActive();\n\n const requestData = {\n url,\n session_id: this.sessionId,\n wait_timeout: options.waitTimeout || 30000,\n wait_until: options.waitUntil || 'load',\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/navigate',\n requestData\n );\n\n const result: NavigationResult = {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n\n this.emit('navigation', result);\n return result;\n } catch (error) {\n const navigationError = new BrowserNavigationError(\n `Navigation failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n this.emit('error', navigationError);\n throw navigationError;\n }\n }\n\n /**\n * Click an element\n */\n async click(selector: string, options: ClickOptions = {}): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n button: options.button || 'left',\n click_count: options.clickCount || 1,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/click',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Click timeout: ${selector}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Click failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Type text into an element\n */\n async type(\n selector: string,\n text: string,\n options: TypeOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n text,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n delay: options.delay || 0,\n clear: options.clear !== false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/type',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Type failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Fill a form field\n */\n async fill(\n selector: string,\n value: string,\n options: FillOptions = {}\n ): Promise<void> {\n this.ensureActive();\n\n const requestData = {\n selector,\n value,\n session_id: this.sessionId,\n timeout: options.timeout || 10000,\n force: options.force || false,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/fill',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('not found') || errorMessage.includes('selector')) {\n throw new ElementNotFoundError(\n `Element not found: ${selector}`,\n selector,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Fill failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Scroll the page\n */\n async scroll(options: ScrollOptions = {}): Promise<void> {\n this.ensureActive();\n\n if (!options.selector && options.x == null && options.y == null) {\n throw new BrowserInteractionError(\n \"At least one of 'selector', 'x', or 'y' must be provided for scrolling.\"\n );\n }\n\n const requestData: Record<string, any> = {\n session_id: this.sessionId,\n behavior: options.behavior || 'auto',\n };\n if (options.selector) {\n requestData.selector = options.selector;\n }\n if (options.x != null) {\n requestData.x = options.x;\n }\n if (options.y != null) {\n requestData.y = options.y;\n }\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/scroll',\n requestData\n );\n } catch (error) {\n throw new BrowserInteractionError(\n `Scroll failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Take a screenshot\n */\n async screenshot(options: ScreenshotOptions = {}): Promise<string> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n full_page: options.fullPage !== false,\n format: options.format || 'png',\n quality: options.quality || 90,\n clip: options.clip,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/screenshot',\n requestData\n );\n\n if (!response.screenshot) {\n throw new BrowserError('Screenshot data not returned');\n }\n\n return response.screenshot;\n } catch (error) {\n throw new BrowserInteractionError(\n `Screenshot failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract elements from the page\n */\n async extractElements(\n selector?: string | null,\n attributes: string[] = ['text'],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n this.ensureActive();\n\n const requestData: Record<string, any> = {\n attributes,\n session_id: this.sessionId,\n max_results: options.maxResults || 100,\n };\n if (selector) {\n requestData.selector = selector;\n }\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/extract',\n requestData\n );\n\n return response.elements || [];\n } catch (error) {\n throw new BrowserInteractionError(\n `Element extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Extract LLM-friendly content from the current page\n *\n * Returns clean article content, interactive elements, and content anchors\n * for intelligent browser automation with LLMs.\n *\n * @param options - Content extraction options\n * @returns Extracted content with readable text, interactive elements, and content anchors\n *\n * @example\n * ```typescript\n * const content = await session.extractContent();\n *\n * // LLM reads clean content\n * const article = content.readableContent.content;\n *\n * // LLM finds \"Sign Up\" in content and uses anchors to get selector\n * const signUpAnchor = content.contentAnchors?.find(\n * anchor => anchor.text.toLowerCase().includes('sign up')\n * );\n * if (signUpAnchor) {\n * await session.click(signUpAnchor.selector);\n * }\n * ```\n */\n async extractContent(\n options: ExtractContentOptions = {}\n ): Promise<ExtractedContent> {\n this.ensureActive();\n\n const requestData = {\n session_id: this.sessionId,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>(\n '/v1/browser/interactions/content',\n requestData\n );\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n throw new BrowserInteractionError(\n `Content extraction failed: ${getErrorMessage(error)}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Wait for a string condition (parity with Python ``wait_for``).\n */\n async waitFor(\n condition: string,\n selector?: string | null,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureActive();\n const requestData: Record<string, any> = {\n session_id: this.sessionId,\n condition,\n timeout,\n };\n if (selector) {\n requestData.selector = selector;\n }\n try {\n return await this.httpClient.post<any>('/v1/browser/interactions/wait', requestData);\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(`Wait condition timeout: ${condition}`, { cause: error as Error });\n }\n throw new BrowserInteractionError(`Wait failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Wait for a condition\n */\n async wait(condition: WaitCondition, timeout = 10000): Promise<void> {\n this.ensureActive();\n\n let requestData: any = {\n session_id: this.sessionId,\n timeout,\n };\n\n if (condition.type === 'timeout') {\n // Simple timeout wait\n await new Promise(resolve => setTimeout(resolve, condition.ms));\n return;\n }\n\n requestData = {\n ...requestData,\n condition: condition.type,\n selector: 'selector' in condition ? condition.selector : undefined,\n };\n\n try {\n await this.httpClient.post<any>(\n '/v1/browser/interactions/wait',\n requestData\n );\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n if (errorMessage.includes('timeout')) {\n throw new BrowserTimeoutError(\n `Wait condition timeout: ${condition.type}`,\n { cause: error as Error }\n );\n }\n throw new BrowserInteractionError(\n `Wait failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close the browser session\n */\n async close(): Promise<void> {\n if (!this._isActive) {\n return;\n }\n\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${this.sessionId}`);\n } catch (error) {\n // Don't throw on close errors - session might already be closed\n console.warn(`Failed to close browser session ${this.sessionId}:`, getErrorMessage(error));\n } finally {\n this._isActive = false;\n this.emit('close');\n }\n }\n\n /**\n * Check if session is active\n */\n get isActive(): boolean {\n return this._isActive;\n }\n\n /**\n * Ensure session is active before operations\n */\n private ensureActive(): void {\n if (!this._isActive) {\n throw new BrowserError('Browser session is not active');\n }\n }\n}","export function encodePathSegment(value: string | number): string {\n const segment = String(value);\n if (segment === '.' || segment === '..') {\n throw new Error('Path traversal not allowed in path segment');\n }\n return encodeURIComponent(segment);\n}\n\nexport function encodePathSegments(path: string): string {\n const segments = path\n .replace(/^\\/+/, '')\n .split('/')\n .filter((segment) => segment.length > 0 && segment !== '.');\n\n if (segments.some((segment) => segment === '..')) {\n throw new Error('Path traversal not allowed in proxy path');\n }\n\n return segments.map((segment) => encodeURIComponent(segment)).join('/');\n}\n","import type { HTTPClient } from './HTTPClient';\nimport type { InstaVM } from './InstaVM';\nimport { BrowserSession } from './BrowserSession';\nimport {\n BrowserSessionError,\n BrowserNavigationError,\n BrowserInteractionError,\n UnsupportedOperationError,\n} from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n BrowserSessionOptions,\n BrowserSessionInfo,\n NavigateOptions,\n NavigationResult,\n ExtractContentOptions,\n ExtractedContent,\n ExtractedElement,\n ExtractOptions,\n} from '../types/browser';\n\n/**\n * Browser automation manager (parity with Python ``BrowserManager``).\n */\nexport class BrowserManager {\n private httpClient: HTTPClient;\n private activeSessions: Map<string, BrowserSession> = new Map();\n private local: boolean;\n private getClient?: () => InstaVM;\n private _defaultBrowserSessionId: string | null = null;\n private _defaultSessionPromise: Promise<BrowserSession> | null = null;\n\n constructor(httpClient: HTTPClient, local: boolean = false, getClient?: () => InstaVM) {\n this.httpClient = httpClient;\n this.local = local;\n this.getClient = getClient;\n }\n\n private async ensureDefaultBrowserSessionId(): Promise<string> {\n if (this._defaultBrowserSessionId) {\n return this._defaultBrowserSessionId;\n }\n if (!this._defaultSessionPromise) {\n this._defaultSessionPromise = this.createSession().catch((err) => {\n this._defaultSessionPromise = null;\n throw err;\n });\n }\n const session = await this._defaultSessionPromise;\n this._defaultBrowserSessionId = session.sessionId;\n return this._defaultBrowserSessionId;\n }\n\n /**\n * Create a new browser session\n */\n async createSession(options: BrowserSessionOptions = {}): Promise<BrowserSession> {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Browser session management is not supported in local mode. Use navigate() or extractContent() with URL directly.'\n );\n }\n\n const requestData = {\n viewport_width: options.viewportWidth || 1920,\n viewport_height: options.viewportHeight || 1080,\n user_agent: options.userAgent,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/sessions/', requestData);\n\n if (!response.session_id) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n\n const session = new BrowserSession(response.session_id, this.httpClient);\n this.activeSessions.set(response.session_id, session);\n\n session.on('close', () => {\n this.activeSessions.delete(response.session_id);\n if (this._defaultBrowserSessionId === response.session_id) {\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n });\n\n return session;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to create browser session: ${errorMessage}`, {\n cause: error as Error,\n });\n }\n }\n\n /**\n * Get information about a specific session\n */\n async getSession(sessionId: string): Promise<BrowserSessionInfo> {\n try {\n const safe = encodePathSegment(sessionId);\n const response = await this.httpClient.get<any>(`/v1/browser/sessions/${safe}`);\n\n return {\n sessionId: response.session_id,\n status: response.status || 'active',\n createdAt: response.created_at,\n viewportWidth: response.viewport_width,\n viewportHeight: response.viewport_height,\n userAgent: response.user_agent,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to get session info: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * List all browser sessions\n */\n async listSessions(): Promise<BrowserSessionInfo[]> {\n try {\n const response = await this.httpClient.get<any>('/v1/browser/sessions/');\n\n const sessions = Array.isArray(response) ? response : response?.sessions;\n if (!Array.isArray(sessions)) {\n return [];\n }\n\n return sessions.map((session: any) => ({\n sessionId: session.session_id,\n status: session.status || 'active',\n createdAt: session.created_at,\n viewportWidth: session.viewport_width,\n viewportHeight: session.viewport_height,\n userAgent: session.user_agent,\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to list sessions: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n getLocalSession(sessionId: string): BrowserSession | undefined {\n return this.activeSessions.get(sessionId);\n }\n\n attachSession(sessionId: string): BrowserSession {\n const existing = this.activeSessions.get(sessionId);\n if (existing) {\n return existing;\n }\n\n const session = new BrowserSession(sessionId, this.httpClient);\n this.activeSessions.set(sessionId, session);\n session.on('close', () => {\n this.activeSessions.delete(sessionId);\n if (this._defaultBrowserSessionId === sessionId) {\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n });\n return session;\n }\n\n getLocalSessions(): BrowserSession[] {\n return Array.from(this.activeSessions.values());\n }\n\n async closeAllSessions(): Promise<void> {\n const sessions = Array.from(this.activeSessions.values());\n\n await Promise.allSettled(sessions.map((session) => session.close()));\n\n this.activeSessions.clear();\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n\n /**\n * Navigate to a URL (local: no session; cloud: auto default browser session)\n */\n async navigate(url: string, options: NavigateOptions = {}): Promise<NavigationResult> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = await this.ensureDefaultBrowserSessionId();\n const raw = await client.browserNavigate(url, sid, options.waitTimeout ?? 30000);\n return {\n success: raw.success !== false,\n url: (raw.url as string) || url,\n title: raw.title as string | undefined,\n status: raw.status as number | undefined,\n };\n }\n\n const requestData = {\n url,\n wait_timeout: options.waitTimeout || 30000,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/interactions/navigate', requestData);\n\n return {\n success: response.success !== false,\n url: response.url || url,\n title: response.title,\n status: response.status,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(`Navigation failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n async click(\n selector: string,\n sessionId?: string,\n force: boolean = false,\n timeout: number = 30000\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserClick(selector, sid, force, timeout);\n return;\n }\n throw new UnsupportedOperationError('click() without session is only supported in cloud mode via InstaVM.');\n }\n\n async type(\n selector: string,\n text: string,\n sessionId?: string,\n delay: number = 100,\n timeout: number = 30000\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserType(selector, text, sid, delay, timeout);\n return;\n }\n throw new UnsupportedOperationError('type() requires cloud mode with InstaVM client.');\n }\n\n async fill(selector: string, value: string, sessionId?: string, timeout: number = 30000): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserFill(selector, value, sid, timeout);\n return;\n }\n throw new UnsupportedOperationError('fill() requires cloud mode with InstaVM client.');\n }\n\n async scroll(\n options: { sessionId?: string; selector?: string; x?: number; y?: number } = {}\n ): Promise<void> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = options.sessionId ?? (await this.ensureDefaultBrowserSessionId());\n await client.browserScroll(sid, options.selector ?? null, options.x ?? null, options.y ?? null);\n return;\n }\n throw new UnsupportedOperationError('scroll() cloud convenience requires InstaVM client.');\n }\n\n async waitFor(\n condition: string,\n selector?: string,\n sessionId?: string,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n return client.browserWait(condition, sid, selector ?? null, timeout);\n }\n throw new UnsupportedOperationError('waitFor() requires cloud mode with InstaVM client.');\n }\n\n async extractElements(\n selector?: string,\n sessionId?: string,\n attributes?: string[],\n options: ExtractOptions = {}\n ): Promise<ExtractedElement[]> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n const sid = sessionId ?? (await this.ensureDefaultBrowserSessionId());\n const attrs = attributes ?? ['text'];\n const result = await client.browserExtractElements(sid, selector ?? null, attrs);\n if (options.maxResults !== undefined && Array.isArray(result)) {\n return result.slice(0, options.maxResults);\n }\n return result as ExtractedElement[];\n }\n throw new UnsupportedOperationError('extractElements() requires cloud mode with InstaVM client.');\n }\n\n /**\n * Extract LLM-friendly content (local: URL required; cloud: optional session)\n */\n async extractContent(options: ExtractContentOptions = {}): Promise<ExtractedContent> {\n if (!this.local) {\n const client = this.getClient?.();\n if (!client) {\n throw new UnsupportedOperationError('BrowserManager is missing InstaVM client reference.');\n }\n let sid: string | undefined = options.sessionId;\n if (!sid) {\n sid = await this.ensureDefaultBrowserSessionId();\n }\n const raw = await client.browserExtractContent(\n sid,\n options.url ?? null,\n options.includeInteractive !== false,\n options.includeAnchors !== false,\n options.maxAnchors ?? 50\n );\n return {\n readableContent: {\n ...(raw.readable_content || {}),\n content: raw.readable_content?.content || '',\n },\n interactiveElements: raw.interactive_elements,\n contentAnchors: raw.content_anchors,\n };\n }\n\n if (!options.url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n\n const requestData = {\n url: options.url,\n include_interactive: options.includeInteractive !== false,\n include_anchors: options.includeAnchors !== false,\n max_anchors: options.maxAnchors ?? 50,\n };\n\n try {\n const response = await this.httpClient.post<any>('/v1/browser/interactions/content', requestData);\n\n return {\n readableContent: {\n ...(response.readable_content || {}),\n content: response.readable_content?.content || '',\n },\n interactiveElements: response.interactive_elements,\n contentAnchors: response.content_anchors,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Content extraction failed: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Closes the default browser session if one was created for cloud convenience.\n */\n async close(): Promise<void> {\n if (!this._defaultBrowserSessionId) {\n return;\n }\n const sid = this._defaultBrowserSessionId;\n const session = this.activeSessions.get(sid);\n if (session) {\n try {\n await session.close();\n } catch {\n // ignore\n }\n }\n this._defaultBrowserSessionId = null;\n this._defaultSessionPromise = null;\n }\n\n async dispose(): Promise<void> {\n await this.close();\n await this.closeAllSessions();\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VMCreateRequest,\n VMUpdateRequest,\n VMCloneRequest,\n VMSnapshotRequest,\n VMVolumeMountRequest,\n VMMountedVolumeResponse,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VMsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VMCreateRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM creation');\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: '/v1/vms',\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listAll(): Promise<JsonMap[]> {\n return this.listAllRecords();\n }\n\n /**\n * Calls GET /v1/vms/ (trailing slash), a distinct route from GET /v1/vms.\n */\n async listAllRecords(): Promise<JsonMap[]> {\n this.ensureCloud('VM listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/vms/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: string | number): Promise<JsonMap> {\n this.ensureCloud('VM lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<JsonMap>(\n `/v1/vms/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(vmId: string, payload: VMUpdateRequest = {}): Promise<JsonMap> {\n this.ensureCloud('VM update');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.patch<JsonMap>(\n `/v1/vms/${safeVmId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(vmId: string): Promise<JsonMap> {\n this.ensureCloud('VM deletion');\n const safeVmId = encodePathSegment(vmId);\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${safeVmId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async clone(vmId: string, payload: VMCloneRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM clone');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/clone`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async snapshot(vmId: string, payload: VMSnapshotRequest = {}, wait: boolean = true): Promise<JsonMap> {\n this.ensureCloud('VM snapshot');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<JsonMap>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/snapshot`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async mountVolume(\n vmId: string,\n payload: VMVolumeMountRequest,\n wait: boolean = true\n ): Promise<VMMountedVolumeResponse> {\n this.ensureCloud('VM volume mount');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.request<VMMountedVolumeResponse>({\n method: 'POST',\n url: `/v1/vms/${safeVmId}/volumes`,\n params: { wait },\n data: payload,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async listVolumes(vmId: string): Promise<VMMountedVolumeResponse[]> {\n this.ensureCloud('VM volume listing');\n const safeVmId = encodePathSegment(vmId);\n\n return this.httpClient.get<VMMountedVolumeResponse[]>(\n `/v1/vms/${safeVmId}/volumes`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async unmountVolume(\n vmId: string,\n volumeId: string,\n mountPath: string,\n wait: boolean = true\n ): Promise<JsonMap> {\n this.ensureCloud('VM volume unmount');\n const safeVmId = encodePathSegment(vmId);\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/vms/${safeVmId}/volumes/${safeVolumeId}`,\n params: { mount_path: mountPath, wait },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n SnapshotCreateRequest,\n SnapshotQueryOptions,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SnapshotsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: SnapshotCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Snapshot creation');\n return this.httpClient.post<JsonMap>(\n '/v1/snapshots',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(options: SnapshotQueryOptions = {}): Promise<JsonMap[]> {\n this.ensureCloud('Snapshot listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/snapshots',\n options,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot lookup');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.get<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(snapshotId: string): Promise<JsonMap> {\n this.ensureCloud('Snapshot deletion');\n const safeSnapshotId = encodePathSegment(snapshotId);\n return this.httpClient.delete<JsonMap>(\n `/v1/snapshots/${safeSnapshotId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { SessionError, UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n ShareCreateRequest,\n ShareUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class SharesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getSessionId: () => string | null;\n\n constructor(\n httpClient: HTTPClient,\n local: boolean = false,\n getSessionId: () => string | null = () => null\n ) {\n this.httpClient = httpClient;\n this.local = local;\n this.getSessionId = getSessionId;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: ShareCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Share creation');\n\n const body: ShareCreateRequest = { ...payload };\n if (!body.session_id && !body.vm_id) {\n const sid = this.getSessionId();\n if (!sid) {\n throw new SessionError(\n 'Provide session_id/vm_id or create a session before creating a share.'\n );\n }\n body.session_id = sid;\n }\n\n return this.httpClient.post<JsonMap>(\n '/v1/shares',\n body,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(shareId: string, payload: ShareUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Share update');\n const safeShareId = encodePathSegment(shareId);\n return this.httpClient.patch<JsonMap>(\n `/v1/shares/${safeShareId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { JsonMap, CustomDomainCreateRequest } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class CustomDomainsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: CustomDomainCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Custom domain creation');\n return this.httpClient.post<JsonMap>(\n '/v1/custom-domains',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<JsonMap[]> {\n this.ensureCloud('Custom domain listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/custom-domains',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async health(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain health');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.get<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/health`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verify(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain verification');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.post<JsonMap>(\n `/v1/custom-domains/${safeDomainId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(domainId: number): Promise<JsonMap> {\n this.ensureCloud('Custom domain deletion');\n const safeDomainId = encodePathSegment(domainId);\n return this.httpClient.delete<JsonMap>(\n `/v1/custom-domains/${safeDomainId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { ComputerUseProxyOptions, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment, encodePathSegments } from '../utils/path';\n\ntype ProxyMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport class ComputerUseManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async viewerUrl(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use viewer URL');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/viewer-url`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async proxy(\n sessionId: string,\n path: string,\n method: ProxyMethod = 'GET',\n options: ComputerUseProxyOptions = {}\n ): Promise<any> {\n this.ensureCloud('Computer-use proxy');\n const safeSessionId = encodePathSegment(sessionId);\n const cleanPath = encodePathSegments(path);\n\n return this.httpClient.request<any>({\n method,\n url: `/v1/computeruse/${safeSessionId}/${cleanPath}`,\n params: options.params,\n data: options.body,\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n\n async get(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'GET', { params });\n }\n\n async post(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'POST', { body });\n }\n\n async put(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PUT', { body });\n }\n\n async patch(sessionId: string, path: string, body?: any): Promise<any> {\n return this.proxy(sessionId, path, 'PATCH', { body });\n }\n\n async delete(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'DELETE', { params });\n }\n\n async options(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'OPTIONS', { params });\n }\n\n async head(sessionId: string, path: string, params?: Record<string, any>): Promise<any> {\n return this.proxy(sessionId, path, 'HEAD', { params });\n }\n\n /**\n * Get the VNC WebSocket URL for a computer-use session.\n * Returns the URL to connect to; the actual connection requires a WebSocket client.\n */\n async vncWebsockify(sessionId: string): Promise<JsonMap> {\n this.ensureCloud('Computer-use VNC websockify');\n const safeSessionId = encodePathSegment(sessionId);\n return this.httpClient.get<JsonMap>(\n `/v1/computeruse/${safeSessionId}/vnc/websockify`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { APIKey, APIKeyCreateRequest, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class APIKeysManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: APIKeyCreateRequest = {}): Promise<APIKey> {\n this.ensureCloud('API key creation');\n return this.httpClient.post<APIKey>(\n '/v1/api-keys/',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(): Promise<APIKey[]> {\n this.ensureCloud('API key listing');\n return this.httpClient.get<APIKey[]>(\n '/v1/api-keys/',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(itemId: number): Promise<APIKey> {\n this.ensureCloud('API key lookup');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.get<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(itemId: number, payload: APIKeyCreateRequest): Promise<APIKey> {\n this.ensureCloud('API key update');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.patch<APIKey>(\n `/v1/api-keys/${safeItemId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(itemId: number): Promise<JsonMap> {\n this.ensureCloud('API key deletion');\n const safeItemId = encodePathSegment(itemId);\n return this.httpClient.delete<JsonMap>(\n `/v1/api-keys/${safeItemId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type { AuditEventQuery, JsonMap } from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class AuditManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async catalog(): Promise<JsonMap> {\n this.ensureCloud('Audit catalog');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/catalog',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async events(query: AuditEventQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Audit event listing');\n return this.httpClient.get<JsonMap>(\n '/v1/audit/events',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEvent(eventId: string): Promise<JsonMap> {\n this.ensureCloud('Audit event lookup');\n const safeEventId = encodePathSegment(eventId);\n return this.httpClient.get<JsonMap>(\n `/v1/audit/events/${safeEventId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n WebhookDeliveryQuery,\n WebhookEndpointCreateRequest,\n WebhookEndpointUpdateRequest,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class WebhooksManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async createEndpoint(payload: WebhookEndpointCreateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint creation');\n return this.httpClient.post<JsonMap>(\n '/v1/webhooks/endpoints',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listEndpoints(): Promise<JsonMap[]> {\n this.ensureCloud('Webhook endpoint listing');\n return this.httpClient.get<JsonMap[]>(\n '/v1/webhooks/endpoints',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async getEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint lookup');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.get<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async updateEndpoint(endpointId: string, payload: WebhookEndpointUpdateRequest): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint update');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.patch<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint deletion');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.delete<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async rotateSecret(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook secret rotation');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/rotate-secret`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async sendTestEvent(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook test event');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/test`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async verifyEndpoint(endpointId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook endpoint verification');\n const safeEndpointId = encodePathSegment(endpointId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/endpoints/${safeEndpointId}/verify`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listDeliveries(query: WebhookDeliveryQuery = {}): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery listing');\n return this.httpClient.get<JsonMap>(\n '/v1/webhooks/deliveries',\n query,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async replayDelivery(deliveryId: string): Promise<JsonMap> {\n this.ensureCloud('Webhook delivery replay');\n const safeDeliveryId = encodePathSegment(deliveryId);\n return this.httpClient.post<JsonMap>(\n `/v1/webhooks/deliveries/${safeDeliveryId}/replay`,\n {},\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport FormData from 'form-data';\nimport type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n JsonMap,\n VolumeCreateRequest,\n VolumeUpdateRequest,\n VolumeResponse,\n VolumeCheckpointCreateRequest,\n VolumeCheckpointResponse,\n VolumeFileEntry,\n VolumeFileUploadRequest,\n VolumeFileDownloadResponse,\n VolumeFileListQuery,\n} from '../types/infrastructure';\nimport { encodePathSegment } from '../utils/path';\n\nexport class VolumesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n async create(payload: VolumeCreateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume creation');\n\n return this.httpClient.post<VolumeResponse>(\n '/v1/volumes',\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async list(refreshUsage: boolean = false): Promise<VolumeResponse[]> {\n this.ensureCloud('Volume listing');\n\n return this.httpClient.get<VolumeResponse[]>(\n '/v1/volumes',\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async get(volumeId: string, refreshUsage: boolean = false): Promise<VolumeResponse> {\n this.ensureCloud('Volume lookup');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n { refresh_usage: refreshUsage },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async update(volumeId: string, payload: VolumeUpdateRequest): Promise<VolumeResponse> {\n this.ensureCloud('Volume update');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.patch<VolumeResponse>(\n `/v1/volumes/${safeVolumeId}`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async delete(volumeId: string): Promise<JsonMap> {\n this.ensureCloud('Volume deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async createCheckpoint(\n volumeId: string,\n payload: VolumeCheckpointCreateRequest = {}\n ): Promise<VolumeCheckpointResponse> {\n this.ensureCloud('Volume checkpoint creation');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.post<VolumeCheckpointResponse>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n payload,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async listCheckpoints(volumeId: string): Promise<VolumeCheckpointResponse[]> {\n this.ensureCloud('Volume checkpoint listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeCheckpointResponse[]>(\n `/v1/volumes/${safeVolumeId}/checkpoints`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteCheckpoint(volumeId: string, checkpointId: string): Promise<JsonMap> {\n this.ensureCloud('Volume checkpoint deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n const safeCheckpointId = encodePathSegment(checkpointId);\n\n return this.httpClient.delete<JsonMap>(\n `/v1/volumes/${safeVolumeId}/checkpoints/${safeCheckpointId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async uploadFile(volumeId: string, payload: VolumeFileUploadRequest): Promise<VolumeFileEntry> {\n this.ensureCloud('Volume file upload');\n\n if (!payload.path || payload.path.trim().length === 0) {\n throw new Error('payload.path is required');\n }\n\n const hasFilePath = typeof payload.filePath === 'string' && payload.filePath.length > 0;\n const hasFileContent = payload.fileContent !== undefined;\n\n if (hasFilePath === hasFileContent) {\n throw new Error('Provide exactly one of payload.filePath or payload.fileContent');\n }\n\n const safeVolumeId = encodePathSegment(volumeId);\n const formData = new FormData();\n\n if (hasFilePath) {\n const sourcePath = payload.filePath as string;\n const filename = payload.filename || path.basename(sourcePath);\n formData.append('file', fs.createReadStream(sourcePath), { filename });\n } else {\n const filename = payload.filename || 'upload.bin';\n const raw = payload.fileContent as Buffer | string;\n const buffer = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);\n formData.append('file', buffer, { filename });\n }\n\n formData.append('path', payload.path);\n if (payload.overwrite !== undefined) {\n formData.append('overwrite', String(payload.overwrite));\n }\n\n return this.httpClient.postFormData<VolumeFileEntry>(\n `/v1/volumes/${safeVolumeId}/files/upload`,\n formData\n );\n }\n\n async downloadFile(volumeId: string, path: string): Promise<VolumeFileDownloadResponse> {\n this.ensureCloud('Volume file download');\n const safeVolumeId = encodePathSegment(volumeId);\n\n const response = await this.httpClient.post<{\n path: string;\n filename: string;\n size: number;\n content: string;\n }>(\n `/v1/volumes/${safeVolumeId}/files/download`,\n { path },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n path: response.path,\n filename: response.filename,\n size: response.size,\n content: Buffer.from(response.content || '', 'base64'),\n };\n }\n\n async listFiles(\n volumeId: string,\n options: VolumeFileListQuery = {}\n ): Promise<VolumeFileEntry[]> {\n this.ensureCloud('Volume file listing');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.get<VolumeFileEntry[]>(\n `/v1/volumes/${safeVolumeId}/files`,\n {\n prefix: options.prefix ?? '',\n recursive: options.recursive ?? true,\n limit: options.limit ?? 1000,\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n async deleteFile(volumeId: string, targetPath: string): Promise<JsonMap> {\n this.ensureCloud('Volume file deletion');\n const safeVolumeId = encodePathSegment(volumeId);\n\n return this.httpClient.request<JsonMap>({\n method: 'DELETE',\n url: `/v1/volumes/${safeVolumeId}/files`,\n params: { path: targetPath },\n headers: { 'X-API-Key': this.httpClient.apiKey },\n });\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n TapeAppendEventOptions,\n TapeBranchOptions,\n TapeBranchResponse,\n TapeDiffResponse,\n TapeEvent,\n TapeEventsQuery,\n TapeExportBundle,\n TapeLanesResponse,\n TapeListQuery,\n TapeRecord,\n TapeStartOptions,\n} from '../types/tape';\n\ntype JsonMap = Record<string, any>;\n\nexport class TapesManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(operation: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operation} is not supported in local mode.`\n );\n }\n }\n\n private authHeaders(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async start(sessionId: string, options: TapeStartOptions = {}): Promise<TapeRecord> {\n this.ensureCloud('Tape start');\n const safe = encodePathSegment(sessionId);\n return this.httpClient.post<TapeRecord>(\n `/v1/sessions/${safe}/tape/start`,\n {\n record_egress_content: options.recordEgressContent ?? false,\n record_fs: options.recordFs ?? true,\n retention_days: options.retentionDays ?? 7,\n },\n this.authHeaders()\n );\n }\n\n async stop(tapeId: string): Promise<TapeRecord> {\n this.ensureCloud('Tape stop');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.post<TapeRecord>(\n `/v1/tapes/${safe}/stop`,\n undefined,\n this.authHeaders()\n );\n }\n\n async list(query: TapeListQuery = {}): Promise<TapeRecord[]> {\n this.ensureCloud('Tape listing');\n const params: Record<string, any> = {\n limit: query.limit ?? 50,\n offset: query.offset ?? 0,\n };\n if (query.sessionId !== undefined) params.session_id = query.sessionId;\n if (query.vmId !== undefined) params.vm_id = query.vmId;\n if (query.status !== undefined) params.status = query.status;\n\n const result = await this.httpClient.get<any>(\n '/v1/tapes',\n params,\n this.authHeaders()\n );\n return Array.isArray(result) ? result : [];\n }\n\n async get(tapeId: string): Promise<TapeRecord> {\n this.ensureCloud('Tape lookup');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeRecord>(\n `/v1/tapes/${safe}`,\n undefined,\n this.authHeaders()\n );\n }\n\n async events(tapeId: string, query: TapeEventsQuery = {}): Promise<TapeEvent[]> {\n this.ensureCloud('Tape events');\n const safe = encodePathSegment(tapeId);\n const params: Record<string, any> = { limit: query.limit ?? 200 };\n if (query.afterStep !== undefined) params.after_step = query.afterStep;\n if (query.kind !== undefined) params.kind = query.kind;\n\n const result = await this.httpClient.get<any>(\n `/v1/tapes/${safe}/events`,\n params,\n this.authHeaders()\n );\n return Array.isArray(result) ? result : [];\n }\n\n async appendEvent(\n tapeId: string,\n kind: string,\n options: TapeAppendEventOptions = {}\n ): Promise<TapeEvent> {\n this.ensureCloud('Tape append event');\n const safe = encodePathSegment(tapeId);\n const body: Record<string, any> = { kind, payload: options.payload || {} };\n if (options.stepId !== undefined) body.step_id = options.stepId;\n if (options.parentStepId !== undefined) body.parent_step_id = options.parentStepId;\n if (options.checkpointId !== undefined) body.checkpoint_id = options.checkpointId;\n return this.httpClient.post<TapeEvent>(\n `/v1/tapes/${safe}/events`,\n body,\n this.authHeaders()\n );\n }\n\n async lanes(tapeId: string): Promise<TapeLanesResponse> {\n this.ensureCloud('Tape lanes');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeLanesResponse>(\n `/v1/tapes/${safe}/lanes`,\n undefined,\n this.authHeaders()\n );\n }\n\n async diff(tapeId: string, fromStep: number, toStep: number): Promise<TapeDiffResponse> {\n this.ensureCloud('Tape diff');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeDiffResponse>(\n `/v1/tapes/${safe}/diff`,\n { from: fromStep, to: toStep },\n this.authHeaders()\n );\n }\n\n async branch(\n tapeId: string,\n atStep: number,\n options: TapeBranchOptions = {}\n ): Promise<TapeBranchResponse> {\n this.ensureCloud('Tape branch');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.post<TapeBranchResponse>(\n `/v1/tapes/${safe}/branch`,\n { at_step: atStep, mode: options.mode || 'live' },\n this.authHeaders()\n );\n }\n\n async delete(tapeId: string): Promise<JsonMap> {\n this.ensureCloud('Tape deletion');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.delete<JsonMap>(\n `/v1/tapes/${safe}`,\n this.authHeaders()\n );\n }\n\n async export(tapeId: string): Promise<TapeExportBundle> {\n this.ensureCloud('Tape export');\n const safe = encodePathSegment(tapeId);\n return this.httpClient.get<TapeExportBundle>(\n `/v1/tapes/${safe}/export`,\n undefined,\n this.authHeaders()\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n AddVaultCredentialOptions,\n AddVaultServiceOptions,\n UpdateVaultOptions,\n VaultCatalogTemplate,\n VaultCredential,\n VaultDiscoverResponse,\n VaultRecord,\n VaultRequestLog,\n VaultService,\n} from '../types/vault';\n\ntype JsonMap = Record<string, any>;\n\nexport class VaultsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Vault management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async list(): Promise<VaultRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>('/v1/vaults', undefined, this.auth());\n if (Array.isArray(result)) return result;\n return result?.vaults || [];\n }\n\n async create(name: string, description?: string): Promise<VaultRecord> {\n this.ensureCloud();\n const body: JsonMap = { name };\n if (description !== undefined) body.description = description;\n return this.httpClient.post<VaultRecord>('/v1/vaults', body, this.auth());\n }\n\n async get(vaultId: string): Promise<VaultRecord> {\n this.ensureCloud();\n return this.httpClient.get<VaultRecord>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n undefined,\n this.auth()\n );\n }\n\n async update(vaultId: string, updates: UpdateVaultOptions): Promise<VaultRecord> {\n this.ensureCloud();\n const body: JsonMap = {};\n if (updates.name !== undefined) body.name = updates.name;\n if (updates.description !== undefined) body.description = updates.description;\n return this.httpClient.patch<VaultRecord>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n body,\n this.auth()\n );\n }\n\n async delete(vaultId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}`,\n this.auth()\n );\n }\n\n async discover(vaultId: string): Promise<VaultDiscoverResponse> {\n this.ensureCloud();\n return this.httpClient.get<VaultDiscoverResponse>(\n `/v1/vaults/${encodePathSegment(vaultId)}/discover`,\n undefined,\n this.auth()\n );\n }\n\n async listCredentials(vaultId: string): Promise<VaultCredential[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.credentials || [];\n }\n\n async addCredential(\n vaultId: string,\n name: string,\n value: string,\n options: AddVaultCredentialOptions = {}\n ): Promise<VaultCredential> {\n this.ensureCloud();\n const body: JsonMap = {\n name,\n value,\n credential_type: options.credentialType ?? 'api_key',\n };\n if (options.description !== undefined) body.description = options.description;\n return this.httpClient.post<VaultCredential>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials`,\n body,\n this.auth()\n );\n }\n\n async rotateCredential(\n vaultId: string,\n credentialId: string,\n value: string\n ): Promise<VaultCredential> {\n this.ensureCloud();\n return this.httpClient.post<VaultCredential>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials/${encodePathSegment(credentialId)}/rotate`,\n { value },\n this.auth()\n );\n }\n\n async deleteCredential(vaultId: string, credentialId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/credentials/${encodePathSegment(credentialId)}`,\n this.auth()\n );\n }\n\n async listServices(vaultId: string): Promise<VaultService[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.services || [];\n }\n\n async addService(\n vaultId: string,\n host: string,\n authConfig: Record<string, any>,\n options: AddVaultServiceOptions = {}\n ): Promise<VaultService> {\n this.ensureCloud();\n const body: JsonMap = {\n host,\n auth_config: authConfig,\n enabled: options.enabled ?? true,\n };\n if (options.description !== undefined) body.description = options.description;\n return this.httpClient.post<VaultService>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services`,\n body,\n this.auth()\n );\n }\n\n async addServicesFromTemplates(vaultId: string, templateIds: string[]): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services:from_template`,\n { template_ids: templateIds },\n this.auth()\n );\n }\n\n async deleteService(vaultId: string, serviceId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vaults/${encodePathSegment(vaultId)}/services/${encodePathSegment(serviceId)}`,\n this.auth()\n );\n }\n\n async getCatalog(): Promise<VaultCatalogTemplate[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n '/v1/vaults/catalog',\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.templates || [];\n }\n\n async getRequestLogs(vaultId: string, limit: number = 100): Promise<VaultRequestLog[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vaults/${encodePathSegment(vaultId)}/request-logs`,\n { limit },\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.logs || result?.request_logs || [];\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type { PTYCreateOptions, PTYRecord } from '../types/pty';\n\ntype JsonMap = Record<string, any>;\n\nexport class PTYManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getBaseURL: () => string;\n\n constructor(httpClient: HTTPClient, local: boolean, getBaseURL: () => string) {\n this.httpClient = httpClient;\n this.local = local;\n this.getBaseURL = getBaseURL;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'PTY management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n private buildPayload(options: PTYCreateOptions): JsonMap {\n const payload: JsonMap = {\n cols: options.cols ?? 80,\n rows: options.rows ?? 24,\n };\n if (options.command !== undefined) payload.shell = options.command;\n if (options.ptyId !== undefined) payload.id = options.ptyId;\n return payload;\n }\n\n private buildWsUrl(path: string): string {\n const trimmedBase = this.getBaseURL().replace(/\\/+$/, '');\n const base = trimmedBase.replace(/^http:\\/\\//, 'ws://').replace(/^https:\\/\\//, 'wss://');\n const apiKey = encodeURIComponent(this.httpClient.apiKey || '');\n return `${base}${path}?api_key=${apiKey}`;\n }\n\n // -- Session-scoped --------------------------------------------------------\n\n async create(sessionId: string, options: PTYCreateOptions = {}): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.post<PTYRecord>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions`,\n this.buildPayload(options),\n this.auth()\n );\n }\n\n async list(sessionId: string): Promise<PTYRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.sessions || [];\n }\n\n async get(sessionId: string, ptyId: string): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.get<PTYRecord>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n undefined,\n this.auth()\n );\n }\n\n async resize(sessionId: string, ptyId: string, cols: number, rows: number): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}/resize`,\n { cols, rows },\n this.auth()\n );\n }\n\n async kill(sessionId: string, ptyId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n this.auth()\n );\n }\n\n wsUrl(sessionId: string, ptyId: string): string {\n return this.buildWsUrl(\n `/v1/sessions/${encodePathSegment(sessionId)}/pty/${encodePathSegment(ptyId)}/connect`\n );\n }\n\n // -- VM-scoped (docker exec -it pattern) -----------------------------------\n\n async createForVm(vmId: string, options: PTYCreateOptions = {}): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.post<PTYRecord>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions`,\n this.buildPayload(options),\n this.auth()\n );\n }\n\n async listForVm(vmId: string): Promise<PTYRecord[]> {\n this.ensureCloud();\n const result = await this.httpClient.get<any>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions`,\n undefined,\n this.auth()\n );\n if (Array.isArray(result)) return result;\n return result?.sessions || [];\n }\n\n async getForVm(vmId: string, ptyId: string): Promise<PTYRecord> {\n this.ensureCloud();\n return this.httpClient.get<PTYRecord>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n undefined,\n this.auth()\n );\n }\n\n async resizeForVm(vmId: string, ptyId: string, cols: number, rows: number): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.post<JsonMap>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}/resize`,\n { cols, rows },\n this.auth()\n );\n }\n\n async killForVm(vmId: string, ptyId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/vms/${encodePathSegment(vmId)}/pty/sessions/${encodePathSegment(ptyId)}`,\n this.auth()\n );\n }\n\n wsUrlForVm(vmId: string, ptyId: string): string {\n return this.buildWsUrl(\n `/v1/vms/${encodePathSegment(vmId)}/pty/${encodePathSegment(ptyId)}/connect`\n );\n }\n}\n","import fs from 'fs';\nimport { stat, unlink } from 'fs/promises';\nimport { pipeline } from 'stream/promises';\nimport axios from 'axios';\nimport { INSTAVM_JS_SDK_VERSION } from '../version';\nimport type { HTTPClient } from './HTTPClient';\nimport { InstaVMError, UnsupportedOperationError } from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n RecordingDownloadResult,\n RecordingListQuery,\n RecordingRecord,\n} from '../types/recording';\n\ntype JsonMap = Record<string, any>;\n\nexport class RecordingsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n private getBaseURL: () => string;\n\n constructor(httpClient: HTTPClient, local: boolean, getBaseURL: () => string) {\n this.httpClient = httpClient;\n this.local = local;\n this.getBaseURL = getBaseURL;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Recording management is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n private sdkHeaders(): Record<string, string> {\n return { 'User-Agent': `instavm-js-sdk/${INSTAVM_JS_SDK_VERSION}` };\n }\n\n async list(query: RecordingListQuery = {}): Promise<RecordingRecord[]> {\n this.ensureCloud();\n const params: JsonMap = {\n limit: query.limit ?? 50,\n offset: query.offset ?? 0,\n };\n if (query.sessionId !== undefined) params.session_id = query.sessionId;\n if (query.status !== undefined) params.status = query.status;\n const result = await this.httpClient.get<any>('/v1/recordings', params, this.auth());\n return Array.isArray(result) ? result : [];\n }\n\n async get(recordingId: string): Promise<RecordingRecord> {\n this.ensureCloud();\n return this.httpClient.get<RecordingRecord>(\n `/v1/recordings/${encodePathSegment(recordingId)}`,\n undefined,\n this.auth()\n );\n }\n\n /**\n * Resolve the presigned download URL for a recording without following the\n * 302 redirect. The returned URL is short-lived and pre-authorised.\n */\n async getDownloadUrl(recordingId: string): Promise<string> {\n this.ensureCloud();\n const url = `${this.getBaseURL().replace(/\\/+$/, '')}/v1/recordings/${encodePathSegment(recordingId)}/download`;\n const response = await axios.request({\n method: 'GET',\n url,\n headers: {\n ...this.auth(),\n ...this.sdkHeaders(),\n },\n maxRedirects: 0,\n validateStatus: (status) => status >= 200 && status < 400,\n });\n\n if ([301, 302, 303, 307, 308].includes(response.status)) {\n const location = response.headers?.location || response.headers?.Location;\n if (!location) {\n throw new InstaVMError('Recording download response missing Location header');\n }\n return location;\n }\n\n throw new InstaVMError(\n `Server did not redirect to a presigned URL (status=${response.status})`\n );\n }\n\n /**\n * Stream a recording to a local file using the presigned URL. The S3 URL\n * must NOT carry our X-API-Key header — fetch it with a clean axios call.\n */\n async download(recordingId: string, outputPath: string): Promise<RecordingDownloadResult> {\n this.ensureCloud();\n const presignedUrl = await this.getDownloadUrl(recordingId);\n const response = await axios.request<NodeJS.ReadableStream>({\n method: 'GET',\n url: presignedUrl,\n responseType: 'stream',\n headers: this.sdkHeaders(),\n });\n\n const writer = fs.createWriteStream(outputPath);\n try {\n await pipeline(response.data, writer);\n } catch (error) {\n await unlink(outputPath).catch(() => undefined);\n throw error;\n }\n\n const fileStat = await stat(outputPath);\n\n return { recordingId, path: outputPath, bytes: fileStat.size };\n }\n\n async delete(recordingId: string): Promise<JsonMap> {\n this.ensureCloud();\n return this.httpClient.delete<JsonMap>(\n `/v1/recordings/${encodePathSegment(recordingId)}`,\n this.auth()\n );\n }\n}\n","import type { HTTPClient } from './HTTPClient';\nimport { UnsupportedOperationError } from '../errors/BaseError';\nimport type {\n CreditAllocation,\n CreditCheckResponse,\n CreditForecastResponse,\n CreditPeriod,\n CreditRates,\n CreditSummary,\n CreditTrendsGranularity,\n CreditTrendsPeriod,\n CreditTrendsResponse,\n CreditUsageEntry,\n} from '../types/credits';\n\nexport class CreditsManager {\n private httpClient: HTTPClient;\n private local: boolean;\n\n constructor(httpClient: HTTPClient, local: boolean = false) {\n this.httpClient = httpClient;\n this.local = local;\n }\n\n private ensureCloud(): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n 'Credits API is not supported in local mode.'\n );\n }\n }\n\n private auth(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n async allocation(): Promise<CreditAllocation> {\n this.ensureCloud();\n return this.httpClient.get<CreditAllocation>(\n '/v1/credits/allocation',\n undefined,\n this.auth()\n );\n }\n\n async usage(\n period: CreditPeriod = 'current_month',\n options: { usageType?: string; limit?: number } = {}\n ): Promise<CreditUsageEntry[]> {\n this.ensureCloud();\n const params: Record<string, any> = { period, limit: options.limit ?? 100 };\n if (options.usageType !== undefined) params.usage_type = options.usageType;\n const result = await this.httpClient.get<any>('/v1/credits/usage', params, this.auth());\n return Array.isArray(result) ? result : [];\n }\n\n async summary(period: CreditPeriod = 'current_month'): Promise<CreditSummary> {\n this.ensureCloud();\n return this.httpClient.get<CreditSummary>(\n '/v1/credits/summary',\n { period },\n this.auth()\n );\n }\n\n async check(usageType: string, requiredCredits: number): Promise<CreditCheckResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditCheckResponse>(\n '/v1/credits/check',\n { usage_type: usageType, required_credits: requiredCredits },\n this.auth()\n );\n }\n\n async rates(): Promise<CreditRates> {\n this.ensureCloud();\n return this.httpClient.get<CreditRates>(\n '/v1/credits/rates',\n undefined,\n this.auth()\n );\n }\n\n async usageTrends(\n period: CreditTrendsPeriod = '30d',\n granularity: CreditTrendsGranularity = 'daily'\n ): Promise<CreditTrendsResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditTrendsResponse>(\n '/v1/credits/usage/trends',\n { period, granularity },\n this.auth()\n );\n }\n\n async usageForecast(): Promise<CreditForecastResponse> {\n this.ensureCloud();\n return this.httpClient.get<CreditForecastResponse>(\n '/v1/credits/usage/forecasting',\n undefined,\n this.auth()\n );\n }\n}\n","import type { TapesManager } from './TapesManager';\nimport { SessionError } from '../errors/BaseError';\nimport type { TapeRecord, TapeStartOptions } from '../types/tape';\n\n/**\n * Start/stop a tape for a session (parity with Python ``TapeContext``).\n *\n * Usage:\n * ```ts\n * const ctx = client.tape(sessionId, { recordFs: true });\n * await ctx.start();\n * try {\n * // ...\n * } finally {\n * await ctx.stop();\n * }\n * ```\n */\nexport class TapeContext {\n public info: TapeRecord | null = null;\n\n constructor(\n private readonly tapes: TapesManager,\n private readonly sessionId: string | undefined,\n private readonly startOpts: TapeStartOptions\n ) {}\n\n get id(): string | undefined {\n return this.info?.id;\n }\n\n async start(): Promise<void> {\n if (!this.sessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n this.info = await this.tapes.start(this.sessionId, this.startOpts);\n }\n\n async stop(): Promise<void> {\n if (!this.info?.id) {\n return;\n }\n this.info = await this.tapes.stop(this.info.id);\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.stop();\n }\n}\n","import type { TapesManager } from './TapesManager';\nimport type { TapeEvent } from '../types/tape';\n\n/**\n * Record tool-call spans into an active tape (parity with Python ``ToolCallRecorder``).\n */\nexport class ToolCallRecorder {\n constructor(\n private readonly tapes: TapesManager,\n private readonly tapeId: string\n ) {}\n\n async event(\n kind: string,\n payload?: Record<string, any>,\n stepId?: number\n ): Promise<TapeEvent> {\n return this.tapes.appendEvent(this.tapeId, kind, {\n payload: payload || {},\n stepId,\n });\n }\n\n span(name: string, payload?: Record<string, any>): ToolCallSpan {\n return new ToolCallSpan(this, name, payload || {});\n }\n}\n\nexport class ToolCallSpan {\n private endPayload: Record<string, any> = {};\n private stepId: number | undefined;\n\n constructor(\n private readonly recorder: ToolCallRecorder,\n private readonly name: string,\n private readonly startPayload: Record<string, any>\n ) {}\n\n attach(payload: Record<string, any>): void {\n Object.assign(this.endPayload, payload);\n }\n\n async enter(): Promise<void> {\n const result = await this.recorder.event('tool_call_start', {\n name: this.name,\n ...this.startPayload,\n });\n this.stepId = result.step_id;\n }\n\n async exit(err?: unknown): Promise<void> {\n const payload: Record<string, any> = {\n name: this.name,\n ok: err === undefined || err === null,\n ...this.endPayload,\n };\n if (err) {\n payload.error = err instanceof Error ? err.message : String(err);\n }\n await this.recorder.event('tool_call_end', payload, this.stepId);\n }\n}\n","import { HTTPClient } from './HTTPClient';\nimport { BrowserManager } from './BrowserManager';\nimport { VMsManager } from './VMsManager';\nimport { SnapshotsManager } from './SnapshotsManager';\nimport { SharesManager } from './SharesManager';\nimport { CustomDomainsManager } from './CustomDomainsManager';\nimport { ComputerUseManager } from './ComputerUseManager';\nimport { APIKeysManager } from './APIKeysManager';\nimport { AuditManager } from './AuditManager';\nimport { WebhooksManager } from './WebhooksManager';\nimport { VolumesManager } from './VolumesManager';\nimport { TapesManager } from './TapesManager';\nimport { VaultsManager } from './VaultsManager';\nimport { PTYManager } from './PTYManager';\nimport { RecordingsManager } from './RecordingsManager';\nimport { CreditsManager } from './CreditsManager';\nimport { TapeContext } from './TapeContext';\nimport { ToolCallRecorder } from './ToolCallRecorder';\nimport FormData from 'form-data';\nimport {\n SessionError,\n ExecutionError,\n UnsupportedOperationError,\n AuthenticationError,\n RateLimitError,\n NetworkError,\n InstaVMError,\n BrowserSessionError,\n BrowserNavigationError,\n BrowserTimeoutError,\n BrowserInteractionError,\n ElementNotFoundError,\n} from '../errors/BaseError';\nimport { encodePathSegment } from '../utils/path';\nimport type {\n ExecuteOptions,\n ExecutionResult,\n AsyncExecutionResult,\n TaskResult,\n FileUpload,\n UploadOptions,\n UploadResult,\n UsageStats,\n DownloadOptions,\n DownloadResult,\n} from '../types/execution';\nimport type { EgressPolicy, EgressPolicyOptions } from '../types/egress';\nimport type { SSHKey } from '../types/ssh';\nimport type { CurrentUserResponse, SessionStatusResponse } from '../types/account';\nimport type { TapeStartOptions } from '../types/tape';\nimport type {\n AddVaultCredentialOptions,\n AddVaultServiceOptions,\n UpdateVaultOptions,\n VaultCatalogTemplate,\n VaultCredential,\n VaultDiscoverResponse,\n VaultRecord,\n VaultRequestLog,\n VaultService,\n} from '../types/vault';\n\nexport interface InstaVMOptions {\n baseURL?: string;\n /**\n * Timeout in milliseconds. Used for HTTP request timeout and sent to API as VM lifetime (in seconds).\n * Default: 300000 (5 minutes)\n */\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n local?: boolean;\n localURL?: string;\n /** VM memory in megabytes (optional). Range: 128-8192 MB */\n memory_mb?: number;\n /** VM vCPU count (optional). Valid values: 1, 2, 4, 6, 8 */\n cpu_count?: number;\n /** Optional user-defined metadata for filtering */\n metadata?: Record<string, any>;\n /** Optional environment variables to set in the VM */\n env?: Record<string, any>;\n /**\n * When true (default), start a cloud execution session during construction (mirrors Python).\n * Set false for management-only CLI commands.\n */\n auto_start_session?: boolean;\n}\n\n/**\n * Main InstaVM client class\n */\nexport class InstaVM {\n private httpClient: HTTPClient;\n private _sessionId: string | null = null;\n public readonly browser: BrowserManager;\n public readonly vms: VMsManager;\n public readonly snapshots: SnapshotsManager;\n public readonly shares: SharesManager;\n public readonly customDomains: CustomDomainsManager;\n public readonly computerUse: ComputerUseManager;\n public readonly apiKeys: APIKeysManager;\n public readonly audit: AuditManager;\n public readonly webhooks: WebhooksManager;\n public readonly volumes: VolumesManager;\n public readonly tapes: TapesManager;\n public readonly vaults: VaultsManager;\n public readonly pty: PTYManager;\n public readonly recordings: RecordingsManager;\n public readonly credits: CreditsManager;\n public readonly local: boolean;\n private readonly timeout: number;\n public readonly memory_mb?: number;\n public readonly cpu_count?: number;\n public readonly metadata?: Record<string, any>;\n public readonly env?: Record<string, any>;\n private _vmUsed: boolean = false;\n private readonly _autoStartSession: boolean;\n private sessionBootstrap?: Promise<string>;\n\n constructor(apiKey: string, options: InstaVMOptions = {}) {\n this.local = options.local || false;\n this.timeout = options.timeout || 300000; // 300000 milliseconds (5 minutes)\n this.memory_mb = options.memory_mb;\n this.cpu_count = options.cpu_count;\n this.metadata = options.metadata;\n this.env = options.env;\n this._autoStartSession = options.auto_start_session !== false;\n\n // In local mode, API key is optional\n if (!this.local && !apiKey) {\n throw new AuthenticationError('API key is required for cloud mode');\n }\n\n const config = {\n baseURL: this.local\n ? (options.localURL || 'http://coderunner.local:8222')\n : (options.baseURL || 'https://api.instavm.io'),\n timeout: this.timeout,\n maxRetries: options.maxRetries || 3,\n retryDelay: options.retryDelay || 1000,\n apiKey: apiKey || '',\n };\n\n this.httpClient = new HTTPClient(config);\n this.browser = new BrowserManager(this.httpClient, this.local, () => this);\n this.vms = new VMsManager(this.httpClient, this.local);\n this.snapshots = new SnapshotsManager(this.httpClient, this.local);\n this.shares = new SharesManager(this.httpClient, this.local, () => this._sessionId);\n this.customDomains = new CustomDomainsManager(this.httpClient, this.local);\n this.computerUse = new ComputerUseManager(this.httpClient, this.local);\n this.apiKeys = new APIKeysManager(this.httpClient, this.local);\n this.audit = new AuditManager(this.httpClient, this.local);\n this.webhooks = new WebhooksManager(this.httpClient, this.local);\n this.volumes = new VolumesManager(this.httpClient, this.local);\n this.tapes = new TapesManager(this.httpClient, this.local);\n this.vaults = new VaultsManager(this.httpClient, this.local);\n this.pty = new PTYManager(this.httpClient, this.local, () => this.httpClient.baseURL);\n this.recordings = new RecordingsManager(this.httpClient, this.local, () => this.httpClient.baseURL);\n this.credits = new CreditsManager(this.httpClient, this.local);\n\n if (this._autoStartSession && !this.local && apiKey) {\n this.sessionBootstrap = this.createSession();\n void this.sessionBootstrap.catch(() => undefined);\n }\n }\n\n private async awaitSessionBootstrap(): Promise<void> {\n if (this.sessionBootstrap) {\n try {\n await this.sessionBootstrap;\n } finally {\n this.sessionBootstrap = undefined;\n }\n }\n }\n\n /**\n * Ensure operation is not called in local mode\n */\n private ensureNotLocal(operationName: string): void {\n if (this.local) {\n throw new UnsupportedOperationError(\n `${operationName} is not supported in local mode. This operation is only available when using the cloud API.`\n );\n }\n }\n\n private authHeaders(): Record<string, string> {\n return { 'X-API-Key': this.httpClient.apiKey };\n }\n\n /**\n * Execute code synchronously\n *\n * @param command - Command to execute\n * @param options - Execution options\n * @param options.timeout - Request timeout in milliseconds (used for HTTP request timeout and sent to API in seconds)\n * @returns Execution result\n */\n async execute(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<ExecutionResult> {\n if (!this.local) {\n await this.awaitSessionBootstrap();\n }\n // In local mode, session_id is not required\n let sessionId = options.sessionId || this._sessionId;\n if (!this.local && !sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData: any = {\n command,\n language: options.language || 'python',\n };\n\n // Add timeout to request data if provided (convert milliseconds to seconds for API)\n if (options.timeout !== undefined) {\n requestData.timeout = Math.floor(options.timeout / 1000);\n }\n\n // Only include session_id in cloud mode\n if (!this.local && sessionId) {\n requestData.session_id = sessionId;\n }\n\n // Use custom timeout for this request, or fall back to instance default (in milliseconds)\n const requestTimeout = options.timeout !== undefined ? options.timeout : this.timeout;\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute',\n requestData,\n undefined,\n requestTimeout\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n if (!this.local) {\n this._vmUsed = true;\n }\n\n return {\n stdout: response.stdout || '',\n stderr: response.stderr || '',\n success: response.success !== false,\n executionTime: response.execution_time,\n cpuTime: response.cpu_time,\n createdAt: response.created_at,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Execute code asynchronously\n */\n async executeAsync(\n command: string,\n options: ExecuteOptions = {}\n ): Promise<AsyncExecutionResult> {\n this.ensureNotLocal('Async execution');\n await this.awaitSessionBootstrap();\n\n // Auto-create session if none exists (like Python client)\n let sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n sessionId = await this.createSession();\n }\n\n const requestData = {\n command,\n language: options.language || 'python',\n timeout: options.timeout || 15,\n session_id: sessionId,\n };\n\n try {\n const response = await this.httpClient.postExecution<any>(\n '/execute_async',\n requestData\n );\n\n // Update session ID if returned\n if (response.session_id) {\n this._sessionId = response.session_id;\n }\n\n this._vmUsed = true;\n\n return {\n taskId: response.task_id,\n status: response.status || 'pending',\n output: response.stdout || response.output,\n success: response.success,\n executionTime: response.execution_time,\n sessionId: response.session_id,\n error: response.error,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ExecutionError(\n `Async code execution failed: ${errorMessage}`,\n undefined,\n undefined,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Poll for async task result\n *\n * @param taskId - The task ID from executeAsync\n * @param pollInterval - Seconds between polls (default: 1)\n * @param timeout - Maximum seconds to wait (default: 60)\n * @returns Task result with stdout, stderr, execution time, etc.\n * @throws Error if task doesn't complete within timeout\n */\n async getTaskResult(\n taskId: string,\n pollInterval: number = 1,\n timeout: number = 60\n ): Promise<TaskResult> {\n this.ensureNotLocal('Async task result retrieval');\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout * 1000) {\n try {\n const response = await this.httpClient.get<any>(\n `/v1/executions/${taskId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n if (response.is_complete) {\n // Output is already decoded as string (not base64 despite field name)\n return {\n stdout: response.serialized_stdout || '',\n stderr: response.serialized_stderr || '',\n cpuTime: response.cpu_time,\n executionTime: response.execution_time,\n createdAt: response.created_at,\n };\n }\n\n // Wait before polling again\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n } catch (error) {\n // Don't retry on auth, rate limit, or network errors\n if (\n error instanceof AuthenticationError ||\n error instanceof RateLimitError ||\n error instanceof NetworkError\n ) {\n throw error;\n }\n\n // Continue polling on transient errors\n if (Date.now() - startTime >= timeout * 1000) {\n throw new ExecutionError(\n `Failed to get task result: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Wait before retrying\n await new Promise(resolve => setTimeout(resolve, pollInterval * 1000));\n }\n }\n\n throw new ExecutionError(`Task ${taskId} timed out after ${timeout}s`);\n }\n\n /**\n * Upload files to the execution environment\n */\n async upload(\n files: FileUpload[],\n options: UploadOptions = {}\n ): Promise<UploadResult> {\n this.ensureNotLocal('File upload');\n await this.awaitSessionBootstrap();\n\n // Require explicit session (matches Python SDK behavior)\n const sessionId = options.sessionId || this._sessionId;\n if (!sessionId) {\n throw new SessionError('Session ID not set. Please create a session first using createSession().');\n }\n\n const formData = new FormData();\n\n // Add files to form data\n for (const file of files) {\n if (Buffer.isBuffer(file.content)) {\n formData.append('files', file.content, file.name);\n } else {\n formData.append('files', Buffer.from(file.content), file.name);\n }\n\n if (file.path) {\n formData.append('paths', file.path);\n }\n }\n\n // Add options\n formData.append('session_id', sessionId);\n if (options.remotePath) {\n formData.append('remote_path', options.remotePath);\n }\n if (options.recursive !== undefined) {\n formData.append('recursive', String(options.recursive));\n }\n\n try {\n const response = await this.httpClient.postFormData<any>(\n '/upload',\n formData\n );\n\n return {\n success: response.success !== false,\n files: response.files || [],\n message: response.message,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File upload failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Create a new execution session\n */\n async createSession(): Promise<string> {\n this.ensureNotLocal('Session management');\n\n try {\n // Send API key and VM lifetime in JSON body for session creation\n // Convert timeout from milliseconds to seconds for the API\n const requestBody: Record<string, any> = {\n api_key: this.httpClient.apiKey,\n vm_lifetime_seconds: Math.floor(this.timeout / 1000),\n };\n\n if (this.memory_mb !== undefined) {\n requestBody.memory_mb = this.memory_mb;\n }\n if (this.cpu_count !== undefined) {\n requestBody.vcpu_count = this.cpu_count;\n }\n if (this.metadata !== undefined) {\n requestBody.metadata = this.metadata;\n }\n if (this.env !== undefined) {\n requestBody.env = this.env;\n }\n\n const response = await this.httpClient.post<any>(\n '/v1/sessions/session',\n requestBody\n );\n\n if (response && response.session_id) {\n this._sessionId = response.session_id;\n return response.session_id;\n }\n\n throw new SessionError('Session creation failed: No session ID returned');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Session creation failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Close a session\n * Note: Sessions auto-expire on the server side. This just clears local state.\n */\n async closeSession(sessionId?: string): Promise<void> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return; // No session to close\n }\n\n // Clear local session state\n // Sessions will auto-expire on server side, no API call needed\n if (targetSessionId === this._sessionId) {\n this._sessionId = null;\n }\n }\n\n /**\n * Check if current session is still active by checking VM status\n *\n * @returns true if session is active, false otherwise\n */\n async isSessionActive(sessionId?: string): Promise<boolean> {\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n return false;\n }\n\n try {\n const response = await this.httpClient.get<any>(\n `/v1/sessions/status/${targetSessionId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response.vm_status === 'active';\n } catch (error) {\n if (\n error instanceof SessionError ||\n error instanceof AuthenticationError ||\n error instanceof NetworkError\n ) {\n return false;\n }\n return false;\n }\n }\n\n /**\n * Get the app URL for a session\n *\n * @param sessionId - Session ID (uses current session if not provided)\n * @param port - Port to expose (1-65535, default: 80)\n */\n async getSessionAppUrl(\n sessionId?: string,\n port?: number\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Session app URL');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const params: Record<string, any> = {};\n if (port !== undefined) {\n params.port = port;\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n return this.httpClient.get<Record<string, any>>(\n `/v1/sessions/app-url/${safeSid}`,\n params,\n this.authHeaders()\n );\n }\n\n /**\n * List sandbox records with optional filtering\n *\n * @param options.metadata - JSON-serializable metadata filters\n * @param options.limit - Maximum number of results (1-1000, default: 100)\n */\n async listSandboxes(options: {\n metadata?: Record<string, any>;\n limit?: number;\n } = {}): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Sandbox listing');\n\n const params: Record<string, any> = {};\n if (options.metadata !== undefined) {\n params.metadata = JSON.stringify(options.metadata);\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n\n return this.httpClient.get<Record<string, any>[]>(\n '/v1/sessions/sandboxes',\n params,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get usage statistics for a session\n */\n async getUsage(sessionId?: string): Promise<UsageStats> {\n this.ensureNotLocal('Usage tracking');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to get usage for');\n }\n\n try {\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.get<any>(\n `/v1/sessions/usage/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n\n return {\n sessionsUsed: response.sessions_used || 0,\n executionTime: response.execution_time || 0,\n quotaRemaining: response.quota_remaining || 0,\n quotaLimit: response.quota_limit || 0,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to get usage stats: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current user profile.\n */\n async getCurrentUser(): Promise<CurrentUserResponse> {\n this.ensureNotLocal('User profile lookup');\n\n return this.httpClient.get<CurrentUserResponse>(\n '/v1/users/me',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n }\n\n /**\n * Get the current status of a session.\n */\n async getSessionStatus(sessionId?: string): Promise<SessionStatusResponse> {\n this.ensureNotLocal('Session management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n return this.httpClient.get<SessionStatusResponse>(\n `/v1/sessions/status/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n }\n\n /**\n * Get session record details from ``GET /v1/sessions/session/{session_id}`` (Python: ``get_session_info``).\n */\n async getSessionInfo(sessionId?: string): Promise<Record<string, any>> {\n this.ensureNotLocal('Session management');\n\n const sid = sessionId || this._sessionId;\n if (!sid) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n try {\n const safeSid = encodePathSegment(sid);\n const result = await this.httpClient.get<unknown>(\n `/v1/sessions/session/${safeSid}`,\n undefined,\n this.authHeaders()\n );\n if (typeof result !== 'object' || result === null) {\n throw new SessionError('Failed to get session info: non-JSON response');\n }\n return result as Record<string, any>;\n } catch (error) {\n if (error instanceof InstaVMError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(`Failed to get session info: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Day-wise usage breakdown from ``GET /v1/users/me/usage-breakdown`` (Python: ``get_usage_breakdown``).\n */\n async getUsageBreakdown(options: {\n startDate?: string;\n endDate?: string;\n days?: number;\n } = {}): Promise<Record<string, any>> {\n this.ensureNotLocal('Usage breakdown lookup');\n\n const params: Record<string, any> = { days: options.days ?? 30 };\n if (options.startDate !== undefined) {\n params.start_date = options.startDate;\n }\n if (options.endDate !== undefined) {\n params.end_date = options.endDate;\n }\n\n try {\n const result = await this.httpClient.get<unknown>(\n '/v1/users/me/usage-breakdown',\n params,\n this.authHeaders()\n );\n if (typeof result !== 'object' || result === null) {\n throw new InstaVMError('Failed to fetch usage breakdown: non-JSON response');\n }\n return result as Record<string, any>;\n } catch (error) {\n if (error instanceof InstaVMError) {\n throw error;\n }\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new InstaVMError(`Failed to fetch usage breakdown: ${errorMessage}`, { cause: error as Error });\n }\n }\n\n /**\n * Time-travel tape context manager (Python: ``tape()`` / ``TapeContext``).\n */\n tape(sessionId?: string | null, options: TapeStartOptions = {}): TapeContext {\n const sid = sessionId ?? this._sessionId ?? undefined;\n return new TapeContext(this.tapes, sid, options);\n }\n\n /** Build a tool-call recorder for an active tape id (Python: ``ToolCallRecorder``). */\n toolCallRecorder(tapeId: string): ToolCallRecorder {\n return new ToolCallRecorder(this.tapes, tapeId);\n }\n\n /**\n * @deprecated Streaming is not supported by the API; yields a single chunk from ``execute``.\n */\n async *executeStreaming(\n command: string,\n onOutput?: (chunk: string) => void\n ): AsyncGenerator<string, void, undefined> {\n // eslint-disable-next-line no-console\n console.warn(\n 'executeStreaming is deprecated. The API does not support streaming execution. Use execute() or executeAsync() instead.'\n );\n const result = await this.execute(command);\n const output = result.stdout || '';\n if (onOutput) {\n onOutput(output);\n }\n yield output;\n }\n\n // --- Vault (flat API parity with Python InstaVM) ---\n\n async listVaults(): Promise<VaultRecord[]> {\n return this.vaults.list();\n }\n\n async createVault(name: string, description?: string): Promise<VaultRecord> {\n return this.vaults.create(name, description);\n }\n\n async getVault(vaultId: string): Promise<VaultRecord> {\n return this.vaults.get(vaultId);\n }\n\n async updateVault(vaultId: string, updates: UpdateVaultOptions): Promise<VaultRecord> {\n return this.vaults.update(vaultId, updates);\n }\n\n async deleteVault(vaultId: string): Promise<Record<string, any>> {\n return this.vaults.delete(vaultId);\n }\n\n async discoverVault(vaultId: string): Promise<VaultDiscoverResponse> {\n return this.vaults.discover(vaultId);\n }\n\n async listVaultCredentials(vaultId: string): Promise<VaultCredential[]> {\n return this.vaults.listCredentials(vaultId);\n }\n\n async addVaultCredential(\n vaultId: string,\n name: string,\n value: string,\n options: AddVaultCredentialOptions = {}\n ): Promise<VaultCredential> {\n return this.vaults.addCredential(vaultId, name, value, options);\n }\n\n async rotateVaultCredential(\n vaultId: string,\n credentialId: string,\n value: string\n ): Promise<VaultCredential> {\n return this.vaults.rotateCredential(vaultId, credentialId, value);\n }\n\n async deleteVaultCredential(vaultId: string, credentialId: string): Promise<Record<string, any>> {\n return this.vaults.deleteCredential(vaultId, credentialId);\n }\n\n async listVaultServices(vaultId: string): Promise<VaultService[]> {\n return this.vaults.listServices(vaultId);\n }\n\n async addVaultService(\n vaultId: string,\n host: string,\n authConfig: Record<string, any>,\n options: AddVaultServiceOptions = {}\n ): Promise<VaultService> {\n return this.vaults.addService(vaultId, host, authConfig, options);\n }\n\n async deleteVaultService(vaultId: string, serviceId: string): Promise<Record<string, any>> {\n return this.vaults.deleteService(vaultId, serviceId);\n }\n\n async addVaultServicesFromTemplates(\n vaultId: string,\n templateIds: string[]\n ): Promise<Record<string, any>> {\n return this.vaults.addServicesFromTemplates(vaultId, templateIds);\n }\n\n async getVaultCatalog(): Promise<VaultCatalogTemplate[]> {\n return this.vaults.getCatalog();\n }\n\n async getVaultRequestLogs(vaultId: string, limit: number = 100): Promise<VaultRequestLog[]> {\n return this.vaults.getRequestLogs(vaultId, limit);\n }\n\n // --- Browser (client-level parity with Python InstaVM) ---\n\n async createBrowserSession(\n viewportWidth: number = 1920,\n viewportHeight: number = 1080,\n userAgent?: string\n ): Promise<string> {\n this.ensureNotLocal('Browser session management');\n const body: Record<string, any> = {\n viewport_width: viewportWidth,\n viewport_height: viewportHeight,\n };\n if (userAgent) {\n body.user_agent = userAgent;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/sessions/',\n body,\n this.authHeaders()\n );\n const sid = result.session_id;\n if (!sid) {\n throw new BrowserSessionError('No session ID returned from server');\n }\n return sid;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to create browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async getBrowserSession(sessionId: string): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser session management');\n const safe = encodePathSegment(sessionId);\n try {\n return await this.httpClient.get<Record<string, any>>(\n `/v1/browser/sessions/${safe}`,\n undefined,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to get browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async closeBrowserSession(sessionId: string): Promise<boolean> {\n this.ensureNotLocal('Browser session management');\n const safe = encodePathSegment(sessionId);\n try {\n await this.httpClient.delete(`/v1/browser/sessions/${safe}`, this.authHeaders());\n return true;\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n return true;\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserSessionError(`Failed to close browser session: ${msg}`, { cause: error as Error });\n }\n }\n\n async listBrowserSessions(): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Browser session management');\n const result = await this.httpClient.get<any>('/v1/browser/sessions/', undefined, this.authHeaders());\n if (Array.isArray(result)) {\n return result;\n }\n return result?.sessions || [];\n }\n\n async browserNavigate(\n url: string,\n sessionId?: string | null,\n waitTimeout: number = 30000\n ): Promise<Record<string, any>> {\n if (!this.local) {\n if (!sessionId) {\n throw new BrowserSessionError('session_id is required in cloud mode');\n }\n }\n const data: Record<string, any> = { url, wait_timeout: waitTimeout };\n if (!this.local && sessionId) {\n data.session_id = sessionId;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/navigate',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Navigation timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserNavigationError(`Failed to navigate: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserClick(\n selector: string,\n sessionId: string,\n force: boolean = false,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser click interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/click',\n { selector, session_id: sessionId, force, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Click timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to click element: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserType(\n selector: string,\n text: string,\n sessionId: string,\n delay: number = 100,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser type interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/type',\n { selector, text, session_id: sessionId, delay, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Type timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to type text: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserFill(\n selector: string,\n value: string,\n sessionId: string,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser fill interaction');\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/fill',\n { selector, value, session_id: sessionId, timeout },\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new ElementNotFoundError(`Element not found: ${selector}`, selector, { cause: error as Error });\n }\n if (status === 408) {\n throw new BrowserTimeoutError('Fill timeout', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to fill form: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserScroll(\n sessionId: string,\n selector?: string | null,\n x?: number | null,\n y?: number | null\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser scroll interaction');\n if (selector == null && x == null && y == null) {\n throw new BrowserInteractionError(\n \"At least one of 'selector', 'x', or 'y' must be provided for scrolling.\"\n );\n }\n const data: Record<string, any> = { session_id: sessionId };\n if (selector) {\n data.selector = selector;\n }\n if (x != null) {\n data.x = x;\n }\n if (y != null) {\n data.y = y;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/scroll',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to scroll: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserWait(\n condition: string,\n sessionId: string,\n selector?: string | null,\n timeout: number = 30000\n ): Promise<Record<string, any>> {\n this.ensureNotLocal('Browser wait interaction');\n const data: Record<string, any> = { condition, session_id: sessionId, timeout };\n if (selector) {\n data.selector = selector;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/wait',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 408) {\n throw new BrowserTimeoutError(`Wait timeout for condition: ${condition}`, { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to wait for condition: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserScreenshot(\n sessionId: string,\n fullPage: boolean = true,\n clip?: Record<string, any> | null,\n format: string = 'png',\n quality?: number | null\n ): Promise<string> {\n this.ensureNotLocal('Browser screenshot');\n const data: Record<string, any> = {\n session_id: sessionId,\n full_page: fullPage,\n format,\n };\n if (clip) {\n data.clip = clip;\n }\n if (quality != null) {\n data.quality = quality;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/screenshot',\n data,\n this.authHeaders()\n );\n return (result.screenshot as string) || '';\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to take screenshot: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserExtractElements(\n sessionId: string,\n selector?: string | null,\n attributes?: string[] | null\n ): Promise<Record<string, any>[]> {\n this.ensureNotLocal('Browser element extraction');\n const data: Record<string, any> = { session_id: sessionId };\n if (selector) {\n data.selector = selector;\n }\n if (attributes?.length) {\n data.attributes = attributes;\n }\n try {\n const result = await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/extract',\n data,\n this.authHeaders()\n );\n return result.elements || [];\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to extract elements: ${msg}`, { cause: error as Error });\n }\n }\n\n async browserExtractContent(\n sessionId?: string | null,\n url?: string | null,\n includeInteractive: boolean = true,\n includeAnchors: boolean = true,\n maxAnchors: number = 50\n ): Promise<Record<string, any>> {\n if (!this.local) {\n if (!sessionId) {\n throw new BrowserSessionError('session_id is required in cloud mode');\n }\n } else if (!url) {\n throw new BrowserInteractionError('url is required in local mode');\n }\n const data: Record<string, any> = {\n include_interactive: includeInteractive,\n include_anchors: includeAnchors,\n max_anchors: maxAnchors,\n };\n if (!this.local && sessionId) {\n data.session_id = sessionId;\n }\n if (this.local && url) {\n data.url = url;\n }\n try {\n return await this.httpClient.post<Record<string, any>>(\n '/v1/browser/interactions/content',\n data,\n this.authHeaders()\n );\n } catch (error) {\n const status = (error as InstaVMError).statusCode;\n if (status === 404) {\n throw new BrowserSessionError('Browser session not found or expired', { cause: error as Error });\n }\n const msg = error instanceof Error ? error.message : String(error);\n throw new BrowserInteractionError(`Failed to extract content: ${msg}`, { cause: error as Error });\n }\n }\n\n /**\n * Download a file from the remote VM\n */\n async download(\n filename: string,\n options: DownloadOptions = {}\n ): Promise<DownloadResult> {\n this.ensureNotLocal('File download');\n\n const targetSessionId = options.sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('No active session to download from');\n }\n\n try {\n // Use postFormUrlEncoded to match Python SDK behavior (sends form-urlencoded data)\n const response = await this.httpClient.postFormUrlEncoded<any>('/download', {\n filename,\n session_id: targetSessionId,\n });\n\n // Parse and decode base64 content from JSON response\n const encodedContent = response.content || '';\n const content = encodedContent\n ? Buffer.from(encodedContent, 'base64')\n : Buffer.from(response); // Fallback for backward compatibility\n\n return {\n success: true,\n filename,\n content,\n size: content.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `File download failed: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n /**\n * Get the current session ID\n */\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n /**\n * Kill the VM associated with a session\n *\n * @param sessionId - The session UUID whose VM should be killed. If not provided, uses current sessionId\n * @returns Result containing success message and killed VM ID\n */\n async kill(sessionId?: string): Promise<{ success: boolean; killed: string }> {\n this.ensureNotLocal('VM kill operation');\n\n const targetSessionId = sessionId || this._sessionId;\n\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please provide a sessionId or start a session first.');\n }\n\n try {\n const response = await this.httpClient.post<{ success: boolean; killed: string }>(\n '/kill',\n { session_id: targetSessionId },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n // Clear session_id if we killed the current session\n if (!sessionId && this._sessionId === targetSessionId) {\n this._sessionId = null;\n }\n\n return response;\n } catch (error) {\n if (error instanceof Error && 'statusCode' in error) {\n const statusCode = (error as { statusCode?: number }).statusCode;\n if (statusCode === 403) {\n throw new AuthenticationError(\"You don't own this session\", { cause: error });\n }\n if (statusCode === 404) {\n throw new SessionError(\"Session not found or no VM assigned to session (has execute() been called?)\", { cause: error });\n }\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new SessionError(\n `Failed to kill VM: ${errorMessage}`,\n { cause: error as Error }\n );\n }\n }\n\n // --- Egress Policy Methods ---\n\n /**\n * Set egress policy for a session\n */\n async setSessionEgress(\n options: EgressPolicyOptions = {},\n sessionId?: string\n ): Promise<{ status: string; sessionId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.post<any>(\n `/v1/egress/session/${safeSid}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a session\n */\n async getSessionEgress(sessionId?: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const targetSessionId = sessionId || this._sessionId;\n if (!targetSessionId) {\n throw new SessionError('Session ID not set. Please create a session first.');\n }\n\n const safeSid = encodePathSegment(targetSessionId);\n const response = await this.httpClient.get<any>(\n `/v1/egress/session/${safeSid}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n /**\n * Set egress policy for a specific VM\n */\n async setVmEgress(\n vmId: string,\n options: EgressPolicyOptions = {}\n ): Promise<{ status: string; vmId: string }> {\n this.ensureNotLocal('Egress policy management');\n\n const safeVmId = encodePathSegment(vmId);\n const response = await this.httpClient.post<any>(\n `/v1/egress/vm/${safeVmId}`,\n {\n allow_public_repos: options.allowPackageManagers ?? true,\n allow_http: options.allowHttp ?? true,\n allow_https: options.allowHttps ?? true,\n allowed_domains: options.allowedDomains ?? [],\n allowed_cidrs: options.allowedCidrs ?? [],\n },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Get egress policy for a specific VM\n */\n async getVmEgress(vmId: string): Promise<EgressPolicy> {\n this.ensureNotLocal('Egress policy management');\n\n const safeVmId = encodePathSegment(vmId);\n const response = await this.httpClient.get<any>(\n `/v1/egress/vm/${safeVmId}`,\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n allowPackageManagers: response.allow_public_repos,\n allowHttp: response.allow_http,\n allowHttps: response.allow_https,\n allowedDomains: response.allowed_domains || [],\n allowedCidrs: response.allowed_cidrs || [],\n };\n }\n\n // --- SSH Key Methods ---\n\n /**\n * Add an SSH public key\n */\n async addSshKey(publicKey: string): Promise<SSHKey> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.post<any>(\n '/v1/ssh-keys',\n { public_key: publicKey },\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return {\n id: response.id,\n fingerprint: response.fingerprint,\n keyType: response.key_type,\n comment: response.comment ?? null,\n createdAt: response.created_at,\n };\n }\n\n /**\n * List all active SSH keys\n */\n async listSshKeys(): Promise<SSHKey[]> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.get<any>(\n '/v1/ssh-keys',\n undefined,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n const keys = response.keys || [];\n return keys.map((k: any) => ({\n id: k.id,\n fingerprint: k.fingerprint,\n keyType: k.key_type,\n comment: k.comment ?? null,\n createdAt: k.created_at,\n }));\n }\n\n /**\n * Delete an SSH key by ID\n */\n async deleteSshKey(keyId: number): Promise<{ status: string }> {\n this.ensureNotLocal('SSH key management');\n\n const response = await this.httpClient.delete<any>(\n `/v1/ssh-keys/${keyId}`,\n { 'X-API-Key': this.httpClient.apiKey }\n );\n\n return response;\n }\n\n /**\n * Clean up resources\n */\n async dispose(): Promise<void> {\n if (this._sessionId && !this.local && this._vmUsed) {\n try {\n await this.kill();\n } catch (e) {\n // Ignore kill errors during disposal\n }\n } else if (this._sessionId) {\n await this.closeSession();\n }\n await this.browser.dispose();\n }\n}\n","import type { Command } from 'commander';\nimport type { InstaVM, InstaVMOptions } from '../client/InstaVM';\nimport { DEFAULT_BILLING_URL } from './config';\n\ntype CliDepsLike = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\nfunction printJson(deps: CliDepsLike, payload: unknown): void {\n deps.stdout.write(`${JSON.stringify(payload)}\\n`);\n}\n\nfunction emitBillingPortal(deps: CliDepsLike, json?: boolean): void {\n const payload = { url: DEFAULT_BILLING_URL };\n if (json) {\n printJson(deps, payload);\n } else {\n deps.stdout.write(`${DEFAULT_BILLING_URL}\\n`);\n }\n}\n\nfunction formatTable(headers: string[], rows: string[][]): string[] {\n const widths = headers.map((h) => h.length);\n const norm = rows.map((r) => r.map((c) => (c == null || c === '' ? '-' : String(c))));\n for (const row of norm) {\n row.forEach((cell, i) => {\n widths[i] = Math.max(widths[i], cell.length);\n });\n }\n const line = (cells: string[]) => ` ${cells.map((c, i) => c.padEnd(widths[i], ' ')).join(' ')}`;\n return [line(headers), ...norm.map(line)];\n}\n\ntype RequireClient = (\n options: { apiKey?: string; baseUrl?: string; sshHost?: string; json?: boolean },\n extra?: InstaVMOptions,\n) => { client: InstaVM };\n\ntype EmitOutputFn = (\n depsArg: CliDepsLike,\n options: { json?: boolean },\n payload: unknown,\n lines: string[],\n) => number;\n\ntype AddRuntimeFn = (\n command: Command,\n options?: { includeJson?: boolean; includeSshHost?: boolean },\n) => Command;\n\n/**\n * Register `billing` and nested subcommands (parity with Python CLI).\n */\nexport function registerBillingCommands(\n program: Command,\n deps: CliDepsLike,\n requireClient: RequireClient,\n emitOutput: EmitOutputFn,\n addRuntimeOptions: AddRuntimeFn,\n): void {\n const billing = program.command('billing').description('Billing portal, credit allocation, usage history, rates, trends');\n addRuntimeOptions(billing, { includeJson: true });\n billing.action((options: any) => {\n emitBillingPortal(deps, Boolean(options.json));\n });\n\n addRuntimeOptions(\n billing\n .command('portal')\n .description('Print the Stripe billing portal URL (same as bare `instavm billing`)')\n .action((options: any) => {\n emitBillingPortal(deps, Boolean(options.json));\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('status')\n .description('Show current period credit summary')\n .option('--period <period>', 'current_month | last_30_days | all', 'current_month')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const summary = await client.credits.summary(options.period);\n emitOutput(\n deps,\n options,\n summary,\n formatTable(['Field', 'Value'], Object.entries(summary).map(([k, v]) => [k, JSON.stringify(v)])),\n );\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('allocation')\n .description('Show the active credit allocation period')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const data = await client.credits.allocation();\n emitOutput(\n deps,\n options,\n data,\n formatTable(['Field', 'Value'], Object.entries(data).map(([k, v]) => [k, JSON.stringify(v)])),\n );\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('usage')\n .description('Day-wise spend breakdown (GET /v1/users/me/usage-breakdown)')\n .option('--start-date <iso>', 'ISO start date')\n .option('--end-date <iso>', 'ISO end date')\n .option('--days <n>', 'Days when no start/end (1-365)', '30')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const days = Number.parseInt(String(options.days ?? '30'), 10);\n const data = await client.getUsageBreakdown({\n startDate: options.startDate,\n endDate: options.endDate,\n days: Number.isNaN(days) ? 30 : days,\n });\n emitOutput(deps, options, data, [JSON.stringify(data, null, 2)]);\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('usage-history')\n .description('Per-event credit usage history rows')\n .option('--period <period>', 'current_month | last_30_days | all', 'current_month')\n .option('--usage-type <type>', 'Filter usage type')\n .option('--limit <n>', 'Max rows', '100')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const limit = Number.parseInt(String(options.limit ?? '100'), 10);\n const rows = await client.credits.usage(options.period, {\n usageType: options.usageType,\n limit: Number.isNaN(limit) ? 100 : limit,\n });\n if (options.json) {\n printJson(deps, { usage: rows });\n return;\n }\n const keys = rows[0] ? Object.keys(rows[0]) : ['(empty)'];\n const tableRows = rows.map((r) => keys.map((k) => String((r as Record<string, unknown>)[k] ?? '')));\n for (const line of formatTable(keys, tableRows)) {\n deps.stdout.write(`${line}\\n`);\n }\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('check')\n .description('Check whether you have enough credits for a usage type')\n .requiredOption('--usage-type <type>', 'Usage type (e.g. browser_automation)')\n .requiredOption('--required-credits <n>', 'Credits required', (v: string) => Number.parseInt(v, 10))\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const data = await client.credits.check(String(options.usageType), Number(options.requiredCredits));\n emitOutput(\n deps,\n options,\n data,\n formatTable(['Field', 'Value'], Object.entries(data).map(([k, v]) => [k, JSON.stringify(v)])),\n );\n }),\n );\n\n addRuntimeOptions(\n billing.command('rates').description('Show the rate-card').action(async (options: any) => {\n const { client } = requireClient(options);\n const data = await client.credits.rates();\n emitOutput(deps, options, data, [JSON.stringify(data, null, 2)]);\n }),\n );\n\n addRuntimeOptions(\n billing\n .command('trends')\n .description('Show usage trends over time')\n .option('--period <p>', '7d | 30d | 90d', '30d')\n .option('--granularity <g>', 'hourly | daily | weekly', 'daily')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const data = await client.credits.usageTrends(options.period, options.granularity);\n emitOutput(deps, options, data, [JSON.stringify(data, null, 2)]);\n }),\n );\n\n addRuntimeOptions(\n billing.command('forecast').description('Show usage forecasting').action(async (options: any) => {\n const { client } = requireClient(options);\n const data = await client.credits.usageForecast();\n emitOutput(deps, options, data, [JSON.stringify(data, null, 2)]);\n }),\n );\n}\n","import * as crypto from 'crypto';\nimport * as http from 'http';\nimport * as net from 'net';\nimport * as os from 'os';\nimport axios from 'axios';\nimport type { Command } from 'commander';\nimport { InstaVM } from '../client/InstaVM';\nimport { INSTAVM_JS_SDK_VERSION } from '../version';\nimport type { CLIConfig, RuntimeConfig } from './config';\n\nconst LOGIN_TIMEOUT_MS = 300_000;\n\ntype CliDepsLike = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\n/** Minimal deps for `login` — avoids a circular import of `CliDeps` from `cli.ts`. */\nexport type LoginRegisterDeps = CliDepsLike & {\n resolveRuntimeConfig: (options?: {\n apiKey?: string;\n baseURL?: string;\n sshHost?: string;\n env?: NodeJS.ProcessEnv;\n configPath?: string;\n config?: CLIConfig;\n }) => RuntimeConfig;\n updateProfileSettings: (options: {\n apiKey?: string;\n clearApiKey?: boolean;\n baseURL?: string;\n sshHost?: string;\n configPath?: string;\n }) => string;\n};\n\nfunction printLines(deps: CliDepsLike, lines: string[]): void {\n for (const line of lines) {\n deps.stdout.write(`${line}\\n`);\n }\n}\n\nfunction printErrorLines(deps: CliDepsLike, lines: string[]): void {\n for (const line of lines) {\n deps.stderr.write(`${line}\\n`);\n }\n}\n\nasync function postCliAuth(baseURL: string, pathSuffix: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n const url = `${baseURL.replace(/\\/+$/, '')}${pathSuffix}`;\n try {\n const response = await axios.post(url, payload, { timeout: 30_000, validateStatus: () => true });\n if (response.status >= 400) {\n const data = response.data as Record<string, unknown> | undefined;\n let detail: string | undefined;\n if (data && typeof data === 'object') {\n const raw = (data as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (data as { message?: unknown }).message\n ?? (data as { error?: unknown }).error;\n if (Array.isArray(raw) && raw.length) {\n detail = String(raw[0]);\n } else if (raw != null) {\n detail = String(raw);\n }\n }\n throw new Error(detail || (typeof response.data === 'string' ? response.data : '') || `HTTP ${response.status}`);\n }\n if (typeof response.data !== 'object' || response.data === null) {\n throw new Error('server returned a non-JSON response');\n }\n return response.data as Record<string, unknown>;\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('HTTP')) {\n throw e;\n }\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Login failed: ${msg}`);\n }\n}\n\nexport function registerLoginCommand(program: Command, deps: LoginRegisterDeps): void {\n program\n .command('login')\n .description('Authenticate via browser (PKCE) and store your API key locally')\n .option('--base-url <baseUrl>', 'Override the InstaVM API base URL for this command')\n .option('--ssh-host <sshHost>', 'Override the SSH gateway host for this command')\n .action(async (options: { apiKey?: string; baseUrl?: string; sshHost?: string }) => {\n const settings = deps.resolveRuntimeConfig({\n apiKey: options.apiKey,\n baseURL: options.baseUrl,\n sshHost: options.sshHost,\n });\n\n if (settings.apiKey) {\n try {\n const probe = new InstaVM(settings.apiKey, {\n baseURL: settings.baseURL,\n auto_start_session: false,\n });\n const existingUser = await probe.getCurrentUser();\n if (existingUser?.email) {\n printLines(deps, [\n `Already logged in as ${existingUser.email}. Run \\`instavm auth logout\\` first to switch accounts.`,\n ]);\n return;\n }\n } catch {\n // stale key — continue with login\n }\n }\n\n const state = crypto.randomBytes(24).toString('base64url');\n const codeVerifier = crypto.randomBytes(48).toString('base64url').slice(0, 128);\n const codeChallenge = crypto\n .createHash('sha256')\n .update(codeVerifier, 'ascii')\n .digest('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n const callbackResult: { code?: string; error?: string } = {};\n let resolveCallbackWake!: () => void;\n const callbackReceived = new Promise<void>((resolve) => {\n resolveCallbackWake = resolve;\n });\n\n let server: http.Server | undefined;\n let pairingId: string | undefined;\n let loginUrl: string | undefined;\n\n const successHtml = Buffer.from(\n '<!doctype html><html><head><meta charset=\"utf-8\"><title>InstaVM login</title></head><body style=\"font-family:sans-serif;text-align:center;padding:3rem\"><h1>Logged in to InstaVM</h1><p>You can close this tab.</p></body></html>',\n 'utf-8',\n );\n\n const failureHtml = (message: string) =>\n Buffer.from(\n `<!doctype html><html><head><meta charset=\"utf-8\"><title>InstaVM login failed</title></head><body style=\"font-family:sans-serif;text-align:center;padding:3rem\"><h1>Login failed: ${message}</h1><p>You can close this tab.</p></body></html>`,\n 'utf-8',\n );\n\n try {\n server = http.createServer((req, res) => {\n const u = new URL(req.url || '/', `http://127.0.0.1`);\n if (req.method !== 'GET' || u.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n if (callbackResult.code || callbackResult.error) {\n res.writeHead(204);\n res.end();\n return;\n }\n const receivedState = u.searchParams.get('state') || '';\n const receivedCode = u.searchParams.get('code') || '';\n if (!receivedState || receivedState !== state) {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(failureHtml('state mismatch'));\n callbackResult.error = 'state mismatch';\n resolveCallbackWake();\n return;\n }\n if (!receivedCode) {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(failureHtml('missing authorization code'));\n callbackResult.error = 'missing authorization code';\n resolveCallbackWake();\n return;\n }\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': String(successHtml.length) });\n res.end(successHtml);\n callbackResult.code = receivedCode;\n resolveCallbackWake();\n });\n\n await new Promise<void>((resolve, reject) => {\n server!.listen(0, '127.0.0.1', () => resolve());\n server!.on('error', reject);\n });\n\n const addr = server!.address() as net.AddressInfo;\n const redirectUri = `http://127.0.0.1:${addr.port}/callback`;\n\n const startResponse = await postCliAuth(settings.baseURL, '/api/cli-auth/start', {\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n redirect_uri: redirectUri,\n cli_version: INSTAVM_JS_SDK_VERSION,\n hostname: os.hostname(),\n });\n pairingId = startResponse.pairing_id as string | undefined;\n loginUrl = startResponse.login_url as string | undefined;\n if (!pairingId || !loginUrl) {\n throw new Error('server response missing pairing_id or login_url');\n }\n\n printLines(deps, ['Opening your browser to log in to InstaVM…', `If it doesn't open, visit: ${loginUrl}`]);\n try {\n const { execFile } = await import('child_process');\n const platform = process.platform;\n if (platform === 'darwin') {\n execFile('open', [loginUrl]);\n } else if (platform === 'win32') {\n execFile('cmd', ['/c', 'start', '', loginUrl]);\n } else {\n execFile('xdg-open', [loginUrl]);\n }\n } catch {\n // ignore browser launch failures\n }\n\n await Promise.race([\n callbackReceived,\n new Promise<void>((resolve) => setTimeout(resolve, LOGIN_TIMEOUT_MS)),\n ]);\n\n if (!callbackResult.code && !callbackResult.error) {\n printErrorLines(deps, ['Login timed out after 5 minutes.']);\n throw new Error('timeout');\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (!callbackResult.error && msg !== 'timeout') {\n printErrorLines(deps, [`Login failed: ${msg}`]);\n }\n throw e;\n } finally {\n try {\n server?.close();\n } catch {\n // ignore\n }\n }\n\n if (callbackResult.error) {\n printErrorLines(deps, [`Login failed: ${callbackResult.error}.`]);\n throw new Error(callbackResult.error);\n }\n const code = callbackResult.code;\n if (!code || !pairingId) {\n printErrorLines(deps, ['Login failed: no authorization code received.']);\n throw new Error('no code');\n }\n\n const exchangeResponse = await postCliAuth(settings.baseURL, '/api/cli-auth/exchange', {\n pairing_id: pairingId,\n code,\n code_verifier: codeVerifier,\n });\n\n const apiKey = exchangeResponse.api_key as string | undefined;\n const user = (exchangeResponse.user as Record<string, unknown>) || {};\n if (!apiKey) {\n throw new Error('server response missing api_key');\n }\n\n deps.updateProfileSettings({ apiKey });\n const email = (user.email as string) || 'your account';\n printLines(deps, [`Logged in as ${email} (${apiKey.slice(0, 8)}…).`]);\n });\n}\n","import { CommanderError, type Command } from 'commander';\nimport WebSocket from 'ws';\nimport type { InstaVM, InstaVMOptions } from '../client/InstaVM';\n\ntype CliDepsLike = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\ntype RequireClient = (\n options: { apiKey?: string; baseUrl?: string; sshHost?: string; json?: boolean },\n extra?: InstaVMOptions,\n) => { client: InstaVM };\n\ntype AddRuntimeFn = (\n command: Command,\n options?: { includeJson?: boolean; includeSshHost?: boolean },\n) => Command;\n\nfunction termSize(): { cols: number; rows: number } {\n return {\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n };\n}\n\nasync function relayPipe(ws: WebSocket): Promise<number> {\n let exitCode = 0;\n const onStdin = (buf: Buffer) => {\n if (ws.readyState === WebSocket.OPEN) ws.send(buf);\n };\n process.stdin.on('data', onStdin);\n\n const exitPromise = new Promise<number>((resolve) => {\n let settled = false;\n const finish = (c: number) => {\n if (settled) return;\n settled = true;\n resolve(c);\n };\n ws.on('message', (data, isBinary) => {\n if (isBinary || Buffer.isBuffer(data)) {\n const b = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer);\n process.stdout.write(b);\n } else {\n try {\n const ctrl = JSON.parse(String(data)) as { type?: string; exit_code?: number };\n if (ctrl.type === 'exit') {\n exitCode = Number(ctrl.exit_code ?? 0);\n finish(exitCode);\n }\n } catch {\n // ignore non-JSON text frames\n }\n }\n });\n ws.on('close', () => finish(exitCode));\n ws.on('error', () => finish(1));\n });\n\n const code = await exitPromise;\n process.stdin.off('data', onStdin);\n return code;\n}\n\nasync function relayInteractive(ws: WebSocket): Promise<number> {\n let exitCode = 0;\n const stdin = process.stdin;\n const wasRaw = stdin.isTTY && (stdin as NodeJS.Socket & { isRaw?: boolean }).isRaw;\n\n const onStdin = (buf: Buffer) => {\n if (ws.readyState === WebSocket.OPEN) ws.send(buf);\n };\n\n const onWinch = () => {\n const { cols, rows } = termSize();\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'resize', cols, rows }));\n }\n };\n\n if (stdin.isTTY) {\n stdin.setRawMode(true);\n }\n stdin.on('data', onStdin);\n process.on('SIGWINCH', onWinch);\n\n const exitPromise = new Promise<number>((resolve) => {\n let settled = false;\n const finish = (c: number) => {\n if (settled) return;\n settled = true;\n resolve(c);\n };\n ws.on('message', (data, isBinary) => {\n if (isBinary || Buffer.isBuffer(data)) {\n const b = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer);\n process.stdout.write(b);\n } else {\n try {\n const ctrl = JSON.parse(String(data)) as { type?: string; exit_code?: number };\n if (ctrl.type === 'exit') {\n exitCode = Number(ctrl.exit_code ?? 0);\n finish(exitCode);\n }\n } catch {\n // ignore\n }\n }\n });\n ws.on('close', () => finish(exitCode));\n ws.on('error', () => finish(1));\n });\n\n try {\n exitCode = await exitPromise;\n } finally {\n stdin.off('data', onStdin);\n process.off('SIGWINCH', onWinch);\n if (stdin.isTTY) {\n stdin.setRawMode(wasRaw ?? false);\n }\n process.stdout.write('\\n');\n }\n return exitCode;\n}\n\nexport function registerPtyCommand(\n program: Command,\n deps: CliDepsLike,\n requireClient: RequireClient,\n addRuntimeOptions: AddRuntimeFn,\n): void {\n addRuntimeOptions(\n program\n .command('pty')\n .description('Open an interactive PTY inside a VM (like docker exec -it)')\n .argument('<vmId>', 'VM ID to attach to')\n .argument('[command]', 'Shell program to run (default: backend default shell)')\n .action(async (vmId: string, command: string | undefined, options: any) => {\n const { cols, rows } = termSize();\n const { client } = requireClient(options);\n let ptyInfo: Record<string, unknown>;\n try {\n ptyInfo = (await client.pty.createForVm(vmId, {\n cols,\n rows,\n command: command || undefined,\n })) as Record<string, unknown>;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(`Error creating PTY session: ${msg}\\n`);\n process.exitCode = 1;\n return;\n }\n const ptyId = String(ptyInfo.session_id ?? ptyInfo.id ?? '');\n if (!ptyId) {\n deps.stderr.write(`Unexpected PTY response: ${JSON.stringify(ptyInfo)}\\n`);\n process.exitCode = 1;\n return;\n }\n const wsUrl = client.pty.wsUrlForVm(vmId, ptyId);\n const isTty = process.stdin.isTTY && process.stdout.isTTY;\n\n const ws = new WebSocket(wsUrl, { handshakeTimeout: 15_000 });\n\n const run = async (): Promise<number> => {\n await new Promise<void>((resolve, reject) => {\n ws.once('open', () => resolve());\n ws.once('error', reject);\n });\n if (isTty) {\n return relayInteractive(ws);\n }\n return relayPipe(ws);\n };\n\n let code = 1;\n try {\n code = await run();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n deps.stderr.write(`Connection error: ${msg}\\n`);\n code = 1;\n } finally {\n try {\n ws.close();\n } catch {\n // ignore\n }\n try {\n await client.pty.killForVm(vmId, ptyId);\n } catch {\n // ignore\n }\n }\n if (code !== 0) {\n throw new CommanderError(code, 'pty.exit', '');\n }\n }),\n { includeJson: false },\n );\n}\n","import fs from 'fs';\nimport type { Command } from 'commander';\nimport type { InstaVM, InstaVMOptions } from '../client/InstaVM';\nimport type { TapeDiffResponse, TapeEvent, TapeRecord } from '../types/tape';\n\ntype CliDepsLike = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\ntype RequireClient = (\n options: { apiKey?: string; baseUrl?: string; sshHost?: string; json?: boolean },\n extra?: InstaVMOptions,\n) => { client: InstaVM; settings: { sshHost: string } };\n\ntype EmitOutputFn = (\n depsArg: CliDepsLike,\n options: { json?: boolean },\n payload: unknown,\n lines: string[],\n) => number;\n\ntype AddRuntimeFn = (\n command: Command,\n options?: { includeJson?: boolean; includeSshHost?: boolean },\n) => Command;\n\nfunction displayValue(v: unknown): string {\n if (v == null || v === '') return '-';\n return String(v);\n}\n\nfunction formatTable(headers: string[], rows: string[][]): string[] {\n const widths = headers.map((h) => h.length);\n const norm = rows.map((r) => r.map((c) => (c == null || c === '' ? '-' : String(c))));\n for (const row of norm) {\n row.forEach((cell, i) => {\n widths[i] = Math.max(widths[i], cell.length);\n });\n }\n const line = (cells: string[]) => ` ${cells.map((c, i) => c.padEnd(widths[i], ' ')).join(' ')}`;\n return [line(headers), ...norm.map(line)];\n}\n\nfunction formatTapeList(tapes: TapeRecord[]): string[] {\n const rows = tapes.map((tape) => [\n displayValue((tape as Record<string, unknown>).id),\n displayValue((tape as Record<string, unknown>).status),\n displayValue((tape as Record<string, unknown>).session_id ?? (tape as Record<string, unknown>).sessionId),\n displayValue((tape as Record<string, unknown>).vm_id ?? (tape as Record<string, unknown>).vmId),\n String((tape as Record<string, unknown>).total_steps ?? (tape as Record<string, unknown>).totalSteps ?? 0),\n ]);\n return [`Tapes (${tapes.length})`, '', ...formatTable(['ID', 'Status', 'Session', 'VM', 'Steps'], rows)];\n}\n\nfunction formatTapeInfo(tape: TapeRecord): string[] {\n const t = tape as Record<string, unknown>;\n return [\n `Tape: ${displayValue(t.id)}`,\n `Status: ${displayValue(t.status)}`,\n `Session: ${displayValue(t.session_id ?? t.sessionId)}`,\n `VM: ${displayValue(t.vm_id ?? t.vmId)}`,\n `Steps: ${t.total_steps ?? t.totalSteps ?? 0}`,\n ];\n}\n\nfunction formatTapeEvents(events: TapeEvent[]): string[] {\n const rows = events.map((ev) => {\n const e = ev as Record<string, unknown>;\n return [String(e.step_id ?? e.stepId ?? '?'), displayValue(e.kind), JSON.stringify(e.payload ?? {})];\n });\n return [`Events (${events.length})`, '', ...formatTable(['Step', 'Kind', 'Payload'], rows)];\n}\n\nfunction formatTapeDiff(diff: TapeDiffResponse & Record<string, unknown>): string[] {\n return [\n `Tape: ${displayValue(diff.tape_id ?? diff.tapeId)}`,\n `From step: ${displayValue(diff.from_step ?? diff.fromStep)} → To: ${displayValue(diff.to_step ?? diff.toStep)}`,\n `Changed paths: ${JSON.stringify(diff.changed_paths ?? diff.changedPaths ?? [])}`,\n ];\n}\n\nconst LANE_ORDER = [\n 'tool_call_start',\n 'tool_call_end',\n 'fs_summary',\n 'http_egress',\n 'llm_call',\n 'vnc_marker',\n 'agent_log',\n 'branch',\n] as const;\n\nconst LANE_GLYPH: Record<string, string> = {\n tool_call_start: '▶',\n tool_call_end: '■',\n fs_summary: '◆',\n http_egress: '↗',\n llm_call: '✦',\n vnc_marker: '▣',\n agent_log: '·',\n branch: '⎇',\n};\n\nfunction formatTapePlay(tapeId: string, tape: TapeRecord, events: TapeEvent[], lanes: Record<string, number>, tail: number): string[] {\n const t = tape as Record<string, unknown>;\n const lines: string[] = [\n `Tape: ${displayValue(t.id) || tapeId} status=${displayValue(t.status)} steps=${t.total_steps ?? t.totalSteps ?? 0}`,\n ];\n if (Object.keys(lanes).length > 0) {\n const laneSummary = LANE_ORDER.filter((k) => lanes[k]).map((k) => `${k}=${lanes[k]}`).join(' ');\n if (laneSummary) lines.push(`Lanes: ${laneSummary}`);\n }\n lines.push('');\n if (events.length === 0) {\n lines.push('(no events)');\n return lines;\n }\n const steps = events.map((e) => Number((e as Record<string, unknown>).step_id ?? (e as Record<string, unknown>).stepId ?? 0));\n const maxStep = Math.max(...steps, 0);\n const width = Math.max(20, Math.min(80, maxStep + 2));\n for (const kind of LANE_ORDER) {\n if (!events.some((e) => (e as Record<string, unknown>).kind === kind)) continue;\n const track = Array<string>(width).fill(' ');\n for (const event of events) {\n const e = event as Record<string, unknown>;\n if (e.kind !== kind) continue;\n const step = Number(e.step_id ?? e.stepId ?? 0);\n const idx = Math.min(width - 1, Math.floor((step / Math.max(1, maxStep)) * (width - 1)));\n track[idx] = LANE_GLYPH[String(kind)] || '•';\n }\n lines.push(` ${String(kind).padEnd(16, ' ')} |${track.join('')}|`);\n }\n lines.push('');\n for (const event of events.slice(-tail)) {\n const e = event as Record<string, unknown>;\n const evp = (e.payload || {}) as Record<string, unknown>;\n let payloadPreview = '';\n if ('name' in evp) payloadPreview = ` name=${evp.name}`;\n else if ('command' in evp) payloadPreview = ` cmd=${String(evp.command).slice(0, 40)}`;\n else if ('kind' in evp) payloadPreview = ` kind=${evp.kind}`;\n const step = e.step_id ?? e.stepId;\n const stepStr =\n typeof step === 'number' ? String(step).padStart(4, ' ') : `${String(step ?? '?').padStart(4, ' ')}`;\n const glyph = LANE_GLYPH[String(e.kind)] || '•';\n lines.push(` step ${stepStr} ${glyph} ${e.kind}${payloadPreview}`);\n }\n return lines;\n}\n\nexport function registerTapeCommands(\n program: Command,\n deps: CliDepsLike,\n requireClient: RequireClient,\n emitOutput: EmitOutputFn,\n addRuntimeOptions: AddRuntimeFn,\n): void {\n const tape = program.command('tape').alias('tapes').description('Record and inspect time-travel tapes');\n\n addRuntimeOptions(\n tape\n .command('ls')\n .alias('list')\n .description('List tapes')\n .option('--session <sessionId>', 'Filter by session ID')\n .option('--vm <vmId>', 'Filter by VM ID')\n .option('--status <status>', 'Filter by status (recording, stopped, failed, expired)')\n .option('--limit <n>', 'Maximum tapes to return', '50')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const tapes = await client.tapes.list({\n sessionId: options.session,\n vmId: options.vm,\n status: options.status,\n limit: Number.parseInt(String(options.limit), 10) || 50,\n });\n const payload = { tapes };\n if (!tapes.length) {\n emitOutput(deps, options, payload, ['No tapes.']);\n return;\n }\n emitOutput(deps, options, payload, formatTapeList(tapes));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('get')\n .description('Get tape metadata')\n .argument('<tapeId>', 'Tape ID')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const rec = await client.tapes.get(tapeId);\n emitOutput(deps, options, rec, formatTapeInfo(rec));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('start')\n .description('Start recording a tape for a session')\n .argument('<sessionId>', 'Session ID')\n .option('--record-egress-content', 'Capture HTTP bodies when supported', false)\n .option('--no-record-fs', 'Disable filesystem step metadata', false)\n .option('--retention-days <days>', 'Retention period in days', '7')\n .action(async (sessionId: string, options: any) => {\n const { client } = requireClient(options);\n const rec = await client.tapes.start(sessionId, {\n recordEgressContent: Boolean(options.recordEgressContent),\n recordFs: !options.noRecordFs,\n retentionDays: Number.parseInt(String(options.retentionDays), 10) || 7,\n });\n emitOutput(deps, options, rec, formatTapeInfo(rec));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('stop')\n .description('Stop a recording tape')\n .argument('<tapeId>', 'Tape ID')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const rec = await client.tapes.stop(tapeId);\n emitOutput(deps, options, rec, formatTapeInfo(rec));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('events')\n .description('List events for a tape')\n .argument('<tapeId>', 'Tape ID')\n .option('--after-step <n>', 'Only return events after this step')\n .option('--kind <kind>', 'Event kind filter')\n .option('--limit <n>', 'Maximum events', '200')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const events = await client.tapes.events(tapeId, {\n afterStep: options.afterStep != null ? Number(options.afterStep) : undefined,\n kind: options.kind,\n limit: Number.parseInt(String(options.limit), 10) || 200,\n });\n const payload = { tape_id: tapeId, events };\n if (!events.length) {\n emitOutput(deps, options, payload, ['No tape events.']);\n return;\n }\n emitOutput(deps, options, payload, formatTapeEvents(events));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('diff')\n .description('Show metadata filesystem diff between steps')\n .argument('<tapeId>', 'Tape ID')\n .requiredOption('--from <n>', 'Starting step')\n .requiredOption('--to <n>', 'Ending step')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const fromStep = Number.parseInt(String(options.from), 10);\n const toStep = Number.parseInt(String(options.to), 10);\n const result = await client.tapes.diff(tapeId, fromStep, toStep);\n const r = result as Record<string, unknown>;\n const enriched = {\n tape_id: r.tape_id ?? r.tapeId ?? tapeId,\n from_step: r.from_step ?? r.fromStep ?? fromStep,\n to_step: r.to_step ?? r.toStep ?? toStep,\n mode: r.mode || 'metadata',\n ...result,\n };\n emitOutput(deps, options, enriched, formatTapeDiff(enriched as unknown as TapeDiffResponse & Record<string, unknown>));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('branch')\n .description('Branch a tape at a step')\n .argument('<tapeId>', 'Tape ID')\n .requiredOption('--at <n>', 'Step to branch from')\n .option('--mode <mode>', 'live | replay', 'live')\n .action(async (tapeId: string, options: any) => {\n const { client, settings } = requireClient(options);\n const atStep = Number.parseInt(String(options.at), 10);\n const result = await client.tapes.branch(tapeId, atStep, { mode: options.mode });\n const res = result as Record<string, unknown>;\n const lines = [\n `Tape: ${displayValue(res.tape_id ?? res.tapeId)}`,\n `Parent: ${displayValue(res.parent_tape_id ?? res.parentTapeId) || tapeId} @ step ${displayValue(res.parent_step_id ?? res.parentStepId) || atStep}`,\n `Status: ${displayValue(res.status)}`,\n ];\n if (res.vm_id || res.vmId) {\n lines.push(`SSH: ssh ${res.vm_id ?? res.vmId}@${settings.sshHost}`);\n }\n emitOutput(deps, options, result, lines);\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('rm')\n .alias('delete')\n .description('Delete a tape')\n .argument('<tapeId>', 'Tape ID')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const result = await client.tapes.delete(tapeId);\n emitOutput(deps, options, { tape_id: tapeId, ...result }, [`Deleted tape ${tapeId}`]);\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('play')\n .description('Print a scrubber-style timeline for a tape')\n .argument('<tapeId>', 'Tape ID')\n .option('--limit <n>', 'Maximum events to fetch', '200')\n .option('--tail <n>', 'Show this many most-recent events under the timeline', '20')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const limit = Number.parseInt(String(options.limit), 10) || 200;\n const tail = Number.parseInt(String(options.tail), 10) || 20;\n const tape = await client.tapes.get(tapeId);\n const events = await client.tapes.events(tapeId, { limit });\n let lanes: Record<string, number> = {};\n try {\n const lr = await client.tapes.lanes(tapeId);\n lanes = ((lr as Record<string, unknown>).lanes as Record<string, number>) || {};\n } catch {\n lanes = {};\n }\n const payload = { tape, events, lanes };\n emitOutput(deps, options, payload, formatTapePlay(tapeId, tape, events, lanes, tail));\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('lanes')\n .description('Show event count per lane (kind)')\n .argument('<tapeId>', 'Tape ID')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const result = await client.tapes.lanes(tapeId);\n const laneMap = ((result as Record<string, unknown>).lanes as Record<string, number>) || {};\n const lines = [`Tape: ${tapeId}`, 'Lanes:'];\n for (const [kind, count] of Object.entries(laneMap).sort((a, b) => b[1] - a[1])) {\n lines.push(` ${kind.padEnd(24, ' ')} ${count}`);\n }\n emitOutput(deps, options, result, lines.length > 2 ? lines : ['No lane data.']);\n }),\n );\n\n addRuntimeOptions(\n tape\n .command('export')\n .description(\"Export a tape's metadata + events as JSON\")\n .argument('<tapeId>', 'Tape ID')\n .option('--output <path>', 'Write the bundle to this file (otherwise prints summary)')\n .action(async (tapeId: string, options: any) => {\n const { client } = requireClient(options);\n const bundle = await client.tapes.export(tapeId);\n const b = bundle as Record<string, unknown>;\n if (options.output) {\n fs.writeFileSync(options.output, `${JSON.stringify(bundle, null, 2)}\\n`, 'utf8');\n emitOutput(deps, options, bundle, [`Exported tape ${tapeId} to ${options.output}`]);\n return;\n }\n const evs = b.events as unknown[] | undefined;\n emitOutput(deps, options, bundle, [\n `Tape: ${tapeId}`,\n `Format: ${displayValue(b.format)}`,\n `Events: ${evs?.length ?? 0}`,\n ]);\n }),\n );\n}\n","import fs from 'fs';\nimport readline from 'node:readline/promises';\nimport type { Command } from 'commander';\nimport type { InstaVM, InstaVMOptions } from '../client/InstaVM';\nimport {\n bootstrapVaultForManifest,\n discoverMatchingVaults,\n loadManifestVaultSlice,\n} from './vaultCookbook';\n\ntype CliDepsLike = {\n stdout: { write: (s: string) => void };\n stderr: { write: (s: string) => void };\n};\n\nexport type VaultCliDeps = CliDepsLike & {\n promptSecret: (prompt: string) => Promise<string>;\n readStdin: () => Promise<string>;\n};\n\ntype RequireClient = (\n options: { apiKey?: string; baseUrl?: string; sshHost?: string; json?: boolean },\n extra?: InstaVMOptions,\n) => { client: InstaVM };\n\ntype EmitOutputFn = (\n depsArg: CliDepsLike,\n options: { json?: boolean },\n payload: unknown,\n lines: string[],\n) => number;\n\ntype AddRuntimeFn = (\n command: Command,\n options?: { includeJson?: boolean; includeSshHost?: boolean },\n) => Command;\n\nfunction displayValue(v: unknown): string {\n if (v == null || v === '') return '-';\n return String(v);\n}\n\nfunction formatTable(headers: string[], rows: string[][]): string[] {\n const widths = headers.map((h) => h.length);\n const norm = rows.map((r) => r.map((c) => (c == null || c === '' ? '-' : String(c))));\n for (const row of norm) {\n row.forEach((cell, i) => {\n widths[i] = Math.max(widths[i], cell.length);\n });\n }\n const line = (cells: string[]) => ` ${cells.map((c, i) => c.padEnd(widths[i], ' ')).join(' ')}`;\n return [line(headers), ...norm.map(line)];\n}\n\nfunction formatVaultList(vaults: Array<Record<string, unknown>>): string[] {\n const rows = vaults.map((v) => [displayValue(v.id), displayValue(v.name), displayValue(v.description)]);\n return [`Vaults (${vaults.length})`, '', ...formatTable(['ID', 'Name', 'Description'], rows)];\n}\n\nfunction formatCredentialList(creds: Array<Record<string, unknown>>): string[] {\n const rows = creds.map((c) => [displayValue(c.id), displayValue(c.name), displayValue(c.credential_type ?? c.credentialType)]);\n return [`Credentials (${creds.length})`, '', ...formatTable(['ID', 'Name', 'Type'], rows)];\n}\n\nfunction formatServiceList(services: Array<Record<string, unknown>>): string[] {\n const rows = services.map((s) => [\n displayValue(s.id),\n displayValue(s.host),\n displayValue(s.enabled),\n displayValue((s.auth_config as Record<string, unknown>)?.type ?? s.authType),\n ]);\n return [`Services (${services.length})`, '', ...formatTable(['ID', 'Host', 'Enabled', 'Auth'], rows)];\n}\n\nasync function readSecretValue(\n deps: VaultCliDeps,\n opts: { value?: string; valueFile?: string },\n prompt: string,\n): Promise<string> {\n if (opts.value) return opts.value;\n if (opts.valueFile) return fs.readFileSync(opts.valueFile, 'utf8').trim();\n if (!process.stdin.isTTY) {\n return (await deps.readStdin()).trim();\n }\n return deps.promptSecret(prompt);\n}\n\nasync function promptYesNo(question: string): Promise<boolean> {\n if (!process.stdin.isTTY) return false;\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const line = (await rl.question(question)).trim().toLowerCase();\n return line === 'y' || line === 'yes';\n } finally {\n rl.close();\n }\n}\n\nexport function registerVaultCommands(\n program: Command,\n deps: VaultCliDeps,\n requireClient: RequireClient,\n emitOutput: EmitOutputFn,\n addRuntimeOptions: AddRuntimeFn,\n): void {\n const vault = program\n .command('vault')\n .aliases(['secrets', 'secret'])\n .description('Manage Secrets Vault — store API keys once, inject transparently into VMs');\n\n addRuntimeOptions(\n vault\n .command('list')\n .alias('ls')\n .description('List vaults')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const vaults = (await client.listVaults()) as Array<Record<string, unknown>>;\n const payload = { vaults };\n if (!vaults.length) {\n emitOutput(deps, options, payload, ['No vaults.']);\n return;\n }\n emitOutput(deps, options, payload, formatVaultList(vaults));\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('create')\n .description('Create a new vault')\n .argument('<name>', 'Human-friendly vault name')\n .option('--description <text>', 'Optional description')\n .action(async (name: string, options: any) => {\n const { client } = requireClient(options);\n const result = await client.createVault(name, options.description);\n const r = result as Record<string, unknown>;\n emitOutput(deps, options, result, [`Created vault ${r.id} (${r.name})`]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('get')\n .description(\"Get a vault's metadata\")\n .argument('<vaultId>', 'Vault ID')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const result = (await client.getVault(vaultId)) as Record<string, unknown>;\n const lines = [\n `ID: ${result.id}`,\n `Name: ${result.name}`,\n `Description: ${displayValue(result.description)}`,\n `Created: ${displayValue(result.created_at ?? result.createdAt)}`,\n ];\n emitOutput(deps, options, result, lines);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('update')\n .description(\"Update a vault's name/description\")\n .argument('<vaultId>', 'Vault ID')\n .option('--name <name>', 'New name')\n .option('--description <text>', 'New description')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const updates: { name?: string; description?: string } = {};\n if (options.name !== undefined) updates.name = options.name;\n if (options.description !== undefined) updates.description = options.description;\n const result = await client.updateVault(vaultId, updates);\n const r = result as Record<string, unknown>;\n emitOutput(deps, options, result, [`Updated vault ${r.id}`]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('delete')\n .alias('rm')\n .description('Delete a vault and all credentials')\n .argument('<vaultId>', 'Vault ID')\n .option('-y, --yes', 'Skip confirmation', false)\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n if (!options.yes) {\n if (!process.stdin.isTTY) {\n emitOutput(deps, options, { deleted: false }, [\n 'Refusing to delete vault: stdin is not a TTY. Re-run with --yes to confirm.',\n ]);\n return;\n }\n const ok = await promptYesNo(`Delete vault ${vaultId} and ALL its credentials? [y/N] `);\n if (!ok) {\n emitOutput(deps, options, { deleted: false }, ['Aborted.']);\n return;\n }\n }\n await client.deleteVault(vaultId);\n emitOutput(deps, options, { deleted: true, vault_id: vaultId }, [`Deleted ${vaultId}`]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('discover')\n .description('Show a safe summary of vault contents (no values)')\n .argument('<vaultId>', 'Vault ID')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const result = await client.discoverVault(vaultId);\n emitOutput(deps, options, result, [JSON.stringify(result, null, 2)]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('catalog')\n .description('List built-in service templates (openai, anthropic, stripe, …)')\n .action(async (options: any) => {\n const { client } = requireClient(options);\n const catalog = (await client.getVaultCatalog()) as Array<Record<string, unknown>>;\n const rows = catalog.map((t) => [\n displayValue(t.id),\n displayValue(t.name),\n displayValue(t.host),\n displayValue(t.auth_type ?? t.authType),\n ]);\n emitOutput(deps, options, { templates: catalog }, [\n `Service templates (${catalog.length})`,\n '',\n ...formatTable(['ID', 'Name', 'Host', 'Auth'], rows),\n ]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('logs')\n .description('Show recent request logs for a vault')\n .argument('<vaultId>', 'Vault ID')\n .option('--limit <n>', 'Max log lines', '100')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const limit = Number.parseInt(String(options.limit), 10) || 100;\n const logs = (await client.getVaultRequestLogs(vaultId, limit)) as Array<Record<string, unknown>>;\n const rows = logs.map((l) => [\n displayValue(l.timestamp ?? l.created_at ?? l.createdAt),\n displayValue(l.host),\n displayValue(l.status ?? l.status_code ?? l.statusCode),\n displayValue(l.credential_name ?? l.credential_id ?? l.credentialId),\n ]);\n emitOutput(deps, options, { logs }, [\n `Recent vault requests (${logs.length})`,\n '',\n ...formatTable(['When', 'Host', 'Status', 'Credential'], rows),\n ]);\n }),\n );\n\n addRuntimeOptions(\n vault\n .command('setup')\n .description(\n 'Walk through creating + binding a vault for a cookbook (reads instavm.yaml; same flow as deploy)',\n )\n .argument('[path]', 'Cookbook directory containing instavm.yaml', '.')\n .action(async (cookbookPath: string, options: any) => {\n let manifest;\n try {\n manifest = loadManifestVaultSlice(cookbookPath || '.');\n } catch (e) {\n throw e;\n }\n if (!manifest.vault?.hosts?.length) {\n if (options.json) {\n emitOutput(deps, options, { status: 'skipped', reason: 'manifest declares no vault hosts', slug: manifest.slug }, []);\n } else {\n deps.stdout.write(`\\`${manifest.slug}\\` declares no vault hosts; nothing to set up.\\n`);\n }\n return;\n }\n const { client } = requireClient(options);\n const progress = (m: string) => {\n if (!options.json) deps.stdout.write(` ${m}\\n`);\n };\n deps.stdout.write(\n `Setting up org vault for \\`${manifest.slug}\\` (required=${manifest.vault.required}, hosts=${manifest.vault.hosts.join(', ')})\\n`,\n );\n const plan = await discoverMatchingVaults(client, manifest, progress);\n if (!plan.unmatchedHosts.length && plan.vaultIds.length) {\n if (options.json) {\n emitOutput(deps, options, {\n status: 'already_covered',\n vault_ids: plan.vaultIds,\n host_to_vault: plan.hostToVault.map((p) => ({\n host: p.host,\n vault_id: p.vaultId,\n vault_name: p.vaultName,\n })),\n }, []);\n } else {\n deps.stdout.write(\n `Already covered: ${plan.vaultIds.length} vault(s) bind all ${manifest.vault.hosts.length} declared host(s). Nothing to do.\\n`,\n );\n }\n return;\n }\n const missing = plan.unmatchedHosts.length ? plan.unmatchedHosts : [...manifest.vault.hosts];\n try {\n const vaultIds = await bootstrapVaultForManifest(client, manifest, {\n missingHosts: missing,\n matchedPairs: plan.hostToVault,\n progress,\n promptSecret: deps.promptSecret,\n });\n if (options.json) {\n emitOutput(deps, options, { status: 'ok', vault_ids: vaultIds }, []);\n } else {\n deps.stdout.write(`Vault setup complete. Bound vault IDs: ${vaultIds.join(', ')}\\n`);\n deps.stdout.write(`Run \\`instavm deploy ${cookbookPath || '.'}\\` to spin up the VM with these vaults attached.\\n`);\n }\n } catch (e) {\n throw e;\n }\n }),\n { includeJson: true },\n );\n\n const secret = vault.command('secret').description('Manage credentials inside a vault');\n\n addRuntimeOptions(\n secret\n .command('list')\n .alias('ls')\n .description('List credentials in a vault (no values)')\n .argument('<vaultId>', 'Vault ID')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const creds = (await client.listVaultCredentials(vaultId)) as Array<Record<string, unknown>>;\n const payload = { credentials: creds };\n if (!creds.length) {\n emitOutput(deps, options, payload, ['No credentials in this vault.']);\n return;\n }\n emitOutput(deps, options, payload, formatCredentialList(creds));\n }),\n );\n\n addRuntimeOptions(\n secret\n .command('set')\n .description('Add a credential (value from --value, --value-file, stdin, or prompt)')\n .argument('<vaultId>', 'Vault ID')\n .argument('<name>', 'Logical credential name')\n .option('--value <text>', 'Plaintext value (avoid on shared machines)')\n .option('--value-file <path>', 'File containing the secret value')\n .option('--description <text>', 'Description')\n .option('--type <type>', 'Credential type', 'api_key')\n .action(async (vaultId: string, name: string, options: any) => {\n const { client } = requireClient(options);\n const value = await readSecretValue(deps, options, `Value for ${name}: `);\n if (!value) {\n throw new Error('Secret value is required');\n }\n const result = await client.addVaultCredential(vaultId, name, value, {\n description: options.description,\n credentialType: options.type,\n });\n const r = result as Record<string, unknown>;\n emitOutput(deps, options, result, [`Stored ${name} → id=${r.id} (value not echoed)`]);\n }),\n );\n\n addRuntimeOptions(\n secret\n .command('rotate')\n .description(\"Replace a credential's value (same name, same id)\")\n .argument('<vaultId>', 'Vault ID')\n .argument('<credentialId>', 'Credential ID')\n .option('--value <text>', 'New value')\n .option('--value-file <path>', 'File containing the new value')\n .action(async (vaultId: string, credentialId: string, options: any) => {\n const { client } = requireClient(options);\n const value = await readSecretValue(deps, options, 'New value: ');\n if (!value) {\n throw new Error('New secret value is required');\n }\n const result = await client.rotateVaultCredential(vaultId, credentialId, value);\n emitOutput(deps, options, result, [`Rotated ${credentialId}`]);\n }),\n );\n\n addRuntimeOptions(\n secret\n .command('delete')\n .alias('rm')\n .description('Delete a credential')\n .argument('<vaultId>', 'Vault ID')\n .argument('<credentialId>', 'Credential ID')\n .option('-y, --yes', 'Skip confirmation', false)\n .action(async (vaultId: string, credentialId: string, options: any) => {\n const { client } = requireClient(options);\n if (!options.yes) {\n if (!process.stdin.isTTY) {\n emitOutput(deps, options, { deleted: false }, [\n 'Refusing to delete credential: stdin is not a TTY. Re-run with --yes to confirm.',\n ]);\n return;\n }\n const ok = await promptYesNo(`Delete credential ${credentialId}? [y/N] `);\n if (!ok) {\n emitOutput(deps, options, { deleted: false }, ['Aborted.']);\n return;\n }\n }\n await client.deleteVaultCredential(vaultId, credentialId);\n emitOutput(deps, options, { deleted: true }, [`Deleted ${credentialId}`]);\n }),\n );\n\n const service = vault.command('service').description('Bind a vault credential to an upstream service host');\n\n addRuntimeOptions(\n service\n .command('list')\n .alias('ls')\n .description('List service bindings on a vault')\n .argument('<vaultId>', 'Vault ID')\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n const services = (await client.listVaultServices(vaultId)) as Array<Record<string, unknown>>;\n const payload = { services };\n if (!services.length) {\n emitOutput(deps, options, payload, ['No services bound.']);\n return;\n }\n emitOutput(deps, options, payload, formatServiceList(services));\n }),\n );\n\n addRuntimeOptions(\n service\n .command('add')\n .description('Bind a service host to a credential')\n .argument('<vaultId>', 'Vault ID')\n .option('--template <id>', 'Built-in template id (mutually exclusive with --host)')\n .option('--host <hostname>', 'Upstream hostname, e.g. api.openai.com')\n .option('--auth-type <type>', 'bearer | header', 'bearer')\n .option('--header <name>', 'Header name when --auth-type=header')\n .option('--credential <name>', 'Credential name (must exist in the vault)')\n .option('--description <text>', 'Description')\n .option('--disabled', 'Create binding in disabled state', false)\n .action(async (vaultId: string, options: any) => {\n const { client } = requireClient(options);\n if (options.template) {\n const result = await client.addVaultServicesFromTemplates(vaultId, [options.template]);\n emitOutput(deps, options, result, [`Bound template '${options.template}' to vault ${vaultId}`]);\n return;\n }\n if (!options.host || !options.authType) {\n throw new Error('--host and --auth-type are required when --template is not given');\n }\n const authType = options.authType as string;\n let authConfig: Record<string, unknown>;\n if (authType === 'bearer') {\n if (!options.credential) {\n throw new Error('--credential is required for bearer auth');\n }\n authConfig = { type: 'bearer', token: options.credential };\n } else if (authType === 'header') {\n if (!options.header || !options.credential) {\n throw new Error('--header and --credential are required for header auth');\n }\n authConfig = { type: 'header', header: options.header, key: options.credential };\n } else {\n throw new Error(`Unsupported --auth-type ${JSON.stringify(authType)}`);\n }\n const result = await client.addVaultService(vaultId, options.host, authConfig, {\n description: options.description,\n enabled: !options.disabled,\n });\n const r = result as Record<string, unknown>;\n emitOutput(deps, options, result, [`Bound ${options.host} → id=${r.id}`]);\n }),\n );\n\n addRuntimeOptions(\n service\n .command('remove')\n .alias('rm')\n .description('Remove a service binding')\n .argument('<vaultId>', 'Vault ID')\n .argument('<serviceId>', 'Service ID')\n .action(async (vaultId: string, serviceId: string, options: any) => {\n const { client } = requireClient(options);\n await client.deleteVaultService(vaultId, serviceId);\n emitOutput(deps, options, { deleted: true }, [`Removed ${serviceId}`]);\n }),\n );\n}\n","/**\n * Zero-config project detection for `instavm deploy`.\n *\n * Inspects a local directory and infers runtime, package manager,\n * install/build/start commands, port, health-check path, and required secrets\n * so the deploy pipeline can work without an `instavm.yaml`.\n *\n * Detection heuristics inspired by Railpack (MIT License):\n * https://github.com/railwayapp/railpack\n */\nimport fs from 'fs';\nimport path from 'path';\nimport type { CookbookManifest } from './cookbook';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DeployPlan {\n slug: string;\n runtime: 'node' | 'python' | 'static' | 'go' | 'deno';\n packageManager: string;\n installCommand: string;\n buildCommand: string | null;\n startCommand: string;\n port: number;\n healthPath: string;\n secrets: Array<{ name: string; prompt: string; env_name: string; required: boolean }>;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst NON_SECRET_VARS = new Set([\n 'PORT', 'HOST', 'NODE_ENV', 'DEBUG', 'PYTHONPATH', 'PATH', 'HOME',\n 'HOSTNAME', 'LANG', 'TZ', 'TERM', 'CI', 'VIRTUAL_ENV', 'PWD', 'SHELL',\n 'USER', 'LOGNAME', 'TMPDIR', 'PYTHONDONTWRITEBYTECODE', 'PYTHONUNBUFFERED',\n 'NPM_CONFIG_LOGLEVEL', 'NEXT_TELEMETRY_DISABLED',\n // Model/config env vars that typically have defaults in source\n 'OPENAI_MODEL', 'GOOGLE_MODEL', 'ANTHROPIC_MODEL',\n 'OPENAI_COMPAT_API_BASE', 'OPENAI_COMPAT_MODEL',\n]);\n\nconst DEP_SECRET_HINTS: Record<string, [string, string]> = {\n // Python\n 'anthropic': ['ANTHROPIC_API_KEY', 'Anthropic API key'],\n 'openai-agents': ['OPENAI_API_KEY', 'OpenAI API key'],\n 'openai': ['OPENAI_API_KEY', 'OpenAI API key'],\n 'google-adk': ['GOOGLE_API_KEY', 'Google API key'],\n 'google-generativeai': ['GOOGLE_API_KEY', 'Google API key'],\n 'replicate': ['REPLICATE_API_TOKEN', 'Replicate API token'],\n // Node\n '@anthropic-ai/claude-agent-sdk': ['ANTHROPIC_API_KEY', 'Anthropic API key'],\n '@anthropic-ai/sdk': ['ANTHROPIC_API_KEY', 'Anthropic API key'],\n '@openai/agents': ['OPENAI_API_KEY', 'OpenAI API key'],\n '@ai-sdk/anthropic': ['ANTHROPIC_API_KEY', 'Anthropic API key'],\n '@ai-sdk/openai': ['OPENAI_API_KEY', 'OpenAI API key'],\n '@ai-sdk/google': ['GOOGLE_API_KEY', 'Google API key'],\n};\n\nconst PYTHON_APP_CANDIDATES = ['app.py', 'main.py', 'server.py', 'bot.py', 'start.py', 'src/app.py', 'src/main.py'];\n\nconst NODE_SOURCE_CANDIDATES = [\n 'server.mjs', 'server.js', 'server.ts', 'index.js', 'index.ts',\n 'src/index.ts', 'src/index.js', 'src/server.ts', 'src/server.js',\n 'server/server.ts', 'server/server.js',\n];\n\nconst GO_SOURCE_CANDIDATES = ['main.go', 'server.go', 'app.go', 'cmd/server/main.go', 'cmd/main.go'];\n\nconst DENO_MAIN_CANDIDATES = ['main.ts', 'main.js', 'main.mjs', 'main.mts', 'server.ts', 'server.js', 'app.ts', 'app.js'];\n\nconst STATIC_ROOT_CANDIDATES = ['public', 'dist', 'build'];\n\nconst HEALTH_ROUTE_RE = /(?:@app\\.(?:get|route)|app\\.get|router\\.get)\\s*\\(\\s*['\"](\\/(health|healthz|api\\/health))['\"]\\s*/;\nconst GO_HEALTH_RE = /(?:HandleFunc|Handle)\\s*\\(\\s*['\"](\\/(health|healthz|api\\/health))['\"]/;\nconst GO_PORT_RE = /ListenAndServe\\s*\\(\\s*[\"']:(\\d{2,5})[\"']/;\nconst PORT_PATTERN_RE = /PORT\\s*(?:\\|\\||===?\\s*undefined\\s*\\?\\s*|\\?\\?)\\s*['\"]?(\\d{2,5})['\"]?/;\nconst PYTHON_PORT_PATTERNS = [\n /os\\.(?:getenv|environ\\.get)\\s*\\(\\s*['\"]PORT['\"]\\s*,\\s*['\"]?(\\d{2,5})['\"]?\\s*\\)/,\n /runserver\\s+0\\.0\\.0\\.0:(\\d{2,5})/,\n /--server\\.port\\s+(\\d{2,5})/,\n /--port\\s+(\\d{2,5})/,\n];\nconst PYTHON_ENV_RE = /os\\.(?:environ\\s*(?:\\.get\\s*\\(|(?:\\[)))\\s*['\"]([\\w]+)['\"]|os\\.getenv\\s*\\(\\s*['\"]([\\w]+)['\"]/g;\nconst NODE_ENV_RE = /process\\.env\\.([\\w]+)/g;\nconst GO_ENV_RE = /os\\.(?:Getenv|LookupEnv)\\s*\\(\\s*[\"'](\\w+)[\"']\\)/g;\nconst DENO_ENV_RE = /Deno\\.env\\.get\\s*\\(\\s*[\"'](\\w+)[\"']\\)/g;\nconst DJANGO_WSGI_RE = /WSGI_APPLICATION\\s*=\\s*[\"']([A-Za-z_][\\w.]*)\\.application[\"']/;\n\nconst NVM_SETUP_PREFIX =\n 'export NVM_DIR=\"$HOME/.nvm\" && ' +\n 'if [ ! -s \"$NVM_DIR/nvm.sh\" ]; then ' +\n 'curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash; ' +\n 'fi && ' +\n '. \"$NVM_DIR/nvm.sh\" && ' +\n 'nvm install {NODE_VERSION} && ' +\n 'nvm use {NODE_VERSION} && ';\n\nconst NVM_RUN_PREFIX =\n 'export NVM_DIR=\"$HOME/.nvm\" && ' +\n '. \"$NVM_DIR/nvm.sh\" && ' +\n 'nvm use {NODE_VERSION} >/dev/null && ';\n\nconst COREPACK_ENABLE_PREFIX = 'corepack enable >/dev/null 2>&1 && ';\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\"'\\\"'`)}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function detectProject(projectPath: string): DeployPlan {\n const resolved = path.resolve(projectPath);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\n throw new Error(`Not a directory: ${resolved}`);\n }\n\n // 1. Node.js\n if (fs.existsSync(path.join(resolved, 'package.json'))) {\n return detectNode(resolved);\n }\n\n // 2. Python\n if (\n fs.existsSync(path.join(resolved, 'requirements.txt')) ||\n fs.existsSync(path.join(resolved, 'pyproject.toml')) ||\n fs.existsSync(path.join(resolved, 'Pipfile'))\n ) {\n return detectPython(resolved);\n }\n\n // 3. Go\n if (\n fs.existsSync(path.join(resolved, 'go.mod')) ||\n fs.existsSync(path.join(resolved, 'main.go'))\n ) {\n return detectGo(resolved);\n }\n\n // 4. Deno\n if (\n fs.existsSync(path.join(resolved, 'deno.json')) ||\n fs.existsSync(path.join(resolved, 'deno.jsonc'))\n ) {\n return detectDeno(resolved);\n }\n\n // 5. Static site (fallback)\n if (hasStaticSignals(resolved)) {\n return detectStatic(resolved);\n }\n\n throw new Error(\n 'Could not detect project type. ' +\n 'Expected package.json, requirements.txt, pyproject.toml, Pipfile, ' +\n 'go.mod, deno.json, or index.html.',\n );\n}\n\nexport function planToManifest(plan: DeployPlan, projectPath: string): CookbookManifest {\n let setupCommand = plan.installCommand;\n if (plan.buildCommand) {\n setupCommand += ` && ${plan.buildCommand}`;\n }\n let startCommand = plan.startCommand;\n\n if (plan.runtime === 'node') {\n const nodeVersion = detectNodeVersion(projectPath);\n setupCommand = NVM_SETUP_PREFIX.replace(/\\{NODE_VERSION\\}/g, nodeVersion) + setupCommand;\n startCommand = NVM_RUN_PREFIX.replace(/\\{NODE_VERSION\\}/g, nodeVersion) + startCommand;\n }\n\n return {\n path: path.resolve(projectPath),\n schema_version: 1,\n slug: plan.slug,\n title: plan.slug,\n version: '0.0.0',\n summary: '',\n category: 'deploy',\n runtime: plan.runtime,\n deploy: { kind: 'upload_and_run' },\n vm: {\n memory_mb: 2048,\n vcpu_count: 2,\n timeout_seconds: 3600,\n },\n app: {\n port: plan.port,\n healthcheck_path: plan.healthPath,\n share_public_default: true,\n readiness_timeout_seconds: 120,\n },\n run: {\n workdir: '.',\n start_command: startCommand,\n },\n secrets: plan.secrets,\n post_deploy_notes: [],\n source: {\n include: ['*'],\n exclude: plan.runtime === 'static' ? [] : ['dist', 'dist/*', 'build', 'build/*'],\n setup_command: setupCommand,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Node.js detection\n// ---------------------------------------------------------------------------\n\nfunction detectNode(projectPath: string): DeployPlan {\n const pkgPath = path.join(projectPath, 'package.json');\n let pkg: any;\n try {\n pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n } catch (err) {\n throw new Error(`Cannot read package.json: ${err}`);\n }\n\n const pm = detectNodePm(projectPath, pkg);\n const scripts = pkg.scripts || {};\n const deps = readNodeDeps(pkg);\n\n // Install command\n let installCommand: string;\n if (pm === 'npm' && fs.existsSync(path.join(projectPath, 'package-lock.json'))) {\n installCommand = 'npm ci';\n } else if (pm === 'yarn') {\n installCommand = wrapNodePmCommand(pm, isYarnBerry(projectPath, pkg) ? 'yarn install --check-cache' : 'yarn install --frozen-lockfile');\n } else if (pm === 'pnpm') {\n installCommand = wrapNodePmCommand(pm, 'pnpm install');\n } else {\n installCommand = `${pm} install`;\n }\n\n // Build command\n let buildCommand: string | null = null;\n if (scripts.build) {\n buildCommand = wrapNodePmCommand(pm, `${pm} run build`);\n }\n\n // Start command\n let startCommand: string | null = null;\n if (scripts.start) {\n startCommand = wrapNodePmCommand(pm, `${pm} start`);\n } else if (scripts.serve) {\n startCommand = wrapNodePmCommand(pm, `${pm} run serve`);\n } else if (pkg.main) {\n startCommand = `node ${shellQuote(String(pkg.main))}`;\n }\n\n if (!startCommand) {\n throw new Error(\n \"Could not detect start command. \" +\n \"Add a 'start' script to package.json or use --start-command.\",\n );\n }\n\n // Port\n let port = detectPortFromStartScript(scripts.start || '');\n if (port == null) {\n port = detectPortFromSource(projectPath, NODE_SOURCE_CANDIDATES);\n }\n if (port == null) {\n port = 3000;\n }\n\n return {\n slug: slugify(pkg.name || path.basename(projectPath)),\n runtime: 'node',\n packageManager: pm,\n installCommand,\n buildCommand,\n startCommand,\n port,\n healthPath: detectHealthPath(projectPath),\n secrets: collectSecrets(projectPath, deps, 'node'),\n };\n}\n\nexport function detectNodePm(projectPath: string, pkg: any): string {\n // Priority 1: packageManager field in package.json\n const pmField = String(pkg?.packageManager || '').trim();\n if (pmField) {\n const pmName = pmField.split('@')[0].trim().toLowerCase();\n if (['pnpm', 'yarn', 'bun', 'npm'].includes(pmName)) return pmName;\n }\n\n // Priority 2: Lockfiles\n if (fs.existsSync(path.join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fs.existsSync(path.join(projectPath, 'yarn.lock'))) return 'yarn';\n if (\n fs.existsSync(path.join(projectPath, 'bun.lockb')) ||\n fs.existsSync(path.join(projectPath, 'bun.lock'))\n ) return 'bun';\n return 'npm';\n}\n\nexport function isYarnBerry(projectPath: string, pkg: any): boolean {\n const pmField = String(pkg?.packageManager || '').trim();\n if (pmField.toLowerCase().startsWith('yarn@')) {\n const versionPart = pmField.split('@')[1].split('+')[0]; // strip SHA\n const major = versionPart.split('.')[0];\n if (/^\\d+$/.test(major) && parseInt(major, 10) >= 2) return true;\n }\n if (\n fs.existsSync(path.join(projectPath, '.yarnrc.yml')) ||\n fs.existsSync(path.join(projectPath, '.yarnrc.yaml'))\n ) return true;\n return false;\n}\n\nfunction wrapNodePmCommand(pm: string, command: string): string {\n if (pm === 'yarn' || pm === 'pnpm') {\n return `${COREPACK_ENABLE_PREFIX}${command}`;\n }\n return command;\n}\n\nfunction readNodeDeps(pkg: any): string[] {\n const deps: string[] = [];\n for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {\n if (pkg[section]) {\n deps.push(...Object.keys(pkg[section]));\n }\n }\n return deps;\n}\n\nfunction detectNodeVersion(projectPath: string): string {\n const pkgPath = path.join(projectPath, 'package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n const nodeConstraint = pkg?.engines?.node || '';\n const m = nodeConstraint.match(/(\\d+)/);\n if (m) return m[1];\n } catch {\n // ignore\n }\n return '22';\n}\n\n// ---------------------------------------------------------------------------\n// Python detection\n// ---------------------------------------------------------------------------\n\nfunction detectPython(projectPath: string): DeployPlan {\n const deps = readPythonDeps(projectPath);\n const pm = detectPythonPm(projectPath);\n\n // Install command\n let installCommand: string;\n if (pm === 'poetry') {\n installCommand = 'poetry install';\n } else if (pm === 'uv') {\n installCommand = 'uv sync';\n } else if (pm === 'pdm') {\n installCommand = 'pdm install';\n } else if (pm === 'pipenv') {\n installCommand = fs.existsSync(path.join(projectPath, 'Pipfile.lock'))\n ? 'pipenv install --deploy'\n : 'pipenv install';\n } else if (fs.existsSync(path.join(projectPath, 'requirements.txt'))) {\n installCommand = 'pip install -r requirements.txt';\n } else {\n installCommand = 'pip install .';\n }\n\n // Detect framework and start command\n const depNamesLower = new Set(\n deps.map((d) => d.toLowerCase().split('==')[0].split('>=')[0].split('[')[0].trim()),\n );\n const appModule = findPythonAppModule(projectPath);\n let startCommand: string | null = null;\n const port = detectPythonPort(projectPath);\n\n // Django detection: manage.py + django in deps\n if (depNamesLower.has('django') && fs.existsSync(path.join(projectPath, 'manage.py'))) {\n const wsgiModule = findDjangoWsgi(projectPath);\n if (depNamesLower.has('gunicorn')) {\n startCommand = `python manage.py migrate && gunicorn ${wsgiModule}:application -b 0.0.0.0:${port}`;\n } else {\n startCommand = `python manage.py migrate && python manage.py runserver 0.0.0.0:${port}`;\n }\n } else if (depNamesLower.has('uvicorn') || depNamesLower.has('python-fasthtml') || depNamesLower.has('fasthtml')) {\n startCommand = `python -m uvicorn ${appModule}:app --host 0.0.0.0 --port ${port}`;\n } else if (depNamesLower.has('gunicorn')) {\n startCommand = `gunicorn ${appModule}:app -b 0.0.0.0:${port}`;\n } else if (depNamesLower.has('flask')) {\n startCommand = `python -m flask run --host 0.0.0.0 --port ${port}`;\n } else if (depNamesLower.has('streamlit')) {\n const entry = findStreamlitEntry(projectPath);\n startCommand = `python -m streamlit run ${entry} --server.port ${port} --server.address 0.0.0.0`;\n }\n\n if (!startCommand) {\n throw new Error(\n 'Could not detect start command. ' +\n 'No django, uvicorn, gunicorn, flask, fasthtml, or streamlit found in dependencies. ' +\n 'Use --start-command to specify how to start the app.',\n );\n }\n\n return {\n slug: slugify(path.basename(projectPath)),\n runtime: 'python',\n packageManager: pm,\n installCommand,\n buildCommand: null,\n startCommand,\n port,\n healthPath: detectHealthPath(projectPath),\n secrets: collectSecrets(projectPath, [...depNamesLower], 'python'),\n };\n}\n\nfunction detectPythonPm(projectPath: string): string {\n if (fs.existsSync(path.join(projectPath, 'uv.lock'))) return 'uv';\n if (fs.existsSync(path.join(projectPath, 'pdm.lock'))) return 'pdm';\n const pyprojectPath = path.join(projectPath, 'pyproject.toml');\n if (fs.existsSync(pyprojectPath)) {\n try {\n const text = fs.readFileSync(pyprojectPath, 'utf-8');\n if (text.includes('[tool.uv]')) return 'uv';\n if (text.includes('[tool.poetry]')) return 'poetry';\n } catch {\n // ignore\n }\n }\n if (\n fs.existsSync(path.join(projectPath, 'Pipfile')) ||\n fs.existsSync(path.join(projectPath, 'Pipfile.lock'))\n ) return 'pipenv';\n return 'pip';\n}\n\nfunction readPythonDeps(projectPath: string): string[] {\n const reqPath = path.join(projectPath, 'requirements.txt');\n if (fs.existsSync(reqPath)) {\n try {\n const lines = fs.readFileSync(reqPath, 'utf-8').split('\\n');\n const deps = lines\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('#'));\n if (deps.length > 0) return deps;\n } catch {\n // fall through\n }\n }\n const pyprojectPath = path.join(projectPath, 'pyproject.toml');\n if (fs.existsSync(pyprojectPath)) {\n try {\n const text = fs.readFileSync(pyprojectPath, 'utf-8');\n return parsePyprojectDeps(text);\n } catch {\n // ignore\n }\n }\n // Fall back to Pipfile\n const pipfilePath = path.join(projectPath, 'Pipfile');\n if (fs.existsSync(pipfilePath)) {\n return parsePipfileDeps(pipfilePath);\n }\n return [];\n}\n\nfunction parsePyprojectDeps(text: string): string[] {\n const deps: string[] = [];\n // PEP 621: dependencies = [\"fastapi>=0.128\", \"uvicorn>=0.39\"]\n const inlineMatch = text.match(/(?<![a-z-])dependencies\\s*=\\s*\\[([^\\]]*)\\]/);\n if (inlineMatch) {\n for (const item of inlineMatch[1].split(',')) {\n const cleaned = item.trim().replace(/^[\"']|[\"']$/g, '').trim();\n if (cleaned) deps.push(cleaned);\n }\n }\n // Poetry: [tool.poetry.dependencies]\n const lines = text.split('\\n');\n let inPoetryDeps = false;\n for (const line of lines) {\n const stripped = line.trim();\n if (stripped === '[tool.poetry.dependencies]') {\n inPoetryDeps = true;\n continue;\n }\n if (inPoetryDeps) {\n if (stripped.startsWith('[')) break;\n if (stripped.includes('=') && !stripped.startsWith('#')) {\n const key = stripped.split('=')[0].trim();\n if (key && key !== 'python') deps.push(key);\n }\n }\n }\n return deps;\n}\n\nfunction parsePipfileDeps(pipfilePath: string): string[] {\n const deps: string[] = [];\n let inPackages = false;\n try {\n const text = fs.readFileSync(pipfilePath, 'utf-8');\n for (const line of text.split('\\n')) {\n const stripped = line.trim();\n if (stripped === '[packages]') {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n if (stripped.startsWith('[')) break;\n if (stripped.includes('=') && !stripped.startsWith('#')) {\n const key = stripped.split('=')[0].trim();\n if (key) deps.push(key);\n }\n }\n }\n } catch {\n // ignore\n }\n return deps;\n}\n\nfunction findPythonAppModule(projectPath: string): string {\n for (const candidate of PYTHON_APP_CANDIDATES) {\n if (fs.existsSync(path.join(projectPath, candidate))) {\n return candidate.replace(/\\//g, '.').replace(/\\.py$/, '');\n }\n }\n return 'app';\n}\n\nfunction findStreamlitEntry(projectPath: string): string {\n for (const name of ['app.py', 'main.py', 'streamlit_app.py']) {\n if (fs.existsSync(path.join(projectPath, name))) return name;\n }\n return 'app.py';\n}\n\nfunction findDjangoWsgi(projectPath: string): string {\n // Scan for settings.py files with WSGI_APPLICATION\n const entries = fs.readdirSync(projectPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const settingsPath = path.join(projectPath, entry.name, 'settings.py');\n if (fs.existsSync(settingsPath)) {\n try {\n const text = fs.readFileSync(settingsPath, 'utf-8');\n const m = text.match(DJANGO_WSGI_RE);\n if (m) return m[1];\n } catch {\n continue;\n }\n }\n }\n }\n // Fallback: use project directory name\n return `${path.basename(projectPath)}.wsgi`;\n}\n\n// ---------------------------------------------------------------------------\n// Go detection\n// ---------------------------------------------------------------------------\n\nfunction detectGo(projectPath: string): DeployPlan {\n // Determine build target\n let buildTarget = '.';\n const rootGoFiles = fs.readdirSync(projectPath).filter((f) => f.endsWith('.go'));\n if (rootGoFiles.length > 0) {\n buildTarget = '.';\n } else {\n const cmdDir = path.join(projectPath, 'cmd');\n if (fs.existsSync(cmdDir) && fs.statSync(cmdDir).isDirectory()) {\n const subdirs = fs.readdirSync(cmdDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort();\n if (subdirs.length > 0) {\n buildTarget = `./cmd/${subdirs[0]}`;\n }\n }\n }\n\n const goVersion = detectGoVersion(projectPath);\n const buildCommand =\n 'export GOROOT=\"$HOME/.local/go\" && export PATH=\"$GOROOT/bin:$PATH\" && ' +\n `CGO_ENABLED=0 go build -ldflags='-w -s' -o app ${buildTarget}`;\n const installCommand =\n `GO_VERSION=\"${goVersion}\" && ` +\n 'case \"$GO_VERSION\" in *.*.*) ;; *) GO_VERSION=\"$GO_VERSION.0\" ;; esac && ' +\n 'export GOROOT=\"$HOME/.local/go\" && export PATH=\"$GOROOT/bin:$PATH\" && ' +\n 'if [ ! -x \"$GOROOT/bin/go\" ] || ! \"$GOROOT/bin/go\" version | grep -q \"go$GO_VERSION\"; then ' +\n 'rm -rf \"$GOROOT\" && mkdir -p \"$HOME/.local\" && ' +\n 'curl -fsSL \"https://dl.google.com/go/go$GO_VERSION.linux-amd64.tar.gz\" -o /tmp/instavm-go.tgz && ' +\n 'tar -C \"$HOME/.local\" -xzf /tmp/instavm-go.tgz; ' +\n 'fi && go mod download';\n\n // Port detection\n const port = detectGoPort(projectPath);\n const healthPath = detectGoHealthPath(projectPath);\n const secrets = collectSecrets(projectPath, [], 'go');\n\n return {\n slug: slugify(path.basename(projectPath)),\n runtime: 'go',\n packageManager: 'go',\n installCommand,\n buildCommand,\n startCommand: './app',\n port,\n healthPath,\n secrets,\n };\n}\n\nfunction detectGoPort(projectPath: string): number {\n for (const candidate of GO_SOURCE_CANDIDATES) {\n const full = path.join(projectPath, candidate);\n if (!fs.existsSync(full)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n const m = text.match(GO_PORT_RE);\n if (m) return parseInt(m[1], 10);\n const m2 = text.match(PORT_PATTERN_RE);\n if (m2) return parseInt(m2[1], 10);\n } catch {\n continue;\n }\n }\n // Also check all .go files in root\n try {\n for (const f of fs.readdirSync(projectPath)) {\n if (!f.endsWith('.go')) continue;\n const text = fs.readFileSync(path.join(projectPath, f), 'utf-8');\n const m = text.match(GO_PORT_RE);\n if (m) return parseInt(m[1], 10);\n }\n } catch {\n // ignore\n }\n return 8080;\n}\n\nfunction detectGoVersion(projectPath: string): string {\n const goModPath = path.join(projectPath, 'go.mod');\n if (!fs.existsSync(goModPath)) return '1.23.0';\n try {\n const text = fs.readFileSync(goModPath, 'utf-8');\n const match = text.match(/^go\\s+([0-9]+(?:\\.[0-9]+){1,2})\\s*$/m);\n return match?.[1] || '1.23.0';\n } catch {\n return '1.23.0';\n }\n}\n\nfunction detectGoHealthPath(projectPath: string): string {\n for (const candidate of GO_SOURCE_CANDIDATES) {\n const full = path.join(projectPath, candidate);\n if (!fs.existsSync(full)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n const m = text.match(GO_HEALTH_RE);\n if (m) return m[1];\n } catch {\n continue;\n }\n }\n try {\n for (const f of fs.readdirSync(projectPath)) {\n if (!f.endsWith('.go')) continue;\n const text = fs.readFileSync(path.join(projectPath, f), 'utf-8');\n const m = text.match(GO_HEALTH_RE);\n if (m) return m[1];\n }\n } catch {\n // ignore\n }\n return '/';\n}\n\n// ---------------------------------------------------------------------------\n// Deno detection\n// ---------------------------------------------------------------------------\n\nfunction detectDeno(projectPath: string): DeployPlan {\n const mainFile = findDenoMain(projectPath);\n if (!mainFile) {\n throw new Error(\n 'Could not detect start command. ' +\n 'No main.ts, main.js, server.ts, server.js, app.ts, or app.js found. ' +\n 'Use --start-command to specify how to start the app.',\n );\n }\n\n // Port detection from main file\n let port = 8000;\n const full = path.join(projectPath, mainFile);\n if (fs.existsSync(full)) {\n try {\n const text = fs.readFileSync(full, 'utf-8');\n const m = text.match(/port:\\s*(\\d{2,5})/);\n if (m) {\n port = parseInt(m[1], 10);\n } else {\n const m2 = text.match(PORT_PATTERN_RE);\n if (m2) port = parseInt(m2[1], 10);\n }\n } catch {\n // ignore\n }\n }\n\n const secrets = collectSecrets(projectPath, [], 'deno');\n\n return {\n slug: slugify(path.basename(projectPath)),\n runtime: 'deno',\n packageManager: 'deno',\n installCommand: 'curl -fsSL https://deno.land/install.sh | sh',\n buildCommand: null,\n startCommand: `$HOME/.deno/bin/deno run --allow-all ${mainFile}`,\n port,\n healthPath: '/',\n secrets,\n };\n}\n\nfunction findDenoMain(projectPath: string): string | null {\n for (const candidate of DENO_MAIN_CANDIDATES) {\n if (fs.existsSync(path.join(projectPath, candidate))) return candidate;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Static site detection\n// ---------------------------------------------------------------------------\n\nfunction hasStaticSignals(projectPath: string): boolean {\n if (fs.existsSync(path.join(projectPath, 'index.html'))) return true;\n return STATIC_ROOT_CANDIDATES.some((d) =>\n fs.existsSync(path.join(projectPath, d, 'index.html')),\n );\n}\n\nfunction findStaticRoot(projectPath: string): string {\n for (const candidate of STATIC_ROOT_CANDIDATES) {\n if (fs.existsSync(path.join(projectPath, candidate, 'index.html'))) return candidate;\n }\n if (fs.existsSync(path.join(projectPath, 'index.html'))) return '.';\n throw new Error(\n 'Could not detect project type. ' +\n 'Expected package.json, requirements.txt, pyproject.toml, Pipfile, ' +\n 'go.mod, deno.json, or index.html.',\n );\n}\n\nfunction detectStatic(projectPath: string): DeployPlan {\n const rootDir = findStaticRoot(projectPath);\n const port = 3000;\n return {\n slug: slugify(path.basename(projectPath)),\n runtime: 'static',\n packageManager: 'none',\n installCommand: \"echo 'No dependencies'\",\n buildCommand: null,\n startCommand: `python3 -m http.server ${port} --directory ${rootDir} --bind 0.0.0.0`,\n port,\n healthPath: '/',\n secrets: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction detectPortFromStartScript(script: string): number | null {\n const m1 = script.match(/--port\\s+(\\d+)/);\n if (m1) return parseInt(m1[1], 10);\n const m2 = script.match(/-p\\s+(\\d+)/);\n if (m2) return parseInt(m2[1], 10);\n return null;\n}\n\nfunction detectPortFromSource(projectPath: string, candidates: readonly string[]): number | null {\n for (const candidate of candidates) {\n const full = path.join(projectPath, candidate);\n if (!fs.existsSync(full)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n const m = text.match(PORT_PATTERN_RE);\n if (m) return parseInt(m[1], 10);\n } catch {\n continue;\n }\n }\n return null;\n}\n\nfunction detectPythonPort(projectPath: string): number {\n const visit = (dir: string): number | null => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return null;\n }\n\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (shouldSkipFile(full, projectPath)) continue;\n const nested = visit(full);\n if (nested != null) return nested;\n continue;\n }\n if (!entry.isFile() || !entry.name.endsWith('.py')) continue;\n if (shouldSkipFile(full, projectPath)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n for (const pattern of PYTHON_PORT_PATTERNS) {\n const match = text.match(pattern);\n if (match) return parseInt(match[1], 10);\n }\n } catch {\n continue;\n }\n }\n return null;\n };\n\n return visit(projectPath) ?? 8000;\n}\n\nfunction detectHealthPath(projectPath: string): string {\n const allCandidates = [...PYTHON_APP_CANDIDATES, ...NODE_SOURCE_CANDIDATES];\n for (const candidate of allCandidates) {\n const full = path.join(projectPath, candidate);\n if (!fs.existsSync(full)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n const m = text.match(HEALTH_ROUTE_RE);\n if (m) return m[1];\n } catch {\n continue;\n }\n }\n return '/health';\n}\n\nfunction collectSecrets(\n projectPath: string,\n deps: string[],\n runtime: string,\n): DeployPlan['secrets'] {\n const seen = new Set<string>();\n const secrets: DeployPlan['secrets'] = [];\n\n for (const dep of deps) {\n const depKey = dep.toLowerCase().split('==')[0].split('>=')[0].split('[')[0].trim();\n const hint = DEP_SECRET_HINTS[depKey];\n if (hint && !seen.has(hint[0])) {\n seen.add(hint[0]);\n secrets.push({ name: hint[0], prompt: hint[1], env_name: hint[0], required: true });\n }\n }\n\n const scanned = scanEnvVars(projectPath, runtime);\n for (const varName of [...scanned].sort()) {\n if (!seen.has(varName) && !NON_SECRET_VARS.has(varName)) {\n seen.add(varName);\n secrets.push({ name: varName, prompt: varName, env_name: varName, required: false });\n }\n }\n\n return secrets;\n}\n\nfunction scanEnvVars(projectPath: string, runtime: string): Set<string> {\n const found = new Set<string>();\n let extensions: string[];\n let pattern: RegExp;\n\n if (runtime === 'python') {\n extensions = ['.py'];\n pattern = PYTHON_ENV_RE;\n } else if (runtime === 'go') {\n extensions = ['.go'];\n pattern = GO_ENV_RE;\n } else if (runtime === 'deno') {\n extensions = ['.ts', '.js', '.mjs', '.mts'];\n pattern = DENO_ENV_RE;\n } else {\n extensions = ['.js', '.ts', '.mjs', '.tsx', '.jsx'];\n pattern = NODE_ENV_RE;\n }\n\n const scanDir = (dir: string) => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isFile() && extensions.some((ext) => entry.name.endsWith(ext))) {\n if (shouldSkipFile(full, projectPath)) continue;\n try {\n const text = fs.readFileSync(full, 'utf-8');\n let m: RegExpExecArray | null;\n const re = new RegExp(pattern.source, pattern.flags);\n while ((m = re.exec(text)) !== null) {\n const varName = m[1] || m[2];\n if (varName) found.add(varName);\n }\n } catch {\n continue;\n }\n }\n }\n };\n\n scanDir(projectPath);\n for (const subdir of ['src', 'server', 'api', 'lib', 'cmd']) {\n const sub = path.join(projectPath, subdir);\n if (fs.existsSync(sub) && fs.statSync(sub).isDirectory()) {\n scanDir(sub);\n }\n }\n\n return found;\n}\n\nfunction shouldSkipFile(filePath: string, projectRoot: string): boolean {\n const rel = path.relative(projectRoot, filePath);\n const parts = rel.split(path.sep);\n const skipDirs = new Set(['node_modules', '.venv', 'venv', '__pycache__', '.git', 'dist', 'build', '.next']);\n return parts.some((p) => skipDirs.has(p));\n}\n\nfunction slugify(name: string): string {\n const slug = name.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n return slug || 'app';\n}\n"],"mappings":"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","names":["os","path","fs","import_fs","import_path","os","path","fs","parseYaml","crypto","readline","import_fs","import_os","import_path","path","fs","parseYaml","vaultId","readline","promptSecret","import_fs","import_path","import_promises","import_yaml","import_fs","import_crypto","import_path","import_commander","axios","path","path","import_path","FormData","path","fs","path","import_fs","import_promises","import_axios","axios","fs","import_form_data","FormData","requireClient","emitOutput","addRuntimeOptions","os","import_axios","axios","WebSocket","requireClient","addRuntimeOptions","import_fs","formatTable","requireClient","emitOutput","addRuntimeOptions","tape","fs","import_fs","import_promises","displayValue","formatTable","fs","question","readline","requireClient","emitOutput","addRuntimeOptions","result","import_fs","import_path","path","fs","fs","printJson","printLines","printErrorLines","displayValue","formatTable","printErrorLines","printLines","path","fs","crypto","displayValue","findExecutable","printJson","client","result","payload","formatTable"]}
|