@computesdk/workbench 3.1.3 → 3.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/workbench.js +4 -5
- package/dist/bin/workbench.js.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
package/dist/bin/workbench.js
CHANGED
|
@@ -1097,7 +1097,6 @@ function injectCmdContext(replServer) {
|
|
|
1097
1097
|
replServer.context.sha256sum = cmd.sha256sum;
|
|
1098
1098
|
replServer.context.sha1sum = cmd.sha1sum;
|
|
1099
1099
|
replServer.context.compute = cmd.compute;
|
|
1100
|
-
replServer.context.cmd = cmd.cmd;
|
|
1101
1100
|
replServer.context.shell = cmd.shell;
|
|
1102
1101
|
replServer.context.sh = cmd.sh;
|
|
1103
1102
|
replServer.context.bash = cmd.bash;
|
|
@@ -1372,8 +1371,8 @@ function injectWorkbenchCommands(replServer, state) {
|
|
|
1372
1371
|
function setupSmartEvaluator(replServer, state) {
|
|
1373
1372
|
const originalEval = replServer.eval;
|
|
1374
1373
|
const workbenchCommands = /* @__PURE__ */ new Set(["help", "providers", "info", "env", "restart", "destroy", "mode", "verbose", "sandboxInfo", "connect"]);
|
|
1375
|
-
replServer.eval = function(
|
|
1376
|
-
const trimmedCmd =
|
|
1374
|
+
replServer.eval = function(cmd2, context, filename, callback) {
|
|
1375
|
+
const trimmedCmd = cmd2.trim();
|
|
1377
1376
|
const providerMatch = trimmedCmd.match(/^provider(?:\s+(direct|gateway))?\s+(\w+)$/);
|
|
1378
1377
|
if (providerMatch) {
|
|
1379
1378
|
const mode = providerMatch[1] || null;
|
|
@@ -1407,7 +1406,7 @@ function setupSmartEvaluator(replServer, state) {
|
|
|
1407
1406
|
runCommand(state, command).then((output) => callback(null, output)).catch((error) => callback(error, void 0));
|
|
1408
1407
|
return;
|
|
1409
1408
|
}
|
|
1410
|
-
originalEval.call(this,
|
|
1409
|
+
originalEval.call(this, cmd2, context, filename, async (err, result) => {
|
|
1411
1410
|
if (err) {
|
|
1412
1411
|
callback(err, void 0);
|
|
1413
1412
|
return;
|
|
@@ -1472,7 +1471,7 @@ function setupAutocomplete(replServer, state) {
|
|
|
1472
1471
|
const trimmed = line.trim();
|
|
1473
1472
|
if (!line.includes(" ") && !line.includes(".")) {
|
|
1474
1473
|
const commands = Object.keys(workbenchCommands);
|
|
1475
|
-
const hits = commands.filter((
|
|
1474
|
+
const hits = commands.filter((cmd2) => cmd2.startsWith(trimmed));
|
|
1476
1475
|
if (originalCompleter) {
|
|
1477
1476
|
originalCompleter.call(replServer, line, (err, result) => {
|
|
1478
1477
|
if (err || !result) {
|
|
@@ -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.0/node_modules/tsup/assets/esm_shims.js","../../src/cli/state.ts","../../src/cli/output.ts","../../src/cli/providers.ts","../../src/cli/commands.ts","../../src/bin/workbench.ts","../../src/cli/index.ts","../../src/cli/repl.ts","../../src/cli/types.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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox } from 'computesdk';\nimport type { ProviderSandbox } from '@computesdk/provider';\nimport type { REPLServer } from 'repl';\n\n/** Sandbox can be either client Sandbox (gateway mode) or ProviderSandbox (direct mode) */\ntype WorkbenchSandbox = Sandbox | ProviderSandbox;\n\n/**\n * Workbench session state\n */\nexport interface WorkbenchState {\n /** Currently active provider (e2b, railway, etc.) */\n currentProvider: string | null;\n\n /** Current sandbox instance */\n currentSandbox: WorkbenchSandbox | null;\n \n /** When the current sandbox was created */\n sandboxCreatedAt: Date | null;\n \n /** List of providers detected from environment */\n availableProviders: string[];\n \n /** Whether to use direct mode (true) or gateway mode (false, default) */\n useDirectMode: boolean;\n \n /** Show verbose command output (full result object) */\n verbose: boolean;\n \n /** Compute instance (for creating named sandboxes, etc.) */\n compute: any | null;\n \n /** Internal: REPL server reference for updating prompt */\n _replServer?: REPLServer;\n}\n\n/**\n * Create initial workbench state\n */\nexport function createState(): WorkbenchState {\n return {\n currentProvider: null,\n currentSandbox: null,\n sandboxCreatedAt: null,\n availableProviders: [],\n useDirectMode: false, // Default to gateway mode\n verbose: false,\n compute: null,\n };\n}\n\n/**\n * Get current sandbox, throwing if none exists\n */\nexport function getCurrentSandbox(state: WorkbenchState): WorkbenchSandbox {\n if (!state.currentSandbox) {\n throw new Error('No active sandbox');\n }\n return state.currentSandbox;\n}\n\n/**\n * Set current sandbox\n */\nexport function setSandbox(state: WorkbenchState, sandbox: WorkbenchSandbox, provider: string) {\n state.currentSandbox = sandbox;\n state.currentProvider = provider;\n state.sandboxCreatedAt = new Date();\n updatePromptIfNeeded(state);\n}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\n updatePromptIfNeeded(state);\n}\n\n/**\n * Update REPL prompt if replServer is available\n * @internal\n */\nfunction updatePromptIfNeeded(state: WorkbenchState) {\n if (state._replServer) {\n const prompt = getPrompt(state);\n state._replServer.setPrompt(prompt);\n }\n}\n\n/**\n * Get prompt string based on current state\n * @internal\n */\nfunction getPrompt(state: WorkbenchState): string {\n if (!state.currentSandbox) {\n return '> ';\n }\n \n const provider = state.currentProvider || 'unknown';\n const sandboxId = state.currentSandbox.sandboxId || '';\n\n // Use full sandbox ID for now\n // User can see exactly which sandbox they're connected to\n return `${provider}:${sandboxId}> `;\n}\n\n/**\n * Check if a sandbox is currently active\n */\nexport function hasSandbox(state: WorkbenchState): boolean {\n return state.currentSandbox !== null;\n}\n\n/**\n * Get sandbox uptime in seconds\n */\nexport function getUptimeSeconds(state: WorkbenchState): number {\n if (!state.sandboxCreatedAt) return 0;\n return Math.floor((Date.now() - state.sandboxCreatedAt.getTime()) / 1000);\n}\n\n/**\n * Format uptime as human-readable string\n */\nexport function formatUptime(state: WorkbenchState): string {\n const seconds = getUptimeSeconds(state);\n \n if (seconds < 60) {\n return `${seconds} second${seconds === 1 ? '' : 's'}`;\n }\n \n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? '' : 's'}`;\n }\n \n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n","/**\n * Output formatting utilities\n * \n * Provides consistent, colorful output for workbench\n */\n\nimport type { WorkbenchState } from './state.js';\nimport { formatUptime } from './state.js';\n\n/**\n * ANSI color codes (simple, no dependencies for now)\n */\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n \n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n};\n\n/**\n * Color helpers\n */\nexport const c = {\n bold: (text: string) => `${colors.bright}${text}${colors.reset}`,\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\n blue: (text: string) => `${colors.blue}${text}${colors.reset}`,\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\n};\n\n/**\n * Display welcome banner\n */\nexport function showWelcome(availableProviders: string[], currentProvider: string | null, useDirectMode: boolean) {\n console.log(c.bold(c.cyan('\\n╔═══════════════════════════════════════════════════════╗')));\n console.log(c.bold(c.cyan('║ ComputeSDK Workbench ║')));\n console.log(c.bold(c.cyan('╚═══════════════════════════════════════════════════════╝\\n')));\n console.log(c.dim('Prompt shows connection status: > (disconnected) or provider:sandbox> (connected)\\n'));\n \n if (availableProviders.length > 0) {\n // Filter out 'gateway' from the list since it's not a real backend provider\n const backendProviders = availableProviders.filter(p => p !== 'gateway');\n console.log(`Providers available: ${backendProviders.join(', ')}`);\n \n if (currentProvider) {\n if (useDirectMode) {\n console.log(`Current provider: ${c.green(currentProvider)} (🔗 direct mode)\\n`);\n } else {\n // Gateway mode - show which backend will be used\n const backendProvider = currentProvider === 'gateway' \n ? (backendProviders[0] || 'auto')\n : currentProvider;\n console.log(`Current provider: ${c.green(backendProvider)} (🌐 via gateway)\\n`);\n }\n } else {\n console.log(`\\n${c.dim('Tip: Use \"provider <name>\" to select a provider')}\\n`);\n }\n } else {\n console.log(c.yellow('⚠️ No providers detected.\\n'));\n console.log('To get started:');\n console.log(' 1. Copy .env.example to .env');\n console.log(' 2. Add your provider credentials');\n console.log(' 3. Restart workbench\\n');\n console.log(c.dim('Type \"env\" to see required environment variables\\n'));\n }\n \n console.log(c.dim('Type \"help\" for available commands\\n'));\n}\n\n\n\n/**\n * Display sandbox info\n */\nexport function showInfo(state: WorkbenchState) {\n if (!state.currentSandbox) {\n console.log(c.yellow('\\nNo active sandbox\\n'));\n return;\n }\n \n console.log('\\n' + c.bold('Current Sandbox:'));\n \n // Show sandbox ID if available\n if (state.currentSandbox.sandboxId) {\n console.log(` Sandbox ID: ${c.cyan(state.currentSandbox.sandboxId)}`);\n }\n \n console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\n \n // Show connection mode (gateway or direct)\n const modeLabel = state.useDirectMode ? 'direct 🔗' : 'gateway 🌐';\n console.log(` Mode: ${c.blue(modeLabel)}`);\n \n console.log(` Created: ${state.sandboxCreatedAt?.toLocaleString() || 'unknown'}`);\n console.log(` Uptime: ${formatUptime(state)}`);\n console.log('');\n}\n\n/**\n * Simple spinner class (no external deps)\n */\nexport class Spinner {\n private interval: NodeJS.Timeout | null = null;\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private currentFrame = 0;\n private text: string;\n \n constructor(text: string) {\n this.text = text;\n }\n \n start(): this {\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.interval = setInterval(() => {\n const frame = this.frames[this.currentFrame];\n process.stdout.write(`\\r${c.cyan(frame)} ${this.text}`);\n this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n }, 80);\n return this;\n }\n \n succeed(text?: string): void {\n this.stop();\n console.log(`${c.green('✅')} ${text || this.text}`);\n }\n \n fail(text?: string): void {\n this.stop();\n console.log(`${c.red('❌')} ${text || this.text}`);\n }\n \n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Show cursor\n }\n}\n\n/**\n * Format duration in seconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n const seconds = ms / 1000;\n if (seconds < 1) {\n return `${ms}ms`;\n }\n return `${seconds.toFixed(1)}s`;\n}\n\n/**\n * Log command being run\n */\nexport function logCommand(command: string[]) {\n console.log(c.dim(`Running: ${command.join(' ')}`));\n}\n\n/**\n * Log success\n */\nexport function logSuccess(message: string, duration?: number) {\n const durationStr = duration ? ` (${formatDuration(duration)})` : '';\n console.log(c.green(`✅ ${message}${durationStr}`));\n}\n\n/**\n * Display help text\n */\nexport function showHelp() {\n console.log(`\n${c.bold('ComputeSDK Workbench Commands')}\n\n${c.bold('Provider Management:')}\n ${c.cyan('provider <name>')} Switch to provider via gateway (default)\n ${c.dim('Example: provider e2b')}\n ${c.cyan('provider direct <name>')} Connect directly to provider\n ${c.dim('Example: provider direct e2b')}\n ${c.cyan('providers')} List all providers with status\n ${c.cyan('mode <gateway|direct>')} Toggle default mode for next sandbox\n\n${c.bold('Provider Modes:')}\n ${c.bold('Gateway (default)')}: Routes through ComputeSDK API, zero-config\n • Requires: COMPUTESDK_API_KEY + provider credentials\n • Usage: ${c.cyan('provider e2b')}\n \n ${c.bold('Direct')}: Connects directly to provider, requires packages\n • Requires: Provider package installed + credentials\n • Usage: ${c.cyan('provider direct e2b')}\n\n${c.bold('Sandbox Management:')}\n ${c.cyan('restart')} Restart current sandbox\n ${c.cyan('destroy')} Destroy current sandbox\n ${c.cyan('connect <url> [token]')} Connect to existing sandbox via URL\n ${c.dim('Example: connect https://sandbox-123.localhost:8080')}\n ${c.dim('Example: connect https://sandbox-123.localhost:8080 your_token')}\n ${c.cyan('info')} Show sandbox info (provider, uptime)\n\n${c.bold('Environment:')}\n ${c.cyan('env')} Show environment/credentials status\n ${c.cyan('verbose')} Toggle verbose output mode\n\n${c.bold('Help:')}\n ${c.cyan('help')} Show this help message\n ${c.cyan('exit')} or ${c.cyan('.exit')} Exit workbench\n\n${c.bold('Running Commands:')}\n Type any @computesdk/cmd function and it will run automatically:\n \n ${c.dim('Package Managers:')}\n ${c.cyan('npm.install(\"express\")')}\n ${c.cyan('pip.install(\"requests\")')}\n \n ${c.dim('Git:')}\n ${c.cyan('git.clone(\"https://github.com/user/repo\")')}\n ${c.cyan('git.status()')}\n \n ${c.dim('Filesystem (via commands):')}\n ${c.cyan('ls(\"/home\")')}\n ${c.cyan('cat(\"/etc/hosts\")')}\n ${c.cyan('rm.rf(\"/tmp\")')} ${c.dim('// Force remove')}\n ${c.cyan('rm.auto(\"/path\")')} ${c.dim('// Smart remove')}\n \n ${c.dim('Filesystem (direct API):')}\n ${c.cyan('filesystem.readFile(\"/etc/hosts\")')}\n ${c.cyan('filesystem.writeFile(\"/app/server.js\", code)')}\n ${c.cyan('filesystem.mkdir(\"/app\")')}\n ${c.cyan('filesystem.readdir(\"/home\")')}\n ${c.cyan('filesystem.exists(\"/path\")')}\n ${c.cyan('filesystem.remove(\"/file\")')}\n \n ${c.dim('Named Sandboxes (gateway mode only):')}\n ${c.cyan('create()')} ${c.dim('// Create & switch to new sandbox')}\n ${c.cyan('create({ namespace: \"h\" })')} ${c.dim('// Create with namespace & switch')}\n ${c.cyan('findOrCreate({ name: \"my-app\" })')} ${c.dim('// Find or create & switch')}\n ${c.cyan('find({ name: \"my-app\" })')} ${c.dim('// Find existing & switch')}\n \n ${c.dim('Note: Prompts before switching if you already have an active sandbox')}\n \n ${c.dim('Child Sandboxes (gateway mode only):')}\n ${c.cyan('child.create()')} ${c.dim('// Create child sandbox')}\n ${c.cyan('child.list()')} ${c.dim('// List all children')}\n ${c.cyan('child.retrieve(\"sandbox-id\")')} ${c.dim('// Get child info')}\n ${c.cyan('child.destroy(\"sandbox-id\")')} ${c.dim('// Delete child')}\n \n ${c.dim('Sandbox Methods:')}\n ${c.cyan('getUrl({ port: 3000 })')} ${c.dim('// Get public URL')}\n ${c.cyan('runCode(\"console.log(\\'hi\\')\", \"node\")')}\n ${c.cyan('sandboxInfo()')} ${c.dim('// Get sandbox details')}\n ${c.cyan('getInstance()')} ${c.dim('// Get native instance')}\n \n ${c.dim('Note: No need to use \"await\" - promises are auto-awaited!')}\n \n ${c.dim('Compute CLI:')}\n ${c.cyan('compute.isSetup()')} ${c.dim('// Check if daemon is running')}\n ${c.cyan('compute.setup()')} ${c.dim('// Install + start daemon')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute CLI')}\n ${c.cyan('compute.start()')} ${c.dim('// Start daemon')}\n ${c.cyan('compute.health()')} ${c.dim('// Check daemon health')}\n\n${c.bold('Shell Commands:')}\n Use ${c.cyan('$')} prefix to run any shell command directly:\n ${c.cyan('$ls -la /app')}\n ${c.cyan('$npm install express')}\n ${c.cyan('$git status')}\n ${c.cyan('$compute --help')}\n\n${c.bold('Background Execution:')}\n ${c.cyan('sh(\"npm start\", { background: true })')}\n ${c.cyan('sh(\"python -m http.server 8000\", { background: true })')}\n\n${c.dim('Press Tab for autocomplete on all commands!')}\n`);\n}\n\n/**\n * Log error\n */\nexport function logError(message: string) {\n console.log(c.red(`❌ ${message}`));\n}\n\n/**\n * Log warning\n */\nexport function logWarning(message: string) {\n console.log(c.yellow(`⚠️ ${message}`));\n}\n\n/**\n * Log info\n */\nexport function logInfo(message: string) {\n console.log(c.blue(`ℹ️ ${message}`));\n}\n","/**\n * Provider detection and management for workbench\n *\n * Uses shared provider config from computesdk as single source of truth\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\nimport {\n PROVIDER_AUTH as SHARED_PROVIDER_AUTH,\n PROVIDER_NAMES as SHARED_PROVIDER_NAMES,\n PROVIDER_ENV_MAP,\n type ProviderName as SharedProviderName,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n} from 'computesdk';\n\n/**\n * Workbench-specific provider names (includes gateway)\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n ...SHARED_PROVIDER_NAMES,\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Auth requirements for each provider\n * Extends shared config with gateway-specific auth\n */\nexport const PROVIDER_AUTH: Record<ProviderName, readonly (readonly string[])[]> = {\n gateway: [['COMPUTESDK_API_KEY']],\n ...SHARED_PROVIDER_AUTH,\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n const authOptions = PROVIDER_AUTH[provider];\n\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...authOptions[0]],\n };\n }\n\n // Build a set of all present env vars (checked once per unique var)\n const allVars = new Set(authOptions.flat());\n const presentSet = new Set<string>();\n for (const v of allVars) {\n if (process.env?.[v]) presentSet.add(v);\n }\n\n // Evaluate each auth option in a single pass\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const v of option) {\n if (presentSet.has(v)) {\n presentCount++;\n } else {\n missing.push(v);\n }\n }\n\n // If all vars present, this option is satisfied\n if (missing.length === 0) {\n return {\n name: provider,\n isComplete: true,\n present: [...presentSet],\n missing: [],\n };\n }\n\n // Track the option closest to completion\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return {\n name: provider,\n isComplete: false,\n present: [...presentSet],\n missing: bestOption?.missing ?? [],\n };\n}\n\n/**\n * Get all available (fully configured) providers\n */\nexport function getAvailableProviders(): string[] {\n return PROVIDER_NAMES.filter(provider => {\n const status = getProviderStatus(provider);\n return status.isComplete;\n });\n}\n\n/**\n * Display all providers with their status\n */\nexport function showProviders() {\n console.log('\\n' + c.bold('Provider Status:'));\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} ${provider} - Ready`);\n } else if (status.present.length > 0) {\n const ratio = `${status.present.length}/${status.present.length + status.missing.length}`;\n console.log(` ${c.yellow('⚠️ ')} ${provider} - Incomplete (${ratio} credentials)`);\n console.log(` ${c.dim('Missing:')} ${status.missing.join(', ')}`);\n } else {\n console.log(` ${c.dim('❌')} ${c.dim(provider)} - Not configured`);\n }\n }\n\n console.log('');\n}\n\n/**\n * Display environment status with helpful setup instructions\n */\nexport function showEnv() {\n console.log('\\n' + c.bold('Environment Configuration:'));\n console.log('');\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n console.log(c.bold(`${provider}:`));\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} All credentials present`);\n status.present.forEach(varName => {\n console.log(` ${c.dim('•')} ${varName}`);\n });\n } else {\n if (status.present.length > 0) {\n console.log(c.dim(' Present:'));\n status.present.forEach(varName => {\n console.log(` ${c.green('✓')} ${varName}`);\n });\n }\n\n if (status.missing.length > 0) {\n console.log(c.dim(' Missing:'));\n status.missing.forEach(varName => {\n console.log(` ${c.red('✗')} ${varName}`);\n });\n }\n }\n\n console.log('');\n }\n\n console.log(c.dim('Tip: Set credentials in your .env file'));\n console.log('');\n}\n\n/**\n * Auto-detect best provider to use\n */\nexport function autoDetectProvider(forceGatewayMode = false): string | null {\n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && isValidProvider(explicit) && isProviderReady(explicit)) {\n return explicit;\n }\n\n // If forcing gateway mode, only return gateway if available\n if (forceGatewayMode) {\n return isProviderReady('gateway') ? 'gateway' : null;\n }\n\n // Auto-detect based on priority order\n for (const provider of PROVIDER_NAMES) {\n if (isProviderReady(provider)) {\n return provider;\n }\n }\n\n return null;\n}\n\n/**\n * Validate that a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return PROVIDER_NAMES.includes(name as ProviderName);\n}\n\n/**\n * Check if provider is fully configured\n */\nexport function isProviderReady(provider: string): boolean {\n if (!isValidProvider(provider)) return false;\n const status = getProviderStatus(provider);\n return status.isComplete;\n}\n\n/**\n * Get helpful error message for unconfigured provider\n */\nexport function getProviderSetupHelp(provider: string): string {\n if (!isValidProvider(provider)) {\n return `Unknown provider: ${provider}\\nAvailable: ${PROVIDER_NAMES.join(', ')}`;\n }\n\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n return `Provider ${provider} is already configured`;\n }\n\n const lines = [\n `Provider ${provider} requires these environment variables:`,\n '',\n ...status.missing.map(varName => ` ${varName}`),\n '',\n 'Add them to your .env file or export them in your shell.',\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Dynamically import a provider package\n */\nexport async function loadProvider(providerName: ProviderName): Promise<any> {\n try {\n switch (providerName) {\n case 'gateway':\n // Gateway is built into computesdk package\n return await import('computesdk');\n case 'e2b':\n return await import('@computesdk/e2b');\n case 'railway':\n return await import('@computesdk/railway');\n case 'daytona':\n return await import('@computesdk/daytona');\n case 'modal':\n return await import('@computesdk/modal');\n case 'runloop':\n return await import('@computesdk/runloop');\n case 'vercel':\n return await import('@computesdk/vercel');\n case 'cloudflare':\n return await import('@computesdk/cloudflare');\n case 'codesandbox':\n return await import('@computesdk/codesandbox');\n case 'blaxel':\n return await import('@computesdk/blaxel');\n default:\n throw new Error(`Unknown provider: ${providerName}`);\n }\n } catch (error) {\n if (providerName === 'gateway') {\n throw new Error(`Failed to load gateway provider from computesdk package.`);\n }\n throw new Error(\n `Failed to load provider ${providerName}. ` +\n `Make sure to install it: npm install @computesdk/${providerName}`\n );\n }\n}\n\n/**\n * Create provider config from environment variables\n * Uses shared PROVIDER_ENV_MAP from computesdk\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n // Handle gateway separately (not in shared config)\n if (providerName === 'gateway') {\n const config: Record<string, string> = {};\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n return config;\n }\n\n // Use shared utility for other providers\n return getProviderConfigFromEnv(providerName as SharedProviderName);\n}\n","/**\n * Workbench command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from '@computesdk/provider';\nimport { escapeArgs } from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { getCurrentSandbox, setSandbox, clearSandbox, hasSandbox } from './state.js';\nimport { \n Spinner, \n logCommand, \n logSuccess, \n logError, \n logWarning,\n c,\n formatDuration,\n} from './output.js';\nimport { \n isProviderReady, \n autoDetectProvider, \n getProviderSetupHelp,\n isValidProvider,\n loadProvider,\n getProviderConfig,\n type ProviderName,\n} from './providers.js';\nimport * as readline from 'readline';\n\n/**\n * Prompt user for yes/no confirmation\n */\nasync function confirm(question: string, defaultYes = false): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n // Clear any pending input\n process.stdin.resume();\n \n const promptSuffix = defaultYes ? '(Y/n)' : '(y/N)';\n \n rl.question(`${question} ${promptSuffix}: `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n \n // If empty answer, use default\n if (trimmed === '') {\n resolve(defaultYes);\n } else {\n resolve(trimmed === 'y' || trimmed === 'yes');\n }\n });\n });\n}\n\n/**\n * Prompt user to switch sandbox if one is already active\n * Returns true if should proceed with switch\n */\nexport async function confirmSandboxSwitch(state: WorkbenchState): Promise<boolean> {\n if (!hasSandbox(state)) {\n return true; // No current sandbox, no need to confirm\n }\n \n return await confirm('Switch to new sandbox?', true); // Default YES\n}\n\n/**\n * Auto-create sandbox if none exists\n */\nexport async function ensureSandbox(state: WorkbenchState): Promise<void> {\n if (hasSandbox(state)) {\n return; // Already have a sandbox\n }\n \n await createSandbox(state);\n}\n\n/**\n * Create or get compute instance for current provider configuration\n */\nexport async function getComputeInstance(state: WorkbenchState): Promise<any> {\n // Return cached instance if available\n if (state.compute) {\n return state.compute;\n }\n \n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n throw new Error('No provider configured.');\n }\n \n let compute;\n \n if (useDirect) {\n // Direct mode: load the provider package directly\n const providerModule = await loadProvider(providerName as ProviderName);\n const providerFactory = providerModule[providerName];\n \n if (!providerFactory) {\n throw new Error(`Provider ${providerName} does not export a factory function`);\n }\n \n // Get config from environment\n const config = getProviderConfig(providerName as ProviderName);\n \n // Create compute instance with this provider\n compute = createCompute({\n defaultProvider: providerFactory(config),\n });\n } else {\n // Gateway mode: use the shared gateway compute instance from computesdk.\n // The gateway must be configured via environment variables (for example, COMPUTESDK_API_KEY)\n // or explicit configuration; if neither is provided, the gateway will throw an error.\n const { compute: gatewayCompute } = await import('computesdk');\n compute = gatewayCompute;\n }\n \n // Cache the instance\n state.compute = compute;\n return compute;\n}\n\n/**\n * Create a new sandbox using gateway or direct provider\n */\nexport async function createSandbox(state: WorkbenchState): Promise<void> {\n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n logError('No provider configured. Run \"env\" to see setup instructions.');\n throw new Error('No provider available');\n }\n \n // Determine which mode to use\n let modeLabel: string;\n let actualProviderName: string;\n \n if (useDirect) {\n // Direct mode: use the provider directly\n modeLabel = `${providerName} (direct)`;\n actualProviderName = providerName;\n \n if (!isProviderReady(providerName)) {\n logError(`Provider ${providerName} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(providerName));\n throw new Error('Provider not ready');\n }\n } else {\n // Gateway mode: use gateway with specified backend\n modeLabel = `${providerName} (via gateway)`;\n actualProviderName = 'gateway';\n \n if (!isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n throw new Error('Gateway not ready');\n }\n }\n \n const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();\n const startTime = Date.now();\n \n try {\n // Get or create compute instance\n const compute = await getComputeInstance(state);\n \n // Create sandbox\n const result = await compute.sandbox.create();\n const duration = Date.now() - startTime;\n \n setSandbox(state, result, providerName);\n spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to create sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n \n // Better error message if provider package not installed\n if (error instanceof Error && error.message.includes('Cannot find module')) {\n logError(`Provider package @computesdk/${providerName} is not installed.`);\n console.log(`\\nInstall it with: ${c.cyan(`npm install @computesdk/${providerName}`)}\\n`);\n }\n \n // Show the actual error for debugging\n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Destroy current sandbox\n */\nexport async function destroySandbox(state: WorkbenchState): Promise<void> {\n const spinner = new Spinner('Destroying sandbox...').start();\n \n try {\n const sandbox = getCurrentSandbox(state);\n await sandbox.destroy();\n clearSandbox(state);\n spinner.succeed('Destroyed');\n } catch (error) {\n spinner.fail(`Failed to destroy: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n}\n\n/**\n * Restart sandbox (destroy + create with same provider)\n */\nexport async function restartSandbox(state: WorkbenchState): Promise<void> {\n const provider = state.currentProvider;\n \n if (hasSandbox(state)) {\n await destroySandbox(state);\n }\n \n // Keep same provider\n if (provider) {\n state.currentProvider = provider;\n }\n \n await createSandbox(state);\n}\n\n/**\n * Run a command on the current sandbox\n */\nexport async function runCommand(state: WorkbenchState, command: string[]): Promise<any> {\n // Ensure we have a sandbox\n await ensureSandbox(state);\n \n const sandbox = getCurrentSandbox(state);\n const startTime = Date.now();\n \n logCommand(command);\n \n try {\n // Use escapeArgs to properly join and escape command array with spaces/special chars\n const commandString = escapeArgs(command);\n const result = await sandbox.runCommand(commandString);\n const duration = Date.now() - startTime;\n \n // Print output directly\n if (result.stdout) {\n console.log(result.stdout.trimEnd());\n }\n if (result.stderr) {\n console.error(c.red(result.stderr.trimEnd()));\n }\n \n // Show success indicator with timing and exit code info\n const exitCodeInfo = result.exitCode !== 0 ? c.yellow(` (exit ${result.exitCode})`) : '';\n logSuccess(`${c.dim(`${formatDuration(duration)}`)}${exitCodeInfo}`);\n \n // In verbose mode, return the full result object\n // Otherwise return undefined so REPL doesn't print anything\n if (state.verbose) {\n return result;\n }\n return undefined;\n } catch (error) {\n const duration = Date.now() - startTime;\n logError(`Failed ${c.dim(`(${formatDuration(duration)})`)} - ${error instanceof Error ? error.message : String(error)}`);\n\n // Clear stale sandbox on connection/auth errors so next command creates fresh\n if (isStaleConnectionError(error)) {\n clearSandbox(state);\n logWarning('Sandbox connection lost. Next command will create a new sandbox.');\n }\n\n throw error;\n }\n}\n\n/**\n * Check if an error indicates a stale/dead sandbox connection\n */\nfunction isStaleConnectionError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const message = error.message.toLowerCase();\n const stalePhrases = [\n 'websocket',\n 'connection refused',\n 'connection reset',\n 'connection closed',\n 'socket hang up',\n 'econnrefused',\n 'econnreset',\n 'etimedout',\n 'not found',\n 'sandbox not found',\n 'unauthorized',\n '401',\n '403',\n '404',\n ];\n\n return stalePhrases.some(phrase => message.includes(phrase));\n}\n\n/**\n * Switch to a different provider\n * Supports both gateway mode (default) and direct mode\n * \n * Examples:\n * provider e2b → gateway with e2b backend\n * provider direct e2b → direct connection to e2b\n */\nexport async function switchProvider(state: WorkbenchState, mode: string, providerName?: string): Promise<void> {\n // Parse the command: could be \"provider e2b\" or \"provider direct e2b\"\n let useDirect = false;\n let actualProvider = mode;\n \n if (mode === 'direct') {\n if (!providerName) {\n logError('Usage: provider direct <name>');\n console.log('Example: provider direct e2b');\n return;\n }\n useDirect = true;\n actualProvider = providerName;\n } else if (mode === 'gateway') {\n if (!providerName) {\n logError('Usage: provider gateway <name>');\n console.log('Example: provider gateway e2b');\n return;\n }\n useDirect = false;\n actualProvider = providerName;\n }\n \n // Remove 'gateway' prefix if someone types \"provider gateway\"\n if (actualProvider === 'gateway') {\n actualProvider = autoDetectProvider(false) || 'e2b';\n }\n \n // Validate provider\n if (!isValidProvider(actualProvider)) {\n logError(`Unknown provider: ${actualProvider}`);\n console.log(`Available providers: e2b, railway, daytona, modal, runloop, vercel, cloudflare, codesandbox, blaxel`);\n return;\n }\n \n // Check if gateway is configured (always needed)\n if (!useDirect && !isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n return;\n }\n \n // Check if direct provider is configured (only for direct mode)\n if (useDirect && !isProviderReady(actualProvider)) {\n logError(`Provider ${actualProvider} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(actualProvider));\n return;\n }\n \n // Prompt to destroy current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Destroy current sandbox?');\n if (shouldDestroy) {\n await destroySandbox(state);\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n } else {\n logWarning('Keeping current sandbox. Provider remains unchanged.');\n }\n } else {\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n }\n}\n\n/**\n * Create a provider command handler\n * Supports: provider e2b, provider direct e2b, provider gateway e2b\n */\nexport function defineProviderCommand(state: WorkbenchState) {\n return async function provider(mode?: string, providerName?: string) {\n if (!mode) {\n // Show current provider\n if (state.currentProvider) {\n const modeStr = state.useDirectMode ? 'direct' : 'via gateway';\n console.log(`\\nCurrent provider: ${c.green(state.currentProvider)} (${modeStr})\\n`);\n } else {\n console.log(c.yellow('\\nNo provider selected\\n'));\n }\n return;\n }\n \n await switchProvider(state, mode, providerName);\n };\n}\n\n/**\n * Toggle between gateway and direct mode\n */\nexport async function toggleMode(state: WorkbenchState, mode?: 'gateway' | 'direct'): Promise<void> {\n const newMode = mode || (state.useDirectMode ? 'gateway' : 'direct');\n \n if (newMode === 'direct') {\n state.useDirectMode = true;\n logSuccess('Switched to direct mode 🔗');\n console.log(c.dim('Next sandbox will use direct provider packages\\n'));\n \n // If we have a sandbox and it's in gateway mode, suggest restart\n if (hasSandbox(state) && !state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in gateway mode.'));\n console.log(c.dim('Run \"restart\" to switch to direct mode\\n'));\n }\n } else {\n state.useDirectMode = false;\n logSuccess('Switched to gateway mode 🌐');\n console.log(c.dim('Next sandbox will use gateway (requires COMPUTESDK_API_KEY)\\n'));\n \n // If we have a sandbox and it's in direct mode, suggest restart\n if (hasSandbox(state) && state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in direct mode.'));\n console.log(c.dim('Run \"restart\" to switch to gateway mode\\n'));\n }\n }\n}\n\n/**\n * Show current mode\n */\nexport function showMode(state: WorkbenchState): void {\n const mode = state.useDirectMode ? 'direct' : 'gateway';\n const icon = mode === 'gateway' ? '🌐' : '🔗';\n \n console.log(`\\nCurrent mode: ${c.green(mode)} ${icon}`);\n \n if (mode === 'gateway') {\n console.log(c.dim('Routes through ComputeSDK API (requires COMPUTESDK_API_KEY)'));\n } else {\n console.log(c.dim('Direct connection to providers (requires provider packages)'));\n }\n \n console.log(`\\nSwitch with: ${c.cyan('provider e2b')} (gateway) or ${c.cyan('provider direct e2b')} (direct)\\n`);\n}\n\n/**\n * Toggle verbose mode\n */\nexport function toggleVerbose(state: WorkbenchState): void {\n state.verbose = !state.verbose;\n if (state.verbose) {\n logSuccess('Verbose mode enabled - will show full command results');\n console.log(c.dim('Commands will return full result objects with metadata\\n'));\n } else {\n logSuccess('Verbose mode disabled - showing clean output only');\n console.log(c.dim('Commands will only show stdout/stderr\\n'));\n }\n}\n\n/**\n * Show verbose mode status\n */\nexport function showVerbose(state: WorkbenchState): void {\n const status = state.verbose ? c.green('enabled') : c.dim('disabled');\n console.log(`\\nVerbose mode: ${status}`);\n \n if (state.verbose) {\n console.log(c.dim('Commands return full result objects with metadata'));\n } else {\n console.log(c.dim('Commands show only stdout/stderr'));\n }\n \n console.log(`\\nToggle with: ${c.cyan('verbose')}\\n`);\n}\n\n/**\n * Connect to an existing sandbox via URL\n * Useful for connecting to a locally running sandbox or a sandbox created elsewhere\n */\nexport async function connectToSandbox(state: WorkbenchState, sandboxUrl: string, token?: string): Promise<void> {\n // Validate URL format\n if (!sandboxUrl) {\n logError('Usage: connect <sandbox_url> [token]');\n console.log('Example: connect https://sandbox-123.localhost:8080');\n console.log('Example: connect https://sandbox-123.localhost:8080 your_access_token');\n return;\n }\n \n // Clean up URL (remove trailing slash)\n const cleanUrl = sandboxUrl.replace(/\\/$/, '');\n \n // Disconnect from current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Disconnect from current sandbox?');\n if (!shouldDestroy) {\n logWarning('Keeping current sandbox. Connection cancelled.');\n return;\n }\n // Just clear the reference, don't destroy since we don't own this sandbox\n clearSandbox(state);\n }\n \n const spinner = new Spinner(`Connecting to ${cleanUrl}...`).start();\n const startTime = Date.now();\n \n try {\n // Import Sandbox class from computesdk package (client is now merged into computesdk)\n const { Sandbox } = await import('computesdk');\n \n // Dynamically import WebSocket for Node.js environment\n let WebSocket: any;\n try {\n // @ts-expect-error - ws is an optional peer dependency that may not have type declarations\n const wsModule = await import('ws');\n WebSocket = wsModule.default;\n } catch {\n logError('Failed to import \"ws\" module. Please install it: pnpm add ws');\n throw new Error('Missing \"ws\" dependency');\n }\n \n // Create a Sandbox instance directly with optional token\n // WebSocket type comes from 'ws' module which may differ from browser WebSocket\n const sandbox = new Sandbox({\n sandboxUrl: cleanUrl,\n sandboxId: '', // Will be populated when we get info\n provider: 'connected', // Mark as directly connected\n token: token, // Optional access token\n WebSocket: WebSocket as typeof globalThis.WebSocket,\n });\n\n // Test the connection by getting sandbox info\n const info = await sandbox.getInfo();\n const duration = Date.now() - startTime;\n\n // Update state with the connected sandbox\n // Sandbox from @computesdk/client is the same class re-exported by computesdk\n setSandbox(state, sandbox, 'connected');\n \n spinner.succeed(`Connected to sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n console.log(c.dim(`Provider: ${info.provider || 'unknown'}`));\n console.log(c.dim(`Sandbox ID: ${info.id || 'unknown'}`));\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to connect ${c.dim(`(${formatDuration(duration)})`)}`);\n \n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Cleanup on exit\n */\nexport async function cleanupOnExit(state: WorkbenchState, replServer?: any): Promise<void> {\n if (!hasSandbox(state)) {\n return;\n }\n \n // Pause the REPL to prevent input conflicts\n if (replServer) {\n replServer.pause();\n }\n \n console.log(''); // New line\n \n // Don't offer to destroy if we're just connected to an external sandbox\n if (state.currentProvider === 'connected') {\n logWarning('Disconnecting from external sandbox (not destroying).');\n return;\n }\n \n const shouldDestroy = await confirm('Destroy active sandbox?');\n \n if (shouldDestroy) {\n await destroySandbox(state);\n } else {\n logWarning('Sandbox left running. It may incur costs.');\n }\n \n // Resume not needed since we're exiting\n}\n","#!/usr/bin/env node\n\n/**\n * ComputeSDK Workbench CLI Entry Point\n */\n\nimport { config } from 'dotenv';\nimport { startWorkbench } from '../cli/index.js';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n// Load .env from multiple possible locations\nconst possibleEnvPaths = [\n path.join(process.cwd(), '.env'), // Current directory\n path.join(process.cwd(), '../../.env'), // Monorepo root (if running from packages/workbench)\n path.join(__dirname, '../../.env'), // Relative to this script\n];\n\n// Try to load from first existing .env file\nfor (const envPath of possibleEnvPaths) {\n if (fs.existsSync(envPath)) {\n config({ path: envPath });\n break;\n }\n}\n\n// Start workbench\nstartWorkbench().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","/**\n * ComputeSDK Workbench\n * \n * Interactive REPL for testing sandbox lifecycle operations\n */\n\nimport { createState } from './state.js';\nimport { createREPL } from './repl.js';\nimport { showWelcome } from './output.js';\nimport { getAvailableProviders, autoDetectProvider } from './providers.js';\nimport { cleanupOnExit } from './commands.js';\n\n/**\n * Start the workbench REPL\n */\nexport async function startWorkbench(): Promise<void> {\n // Create state\n const state = createState();\n \n // Detect available providers\n state.availableProviders = getAvailableProviders();\n const detectedProvider = autoDetectProvider();\n \n // Determine mode based on what's available\n const hasGateway = state.availableProviders.includes('gateway');\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n \n if (hasGateway && backendProviders.length > 0) {\n // Gateway is available - use it with first backend provider\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Use gateway mode\n } else if (backendProviders.length > 0) {\n // No gateway, but we have direct providers - use direct mode\n state.currentProvider = backendProviders[0];\n state.useDirectMode = true; // Use direct mode\n } else {\n // No providers at all\n state.currentProvider = detectedProvider;\n state.useDirectMode = false;\n }\n \n // Show welcome banner\n showWelcome(state.availableProviders, state.currentProvider, state.useDirectMode);\n \n // Create REPL\n const replServer = createREPL(state);\n \n // Handle exit\n replServer.on('exit', async () => {\n await cleanupOnExit(state, replServer);\n process.exit(0);\n });\n}\n","/**\n * REPL setup and configuration\n * \n * Creates Node.js REPL with:\n * - Tab autocomplete for @computesdk/cmd functions\n * - Smart command evaluation (auto-run Command arrays)\n * - Workbench command injection\n */\n\nimport * as repl from 'repl';\nimport * as cmd from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { runCommand, defineProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose, connectToSandbox } from './commands.js';\nimport { showHelp, showInfo } from './output.js';\nimport { showProviders, showEnv, PROVIDER_NAMES } from './providers.js';\nimport { isCommand } from './types.js';\n\n/**\n * Extended REPL server interface with custom eval function\n */\ninterface ExtendedREPLServer extends repl.REPLServer {\n eval: (\n cmd: string,\n context: object,\n filename: string,\n callback: (err: Error | null, result: any) => void\n ) => void;\n}\nimport * as path from 'path';\nimport * as os from 'os';\n\n/**\n * Create and configure REPL server\n */\nexport function createREPL(state: WorkbenchState): repl.REPLServer {\n const replServer = repl.start({\n prompt: '> ', // Initial prompt, will be updated by state management\n useColors: true,\n terminal: true,\n useGlobal: false,\n ignoreUndefined: true,\n });\n\n // Inject cmd context for autocomplete\n injectCmdContext(replServer);\n \n // Inject workbench commands\n injectWorkbenchCommands(replServer, state);\n \n // Setup custom evaluator\n setupSmartEvaluator(replServer, state);\n \n // Setup custom autocomplete\n setupAutocomplete(replServer, state);\n \n // Setup command history\n setupHistory(replServer);\n \n // Store replServer reference for prompt updates\n state._replServer = replServer;\n\n return replServer;\n}\n\n/**\n * Inject all @computesdk/cmd exports into REPL context for autocomplete\n */\nfunction injectCmdContext(replServer: repl.REPLServer) {\n // Package managers\n replServer.context.npm = cmd.npm;\n replServer.context.pnpm = cmd.pnpm;\n replServer.context.yarn = cmd.yarn;\n replServer.context.bun = cmd.bun;\n replServer.context.pip = cmd.pip;\n replServer.context.uv = cmd.uv;\n replServer.context.poetry = cmd.poetry;\n replServer.context.pipx = cmd.pipx;\n \n // Package runners\n replServer.context.npx = cmd.npx;\n replServer.context.bunx = cmd.bunx;\n replServer.context.deno = cmd.deno;\n \n // Git\n replServer.context.git = cmd.git;\n \n // Filesystem\n replServer.context.mkdir = cmd.mkdir;\n replServer.context.rm = cmd.rm;\n replServer.context.cp = cmd.cp;\n replServer.context.mv = cmd.mv;\n replServer.context.ls = cmd.ls;\n replServer.context.pwd = cmd.pwd;\n replServer.context.chmod = cmd.chmod;\n replServer.context.chown = cmd.chown;\n replServer.context.touch = cmd.touch;\n replServer.context.cat = cmd.cat;\n replServer.context.ln = cmd.ln;\n replServer.context.readlink = cmd.readlink;\n replServer.context.test = cmd.test;\n replServer.context.rsync = cmd.rsync;\n \n // Process\n replServer.context.node = cmd.node;\n replServer.context.python = cmd.python;\n replServer.context.kill = cmd.kill;\n replServer.context.pkill = cmd.pkill;\n replServer.context.ps = cmd.ps;\n replServer.context.timeout = cmd.timeout;\n \n // Network\n replServer.context.curl = cmd.curl;\n replServer.context.wget = cmd.wget;\n replServer.context.port = cmd.port;\n replServer.context.net = cmd.net;\n \n // Text processing\n replServer.context.grep = cmd.grep;\n replServer.context.sed = cmd.sed;\n replServer.context.head = cmd.head;\n replServer.context.tail = cmd.tail;\n replServer.context.wc = cmd.wc;\n replServer.context.sort = cmd.sort;\n replServer.context.uniq = cmd.uniq;\n replServer.context.jq = cmd.jq;\n replServer.context.xargs = cmd.xargs;\n replServer.context.awk = cmd.awk;\n replServer.context.cut = cmd.cut;\n replServer.context.tr = cmd.tr;\n \n // Archives\n replServer.context.tar = cmd.tar;\n replServer.context.unzip = cmd.unzip;\n \n // System\n replServer.context.echo = cmd.echo;\n replServer.context.env = cmd.env;\n replServer.context.printenv = cmd.printenv;\n replServer.context.which = cmd.which;\n replServer.context.whoami = cmd.whoami;\n replServer.context.uname = cmd.uname;\n replServer.context.hostname = cmd.hostname;\n replServer.context.df = cmd.df;\n replServer.context.du = cmd.du;\n replServer.context.sleep = cmd.sleep;\n replServer.context.date = cmd.date;\n replServer.context.find = cmd.find;\n replServer.context.tee = cmd.tee;\n replServer.context.diff = cmd.diff;\n replServer.context.parallel = cmd.parallel;\n replServer.context.raw = cmd.raw;\n replServer.context.base64 = cmd.base64;\n replServer.context.md5sum = cmd.md5sum;\n replServer.context.sha256sum = cmd.sha256sum;\n replServer.context.sha1sum = cmd.sha1sum;\n \n // Compute\n replServer.context.compute = cmd.compute;\n \n // Expose cmd namespace for cmd() wrapper\n replServer.context.cmd = cmd.cmd;\n \n // Shell wrappers\n replServer.context.shell = cmd.shell;\n replServer.context.sh = cmd.sh;\n replServer.context.bash = cmd.bash;\n replServer.context.zsh = cmd.zsh;\n}\n\n/**\n * Inject workbench-specific commands\n */\nfunction injectWorkbenchCommands(replServer: repl.REPLServer, state: WorkbenchState) {\n // Provider management\n replServer.context.provider = defineProviderCommand(state);\n replServer.context.providers = () => showProviders();\n \n // Mode management\n replServer.context.mode = async (modeName?: 'gateway' | 'direct') => {\n if (!modeName) {\n showMode(state);\n } else {\n await toggleMode(state, modeName);\n }\n };\n \n // Sandbox operations\n replServer.context.restart = async () => {\n await restartSandbox(state);\n };\n \n replServer.context.destroy = async () => {\n await destroySandbox(state);\n };\n \n replServer.context.connect = async (url: string, token?: string) => {\n await connectToSandbox(state, url, token);\n };\n \n replServer.context.info = () => showInfo(state);\n \n // Output control\n replServer.context.verbose = () => {\n toggleVerbose(state);\n showVerbose(state);\n };\n \n // Background execution helper - accepts string or Command\n replServer.context.bg = (command: string | string[]) => {\n const cmdArray = typeof command === 'string' \n ? ['sh', '-c', command]\n : command;\n return cmd.sh(cmdArray as any, { background: true });\n };\n \n // Environment/help\n replServer.context.env = () => showEnv();\n replServer.context.help = showHelp;\n \n // Expose sandbox methods directly in context\n // These are lazy-evaluated to get the current sandbox\n \n // Expose getUrl directly\n replServer.context.getUrl = async (options: { port: number; protocol?: string }) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getUrl(options);\n };\n \n // Expose getInfo as sandboxInfo (since 'info' is already taken for workbench info)\n replServer.context.sandboxInfo = async () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInfo();\n };\n \n // Expose runCode directly\n replServer.context.runCode = async (code: string, runtime?: 'node' | 'python') => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCode(code, runtime);\n };\n \n // Expose runCommand directly with full options support (background, cwd, env)\n replServer.context.runCommand = async (\n command: string,\n options?: { background?: boolean; cwd?: string; env?: Record<string, string> }\n ) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCommand(command, options);\n };\n \n // Expose sandbox creation methods (gateway mode only)\n // These return clean { sandboxId, metadata } objects instead of full GeneratedSandbox\n replServer.context.create = async (options?: Record<string, unknown>) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching from existing sandbox\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n // User chose not to switch - create but don't activate\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Create sandbox (may throw error)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n // Only set as current after successful creation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.findOrCreate = async (options: { name: string; namespace?: string; timeout?: number; runtime?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (findOrCreate) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Find or create sandbox\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n // Set as current after successful operation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.find = async (options: { name: string; namespace?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (find) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Find sandbox first (may return null)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.find(options);\n \n if (!sandbox) {\n return null; // Not found, nothing to switch to\n }\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Set as current\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n // Expose filesystem namespace\n replServer.context.filesystem = {\n get readFile() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readFile(path);\n };\n },\n get writeFile() {\n return async (path: string, content: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.writeFile(path, content);\n };\n },\n get mkdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.mkdir(path);\n };\n },\n get readdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readdir(path);\n };\n },\n get exists() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.exists(path);\n };\n },\n get remove() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.remove(path);\n };\n }\n };\n \n // Expose child namespace for child sandbox operations (gateway mode only)\n replServer.context.child = {\n get create() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.create();\n };\n },\n get list() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.list();\n };\n },\n get retrieve() {\n return async (subdomain: string) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.retrieve(subdomain);\n };\n },\n get destroy() {\n return async (subdomain: string, options?: { deleteFiles?: boolean }) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.destroy(subdomain, options);\n };\n }\n };\n \n // Expose getInstance for advanced users\n replServer.context.getInstance = () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInstance();\n };\n}\n\n/**\n * Setup smart evaluator that auto-runs Command arrays and workbench commands\n */\nfunction setupSmartEvaluator(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalEval = replServer.eval;\n \n // Track workbench command names for auto-calling\n const workbenchCommands = new Set(['help', 'providers', 'info', 'env', 'restart', 'destroy', 'mode', 'verbose', 'sandboxInfo', 'connect']);\n \n (replServer as ExtendedREPLServer).eval = function (cmd: string, context: object, filename: string, callback: (err: Error | null, result: any) => void) {\n const trimmedCmd = cmd.trim();\n \n // Special handling for \"provider <mode> <name>\" syntax (without parentheses)\n // Supports: \"provider e2b\", \"provider direct e2b\", \"provider gateway e2b\"\n const providerMatch = trimmedCmd.match(/^provider(?:\\s+(direct|gateway))?\\s+(\\w+)$/);\n if (providerMatch) {\n const mode = providerMatch[1] || null; // 'direct', 'gateway', or null\n const providerName = providerMatch[2];\n const providerCmd = mode \n ? `await provider('${mode}', '${providerName}')`\n : `await provider('${providerName}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Also handle just \"provider direct\" or \"provider gateway\" alone \n const providerOnlyMatch = trimmedCmd.match(/^provider\\s+(direct|gateway)$/);\n if (providerOnlyMatch) {\n const mode = providerOnlyMatch[1];\n const providerCmd = `await provider('${mode}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Special handling for \"mode <gateway|direct>\" syntax\n const modeMatch = trimmedCmd.match(/^mode\\s+(gateway|direct)$/);\n if (modeMatch) {\n const modeName = modeMatch[1];\n const modeCmd = `await mode('${modeName}')`;\n originalEval.call(this, modeCmd, context, filename, callback);\n return;\n }\n \n // Special handling for $command syntax (direct shell command execution)\n const dollarMatch = trimmedCmd.match(/^\\$(.+)$/);\n if (dollarMatch) {\n const shellCmd = dollarMatch[1].trim();\n \n // Handle empty command\n if (!shellCmd) {\n callback(new Error('Empty command after $'), undefined);\n return;\n }\n \n // Create command array: ['sh', '-c', 'the command']\n const command = ['sh', '-c', shellCmd];\n \n // Execute the command directly\n runCommand(state, command)\n .then(output => callback(null, output))\n .catch(error => callback(error as Error, undefined));\n return;\n }\n \n // Use original eval to get the result\n originalEval.call(this, cmd, context, filename, async (err, result) => {\n if (err) {\n callback(err, undefined);\n return;\n }\n \n // Check if result is a Command (string array from @computesdk/cmd)\n if (isCommand(result)) {\n try {\n const output = await runCommand(state, result);\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Check if it's a workbench command function that should be auto-called\n if (typeof result === 'function' && workbenchCommands.has(trimmedCmd)) {\n try {\n const output = await result();\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Auto-await promises (so users don't need to type \"await\")\n if (result && typeof result.then === 'function') {\n try {\n const output = await result;\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Not a command or promise, return as-is\n callback(null, result);\n });\n };\n}\n\n/**\n * Setup custom autocomplete\n */\nfunction setupAutocomplete(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalCompleter = replServer.completer as any;\n \n // Workbench commands with their argument suggestions\n const workbenchCommands = {\n 'provider': [...PROVIDER_NAMES], // Use actual provider names from config\n 'mode': ['gateway', 'direct'],\n 'providers': [],\n 'restart': [],\n 'destroy': [],\n 'connect': [], // Connect takes a URL argument\n 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n // Sandbox methods\n 'getUrl': [],\n 'runCode': [],\n 'sandboxInfo': [],\n 'getInstance': [],\n // Filesystem is an object, so it gets dot notation autocomplete automatically\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\n try {\n // Don't trim - we need to detect trailing spaces\n const trimmed = line.trim();\n \n // Complete workbench command names (no space or dot in line)\n if (!line.includes(' ') && !line.includes('.')) {\n const commands = Object.keys(workbenchCommands);\n const hits = commands.filter(cmd => cmd.startsWith(trimmed));\n \n // Also get context completions from original completer\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n // Validate result format\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n const [contextHits, partial] = result;\n if (!Array.isArray(contextHits)) {\n callback(null, [hits, trimmed]);\n return;\n }\n\n // Merge workbench commands with context completions\n const allHits = [...new Set([...hits, ...contextHits])].sort();\n const completionPrefix = typeof partial === 'string' ? partial : trimmed;\n callback(null, [allHits, completionPrefix]);\n });\n return;\n }\n \n callback(null, [hits.length ? hits : commands, trimmed]);\n return;\n }\n \n // Complete command arguments (e.g., \"provider e\" -> \"provider e2b\")\n // Use original line to detect spaces properly\n if (line.includes(' ') && !line.includes('.')) {\n const parts = line.split(' ');\n const command = parts[0].trim();\n const partial = parts.slice(1).join(' ').trim(); // Everything after command\n const suggestions = workbenchCommands[command as keyof typeof workbenchCommands];\n \n // Check if this is a known workbench command\n if (suggestions !== undefined) {\n if (suggestions.length > 0) {\n const hits = suggestions\n .filter(s => s.startsWith(partial))\n .map(s => `${command} ${s}`);\n \n callback(null, [hits.length ? hits : suggestions.map(s => `${command} ${s}`), line]);\n } else {\n // For commands with no arguments (like 'info', 'help', etc.), return empty\n callback(null, [[], line]);\n }\n return;\n }\n }\n \n // Fall back to original completer (this handles npm., git., etc.)\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [[], line]);\n return;\n }\n \n // Validate result format before passing it along\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [[], line]);\n return;\n }\n \n const [completions, partial] = result;\n if (!Array.isArray(completions) || typeof partial !== 'string') {\n callback(null, [[], line]);\n return;\n }\n \n callback(null, [completions, partial]);\n });\n } else {\n callback(null, [[], line]);\n }\n } catch (error) {\n // Catch any unexpected errors to prevent crashing the REPL\n console.error('Autocomplete error:', error);\n callback(null, [[], line]);\n }\n };\n}\n\n/**\n * Setup command history\n */\nfunction setupHistory(replServer: repl.REPLServer) {\n const historyFile = path.join(os.homedir(), '.computesdk_workbench_history');\n \n replServer.setupHistory(historyFile, (err) => {\n if (err) {\n // Silent fail - history is nice-to-have\n }\n });\n}\n","/**\n * Workbench type definitions\n */\n\nimport type { Command } from '@computesdk/cmd';\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Provider status information\n */\nexport interface ProviderStatus {\n name: string;\n isComplete: boolean;\n present: string[];\n missing: string[];\n}\n\n/**\n * Type guard to check if value is a Command (string array)\n */\nexport function isCommand(value: unknown): value is Command {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n );\n}\n"],"mappings":"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","names":["config","compute","config","path","getComputeInstance","confirmSandboxSwitch","setSandbox","logSuccess","compute","sandbox","cmd","path"]}
|
|
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.0/node_modules/tsup/assets/esm_shims.js","../../src/cli/state.ts","../../src/cli/output.ts","../../src/cli/providers.ts","../../src/cli/commands.ts","../../src/bin/workbench.ts","../../src/cli/index.ts","../../src/cli/repl.ts","../../src/cli/types.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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox } from 'computesdk';\nimport type { ProviderSandbox } from '@computesdk/provider';\nimport type { REPLServer } from 'repl';\n\n/** Sandbox can be either client Sandbox (gateway mode) or ProviderSandbox (direct mode) */\ntype WorkbenchSandbox = Sandbox | ProviderSandbox;\n\n/**\n * Workbench session state\n */\nexport interface WorkbenchState {\n /** Currently active provider (e2b, railway, etc.) */\n currentProvider: string | null;\n\n /** Current sandbox instance */\n currentSandbox: WorkbenchSandbox | null;\n \n /** When the current sandbox was created */\n sandboxCreatedAt: Date | null;\n \n /** List of providers detected from environment */\n availableProviders: string[];\n \n /** Whether to use direct mode (true) or gateway mode (false, default) */\n useDirectMode: boolean;\n \n /** Show verbose command output (full result object) */\n verbose: boolean;\n \n /** Compute instance (for creating named sandboxes, etc.) */\n compute: any | null;\n \n /** Internal: REPL server reference for updating prompt */\n _replServer?: REPLServer;\n}\n\n/**\n * Create initial workbench state\n */\nexport function createState(): WorkbenchState {\n return {\n currentProvider: null,\n currentSandbox: null,\n sandboxCreatedAt: null,\n availableProviders: [],\n useDirectMode: false, // Default to gateway mode\n verbose: false,\n compute: null,\n };\n}\n\n/**\n * Get current sandbox, throwing if none exists\n */\nexport function getCurrentSandbox(state: WorkbenchState): WorkbenchSandbox {\n if (!state.currentSandbox) {\n throw new Error('No active sandbox');\n }\n return state.currentSandbox;\n}\n\n/**\n * Set current sandbox\n */\nexport function setSandbox(state: WorkbenchState, sandbox: WorkbenchSandbox, provider: string) {\n state.currentSandbox = sandbox;\n state.currentProvider = provider;\n state.sandboxCreatedAt = new Date();\n updatePromptIfNeeded(state);\n}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\n updatePromptIfNeeded(state);\n}\n\n/**\n * Update REPL prompt if replServer is available\n * @internal\n */\nfunction updatePromptIfNeeded(state: WorkbenchState) {\n if (state._replServer) {\n const prompt = getPrompt(state);\n state._replServer.setPrompt(prompt);\n }\n}\n\n/**\n * Get prompt string based on current state\n * @internal\n */\nfunction getPrompt(state: WorkbenchState): string {\n if (!state.currentSandbox) {\n return '> ';\n }\n \n const provider = state.currentProvider || 'unknown';\n const sandboxId = state.currentSandbox.sandboxId || '';\n\n // Use full sandbox ID for now\n // User can see exactly which sandbox they're connected to\n return `${provider}:${sandboxId}> `;\n}\n\n/**\n * Check if a sandbox is currently active\n */\nexport function hasSandbox(state: WorkbenchState): boolean {\n return state.currentSandbox !== null;\n}\n\n/**\n * Get sandbox uptime in seconds\n */\nexport function getUptimeSeconds(state: WorkbenchState): number {\n if (!state.sandboxCreatedAt) return 0;\n return Math.floor((Date.now() - state.sandboxCreatedAt.getTime()) / 1000);\n}\n\n/**\n * Format uptime as human-readable string\n */\nexport function formatUptime(state: WorkbenchState): string {\n const seconds = getUptimeSeconds(state);\n \n if (seconds < 60) {\n return `${seconds} second${seconds === 1 ? '' : 's'}`;\n }\n \n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? '' : 's'}`;\n }\n \n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n","/**\n * Output formatting utilities\n * \n * Provides consistent, colorful output for workbench\n */\n\nimport type { WorkbenchState } from './state.js';\nimport { formatUptime } from './state.js';\n\n/**\n * ANSI color codes (simple, no dependencies for now)\n */\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n \n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n};\n\n/**\n * Color helpers\n */\nexport const c = {\n bold: (text: string) => `${colors.bright}${text}${colors.reset}`,\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\n blue: (text: string) => `${colors.blue}${text}${colors.reset}`,\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\n};\n\n/**\n * Display welcome banner\n */\nexport function showWelcome(availableProviders: string[], currentProvider: string | null, useDirectMode: boolean) {\n console.log(c.bold(c.cyan('\\n╔═══════════════════════════════════════════════════════╗')));\n console.log(c.bold(c.cyan('║ ComputeSDK Workbench ║')));\n console.log(c.bold(c.cyan('╚═══════════════════════════════════════════════════════╝\\n')));\n console.log(c.dim('Prompt shows connection status: > (disconnected) or provider:sandbox> (connected)\\n'));\n \n if (availableProviders.length > 0) {\n // Filter out 'gateway' from the list since it's not a real backend provider\n const backendProviders = availableProviders.filter(p => p !== 'gateway');\n console.log(`Providers available: ${backendProviders.join(', ')}`);\n \n if (currentProvider) {\n if (useDirectMode) {\n console.log(`Current provider: ${c.green(currentProvider)} (🔗 direct mode)\\n`);\n } else {\n // Gateway mode - show which backend will be used\n const backendProvider = currentProvider === 'gateway' \n ? (backendProviders[0] || 'auto')\n : currentProvider;\n console.log(`Current provider: ${c.green(backendProvider)} (🌐 via gateway)\\n`);\n }\n } else {\n console.log(`\\n${c.dim('Tip: Use \"provider <name>\" to select a provider')}\\n`);\n }\n } else {\n console.log(c.yellow('⚠️ No providers detected.\\n'));\n console.log('To get started:');\n console.log(' 1. Copy .env.example to .env');\n console.log(' 2. Add your provider credentials');\n console.log(' 3. Restart workbench\\n');\n console.log(c.dim('Type \"env\" to see required environment variables\\n'));\n }\n \n console.log(c.dim('Type \"help\" for available commands\\n'));\n}\n\n\n\n/**\n * Display sandbox info\n */\nexport function showInfo(state: WorkbenchState) {\n if (!state.currentSandbox) {\n console.log(c.yellow('\\nNo active sandbox\\n'));\n return;\n }\n \n console.log('\\n' + c.bold('Current Sandbox:'));\n \n // Show sandbox ID if available\n if (state.currentSandbox.sandboxId) {\n console.log(` Sandbox ID: ${c.cyan(state.currentSandbox.sandboxId)}`);\n }\n \n console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\n \n // Show connection mode (gateway or direct)\n const modeLabel = state.useDirectMode ? 'direct 🔗' : 'gateway 🌐';\n console.log(` Mode: ${c.blue(modeLabel)}`);\n \n console.log(` Created: ${state.sandboxCreatedAt?.toLocaleString() || 'unknown'}`);\n console.log(` Uptime: ${formatUptime(state)}`);\n console.log('');\n}\n\n/**\n * Simple spinner class (no external deps)\n */\nexport class Spinner {\n private interval: NodeJS.Timeout | null = null;\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private currentFrame = 0;\n private text: string;\n \n constructor(text: string) {\n this.text = text;\n }\n \n start(): this {\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.interval = setInterval(() => {\n const frame = this.frames[this.currentFrame];\n process.stdout.write(`\\r${c.cyan(frame)} ${this.text}`);\n this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n }, 80);\n return this;\n }\n \n succeed(text?: string): void {\n this.stop();\n console.log(`${c.green('✅')} ${text || this.text}`);\n }\n \n fail(text?: string): void {\n this.stop();\n console.log(`${c.red('❌')} ${text || this.text}`);\n }\n \n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Show cursor\n }\n}\n\n/**\n * Format duration in seconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n const seconds = ms / 1000;\n if (seconds < 1) {\n return `${ms}ms`;\n }\n return `${seconds.toFixed(1)}s`;\n}\n\n/**\n * Log command being run\n */\nexport function logCommand(command: string[]) {\n console.log(c.dim(`Running: ${command.join(' ')}`));\n}\n\n/**\n * Log success\n */\nexport function logSuccess(message: string, duration?: number) {\n const durationStr = duration ? ` (${formatDuration(duration)})` : '';\n console.log(c.green(`✅ ${message}${durationStr}`));\n}\n\n/**\n * Display help text\n */\nexport function showHelp() {\n console.log(`\n${c.bold('ComputeSDK Workbench Commands')}\n\n${c.bold('Provider Management:')}\n ${c.cyan('provider <name>')} Switch to provider via gateway (default)\n ${c.dim('Example: provider e2b')}\n ${c.cyan('provider direct <name>')} Connect directly to provider\n ${c.dim('Example: provider direct e2b')}\n ${c.cyan('providers')} List all providers with status\n ${c.cyan('mode <gateway|direct>')} Toggle default mode for next sandbox\n\n${c.bold('Provider Modes:')}\n ${c.bold('Gateway (default)')}: Routes through ComputeSDK API, zero-config\n • Requires: COMPUTESDK_API_KEY + provider credentials\n • Usage: ${c.cyan('provider e2b')}\n \n ${c.bold('Direct')}: Connects directly to provider, requires packages\n • Requires: Provider package installed + credentials\n • Usage: ${c.cyan('provider direct e2b')}\n\n${c.bold('Sandbox Management:')}\n ${c.cyan('restart')} Restart current sandbox\n ${c.cyan('destroy')} Destroy current sandbox\n ${c.cyan('connect <url> [token]')} Connect to existing sandbox via URL\n ${c.dim('Example: connect https://sandbox-123.localhost:8080')}\n ${c.dim('Example: connect https://sandbox-123.localhost:8080 your_token')}\n ${c.cyan('info')} Show sandbox info (provider, uptime)\n\n${c.bold('Environment:')}\n ${c.cyan('env')} Show environment/credentials status\n ${c.cyan('verbose')} Toggle verbose output mode\n\n${c.bold('Help:')}\n ${c.cyan('help')} Show this help message\n ${c.cyan('exit')} or ${c.cyan('.exit')} Exit workbench\n\n${c.bold('Running Commands:')}\n Type any @computesdk/cmd function and it will run automatically:\n \n ${c.dim('Package Managers:')}\n ${c.cyan('npm.install(\"express\")')}\n ${c.cyan('pip.install(\"requests\")')}\n \n ${c.dim('Git:')}\n ${c.cyan('git.clone(\"https://github.com/user/repo\")')}\n ${c.cyan('git.status()')}\n \n ${c.dim('Filesystem (via commands):')}\n ${c.cyan('ls(\"/home\")')}\n ${c.cyan('cat(\"/etc/hosts\")')}\n ${c.cyan('rm.rf(\"/tmp\")')} ${c.dim('// Force remove')}\n ${c.cyan('rm.auto(\"/path\")')} ${c.dim('// Smart remove')}\n \n ${c.dim('Filesystem (direct API):')}\n ${c.cyan('filesystem.readFile(\"/etc/hosts\")')}\n ${c.cyan('filesystem.writeFile(\"/app/server.js\", code)')}\n ${c.cyan('filesystem.mkdir(\"/app\")')}\n ${c.cyan('filesystem.readdir(\"/home\")')}\n ${c.cyan('filesystem.exists(\"/path\")')}\n ${c.cyan('filesystem.remove(\"/file\")')}\n \n ${c.dim('Named Sandboxes (gateway mode only):')}\n ${c.cyan('create()')} ${c.dim('// Create & switch to new sandbox')}\n ${c.cyan('create({ namespace: \"h\" })')} ${c.dim('// Create with namespace & switch')}\n ${c.cyan('findOrCreate({ name: \"my-app\" })')} ${c.dim('// Find or create & switch')}\n ${c.cyan('find({ name: \"my-app\" })')} ${c.dim('// Find existing & switch')}\n \n ${c.dim('Note: Prompts before switching if you already have an active sandbox')}\n \n ${c.dim('Child Sandboxes (gateway mode only):')}\n ${c.cyan('child.create()')} ${c.dim('// Create child sandbox')}\n ${c.cyan('child.list()')} ${c.dim('// List all children')}\n ${c.cyan('child.retrieve(\"sandbox-id\")')} ${c.dim('// Get child info')}\n ${c.cyan('child.destroy(\"sandbox-id\")')} ${c.dim('// Delete child')}\n \n ${c.dim('Sandbox Methods:')}\n ${c.cyan('getUrl({ port: 3000 })')} ${c.dim('// Get public URL')}\n ${c.cyan('runCode(\"console.log(\\'hi\\')\", \"node\")')}\n ${c.cyan('sandboxInfo()')} ${c.dim('// Get sandbox details')}\n ${c.cyan('getInstance()')} ${c.dim('// Get native instance')}\n \n ${c.dim('Note: No need to use \"await\" - promises are auto-awaited!')}\n \n ${c.dim('Compute CLI:')}\n ${c.cyan('compute.isSetup()')} ${c.dim('// Check if daemon is running')}\n ${c.cyan('compute.setup()')} ${c.dim('// Install + start daemon')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute CLI')}\n ${c.cyan('compute.start()')} ${c.dim('// Start daemon')}\n ${c.cyan('compute.health()')} ${c.dim('// Check daemon health')}\n\n${c.bold('Shell Commands:')}\n Use ${c.cyan('$')} prefix to run any shell command directly:\n ${c.cyan('$ls -la /app')}\n ${c.cyan('$npm install express')}\n ${c.cyan('$git status')}\n ${c.cyan('$compute --help')}\n\n${c.bold('Background Execution:')}\n ${c.cyan('sh(\"npm start\", { background: true })')}\n ${c.cyan('sh(\"python -m http.server 8000\", { background: true })')}\n\n${c.dim('Press Tab for autocomplete on all commands!')}\n`);\n}\n\n/**\n * Log error\n */\nexport function logError(message: string) {\n console.log(c.red(`❌ ${message}`));\n}\n\n/**\n * Log warning\n */\nexport function logWarning(message: string) {\n console.log(c.yellow(`⚠️ ${message}`));\n}\n\n/**\n * Log info\n */\nexport function logInfo(message: string) {\n console.log(c.blue(`ℹ️ ${message}`));\n}\n","/**\n * Provider detection and management for workbench\n *\n * Uses shared provider config from computesdk as single source of truth\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\nimport {\n PROVIDER_AUTH as SHARED_PROVIDER_AUTH,\n PROVIDER_NAMES as SHARED_PROVIDER_NAMES,\n PROVIDER_ENV_MAP,\n type ProviderName as SharedProviderName,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n} from 'computesdk';\n\n/**\n * Workbench-specific provider names (includes gateway)\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n ...SHARED_PROVIDER_NAMES,\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Auth requirements for each provider\n * Extends shared config with gateway-specific auth\n */\nexport const PROVIDER_AUTH: Record<ProviderName, readonly (readonly string[])[]> = {\n gateway: [['COMPUTESDK_API_KEY']],\n ...SHARED_PROVIDER_AUTH,\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n const authOptions = PROVIDER_AUTH[provider];\n\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...authOptions[0]],\n };\n }\n\n // Build a set of all present env vars (checked once per unique var)\n const allVars = new Set(authOptions.flat());\n const presentSet = new Set<string>();\n for (const v of allVars) {\n if (process.env?.[v]) presentSet.add(v);\n }\n\n // Evaluate each auth option in a single pass\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const v of option) {\n if (presentSet.has(v)) {\n presentCount++;\n } else {\n missing.push(v);\n }\n }\n\n // If all vars present, this option is satisfied\n if (missing.length === 0) {\n return {\n name: provider,\n isComplete: true,\n present: [...presentSet],\n missing: [],\n };\n }\n\n // Track the option closest to completion\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return {\n name: provider,\n isComplete: false,\n present: [...presentSet],\n missing: bestOption?.missing ?? [],\n };\n}\n\n/**\n * Get all available (fully configured) providers\n */\nexport function getAvailableProviders(): string[] {\n return PROVIDER_NAMES.filter(provider => {\n const status = getProviderStatus(provider);\n return status.isComplete;\n });\n}\n\n/**\n * Display all providers with their status\n */\nexport function showProviders() {\n console.log('\\n' + c.bold('Provider Status:'));\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} ${provider} - Ready`);\n } else if (status.present.length > 0) {\n const ratio = `${status.present.length}/${status.present.length + status.missing.length}`;\n console.log(` ${c.yellow('⚠️ ')} ${provider} - Incomplete (${ratio} credentials)`);\n console.log(` ${c.dim('Missing:')} ${status.missing.join(', ')}`);\n } else {\n console.log(` ${c.dim('❌')} ${c.dim(provider)} - Not configured`);\n }\n }\n\n console.log('');\n}\n\n/**\n * Display environment status with helpful setup instructions\n */\nexport function showEnv() {\n console.log('\\n' + c.bold('Environment Configuration:'));\n console.log('');\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n console.log(c.bold(`${provider}:`));\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} All credentials present`);\n status.present.forEach(varName => {\n console.log(` ${c.dim('•')} ${varName}`);\n });\n } else {\n if (status.present.length > 0) {\n console.log(c.dim(' Present:'));\n status.present.forEach(varName => {\n console.log(` ${c.green('✓')} ${varName}`);\n });\n }\n\n if (status.missing.length > 0) {\n console.log(c.dim(' Missing:'));\n status.missing.forEach(varName => {\n console.log(` ${c.red('✗')} ${varName}`);\n });\n }\n }\n\n console.log('');\n }\n\n console.log(c.dim('Tip: Set credentials in your .env file'));\n console.log('');\n}\n\n/**\n * Auto-detect best provider to use\n */\nexport function autoDetectProvider(forceGatewayMode = false): string | null {\n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && isValidProvider(explicit) && isProviderReady(explicit)) {\n return explicit;\n }\n\n // If forcing gateway mode, only return gateway if available\n if (forceGatewayMode) {\n return isProviderReady('gateway') ? 'gateway' : null;\n }\n\n // Auto-detect based on priority order\n for (const provider of PROVIDER_NAMES) {\n if (isProviderReady(provider)) {\n return provider;\n }\n }\n\n return null;\n}\n\n/**\n * Validate that a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return PROVIDER_NAMES.includes(name as ProviderName);\n}\n\n/**\n * Check if provider is fully configured\n */\nexport function isProviderReady(provider: string): boolean {\n if (!isValidProvider(provider)) return false;\n const status = getProviderStatus(provider);\n return status.isComplete;\n}\n\n/**\n * Get helpful error message for unconfigured provider\n */\nexport function getProviderSetupHelp(provider: string): string {\n if (!isValidProvider(provider)) {\n return `Unknown provider: ${provider}\\nAvailable: ${PROVIDER_NAMES.join(', ')}`;\n }\n\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n return `Provider ${provider} is already configured`;\n }\n\n const lines = [\n `Provider ${provider} requires these environment variables:`,\n '',\n ...status.missing.map(varName => ` ${varName}`),\n '',\n 'Add them to your .env file or export them in your shell.',\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Dynamically import a provider package\n */\nexport async function loadProvider(providerName: ProviderName): Promise<any> {\n try {\n switch (providerName) {\n case 'gateway':\n // Gateway is built into computesdk package\n return await import('computesdk');\n case 'e2b':\n return await import('@computesdk/e2b');\n case 'railway':\n return await import('@computesdk/railway');\n case 'daytona':\n return await import('@computesdk/daytona');\n case 'modal':\n return await import('@computesdk/modal');\n case 'runloop':\n return await import('@computesdk/runloop');\n case 'vercel':\n return await import('@computesdk/vercel');\n case 'cloudflare':\n return await import('@computesdk/cloudflare');\n case 'codesandbox':\n return await import('@computesdk/codesandbox');\n case 'blaxel':\n return await import('@computesdk/blaxel');\n default:\n throw new Error(`Unknown provider: ${providerName}`);\n }\n } catch (error) {\n if (providerName === 'gateway') {\n throw new Error(`Failed to load gateway provider from computesdk package.`);\n }\n throw new Error(\n `Failed to load provider ${providerName}. ` +\n `Make sure to install it: npm install @computesdk/${providerName}`\n );\n }\n}\n\n/**\n * Create provider config from environment variables\n * Uses shared PROVIDER_ENV_MAP from computesdk\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n // Handle gateway separately (not in shared config)\n if (providerName === 'gateway') {\n const config: Record<string, string> = {};\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n return config;\n }\n\n // Use shared utility for other providers\n return getProviderConfigFromEnv(providerName as SharedProviderName);\n}\n","/**\n * Workbench command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from '@computesdk/provider';\nimport { escapeArgs } from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { getCurrentSandbox, setSandbox, clearSandbox, hasSandbox } from './state.js';\nimport { \n Spinner, \n logCommand, \n logSuccess, \n logError, \n logWarning,\n c,\n formatDuration,\n} from './output.js';\nimport { \n isProviderReady, \n autoDetectProvider, \n getProviderSetupHelp,\n isValidProvider,\n loadProvider,\n getProviderConfig,\n type ProviderName,\n} from './providers.js';\nimport * as readline from 'readline';\n\n/**\n * Prompt user for yes/no confirmation\n */\nasync function confirm(question: string, defaultYes = false): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n // Clear any pending input\n process.stdin.resume();\n \n const promptSuffix = defaultYes ? '(Y/n)' : '(y/N)';\n \n rl.question(`${question} ${promptSuffix}: `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n \n // If empty answer, use default\n if (trimmed === '') {\n resolve(defaultYes);\n } else {\n resolve(trimmed === 'y' || trimmed === 'yes');\n }\n });\n });\n}\n\n/**\n * Prompt user to switch sandbox if one is already active\n * Returns true if should proceed with switch\n */\nexport async function confirmSandboxSwitch(state: WorkbenchState): Promise<boolean> {\n if (!hasSandbox(state)) {\n return true; // No current sandbox, no need to confirm\n }\n \n return await confirm('Switch to new sandbox?', true); // Default YES\n}\n\n/**\n * Auto-create sandbox if none exists\n */\nexport async function ensureSandbox(state: WorkbenchState): Promise<void> {\n if (hasSandbox(state)) {\n return; // Already have a sandbox\n }\n \n await createSandbox(state);\n}\n\n/**\n * Create or get compute instance for current provider configuration\n */\nexport async function getComputeInstance(state: WorkbenchState): Promise<any> {\n // Return cached instance if available\n if (state.compute) {\n return state.compute;\n }\n \n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n throw new Error('No provider configured.');\n }\n \n let compute;\n \n if (useDirect) {\n // Direct mode: load the provider package directly\n const providerModule = await loadProvider(providerName as ProviderName);\n const providerFactory = providerModule[providerName];\n \n if (!providerFactory) {\n throw new Error(`Provider ${providerName} does not export a factory function`);\n }\n \n // Get config from environment\n const config = getProviderConfig(providerName as ProviderName);\n \n // Create compute instance with this provider\n compute = createCompute({\n defaultProvider: providerFactory(config),\n });\n } else {\n // Gateway mode: use the shared gateway compute instance from computesdk.\n // The gateway must be configured via environment variables (for example, COMPUTESDK_API_KEY)\n // or explicit configuration; if neither is provided, the gateway will throw an error.\n const { compute: gatewayCompute } = await import('computesdk');\n compute = gatewayCompute;\n }\n \n // Cache the instance\n state.compute = compute;\n return compute;\n}\n\n/**\n * Create a new sandbox using gateway or direct provider\n */\nexport async function createSandbox(state: WorkbenchState): Promise<void> {\n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n logError('No provider configured. Run \"env\" to see setup instructions.');\n throw new Error('No provider available');\n }\n \n // Determine which mode to use\n let modeLabel: string;\n let actualProviderName: string;\n \n if (useDirect) {\n // Direct mode: use the provider directly\n modeLabel = `${providerName} (direct)`;\n actualProviderName = providerName;\n \n if (!isProviderReady(providerName)) {\n logError(`Provider ${providerName} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(providerName));\n throw new Error('Provider not ready');\n }\n } else {\n // Gateway mode: use gateway with specified backend\n modeLabel = `${providerName} (via gateway)`;\n actualProviderName = 'gateway';\n \n if (!isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n throw new Error('Gateway not ready');\n }\n }\n \n const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();\n const startTime = Date.now();\n \n try {\n // Get or create compute instance\n const compute = await getComputeInstance(state);\n \n // Create sandbox\n const result = await compute.sandbox.create();\n const duration = Date.now() - startTime;\n \n setSandbox(state, result, providerName);\n spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to create sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n \n // Better error message if provider package not installed\n if (error instanceof Error && error.message.includes('Cannot find module')) {\n logError(`Provider package @computesdk/${providerName} is not installed.`);\n console.log(`\\nInstall it with: ${c.cyan(`npm install @computesdk/${providerName}`)}\\n`);\n }\n \n // Show the actual error for debugging\n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Destroy current sandbox\n */\nexport async function destroySandbox(state: WorkbenchState): Promise<void> {\n const spinner = new Spinner('Destroying sandbox...').start();\n \n try {\n const sandbox = getCurrentSandbox(state);\n await sandbox.destroy();\n clearSandbox(state);\n spinner.succeed('Destroyed');\n } catch (error) {\n spinner.fail(`Failed to destroy: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n}\n\n/**\n * Restart sandbox (destroy + create with same provider)\n */\nexport async function restartSandbox(state: WorkbenchState): Promise<void> {\n const provider = state.currentProvider;\n \n if (hasSandbox(state)) {\n await destroySandbox(state);\n }\n \n // Keep same provider\n if (provider) {\n state.currentProvider = provider;\n }\n \n await createSandbox(state);\n}\n\n/**\n * Run a command on the current sandbox\n */\nexport async function runCommand(state: WorkbenchState, command: string[]): Promise<any> {\n // Ensure we have a sandbox\n await ensureSandbox(state);\n \n const sandbox = getCurrentSandbox(state);\n const startTime = Date.now();\n \n logCommand(command);\n \n try {\n // Use escapeArgs to properly join and escape command array with spaces/special chars\n const commandString = escapeArgs(command);\n const result = await sandbox.runCommand(commandString);\n const duration = Date.now() - startTime;\n \n // Print output directly\n if (result.stdout) {\n console.log(result.stdout.trimEnd());\n }\n if (result.stderr) {\n console.error(c.red(result.stderr.trimEnd()));\n }\n \n // Show success indicator with timing and exit code info\n const exitCodeInfo = result.exitCode !== 0 ? c.yellow(` (exit ${result.exitCode})`) : '';\n logSuccess(`${c.dim(`${formatDuration(duration)}`)}${exitCodeInfo}`);\n \n // In verbose mode, return the full result object\n // Otherwise return undefined so REPL doesn't print anything\n if (state.verbose) {\n return result;\n }\n return undefined;\n } catch (error) {\n const duration = Date.now() - startTime;\n logError(`Failed ${c.dim(`(${formatDuration(duration)})`)} - ${error instanceof Error ? error.message : String(error)}`);\n\n // Clear stale sandbox on connection/auth errors so next command creates fresh\n if (isStaleConnectionError(error)) {\n clearSandbox(state);\n logWarning('Sandbox connection lost. Next command will create a new sandbox.');\n }\n\n throw error;\n }\n}\n\n/**\n * Check if an error indicates a stale/dead sandbox connection\n */\nfunction isStaleConnectionError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const message = error.message.toLowerCase();\n const stalePhrases = [\n 'websocket',\n 'connection refused',\n 'connection reset',\n 'connection closed',\n 'socket hang up',\n 'econnrefused',\n 'econnreset',\n 'etimedout',\n 'not found',\n 'sandbox not found',\n 'unauthorized',\n '401',\n '403',\n '404',\n ];\n\n return stalePhrases.some(phrase => message.includes(phrase));\n}\n\n/**\n * Switch to a different provider\n * Supports both gateway mode (default) and direct mode\n * \n * Examples:\n * provider e2b → gateway with e2b backend\n * provider direct e2b → direct connection to e2b\n */\nexport async function switchProvider(state: WorkbenchState, mode: string, providerName?: string): Promise<void> {\n // Parse the command: could be \"provider e2b\" or \"provider direct e2b\"\n let useDirect = false;\n let actualProvider = mode;\n \n if (mode === 'direct') {\n if (!providerName) {\n logError('Usage: provider direct <name>');\n console.log('Example: provider direct e2b');\n return;\n }\n useDirect = true;\n actualProvider = providerName;\n } else if (mode === 'gateway') {\n if (!providerName) {\n logError('Usage: provider gateway <name>');\n console.log('Example: provider gateway e2b');\n return;\n }\n useDirect = false;\n actualProvider = providerName;\n }\n \n // Remove 'gateway' prefix if someone types \"provider gateway\"\n if (actualProvider === 'gateway') {\n actualProvider = autoDetectProvider(false) || 'e2b';\n }\n \n // Validate provider\n if (!isValidProvider(actualProvider)) {\n logError(`Unknown provider: ${actualProvider}`);\n console.log(`Available providers: e2b, railway, daytona, modal, runloop, vercel, cloudflare, codesandbox, blaxel`);\n return;\n }\n \n // Check if gateway is configured (always needed)\n if (!useDirect && !isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n return;\n }\n \n // Check if direct provider is configured (only for direct mode)\n if (useDirect && !isProviderReady(actualProvider)) {\n logError(`Provider ${actualProvider} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(actualProvider));\n return;\n }\n \n // Prompt to destroy current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Destroy current sandbox?');\n if (shouldDestroy) {\n await destroySandbox(state);\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n } else {\n logWarning('Keeping current sandbox. Provider remains unchanged.');\n }\n } else {\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n }\n}\n\n/**\n * Create a provider command handler\n * Supports: provider e2b, provider direct e2b, provider gateway e2b\n */\nexport function defineProviderCommand(state: WorkbenchState) {\n return async function provider(mode?: string, providerName?: string) {\n if (!mode) {\n // Show current provider\n if (state.currentProvider) {\n const modeStr = state.useDirectMode ? 'direct' : 'via gateway';\n console.log(`\\nCurrent provider: ${c.green(state.currentProvider)} (${modeStr})\\n`);\n } else {\n console.log(c.yellow('\\nNo provider selected\\n'));\n }\n return;\n }\n \n await switchProvider(state, mode, providerName);\n };\n}\n\n/**\n * Toggle between gateway and direct mode\n */\nexport async function toggleMode(state: WorkbenchState, mode?: 'gateway' | 'direct'): Promise<void> {\n const newMode = mode || (state.useDirectMode ? 'gateway' : 'direct');\n \n if (newMode === 'direct') {\n state.useDirectMode = true;\n logSuccess('Switched to direct mode 🔗');\n console.log(c.dim('Next sandbox will use direct provider packages\\n'));\n \n // If we have a sandbox and it's in gateway mode, suggest restart\n if (hasSandbox(state) && !state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in gateway mode.'));\n console.log(c.dim('Run \"restart\" to switch to direct mode\\n'));\n }\n } else {\n state.useDirectMode = false;\n logSuccess('Switched to gateway mode 🌐');\n console.log(c.dim('Next sandbox will use gateway (requires COMPUTESDK_API_KEY)\\n'));\n \n // If we have a sandbox and it's in direct mode, suggest restart\n if (hasSandbox(state) && state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in direct mode.'));\n console.log(c.dim('Run \"restart\" to switch to gateway mode\\n'));\n }\n }\n}\n\n/**\n * Show current mode\n */\nexport function showMode(state: WorkbenchState): void {\n const mode = state.useDirectMode ? 'direct' : 'gateway';\n const icon = mode === 'gateway' ? '🌐' : '🔗';\n \n console.log(`\\nCurrent mode: ${c.green(mode)} ${icon}`);\n \n if (mode === 'gateway') {\n console.log(c.dim('Routes through ComputeSDK API (requires COMPUTESDK_API_KEY)'));\n } else {\n console.log(c.dim('Direct connection to providers (requires provider packages)'));\n }\n \n console.log(`\\nSwitch with: ${c.cyan('provider e2b')} (gateway) or ${c.cyan('provider direct e2b')} (direct)\\n`);\n}\n\n/**\n * Toggle verbose mode\n */\nexport function toggleVerbose(state: WorkbenchState): void {\n state.verbose = !state.verbose;\n if (state.verbose) {\n logSuccess('Verbose mode enabled - will show full command results');\n console.log(c.dim('Commands will return full result objects with metadata\\n'));\n } else {\n logSuccess('Verbose mode disabled - showing clean output only');\n console.log(c.dim('Commands will only show stdout/stderr\\n'));\n }\n}\n\n/**\n * Show verbose mode status\n */\nexport function showVerbose(state: WorkbenchState): void {\n const status = state.verbose ? c.green('enabled') : c.dim('disabled');\n console.log(`\\nVerbose mode: ${status}`);\n \n if (state.verbose) {\n console.log(c.dim('Commands return full result objects with metadata'));\n } else {\n console.log(c.dim('Commands show only stdout/stderr'));\n }\n \n console.log(`\\nToggle with: ${c.cyan('verbose')}\\n`);\n}\n\n/**\n * Connect to an existing sandbox via URL\n * Useful for connecting to a locally running sandbox or a sandbox created elsewhere\n */\nexport async function connectToSandbox(state: WorkbenchState, sandboxUrl: string, token?: string): Promise<void> {\n // Validate URL format\n if (!sandboxUrl) {\n logError('Usage: connect <sandbox_url> [token]');\n console.log('Example: connect https://sandbox-123.localhost:8080');\n console.log('Example: connect https://sandbox-123.localhost:8080 your_access_token');\n return;\n }\n \n // Clean up URL (remove trailing slash)\n const cleanUrl = sandboxUrl.replace(/\\/$/, '');\n \n // Disconnect from current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Disconnect from current sandbox?');\n if (!shouldDestroy) {\n logWarning('Keeping current sandbox. Connection cancelled.');\n return;\n }\n // Just clear the reference, don't destroy since we don't own this sandbox\n clearSandbox(state);\n }\n \n const spinner = new Spinner(`Connecting to ${cleanUrl}...`).start();\n const startTime = Date.now();\n \n try {\n // Import Sandbox class from computesdk package (client is now merged into computesdk)\n const { Sandbox } = await import('computesdk');\n \n // Dynamically import WebSocket for Node.js environment\n let WebSocket: any;\n try {\n // @ts-expect-error - ws is an optional peer dependency that may not have type declarations\n const wsModule = await import('ws');\n WebSocket = wsModule.default;\n } catch {\n logError('Failed to import \"ws\" module. Please install it: pnpm add ws');\n throw new Error('Missing \"ws\" dependency');\n }\n \n // Create a Sandbox instance directly with optional token\n // WebSocket type comes from 'ws' module which may differ from browser WebSocket\n const sandbox = new Sandbox({\n sandboxUrl: cleanUrl,\n sandboxId: '', // Will be populated when we get info\n provider: 'connected', // Mark as directly connected\n token: token, // Optional access token\n WebSocket: WebSocket as typeof globalThis.WebSocket,\n });\n\n // Test the connection by getting sandbox info\n const info = await sandbox.getInfo();\n const duration = Date.now() - startTime;\n\n // Update state with the connected sandbox\n // Sandbox from @computesdk/client is the same class re-exported by computesdk\n setSandbox(state, sandbox, 'connected');\n \n spinner.succeed(`Connected to sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n console.log(c.dim(`Provider: ${info.provider || 'unknown'}`));\n console.log(c.dim(`Sandbox ID: ${info.id || 'unknown'}`));\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to connect ${c.dim(`(${formatDuration(duration)})`)}`);\n \n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Cleanup on exit\n */\nexport async function cleanupOnExit(state: WorkbenchState, replServer?: any): Promise<void> {\n if (!hasSandbox(state)) {\n return;\n }\n \n // Pause the REPL to prevent input conflicts\n if (replServer) {\n replServer.pause();\n }\n \n console.log(''); // New line\n \n // Don't offer to destroy if we're just connected to an external sandbox\n if (state.currentProvider === 'connected') {\n logWarning('Disconnecting from external sandbox (not destroying).');\n return;\n }\n \n const shouldDestroy = await confirm('Destroy active sandbox?');\n \n if (shouldDestroy) {\n await destroySandbox(state);\n } else {\n logWarning('Sandbox left running. It may incur costs.');\n }\n \n // Resume not needed since we're exiting\n}\n","#!/usr/bin/env node\n\n/**\n * ComputeSDK Workbench CLI Entry Point\n */\n\nimport { config } from 'dotenv';\nimport { startWorkbench } from '../cli/index.js';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n// Load .env from multiple possible locations\nconst possibleEnvPaths = [\n path.join(process.cwd(), '.env'), // Current directory\n path.join(process.cwd(), '../../.env'), // Monorepo root (if running from packages/workbench)\n path.join(__dirname, '../../.env'), // Relative to this script\n];\n\n// Try to load from first existing .env file\nfor (const envPath of possibleEnvPaths) {\n if (fs.existsSync(envPath)) {\n config({ path: envPath });\n break;\n }\n}\n\n// Start workbench\nstartWorkbench().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n","/**\n * ComputeSDK Workbench\n * \n * Interactive REPL for testing sandbox lifecycle operations\n */\n\nimport { createState } from './state.js';\nimport { createREPL } from './repl.js';\nimport { showWelcome } from './output.js';\nimport { getAvailableProviders, autoDetectProvider } from './providers.js';\nimport { cleanupOnExit } from './commands.js';\n\n/**\n * Start the workbench REPL\n */\nexport async function startWorkbench(): Promise<void> {\n // Create state\n const state = createState();\n \n // Detect available providers\n state.availableProviders = getAvailableProviders();\n const detectedProvider = autoDetectProvider();\n \n // Determine mode based on what's available\n const hasGateway = state.availableProviders.includes('gateway');\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n \n if (hasGateway && backendProviders.length > 0) {\n // Gateway is available - use it with first backend provider\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Use gateway mode\n } else if (backendProviders.length > 0) {\n // No gateway, but we have direct providers - use direct mode\n state.currentProvider = backendProviders[0];\n state.useDirectMode = true; // Use direct mode\n } else {\n // No providers at all\n state.currentProvider = detectedProvider;\n state.useDirectMode = false;\n }\n \n // Show welcome banner\n showWelcome(state.availableProviders, state.currentProvider, state.useDirectMode);\n \n // Create REPL\n const replServer = createREPL(state);\n \n // Handle exit\n replServer.on('exit', async () => {\n await cleanupOnExit(state, replServer);\n process.exit(0);\n });\n}\n","/**\n * REPL setup and configuration\n * \n * Creates Node.js REPL with:\n * - Tab autocomplete for @computesdk/cmd functions\n * - Smart command evaluation (auto-run Command arrays)\n * - Workbench command injection\n */\n\nimport * as repl from 'repl';\nimport * as cmd from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { runCommand, defineProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose, connectToSandbox } from './commands.js';\nimport { showHelp, showInfo } from './output.js';\nimport { showProviders, showEnv, PROVIDER_NAMES } from './providers.js';\nimport { isCommand } from './types.js';\n\n/**\n * Extended REPL server interface with custom eval function\n */\ninterface ExtendedREPLServer extends repl.REPLServer {\n eval: (\n cmd: string,\n context: object,\n filename: string,\n callback: (err: Error | null, result: any) => void\n ) => void;\n}\nimport * as path from 'path';\nimport * as os from 'os';\n\n/**\n * Create and configure REPL server\n */\nexport function createREPL(state: WorkbenchState): repl.REPLServer {\n const replServer = repl.start({\n prompt: '> ', // Initial prompt, will be updated by state management\n useColors: true,\n terminal: true,\n useGlobal: false,\n ignoreUndefined: true,\n });\n\n // Inject cmd context for autocomplete\n injectCmdContext(replServer);\n \n // Inject workbench commands\n injectWorkbenchCommands(replServer, state);\n \n // Setup custom evaluator\n setupSmartEvaluator(replServer, state);\n \n // Setup custom autocomplete\n setupAutocomplete(replServer, state);\n \n // Setup command history\n setupHistory(replServer);\n \n // Store replServer reference for prompt updates\n state._replServer = replServer;\n\n return replServer;\n}\n\n/**\n * Inject all @computesdk/cmd exports into REPL context for autocomplete\n */\nfunction injectCmdContext(replServer: repl.REPLServer) {\n // Package managers\n replServer.context.npm = cmd.npm;\n replServer.context.pnpm = cmd.pnpm;\n replServer.context.yarn = cmd.yarn;\n replServer.context.bun = cmd.bun;\n replServer.context.pip = cmd.pip;\n replServer.context.uv = cmd.uv;\n replServer.context.poetry = cmd.poetry;\n replServer.context.pipx = cmd.pipx;\n \n // Package runners\n replServer.context.npx = cmd.npx;\n replServer.context.bunx = cmd.bunx;\n replServer.context.deno = cmd.deno;\n \n // Git\n replServer.context.git = cmd.git;\n \n // Filesystem\n replServer.context.mkdir = cmd.mkdir;\n replServer.context.rm = cmd.rm;\n replServer.context.cp = cmd.cp;\n replServer.context.mv = cmd.mv;\n replServer.context.ls = cmd.ls;\n replServer.context.pwd = cmd.pwd;\n replServer.context.chmod = cmd.chmod;\n replServer.context.chown = cmd.chown;\n replServer.context.touch = cmd.touch;\n replServer.context.cat = cmd.cat;\n replServer.context.ln = cmd.ln;\n replServer.context.readlink = cmd.readlink;\n replServer.context.test = cmd.test;\n replServer.context.rsync = cmd.rsync;\n \n // Process\n replServer.context.node = cmd.node;\n replServer.context.python = cmd.python;\n replServer.context.kill = cmd.kill;\n replServer.context.pkill = cmd.pkill;\n replServer.context.ps = cmd.ps;\n replServer.context.timeout = cmd.timeout;\n \n // Network\n replServer.context.curl = cmd.curl;\n replServer.context.wget = cmd.wget;\n replServer.context.port = cmd.port;\n replServer.context.net = cmd.net;\n \n // Text processing\n replServer.context.grep = cmd.grep;\n replServer.context.sed = cmd.sed;\n replServer.context.head = cmd.head;\n replServer.context.tail = cmd.tail;\n replServer.context.wc = cmd.wc;\n replServer.context.sort = cmd.sort;\n replServer.context.uniq = cmd.uniq;\n replServer.context.jq = cmd.jq;\n replServer.context.xargs = cmd.xargs;\n replServer.context.awk = cmd.awk;\n replServer.context.cut = cmd.cut;\n replServer.context.tr = cmd.tr;\n \n // Archives\n replServer.context.tar = cmd.tar;\n replServer.context.unzip = cmd.unzip;\n \n // System\n replServer.context.echo = cmd.echo;\n replServer.context.env = cmd.env;\n replServer.context.printenv = cmd.printenv;\n replServer.context.which = cmd.which;\n replServer.context.whoami = cmd.whoami;\n replServer.context.uname = cmd.uname;\n replServer.context.hostname = cmd.hostname;\n replServer.context.df = cmd.df;\n replServer.context.du = cmd.du;\n replServer.context.sleep = cmd.sleep;\n replServer.context.date = cmd.date;\n replServer.context.find = cmd.find;\n replServer.context.tee = cmd.tee;\n replServer.context.diff = cmd.diff;\n replServer.context.parallel = cmd.parallel;\n replServer.context.raw = cmd.raw;\n replServer.context.base64 = cmd.base64;\n replServer.context.md5sum = cmd.md5sum;\n replServer.context.sha256sum = cmd.sha256sum;\n replServer.context.sha1sum = cmd.sha1sum;\n \n // Compute\n replServer.context.compute = cmd.compute;\n \n // Shell wrappers (for wrapping commands with cwd/background options)\n replServer.context.shell = cmd.shell;\n replServer.context.sh = cmd.sh;\n replServer.context.bash = cmd.bash;\n replServer.context.zsh = cmd.zsh;\n}\n\n/**\n * Inject workbench-specific commands\n */\nfunction injectWorkbenchCommands(replServer: repl.REPLServer, state: WorkbenchState) {\n // Provider management\n replServer.context.provider = defineProviderCommand(state);\n replServer.context.providers = () => showProviders();\n \n // Mode management\n replServer.context.mode = async (modeName?: 'gateway' | 'direct') => {\n if (!modeName) {\n showMode(state);\n } else {\n await toggleMode(state, modeName);\n }\n };\n \n // Sandbox operations\n replServer.context.restart = async () => {\n await restartSandbox(state);\n };\n \n replServer.context.destroy = async () => {\n await destroySandbox(state);\n };\n \n replServer.context.connect = async (url: string, token?: string) => {\n await connectToSandbox(state, url, token);\n };\n \n replServer.context.info = () => showInfo(state);\n \n // Output control\n replServer.context.verbose = () => {\n toggleVerbose(state);\n showVerbose(state);\n };\n \n // Background execution helper - accepts string or Command\n replServer.context.bg = (command: string | string[]) => {\n const cmdArray = typeof command === 'string' \n ? ['sh', '-c', command]\n : command;\n return cmd.sh(cmdArray as any, { background: true });\n };\n \n // Environment/help\n replServer.context.env = () => showEnv();\n replServer.context.help = showHelp;\n \n // Expose sandbox methods directly in context\n // These are lazy-evaluated to get the current sandbox\n \n // Expose getUrl directly\n replServer.context.getUrl = async (options: { port: number; protocol?: string }) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getUrl(options);\n };\n \n // Expose getInfo as sandboxInfo (since 'info' is already taken for workbench info)\n replServer.context.sandboxInfo = async () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInfo();\n };\n \n // Expose runCode directly\n replServer.context.runCode = async (code: string, runtime?: 'node' | 'python') => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCode(code, runtime);\n };\n \n // Expose runCommand directly with full options support (background, cwd, env)\n replServer.context.runCommand = async (\n command: string,\n options?: { background?: boolean; cwd?: string; env?: Record<string, string> }\n ) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCommand(command, options);\n };\n \n // Expose sandbox creation methods (gateway mode only)\n // These return clean { sandboxId, metadata } objects instead of full GeneratedSandbox\n replServer.context.create = async (options?: Record<string, unknown>) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching from existing sandbox\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n // User chose not to switch - create but don't activate\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Create sandbox (may throw error)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n // Only set as current after successful creation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.findOrCreate = async (options: { name: string; namespace?: string; timeout?: number; runtime?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (findOrCreate) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Find or create sandbox\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n // Set as current after successful operation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.find = async (options: { name: string; namespace?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (find) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Find sandbox first (may return null)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.find(options);\n \n if (!sandbox) {\n return null; // Not found, nothing to switch to\n }\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Set as current\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n // Expose filesystem namespace\n replServer.context.filesystem = {\n get readFile() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readFile(path);\n };\n },\n get writeFile() {\n return async (path: string, content: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.writeFile(path, content);\n };\n },\n get mkdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.mkdir(path);\n };\n },\n get readdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readdir(path);\n };\n },\n get exists() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.exists(path);\n };\n },\n get remove() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.remove(path);\n };\n }\n };\n \n // Expose child namespace for child sandbox operations (gateway mode only)\n replServer.context.child = {\n get create() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.create();\n };\n },\n get list() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.list();\n };\n },\n get retrieve() {\n return async (subdomain: string) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.retrieve(subdomain);\n };\n },\n get destroy() {\n return async (subdomain: string, options?: { deleteFiles?: boolean }) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.destroy(subdomain, options);\n };\n }\n };\n \n // Expose getInstance for advanced users\n replServer.context.getInstance = () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInstance();\n };\n}\n\n/**\n * Setup smart evaluator that auto-runs Command arrays and workbench commands\n */\nfunction setupSmartEvaluator(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalEval = replServer.eval;\n \n // Track workbench command names for auto-calling\n const workbenchCommands = new Set(['help', 'providers', 'info', 'env', 'restart', 'destroy', 'mode', 'verbose', 'sandboxInfo', 'connect']);\n \n (replServer as ExtendedREPLServer).eval = function (cmd: string, context: object, filename: string, callback: (err: Error | null, result: any) => void) {\n const trimmedCmd = cmd.trim();\n \n // Special handling for \"provider <mode> <name>\" syntax (without parentheses)\n // Supports: \"provider e2b\", \"provider direct e2b\", \"provider gateway e2b\"\n const providerMatch = trimmedCmd.match(/^provider(?:\\s+(direct|gateway))?\\s+(\\w+)$/);\n if (providerMatch) {\n const mode = providerMatch[1] || null; // 'direct', 'gateway', or null\n const providerName = providerMatch[2];\n const providerCmd = mode \n ? `await provider('${mode}', '${providerName}')`\n : `await provider('${providerName}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Also handle just \"provider direct\" or \"provider gateway\" alone \n const providerOnlyMatch = trimmedCmd.match(/^provider\\s+(direct|gateway)$/);\n if (providerOnlyMatch) {\n const mode = providerOnlyMatch[1];\n const providerCmd = `await provider('${mode}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Special handling for \"mode <gateway|direct>\" syntax\n const modeMatch = trimmedCmd.match(/^mode\\s+(gateway|direct)$/);\n if (modeMatch) {\n const modeName = modeMatch[1];\n const modeCmd = `await mode('${modeName}')`;\n originalEval.call(this, modeCmd, context, filename, callback);\n return;\n }\n \n // Special handling for $command syntax (direct shell command execution)\n const dollarMatch = trimmedCmd.match(/^\\$(.+)$/);\n if (dollarMatch) {\n const shellCmd = dollarMatch[1].trim();\n \n // Handle empty command\n if (!shellCmd) {\n callback(new Error('Empty command after $'), undefined);\n return;\n }\n \n // Create command array: ['sh', '-c', 'the command']\n const command = ['sh', '-c', shellCmd];\n \n // Execute the command directly\n runCommand(state, command)\n .then(output => callback(null, output))\n .catch(error => callback(error as Error, undefined));\n return;\n }\n \n // Use original eval to get the result\n originalEval.call(this, cmd, context, filename, async (err, result) => {\n if (err) {\n callback(err, undefined);\n return;\n }\n \n // Check if result is a Command (string array from @computesdk/cmd)\n if (isCommand(result)) {\n try {\n const output = await runCommand(state, result);\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Check if it's a workbench command function that should be auto-called\n if (typeof result === 'function' && workbenchCommands.has(trimmedCmd)) {\n try {\n const output = await result();\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Auto-await promises (so users don't need to type \"await\")\n if (result && typeof result.then === 'function') {\n try {\n const output = await result;\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Not a command or promise, return as-is\n callback(null, result);\n });\n };\n}\n\n/**\n * Setup custom autocomplete\n */\nfunction setupAutocomplete(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalCompleter = replServer.completer as any;\n \n // Workbench commands with their argument suggestions\n const workbenchCommands = {\n 'provider': [...PROVIDER_NAMES], // Use actual provider names from config\n 'mode': ['gateway', 'direct'],\n 'providers': [],\n 'restart': [],\n 'destroy': [],\n 'connect': [], // Connect takes a URL argument\n 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n // Sandbox methods\n 'getUrl': [],\n 'runCode': [],\n 'sandboxInfo': [],\n 'getInstance': [],\n // Filesystem is an object, so it gets dot notation autocomplete automatically\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\n try {\n // Don't trim - we need to detect trailing spaces\n const trimmed = line.trim();\n \n // Complete workbench command names (no space or dot in line)\n if (!line.includes(' ') && !line.includes('.')) {\n const commands = Object.keys(workbenchCommands);\n const hits = commands.filter(cmd => cmd.startsWith(trimmed));\n \n // Also get context completions from original completer\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n // Validate result format\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n const [contextHits, partial] = result;\n if (!Array.isArray(contextHits)) {\n callback(null, [hits, trimmed]);\n return;\n }\n\n // Merge workbench commands with context completions\n const allHits = [...new Set([...hits, ...contextHits])].sort();\n const completionPrefix = typeof partial === 'string' ? partial : trimmed;\n callback(null, [allHits, completionPrefix]);\n });\n return;\n }\n \n callback(null, [hits.length ? hits : commands, trimmed]);\n return;\n }\n \n // Complete command arguments (e.g., \"provider e\" -> \"provider e2b\")\n // Use original line to detect spaces properly\n if (line.includes(' ') && !line.includes('.')) {\n const parts = line.split(' ');\n const command = parts[0].trim();\n const partial = parts.slice(1).join(' ').trim(); // Everything after command\n const suggestions = workbenchCommands[command as keyof typeof workbenchCommands];\n \n // Check if this is a known workbench command\n if (suggestions !== undefined) {\n if (suggestions.length > 0) {\n const hits = suggestions\n .filter(s => s.startsWith(partial))\n .map(s => `${command} ${s}`);\n \n callback(null, [hits.length ? hits : suggestions.map(s => `${command} ${s}`), line]);\n } else {\n // For commands with no arguments (like 'info', 'help', etc.), return empty\n callback(null, [[], line]);\n }\n return;\n }\n }\n \n // Fall back to original completer (this handles npm., git., etc.)\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [[], line]);\n return;\n }\n \n // Validate result format before passing it along\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [[], line]);\n return;\n }\n \n const [completions, partial] = result;\n if (!Array.isArray(completions) || typeof partial !== 'string') {\n callback(null, [[], line]);\n return;\n }\n \n callback(null, [completions, partial]);\n });\n } else {\n callback(null, [[], line]);\n }\n } catch (error) {\n // Catch any unexpected errors to prevent crashing the REPL\n console.error('Autocomplete error:', error);\n callback(null, [[], line]);\n }\n };\n}\n\n/**\n * Setup command history\n */\nfunction setupHistory(replServer: repl.REPLServer) {\n const historyFile = path.join(os.homedir(), '.computesdk_workbench_history');\n \n replServer.setupHistory(historyFile, (err) => {\n if (err) {\n // Silent fail - history is nice-to-have\n }\n });\n}\n","/**\n * Workbench type definitions\n */\n\nimport type { Command } from '@computesdk/cmd';\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Provider status information\n */\nexport interface ProviderStatus {\n name: string;\n isComplete: boolean;\n present: string[];\n missing: string[];\n}\n\n/**\n * Type guard to check if value is a Command (string array)\n */\nexport function isCommand(value: unknown): value is Command {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n );\n}\n"],"mappings":"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","names":["config","compute","config","path","getComputeInstance","confirmSandboxSwitch","setSandbox","logSuccess","compute","sandbox","cmd","path"]}
|
package/dist/index.js
CHANGED
|
@@ -1088,7 +1088,6 @@ function injectCmdContext(replServer) {
|
|
|
1088
1088
|
replServer.context.sha256sum = cmd.sha256sum;
|
|
1089
1089
|
replServer.context.sha1sum = cmd.sha1sum;
|
|
1090
1090
|
replServer.context.compute = cmd.compute;
|
|
1091
|
-
replServer.context.cmd = cmd.cmd;
|
|
1092
1091
|
replServer.context.shell = cmd.shell;
|
|
1093
1092
|
replServer.context.sh = cmd.sh;
|
|
1094
1093
|
replServer.context.bash = cmd.bash;
|
|
@@ -1363,8 +1362,8 @@ function injectWorkbenchCommands(replServer, state) {
|
|
|
1363
1362
|
function setupSmartEvaluator(replServer, state) {
|
|
1364
1363
|
const originalEval = replServer.eval;
|
|
1365
1364
|
const workbenchCommands = /* @__PURE__ */ new Set(["help", "providers", "info", "env", "restart", "destroy", "mode", "verbose", "sandboxInfo", "connect"]);
|
|
1366
|
-
replServer.eval = function(
|
|
1367
|
-
const trimmedCmd =
|
|
1365
|
+
replServer.eval = function(cmd2, context, filename, callback) {
|
|
1366
|
+
const trimmedCmd = cmd2.trim();
|
|
1368
1367
|
const providerMatch = trimmedCmd.match(/^provider(?:\s+(direct|gateway))?\s+(\w+)$/);
|
|
1369
1368
|
if (providerMatch) {
|
|
1370
1369
|
const mode = providerMatch[1] || null;
|
|
@@ -1398,7 +1397,7 @@ function setupSmartEvaluator(replServer, state) {
|
|
|
1398
1397
|
runCommand(state, command).then((output) => callback(null, output)).catch((error) => callback(error, void 0));
|
|
1399
1398
|
return;
|
|
1400
1399
|
}
|
|
1401
|
-
originalEval.call(this,
|
|
1400
|
+
originalEval.call(this, cmd2, context, filename, async (err, result) => {
|
|
1402
1401
|
if (err) {
|
|
1403
1402
|
callback(err, void 0);
|
|
1404
1403
|
return;
|
|
@@ -1463,7 +1462,7 @@ function setupAutocomplete(replServer, state) {
|
|
|
1463
1462
|
const trimmed = line.trim();
|
|
1464
1463
|
if (!line.includes(" ") && !line.includes(".")) {
|
|
1465
1464
|
const commands = Object.keys(workbenchCommands);
|
|
1466
|
-
const hits = commands.filter((
|
|
1465
|
+
const hits = commands.filter((cmd2) => cmd2.startsWith(trimmed));
|
|
1467
1466
|
if (originalCompleter) {
|
|
1468
1467
|
originalCompleter.call(replServer, line, (err, result) => {
|
|
1469
1468
|
if (err || !result) {
|
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.0/node_modules/tsup/assets/esm_shims.js","../src/cli/state.ts","../src/cli/output.ts","../src/cli/providers.ts","../src/cli/commands.ts","../src/cli/index.ts","../src/cli/repl.ts","../src/cli/types.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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox } from 'computesdk';\nimport type { ProviderSandbox } from '@computesdk/provider';\nimport type { REPLServer } from 'repl';\n\n/** Sandbox can be either client Sandbox (gateway mode) or ProviderSandbox (direct mode) */\ntype WorkbenchSandbox = Sandbox | ProviderSandbox;\n\n/**\n * Workbench session state\n */\nexport interface WorkbenchState {\n /** Currently active provider (e2b, railway, etc.) */\n currentProvider: string | null;\n\n /** Current sandbox instance */\n currentSandbox: WorkbenchSandbox | null;\n \n /** When the current sandbox was created */\n sandboxCreatedAt: Date | null;\n \n /** List of providers detected from environment */\n availableProviders: string[];\n \n /** Whether to use direct mode (true) or gateway mode (false, default) */\n useDirectMode: boolean;\n \n /** Show verbose command output (full result object) */\n verbose: boolean;\n \n /** Compute instance (for creating named sandboxes, etc.) */\n compute: any | null;\n \n /** Internal: REPL server reference for updating prompt */\n _replServer?: REPLServer;\n}\n\n/**\n * Create initial workbench state\n */\nexport function createState(): WorkbenchState {\n return {\n currentProvider: null,\n currentSandbox: null,\n sandboxCreatedAt: null,\n availableProviders: [],\n useDirectMode: false, // Default to gateway mode\n verbose: false,\n compute: null,\n };\n}\n\n/**\n * Get current sandbox, throwing if none exists\n */\nexport function getCurrentSandbox(state: WorkbenchState): WorkbenchSandbox {\n if (!state.currentSandbox) {\n throw new Error('No active sandbox');\n }\n return state.currentSandbox;\n}\n\n/**\n * Set current sandbox\n */\nexport function setSandbox(state: WorkbenchState, sandbox: WorkbenchSandbox, provider: string) {\n state.currentSandbox = sandbox;\n state.currentProvider = provider;\n state.sandboxCreatedAt = new Date();\n updatePromptIfNeeded(state);\n}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\n updatePromptIfNeeded(state);\n}\n\n/**\n * Update REPL prompt if replServer is available\n * @internal\n */\nfunction updatePromptIfNeeded(state: WorkbenchState) {\n if (state._replServer) {\n const prompt = getPrompt(state);\n state._replServer.setPrompt(prompt);\n }\n}\n\n/**\n * Get prompt string based on current state\n * @internal\n */\nfunction getPrompt(state: WorkbenchState): string {\n if (!state.currentSandbox) {\n return '> ';\n }\n \n const provider = state.currentProvider || 'unknown';\n const sandboxId = state.currentSandbox.sandboxId || '';\n\n // Use full sandbox ID for now\n // User can see exactly which sandbox they're connected to\n return `${provider}:${sandboxId}> `;\n}\n\n/**\n * Check if a sandbox is currently active\n */\nexport function hasSandbox(state: WorkbenchState): boolean {\n return state.currentSandbox !== null;\n}\n\n/**\n * Get sandbox uptime in seconds\n */\nexport function getUptimeSeconds(state: WorkbenchState): number {\n if (!state.sandboxCreatedAt) return 0;\n return Math.floor((Date.now() - state.sandboxCreatedAt.getTime()) / 1000);\n}\n\n/**\n * Format uptime as human-readable string\n */\nexport function formatUptime(state: WorkbenchState): string {\n const seconds = getUptimeSeconds(state);\n \n if (seconds < 60) {\n return `${seconds} second${seconds === 1 ? '' : 's'}`;\n }\n \n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? '' : 's'}`;\n }\n \n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n","/**\n * Output formatting utilities\n * \n * Provides consistent, colorful output for workbench\n */\n\nimport type { WorkbenchState } from './state.js';\nimport { formatUptime } from './state.js';\n\n/**\n * ANSI color codes (simple, no dependencies for now)\n */\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n \n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n};\n\n/**\n * Color helpers\n */\nexport const c = {\n bold: (text: string) => `${colors.bright}${text}${colors.reset}`,\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\n blue: (text: string) => `${colors.blue}${text}${colors.reset}`,\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\n};\n\n/**\n * Display welcome banner\n */\nexport function showWelcome(availableProviders: string[], currentProvider: string | null, useDirectMode: boolean) {\n console.log(c.bold(c.cyan('\\n╔═══════════════════════════════════════════════════════╗')));\n console.log(c.bold(c.cyan('║ ComputeSDK Workbench ║')));\n console.log(c.bold(c.cyan('╚═══════════════════════════════════════════════════════╝\\n')));\n console.log(c.dim('Prompt shows connection status: > (disconnected) or provider:sandbox> (connected)\\n'));\n \n if (availableProviders.length > 0) {\n // Filter out 'gateway' from the list since it's not a real backend provider\n const backendProviders = availableProviders.filter(p => p !== 'gateway');\n console.log(`Providers available: ${backendProviders.join(', ')}`);\n \n if (currentProvider) {\n if (useDirectMode) {\n console.log(`Current provider: ${c.green(currentProvider)} (🔗 direct mode)\\n`);\n } else {\n // Gateway mode - show which backend will be used\n const backendProvider = currentProvider === 'gateway' \n ? (backendProviders[0] || 'auto')\n : currentProvider;\n console.log(`Current provider: ${c.green(backendProvider)} (🌐 via gateway)\\n`);\n }\n } else {\n console.log(`\\n${c.dim('Tip: Use \"provider <name>\" to select a provider')}\\n`);\n }\n } else {\n console.log(c.yellow('⚠️ No providers detected.\\n'));\n console.log('To get started:');\n console.log(' 1. Copy .env.example to .env');\n console.log(' 2. Add your provider credentials');\n console.log(' 3. Restart workbench\\n');\n console.log(c.dim('Type \"env\" to see required environment variables\\n'));\n }\n \n console.log(c.dim('Type \"help\" for available commands\\n'));\n}\n\n\n\n/**\n * Display sandbox info\n */\nexport function showInfo(state: WorkbenchState) {\n if (!state.currentSandbox) {\n console.log(c.yellow('\\nNo active sandbox\\n'));\n return;\n }\n \n console.log('\\n' + c.bold('Current Sandbox:'));\n \n // Show sandbox ID if available\n if (state.currentSandbox.sandboxId) {\n console.log(` Sandbox ID: ${c.cyan(state.currentSandbox.sandboxId)}`);\n }\n \n console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\n \n // Show connection mode (gateway or direct)\n const modeLabel = state.useDirectMode ? 'direct 🔗' : 'gateway 🌐';\n console.log(` Mode: ${c.blue(modeLabel)}`);\n \n console.log(` Created: ${state.sandboxCreatedAt?.toLocaleString() || 'unknown'}`);\n console.log(` Uptime: ${formatUptime(state)}`);\n console.log('');\n}\n\n/**\n * Simple spinner class (no external deps)\n */\nexport class Spinner {\n private interval: NodeJS.Timeout | null = null;\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private currentFrame = 0;\n private text: string;\n \n constructor(text: string) {\n this.text = text;\n }\n \n start(): this {\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.interval = setInterval(() => {\n const frame = this.frames[this.currentFrame];\n process.stdout.write(`\\r${c.cyan(frame)} ${this.text}`);\n this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n }, 80);\n return this;\n }\n \n succeed(text?: string): void {\n this.stop();\n console.log(`${c.green('✅')} ${text || this.text}`);\n }\n \n fail(text?: string): void {\n this.stop();\n console.log(`${c.red('❌')} ${text || this.text}`);\n }\n \n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Show cursor\n }\n}\n\n/**\n * Format duration in seconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n const seconds = ms / 1000;\n if (seconds < 1) {\n return `${ms}ms`;\n }\n return `${seconds.toFixed(1)}s`;\n}\n\n/**\n * Log command being run\n */\nexport function logCommand(command: string[]) {\n console.log(c.dim(`Running: ${command.join(' ')}`));\n}\n\n/**\n * Log success\n */\nexport function logSuccess(message: string, duration?: number) {\n const durationStr = duration ? ` (${formatDuration(duration)})` : '';\n console.log(c.green(`✅ ${message}${durationStr}`));\n}\n\n/**\n * Display help text\n */\nexport function showHelp() {\n console.log(`\n${c.bold('ComputeSDK Workbench Commands')}\n\n${c.bold('Provider Management:')}\n ${c.cyan('provider <name>')} Switch to provider via gateway (default)\n ${c.dim('Example: provider e2b')}\n ${c.cyan('provider direct <name>')} Connect directly to provider\n ${c.dim('Example: provider direct e2b')}\n ${c.cyan('providers')} List all providers with status\n ${c.cyan('mode <gateway|direct>')} Toggle default mode for next sandbox\n\n${c.bold('Provider Modes:')}\n ${c.bold('Gateway (default)')}: Routes through ComputeSDK API, zero-config\n • Requires: COMPUTESDK_API_KEY + provider credentials\n • Usage: ${c.cyan('provider e2b')}\n \n ${c.bold('Direct')}: Connects directly to provider, requires packages\n • Requires: Provider package installed + credentials\n • Usage: ${c.cyan('provider direct e2b')}\n\n${c.bold('Sandbox Management:')}\n ${c.cyan('restart')} Restart current sandbox\n ${c.cyan('destroy')} Destroy current sandbox\n ${c.cyan('connect <url> [token]')} Connect to existing sandbox via URL\n ${c.dim('Example: connect https://sandbox-123.localhost:8080')}\n ${c.dim('Example: connect https://sandbox-123.localhost:8080 your_token')}\n ${c.cyan('info')} Show sandbox info (provider, uptime)\n\n${c.bold('Environment:')}\n ${c.cyan('env')} Show environment/credentials status\n ${c.cyan('verbose')} Toggle verbose output mode\n\n${c.bold('Help:')}\n ${c.cyan('help')} Show this help message\n ${c.cyan('exit')} or ${c.cyan('.exit')} Exit workbench\n\n${c.bold('Running Commands:')}\n Type any @computesdk/cmd function and it will run automatically:\n \n ${c.dim('Package Managers:')}\n ${c.cyan('npm.install(\"express\")')}\n ${c.cyan('pip.install(\"requests\")')}\n \n ${c.dim('Git:')}\n ${c.cyan('git.clone(\"https://github.com/user/repo\")')}\n ${c.cyan('git.status()')}\n \n ${c.dim('Filesystem (via commands):')}\n ${c.cyan('ls(\"/home\")')}\n ${c.cyan('cat(\"/etc/hosts\")')}\n ${c.cyan('rm.rf(\"/tmp\")')} ${c.dim('// Force remove')}\n ${c.cyan('rm.auto(\"/path\")')} ${c.dim('// Smart remove')}\n \n ${c.dim('Filesystem (direct API):')}\n ${c.cyan('filesystem.readFile(\"/etc/hosts\")')}\n ${c.cyan('filesystem.writeFile(\"/app/server.js\", code)')}\n ${c.cyan('filesystem.mkdir(\"/app\")')}\n ${c.cyan('filesystem.readdir(\"/home\")')}\n ${c.cyan('filesystem.exists(\"/path\")')}\n ${c.cyan('filesystem.remove(\"/file\")')}\n \n ${c.dim('Named Sandboxes (gateway mode only):')}\n ${c.cyan('create()')} ${c.dim('// Create & switch to new sandbox')}\n ${c.cyan('create({ namespace: \"h\" })')} ${c.dim('// Create with namespace & switch')}\n ${c.cyan('findOrCreate({ name: \"my-app\" })')} ${c.dim('// Find or create & switch')}\n ${c.cyan('find({ name: \"my-app\" })')} ${c.dim('// Find existing & switch')}\n \n ${c.dim('Note: Prompts before switching if you already have an active sandbox')}\n \n ${c.dim('Child Sandboxes (gateway mode only):')}\n ${c.cyan('child.create()')} ${c.dim('// Create child sandbox')}\n ${c.cyan('child.list()')} ${c.dim('// List all children')}\n ${c.cyan('child.retrieve(\"sandbox-id\")')} ${c.dim('// Get child info')}\n ${c.cyan('child.destroy(\"sandbox-id\")')} ${c.dim('// Delete child')}\n \n ${c.dim('Sandbox Methods:')}\n ${c.cyan('getUrl({ port: 3000 })')} ${c.dim('// Get public URL')}\n ${c.cyan('runCode(\"console.log(\\'hi\\')\", \"node\")')}\n ${c.cyan('sandboxInfo()')} ${c.dim('// Get sandbox details')}\n ${c.cyan('getInstance()')} ${c.dim('// Get native instance')}\n \n ${c.dim('Note: No need to use \"await\" - promises are auto-awaited!')}\n \n ${c.dim('Compute CLI:')}\n ${c.cyan('compute.isSetup()')} ${c.dim('// Check if daemon is running')}\n ${c.cyan('compute.setup()')} ${c.dim('// Install + start daemon')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute CLI')}\n ${c.cyan('compute.start()')} ${c.dim('// Start daemon')}\n ${c.cyan('compute.health()')} ${c.dim('// Check daemon health')}\n\n${c.bold('Shell Commands:')}\n Use ${c.cyan('$')} prefix to run any shell command directly:\n ${c.cyan('$ls -la /app')}\n ${c.cyan('$npm install express')}\n ${c.cyan('$git status')}\n ${c.cyan('$compute --help')}\n\n${c.bold('Background Execution:')}\n ${c.cyan('sh(\"npm start\", { background: true })')}\n ${c.cyan('sh(\"python -m http.server 8000\", { background: true })')}\n\n${c.dim('Press Tab for autocomplete on all commands!')}\n`);\n}\n\n/**\n * Log error\n */\nexport function logError(message: string) {\n console.log(c.red(`❌ ${message}`));\n}\n\n/**\n * Log warning\n */\nexport function logWarning(message: string) {\n console.log(c.yellow(`⚠️ ${message}`));\n}\n\n/**\n * Log info\n */\nexport function logInfo(message: string) {\n console.log(c.blue(`ℹ️ ${message}`));\n}\n","/**\n * Provider detection and management for workbench\n *\n * Uses shared provider config from computesdk as single source of truth\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\nimport {\n PROVIDER_AUTH as SHARED_PROVIDER_AUTH,\n PROVIDER_NAMES as SHARED_PROVIDER_NAMES,\n PROVIDER_ENV_MAP,\n type ProviderName as SharedProviderName,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n} from 'computesdk';\n\n/**\n * Workbench-specific provider names (includes gateway)\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n ...SHARED_PROVIDER_NAMES,\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Auth requirements for each provider\n * Extends shared config with gateway-specific auth\n */\nexport const PROVIDER_AUTH: Record<ProviderName, readonly (readonly string[])[]> = {\n gateway: [['COMPUTESDK_API_KEY']],\n ...SHARED_PROVIDER_AUTH,\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n const authOptions = PROVIDER_AUTH[provider];\n\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...authOptions[0]],\n };\n }\n\n // Build a set of all present env vars (checked once per unique var)\n const allVars = new Set(authOptions.flat());\n const presentSet = new Set<string>();\n for (const v of allVars) {\n if (process.env?.[v]) presentSet.add(v);\n }\n\n // Evaluate each auth option in a single pass\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const v of option) {\n if (presentSet.has(v)) {\n presentCount++;\n } else {\n missing.push(v);\n }\n }\n\n // If all vars present, this option is satisfied\n if (missing.length === 0) {\n return {\n name: provider,\n isComplete: true,\n present: [...presentSet],\n missing: [],\n };\n }\n\n // Track the option closest to completion\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return {\n name: provider,\n isComplete: false,\n present: [...presentSet],\n missing: bestOption?.missing ?? [],\n };\n}\n\n/**\n * Get all available (fully configured) providers\n */\nexport function getAvailableProviders(): string[] {\n return PROVIDER_NAMES.filter(provider => {\n const status = getProviderStatus(provider);\n return status.isComplete;\n });\n}\n\n/**\n * Display all providers with their status\n */\nexport function showProviders() {\n console.log('\\n' + c.bold('Provider Status:'));\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} ${provider} - Ready`);\n } else if (status.present.length > 0) {\n const ratio = `${status.present.length}/${status.present.length + status.missing.length}`;\n console.log(` ${c.yellow('⚠️ ')} ${provider} - Incomplete (${ratio} credentials)`);\n console.log(` ${c.dim('Missing:')} ${status.missing.join(', ')}`);\n } else {\n console.log(` ${c.dim('❌')} ${c.dim(provider)} - Not configured`);\n }\n }\n\n console.log('');\n}\n\n/**\n * Display environment status with helpful setup instructions\n */\nexport function showEnv() {\n console.log('\\n' + c.bold('Environment Configuration:'));\n console.log('');\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n console.log(c.bold(`${provider}:`));\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} All credentials present`);\n status.present.forEach(varName => {\n console.log(` ${c.dim('•')} ${varName}`);\n });\n } else {\n if (status.present.length > 0) {\n console.log(c.dim(' Present:'));\n status.present.forEach(varName => {\n console.log(` ${c.green('✓')} ${varName}`);\n });\n }\n\n if (status.missing.length > 0) {\n console.log(c.dim(' Missing:'));\n status.missing.forEach(varName => {\n console.log(` ${c.red('✗')} ${varName}`);\n });\n }\n }\n\n console.log('');\n }\n\n console.log(c.dim('Tip: Set credentials in your .env file'));\n console.log('');\n}\n\n/**\n * Auto-detect best provider to use\n */\nexport function autoDetectProvider(forceGatewayMode = false): string | null {\n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && isValidProvider(explicit) && isProviderReady(explicit)) {\n return explicit;\n }\n\n // If forcing gateway mode, only return gateway if available\n if (forceGatewayMode) {\n return isProviderReady('gateway') ? 'gateway' : null;\n }\n\n // Auto-detect based on priority order\n for (const provider of PROVIDER_NAMES) {\n if (isProviderReady(provider)) {\n return provider;\n }\n }\n\n return null;\n}\n\n/**\n * Validate that a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return PROVIDER_NAMES.includes(name as ProviderName);\n}\n\n/**\n * Check if provider is fully configured\n */\nexport function isProviderReady(provider: string): boolean {\n if (!isValidProvider(provider)) return false;\n const status = getProviderStatus(provider);\n return status.isComplete;\n}\n\n/**\n * Get helpful error message for unconfigured provider\n */\nexport function getProviderSetupHelp(provider: string): string {\n if (!isValidProvider(provider)) {\n return `Unknown provider: ${provider}\\nAvailable: ${PROVIDER_NAMES.join(', ')}`;\n }\n\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n return `Provider ${provider} is already configured`;\n }\n\n const lines = [\n `Provider ${provider} requires these environment variables:`,\n '',\n ...status.missing.map(varName => ` ${varName}`),\n '',\n 'Add them to your .env file or export them in your shell.',\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Dynamically import a provider package\n */\nexport async function loadProvider(providerName: ProviderName): Promise<any> {\n try {\n switch (providerName) {\n case 'gateway':\n // Gateway is built into computesdk package\n return await import('computesdk');\n case 'e2b':\n return await import('@computesdk/e2b');\n case 'railway':\n return await import('@computesdk/railway');\n case 'daytona':\n return await import('@computesdk/daytona');\n case 'modal':\n return await import('@computesdk/modal');\n case 'runloop':\n return await import('@computesdk/runloop');\n case 'vercel':\n return await import('@computesdk/vercel');\n case 'cloudflare':\n return await import('@computesdk/cloudflare');\n case 'codesandbox':\n return await import('@computesdk/codesandbox');\n case 'blaxel':\n return await import('@computesdk/blaxel');\n default:\n throw new Error(`Unknown provider: ${providerName}`);\n }\n } catch (error) {\n if (providerName === 'gateway') {\n throw new Error(`Failed to load gateway provider from computesdk package.`);\n }\n throw new Error(\n `Failed to load provider ${providerName}. ` +\n `Make sure to install it: npm install @computesdk/${providerName}`\n );\n }\n}\n\n/**\n * Create provider config from environment variables\n * Uses shared PROVIDER_ENV_MAP from computesdk\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n // Handle gateway separately (not in shared config)\n if (providerName === 'gateway') {\n const config: Record<string, string> = {};\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n return config;\n }\n\n // Use shared utility for other providers\n return getProviderConfigFromEnv(providerName as SharedProviderName);\n}\n","/**\n * Workbench command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from '@computesdk/provider';\nimport { escapeArgs } from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { getCurrentSandbox, setSandbox, clearSandbox, hasSandbox } from './state.js';\nimport { \n Spinner, \n logCommand, \n logSuccess, \n logError, \n logWarning,\n c,\n formatDuration,\n} from './output.js';\nimport { \n isProviderReady, \n autoDetectProvider, \n getProviderSetupHelp,\n isValidProvider,\n loadProvider,\n getProviderConfig,\n type ProviderName,\n} from './providers.js';\nimport * as readline from 'readline';\n\n/**\n * Prompt user for yes/no confirmation\n */\nasync function confirm(question: string, defaultYes = false): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n // Clear any pending input\n process.stdin.resume();\n \n const promptSuffix = defaultYes ? '(Y/n)' : '(y/N)';\n \n rl.question(`${question} ${promptSuffix}: `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n \n // If empty answer, use default\n if (trimmed === '') {\n resolve(defaultYes);\n } else {\n resolve(trimmed === 'y' || trimmed === 'yes');\n }\n });\n });\n}\n\n/**\n * Prompt user to switch sandbox if one is already active\n * Returns true if should proceed with switch\n */\nexport async function confirmSandboxSwitch(state: WorkbenchState): Promise<boolean> {\n if (!hasSandbox(state)) {\n return true; // No current sandbox, no need to confirm\n }\n \n return await confirm('Switch to new sandbox?', true); // Default YES\n}\n\n/**\n * Auto-create sandbox if none exists\n */\nexport async function ensureSandbox(state: WorkbenchState): Promise<void> {\n if (hasSandbox(state)) {\n return; // Already have a sandbox\n }\n \n await createSandbox(state);\n}\n\n/**\n * Create or get compute instance for current provider configuration\n */\nexport async function getComputeInstance(state: WorkbenchState): Promise<any> {\n // Return cached instance if available\n if (state.compute) {\n return state.compute;\n }\n \n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n throw new Error('No provider configured.');\n }\n \n let compute;\n \n if (useDirect) {\n // Direct mode: load the provider package directly\n const providerModule = await loadProvider(providerName as ProviderName);\n const providerFactory = providerModule[providerName];\n \n if (!providerFactory) {\n throw new Error(`Provider ${providerName} does not export a factory function`);\n }\n \n // Get config from environment\n const config = getProviderConfig(providerName as ProviderName);\n \n // Create compute instance with this provider\n compute = createCompute({\n defaultProvider: providerFactory(config),\n });\n } else {\n // Gateway mode: use the shared gateway compute instance from computesdk.\n // The gateway must be configured via environment variables (for example, COMPUTESDK_API_KEY)\n // or explicit configuration; if neither is provided, the gateway will throw an error.\n const { compute: gatewayCompute } = await import('computesdk');\n compute = gatewayCompute;\n }\n \n // Cache the instance\n state.compute = compute;\n return compute;\n}\n\n/**\n * Create a new sandbox using gateway or direct provider\n */\nexport async function createSandbox(state: WorkbenchState): Promise<void> {\n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n logError('No provider configured. Run \"env\" to see setup instructions.');\n throw new Error('No provider available');\n }\n \n // Determine which mode to use\n let modeLabel: string;\n let actualProviderName: string;\n \n if (useDirect) {\n // Direct mode: use the provider directly\n modeLabel = `${providerName} (direct)`;\n actualProviderName = providerName;\n \n if (!isProviderReady(providerName)) {\n logError(`Provider ${providerName} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(providerName));\n throw new Error('Provider not ready');\n }\n } else {\n // Gateway mode: use gateway with specified backend\n modeLabel = `${providerName} (via gateway)`;\n actualProviderName = 'gateway';\n \n if (!isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n throw new Error('Gateway not ready');\n }\n }\n \n const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();\n const startTime = Date.now();\n \n try {\n // Get or create compute instance\n const compute = await getComputeInstance(state);\n \n // Create sandbox\n const result = await compute.sandbox.create();\n const duration = Date.now() - startTime;\n \n setSandbox(state, result, providerName);\n spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to create sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n \n // Better error message if provider package not installed\n if (error instanceof Error && error.message.includes('Cannot find module')) {\n logError(`Provider package @computesdk/${providerName} is not installed.`);\n console.log(`\\nInstall it with: ${c.cyan(`npm install @computesdk/${providerName}`)}\\n`);\n }\n \n // Show the actual error for debugging\n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Destroy current sandbox\n */\nexport async function destroySandbox(state: WorkbenchState): Promise<void> {\n const spinner = new Spinner('Destroying sandbox...').start();\n \n try {\n const sandbox = getCurrentSandbox(state);\n await sandbox.destroy();\n clearSandbox(state);\n spinner.succeed('Destroyed');\n } catch (error) {\n spinner.fail(`Failed to destroy: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n}\n\n/**\n * Restart sandbox (destroy + create with same provider)\n */\nexport async function restartSandbox(state: WorkbenchState): Promise<void> {\n const provider = state.currentProvider;\n \n if (hasSandbox(state)) {\n await destroySandbox(state);\n }\n \n // Keep same provider\n if (provider) {\n state.currentProvider = provider;\n }\n \n await createSandbox(state);\n}\n\n/**\n * Run a command on the current sandbox\n */\nexport async function runCommand(state: WorkbenchState, command: string[]): Promise<any> {\n // Ensure we have a sandbox\n await ensureSandbox(state);\n \n const sandbox = getCurrentSandbox(state);\n const startTime = Date.now();\n \n logCommand(command);\n \n try {\n // Use escapeArgs to properly join and escape command array with spaces/special chars\n const commandString = escapeArgs(command);\n const result = await sandbox.runCommand(commandString);\n const duration = Date.now() - startTime;\n \n // Print output directly\n if (result.stdout) {\n console.log(result.stdout.trimEnd());\n }\n if (result.stderr) {\n console.error(c.red(result.stderr.trimEnd()));\n }\n \n // Show success indicator with timing and exit code info\n const exitCodeInfo = result.exitCode !== 0 ? c.yellow(` (exit ${result.exitCode})`) : '';\n logSuccess(`${c.dim(`${formatDuration(duration)}`)}${exitCodeInfo}`);\n \n // In verbose mode, return the full result object\n // Otherwise return undefined so REPL doesn't print anything\n if (state.verbose) {\n return result;\n }\n return undefined;\n } catch (error) {\n const duration = Date.now() - startTime;\n logError(`Failed ${c.dim(`(${formatDuration(duration)})`)} - ${error instanceof Error ? error.message : String(error)}`);\n\n // Clear stale sandbox on connection/auth errors so next command creates fresh\n if (isStaleConnectionError(error)) {\n clearSandbox(state);\n logWarning('Sandbox connection lost. Next command will create a new sandbox.');\n }\n\n throw error;\n }\n}\n\n/**\n * Check if an error indicates a stale/dead sandbox connection\n */\nfunction isStaleConnectionError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const message = error.message.toLowerCase();\n const stalePhrases = [\n 'websocket',\n 'connection refused',\n 'connection reset',\n 'connection closed',\n 'socket hang up',\n 'econnrefused',\n 'econnreset',\n 'etimedout',\n 'not found',\n 'sandbox not found',\n 'unauthorized',\n '401',\n '403',\n '404',\n ];\n\n return stalePhrases.some(phrase => message.includes(phrase));\n}\n\n/**\n * Switch to a different provider\n * Supports both gateway mode (default) and direct mode\n * \n * Examples:\n * provider e2b → gateway with e2b backend\n * provider direct e2b → direct connection to e2b\n */\nexport async function switchProvider(state: WorkbenchState, mode: string, providerName?: string): Promise<void> {\n // Parse the command: could be \"provider e2b\" or \"provider direct e2b\"\n let useDirect = false;\n let actualProvider = mode;\n \n if (mode === 'direct') {\n if (!providerName) {\n logError('Usage: provider direct <name>');\n console.log('Example: provider direct e2b');\n return;\n }\n useDirect = true;\n actualProvider = providerName;\n } else if (mode === 'gateway') {\n if (!providerName) {\n logError('Usage: provider gateway <name>');\n console.log('Example: provider gateway e2b');\n return;\n }\n useDirect = false;\n actualProvider = providerName;\n }\n \n // Remove 'gateway' prefix if someone types \"provider gateway\"\n if (actualProvider === 'gateway') {\n actualProvider = autoDetectProvider(false) || 'e2b';\n }\n \n // Validate provider\n if (!isValidProvider(actualProvider)) {\n logError(`Unknown provider: ${actualProvider}`);\n console.log(`Available providers: e2b, railway, daytona, modal, runloop, vercel, cloudflare, codesandbox, blaxel`);\n return;\n }\n \n // Check if gateway is configured (always needed)\n if (!useDirect && !isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n return;\n }\n \n // Check if direct provider is configured (only for direct mode)\n if (useDirect && !isProviderReady(actualProvider)) {\n logError(`Provider ${actualProvider} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(actualProvider));\n return;\n }\n \n // Prompt to destroy current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Destroy current sandbox?');\n if (shouldDestroy) {\n await destroySandbox(state);\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n } else {\n logWarning('Keeping current sandbox. Provider remains unchanged.');\n }\n } else {\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n }\n}\n\n/**\n * Create a provider command handler\n * Supports: provider e2b, provider direct e2b, provider gateway e2b\n */\nexport function defineProviderCommand(state: WorkbenchState) {\n return async function provider(mode?: string, providerName?: string) {\n if (!mode) {\n // Show current provider\n if (state.currentProvider) {\n const modeStr = state.useDirectMode ? 'direct' : 'via gateway';\n console.log(`\\nCurrent provider: ${c.green(state.currentProvider)} (${modeStr})\\n`);\n } else {\n console.log(c.yellow('\\nNo provider selected\\n'));\n }\n return;\n }\n \n await switchProvider(state, mode, providerName);\n };\n}\n\n/**\n * Toggle between gateway and direct mode\n */\nexport async function toggleMode(state: WorkbenchState, mode?: 'gateway' | 'direct'): Promise<void> {\n const newMode = mode || (state.useDirectMode ? 'gateway' : 'direct');\n \n if (newMode === 'direct') {\n state.useDirectMode = true;\n logSuccess('Switched to direct mode 🔗');\n console.log(c.dim('Next sandbox will use direct provider packages\\n'));\n \n // If we have a sandbox and it's in gateway mode, suggest restart\n if (hasSandbox(state) && !state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in gateway mode.'));\n console.log(c.dim('Run \"restart\" to switch to direct mode\\n'));\n }\n } else {\n state.useDirectMode = false;\n logSuccess('Switched to gateway mode 🌐');\n console.log(c.dim('Next sandbox will use gateway (requires COMPUTESDK_API_KEY)\\n'));\n \n // If we have a sandbox and it's in direct mode, suggest restart\n if (hasSandbox(state) && state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in direct mode.'));\n console.log(c.dim('Run \"restart\" to switch to gateway mode\\n'));\n }\n }\n}\n\n/**\n * Show current mode\n */\nexport function showMode(state: WorkbenchState): void {\n const mode = state.useDirectMode ? 'direct' : 'gateway';\n const icon = mode === 'gateway' ? '🌐' : '🔗';\n \n console.log(`\\nCurrent mode: ${c.green(mode)} ${icon}`);\n \n if (mode === 'gateway') {\n console.log(c.dim('Routes through ComputeSDK API (requires COMPUTESDK_API_KEY)'));\n } else {\n console.log(c.dim('Direct connection to providers (requires provider packages)'));\n }\n \n console.log(`\\nSwitch with: ${c.cyan('provider e2b')} (gateway) or ${c.cyan('provider direct e2b')} (direct)\\n`);\n}\n\n/**\n * Toggle verbose mode\n */\nexport function toggleVerbose(state: WorkbenchState): void {\n state.verbose = !state.verbose;\n if (state.verbose) {\n logSuccess('Verbose mode enabled - will show full command results');\n console.log(c.dim('Commands will return full result objects with metadata\\n'));\n } else {\n logSuccess('Verbose mode disabled - showing clean output only');\n console.log(c.dim('Commands will only show stdout/stderr\\n'));\n }\n}\n\n/**\n * Show verbose mode status\n */\nexport function showVerbose(state: WorkbenchState): void {\n const status = state.verbose ? c.green('enabled') : c.dim('disabled');\n console.log(`\\nVerbose mode: ${status}`);\n \n if (state.verbose) {\n console.log(c.dim('Commands return full result objects with metadata'));\n } else {\n console.log(c.dim('Commands show only stdout/stderr'));\n }\n \n console.log(`\\nToggle with: ${c.cyan('verbose')}\\n`);\n}\n\n/**\n * Connect to an existing sandbox via URL\n * Useful for connecting to a locally running sandbox or a sandbox created elsewhere\n */\nexport async function connectToSandbox(state: WorkbenchState, sandboxUrl: string, token?: string): Promise<void> {\n // Validate URL format\n if (!sandboxUrl) {\n logError('Usage: connect <sandbox_url> [token]');\n console.log('Example: connect https://sandbox-123.localhost:8080');\n console.log('Example: connect https://sandbox-123.localhost:8080 your_access_token');\n return;\n }\n \n // Clean up URL (remove trailing slash)\n const cleanUrl = sandboxUrl.replace(/\\/$/, '');\n \n // Disconnect from current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Disconnect from current sandbox?');\n if (!shouldDestroy) {\n logWarning('Keeping current sandbox. Connection cancelled.');\n return;\n }\n // Just clear the reference, don't destroy since we don't own this sandbox\n clearSandbox(state);\n }\n \n const spinner = new Spinner(`Connecting to ${cleanUrl}...`).start();\n const startTime = Date.now();\n \n try {\n // Import Sandbox class from computesdk package (client is now merged into computesdk)\n const { Sandbox } = await import('computesdk');\n \n // Dynamically import WebSocket for Node.js environment\n let WebSocket: any;\n try {\n // @ts-expect-error - ws is an optional peer dependency that may not have type declarations\n const wsModule = await import('ws');\n WebSocket = wsModule.default;\n } catch {\n logError('Failed to import \"ws\" module. Please install it: pnpm add ws');\n throw new Error('Missing \"ws\" dependency');\n }\n \n // Create a Sandbox instance directly with optional token\n // WebSocket type comes from 'ws' module which may differ from browser WebSocket\n const sandbox = new Sandbox({\n sandboxUrl: cleanUrl,\n sandboxId: '', // Will be populated when we get info\n provider: 'connected', // Mark as directly connected\n token: token, // Optional access token\n WebSocket: WebSocket as typeof globalThis.WebSocket,\n });\n\n // Test the connection by getting sandbox info\n const info = await sandbox.getInfo();\n const duration = Date.now() - startTime;\n\n // Update state with the connected sandbox\n // Sandbox from @computesdk/client is the same class re-exported by computesdk\n setSandbox(state, sandbox, 'connected');\n \n spinner.succeed(`Connected to sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n console.log(c.dim(`Provider: ${info.provider || 'unknown'}`));\n console.log(c.dim(`Sandbox ID: ${info.id || 'unknown'}`));\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to connect ${c.dim(`(${formatDuration(duration)})`)}`);\n \n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Cleanup on exit\n */\nexport async function cleanupOnExit(state: WorkbenchState, replServer?: any): Promise<void> {\n if (!hasSandbox(state)) {\n return;\n }\n \n // Pause the REPL to prevent input conflicts\n if (replServer) {\n replServer.pause();\n }\n \n console.log(''); // New line\n \n // Don't offer to destroy if we're just connected to an external sandbox\n if (state.currentProvider === 'connected') {\n logWarning('Disconnecting from external sandbox (not destroying).');\n return;\n }\n \n const shouldDestroy = await confirm('Destroy active sandbox?');\n \n if (shouldDestroy) {\n await destroySandbox(state);\n } else {\n logWarning('Sandbox left running. It may incur costs.');\n }\n \n // Resume not needed since we're exiting\n}\n","/**\n * ComputeSDK Workbench\n * \n * Interactive REPL for testing sandbox lifecycle operations\n */\n\nimport { createState } from './state.js';\nimport { createREPL } from './repl.js';\nimport { showWelcome } from './output.js';\nimport { getAvailableProviders, autoDetectProvider } from './providers.js';\nimport { cleanupOnExit } from './commands.js';\n\n/**\n * Start the workbench REPL\n */\nexport async function startWorkbench(): Promise<void> {\n // Create state\n const state = createState();\n \n // Detect available providers\n state.availableProviders = getAvailableProviders();\n const detectedProvider = autoDetectProvider();\n \n // Determine mode based on what's available\n const hasGateway = state.availableProviders.includes('gateway');\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n \n if (hasGateway && backendProviders.length > 0) {\n // Gateway is available - use it with first backend provider\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Use gateway mode\n } else if (backendProviders.length > 0) {\n // No gateway, but we have direct providers - use direct mode\n state.currentProvider = backendProviders[0];\n state.useDirectMode = true; // Use direct mode\n } else {\n // No providers at all\n state.currentProvider = detectedProvider;\n state.useDirectMode = false;\n }\n \n // Show welcome banner\n showWelcome(state.availableProviders, state.currentProvider, state.useDirectMode);\n \n // Create REPL\n const replServer = createREPL(state);\n \n // Handle exit\n replServer.on('exit', async () => {\n await cleanupOnExit(state, replServer);\n process.exit(0);\n });\n}\n","/**\n * REPL setup and configuration\n * \n * Creates Node.js REPL with:\n * - Tab autocomplete for @computesdk/cmd functions\n * - Smart command evaluation (auto-run Command arrays)\n * - Workbench command injection\n */\n\nimport * as repl from 'repl';\nimport * as cmd from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { runCommand, defineProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose, connectToSandbox } from './commands.js';\nimport { showHelp, showInfo } from './output.js';\nimport { showProviders, showEnv, PROVIDER_NAMES } from './providers.js';\nimport { isCommand } from './types.js';\n\n/**\n * Extended REPL server interface with custom eval function\n */\ninterface ExtendedREPLServer extends repl.REPLServer {\n eval: (\n cmd: string,\n context: object,\n filename: string,\n callback: (err: Error | null, result: any) => void\n ) => void;\n}\nimport * as path from 'path';\nimport * as os from 'os';\n\n/**\n * Create and configure REPL server\n */\nexport function createREPL(state: WorkbenchState): repl.REPLServer {\n const replServer = repl.start({\n prompt: '> ', // Initial prompt, will be updated by state management\n useColors: true,\n terminal: true,\n useGlobal: false,\n ignoreUndefined: true,\n });\n\n // Inject cmd context for autocomplete\n injectCmdContext(replServer);\n \n // Inject workbench commands\n injectWorkbenchCommands(replServer, state);\n \n // Setup custom evaluator\n setupSmartEvaluator(replServer, state);\n \n // Setup custom autocomplete\n setupAutocomplete(replServer, state);\n \n // Setup command history\n setupHistory(replServer);\n \n // Store replServer reference for prompt updates\n state._replServer = replServer;\n\n return replServer;\n}\n\n/**\n * Inject all @computesdk/cmd exports into REPL context for autocomplete\n */\nfunction injectCmdContext(replServer: repl.REPLServer) {\n // Package managers\n replServer.context.npm = cmd.npm;\n replServer.context.pnpm = cmd.pnpm;\n replServer.context.yarn = cmd.yarn;\n replServer.context.bun = cmd.bun;\n replServer.context.pip = cmd.pip;\n replServer.context.uv = cmd.uv;\n replServer.context.poetry = cmd.poetry;\n replServer.context.pipx = cmd.pipx;\n \n // Package runners\n replServer.context.npx = cmd.npx;\n replServer.context.bunx = cmd.bunx;\n replServer.context.deno = cmd.deno;\n \n // Git\n replServer.context.git = cmd.git;\n \n // Filesystem\n replServer.context.mkdir = cmd.mkdir;\n replServer.context.rm = cmd.rm;\n replServer.context.cp = cmd.cp;\n replServer.context.mv = cmd.mv;\n replServer.context.ls = cmd.ls;\n replServer.context.pwd = cmd.pwd;\n replServer.context.chmod = cmd.chmod;\n replServer.context.chown = cmd.chown;\n replServer.context.touch = cmd.touch;\n replServer.context.cat = cmd.cat;\n replServer.context.ln = cmd.ln;\n replServer.context.readlink = cmd.readlink;\n replServer.context.test = cmd.test;\n replServer.context.rsync = cmd.rsync;\n \n // Process\n replServer.context.node = cmd.node;\n replServer.context.python = cmd.python;\n replServer.context.kill = cmd.kill;\n replServer.context.pkill = cmd.pkill;\n replServer.context.ps = cmd.ps;\n replServer.context.timeout = cmd.timeout;\n \n // Network\n replServer.context.curl = cmd.curl;\n replServer.context.wget = cmd.wget;\n replServer.context.port = cmd.port;\n replServer.context.net = cmd.net;\n \n // Text processing\n replServer.context.grep = cmd.grep;\n replServer.context.sed = cmd.sed;\n replServer.context.head = cmd.head;\n replServer.context.tail = cmd.tail;\n replServer.context.wc = cmd.wc;\n replServer.context.sort = cmd.sort;\n replServer.context.uniq = cmd.uniq;\n replServer.context.jq = cmd.jq;\n replServer.context.xargs = cmd.xargs;\n replServer.context.awk = cmd.awk;\n replServer.context.cut = cmd.cut;\n replServer.context.tr = cmd.tr;\n \n // Archives\n replServer.context.tar = cmd.tar;\n replServer.context.unzip = cmd.unzip;\n \n // System\n replServer.context.echo = cmd.echo;\n replServer.context.env = cmd.env;\n replServer.context.printenv = cmd.printenv;\n replServer.context.which = cmd.which;\n replServer.context.whoami = cmd.whoami;\n replServer.context.uname = cmd.uname;\n replServer.context.hostname = cmd.hostname;\n replServer.context.df = cmd.df;\n replServer.context.du = cmd.du;\n replServer.context.sleep = cmd.sleep;\n replServer.context.date = cmd.date;\n replServer.context.find = cmd.find;\n replServer.context.tee = cmd.tee;\n replServer.context.diff = cmd.diff;\n replServer.context.parallel = cmd.parallel;\n replServer.context.raw = cmd.raw;\n replServer.context.base64 = cmd.base64;\n replServer.context.md5sum = cmd.md5sum;\n replServer.context.sha256sum = cmd.sha256sum;\n replServer.context.sha1sum = cmd.sha1sum;\n \n // Compute\n replServer.context.compute = cmd.compute;\n \n // Expose cmd namespace for cmd() wrapper\n replServer.context.cmd = cmd.cmd;\n \n // Shell wrappers\n replServer.context.shell = cmd.shell;\n replServer.context.sh = cmd.sh;\n replServer.context.bash = cmd.bash;\n replServer.context.zsh = cmd.zsh;\n}\n\n/**\n * Inject workbench-specific commands\n */\nfunction injectWorkbenchCommands(replServer: repl.REPLServer, state: WorkbenchState) {\n // Provider management\n replServer.context.provider = defineProviderCommand(state);\n replServer.context.providers = () => showProviders();\n \n // Mode management\n replServer.context.mode = async (modeName?: 'gateway' | 'direct') => {\n if (!modeName) {\n showMode(state);\n } else {\n await toggleMode(state, modeName);\n }\n };\n \n // Sandbox operations\n replServer.context.restart = async () => {\n await restartSandbox(state);\n };\n \n replServer.context.destroy = async () => {\n await destroySandbox(state);\n };\n \n replServer.context.connect = async (url: string, token?: string) => {\n await connectToSandbox(state, url, token);\n };\n \n replServer.context.info = () => showInfo(state);\n \n // Output control\n replServer.context.verbose = () => {\n toggleVerbose(state);\n showVerbose(state);\n };\n \n // Background execution helper - accepts string or Command\n replServer.context.bg = (command: string | string[]) => {\n const cmdArray = typeof command === 'string' \n ? ['sh', '-c', command]\n : command;\n return cmd.sh(cmdArray as any, { background: true });\n };\n \n // Environment/help\n replServer.context.env = () => showEnv();\n replServer.context.help = showHelp;\n \n // Expose sandbox methods directly in context\n // These are lazy-evaluated to get the current sandbox\n \n // Expose getUrl directly\n replServer.context.getUrl = async (options: { port: number; protocol?: string }) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getUrl(options);\n };\n \n // Expose getInfo as sandboxInfo (since 'info' is already taken for workbench info)\n replServer.context.sandboxInfo = async () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInfo();\n };\n \n // Expose runCode directly\n replServer.context.runCode = async (code: string, runtime?: 'node' | 'python') => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCode(code, runtime);\n };\n \n // Expose runCommand directly with full options support (background, cwd, env)\n replServer.context.runCommand = async (\n command: string,\n options?: { background?: boolean; cwd?: string; env?: Record<string, string> }\n ) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCommand(command, options);\n };\n \n // Expose sandbox creation methods (gateway mode only)\n // These return clean { sandboxId, metadata } objects instead of full GeneratedSandbox\n replServer.context.create = async (options?: Record<string, unknown>) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching from existing sandbox\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n // User chose not to switch - create but don't activate\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Create sandbox (may throw error)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n // Only set as current after successful creation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.findOrCreate = async (options: { name: string; namespace?: string; timeout?: number; runtime?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (findOrCreate) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Find or create sandbox\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n // Set as current after successful operation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.find = async (options: { name: string; namespace?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (find) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Find sandbox first (may return null)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.find(options);\n \n if (!sandbox) {\n return null; // Not found, nothing to switch to\n }\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Set as current\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n // Expose filesystem namespace\n replServer.context.filesystem = {\n get readFile() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readFile(path);\n };\n },\n get writeFile() {\n return async (path: string, content: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.writeFile(path, content);\n };\n },\n get mkdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.mkdir(path);\n };\n },\n get readdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readdir(path);\n };\n },\n get exists() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.exists(path);\n };\n },\n get remove() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.remove(path);\n };\n }\n };\n \n // Expose child namespace for child sandbox operations (gateway mode only)\n replServer.context.child = {\n get create() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.create();\n };\n },\n get list() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.list();\n };\n },\n get retrieve() {\n return async (subdomain: string) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.retrieve(subdomain);\n };\n },\n get destroy() {\n return async (subdomain: string, options?: { deleteFiles?: boolean }) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.destroy(subdomain, options);\n };\n }\n };\n \n // Expose getInstance for advanced users\n replServer.context.getInstance = () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInstance();\n };\n}\n\n/**\n * Setup smart evaluator that auto-runs Command arrays and workbench commands\n */\nfunction setupSmartEvaluator(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalEval = replServer.eval;\n \n // Track workbench command names for auto-calling\n const workbenchCommands = new Set(['help', 'providers', 'info', 'env', 'restart', 'destroy', 'mode', 'verbose', 'sandboxInfo', 'connect']);\n \n (replServer as ExtendedREPLServer).eval = function (cmd: string, context: object, filename: string, callback: (err: Error | null, result: any) => void) {\n const trimmedCmd = cmd.trim();\n \n // Special handling for \"provider <mode> <name>\" syntax (without parentheses)\n // Supports: \"provider e2b\", \"provider direct e2b\", \"provider gateway e2b\"\n const providerMatch = trimmedCmd.match(/^provider(?:\\s+(direct|gateway))?\\s+(\\w+)$/);\n if (providerMatch) {\n const mode = providerMatch[1] || null; // 'direct', 'gateway', or null\n const providerName = providerMatch[2];\n const providerCmd = mode \n ? `await provider('${mode}', '${providerName}')`\n : `await provider('${providerName}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Also handle just \"provider direct\" or \"provider gateway\" alone \n const providerOnlyMatch = trimmedCmd.match(/^provider\\s+(direct|gateway)$/);\n if (providerOnlyMatch) {\n const mode = providerOnlyMatch[1];\n const providerCmd = `await provider('${mode}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Special handling for \"mode <gateway|direct>\" syntax\n const modeMatch = trimmedCmd.match(/^mode\\s+(gateway|direct)$/);\n if (modeMatch) {\n const modeName = modeMatch[1];\n const modeCmd = `await mode('${modeName}')`;\n originalEval.call(this, modeCmd, context, filename, callback);\n return;\n }\n \n // Special handling for $command syntax (direct shell command execution)\n const dollarMatch = trimmedCmd.match(/^\\$(.+)$/);\n if (dollarMatch) {\n const shellCmd = dollarMatch[1].trim();\n \n // Handle empty command\n if (!shellCmd) {\n callback(new Error('Empty command after $'), undefined);\n return;\n }\n \n // Create command array: ['sh', '-c', 'the command']\n const command = ['sh', '-c', shellCmd];\n \n // Execute the command directly\n runCommand(state, command)\n .then(output => callback(null, output))\n .catch(error => callback(error as Error, undefined));\n return;\n }\n \n // Use original eval to get the result\n originalEval.call(this, cmd, context, filename, async (err, result) => {\n if (err) {\n callback(err, undefined);\n return;\n }\n \n // Check if result is a Command (string array from @computesdk/cmd)\n if (isCommand(result)) {\n try {\n const output = await runCommand(state, result);\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Check if it's a workbench command function that should be auto-called\n if (typeof result === 'function' && workbenchCommands.has(trimmedCmd)) {\n try {\n const output = await result();\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Auto-await promises (so users don't need to type \"await\")\n if (result && typeof result.then === 'function') {\n try {\n const output = await result;\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Not a command or promise, return as-is\n callback(null, result);\n });\n };\n}\n\n/**\n * Setup custom autocomplete\n */\nfunction setupAutocomplete(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalCompleter = replServer.completer as any;\n \n // Workbench commands with their argument suggestions\n const workbenchCommands = {\n 'provider': [...PROVIDER_NAMES], // Use actual provider names from config\n 'mode': ['gateway', 'direct'],\n 'providers': [],\n 'restart': [],\n 'destroy': [],\n 'connect': [], // Connect takes a URL argument\n 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n // Sandbox methods\n 'getUrl': [],\n 'runCode': [],\n 'sandboxInfo': [],\n 'getInstance': [],\n // Filesystem is an object, so it gets dot notation autocomplete automatically\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\n try {\n // Don't trim - we need to detect trailing spaces\n const trimmed = line.trim();\n \n // Complete workbench command names (no space or dot in line)\n if (!line.includes(' ') && !line.includes('.')) {\n const commands = Object.keys(workbenchCommands);\n const hits = commands.filter(cmd => cmd.startsWith(trimmed));\n \n // Also get context completions from original completer\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n // Validate result format\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n const [contextHits, partial] = result;\n if (!Array.isArray(contextHits)) {\n callback(null, [hits, trimmed]);\n return;\n }\n\n // Merge workbench commands with context completions\n const allHits = [...new Set([...hits, ...contextHits])].sort();\n const completionPrefix = typeof partial === 'string' ? partial : trimmed;\n callback(null, [allHits, completionPrefix]);\n });\n return;\n }\n \n callback(null, [hits.length ? hits : commands, trimmed]);\n return;\n }\n \n // Complete command arguments (e.g., \"provider e\" -> \"provider e2b\")\n // Use original line to detect spaces properly\n if (line.includes(' ') && !line.includes('.')) {\n const parts = line.split(' ');\n const command = parts[0].trim();\n const partial = parts.slice(1).join(' ').trim(); // Everything after command\n const suggestions = workbenchCommands[command as keyof typeof workbenchCommands];\n \n // Check if this is a known workbench command\n if (suggestions !== undefined) {\n if (suggestions.length > 0) {\n const hits = suggestions\n .filter(s => s.startsWith(partial))\n .map(s => `${command} ${s}`);\n \n callback(null, [hits.length ? hits : suggestions.map(s => `${command} ${s}`), line]);\n } else {\n // For commands with no arguments (like 'info', 'help', etc.), return empty\n callback(null, [[], line]);\n }\n return;\n }\n }\n \n // Fall back to original completer (this handles npm., git., etc.)\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [[], line]);\n return;\n }\n \n // Validate result format before passing it along\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [[], line]);\n return;\n }\n \n const [completions, partial] = result;\n if (!Array.isArray(completions) || typeof partial !== 'string') {\n callback(null, [[], line]);\n return;\n }\n \n callback(null, [completions, partial]);\n });\n } else {\n callback(null, [[], line]);\n }\n } catch (error) {\n // Catch any unexpected errors to prevent crashing the REPL\n console.error('Autocomplete error:', error);\n callback(null, [[], line]);\n }\n };\n}\n\n/**\n * Setup command history\n */\nfunction setupHistory(replServer: repl.REPLServer) {\n const historyFile = path.join(os.homedir(), '.computesdk_workbench_history');\n \n replServer.setupHistory(historyFile, (err) => {\n if (err) {\n // Silent fail - history is nice-to-have\n }\n });\n}\n","/**\n * Workbench type definitions\n */\n\nimport type { Command } from '@computesdk/cmd';\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Provider status information\n */\nexport interface ProviderStatus {\n name: string;\n isComplete: boolean;\n present: string[];\n missing: string[];\n}\n\n/**\n * Type guard to check if value is a Command (string array)\n */\nexport function isCommand(value: unknown): value is Command {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n );\n}\n"],"mappings":"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","names":["compute","path","getComputeInstance","confirmSandboxSwitch","setSandbox","logSuccess","compute","sandbox","cmd"]}
|
|
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.0/node_modules/tsup/assets/esm_shims.js","../src/cli/state.ts","../src/cli/output.ts","../src/cli/providers.ts","../src/cli/commands.ts","../src/cli/index.ts","../src/cli/repl.ts","../src/cli/types.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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox } from 'computesdk';\nimport type { ProviderSandbox } from '@computesdk/provider';\nimport type { REPLServer } from 'repl';\n\n/** Sandbox can be either client Sandbox (gateway mode) or ProviderSandbox (direct mode) */\ntype WorkbenchSandbox = Sandbox | ProviderSandbox;\n\n/**\n * Workbench session state\n */\nexport interface WorkbenchState {\n /** Currently active provider (e2b, railway, etc.) */\n currentProvider: string | null;\n\n /** Current sandbox instance */\n currentSandbox: WorkbenchSandbox | null;\n \n /** When the current sandbox was created */\n sandboxCreatedAt: Date | null;\n \n /** List of providers detected from environment */\n availableProviders: string[];\n \n /** Whether to use direct mode (true) or gateway mode (false, default) */\n useDirectMode: boolean;\n \n /** Show verbose command output (full result object) */\n verbose: boolean;\n \n /** Compute instance (for creating named sandboxes, etc.) */\n compute: any | null;\n \n /** Internal: REPL server reference for updating prompt */\n _replServer?: REPLServer;\n}\n\n/**\n * Create initial workbench state\n */\nexport function createState(): WorkbenchState {\n return {\n currentProvider: null,\n currentSandbox: null,\n sandboxCreatedAt: null,\n availableProviders: [],\n useDirectMode: false, // Default to gateway mode\n verbose: false,\n compute: null,\n };\n}\n\n/**\n * Get current sandbox, throwing if none exists\n */\nexport function getCurrentSandbox(state: WorkbenchState): WorkbenchSandbox {\n if (!state.currentSandbox) {\n throw new Error('No active sandbox');\n }\n return state.currentSandbox;\n}\n\n/**\n * Set current sandbox\n */\nexport function setSandbox(state: WorkbenchState, sandbox: WorkbenchSandbox, provider: string) {\n state.currentSandbox = sandbox;\n state.currentProvider = provider;\n state.sandboxCreatedAt = new Date();\n updatePromptIfNeeded(state);\n}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\n updatePromptIfNeeded(state);\n}\n\n/**\n * Update REPL prompt if replServer is available\n * @internal\n */\nfunction updatePromptIfNeeded(state: WorkbenchState) {\n if (state._replServer) {\n const prompt = getPrompt(state);\n state._replServer.setPrompt(prompt);\n }\n}\n\n/**\n * Get prompt string based on current state\n * @internal\n */\nfunction getPrompt(state: WorkbenchState): string {\n if (!state.currentSandbox) {\n return '> ';\n }\n \n const provider = state.currentProvider || 'unknown';\n const sandboxId = state.currentSandbox.sandboxId || '';\n\n // Use full sandbox ID for now\n // User can see exactly which sandbox they're connected to\n return `${provider}:${sandboxId}> `;\n}\n\n/**\n * Check if a sandbox is currently active\n */\nexport function hasSandbox(state: WorkbenchState): boolean {\n return state.currentSandbox !== null;\n}\n\n/**\n * Get sandbox uptime in seconds\n */\nexport function getUptimeSeconds(state: WorkbenchState): number {\n if (!state.sandboxCreatedAt) return 0;\n return Math.floor((Date.now() - state.sandboxCreatedAt.getTime()) / 1000);\n}\n\n/**\n * Format uptime as human-readable string\n */\nexport function formatUptime(state: WorkbenchState): string {\n const seconds = getUptimeSeconds(state);\n \n if (seconds < 60) {\n return `${seconds} second${seconds === 1 ? '' : 's'}`;\n }\n \n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes} minute${minutes === 1 ? '' : 's'}`;\n }\n \n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n","/**\n * Output formatting utilities\n * \n * Provides consistent, colorful output for workbench\n */\n\nimport type { WorkbenchState } from './state.js';\nimport { formatUptime } from './state.js';\n\n/**\n * ANSI color codes (simple, no dependencies for now)\n */\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n \n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n};\n\n/**\n * Color helpers\n */\nexport const c = {\n bold: (text: string) => `${colors.bright}${text}${colors.reset}`,\n dim: (text: string) => `${colors.dim}${text}${colors.reset}`,\n cyan: (text: string) => `${colors.cyan}${text}${colors.reset}`,\n green: (text: string) => `${colors.green}${text}${colors.reset}`,\n yellow: (text: string) => `${colors.yellow}${text}${colors.reset}`,\n red: (text: string) => `${colors.red}${text}${colors.reset}`,\n blue: (text: string) => `${colors.blue}${text}${colors.reset}`,\n magenta: (text: string) => `${colors.magenta}${text}${colors.reset}`,\n};\n\n/**\n * Display welcome banner\n */\nexport function showWelcome(availableProviders: string[], currentProvider: string | null, useDirectMode: boolean) {\n console.log(c.bold(c.cyan('\\n╔═══════════════════════════════════════════════════════╗')));\n console.log(c.bold(c.cyan('║ ComputeSDK Workbench ║')));\n console.log(c.bold(c.cyan('╚═══════════════════════════════════════════════════════╝\\n')));\n console.log(c.dim('Prompt shows connection status: > (disconnected) or provider:sandbox> (connected)\\n'));\n \n if (availableProviders.length > 0) {\n // Filter out 'gateway' from the list since it's not a real backend provider\n const backendProviders = availableProviders.filter(p => p !== 'gateway');\n console.log(`Providers available: ${backendProviders.join(', ')}`);\n \n if (currentProvider) {\n if (useDirectMode) {\n console.log(`Current provider: ${c.green(currentProvider)} (🔗 direct mode)\\n`);\n } else {\n // Gateway mode - show which backend will be used\n const backendProvider = currentProvider === 'gateway' \n ? (backendProviders[0] || 'auto')\n : currentProvider;\n console.log(`Current provider: ${c.green(backendProvider)} (🌐 via gateway)\\n`);\n }\n } else {\n console.log(`\\n${c.dim('Tip: Use \"provider <name>\" to select a provider')}\\n`);\n }\n } else {\n console.log(c.yellow('⚠️ No providers detected.\\n'));\n console.log('To get started:');\n console.log(' 1. Copy .env.example to .env');\n console.log(' 2. Add your provider credentials');\n console.log(' 3. Restart workbench\\n');\n console.log(c.dim('Type \"env\" to see required environment variables\\n'));\n }\n \n console.log(c.dim('Type \"help\" for available commands\\n'));\n}\n\n\n\n/**\n * Display sandbox info\n */\nexport function showInfo(state: WorkbenchState) {\n if (!state.currentSandbox) {\n console.log(c.yellow('\\nNo active sandbox\\n'));\n return;\n }\n \n console.log('\\n' + c.bold('Current Sandbox:'));\n \n // Show sandbox ID if available\n if (state.currentSandbox.sandboxId) {\n console.log(` Sandbox ID: ${c.cyan(state.currentSandbox.sandboxId)}`);\n }\n \n console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\n \n // Show connection mode (gateway or direct)\n const modeLabel = state.useDirectMode ? 'direct 🔗' : 'gateway 🌐';\n console.log(` Mode: ${c.blue(modeLabel)}`);\n \n console.log(` Created: ${state.sandboxCreatedAt?.toLocaleString() || 'unknown'}`);\n console.log(` Uptime: ${formatUptime(state)}`);\n console.log('');\n}\n\n/**\n * Simple spinner class (no external deps)\n */\nexport class Spinner {\n private interval: NodeJS.Timeout | null = null;\n private frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n private currentFrame = 0;\n private text: string;\n \n constructor(text: string) {\n this.text = text;\n }\n \n start(): this {\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.interval = setInterval(() => {\n const frame = this.frames[this.currentFrame];\n process.stdout.write(`\\r${c.cyan(frame)} ${this.text}`);\n this.currentFrame = (this.currentFrame + 1) % this.frames.length;\n }, 80);\n return this;\n }\n \n succeed(text?: string): void {\n this.stop();\n console.log(`${c.green('✅')} ${text || this.text}`);\n }\n \n fail(text?: string): void {\n this.stop();\n console.log(`${c.red('❌')} ${text || this.text}`);\n }\n \n stop(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Show cursor\n }\n}\n\n/**\n * Format duration in seconds to human-readable string\n */\nexport function formatDuration(ms: number): string {\n const seconds = ms / 1000;\n if (seconds < 1) {\n return `${ms}ms`;\n }\n return `${seconds.toFixed(1)}s`;\n}\n\n/**\n * Log command being run\n */\nexport function logCommand(command: string[]) {\n console.log(c.dim(`Running: ${command.join(' ')}`));\n}\n\n/**\n * Log success\n */\nexport function logSuccess(message: string, duration?: number) {\n const durationStr = duration ? ` (${formatDuration(duration)})` : '';\n console.log(c.green(`✅ ${message}${durationStr}`));\n}\n\n/**\n * Display help text\n */\nexport function showHelp() {\n console.log(`\n${c.bold('ComputeSDK Workbench Commands')}\n\n${c.bold('Provider Management:')}\n ${c.cyan('provider <name>')} Switch to provider via gateway (default)\n ${c.dim('Example: provider e2b')}\n ${c.cyan('provider direct <name>')} Connect directly to provider\n ${c.dim('Example: provider direct e2b')}\n ${c.cyan('providers')} List all providers with status\n ${c.cyan('mode <gateway|direct>')} Toggle default mode for next sandbox\n\n${c.bold('Provider Modes:')}\n ${c.bold('Gateway (default)')}: Routes through ComputeSDK API, zero-config\n • Requires: COMPUTESDK_API_KEY + provider credentials\n • Usage: ${c.cyan('provider e2b')}\n \n ${c.bold('Direct')}: Connects directly to provider, requires packages\n • Requires: Provider package installed + credentials\n • Usage: ${c.cyan('provider direct e2b')}\n\n${c.bold('Sandbox Management:')}\n ${c.cyan('restart')} Restart current sandbox\n ${c.cyan('destroy')} Destroy current sandbox\n ${c.cyan('connect <url> [token]')} Connect to existing sandbox via URL\n ${c.dim('Example: connect https://sandbox-123.localhost:8080')}\n ${c.dim('Example: connect https://sandbox-123.localhost:8080 your_token')}\n ${c.cyan('info')} Show sandbox info (provider, uptime)\n\n${c.bold('Environment:')}\n ${c.cyan('env')} Show environment/credentials status\n ${c.cyan('verbose')} Toggle verbose output mode\n\n${c.bold('Help:')}\n ${c.cyan('help')} Show this help message\n ${c.cyan('exit')} or ${c.cyan('.exit')} Exit workbench\n\n${c.bold('Running Commands:')}\n Type any @computesdk/cmd function and it will run automatically:\n \n ${c.dim('Package Managers:')}\n ${c.cyan('npm.install(\"express\")')}\n ${c.cyan('pip.install(\"requests\")')}\n \n ${c.dim('Git:')}\n ${c.cyan('git.clone(\"https://github.com/user/repo\")')}\n ${c.cyan('git.status()')}\n \n ${c.dim('Filesystem (via commands):')}\n ${c.cyan('ls(\"/home\")')}\n ${c.cyan('cat(\"/etc/hosts\")')}\n ${c.cyan('rm.rf(\"/tmp\")')} ${c.dim('// Force remove')}\n ${c.cyan('rm.auto(\"/path\")')} ${c.dim('// Smart remove')}\n \n ${c.dim('Filesystem (direct API):')}\n ${c.cyan('filesystem.readFile(\"/etc/hosts\")')}\n ${c.cyan('filesystem.writeFile(\"/app/server.js\", code)')}\n ${c.cyan('filesystem.mkdir(\"/app\")')}\n ${c.cyan('filesystem.readdir(\"/home\")')}\n ${c.cyan('filesystem.exists(\"/path\")')}\n ${c.cyan('filesystem.remove(\"/file\")')}\n \n ${c.dim('Named Sandboxes (gateway mode only):')}\n ${c.cyan('create()')} ${c.dim('// Create & switch to new sandbox')}\n ${c.cyan('create({ namespace: \"h\" })')} ${c.dim('// Create with namespace & switch')}\n ${c.cyan('findOrCreate({ name: \"my-app\" })')} ${c.dim('// Find or create & switch')}\n ${c.cyan('find({ name: \"my-app\" })')} ${c.dim('// Find existing & switch')}\n \n ${c.dim('Note: Prompts before switching if you already have an active sandbox')}\n \n ${c.dim('Child Sandboxes (gateway mode only):')}\n ${c.cyan('child.create()')} ${c.dim('// Create child sandbox')}\n ${c.cyan('child.list()')} ${c.dim('// List all children')}\n ${c.cyan('child.retrieve(\"sandbox-id\")')} ${c.dim('// Get child info')}\n ${c.cyan('child.destroy(\"sandbox-id\")')} ${c.dim('// Delete child')}\n \n ${c.dim('Sandbox Methods:')}\n ${c.cyan('getUrl({ port: 3000 })')} ${c.dim('// Get public URL')}\n ${c.cyan('runCode(\"console.log(\\'hi\\')\", \"node\")')}\n ${c.cyan('sandboxInfo()')} ${c.dim('// Get sandbox details')}\n ${c.cyan('getInstance()')} ${c.dim('// Get native instance')}\n \n ${c.dim('Note: No need to use \"await\" - promises are auto-awaited!')}\n \n ${c.dim('Compute CLI:')}\n ${c.cyan('compute.isSetup()')} ${c.dim('// Check if daemon is running')}\n ${c.cyan('compute.setup()')} ${c.dim('// Install + start daemon')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute CLI')}\n ${c.cyan('compute.start()')} ${c.dim('// Start daemon')}\n ${c.cyan('compute.health()')} ${c.dim('// Check daemon health')}\n\n${c.bold('Shell Commands:')}\n Use ${c.cyan('$')} prefix to run any shell command directly:\n ${c.cyan('$ls -la /app')}\n ${c.cyan('$npm install express')}\n ${c.cyan('$git status')}\n ${c.cyan('$compute --help')}\n\n${c.bold('Background Execution:')}\n ${c.cyan('sh(\"npm start\", { background: true })')}\n ${c.cyan('sh(\"python -m http.server 8000\", { background: true })')}\n\n${c.dim('Press Tab for autocomplete on all commands!')}\n`);\n}\n\n/**\n * Log error\n */\nexport function logError(message: string) {\n console.log(c.red(`❌ ${message}`));\n}\n\n/**\n * Log warning\n */\nexport function logWarning(message: string) {\n console.log(c.yellow(`⚠️ ${message}`));\n}\n\n/**\n * Log info\n */\nexport function logInfo(message: string) {\n console.log(c.blue(`ℹ️ ${message}`));\n}\n","/**\n * Provider detection and management for workbench\n *\n * Uses shared provider config from computesdk as single source of truth\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\nimport {\n PROVIDER_AUTH as SHARED_PROVIDER_AUTH,\n PROVIDER_NAMES as SHARED_PROVIDER_NAMES,\n PROVIDER_ENV_MAP,\n type ProviderName as SharedProviderName,\n isProviderAuthComplete,\n getMissingEnvVars,\n getProviderConfigFromEnv,\n} from 'computesdk';\n\n/**\n * Workbench-specific provider names (includes gateway)\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n ...SHARED_PROVIDER_NAMES,\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Auth requirements for each provider\n * Extends shared config with gateway-specific auth\n */\nexport const PROVIDER_AUTH: Record<ProviderName, readonly (readonly string[])[]> = {\n gateway: [['COMPUTESDK_API_KEY']],\n ...SHARED_PROVIDER_AUTH,\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n const authOptions = PROVIDER_AUTH[provider];\n\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...authOptions[0]],\n };\n }\n\n // Build a set of all present env vars (checked once per unique var)\n const allVars = new Set(authOptions.flat());\n const presentSet = new Set<string>();\n for (const v of allVars) {\n if (process.env?.[v]) presentSet.add(v);\n }\n\n // Evaluate each auth option in a single pass\n let bestOption: { presentCount: number; missing: string[] } | null = null;\n\n for (const option of authOptions) {\n const missing: string[] = [];\n let presentCount = 0;\n\n for (const v of option) {\n if (presentSet.has(v)) {\n presentCount++;\n } else {\n missing.push(v);\n }\n }\n\n // If all vars present, this option is satisfied\n if (missing.length === 0) {\n return {\n name: provider,\n isComplete: true,\n present: [...presentSet],\n missing: [],\n };\n }\n\n // Track the option closest to completion\n if (!bestOption || presentCount > bestOption.presentCount) {\n bestOption = { presentCount, missing };\n }\n }\n\n return {\n name: provider,\n isComplete: false,\n present: [...presentSet],\n missing: bestOption?.missing ?? [],\n };\n}\n\n/**\n * Get all available (fully configured) providers\n */\nexport function getAvailableProviders(): string[] {\n return PROVIDER_NAMES.filter(provider => {\n const status = getProviderStatus(provider);\n return status.isComplete;\n });\n}\n\n/**\n * Display all providers with their status\n */\nexport function showProviders() {\n console.log('\\n' + c.bold('Provider Status:'));\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} ${provider} - Ready`);\n } else if (status.present.length > 0) {\n const ratio = `${status.present.length}/${status.present.length + status.missing.length}`;\n console.log(` ${c.yellow('⚠️ ')} ${provider} - Incomplete (${ratio} credentials)`);\n console.log(` ${c.dim('Missing:')} ${status.missing.join(', ')}`);\n } else {\n console.log(` ${c.dim('❌')} ${c.dim(provider)} - Not configured`);\n }\n }\n\n console.log('');\n}\n\n/**\n * Display environment status with helpful setup instructions\n */\nexport function showEnv() {\n console.log('\\n' + c.bold('Environment Configuration:'));\n console.log('');\n\n for (const provider of PROVIDER_NAMES) {\n const status = getProviderStatus(provider);\n\n console.log(c.bold(`${provider}:`));\n\n if (status.isComplete) {\n console.log(` ${c.green('✅')} All credentials present`);\n status.present.forEach(varName => {\n console.log(` ${c.dim('•')} ${varName}`);\n });\n } else {\n if (status.present.length > 0) {\n console.log(c.dim(' Present:'));\n status.present.forEach(varName => {\n console.log(` ${c.green('✓')} ${varName}`);\n });\n }\n\n if (status.missing.length > 0) {\n console.log(c.dim(' Missing:'));\n status.missing.forEach(varName => {\n console.log(` ${c.red('✗')} ${varName}`);\n });\n }\n }\n\n console.log('');\n }\n\n console.log(c.dim('Tip: Set credentials in your .env file'));\n console.log('');\n}\n\n/**\n * Auto-detect best provider to use\n */\nexport function autoDetectProvider(forceGatewayMode = false): string | null {\n // Check for explicit override\n const explicit = process.env.COMPUTESDK_PROVIDER?.toLowerCase();\n if (explicit && isValidProvider(explicit) && isProviderReady(explicit)) {\n return explicit;\n }\n\n // If forcing gateway mode, only return gateway if available\n if (forceGatewayMode) {\n return isProviderReady('gateway') ? 'gateway' : null;\n }\n\n // Auto-detect based on priority order\n for (const provider of PROVIDER_NAMES) {\n if (isProviderReady(provider)) {\n return provider;\n }\n }\n\n return null;\n}\n\n/**\n * Validate that a provider name is valid\n */\nexport function isValidProvider(name: string): name is ProviderName {\n return PROVIDER_NAMES.includes(name as ProviderName);\n}\n\n/**\n * Check if provider is fully configured\n */\nexport function isProviderReady(provider: string): boolean {\n if (!isValidProvider(provider)) return false;\n const status = getProviderStatus(provider);\n return status.isComplete;\n}\n\n/**\n * Get helpful error message for unconfigured provider\n */\nexport function getProviderSetupHelp(provider: string): string {\n if (!isValidProvider(provider)) {\n return `Unknown provider: ${provider}\\nAvailable: ${PROVIDER_NAMES.join(', ')}`;\n }\n\n const status = getProviderStatus(provider);\n\n if (status.isComplete) {\n return `Provider ${provider} is already configured`;\n }\n\n const lines = [\n `Provider ${provider} requires these environment variables:`,\n '',\n ...status.missing.map(varName => ` ${varName}`),\n '',\n 'Add them to your .env file or export them in your shell.',\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Dynamically import a provider package\n */\nexport async function loadProvider(providerName: ProviderName): Promise<any> {\n try {\n switch (providerName) {\n case 'gateway':\n // Gateway is built into computesdk package\n return await import('computesdk');\n case 'e2b':\n return await import('@computesdk/e2b');\n case 'railway':\n return await import('@computesdk/railway');\n case 'daytona':\n return await import('@computesdk/daytona');\n case 'modal':\n return await import('@computesdk/modal');\n case 'runloop':\n return await import('@computesdk/runloop');\n case 'vercel':\n return await import('@computesdk/vercel');\n case 'cloudflare':\n return await import('@computesdk/cloudflare');\n case 'codesandbox':\n return await import('@computesdk/codesandbox');\n case 'blaxel':\n return await import('@computesdk/blaxel');\n default:\n throw new Error(`Unknown provider: ${providerName}`);\n }\n } catch (error) {\n if (providerName === 'gateway') {\n throw new Error(`Failed to load gateway provider from computesdk package.`);\n }\n throw new Error(\n `Failed to load provider ${providerName}. ` +\n `Make sure to install it: npm install @computesdk/${providerName}`\n );\n }\n}\n\n/**\n * Create provider config from environment variables\n * Uses shared PROVIDER_ENV_MAP from computesdk\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n // Handle gateway separately (not in shared config)\n if (providerName === 'gateway') {\n const config: Record<string, string> = {};\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n return config;\n }\n\n // Use shared utility for other providers\n return getProviderConfigFromEnv(providerName as SharedProviderName);\n}\n","/**\n * Workbench command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from '@computesdk/provider';\nimport { escapeArgs } from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { getCurrentSandbox, setSandbox, clearSandbox, hasSandbox } from './state.js';\nimport { \n Spinner, \n logCommand, \n logSuccess, \n logError, \n logWarning,\n c,\n formatDuration,\n} from './output.js';\nimport { \n isProviderReady, \n autoDetectProvider, \n getProviderSetupHelp,\n isValidProvider,\n loadProvider,\n getProviderConfig,\n type ProviderName,\n} from './providers.js';\nimport * as readline from 'readline';\n\n/**\n * Prompt user for yes/no confirmation\n */\nasync function confirm(question: string, defaultYes = false): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n \n // Clear any pending input\n process.stdin.resume();\n \n const promptSuffix = defaultYes ? '(Y/n)' : '(y/N)';\n \n rl.question(`${question} ${promptSuffix}: `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n \n // If empty answer, use default\n if (trimmed === '') {\n resolve(defaultYes);\n } else {\n resolve(trimmed === 'y' || trimmed === 'yes');\n }\n });\n });\n}\n\n/**\n * Prompt user to switch sandbox if one is already active\n * Returns true if should proceed with switch\n */\nexport async function confirmSandboxSwitch(state: WorkbenchState): Promise<boolean> {\n if (!hasSandbox(state)) {\n return true; // No current sandbox, no need to confirm\n }\n \n return await confirm('Switch to new sandbox?', true); // Default YES\n}\n\n/**\n * Auto-create sandbox if none exists\n */\nexport async function ensureSandbox(state: WorkbenchState): Promise<void> {\n if (hasSandbox(state)) {\n return; // Already have a sandbox\n }\n \n await createSandbox(state);\n}\n\n/**\n * Create or get compute instance for current provider configuration\n */\nexport async function getComputeInstance(state: WorkbenchState): Promise<any> {\n // Return cached instance if available\n if (state.compute) {\n return state.compute;\n }\n \n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n throw new Error('No provider configured.');\n }\n \n let compute;\n \n if (useDirect) {\n // Direct mode: load the provider package directly\n const providerModule = await loadProvider(providerName as ProviderName);\n const providerFactory = providerModule[providerName];\n \n if (!providerFactory) {\n throw new Error(`Provider ${providerName} does not export a factory function`);\n }\n \n // Get config from environment\n const config = getProviderConfig(providerName as ProviderName);\n \n // Create compute instance with this provider\n compute = createCompute({\n defaultProvider: providerFactory(config),\n });\n } else {\n // Gateway mode: use the shared gateway compute instance from computesdk.\n // The gateway must be configured via environment variables (for example, COMPUTESDK_API_KEY)\n // or explicit configuration; if neither is provided, the gateway will throw an error.\n const { compute: gatewayCompute } = await import('computesdk');\n compute = gatewayCompute;\n }\n \n // Cache the instance\n state.compute = compute;\n return compute;\n}\n\n/**\n * Create a new sandbox using gateway or direct provider\n */\nexport async function createSandbox(state: WorkbenchState): Promise<void> {\n const providerName = state.currentProvider || autoDetectProvider(false);\n const useDirect = state.useDirectMode;\n \n if (!providerName) {\n logError('No provider configured. Run \"env\" to see setup instructions.');\n throw new Error('No provider available');\n }\n \n // Determine which mode to use\n let modeLabel: string;\n let actualProviderName: string;\n \n if (useDirect) {\n // Direct mode: use the provider directly\n modeLabel = `${providerName} (direct)`;\n actualProviderName = providerName;\n \n if (!isProviderReady(providerName)) {\n logError(`Provider ${providerName} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(providerName));\n throw new Error('Provider not ready');\n }\n } else {\n // Gateway mode: use gateway with specified backend\n modeLabel = `${providerName} (via gateway)`;\n actualProviderName = 'gateway';\n \n if (!isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n throw new Error('Gateway not ready');\n }\n }\n \n const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();\n const startTime = Date.now();\n \n try {\n // Get or create compute instance\n const compute = await getComputeInstance(state);\n \n // Create sandbox\n const result = await compute.sandbox.create();\n const duration = Date.now() - startTime;\n \n setSandbox(state, result, providerName);\n spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to create sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n \n // Better error message if provider package not installed\n if (error instanceof Error && error.message.includes('Cannot find module')) {\n logError(`Provider package @computesdk/${providerName} is not installed.`);\n console.log(`\\nInstall it with: ${c.cyan(`npm install @computesdk/${providerName}`)}\\n`);\n }\n \n // Show the actual error for debugging\n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Destroy current sandbox\n */\nexport async function destroySandbox(state: WorkbenchState): Promise<void> {\n const spinner = new Spinner('Destroying sandbox...').start();\n \n try {\n const sandbox = getCurrentSandbox(state);\n await sandbox.destroy();\n clearSandbox(state);\n spinner.succeed('Destroyed');\n } catch (error) {\n spinner.fail(`Failed to destroy: ${error instanceof Error ? error.message : String(error)}`);\n throw error;\n }\n}\n\n/**\n * Restart sandbox (destroy + create with same provider)\n */\nexport async function restartSandbox(state: WorkbenchState): Promise<void> {\n const provider = state.currentProvider;\n \n if (hasSandbox(state)) {\n await destroySandbox(state);\n }\n \n // Keep same provider\n if (provider) {\n state.currentProvider = provider;\n }\n \n await createSandbox(state);\n}\n\n/**\n * Run a command on the current sandbox\n */\nexport async function runCommand(state: WorkbenchState, command: string[]): Promise<any> {\n // Ensure we have a sandbox\n await ensureSandbox(state);\n \n const sandbox = getCurrentSandbox(state);\n const startTime = Date.now();\n \n logCommand(command);\n \n try {\n // Use escapeArgs to properly join and escape command array with spaces/special chars\n const commandString = escapeArgs(command);\n const result = await sandbox.runCommand(commandString);\n const duration = Date.now() - startTime;\n \n // Print output directly\n if (result.stdout) {\n console.log(result.stdout.trimEnd());\n }\n if (result.stderr) {\n console.error(c.red(result.stderr.trimEnd()));\n }\n \n // Show success indicator with timing and exit code info\n const exitCodeInfo = result.exitCode !== 0 ? c.yellow(` (exit ${result.exitCode})`) : '';\n logSuccess(`${c.dim(`${formatDuration(duration)}`)}${exitCodeInfo}`);\n \n // In verbose mode, return the full result object\n // Otherwise return undefined so REPL doesn't print anything\n if (state.verbose) {\n return result;\n }\n return undefined;\n } catch (error) {\n const duration = Date.now() - startTime;\n logError(`Failed ${c.dim(`(${formatDuration(duration)})`)} - ${error instanceof Error ? error.message : String(error)}`);\n\n // Clear stale sandbox on connection/auth errors so next command creates fresh\n if (isStaleConnectionError(error)) {\n clearSandbox(state);\n logWarning('Sandbox connection lost. Next command will create a new sandbox.');\n }\n\n throw error;\n }\n}\n\n/**\n * Check if an error indicates a stale/dead sandbox connection\n */\nfunction isStaleConnectionError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const message = error.message.toLowerCase();\n const stalePhrases = [\n 'websocket',\n 'connection refused',\n 'connection reset',\n 'connection closed',\n 'socket hang up',\n 'econnrefused',\n 'econnreset',\n 'etimedout',\n 'not found',\n 'sandbox not found',\n 'unauthorized',\n '401',\n '403',\n '404',\n ];\n\n return stalePhrases.some(phrase => message.includes(phrase));\n}\n\n/**\n * Switch to a different provider\n * Supports both gateway mode (default) and direct mode\n * \n * Examples:\n * provider e2b → gateway with e2b backend\n * provider direct e2b → direct connection to e2b\n */\nexport async function switchProvider(state: WorkbenchState, mode: string, providerName?: string): Promise<void> {\n // Parse the command: could be \"provider e2b\" or \"provider direct e2b\"\n let useDirect = false;\n let actualProvider = mode;\n \n if (mode === 'direct') {\n if (!providerName) {\n logError('Usage: provider direct <name>');\n console.log('Example: provider direct e2b');\n return;\n }\n useDirect = true;\n actualProvider = providerName;\n } else if (mode === 'gateway') {\n if (!providerName) {\n logError('Usage: provider gateway <name>');\n console.log('Example: provider gateway e2b');\n return;\n }\n useDirect = false;\n actualProvider = providerName;\n }\n \n // Remove 'gateway' prefix if someone types \"provider gateway\"\n if (actualProvider === 'gateway') {\n actualProvider = autoDetectProvider(false) || 'e2b';\n }\n \n // Validate provider\n if (!isValidProvider(actualProvider)) {\n logError(`Unknown provider: ${actualProvider}`);\n console.log(`Available providers: e2b, railway, daytona, modal, runloop, vercel, cloudflare, codesandbox, blaxel`);\n return;\n }\n \n // Check if gateway is configured (always needed)\n if (!useDirect && !isProviderReady('gateway')) {\n logError('Gateway mode requires COMPUTESDK_API_KEY');\n console.log(getProviderSetupHelp('gateway'));\n return;\n }\n \n // Check if direct provider is configured (only for direct mode)\n if (useDirect && !isProviderReady(actualProvider)) {\n logError(`Provider ${actualProvider} is not fully configured for direct mode.`);\n console.log(getProviderSetupHelp(actualProvider));\n return;\n }\n \n // Prompt to destroy current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Destroy current sandbox?');\n if (shouldDestroy) {\n await destroySandbox(state);\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n } else {\n logWarning('Keeping current sandbox. Provider remains unchanged.');\n }\n } else {\n state.currentProvider = actualProvider;\n state.useDirectMode = useDirect;\n state.compute = null; // Clear compute instance so it gets recreated\n const modeStr = useDirect ? `${actualProvider} (direct)` : `${actualProvider} (via gateway)`;\n logSuccess(`Switched to ${modeStr}`);\n }\n}\n\n/**\n * Create a provider command handler\n * Supports: provider e2b, provider direct e2b, provider gateway e2b\n */\nexport function defineProviderCommand(state: WorkbenchState) {\n return async function provider(mode?: string, providerName?: string) {\n if (!mode) {\n // Show current provider\n if (state.currentProvider) {\n const modeStr = state.useDirectMode ? 'direct' : 'via gateway';\n console.log(`\\nCurrent provider: ${c.green(state.currentProvider)} (${modeStr})\\n`);\n } else {\n console.log(c.yellow('\\nNo provider selected\\n'));\n }\n return;\n }\n \n await switchProvider(state, mode, providerName);\n };\n}\n\n/**\n * Toggle between gateway and direct mode\n */\nexport async function toggleMode(state: WorkbenchState, mode?: 'gateway' | 'direct'): Promise<void> {\n const newMode = mode || (state.useDirectMode ? 'gateway' : 'direct');\n \n if (newMode === 'direct') {\n state.useDirectMode = true;\n logSuccess('Switched to direct mode 🔗');\n console.log(c.dim('Next sandbox will use direct provider packages\\n'));\n \n // If we have a sandbox and it's in gateway mode, suggest restart\n if (hasSandbox(state) && !state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in gateway mode.'));\n console.log(c.dim('Run \"restart\" to switch to direct mode\\n'));\n }\n } else {\n state.useDirectMode = false;\n logSuccess('Switched to gateway mode 🌐');\n console.log(c.dim('Next sandbox will use gateway (requires COMPUTESDK_API_KEY)\\n'));\n \n // If we have a sandbox and it's in direct mode, suggest restart\n if (hasSandbox(state) && state.useDirectMode) {\n console.log(c.yellow('Current sandbox is in direct mode.'));\n console.log(c.dim('Run \"restart\" to switch to gateway mode\\n'));\n }\n }\n}\n\n/**\n * Show current mode\n */\nexport function showMode(state: WorkbenchState): void {\n const mode = state.useDirectMode ? 'direct' : 'gateway';\n const icon = mode === 'gateway' ? '🌐' : '🔗';\n \n console.log(`\\nCurrent mode: ${c.green(mode)} ${icon}`);\n \n if (mode === 'gateway') {\n console.log(c.dim('Routes through ComputeSDK API (requires COMPUTESDK_API_KEY)'));\n } else {\n console.log(c.dim('Direct connection to providers (requires provider packages)'));\n }\n \n console.log(`\\nSwitch with: ${c.cyan('provider e2b')} (gateway) or ${c.cyan('provider direct e2b')} (direct)\\n`);\n}\n\n/**\n * Toggle verbose mode\n */\nexport function toggleVerbose(state: WorkbenchState): void {\n state.verbose = !state.verbose;\n if (state.verbose) {\n logSuccess('Verbose mode enabled - will show full command results');\n console.log(c.dim('Commands will return full result objects with metadata\\n'));\n } else {\n logSuccess('Verbose mode disabled - showing clean output only');\n console.log(c.dim('Commands will only show stdout/stderr\\n'));\n }\n}\n\n/**\n * Show verbose mode status\n */\nexport function showVerbose(state: WorkbenchState): void {\n const status = state.verbose ? c.green('enabled') : c.dim('disabled');\n console.log(`\\nVerbose mode: ${status}`);\n \n if (state.verbose) {\n console.log(c.dim('Commands return full result objects with metadata'));\n } else {\n console.log(c.dim('Commands show only stdout/stderr'));\n }\n \n console.log(`\\nToggle with: ${c.cyan('verbose')}\\n`);\n}\n\n/**\n * Connect to an existing sandbox via URL\n * Useful for connecting to a locally running sandbox or a sandbox created elsewhere\n */\nexport async function connectToSandbox(state: WorkbenchState, sandboxUrl: string, token?: string): Promise<void> {\n // Validate URL format\n if (!sandboxUrl) {\n logError('Usage: connect <sandbox_url> [token]');\n console.log('Example: connect https://sandbox-123.localhost:8080');\n console.log('Example: connect https://sandbox-123.localhost:8080 your_access_token');\n return;\n }\n \n // Clean up URL (remove trailing slash)\n const cleanUrl = sandboxUrl.replace(/\\/$/, '');\n \n // Disconnect from current sandbox if exists\n if (hasSandbox(state)) {\n const shouldDestroy = await confirm('Disconnect from current sandbox?');\n if (!shouldDestroy) {\n logWarning('Keeping current sandbox. Connection cancelled.');\n return;\n }\n // Just clear the reference, don't destroy since we don't own this sandbox\n clearSandbox(state);\n }\n \n const spinner = new Spinner(`Connecting to ${cleanUrl}...`).start();\n const startTime = Date.now();\n \n try {\n // Import Sandbox class from computesdk package (client is now merged into computesdk)\n const { Sandbox } = await import('computesdk');\n \n // Dynamically import WebSocket for Node.js environment\n let WebSocket: any;\n try {\n // @ts-expect-error - ws is an optional peer dependency that may not have type declarations\n const wsModule = await import('ws');\n WebSocket = wsModule.default;\n } catch {\n logError('Failed to import \"ws\" module. Please install it: pnpm add ws');\n throw new Error('Missing \"ws\" dependency');\n }\n \n // Create a Sandbox instance directly with optional token\n // WebSocket type comes from 'ws' module which may differ from browser WebSocket\n const sandbox = new Sandbox({\n sandboxUrl: cleanUrl,\n sandboxId: '', // Will be populated when we get info\n provider: 'connected', // Mark as directly connected\n token: token, // Optional access token\n WebSocket: WebSocket as typeof globalThis.WebSocket,\n });\n\n // Test the connection by getting sandbox info\n const info = await sandbox.getInfo();\n const duration = Date.now() - startTime;\n\n // Update state with the connected sandbox\n // Sandbox from @computesdk/client is the same class re-exported by computesdk\n setSandbox(state, sandbox, 'connected');\n \n spinner.succeed(`Connected to sandbox ${c.dim(`(${formatDuration(duration)})`)}`);\n console.log(c.dim(`Provider: ${info.provider || 'unknown'}`));\n console.log(c.dim(`Sandbox ID: ${info.id || 'unknown'}`));\n } catch (error) {\n const duration = Date.now() - startTime;\n spinner.fail(`Failed to connect ${c.dim(`(${formatDuration(duration)})`)}`);\n \n if (error instanceof Error) {\n logError(`Error: ${error.message}`);\n if (error.stack) {\n console.log(c.dim(error.stack));\n }\n }\n \n throw error;\n }\n}\n\n/**\n * Cleanup on exit\n */\nexport async function cleanupOnExit(state: WorkbenchState, replServer?: any): Promise<void> {\n if (!hasSandbox(state)) {\n return;\n }\n \n // Pause the REPL to prevent input conflicts\n if (replServer) {\n replServer.pause();\n }\n \n console.log(''); // New line\n \n // Don't offer to destroy if we're just connected to an external sandbox\n if (state.currentProvider === 'connected') {\n logWarning('Disconnecting from external sandbox (not destroying).');\n return;\n }\n \n const shouldDestroy = await confirm('Destroy active sandbox?');\n \n if (shouldDestroy) {\n await destroySandbox(state);\n } else {\n logWarning('Sandbox left running. It may incur costs.');\n }\n \n // Resume not needed since we're exiting\n}\n","/**\n * ComputeSDK Workbench\n * \n * Interactive REPL for testing sandbox lifecycle operations\n */\n\nimport { createState } from './state.js';\nimport { createREPL } from './repl.js';\nimport { showWelcome } from './output.js';\nimport { getAvailableProviders, autoDetectProvider } from './providers.js';\nimport { cleanupOnExit } from './commands.js';\n\n/**\n * Start the workbench REPL\n */\nexport async function startWorkbench(): Promise<void> {\n // Create state\n const state = createState();\n \n // Detect available providers\n state.availableProviders = getAvailableProviders();\n const detectedProvider = autoDetectProvider();\n \n // Determine mode based on what's available\n const hasGateway = state.availableProviders.includes('gateway');\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n \n if (hasGateway && backendProviders.length > 0) {\n // Gateway is available - use it with first backend provider\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Use gateway mode\n } else if (backendProviders.length > 0) {\n // No gateway, but we have direct providers - use direct mode\n state.currentProvider = backendProviders[0];\n state.useDirectMode = true; // Use direct mode\n } else {\n // No providers at all\n state.currentProvider = detectedProvider;\n state.useDirectMode = false;\n }\n \n // Show welcome banner\n showWelcome(state.availableProviders, state.currentProvider, state.useDirectMode);\n \n // Create REPL\n const replServer = createREPL(state);\n \n // Handle exit\n replServer.on('exit', async () => {\n await cleanupOnExit(state, replServer);\n process.exit(0);\n });\n}\n","/**\n * REPL setup and configuration\n * \n * Creates Node.js REPL with:\n * - Tab autocomplete for @computesdk/cmd functions\n * - Smart command evaluation (auto-run Command arrays)\n * - Workbench command injection\n */\n\nimport * as repl from 'repl';\nimport * as cmd from '@computesdk/cmd';\nimport type { WorkbenchState } from './state.js';\nimport { runCommand, defineProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose, connectToSandbox } from './commands.js';\nimport { showHelp, showInfo } from './output.js';\nimport { showProviders, showEnv, PROVIDER_NAMES } from './providers.js';\nimport { isCommand } from './types.js';\n\n/**\n * Extended REPL server interface with custom eval function\n */\ninterface ExtendedREPLServer extends repl.REPLServer {\n eval: (\n cmd: string,\n context: object,\n filename: string,\n callback: (err: Error | null, result: any) => void\n ) => void;\n}\nimport * as path from 'path';\nimport * as os from 'os';\n\n/**\n * Create and configure REPL server\n */\nexport function createREPL(state: WorkbenchState): repl.REPLServer {\n const replServer = repl.start({\n prompt: '> ', // Initial prompt, will be updated by state management\n useColors: true,\n terminal: true,\n useGlobal: false,\n ignoreUndefined: true,\n });\n\n // Inject cmd context for autocomplete\n injectCmdContext(replServer);\n \n // Inject workbench commands\n injectWorkbenchCommands(replServer, state);\n \n // Setup custom evaluator\n setupSmartEvaluator(replServer, state);\n \n // Setup custom autocomplete\n setupAutocomplete(replServer, state);\n \n // Setup command history\n setupHistory(replServer);\n \n // Store replServer reference for prompt updates\n state._replServer = replServer;\n\n return replServer;\n}\n\n/**\n * Inject all @computesdk/cmd exports into REPL context for autocomplete\n */\nfunction injectCmdContext(replServer: repl.REPLServer) {\n // Package managers\n replServer.context.npm = cmd.npm;\n replServer.context.pnpm = cmd.pnpm;\n replServer.context.yarn = cmd.yarn;\n replServer.context.bun = cmd.bun;\n replServer.context.pip = cmd.pip;\n replServer.context.uv = cmd.uv;\n replServer.context.poetry = cmd.poetry;\n replServer.context.pipx = cmd.pipx;\n \n // Package runners\n replServer.context.npx = cmd.npx;\n replServer.context.bunx = cmd.bunx;\n replServer.context.deno = cmd.deno;\n \n // Git\n replServer.context.git = cmd.git;\n \n // Filesystem\n replServer.context.mkdir = cmd.mkdir;\n replServer.context.rm = cmd.rm;\n replServer.context.cp = cmd.cp;\n replServer.context.mv = cmd.mv;\n replServer.context.ls = cmd.ls;\n replServer.context.pwd = cmd.pwd;\n replServer.context.chmod = cmd.chmod;\n replServer.context.chown = cmd.chown;\n replServer.context.touch = cmd.touch;\n replServer.context.cat = cmd.cat;\n replServer.context.ln = cmd.ln;\n replServer.context.readlink = cmd.readlink;\n replServer.context.test = cmd.test;\n replServer.context.rsync = cmd.rsync;\n \n // Process\n replServer.context.node = cmd.node;\n replServer.context.python = cmd.python;\n replServer.context.kill = cmd.kill;\n replServer.context.pkill = cmd.pkill;\n replServer.context.ps = cmd.ps;\n replServer.context.timeout = cmd.timeout;\n \n // Network\n replServer.context.curl = cmd.curl;\n replServer.context.wget = cmd.wget;\n replServer.context.port = cmd.port;\n replServer.context.net = cmd.net;\n \n // Text processing\n replServer.context.grep = cmd.grep;\n replServer.context.sed = cmd.sed;\n replServer.context.head = cmd.head;\n replServer.context.tail = cmd.tail;\n replServer.context.wc = cmd.wc;\n replServer.context.sort = cmd.sort;\n replServer.context.uniq = cmd.uniq;\n replServer.context.jq = cmd.jq;\n replServer.context.xargs = cmd.xargs;\n replServer.context.awk = cmd.awk;\n replServer.context.cut = cmd.cut;\n replServer.context.tr = cmd.tr;\n \n // Archives\n replServer.context.tar = cmd.tar;\n replServer.context.unzip = cmd.unzip;\n \n // System\n replServer.context.echo = cmd.echo;\n replServer.context.env = cmd.env;\n replServer.context.printenv = cmd.printenv;\n replServer.context.which = cmd.which;\n replServer.context.whoami = cmd.whoami;\n replServer.context.uname = cmd.uname;\n replServer.context.hostname = cmd.hostname;\n replServer.context.df = cmd.df;\n replServer.context.du = cmd.du;\n replServer.context.sleep = cmd.sleep;\n replServer.context.date = cmd.date;\n replServer.context.find = cmd.find;\n replServer.context.tee = cmd.tee;\n replServer.context.diff = cmd.diff;\n replServer.context.parallel = cmd.parallel;\n replServer.context.raw = cmd.raw;\n replServer.context.base64 = cmd.base64;\n replServer.context.md5sum = cmd.md5sum;\n replServer.context.sha256sum = cmd.sha256sum;\n replServer.context.sha1sum = cmd.sha1sum;\n \n // Compute\n replServer.context.compute = cmd.compute;\n \n // Shell wrappers (for wrapping commands with cwd/background options)\n replServer.context.shell = cmd.shell;\n replServer.context.sh = cmd.sh;\n replServer.context.bash = cmd.bash;\n replServer.context.zsh = cmd.zsh;\n}\n\n/**\n * Inject workbench-specific commands\n */\nfunction injectWorkbenchCommands(replServer: repl.REPLServer, state: WorkbenchState) {\n // Provider management\n replServer.context.provider = defineProviderCommand(state);\n replServer.context.providers = () => showProviders();\n \n // Mode management\n replServer.context.mode = async (modeName?: 'gateway' | 'direct') => {\n if (!modeName) {\n showMode(state);\n } else {\n await toggleMode(state, modeName);\n }\n };\n \n // Sandbox operations\n replServer.context.restart = async () => {\n await restartSandbox(state);\n };\n \n replServer.context.destroy = async () => {\n await destroySandbox(state);\n };\n \n replServer.context.connect = async (url: string, token?: string) => {\n await connectToSandbox(state, url, token);\n };\n \n replServer.context.info = () => showInfo(state);\n \n // Output control\n replServer.context.verbose = () => {\n toggleVerbose(state);\n showVerbose(state);\n };\n \n // Background execution helper - accepts string or Command\n replServer.context.bg = (command: string | string[]) => {\n const cmdArray = typeof command === 'string' \n ? ['sh', '-c', command]\n : command;\n return cmd.sh(cmdArray as any, { background: true });\n };\n \n // Environment/help\n replServer.context.env = () => showEnv();\n replServer.context.help = showHelp;\n \n // Expose sandbox methods directly in context\n // These are lazy-evaluated to get the current sandbox\n \n // Expose getUrl directly\n replServer.context.getUrl = async (options: { port: number; protocol?: string }) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getUrl(options);\n };\n \n // Expose getInfo as sandboxInfo (since 'info' is already taken for workbench info)\n replServer.context.sandboxInfo = async () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInfo();\n };\n \n // Expose runCode directly\n replServer.context.runCode = async (code: string, runtime?: 'node' | 'python') => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCode(code, runtime);\n };\n \n // Expose runCommand directly with full options support (background, cwd, env)\n replServer.context.runCommand = async (\n command: string,\n options?: { background?: boolean; cwd?: string; env?: Record<string, string> }\n ) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.runCommand(command, options);\n };\n \n // Expose sandbox creation methods (gateway mode only)\n // These return clean { sandboxId, metadata } objects instead of full GeneratedSandbox\n replServer.context.create = async (options?: Record<string, unknown>) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching from existing sandbox\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n // User chose not to switch - create but don't activate\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Create sandbox (may throw error)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.create(options);\n \n // Only set as current after successful creation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.findOrCreate = async (options: { name: string; namespace?: string; timeout?: number; runtime?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (findOrCreate) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Find or create sandbox\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.findOrCreate(options);\n \n // Set as current after successful operation\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n replServer.context.find = async (options: { name: string; namespace?: string }) => {\n if (state.useDirectMode) {\n throw new Error('Named sandboxes (find) are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n \n // Lazy-load dependencies\n const { getComputeInstance, confirmSandboxSwitch } = await import('./commands.js');\n const { setSandbox } = await import('./state.js');\n const { logSuccess } = await import('./output.js');\n \n // Find sandbox first (may return null)\n const compute = await getComputeInstance(state);\n const sandbox = await compute.sandbox.find(options);\n \n if (!sandbox) {\n return null; // Not found, nothing to switch to\n }\n \n // Prompt if switching\n const shouldSwitch = await confirmSandboxSwitch(state);\n \n if (!shouldSwitch) {\n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n }\n \n // Set as current\n setSandbox(state, sandbox, sandbox.provider);\n logSuccess(`Switched to sandbox ${sandbox.sandboxId}`);\n \n return {\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n name: options.name,\n namespace: options.namespace || 'default',\n metadata: sandbox.getInstance().config.metadata || {}\n };\n };\n \n // Expose filesystem namespace\n replServer.context.filesystem = {\n get readFile() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readFile(path);\n };\n },\n get writeFile() {\n return async (path: string, content: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.writeFile(path, content);\n };\n },\n get mkdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.mkdir(path);\n };\n },\n get readdir() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.readdir(path);\n };\n },\n get exists() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.exists(path);\n };\n },\n get remove() {\n return async (path: string) => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.filesystem.remove(path);\n };\n }\n };\n \n // Expose child namespace for child sandbox operations (gateway mode only)\n replServer.context.child = {\n get create() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.create();\n };\n },\n get list() {\n return async () => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.list();\n };\n },\n get retrieve() {\n return async (subdomain: string) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.retrieve(subdomain);\n };\n },\n get destroy() {\n return async (subdomain: string, options?: { deleteFiles?: boolean }) => {\n if (state.useDirectMode) {\n throw new Error('Child sandboxes are only available in gateway mode. Use \"mode gateway\" to switch.');\n }\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n const instance = sandbox.getInstance();\n return instance.child.destroy(subdomain, options);\n };\n }\n };\n \n // Expose getInstance for advanced users\n replServer.context.getInstance = () => {\n const sandbox = state.currentSandbox;\n if (!sandbox) {\n throw new Error('No active sandbox. Run a command to auto-create one.');\n }\n return sandbox.getInstance();\n };\n}\n\n/**\n * Setup smart evaluator that auto-runs Command arrays and workbench commands\n */\nfunction setupSmartEvaluator(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalEval = replServer.eval;\n \n // Track workbench command names for auto-calling\n const workbenchCommands = new Set(['help', 'providers', 'info', 'env', 'restart', 'destroy', 'mode', 'verbose', 'sandboxInfo', 'connect']);\n \n (replServer as ExtendedREPLServer).eval = function (cmd: string, context: object, filename: string, callback: (err: Error | null, result: any) => void) {\n const trimmedCmd = cmd.trim();\n \n // Special handling for \"provider <mode> <name>\" syntax (without parentheses)\n // Supports: \"provider e2b\", \"provider direct e2b\", \"provider gateway e2b\"\n const providerMatch = trimmedCmd.match(/^provider(?:\\s+(direct|gateway))?\\s+(\\w+)$/);\n if (providerMatch) {\n const mode = providerMatch[1] || null; // 'direct', 'gateway', or null\n const providerName = providerMatch[2];\n const providerCmd = mode \n ? `await provider('${mode}', '${providerName}')`\n : `await provider('${providerName}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Also handle just \"provider direct\" or \"provider gateway\" alone \n const providerOnlyMatch = trimmedCmd.match(/^provider\\s+(direct|gateway)$/);\n if (providerOnlyMatch) {\n const mode = providerOnlyMatch[1];\n const providerCmd = `await provider('${mode}')`;\n originalEval.call(this, providerCmd, context, filename, callback);\n return;\n }\n \n // Special handling for \"mode <gateway|direct>\" syntax\n const modeMatch = trimmedCmd.match(/^mode\\s+(gateway|direct)$/);\n if (modeMatch) {\n const modeName = modeMatch[1];\n const modeCmd = `await mode('${modeName}')`;\n originalEval.call(this, modeCmd, context, filename, callback);\n return;\n }\n \n // Special handling for $command syntax (direct shell command execution)\n const dollarMatch = trimmedCmd.match(/^\\$(.+)$/);\n if (dollarMatch) {\n const shellCmd = dollarMatch[1].trim();\n \n // Handle empty command\n if (!shellCmd) {\n callback(new Error('Empty command after $'), undefined);\n return;\n }\n \n // Create command array: ['sh', '-c', 'the command']\n const command = ['sh', '-c', shellCmd];\n \n // Execute the command directly\n runCommand(state, command)\n .then(output => callback(null, output))\n .catch(error => callback(error as Error, undefined));\n return;\n }\n \n // Use original eval to get the result\n originalEval.call(this, cmd, context, filename, async (err, result) => {\n if (err) {\n callback(err, undefined);\n return;\n }\n \n // Check if result is a Command (string array from @computesdk/cmd)\n if (isCommand(result)) {\n try {\n const output = await runCommand(state, result);\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Check if it's a workbench command function that should be auto-called\n if (typeof result === 'function' && workbenchCommands.has(trimmedCmd)) {\n try {\n const output = await result();\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Auto-await promises (so users don't need to type \"await\")\n if (result && typeof result.then === 'function') {\n try {\n const output = await result;\n callback(null, output);\n } catch (error) {\n callback(error as Error, undefined);\n }\n return;\n }\n \n // Not a command or promise, return as-is\n callback(null, result);\n });\n };\n}\n\n/**\n * Setup custom autocomplete\n */\nfunction setupAutocomplete(replServer: repl.REPLServer, state: WorkbenchState) {\n const originalCompleter = replServer.completer as any;\n \n // Workbench commands with their argument suggestions\n const workbenchCommands = {\n 'provider': [...PROVIDER_NAMES], // Use actual provider names from config\n 'mode': ['gateway', 'direct'],\n 'providers': [],\n 'restart': [],\n 'destroy': [],\n 'connect': [], // Connect takes a URL argument\n 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n // Sandbox methods\n 'getUrl': [],\n 'runCode': [],\n 'sandboxInfo': [],\n 'getInstance': [],\n // Filesystem is an object, so it gets dot notation autocomplete automatically\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\n try {\n // Don't trim - we need to detect trailing spaces\n const trimmed = line.trim();\n \n // Complete workbench command names (no space or dot in line)\n if (!line.includes(' ') && !line.includes('.')) {\n const commands = Object.keys(workbenchCommands);\n const hits = commands.filter(cmd => cmd.startsWith(trimmed));\n \n // Also get context completions from original completer\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n // Validate result format\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [hits, trimmed]);\n return;\n }\n \n const [contextHits, partial] = result;\n if (!Array.isArray(contextHits)) {\n callback(null, [hits, trimmed]);\n return;\n }\n\n // Merge workbench commands with context completions\n const allHits = [...new Set([...hits, ...contextHits])].sort();\n const completionPrefix = typeof partial === 'string' ? partial : trimmed;\n callback(null, [allHits, completionPrefix]);\n });\n return;\n }\n \n callback(null, [hits.length ? hits : commands, trimmed]);\n return;\n }\n \n // Complete command arguments (e.g., \"provider e\" -> \"provider e2b\")\n // Use original line to detect spaces properly\n if (line.includes(' ') && !line.includes('.')) {\n const parts = line.split(' ');\n const command = parts[0].trim();\n const partial = parts.slice(1).join(' ').trim(); // Everything after command\n const suggestions = workbenchCommands[command as keyof typeof workbenchCommands];\n \n // Check if this is a known workbench command\n if (suggestions !== undefined) {\n if (suggestions.length > 0) {\n const hits = suggestions\n .filter(s => s.startsWith(partial))\n .map(s => `${command} ${s}`);\n \n callback(null, [hits.length ? hits : suggestions.map(s => `${command} ${s}`), line]);\n } else {\n // For commands with no arguments (like 'info', 'help', etc.), return empty\n callback(null, [[], line]);\n }\n return;\n }\n }\n \n // Fall back to original completer (this handles npm., git., etc.)\n if (originalCompleter) {\n originalCompleter.call(replServer, line, (err: Error | null, result?: [string[], string]) => {\n if (err || !result) {\n callback(null, [[], line]);\n return;\n }\n \n // Validate result format before passing it along\n if (!Array.isArray(result) || result.length !== 2) {\n callback(null, [[], line]);\n return;\n }\n \n const [completions, partial] = result;\n if (!Array.isArray(completions) || typeof partial !== 'string') {\n callback(null, [[], line]);\n return;\n }\n \n callback(null, [completions, partial]);\n });\n } else {\n callback(null, [[], line]);\n }\n } catch (error) {\n // Catch any unexpected errors to prevent crashing the REPL\n console.error('Autocomplete error:', error);\n callback(null, [[], line]);\n }\n };\n}\n\n/**\n * Setup command history\n */\nfunction setupHistory(replServer: repl.REPLServer) {\n const historyFile = path.join(os.homedir(), '.computesdk_workbench_history');\n \n replServer.setupHistory(historyFile, (err) => {\n if (err) {\n // Silent fail - history is nice-to-have\n }\n });\n}\n","/**\n * Workbench type definitions\n */\n\nimport type { Command } from '@computesdk/cmd';\n\n/**\n * Command execution result\n */\nexport interface CommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Provider status information\n */\nexport interface ProviderStatus {\n name: string;\n isComplete: boolean;\n present: string[];\n missing: string[];\n}\n\n/**\n * Type guard to check if value is a Command (string array)\n */\nexport function isCommand(value: unknown): value is Command {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n typeof value[0] === 'string'\n );\n}\n"],"mappings":"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","names":["compute","path","getComputeInstance","confirmSandboxSwitch","setSandbox","logSuccess","compute","sandbox","cmd"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/workbench",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "Interactive REPL for testing ComputeSDK sandbox operations",
|
|
5
5
|
"author": "Garrison",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,20 +45,20 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"dotenv": "^16.4.5",
|
|
47
47
|
"ws": "^8.18.0",
|
|
48
|
-
"@computesdk/cmd": "0.
|
|
49
|
-
"@computesdk/provider": "1.0.
|
|
50
|
-
"computesdk": "1.10.
|
|
48
|
+
"@computesdk/cmd": "0.4.0",
|
|
49
|
+
"@computesdk/provider": "1.0.4",
|
|
50
|
+
"computesdk": "1.10.3"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@computesdk/
|
|
54
|
-
"@computesdk/
|
|
55
|
-
"@computesdk/
|
|
56
|
-
"@computesdk/daytona": "1.6.
|
|
57
|
-
"@computesdk/e2b": "1.7.
|
|
58
|
-
"@computesdk/modal": "1.8.
|
|
59
|
-
"@computesdk/
|
|
60
|
-
"@computesdk/
|
|
61
|
-
"@computesdk/
|
|
53
|
+
"@computesdk/cloudflare": "1.3.10",
|
|
54
|
+
"@computesdk/blaxel": "1.3.10",
|
|
55
|
+
"@computesdk/codesandbox": "1.5.10",
|
|
56
|
+
"@computesdk/daytona": "1.6.10",
|
|
57
|
+
"@computesdk/e2b": "1.7.10",
|
|
58
|
+
"@computesdk/modal": "1.8.5",
|
|
59
|
+
"@computesdk/runloop": "1.3.10",
|
|
60
|
+
"@computesdk/vercel": "1.6.10",
|
|
61
|
+
"@computesdk/railway": "1.1.10"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
64
64
|
"@computesdk/e2b": {
|