@computesdk/cli 0.1.2 → 1.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.20.3_typescript@5.8.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../src/pty.ts","../src/workspace-cli.ts","../src/index.ts","../src/providers.ts","../src/auth.ts","../src/setup.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * PTY Mode - Full interactive shell session\n *\n * Connects stdin/stdout directly to a remote PTY terminal.\n * Disconnect naturally with 'exit' or Ctrl+D (like SSH).\n */\n\nimport type { SandboxInterface } from 'computesdk';\n\nexport interface PTYOptions {\n /** Optional initial command to run before interactive shell (e.g., 'cd /path') */\n initialCommand?: string;\n}\n\n/**\n * Start PTY mode - interactive shell session\n * Uses /bin/bash for full shell features (history, completion, etc.)\n */\nexport async function startPTY(sandbox: SandboxInterface, options: PTYOptions = {}): Promise<void> {\n // Use bash explicitly for interactive features (history, tab completion, etc.)\n const terminal = await sandbox.terminal.create({ pty: true, shell: '/bin/bash' });\n\n // Small delay to ensure terminal is fully initialized\n await new Promise(resolve => setTimeout(resolve, 100));\n\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n\n let exiting = false;\n let resolvePromise: () => void;\n\n // Send initial command if provided (e.g., cd to worktree)\n if (options.initialCommand) {\n terminal.write(options.initialCommand + '\\n');\n // Small delay to let command execute before showing prompt\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n\n // Listen for WebSocket close (happens when bash exits naturally)\n const ws = (terminal as any)._ws;\n if (ws) {\n ws.on('close', () => {\n if (!exiting) {\n doExit();\n }\n });\n }\n\n terminal.on('output', (data: string) => {\n // Ignore output if we're exiting (bash sends newlines on exit)\n if (!exiting) {\n process.stdout.write(data);\n }\n });\n\n terminal.on('error', (error: string) => {\n // When bash exits, server sends error: undefined\n // Treat this as a natural exit signal\n if (!error || error === 'undefined') {\n if (!exiting) {\n doExit();\n }\n return;\n }\n // Only show error if it's meaningful\n process.stderr.write(`\\r\\nTerminal error: ${error}\\r\\n`);\n });\n\n const onData = (data: Buffer) => {\n // Send all input to remote terminal (including Ctrl+C)\n // Disconnect naturally with 'exit' or Ctrl+D\n terminal.write(data.toString());\n };\n process.stdin.on('data', onData);\n\n const onResize = () => {\n if (process.stdout.columns && process.stdout.rows) {\n try {\n terminal.resize(process.stdout.columns, process.stdout.rows);\n } catch {\n // Ignore resize errors\n }\n }\n };\n process.stdout.on('resize', onResize);\n onResize();\n\n async function doExit() {\n if (exiting) return;\n exiting = true;\n\n cleanup();\n try {\n await terminal.destroy();\n } catch {\n // Ignore\n }\n // Resolve the promise to return control to caller (don't exit process)\n // This allows REPL and other callers to continue after PTY session ends\n if (resolvePromise) {\n resolvePromise();\n }\n }\n\n function cleanup() {\n process.stdin.removeListener('data', onData);\n process.stdout.removeListener('resize', onResize);\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n process.stdin.pause();\n // No \"Disconnected\" message - clean exit like SSH\n }\n\n return new Promise<void>((resolve) => {\n resolvePromise = resolve;\n\n terminal.on('destroyed', () => {\n if (!exiting) {\n cleanup();\n resolve();\n }\n });\n\n process.stdin.on('end', () => {\n doExit();\n });\n });\n}\n","#!/usr/bin/env node\n/**\n * Minimal workspace CLI using existing PR #344 infrastructure\n * \n * This is a thin wrapper around sandbox.create() + bootstrap script\n * that adds the workspace concept without SDK changes.\n */\n\nimport { compute } from 'computesdk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { startPTY } from './pty.js';\n\nconst WORKSPACE_STATE_FILE = path.join(os.homedir(), '.computesdk', 'workspaces.json');\n\ninterface Workspace {\n id: string; // repo:branch\n repo: string;\n branch: string;\n sandboxId: string;\n provider: string;\n worktreePath: string;\n createdAt: string;\n lastUsed: string;\n}\n\ninterface WorkspaceState {\n workspaces: Record<string, Workspace>;\n}\n\n// Export Workspace interface\nexport type { Workspace, WorkspaceState };\n\n// Shell escape helper to prevent command injection\nfunction shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n// Load workspace state\nexport function loadState(): WorkspaceState {\n try {\n if (!fs.existsSync(WORKSPACE_STATE_FILE)) {\n return { workspaces: {} };\n }\n const raw = fs.readFileSync(WORKSPACE_STATE_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return { workspaces: {} };\n }\n}\n\n// Export alias for index.ts\nexport const loadWorkspaceState = loadState;\n\n// Save workspace state\nexport function saveState(state: WorkspaceState): void {\n const dir = path.dirname(WORKSPACE_STATE_FILE);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(WORKSPACE_STATE_FILE, JSON.stringify(state, null, 2) + '\\n', { mode: 0o600 });\n}\n\n// Get workspace ID from repo and branch\nfunction getWorkspaceId(repo: string, branch: string): string {\n return `${repo}:${branch}`;\n}\n\n// Create or attach to workspace\nexport async function workspaceCreate(options: {\n repo: string;\n branch: string;\n provider?: string;\n}): Promise<Workspace> {\n const { repo, branch, provider } = options;\n const id = getWorkspaceId(repo, branch);\n const state = loadState();\n \n // Check if workspace already exists\n if (state.workspaces[id]) {\n const existing = state.workspaces[id];\n \n // Verify sandbox still exists\n try {\n const sandbox = await compute.sandbox.getById(existing.sandboxId);\n if (!sandbox) {\n throw new Error('Sandbox not found');\n }\n \n // Just update last used\n existing.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to existing workspace: ${pc.cyan(id)}`);\n return existing;\n } catch {\n // Sandbox is gone, remove from state and recreate\n delete state.workspaces[id];\n }\n }\n \n // Create new sandbox\n p.log.info('Creating sandbox...');\n const spinner = p.spinner();\n spinner.start('Provisioning via ComputeSDK...');\n \n let sandbox;\n try {\n // TODO: Configure compute with provider\n sandbox = await compute.sandbox.create();\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n throw error;\n }\n \n // Run bootstrap script\n spinner.start('Bootstrapping workspace (installing gh CLI, cloning repo)...');\n \n // Read bootstrap script\n const bootstrapScript = fs.readFileSync(\n new URL('./bootstrap.sh', import.meta.url),\n 'utf-8'\n );\n \n // Write and execute bootstrap script in sandbox\n try {\n // Write script to sandbox\n await sandbox.filesystem.writeFile('/tmp/bootstrap.sh', bootstrapScript);\n \n // Make executable and run\n await sandbox.runCommand('chmod +x /tmp/bootstrap.sh');\n \n // Run bootstrap with repo and branch\n // Note: This is interactive for device flow auth\n spinner.stop('Running bootstrap (you may need to authenticate with GitHub)...');\n \n const result = await sandbox.runCommand(\n `/tmp/bootstrap.sh ${shellEscape(repo)} ${shellEscape(branch)}`,\n { timeout: 300000 } // 5 min timeout for auth\n );\n \n // Parse bootstrap output for paths\n const output = result.stdout || '';\n const jsonMatch = output.match(/\\{[\\s\\S]*\\}/);\n let worktreePath = `/workspaces/${path.basename(repo)}-${branch}`;\n \n if (jsonMatch) {\n try {\n const bootstrapInfo = JSON.parse(jsonMatch[0]);\n worktreePath = bootstrapInfo.worktree_path || worktreePath;\n } catch {\n // Use default path\n }\n }\n \n // Create workspace record\n const workspace: Workspace = {\n id,\n repo,\n branch,\n sandboxId: sandbox.sandboxId,\n provider: provider || 'e2b', // TODO: Get actual provider\n worktreePath,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n };\n \n state.workspaces[id] = workspace;\n saveState(state);\n \n p.log.success(`Workspace ready: ${pc.cyan(id)}`);\n p.log.info(`Sandbox: ${pc.dim(sandbox.sandboxId)}`);\n p.log.info(`Worktree: ${pc.dim(worktreePath)}`);\n \n return workspace;\n \n } catch (error) {\n spinner.stop(pc.red('Bootstrap failed'));\n // Cleanup sandbox on failure\n try {\n await sandbox.destroy();\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n// Attach to existing workspace\nexport async function workspaceAttach(id: string): Promise<void> {\n const state = loadState();\n const workspace = state.workspaces[id];\n \n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n p.log.info(`Run: compute workspace create --repo owner/repo --branch ${id.split(':')[1] || 'main'}`);\n process.exit(1);\n }\n \n // Get sandbox\n const sandbox = await compute.sandbox.getById(workspace.sandboxId);\n if (!sandbox) {\n p.log.error(`Sandbox no longer exists: ${workspace.sandboxId}`);\n delete state.workspaces[id];\n saveState(state);\n process.exit(1);\n }\n \n // Update last used\n workspace.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to workspace: ${pc.cyan(id)}`);\n p.log.info(`Changing to: ${pc.dim(workspace.worktreePath)}`);\n \n // Start PTY in the worktree directory\n console.log(pc.gray('Starting shell...'));\n \n try {\n // Clear screen for clean PTY session\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n await startPTY(sandbox, { initialCommand: `cd ${shellEscape(workspace.worktreePath)}` });\n } catch (error) {\n p.log.error(`Failed to attach: ${(error as Error).message}`);\n process.exit(1);\n }\n}\n\n// List all sandboxes (via workspaces)\nexport async function sandboxList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Sandboxes'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n \n console.log(` ${status} ${pc.cyan(ws.sandboxId)}`);\n console.log(` Workspace: ${pc.dim(ws.id)}`);\n console.log(` Provider: ${ws.provider}`);\n console.log(` Last active: ${pc.gray(ageStr)}`);\n console.log();\n }\n \n console.log(pc.gray('Tip: Use \"compute workspaces\" to see full workspace details'));\n}\n\n// List all workspaces\nexport async function workspaceList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Workspaces'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n \n console.log(` ${pc.cyan(ws.id)}`);\n console.log(` Sandbox: ${pc.dim(ws.sandboxId)} (${ws.provider})`);\n console.log(` Path: ${pc.dim(ws.worktreePath)}`);\n console.log(` Last used: ${pc.gray(ageStr)}`);\n console.log();\n }\n}\n\n// Save a simple sandbox (without workspace/repo info)\nexport async function saveSandbox(sandbox: {\n id: string;\n sandboxId: string;\n provider: string;\n createdAt: string;\n lastUsed: string;\n}): Promise<void> {\n const state = loadState();\n \n // Store as a minimal \"workspace\" with just sandbox info\n state.workspaces[sandbox.id] = {\n id: sandbox.id,\n repo: '(no repo)',\n branch: '(raw sandbox)',\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n worktreePath: '/',\n createdAt: sandbox.createdAt,\n lastUsed: sandbox.lastUsed,\n };\n \n saveState(state);\n}\n\n// Destroy workspace\nexport async function workspaceDestroy(id?: string): Promise<void> {\n const state = loadState();\n \n if (id) {\n // Destroy specific workspace\n const workspace = state.workspaces[id];\n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n return;\n }\n \n p.log.info(`Destroying workspace: ${pc.cyan(id)}`);\n \n try {\n await compute.sandbox.destroy(workspace.sandboxId);\n delete state.workspaces[id];\n saveState(state);\n p.log.success('Workspace destroyed');\n } catch (error) {\n p.log.error(`Failed to destroy: ${(error as Error).message}`);\n }\n } else {\n // Interactive selection\n const choices = Object.values(state.workspaces).map(ws => ({\n value: ws.id,\n label: `${ws.id} (${ws.provider}, last used ${Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24))}d ago)`\n }));\n \n if (choices.length === 0) {\n p.log.info('No workspaces to destroy');\n return;\n }\n \n const selected = await p.select({\n message: 'Select workspace to destroy',\n options: choices,\n });\n \n if (p.isCancel(selected)) {\n return;\n }\n \n await workspaceDestroy(selected as string);\n }\n}\n","/**\n * @computesdk/cli\n *\n * ComputeSDK CLI - Cloud-native workspace management.\n *\n * Usage:\n * compute # interactive workspace creation\n * compute owner/repo # create workspace for repo\n * compute --repo owner/repo --branch fix-auth\n * compute workspace # manage existing workspaces\n * compute exec <id> <cmd...> # run command in sandbox\n * compute connect <id> # interactive shell\n * compute destroy <id...> # destroy sandboxes\n * compute run -- <cmd...> # create + exec + optional destroy\n * compute providers # list configured providers\n */\n\nimport 'dotenv/config';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { compute, type SandboxInterface } from 'computesdk';\nimport { getProviderStatus } from './providers.js';\nimport { startPTY } from './pty.js';\nimport { clearStoredCredentials } from './auth.js';\nimport { ensureAuth, resolveProvider, configureCompute } from './setup.js';\nimport {\n workspaceCreate,\n workspaceAttach,\n workspaceList,\n workspaceDestroy,\n sandboxList,\n loadWorkspaceState,\n type Workspace,\n} from './workspace-cli.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n);\n\n// Detect if running from dev workspace\nconst isDevBuild = import.meta.url.includes('worktrees') || \n import.meta.url.includes('/packages/cli/');\nconst VERSION = isDevBuild ? `${packageJson.version}-dev` : packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('compute')\n .description('Cloud-native workspace management')\n .version(VERSION)\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ─── Default action: Show help ─────────────────────────────────────────────\n\nprogram\n .option('--login', 'force re-authentication')\n .option('--logout', 'clear stored credentials')\n .action(async (opts) => {\n if (opts.logout) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n process.exit(0);\n }\n\n if (opts.login) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n process.exit(0);\n }\n\n // Show help by default\n program.help();\n });\n\n// ─── Create Command (like create-compute) ─────────────────────────────────\n\nprogram\n .command('create')\n .description('Create a new workspace (same as create-compute)')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length > 0) {\n // Show existing workspaces to attach to\n const choices = workspaceIds.map((id) => {\n const ws = state.workspaces[id];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n return {\n value: id,\n label: `${id} (${ws.provider}, ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to attach (or create new)',\n options: [\n ...choices,\n { value: '__new__', label: pc.gray('+ Create new workspace') },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n if (selected !== '__new__') {\n await workspaceAttach(selected as string);\n return;\n }\n\n // Fall through to create new\n }\n\n // Prompt for repo\n const repoInput = await p.text({\n message: 'Repository to work on?',\n placeholder: 'owner/repo',\n validate: (value) => {\n if (!value || !value.includes('/')) {\n return 'Please enter a repository in owner/repo format';\n }\n },\n });\n\n if (p.isCancel(repoInput)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n repo = repoInput as string;\n }\n\n // Validate repo format\n if (!repo.includes('/')) {\n p.log.error('Invalid repository format. Use: owner/repo');\n process.exit(1);\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\n// ─── Sandbox Commands ───────────────────────────────────────────────────────\n\nconst sandboxCmd = program\n .command('sandbox')\n .alias('sb')\n .description('Manage raw sandboxes (VMs without git/worktree)');\n\nsandboxCmd\n .command('create')\n .description('Create a new sandbox')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name for findOrCreate')\n .option('--connect', 'start interactive shell after creation')\n .option('--silent', 'only output the sandbox ID')\n .action(async (opts) => {\n if (!opts.silent) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n }\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n if (!opts.silent) {\n const spinner = p.spinner();\n spinner.start('Creating sandbox...');\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n\n // Track the sandbox in local state\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n console.log(pc.gray(' Entering shell... (.exit or Ctrl+D to return)'));\n console.log();\n // Clear screen for clean PTY session\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n await startPTY(sandbox);\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n } else {\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n // Silent mode: only print sandbox ID for scripting\n process.stdout.write(sandbox.sandboxId);\n\n // Track the sandbox in local state (even in silent mode)\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n console.log();\n // Clear screen for clean PTY session\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n await startPTY(sandbox);\n }\n } catch (error) {\n process.stderr.write((error as Error).message + '\\n');\n process.exit(1);\n }\n }\n });\n\nsandboxCmd\n .command('destroy')\n .description('Destroy one or more sandboxes')\n .aliases(['rm', 'stop'])\n .argument('[sandbox_id...]', 'sandbox IDs to destroy (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxIds: string[] | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n \n // Load state\n const { loadState, saveState } = await import('./workspace-cli.js');\n const state = loadState();\n \n // If no IDs provided, show interactive picker\n if (!sandboxIds || sandboxIds.length === 0) {\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n // Allow multi-select with space, or single select with enter\n const selected = await p.multiselect({\n message: 'Select sandboxes to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxIds = selected as string[];\n }\n \n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const results = await Promise.allSettled(\n sandboxIds.map(async (id) => {\n await compute.sandbox.destroy(id);\n return id;\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n const sandboxId = result.value;\n console.log(pc.green(`Destroyed ${sandboxId}`));\n \n // Remove from state if tracked\n const workspaceId = Object.keys(state.workspaces).find(\n key => state.workspaces[key].sandboxId === sandboxId\n );\n if (workspaceId) {\n delete state.workspaces[workspaceId];\n }\n } else {\n console.error(pc.red(`Failed to destroy: ${result.reason?.message || result.reason}`));\n }\n }\n \n // Save updated state\n saveState(state);\n });\n\nsandboxCmd\n .command('list')\n .alias('ls')\n .description('List all sandboxes')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await sandboxList();\n });\n\nsandboxCmd\n .command('connect')\n .description('Connect to a sandbox via PTY (same as compute connect)')\n .aliases(['ssh', 'shell'])\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n \n // Clear screen for clean PTY session (like SSH)\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n \n await startPTY(sandbox);\n });\n\nsandboxCmd\n .command('exec')\n .description('Execute a command in a sandbox')\n .argument('<sandbox_id>', 'sandbox ID')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .action(async (sandboxId: string, command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n console.error(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n process.exit(result.exitCode);\n });\n\n// ─── Connect Command (top-level alias) ───────────────────────────────────────\n\nprogram\n .command('connect')\n .description('Connect to a sandbox via PTY')\n .aliases(['ssh', 'shell']) // Keep aliases but document connect as primary\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n \n // Clear screen for clean PTY session (like SSH)\n process.stdout.write('\\x1b[2J\\x1b[H\\x1b[3J');\n \n await startPTY(sandbox);\n });\n\n// ─── Workspace Commands ─────────────────────────────────────────────────────\n\nconst workspaceCmd = program\n .command('workspace')\n .alias('ws')\n .description('Manage workspaces (sandbox + git + worktree)');\n\nworkspaceCmd\n .command('create')\n .description('Create a new workspace')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n p.log.info('Usage: compute workspace create owner/repo --branch main');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\nworkspaceCmd\n .command('list')\n .alias('ls')\n .description('List all workspaces')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await workspaceList();\n });\n\nworkspaceCmd\n .command('destroy')\n .alias('rm')\n .description('Destroy a workspace')\n .argument('[id]', 'Workspace ID (repo:branch format, optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n // Allow multi-select\n const selected = await p.multiselect({\n message: 'Select workspaces to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n // Destroy each selected workspace\n for (const workspaceId of selected as string[]) {\n await workspaceDestroy(workspaceId);\n }\n } else {\n // Direct destroy with provided ID\n await workspaceDestroy(id);\n }\n });\n\nworkspaceCmd\n .command('connect')\n .alias('attach') // Keep attach as alias\n .description('Connect to an existing workspace (with git context)')\n .argument('[id]', 'Workspace ID (optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute create owner/repo');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n id = selected as string;\n }\n\n await workspaceAttach(id);\n });\n\n// ─── run ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('run')\n .description('Create a sandbox, run a command, then optionally destroy it')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .option('--rm', 'destroy sandbox after command finishes')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .action(async (command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n let sandbox: SandboxInterface;\n try {\n sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n } catch (error) {\n console.error(pc.red(`Failed to create sandbox: ${(error as Error).message}`));\n process.exit(1);\n }\n\n try {\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (opts.rm) {\n await sandbox.destroy();\n }\n\n process.exit(result.exitCode);\n } catch (error) {\n if (opts.rm) {\n try { await sandbox.destroy(); } catch { /* ignore cleanup errors */ }\n }\n console.error(pc.red((error as Error).message));\n process.exit(1);\n }\n });\n\n// ─── providers ───────────────────────────────────────────────────────────────\n\nprogram\n .command('providers')\n .description('List all providers and their configuration status')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n const statuses = getProviderStatus();\n\n console.log();\n for (const status of statuses) {\n const icon = status.ready ? pc.green('●') : pc.gray('○');\n const name = status.ready ? pc.white(status.name) : pc.gray(status.name);\n const detail = status.ready\n ? pc.green('ready')\n : pc.gray(`missing: ${status.missing.join(', ')}`);\n console.log(` ${icon} ${name} ${detail}`);\n }\n console.log();\n });\n\n// ─── login / logout ──────────────────────────────────────────────────────────\n\nprogram\n .command('login')\n .description('Authenticate with ComputeSDK')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n });\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(() => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n });\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildCreateOptions(opts: { timeout?: string; name?: string }) {\n const options: Record<string, unknown> = {};\n if (opts.timeout) {\n options.timeout = parseDuration(opts.timeout);\n }\n if (opts.name) {\n options.name = opts.name;\n }\n return options;\n}\n\nexport function shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildExecCommand(\n command: string[],\n opts: { env?: string[]; workdir?: string },\n): string {\n let cmd = command.map(shellEscape).join(' ');\n\n // Prepend cd if workdir is specified\n if (opts.workdir) {\n cmd = `cd ${shellEscape(opts.workdir)} && ${cmd}`;\n }\n\n // Prepend env vars if specified\n if (opts.env && opts.env.length > 0) {\n const envPrefix = opts.env\n .map((entry) => {\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid environment entry \"${entry}\". Expected format KEY=VALUE.`,\n );\n }\n const key = entry.slice(0, eqIndex);\n const val = entry.slice(eqIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(\n `Invalid environment variable name \"${key}\" in entry \"${entry}\".`,\n );\n }\n return `${key}=${shellEscape(val)}`;\n })\n .join(' ');\n cmd = `${envPrefix} ${cmd}`;\n }\n\n return cmd;\n}\n\n/**\n * Parse a human-friendly duration string to milliseconds.\n * Supports: 30s, 5m, 1h, 2h30m\n */\nfunction parseDuration(input: string): number {\n let total = 0;\n const pattern = /(\\d+)\\s*(s|m|h)/gi;\n let match;\n\n while ((match = pattern.exec(input)) !== null) {\n const value = parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n switch (unit) {\n case 's': total += value * 1000; break;\n case 'm': total += value * 60 * 1000; break;\n case 'h': total += value * 60 * 60 * 1000; break;\n }\n }\n\n if (total === 0) {\n // Try as plain number (seconds)\n const num = parseInt(input, 10);\n if (!isNaN(num)) return num * 1000;\n throw new Error(`Invalid duration: ${input}. Use formats like 30s, 5m, 1h`);\n }\n\n return total;\n}\n\n// ─── Run ─────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((error) => {\n console.error(pc.red(`\\nError: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Provider detection and validation\n */\n\nimport {\n PROVIDER_NAMES,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n type ProviderName,\n} from 'computesdk';\n\n// Providers that need additional credentials beyond COMPUTESDK_API_KEY\nconst PROVIDERS_NEEDING_CREDS = [\n 'e2b',\n 'railway',\n 'modal',\n 'vercel',\n 'daytona',\n 'render',\n 'namespace',\n 'blaxel',\n 'codesandbox',\n];\n\n/**\n * Provider status info\n */\nexport interface ProviderStatus {\n name: string;\n ready: boolean;\n missing: string[];\n}\n\n/**\n * Detect all available providers from environment variables\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function detectAvailableProviders(): string[] {\n const available: string[] = [];\n\n // Check for computesdk first (ComputeSDK native - just needs gateway key)\n if (process.env.COMPUTESDK_API_KEY) {\n available.push('computesdk');\n }\n\n // Then check for individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (PROVIDERS_NEEDING_CREDS.includes(provider as string) && isProviderAuthComplete(provider)) {\n available.push(provider);\n }\n }\n\n return available;\n}\n\n/**\n * Get status of all providers\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function getProviderStatus(): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n // Add computesdk status (ComputeSDK native)\n const hasGatewayKey = !!process.env.COMPUTESDK_API_KEY;\n statuses.push({\n name: 'computesdk',\n ready: hasGatewayKey,\n missing: hasGatewayKey ? [] : ['COMPUTESDK_API_KEY'],\n });\n\n // Add individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (PROVIDERS_NEEDING_CREDS.includes(provider as string)) {\n statuses.push({\n name: provider,\n ready: isProviderAuthComplete(provider),\n missing: getMissingEnvVars(provider),\n });\n }\n }\n\n return statuses;\n}\n\n/**\n * Check if gateway mode is available\n */\nexport function isGatewayAvailable(): boolean {\n return !!process.env.COMPUTESDK_API_KEY;\n}\n\n/**\n * Build the full compute config for a provider from env vars\n */\nexport function buildProviderConfig(provider: string): Record<string, unknown> {\n const config: Record<string, unknown> = {\n provider,\n apiKey: process.env.COMPUTESDK_API_KEY, // Gateway API key (top-level)\n };\n\n // For 'computesdk' provider, nest the API key under the provider config too\n if (provider === 'computesdk') {\n config.computesdk = {\n computesdk_api_key: process.env.COMPUTESDK_API_KEY,\n };\n }\n\n // Add provider-specific config from env vars (for other providers)\n if (provider !== 'computesdk') {\n const providerConfig = getProviderConfigFromEnv(provider as ProviderName);\n if (Object.keys(providerConfig).length > 0) {\n config[provider] = providerConfig;\n }\n }\n\n return config;\n}\n","/**\n * Browser-based CLI authentication flow\n *\n * Precedence: env var > stored credentials > browser auth flow\n */\n\nimport * as http from 'node:http';\nimport * as crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\n\nfunction getCredentialsDir(): string {\n return path.join(os.homedir(), '.computesdk');\n}\n\nfunction getCredentialsFile(): string {\n return path.join(getCredentialsDir(), 'credentials.json');\n}\n\nconst AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst CONSOLE_AUTH_URL = 'https://console.computesdk.com/cli/auth';\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html>\n<head><title>ComputeSDK CLI</title></head>\n<body style=\"font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1>Authenticated</h1>\n <p>You can close this tab and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n\n/**\n * Load stored credentials from ~/.computesdk/credentials.json.\n * Returns the API key if found and valid, or null.\n */\nexport function loadStoredCredentials(): string | null {\n try {\n if (!fs.existsSync(getCredentialsFile())) {\n return null;\n }\n const raw = fs.readFileSync(getCredentialsFile(), 'utf-8');\n const data = JSON.parse(raw);\n if (typeof data.apiKey === 'string' && data.apiKey.length > 0) {\n return data.apiKey;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Store credentials to ~/.computesdk/credentials.json.\n * Creates ~/.computesdk/ directory if it doesn't exist.\n */\nexport function storeCredentials(apiKey: string): void {\n if (!fs.existsSync(getCredentialsDir())) {\n fs.mkdirSync(getCredentialsDir(), { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(\n getCredentialsFile(),\n JSON.stringify({ apiKey }, null, 2) + '\\n',\n { mode: 0o600 }\n );\n}\n\n/**\n * Delete stored credentials file.\n */\nexport function clearStoredCredentials(): void {\n try {\n if (fs.existsSync(getCredentialsFile())) {\n fs.unlinkSync(getCredentialsFile());\n }\n } catch {\n // Ignore - file may not exist or may not be writable\n }\n}\n\n/**\n * Open a URL in the user's default browser.\n * Falls back to printing the URL if the browser fails to open.\n */\nfunction openBrowser(url: string): void {\n const command =\n process.platform === 'darwin'\n ? `open \"${url}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(command, (err) => {\n if (err) {\n p.log.warn('Could not open browser automatically.');\n p.log.info(`Open this URL manually:\\n ${pc.cyan(url)}`);\n }\n });\n}\n\nexport interface AuthFlowOptions {\n /** Override timeout for tests */\n timeoutMs?: number;\n /** Callback when server is listening (for tests) */\n onServerReady?: (port: number, state: string) => void;\n /** Skip opening browser (for tests) */\n skipBrowserOpen?: boolean;\n}\n\n/**\n * Run the browser-based authentication flow.\n *\n * 1. Start a local HTTP server on a random port\n * 2. Open browser to console.computesdk.com/cli/auth\n * 3. Wait for callback with token and validated state\n * 4. Return the API key\n */\nexport function runBrowserAuthFlow(options?: AuthFlowOptions): Promise<string> {\n const timeoutMs = options?.timeoutMs ?? AUTH_TIMEOUT_MS;\n const state = crypto.randomBytes(32).toString('hex');\n\n return new Promise<string>((resolve, reject) => {\n const server = http.createServer();\n\n const timeout = setTimeout(() => {\n server.close();\n reject(\n new Error('Authentication timed out after 5 minutes. Please try again.')\n );\n }, timeoutMs);\n\n server.on('request', (req, res) => {\n const url = new URL(req.url || '/', 'http://localhost');\n\n if (req.method !== 'GET' || url.pathname !== '/callback') {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n return;\n }\n\n const receivedState = url.searchParams.get('state');\n const token = url.searchParams.get('token');\n\n if (receivedState !== state) {\n res.writeHead(403, { 'Content-Type': 'text/plain' });\n res.end('Error: State mismatch. Please try authenticating again.');\n return;\n }\n\n if (!token) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Error: No token received.');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n\n clearTimeout(timeout);\n server.close();\n resolve(token);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n if (!addr || typeof addr === 'string') {\n clearTimeout(timeout);\n server.close();\n reject(new Error('Failed to start auth server'));\n return;\n }\n\n const port = addr.port;\n const authUrl = `${CONSOLE_AUTH_URL}?port=${port}&state=${state}`;\n\n if (options?.onServerReady) {\n options.onServerReady(port, state);\n }\n\n if (!options?.skipBrowserOpen) {\n openBrowser(authUrl);\n }\n });\n\n server.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`Auth server error: ${err.message}`));\n });\n });\n}\n\n/**\n * Resolve an API key through the precedence chain:\n * env var > stored credentials > browser auth flow\n */\nexport async function resolveApiKey(options?: {\n forceLogin?: boolean;\n}): Promise<string> {\n // 1. Check environment variable (highest precedence)\n if (process.env.COMPUTESDK_API_KEY) {\n return process.env.COMPUTESDK_API_KEY;\n }\n\n // 2. Check stored credentials (skip if forcing re-auth)\n if (!options?.forceLogin) {\n const stored = loadStoredCredentials();\n if (stored) {\n p.log.info(\n `Using stored credentials from ${pc.dim('~/.computesdk/credentials.json')}`\n );\n return stored;\n }\n }\n\n // 3. Run browser auth flow\n p.log.info('No API key found. Starting browser authentication...');\n\n const spinner = p.spinner();\n spinner.start('Waiting for browser authentication...');\n\n try {\n const apiKey = await runBrowserAuthFlow();\n spinner.stop('Authentication successful');\n\n // Store for next time\n try {\n storeCredentials(apiKey);\n p.log.success(\n `Credentials saved to ${pc.dim('~/.computesdk/credentials.json')}`\n );\n } catch {\n p.log.warn('Could not save credentials to disk. You may need to authenticate again next time.');\n }\n\n return apiKey;\n } catch (error) {\n spinner.stop(pc.red('Authentication failed'));\n throw error;\n }\n}\n","/**\n * Shared setup logic for CLI commands\n *\n * Resolves authentication and configures the compute client\n * for a given provider. Used by both subcommands and the REPL.\n */\n\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { compute } from 'computesdk';\nimport { detectAvailableProviders, getProviderStatus, buildProviderConfig, type ProviderStatus } from './providers.js';\nimport { resolveApiKey } from './auth.js';\n\n/**\n * Authenticate and set COMPUTESDK_API_KEY in the environment.\n * Exits the process on failure.\n */\nexport async function ensureAuth(options?: { forceLogin?: boolean }): Promise<void> {\n try {\n const apiKey = await resolveApiKey({ forceLogin: options?.forceLogin });\n process.env.COMPUTESDK_API_KEY = apiKey;\n } catch (error) {\n p.log.error((error as Error).message);\n p.log.info(`Get your API key at ${pc.cyan('https://console.computesdk.com')}`);\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n}\n\n/**\n * Resolve which provider to use.\n *\n * If `--provider` is given, validates it's configured and returns it.\n * If `interactive` is true and multiple providers are available, prompts user.\n * In non-interactive mode, requires `--provider` when multiple are configured.\n * Exits the process if no providers are available.\n */\nexport async function resolveProvider(\n providerFlag?: string,\n options?: { interactive?: boolean },\n): Promise<string> {\n const interactive = options?.interactive ?? false;\n const available = detectAvailableProviders();\n const providerStatus = getProviderStatus();\n\n if (providerFlag) {\n const match = providerStatus.find(\n (s: ProviderStatus) => s.name.toLowerCase() === providerFlag.toLowerCase(),\n );\n\n if (!match) {\n p.log.error(`Unknown provider: ${providerFlag}`);\n p.log.info(`Available providers: ${providerStatus.map((s: ProviderStatus) => s.name).join(', ')}`);\n process.exit(1);\n }\n\n if (!match.ready) {\n p.log.error(`Provider ${providerFlag} is not configured`);\n if (match.missing.length > 0) {\n p.log.info(`Missing env vars: ${match.missing.join(', ')}`);\n }\n process.exit(1);\n }\n\n return match.name;\n }\n\n if (available.length === 0) {\n p.log.error('No provider credentials detected');\n p.log.info('Set one of: E2B_API_KEY, MODAL_TOKEN_ID, RAILWAY_API_KEY, etc.');\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n\n // Single provider — no ambiguity\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple providers — interactive mode can prompt, non-interactive must fail\n if (!interactive) {\n p.log.error('Multiple providers configured. Use --provider to specify one.');\n p.log.info(`Available: ${available.join(', ')}`);\n process.exit(1);\n }\n\n const providerOptions = providerStatus\n .filter((status: ProviderStatus) => status.ready)\n .map((status: ProviderStatus) => ({\n value: status.name,\n label: status.name,\n }));\n\n const provider = await p.select({\n message: 'Select provider',\n options: providerOptions,\n });\n\n if (p.isCancel(provider)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n return provider as string;\n}\n\n/**\n * Configure the compute client for a provider.\n * Must be called after ensureAuth().\n */\nexport function configureCompute(provider: string): void {\n const config = buildProviderConfig(provider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compute.setConfig(config as any);\n}\n"],"mappings":"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","names":["compute","fs","path","os","p","pc","sandbox","spinner","p","pc","readFileSync","fileURLToPath","dirname","join","compute","path","spinner","p","pc","pc","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc","spinner","compute","saveSandbox","loadState","saveState","shellEscape"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.20.3_typescript@5.8.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../src/repl.ts","../src/workspace-cli.ts","../src/index.ts","../src/providers.ts","../src/auth.ts","../src/setup.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * REPL Mode - Run commands one at a time\n *\n * Shell-like interface where each line is executed as a command.\n * Special commands prefixed with /.\n */\n\nimport * as readline from 'readline';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport pc from 'picocolors';\nimport { compute, type SandboxInterface } from 'computesdk';\n\ntype SessionResult = 'exit';\n\ninterface ReplContext {\n sandboxes: Map<string, SandboxInterface>;\n activeSandboxId: string;\n}\n\n/**\n * Start REPL mode.\n */\nexport async function startREPL(sandbox: SandboxInterface, provider: string): Promise<void> {\n // Mark provider as used - reserved for future provider-specific REPL behavior\n void provider;\n const ctx: ReplContext = {\n sandboxes: new Map([[sandbox.sandboxId, sandbox]]),\n activeSandboxId: sandbox.sandboxId,\n };\n\n await runSession(ctx);\n}\n\nfunction buildPrompt(sandboxId: string): string {\n if (!sandboxId) return pc.gray('[no sandbox] ') + pc.bold('$ ');\n return pc.cyan(`[${sandboxId}] `) + pc.bold('$ ');\n}\n\n/**\n * Run a single REPL session.\n *\n * Creates a readline interface, processes commands, and returns\n * 'exit' when the user wants to quit.\n */\nfunction runSession(ctx: ReplContext): Promise<SessionResult> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: buildPrompt(ctx.activeSandboxId),\n terminal: true,\n historySize: 1000,\n });\n\n // Load history\n loadHistory(rl);\n\n return new Promise<SessionResult>((resolve) => {\n let resolved = false;\n const done = (result: SessionResult) => {\n if (resolved) return;\n resolved = true;\n rl.close();\n resolve(result);\n };\n\n rl.on('SIGINT', () => {\n console.log();\n rl.prompt();\n });\n\n rl.on('close', () => {\n done('exit');\n });\n\n rl.on('line', async (line: string) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === '.exit') {\n done('exit');\n return;\n }\n\n // Save to history\n saveToHistory(trimmed);\n\n try {\n if (trimmed.startsWith('/')) {\n const result = await handleSpecialCommand(ctx, trimmed, rl);\n if (result === 'exit') {\n done(result);\n return;\n }\n } else if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n } else {\n const sandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n await executeCommand(sandbox, trimmed);\n }\n } catch (error) {\n console.log(pc.red(`✗ ${(error as Error).message}`));\n }\n\n if (!resolved) {\n rl.prompt();\n }\n });\n\n rl.prompt();\n });\n}\n\n/**\n * Execute a shell command in the sandbox\n */\nasync function executeCommand(sandbox: SandboxInterface, command: string): Promise<void> {\n const result = await sandbox.runCommand(command);\n\n // Print stdout\n if (result.stdout) {\n process.stdout.write(result.stdout);\n if (!result.stdout.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Print stderr in red\n if (result.stderr) {\n process.stderr.write(pc.red(result.stderr));\n if (!result.stderr.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Show exit code if non-zero\n if (result.exitCode !== 0) {\n console.log(pc.gray(`exit code: ${result.exitCode}`));\n }\n}\n\n/**\n * Handle special commands (prefixed with /)\n * Returns 'exit' to quit, or null to continue\n */\nasync function handleSpecialCommand(\n ctx: ReplContext,\n input: string,\n rl: readline.Interface,\n): Promise<SessionResult | null> {\n const [cmd, ...args] = input.slice(1).split(/\\s+/);\n\n switch (cmd.toLowerCase()) {\n case 'help':\n case 'h':\n case '?':\n showHelp();\n return null;\n\n case 'info':\n case 'i': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n console.log();\n console.log(pc.bold(' Sandbox Info'));\n console.log(` ID: ${pc.cyan(activeSandbox.sandboxId)}`);\n console.log();\n return null;\n }\n\n case 'url':\n case 'u': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n if (args.length === 0) {\n console.log(pc.gray('Usage: /url <port>'));\n } else {\n const port = parseInt(args[0], 10);\n if (isNaN(port)) {\n console.log(pc.red('Invalid port number'));\n } else {\n const url = await activeSandbox.getUrl({ port });\n console.log(pc.cyan(url));\n }\n }\n return null;\n }\n\n case 'new': {\n console.log(pc.gray(' Creating new sandbox...'));\n const newSandbox = await compute.sandbox.create();\n ctx.sandboxes.set(newSandbox.sandboxId, newSandbox);\n ctx.activeSandboxId = newSandbox.sandboxId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Sandbox ready: ${pc.cyan(newSandbox.sandboxId)}`);\n console.log(` ${pc.gray(`Active sandboxes: ${ctx.sandboxes.size}`)}`);\n return null;\n }\n\n case 'destroy': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /destroy <sandbox-id> or /destroy --all'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n if (args[0] === '--all') {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow(' No sandboxes to destroy.'));\n return null;\n }\n const count = ctx.sandboxes.size;\n console.log(pc.gray(` Destroying ${count} sandbox${count > 1 ? 'es' : ''}...`));\n await Promise.all(\n Array.from(ctx.sandboxes.values()).map(s => s.destroy()),\n );\n ctx.sandboxes.clear();\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Destroyed ${pc.cyan(String(count))} sandbox${count > 1 ? 'es' : ''}`);\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n return null;\n }\n const targetId = args[0];\n const target = ctx.sandboxes.get(targetId);\n if (!target) {\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(targetId));\n if (matches.length === 1) {\n return destroySandbox(ctx, matches[0], rl);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${targetId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n return destroySandbox(ctx, targetId, rl);\n }\n\n case 'list':\n case 'ls': {\n console.log();\n console.log(pc.bold(' Sandboxes'));\n for (const id of ctx.sandboxes.keys()) {\n const marker = id === ctx.activeSandboxId ? pc.green(' ●') : ' ';\n console.log(` ${marker} ${pc.cyan(id)}`);\n }\n console.log();\n return null;\n }\n\n case 'switch':\n case 'sw': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /switch <sandbox-id>'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n const switchId = args[0];\n if (ctx.sandboxes.has(switchId)) {\n ctx.activeSandboxId = switchId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(switchId)}`);\n return null;\n }\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(switchId));\n if (matches.length === 1) {\n ctx.activeSandboxId = matches[0];\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(matches[0])}`);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${switchId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n\n case 'exit':\n case 'quit':\n case 'q':\n return 'exit';\n\n default:\n console.log(pc.yellow(`Unknown command: /${cmd}`));\n console.log(pc.gray('Type /help for available commands'));\n return null;\n }\n}\n\n/**\n * Destroy a sandbox by ID and update context\n */\nasync function destroySandbox(\n ctx: ReplContext,\n sandboxId: string,\n rl: readline.Interface,\n): Promise<null> {\n const target = ctx.sandboxes.get(sandboxId)!;\n console.log(pc.gray(` Destroying ${sandboxId}...`));\n await target.destroy();\n ctx.sandboxes.delete(sandboxId);\n console.log(` Destroyed ${pc.cyan(sandboxId)}`);\n\n // If we destroyed the active sandbox, switch to another\n if (ctx.activeSandboxId === sandboxId && ctx.sandboxes.size > 0) {\n ctx.activeSandboxId = ctx.sandboxes.keys().next().value!;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(ctx.activeSandboxId)}`);\n } else if (ctx.sandboxes.size === 0) {\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n }\n\n return null;\n}\n\n/**\n * Show help message\n */\nfunction showHelp(): void {\n console.log();\n console.log(pc.bold(' Shell Mode'));\n console.log(pc.gray(' Just type commands - they run in the active sandbox'));\n console.log();\n console.log(pc.white(' ls -la'));\n console.log(pc.white(' cat /etc/os-release'));\n console.log(pc.white(' npm install lodash'));\n console.log();\n console.log(pc.bold(' Sandbox Commands') + pc.gray(' (prefix with /)'));\n console.log();\n console.log(pc.cyan(' /new') + pc.gray(' Create a new sandbox and switch to it'));\n console.log(pc.cyan(' /list') + pc.gray(' List all sandboxes'));\n console.log(pc.cyan(' /switch <id>') + pc.gray(' Switch active sandbox'));\n console.log(pc.cyan(' /destroy <id>') + pc.gray(' Destroy a sandbox by ID'));\n console.log(pc.cyan(' /destroy --all') + pc.gray(' Destroy all sandboxes'));\n console.log();\n console.log(pc.bold(' Other Commands'));\n console.log();\n console.log(pc.cyan(' /info') + pc.gray(' Show active sandbox info'));\n console.log(pc.cyan(' /url <port>') + pc.gray(' Get public URL for port'));\n console.log(pc.cyan(' /help') + pc.gray(' Show this help'));\n console.log(pc.cyan(' /exit') + pc.gray(' Exit the REPL'));\n console.log();\n}\n\n// History file path\nconst HISTORY_FILE = path.join(os.homedir(), '.create_compute_history');\n\n/**\n * Load history from file\n */\nfunction loadHistory(rl: readline.Interface): void {\n try {\n if (fs.existsSync(HISTORY_FILE)) {\n const history = fs.readFileSync(HISTORY_FILE, 'utf-8')\n .split('\\n')\n .filter(line => line.trim())\n .reverse();\n\n for (const line of history.slice(0, 1000)) {\n (rl as unknown as { history: string[] }).history?.push(line);\n }\n }\n } catch {\n // Ignore\n }\n}\n\n/**\n * Save a line to history\n */\nfunction saveToHistory(line: string): void {\n try {\n fs.appendFileSync(HISTORY_FILE, line + '\\n');\n } catch {\n // Ignore\n }\n}\n","#!/usr/bin/env node\n/**\n * Minimal workspace CLI using existing PR #344 infrastructure\n * \n * This is a thin wrapper around sandbox.create() + bootstrap script\n * that adds the workspace concept without SDK changes.\n */\n\nimport { compute } from 'computesdk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { startREPL } from './repl.js';\n\nconst WORKSPACE_STATE_FILE = path.join(os.homedir(), '.computesdk', 'workspaces.json');\n\ninterface Workspace {\n id: string; // repo:branch\n repo: string;\n branch: string;\n sandboxId: string;\n provider: string;\n worktreePath: string;\n createdAt: string;\n lastUsed: string;\n}\n\ninterface WorkspaceState {\n workspaces: Record<string, Workspace>;\n}\n\n// Export Workspace interface\nexport type { Workspace, WorkspaceState };\n\n// Shell escape helper to prevent command injection\nfunction shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n// Load workspace state\nexport function loadState(): WorkspaceState {\n try {\n if (!fs.existsSync(WORKSPACE_STATE_FILE)) {\n return { workspaces: {} };\n }\n const raw = fs.readFileSync(WORKSPACE_STATE_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return { workspaces: {} };\n }\n}\n\n// Export alias for index.ts\nexport const loadWorkspaceState = loadState;\n\n// Save workspace state\nexport function saveState(state: WorkspaceState): void {\n const dir = path.dirname(WORKSPACE_STATE_FILE);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(WORKSPACE_STATE_FILE, JSON.stringify(state, null, 2) + '\\n', { mode: 0o600 });\n}\n\n// Get workspace ID from repo and branch\nfunction getWorkspaceId(repo: string, branch: string): string {\n return `${repo}:${branch}`;\n}\n\n// Create or attach to workspace\nexport async function workspaceCreate(options: {\n repo: string;\n branch: string;\n provider?: string;\n}): Promise<Workspace> {\n const { repo, branch, provider } = options;\n const id = getWorkspaceId(repo, branch);\n const state = loadState();\n \n // Check if workspace already exists\n if (state.workspaces[id]) {\n const existing = state.workspaces[id];\n \n // Verify sandbox still exists\n try {\n const sandbox = await compute.sandbox.getById(existing.sandboxId);\n if (!sandbox) {\n throw new Error('Sandbox not found');\n }\n \n // Just update last used\n existing.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to existing workspace: ${pc.cyan(id)}`);\n return existing;\n } catch {\n // Sandbox is gone, remove from state and recreate\n delete state.workspaces[id];\n }\n }\n \n // Create new sandbox\n p.log.info('Creating sandbox...');\n const spinner = p.spinner();\n spinner.start('Provisioning via ComputeSDK...');\n \n let sandbox;\n try {\n // TODO: Configure compute with provider\n sandbox = await compute.sandbox.create();\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n throw error;\n }\n \n // Run bootstrap script\n spinner.start('Bootstrapping workspace (installing gh CLI, cloning repo)...');\n \n // Read bootstrap script\n const bootstrapScript = fs.readFileSync(\n new URL('./bootstrap.sh', import.meta.url),\n 'utf-8'\n );\n \n // Write and execute bootstrap script in sandbox\n try {\n // Write script to sandbox\n await sandbox.filesystem.writeFile('/tmp/bootstrap.sh', bootstrapScript);\n \n // Make executable and run\n await sandbox.runCommand('chmod +x /tmp/bootstrap.sh');\n \n // Run bootstrap with repo and branch\n // Note: This is interactive for device flow auth\n spinner.stop('Running bootstrap (you may need to authenticate with GitHub)...');\n \n const result = await sandbox.runCommand(\n `/tmp/bootstrap.sh ${shellEscape(repo)} ${shellEscape(branch)}`,\n { timeout: 300000 } // 5 min timeout for auth\n );\n \n // Parse bootstrap output for paths\n const output = result.stdout || '';\n const jsonMatch = output.match(/\\{[\\s\\S]*\\}/);\n let worktreePath = `/workspaces/${path.basename(repo)}-${branch}`;\n \n if (jsonMatch) {\n try {\n const bootstrapInfo = JSON.parse(jsonMatch[0]);\n worktreePath = bootstrapInfo.worktree_path || worktreePath;\n } catch {\n // Use default path\n }\n }\n \n // Create workspace record\n const workspace: Workspace = {\n id,\n repo,\n branch,\n sandboxId: sandbox.sandboxId,\n provider: provider || 'e2b', // TODO: Get actual provider\n worktreePath,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n };\n \n state.workspaces[id] = workspace;\n saveState(state);\n \n p.log.success(`Workspace ready: ${pc.cyan(id)}`);\n p.log.info(`Sandbox: ${pc.dim(sandbox.sandboxId)}`);\n p.log.info(`Worktree: ${pc.dim(worktreePath)}`);\n \n return workspace;\n \n } catch (error) {\n spinner.stop(pc.red('Bootstrap failed'));\n // Cleanup sandbox on failure\n try {\n await sandbox.destroy();\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n// Attach to existing workspace\nexport async function workspaceAttach(id: string): Promise<void> {\n const state = loadState();\n const workspace = state.workspaces[id];\n \n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n p.log.info(`Run: compute workspace create --repo owner/repo --branch ${id.split(':')[1] || 'main'}`);\n process.exit(1);\n }\n \n // Get sandbox\n const sandbox = await compute.sandbox.getById(workspace.sandboxId);\n if (!sandbox) {\n p.log.error(`Sandbox no longer exists: ${workspace.sandboxId}`);\n delete state.workspaces[id];\n saveState(state);\n process.exit(1);\n }\n \n // Update last used\n workspace.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to workspace: ${pc.cyan(id)}`);\n p.log.info(`Worktree: ${pc.dim(workspace.worktreePath)}`);\n console.log(pc.gray(`Tip: commands run at sandbox root; use { cwd: \"${workspace.worktreePath}\" } on runCommand to scope them.`));\n\n try {\n await startREPL(sandbox, workspace.provider);\n } catch (error) {\n p.log.error(`Failed to attach: ${(error as Error).message}`);\n process.exit(1);\n }\n}\n\n// List all sandboxes (via workspaces)\nexport async function sandboxList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Sandboxes'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n \n console.log(` ${status} ${pc.cyan(ws.sandboxId)}`);\n console.log(` Workspace: ${pc.dim(ws.id)}`);\n console.log(` Provider: ${ws.provider}`);\n console.log(` Last active: ${pc.gray(ageStr)}`);\n console.log();\n }\n \n console.log(pc.gray('Tip: Use \"compute workspaces\" to see full workspace details'));\n}\n\n// List all workspaces\nexport async function workspaceList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Workspaces'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n \n console.log(` ${pc.cyan(ws.id)}`);\n console.log(` Sandbox: ${pc.dim(ws.sandboxId)} (${ws.provider})`);\n console.log(` Path: ${pc.dim(ws.worktreePath)}`);\n console.log(` Last used: ${pc.gray(ageStr)}`);\n console.log();\n }\n}\n\n// Save a simple sandbox (without workspace/repo info)\nexport async function saveSandbox(sandbox: {\n id: string;\n sandboxId: string;\n provider: string;\n createdAt: string;\n lastUsed: string;\n}): Promise<void> {\n const state = loadState();\n \n // Store as a minimal \"workspace\" with just sandbox info\n state.workspaces[sandbox.id] = {\n id: sandbox.id,\n repo: '(no repo)',\n branch: '(raw sandbox)',\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n worktreePath: '/',\n createdAt: sandbox.createdAt,\n lastUsed: sandbox.lastUsed,\n };\n \n saveState(state);\n}\n\n// Destroy workspace\nexport async function workspaceDestroy(id?: string): Promise<void> {\n const state = loadState();\n \n if (id) {\n // Destroy specific workspace\n const workspace = state.workspaces[id];\n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n return;\n }\n \n p.log.info(`Destroying workspace: ${pc.cyan(id)}`);\n \n try {\n await compute.sandbox.destroy(workspace.sandboxId);\n delete state.workspaces[id];\n saveState(state);\n p.log.success('Workspace destroyed');\n } catch (error) {\n p.log.error(`Failed to destroy: ${(error as Error).message}`);\n }\n } else {\n // Interactive selection\n const choices = Object.values(state.workspaces).map(ws => ({\n value: ws.id,\n label: `${ws.id} (${ws.provider}, last used ${Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24))}d ago)`\n }));\n \n if (choices.length === 0) {\n p.log.info('No workspaces to destroy');\n return;\n }\n \n const selected = await p.select({\n message: 'Select workspace to destroy',\n options: choices,\n });\n \n if (p.isCancel(selected)) {\n return;\n }\n \n await workspaceDestroy(selected as string);\n }\n}\n","/**\n * @computesdk/cli\n *\n * ComputeSDK CLI - Cloud-native workspace management.\n *\n * Usage:\n * compute # interactive workspace creation\n * compute owner/repo # create workspace for repo\n * compute --repo owner/repo --branch fix-auth\n * compute workspace # manage existing workspaces\n * compute exec <id> <cmd...> # run command in sandbox\n * compute connect <id> # open REPL against sandbox\n * compute destroy <id...> # destroy sandboxes\n * compute run -- <cmd...> # create + exec + optional destroy\n * compute providers # list configured providers\n */\n\nimport 'dotenv/config';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { compute, type SandboxInterface } from 'computesdk';\nimport { getProviderStatus } from './providers.js';\nimport { startREPL } from './repl.js';\nimport { clearStoredCredentials } from './auth.js';\nimport { ensureAuth, resolveProvider, configureCompute } from './setup.js';\nimport {\n workspaceCreate,\n workspaceAttach,\n workspaceList,\n workspaceDestroy,\n sandboxList,\n loadWorkspaceState,\n type Workspace,\n} from './workspace-cli.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n);\n\n// Detect if running from dev workspace\nconst isDevBuild = import.meta.url.includes('worktrees') || \n import.meta.url.includes('/packages/cli/');\nconst VERSION = isDevBuild ? `${packageJson.version}-dev` : packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('compute')\n .description('Cloud-native workspace management')\n .version(VERSION)\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ─── Default action: Show help ─────────────────────────────────────────────\n\nprogram\n .option('--login', 'force re-authentication')\n .option('--logout', 'clear stored credentials')\n .action(async (opts) => {\n if (opts.logout) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n process.exit(0);\n }\n\n if (opts.login) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n process.exit(0);\n }\n\n // Show help by default\n program.help();\n });\n\n// ─── Create Command (like create-compute) ─────────────────────────────────\n\nprogram\n .command('create')\n .description('Create a new workspace (same as create-compute)')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length > 0) {\n // Show existing workspaces to attach to\n const choices = workspaceIds.map((id) => {\n const ws = state.workspaces[id];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n return {\n value: id,\n label: `${id} (${ws.provider}, ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to attach (or create new)',\n options: [\n ...choices,\n { value: '__new__', label: pc.gray('+ Create new workspace') },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n if (selected !== '__new__') {\n await workspaceAttach(selected as string);\n return;\n }\n\n // Fall through to create new\n }\n\n // Prompt for repo\n const repoInput = await p.text({\n message: 'Repository to work on?',\n placeholder: 'owner/repo',\n validate: (value) => {\n if (!value || !value.includes('/')) {\n return 'Please enter a repository in owner/repo format';\n }\n },\n });\n\n if (p.isCancel(repoInput)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n repo = repoInput as string;\n }\n\n // Validate repo format\n if (!repo.includes('/')) {\n p.log.error('Invalid repository format. Use: owner/repo');\n process.exit(1);\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\n// ─── Sandbox Commands ───────────────────────────────────────────────────────\n\nconst sandboxCmd = program\n .command('sandbox')\n .alias('sb')\n .description('Manage raw sandboxes (VMs without git/worktree)');\n\nsandboxCmd\n .command('create')\n .description('Create a new sandbox')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .option('--connect', 'drop into the REPL after creation')\n .option('--silent', 'only output the sandbox ID')\n .action(async (opts) => {\n if (!opts.silent) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n }\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n if (!opts.silent) {\n const spinner = p.spinner();\n spinner.start('Creating sandbox...');\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n\n // Track the sandbox in local state\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n } else {\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n // Silent mode: only print sandbox ID for scripting\n process.stdout.write(sandbox.sandboxId);\n\n // Track the sandbox in local state (even in silent mode)\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n process.stderr.write((error as Error).message + '\\n');\n process.exit(1);\n }\n }\n });\n\nsandboxCmd\n .command('destroy')\n .description('Destroy one or more sandboxes')\n .aliases(['rm', 'stop'])\n .argument('[sandbox_id...]', 'sandbox IDs to destroy (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxIds: string[] | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n \n // Load state\n const { loadState, saveState } = await import('./workspace-cli.js');\n const state = loadState();\n \n // If no IDs provided, show interactive picker\n if (!sandboxIds || sandboxIds.length === 0) {\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n // Allow multi-select with space, or single select with enter\n const selected = await p.multiselect({\n message: 'Select sandboxes to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxIds = selected as string[];\n }\n \n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const results = await Promise.allSettled(\n sandboxIds.map(async (id) => {\n await compute.sandbox.destroy(id);\n return id;\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n const sandboxId = result.value;\n console.log(pc.green(`Destroyed ${sandboxId}`));\n \n // Remove from state if tracked\n const workspaceId = Object.keys(state.workspaces).find(\n key => state.workspaces[key].sandboxId === sandboxId\n );\n if (workspaceId) {\n delete state.workspaces[workspaceId];\n }\n } else {\n console.error(pc.red(`Failed to destroy: ${result.reason?.message || result.reason}`));\n }\n }\n \n // Save updated state\n saveState(state);\n });\n\nsandboxCmd\n .command('list')\n .alias('ls')\n .description('List all sandboxes')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await sandboxList();\n });\n\nsandboxCmd\n .command('connect')\n .description('Connect to a sandbox (opens REPL; same as compute connect)')\n .aliases(['ssh', 'shell'])\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\nsandboxCmd\n .command('exec')\n .description('Execute a command in a sandbox')\n .argument('<sandbox_id>', 'sandbox ID')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .action(async (sandboxId: string, command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n console.error(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n process.exit(result.exitCode);\n });\n\n// ─── Connect Command (top-level alias) ───────────────────────────────────────\n\nprogram\n .command('connect')\n .description('Connect to a sandbox (opens REPL)')\n .aliases(['ssh', 'shell']) // Keep aliases but document connect as primary\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\n// ─── Workspace Commands ─────────────────────────────────────────────────────\n\nconst workspaceCmd = program\n .command('workspace')\n .alias('ws')\n .description('Manage workspaces (sandbox + git + worktree)');\n\nworkspaceCmd\n .command('create')\n .description('Create a new workspace')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n p.log.info('Usage: compute workspace create owner/repo --branch main');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\nworkspaceCmd\n .command('list')\n .alias('ls')\n .description('List all workspaces')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await workspaceList();\n });\n\nworkspaceCmd\n .command('destroy')\n .alias('rm')\n .description('Destroy a workspace')\n .argument('[id]', 'Workspace ID (repo:branch format, optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n // Allow multi-select\n const selected = await p.multiselect({\n message: 'Select workspaces to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n // Destroy each selected workspace\n for (const workspaceId of selected as string[]) {\n await workspaceDestroy(workspaceId);\n }\n } else {\n // Direct destroy with provided ID\n await workspaceDestroy(id);\n }\n });\n\nworkspaceCmd\n .command('connect')\n .alias('attach') // Keep attach as alias\n .description('Connect to an existing workspace (with git context)')\n .argument('[id]', 'Workspace ID (optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute create owner/repo');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n id = selected as string;\n }\n\n await workspaceAttach(id);\n });\n\n// ─── run ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('run')\n .description('Create a sandbox, run a command, then optionally destroy it')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .option('--rm', 'destroy sandbox after command finishes')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .action(async (command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n let sandbox: SandboxInterface;\n try {\n sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n } catch (error) {\n console.error(pc.red(`Failed to create sandbox: ${(error as Error).message}`));\n process.exit(1);\n }\n\n try {\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (opts.rm) {\n await sandbox.destroy();\n }\n\n process.exit(result.exitCode);\n } catch (error) {\n if (opts.rm) {\n try { await sandbox.destroy(); } catch { /* ignore cleanup errors */ }\n }\n console.error(pc.red((error as Error).message));\n process.exit(1);\n }\n });\n\n// ─── providers ───────────────────────────────────────────────────────────────\n\nprogram\n .command('providers')\n .description('List all providers and their configuration status')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n const statuses = getProviderStatus();\n\n console.log();\n for (const status of statuses) {\n const icon = status.ready ? pc.green('●') : pc.gray('○');\n const name = status.ready ? pc.white(status.name) : pc.gray(status.name);\n const detail = status.ready\n ? pc.green('ready')\n : pc.gray(`missing: ${status.missing.join(', ')}`);\n console.log(` ${icon} ${name} ${detail}`);\n }\n console.log();\n });\n\n// ─── login / logout ──────────────────────────────────────────────────────────\n\nprogram\n .command('login')\n .description('Authenticate with ComputeSDK')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n });\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(() => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n });\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildCreateOptions(opts: { timeout?: string; name?: string }) {\n const options: Record<string, unknown> = {};\n if (opts.timeout) {\n options.timeout = parseDuration(opts.timeout);\n }\n if (opts.name) {\n options.name = opts.name;\n }\n return options;\n}\n\nexport function shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildExecCommand(\n command: string[],\n opts: { env?: string[]; workdir?: string },\n): string {\n let cmd = command.map(shellEscape).join(' ');\n\n // Prepend cd if workdir is specified\n if (opts.workdir) {\n cmd = `cd ${shellEscape(opts.workdir)} && ${cmd}`;\n }\n\n // Prepend env vars if specified\n if (opts.env && opts.env.length > 0) {\n const envPrefix = opts.env\n .map((entry) => {\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid environment entry \"${entry}\". Expected format KEY=VALUE.`,\n );\n }\n const key = entry.slice(0, eqIndex);\n const val = entry.slice(eqIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(\n `Invalid environment variable name \"${key}\" in entry \"${entry}\".`,\n );\n }\n return `${key}=${shellEscape(val)}`;\n })\n .join(' ');\n cmd = `${envPrefix} ${cmd}`;\n }\n\n return cmd;\n}\n\n/**\n * Parse a human-friendly duration string to milliseconds.\n * Supports: 30s, 5m, 1h, 2h30m\n */\nfunction parseDuration(input: string): number {\n let total = 0;\n const pattern = /(\\d+)\\s*(s|m|h)/gi;\n let match;\n\n while ((match = pattern.exec(input)) !== null) {\n const value = parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n switch (unit) {\n case 's': total += value * 1000; break;\n case 'm': total += value * 60 * 1000; break;\n case 'h': total += value * 60 * 60 * 1000; break;\n }\n }\n\n if (total === 0) {\n // Try as plain number (seconds)\n const num = parseInt(input, 10);\n if (!isNaN(num)) return num * 1000;\n throw new Error(`Invalid duration: ${input}. Use formats like 30s, 5m, 1h`);\n }\n\n return total;\n}\n\n// ─── Run ─────────────────────────────────────────────────────────────────────\n\nprogram.parseAsync(process.argv).catch((error) => {\n console.error(pc.red(`\\nError: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Provider detection and validation\n */\n\nimport {\n PROVIDER_NAMES,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n type ProviderName,\n} from 'computesdk';\n\n// Providers that need additional credentials beyond COMPUTESDK_API_KEY\nconst PROVIDERS_NEEDING_CREDS = [\n 'e2b',\n 'railway',\n 'modal',\n 'vercel',\n 'daytona',\n 'render',\n 'namespace',\n 'blaxel',\n 'codesandbox',\n];\n\n/**\n * Provider status info\n */\nexport interface ProviderStatus {\n name: string;\n ready: boolean;\n missing: string[];\n}\n\n/**\n * Detect all available providers from environment variables\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function detectAvailableProviders(): string[] {\n const available: string[] = [];\n\n // Check for computesdk first (ComputeSDK native - just needs gateway key)\n if (process.env.COMPUTESDK_API_KEY) {\n available.push('computesdk');\n }\n\n // Then check for individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (PROVIDERS_NEEDING_CREDS.includes(provider as string) && isProviderAuthComplete(provider)) {\n available.push(provider);\n }\n }\n\n return available;\n}\n\n/**\n * Get status of all providers\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function getProviderStatus(): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n // Add computesdk status (ComputeSDK native)\n const hasGatewayKey = !!process.env.COMPUTESDK_API_KEY;\n statuses.push({\n name: 'computesdk',\n ready: hasGatewayKey,\n missing: hasGatewayKey ? [] : ['COMPUTESDK_API_KEY'],\n });\n\n // Add individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (PROVIDERS_NEEDING_CREDS.includes(provider as string)) {\n statuses.push({\n name: provider,\n ready: isProviderAuthComplete(provider),\n missing: getMissingEnvVars(provider),\n });\n }\n }\n\n return statuses;\n}\n\n/**\n * Check if gateway mode is available\n */\nexport function isGatewayAvailable(): boolean {\n return !!process.env.COMPUTESDK_API_KEY;\n}\n\n/**\n * Build the full compute config for a provider from env vars\n */\nexport function buildProviderConfig(provider: string): Record<string, unknown> {\n const config: Record<string, unknown> = {\n provider,\n apiKey: process.env.COMPUTESDK_API_KEY, // Gateway API key (top-level)\n };\n\n // For 'computesdk' provider, nest the API key under the provider config too\n if (provider === 'computesdk') {\n config.computesdk = {\n computesdk_api_key: process.env.COMPUTESDK_API_KEY,\n };\n }\n\n // Add provider-specific config from env vars (for other providers)\n if (provider !== 'computesdk') {\n const providerConfig = getProviderConfigFromEnv(provider as ProviderName);\n if (Object.keys(providerConfig).length > 0) {\n config[provider] = providerConfig;\n }\n }\n\n return config;\n}\n","/**\n * Browser-based CLI authentication flow\n *\n * Precedence: env var > stored credentials > browser auth flow\n */\n\nimport * as http from 'node:http';\nimport * as crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\n\nfunction getCredentialsDir(): string {\n return path.join(os.homedir(), '.computesdk');\n}\n\nfunction getCredentialsFile(): string {\n return path.join(getCredentialsDir(), 'credentials.json');\n}\n\nconst AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst CONSOLE_AUTH_URL = 'https://console.computesdk.com/cli/auth';\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html>\n<head><title>ComputeSDK CLI</title></head>\n<body style=\"font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1>Authenticated</h1>\n <p>You can close this tab and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n\n/**\n * Load stored credentials from ~/.computesdk/credentials.json.\n * Returns the API key if found and valid, or null.\n */\nexport function loadStoredCredentials(): string | null {\n try {\n if (!fs.existsSync(getCredentialsFile())) {\n return null;\n }\n const raw = fs.readFileSync(getCredentialsFile(), 'utf-8');\n const data = JSON.parse(raw);\n if (typeof data.apiKey === 'string' && data.apiKey.length > 0) {\n return data.apiKey;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Store credentials to ~/.computesdk/credentials.json.\n * Creates ~/.computesdk/ directory if it doesn't exist.\n */\nexport function storeCredentials(apiKey: string): void {\n if (!fs.existsSync(getCredentialsDir())) {\n fs.mkdirSync(getCredentialsDir(), { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(\n getCredentialsFile(),\n JSON.stringify({ apiKey }, null, 2) + '\\n',\n { mode: 0o600 }\n );\n}\n\n/**\n * Delete stored credentials file.\n */\nexport function clearStoredCredentials(): void {\n try {\n if (fs.existsSync(getCredentialsFile())) {\n fs.unlinkSync(getCredentialsFile());\n }\n } catch {\n // Ignore - file may not exist or may not be writable\n }\n}\n\n/**\n * Open a URL in the user's default browser.\n * Falls back to printing the URL if the browser fails to open.\n */\nfunction openBrowser(url: string): void {\n const command =\n process.platform === 'darwin'\n ? `open \"${url}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(command, (err) => {\n if (err) {\n p.log.warn('Could not open browser automatically.');\n p.log.info(`Open this URL manually:\\n ${pc.cyan(url)}`);\n }\n });\n}\n\nexport interface AuthFlowOptions {\n /** Override timeout for tests */\n timeoutMs?: number;\n /** Callback when server is listening (for tests) */\n onServerReady?: (port: number, state: string) => void;\n /** Skip opening browser (for tests) */\n skipBrowserOpen?: boolean;\n}\n\n/**\n * Run the browser-based authentication flow.\n *\n * 1. Start a local HTTP server on a random port\n * 2. Open browser to console.computesdk.com/cli/auth\n * 3. Wait for callback with token and validated state\n * 4. Return the API key\n */\nexport function runBrowserAuthFlow(options?: AuthFlowOptions): Promise<string> {\n const timeoutMs = options?.timeoutMs ?? AUTH_TIMEOUT_MS;\n const state = crypto.randomBytes(32).toString('hex');\n\n return new Promise<string>((resolve, reject) => {\n const server = http.createServer();\n\n const timeout = setTimeout(() => {\n server.close();\n reject(\n new Error('Authentication timed out after 5 minutes. Please try again.')\n );\n }, timeoutMs);\n\n server.on('request', (req, res) => {\n const url = new URL(req.url || '/', 'http://localhost');\n\n if (req.method !== 'GET' || url.pathname !== '/callback') {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n return;\n }\n\n const receivedState = url.searchParams.get('state');\n const token = url.searchParams.get('token');\n\n if (receivedState !== state) {\n res.writeHead(403, { 'Content-Type': 'text/plain' });\n res.end('Error: State mismatch. Please try authenticating again.');\n return;\n }\n\n if (!token) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Error: No token received.');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n\n clearTimeout(timeout);\n server.close();\n resolve(token);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n if (!addr || typeof addr === 'string') {\n clearTimeout(timeout);\n server.close();\n reject(new Error('Failed to start auth server'));\n return;\n }\n\n const port = addr.port;\n const authUrl = `${CONSOLE_AUTH_URL}?port=${port}&state=${state}`;\n\n if (options?.onServerReady) {\n options.onServerReady(port, state);\n }\n\n if (!options?.skipBrowserOpen) {\n openBrowser(authUrl);\n }\n });\n\n server.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`Auth server error: ${err.message}`));\n });\n });\n}\n\n/**\n * Resolve an API key through the precedence chain:\n * env var > stored credentials > browser auth flow\n */\nexport async function resolveApiKey(options?: {\n forceLogin?: boolean;\n}): Promise<string> {\n // 1. Check environment variable (highest precedence)\n if (process.env.COMPUTESDK_API_KEY) {\n return process.env.COMPUTESDK_API_KEY;\n }\n\n // 2. Check stored credentials (skip if forcing re-auth)\n if (!options?.forceLogin) {\n const stored = loadStoredCredentials();\n if (stored) {\n p.log.info(\n `Using stored credentials from ${pc.dim('~/.computesdk/credentials.json')}`\n );\n return stored;\n }\n }\n\n // 3. Run browser auth flow\n p.log.info('No API key found. Starting browser authentication...');\n\n const spinner = p.spinner();\n spinner.start('Waiting for browser authentication...');\n\n try {\n const apiKey = await runBrowserAuthFlow();\n spinner.stop('Authentication successful');\n\n // Store for next time\n try {\n storeCredentials(apiKey);\n p.log.success(\n `Credentials saved to ${pc.dim('~/.computesdk/credentials.json')}`\n );\n } catch {\n p.log.warn('Could not save credentials to disk. You may need to authenticate again next time.');\n }\n\n return apiKey;\n } catch (error) {\n spinner.stop(pc.red('Authentication failed'));\n throw error;\n }\n}\n","/**\n * Shared setup logic for CLI commands\n *\n * Resolves authentication and configures the compute client\n * for a given provider. Used by both subcommands and the REPL.\n */\n\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { compute } from 'computesdk';\nimport { detectAvailableProviders, getProviderStatus, buildProviderConfig, type ProviderStatus } from './providers.js';\nimport { resolveApiKey } from './auth.js';\n\n/**\n * Authenticate and set COMPUTESDK_API_KEY in the environment.\n * Exits the process on failure.\n */\nexport async function ensureAuth(options?: { forceLogin?: boolean }): Promise<void> {\n try {\n const apiKey = await resolveApiKey({ forceLogin: options?.forceLogin });\n process.env.COMPUTESDK_API_KEY = apiKey;\n } catch (error) {\n p.log.error((error as Error).message);\n p.log.info(`Get your API key at ${pc.cyan('https://console.computesdk.com')}`);\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n}\n\n/**\n * Resolve which provider to use.\n *\n * If `--provider` is given, validates it's configured and returns it.\n * If `interactive` is true and multiple providers are available, prompts user.\n * In non-interactive mode, requires `--provider` when multiple are configured.\n * Exits the process if no providers are available.\n */\nexport async function resolveProvider(\n providerFlag?: string,\n options?: { interactive?: boolean },\n): Promise<string> {\n const interactive = options?.interactive ?? false;\n const available = detectAvailableProviders();\n const providerStatus = getProviderStatus();\n\n if (providerFlag) {\n const match = providerStatus.find(\n (s: ProviderStatus) => s.name.toLowerCase() === providerFlag.toLowerCase(),\n );\n\n if (!match) {\n p.log.error(`Unknown provider: ${providerFlag}`);\n p.log.info(`Available providers: ${providerStatus.map((s: ProviderStatus) => s.name).join(', ')}`);\n process.exit(1);\n }\n\n if (!match.ready) {\n p.log.error(`Provider ${providerFlag} is not configured`);\n if (match.missing.length > 0) {\n p.log.info(`Missing env vars: ${match.missing.join(', ')}`);\n }\n process.exit(1);\n }\n\n return match.name;\n }\n\n if (available.length === 0) {\n p.log.error('No provider credentials detected');\n p.log.info('Set one of: E2B_API_KEY, MODAL_TOKEN_ID, RAILWAY_API_KEY, etc.');\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n\n // Single provider — no ambiguity\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple providers — interactive mode can prompt, non-interactive must fail\n if (!interactive) {\n p.log.error('Multiple providers configured. Use --provider to specify one.');\n p.log.info(`Available: ${available.join(', ')}`);\n process.exit(1);\n }\n\n const providerOptions = providerStatus\n .filter((status: ProviderStatus) => status.ready)\n .map((status: ProviderStatus) => ({\n value: status.name,\n label: status.name,\n }));\n\n const provider = await p.select({\n message: 'Select provider',\n options: providerOptions,\n });\n\n if (p.isCancel(provider)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n return provider as string;\n}\n\n/**\n * Configure the compute client for a provider.\n * Must be called after ensureAuth().\n */\nexport function configureCompute(provider: string): void {\n const config = buildProviderConfig(provider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compute.setConfig(config as any);\n}\n"],"mappings":"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","names":["path","compute","fs","path","os","p","pc","sandbox","spinner","p","pc","readFileSync","fileURLToPath","dirname","join","compute","fs","path","os","pc","spinner","p","pc","compute","pc","compute","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc","spinner","compute","saveSandbox","loadState","saveState","shellEscape"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/cli",
3
- "version": "0.1.2",
3
+ "version": "1.0.0",
4
4
  "description": "ComputeSDK CLI - Cloud-native workspace management",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  "commander": "^11.1.0",
35
35
  "picocolors": "^1.0.0",
36
36
  "dotenv": "^16.4.5",
37
- "computesdk": "2.6.0"
37
+ "computesdk": "3.0.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^20.0.0",