@computesdk/workbench 1.0.0 → 1.0.2

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.
@@ -226,6 +226,18 @@ ${c.bold("Running Commands:")}
226
226
  ${c.cyan('cat("/etc/hosts")')}
227
227
  ${c.cyan('rm.rf("/tmp")')} ${c.dim("// Force remove")}
228
228
  ${c.cyan('rm.auto("/path")')} ${c.dim("// Smart remove")}
229
+
230
+ ${c.dim("Compute CLI:")}
231
+ ${c.cyan("compute.install()")} ${c.dim("// Install compute daemon")}
232
+ ${c.cyan("compute.start()")} ${c.dim("// Start daemon")}
233
+ ${c.cyan("compute.health()")} ${c.dim("// Check daemon health")}
234
+
235
+ ${c.bold("Shell Commands:")}
236
+ Use ${c.cyan("$")} prefix to run any shell command directly:
237
+ ${c.cyan("$ls -la /app")}
238
+ ${c.cyan("$npm install express")}
239
+ ${c.cyan("$git status")}
240
+ ${c.cyan("$compute --help")}
229
241
 
230
242
  ${c.bold("Background Execution:")}
231
243
  ${c.cyan('sh("npm start", { background: true })')}
@@ -508,7 +520,7 @@ async function createSandbox(state) {
508
520
  const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();
509
521
  const startTime = Date.now();
510
522
  try {
511
- let compute;
523
+ let compute2;
512
524
  if (useDirect) {
513
525
  const providerModule = await loadProvider(providerName);
514
526
  const providerFactory = providerModule[providerName];
@@ -516,7 +528,7 @@ async function createSandbox(state) {
516
528
  throw new Error(`Provider ${providerName} does not export a factory function`);
517
529
  }
518
530
  const config2 = getProviderConfig(providerName);
519
- compute = createCompute({
531
+ compute2 = createCompute({
520
532
  defaultProvider: providerFactory(config2)
521
533
  });
522
534
  } else {
@@ -553,11 +565,11 @@ async function createSandbox(state) {
553
565
  providerHeaders
554
566
  // Pass provider credentials via headers
555
567
  };
556
- compute = createCompute({
568
+ compute2 = createCompute({
557
569
  defaultProvider: gatewayFactory(config2)
558
570
  });
559
571
  }
560
- const result = await compute.sandbox.create();
572
+ const result = await compute2.sandbox.create();
561
573
  const duration = Date.now() - startTime;
562
574
  setSandbox(state, result, providerName);
563
575
  spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);
@@ -870,6 +882,7 @@ function injectCmdContext(replServer) {
870
882
  replServer.context.md5sum = cmd.md5sum;
871
883
  replServer.context.sha256sum = cmd.sha256sum;
872
884
  replServer.context.sha1sum = cmd.sha1sum;
885
+ replServer.context.compute = cmd.compute;
873
886
  replServer.context.cmd = cmd.cmd;
874
887
  replServer.context.shell = cmd.shell;
875
888
  replServer.context.sh = cmd.sh;
@@ -931,6 +944,17 @@ function setupSmartEvaluator(replServer, state) {
931
944
  originalEval.call(this, modeCmd, context, filename, callback);
932
945
  return;
933
946
  }
947
+ const dollarMatch = trimmedCmd.match(/^\$(.+)$/);
948
+ if (dollarMatch) {
949
+ const shellCmd = dollarMatch[1].trim();
950
+ if (!shellCmd) {
951
+ callback(new Error("Empty command after $"), void 0);
952
+ return;
953
+ }
954
+ const command = ["sh", "-c", shellCmd];
955
+ runCommand(state, command).then((output) => callback(null, output)).catch((error) => callback(error, void 0));
956
+ return;
957
+ }
934
958
  originalEval.call(this, cmd3, context, filename, async (err, result) => {
935
959
  if (err) {
936
960
  callback(err, void 0);
@@ -1035,10 +1059,14 @@ async function startWorkbench() {
1035
1059
  const state = createState();
1036
1060
  state.availableProviders = getAvailableProviders();
1037
1061
  const detectedProvider = autoDetectProvider();
1038
- if (detectedProvider === "gateway") {
1039
- const backendProviders = state.availableProviders.filter((p) => p !== "gateway");
1062
+ const hasGateway = state.availableProviders.includes("gateway");
1063
+ const backendProviders = state.availableProviders.filter((p) => p !== "gateway");
1064
+ if (hasGateway && backendProviders.length > 0) {
1040
1065
  state.currentProvider = backendProviders[0] || "e2b";
1041
1066
  state.useDirectMode = false;
1067
+ } else if (backendProviders.length > 0) {
1068
+ state.currentProvider = backendProviders[0];
1069
+ state.useDirectMode = true;
1042
1070
  } else {
1043
1071
  state.currentProvider = detectedProvider;
1044
1072
  state.useDirectMode = false;
@@ -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/bin/workbench.ts","../../src/cli/state.ts","../../src/cli/repl.ts","../../src/cli/commands.ts","../../src/cli/output.ts","../../src/cli/providers.ts","../../src/cli/types.ts","../../src/cli/index.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","#!/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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox, ProviderSandbox } from 'computesdk';\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\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 };\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}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\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 * 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, createProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose } 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: 'workbench> ',\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 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 // 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 = createProviderCommand(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.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\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']);\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 // 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 // Not a command, 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 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\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 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 callback(null, [allHits, partial]);\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 if (suggestions && 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 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 callback(null, result);\n });\n } else {\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 command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from 'computesdk';\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): 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 rl.question(`${question} (y/N): `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n resolve(trimmed === 'y' || trimmed === 'yes');\n });\n });\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 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 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 gateway with provider hint and credentials\n const gatewayModule = await import('computesdk');\n const gatewayFactory = gatewayModule.gateway;\n \n // Get provider-specific credentials to pass to gateway\n const providerConfig = getProviderConfig(providerName as ProviderName);\n \n // Map provider config to provider headers for gateway\n const providerHeaders: Record<string, string> = {};\n \n // Add provider-specific auth headers based on the provider\n switch (providerName) {\n case 'e2b':\n if (providerConfig.apiKey) providerHeaders['X-E2B-API-Key'] = providerConfig.apiKey;\n break;\n case 'railway':\n if (providerConfig.apiKey) providerHeaders['X-Railway-API-Key'] = providerConfig.apiKey;\n if (providerConfig.projectId) providerHeaders['X-Railway-Project-ID'] = providerConfig.projectId;\n if (providerConfig.environmentId) providerHeaders['X-Railway-Environment-ID'] = providerConfig.environmentId;\n break;\n case 'daytona':\n if (providerConfig.apiKey) providerHeaders['X-Daytona-API-Key'] = providerConfig.apiKey;\n break;\n case 'modal':\n if (providerConfig.tokenId) providerHeaders['X-Modal-Token-ID'] = providerConfig.tokenId;\n if (providerConfig.tokenSecret) providerHeaders['X-Modal-Token-Secret'] = providerConfig.tokenSecret;\n break;\n case 'vercel':\n if (providerConfig.token) providerHeaders['X-Vercel-Token'] = providerConfig.token;\n if (providerConfig.teamId) providerHeaders['X-Vercel-Team-ID'] = providerConfig.teamId;\n if (providerConfig.projectId) providerHeaders['X-Vercel-Project-ID'] = providerConfig.projectId;\n break;\n // Add other providers as needed\n }\n \n const config = {\n apiKey: process.env.COMPUTESDK_API_KEY!,\n provider: providerName, // Tell gateway which backend to use\n providerHeaders, // Pass provider credentials via headers\n };\n \n compute = createCompute({\n defaultProvider: gatewayFactory(config),\n });\n }\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 if (!hasSandbox(state)) {\n logWarning('No active sandbox');\n return;\n }\n \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 const result = await sandbox.runCommand(command[0], command.slice(1));\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 throw error;\n }\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 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 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 createProviderCommand(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 * 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 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 * 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 \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 console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\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('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:')}\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.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 factory pattern to dynamically import provider packages\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\n\n/**\n * Provider names supported by workbench\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Required environment variables for each provider\n */\nexport const PROVIDER_ENV_VARS: Record<ProviderName, string[]> = {\n gateway: ['COMPUTESDK_API_KEY'],\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...PROVIDER_ENV_VARS[provider]],\n };\n }\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n name: provider,\n isComplete: missing.length === 0,\n present: [...present],\n missing: [...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 * Maps environment variable names to provider-specific config keys\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n \n switch (providerName) {\n case 'e2b':\n if (process.env.E2B_API_KEY) config.apiKey = process.env.E2B_API_KEY;\n break;\n case 'railway':\n if (process.env.RAILWAY_API_KEY) config.apiKey = process.env.RAILWAY_API_KEY;\n if (process.env.RAILWAY_PROJECT_ID) config.projectId = process.env.RAILWAY_PROJECT_ID;\n if (process.env.RAILWAY_ENVIRONMENT_ID) config.environmentId = process.env.RAILWAY_ENVIRONMENT_ID;\n break;\n case 'daytona':\n if (process.env.DAYTONA_API_KEY) config.apiKey = process.env.DAYTONA_API_KEY;\n break;\n case 'modal':\n if (process.env.MODAL_TOKEN_ID) config.tokenId = process.env.MODAL_TOKEN_ID;\n if (process.env.MODAL_TOKEN_SECRET) config.tokenSecret = process.env.MODAL_TOKEN_SECRET;\n break;\n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) config.apiKey = process.env.RUNLOOP_API_KEY;\n break;\n case 'vercel':\n if (process.env.VERCEL_TOKEN) config.token = process.env.VERCEL_TOKEN;\n if (process.env.VERCEL_TEAM_ID) config.teamId = process.env.VERCEL_TEAM_ID;\n if (process.env.VERCEL_PROJECT_ID) config.projectId = process.env.VERCEL_PROJECT_ID;\n break;\n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) config.apiToken = process.env.CLOUDFLARE_API_TOKEN;\n if (process.env.CLOUDFLARE_ACCOUNT_ID) config.accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n break;\n case 'codesandbox':\n if (process.env.CSB_API_KEY) config.apiKey = process.env.CSB_API_KEY;\n break;\n case 'blaxel':\n if (process.env.BL_API_KEY) config.apiKey = process.env.BL_API_KEY;\n if (process.env.BL_WORKSPACE) config.workspace = process.env.BL_WORKSPACE;\n break;\n case 'gateway':\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n break;\n }\n \n return config;\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","/**\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 // Default to gateway mode with first available provider\n if (detectedProvider === 'gateway') {\n // Gateway is available, pick first backend provider\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Default to gateway mode\n } else {\n state.currentProvider = detectedProvider;\n state.useDirectMode = false; // Default to gateway mode\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"],"mappings":"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","names":["config","config","path","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/bin/workbench.ts","../../src/cli/state.ts","../../src/cli/repl.ts","../../src/cli/commands.ts","../../src/cli/output.ts","../../src/cli/providers.ts","../../src/cli/types.ts","../../src/cli/index.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","#!/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 * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox, ProviderSandbox } from 'computesdk';\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\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 };\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}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\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 * 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, createProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose } 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: 'workbench> ',\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 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 = createProviderCommand(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.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\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']);\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 // Not a command, 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 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\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 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 callback(null, [allHits, partial]);\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 if (suggestions && 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 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 callback(null, result);\n });\n } else {\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 command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from 'computesdk';\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): 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 rl.question(`${question} (y/N): `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n resolve(trimmed === 'y' || trimmed === 'yes');\n });\n });\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 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 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 gateway with provider hint and credentials\n const gatewayModule = await import('computesdk');\n const gatewayFactory = gatewayModule.gateway;\n \n // Get provider-specific credentials to pass to gateway\n const providerConfig = getProviderConfig(providerName as ProviderName);\n \n // Map provider config to provider headers for gateway\n const providerHeaders: Record<string, string> = {};\n \n // Add provider-specific auth headers based on the provider\n switch (providerName) {\n case 'e2b':\n if (providerConfig.apiKey) providerHeaders['X-E2B-API-Key'] = providerConfig.apiKey;\n break;\n case 'railway':\n if (providerConfig.apiKey) providerHeaders['X-Railway-API-Key'] = providerConfig.apiKey;\n if (providerConfig.projectId) providerHeaders['X-Railway-Project-ID'] = providerConfig.projectId;\n if (providerConfig.environmentId) providerHeaders['X-Railway-Environment-ID'] = providerConfig.environmentId;\n break;\n case 'daytona':\n if (providerConfig.apiKey) providerHeaders['X-Daytona-API-Key'] = providerConfig.apiKey;\n break;\n case 'modal':\n if (providerConfig.tokenId) providerHeaders['X-Modal-Token-ID'] = providerConfig.tokenId;\n if (providerConfig.tokenSecret) providerHeaders['X-Modal-Token-Secret'] = providerConfig.tokenSecret;\n break;\n case 'vercel':\n if (providerConfig.token) providerHeaders['X-Vercel-Token'] = providerConfig.token;\n if (providerConfig.teamId) providerHeaders['X-Vercel-Team-ID'] = providerConfig.teamId;\n if (providerConfig.projectId) providerHeaders['X-Vercel-Project-ID'] = providerConfig.projectId;\n break;\n // Add other providers as needed\n }\n \n const config = {\n apiKey: process.env.COMPUTESDK_API_KEY!,\n provider: providerName, // Tell gateway which backend to use\n providerHeaders, // Pass provider credentials via headers\n };\n \n compute = createCompute({\n defaultProvider: gatewayFactory(config),\n });\n }\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 if (!hasSandbox(state)) {\n logWarning('No active sandbox');\n return;\n }\n \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 const result = await sandbox.runCommand(command[0], command.slice(1));\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 throw error;\n }\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 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 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 createProviderCommand(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 * 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 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 * 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 \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 console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\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('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:')}\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('Compute CLI:')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute daemon')}\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 factory pattern to dynamically import provider packages\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\n\n/**\n * Provider names supported by workbench\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Required environment variables for each provider\n */\nexport const PROVIDER_ENV_VARS: Record<ProviderName, string[]> = {\n gateway: ['COMPUTESDK_API_KEY'],\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...PROVIDER_ENV_VARS[provider]],\n };\n }\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n name: provider,\n isComplete: missing.length === 0,\n present: [...present],\n missing: [...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 * Maps environment variable names to provider-specific config keys\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n \n switch (providerName) {\n case 'e2b':\n if (process.env.E2B_API_KEY) config.apiKey = process.env.E2B_API_KEY;\n break;\n case 'railway':\n if (process.env.RAILWAY_API_KEY) config.apiKey = process.env.RAILWAY_API_KEY;\n if (process.env.RAILWAY_PROJECT_ID) config.projectId = process.env.RAILWAY_PROJECT_ID;\n if (process.env.RAILWAY_ENVIRONMENT_ID) config.environmentId = process.env.RAILWAY_ENVIRONMENT_ID;\n break;\n case 'daytona':\n if (process.env.DAYTONA_API_KEY) config.apiKey = process.env.DAYTONA_API_KEY;\n break;\n case 'modal':\n if (process.env.MODAL_TOKEN_ID) config.tokenId = process.env.MODAL_TOKEN_ID;\n if (process.env.MODAL_TOKEN_SECRET) config.tokenSecret = process.env.MODAL_TOKEN_SECRET;\n break;\n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) config.apiKey = process.env.RUNLOOP_API_KEY;\n break;\n case 'vercel':\n if (process.env.VERCEL_TOKEN) config.token = process.env.VERCEL_TOKEN;\n if (process.env.VERCEL_TEAM_ID) config.teamId = process.env.VERCEL_TEAM_ID;\n if (process.env.VERCEL_PROJECT_ID) config.projectId = process.env.VERCEL_PROJECT_ID;\n break;\n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) config.apiToken = process.env.CLOUDFLARE_API_TOKEN;\n if (process.env.CLOUDFLARE_ACCOUNT_ID) config.accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n break;\n case 'codesandbox':\n if (process.env.CSB_API_KEY) config.apiKey = process.env.CSB_API_KEY;\n break;\n case 'blaxel':\n if (process.env.BL_API_KEY) config.apiKey = process.env.BL_API_KEY;\n if (process.env.BL_WORKSPACE) config.workspace = process.env.BL_WORKSPACE;\n break;\n case 'gateway':\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n break;\n }\n \n return config;\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","/**\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"],"mappings":"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","names":["config","compute","config","path","cmd","path"]}
package/dist/index.js CHANGED
@@ -214,6 +214,18 @@ ${c.bold("Running Commands:")}
214
214
  ${c.cyan('cat("/etc/hosts")')}
215
215
  ${c.cyan('rm.rf("/tmp")')} ${c.dim("// Force remove")}
216
216
  ${c.cyan('rm.auto("/path")')} ${c.dim("// Smart remove")}
217
+
218
+ ${c.dim("Compute CLI:")}
219
+ ${c.cyan("compute.install()")} ${c.dim("// Install compute daemon")}
220
+ ${c.cyan("compute.start()")} ${c.dim("// Start daemon")}
221
+ ${c.cyan("compute.health()")} ${c.dim("// Check daemon health")}
222
+
223
+ ${c.bold("Shell Commands:")}
224
+ Use ${c.cyan("$")} prefix to run any shell command directly:
225
+ ${c.cyan("$ls -la /app")}
226
+ ${c.cyan("$npm install express")}
227
+ ${c.cyan("$git status")}
228
+ ${c.cyan("$compute --help")}
217
229
 
218
230
  ${c.bold("Background Execution:")}
219
231
  ${c.cyan('sh("npm start", { background: true })')}
@@ -496,7 +508,7 @@ async function createSandbox(state) {
496
508
  const spinner = new Spinner(`Creating sandbox with ${modeLabel}...`).start();
497
509
  const startTime = Date.now();
498
510
  try {
499
- let compute;
511
+ let compute2;
500
512
  if (useDirect) {
501
513
  const providerModule = await loadProvider(providerName);
502
514
  const providerFactory = providerModule[providerName];
@@ -504,7 +516,7 @@ async function createSandbox(state) {
504
516
  throw new Error(`Provider ${providerName} does not export a factory function`);
505
517
  }
506
518
  const config = getProviderConfig(providerName);
507
- compute = createCompute({
519
+ compute2 = createCompute({
508
520
  defaultProvider: providerFactory(config)
509
521
  });
510
522
  } else {
@@ -541,11 +553,11 @@ async function createSandbox(state) {
541
553
  providerHeaders
542
554
  // Pass provider credentials via headers
543
555
  };
544
- compute = createCompute({
556
+ compute2 = createCompute({
545
557
  defaultProvider: gatewayFactory(config)
546
558
  });
547
559
  }
548
- const result = await compute.sandbox.create();
560
+ const result = await compute2.sandbox.create();
549
561
  const duration = Date.now() - startTime;
550
562
  setSandbox(state, result, providerName);
551
563
  spinner.succeed(`Sandbox ready ${c.dim(`(${formatDuration(duration)})`)}`);
@@ -858,6 +870,7 @@ function injectCmdContext(replServer) {
858
870
  replServer.context.md5sum = cmd.md5sum;
859
871
  replServer.context.sha256sum = cmd.sha256sum;
860
872
  replServer.context.sha1sum = cmd.sha1sum;
873
+ replServer.context.compute = cmd.compute;
861
874
  replServer.context.cmd = cmd.cmd;
862
875
  replServer.context.shell = cmd.shell;
863
876
  replServer.context.sh = cmd.sh;
@@ -919,6 +932,17 @@ function setupSmartEvaluator(replServer, state) {
919
932
  originalEval.call(this, modeCmd, context, filename, callback);
920
933
  return;
921
934
  }
935
+ const dollarMatch = trimmedCmd.match(/^\$(.+)$/);
936
+ if (dollarMatch) {
937
+ const shellCmd = dollarMatch[1].trim();
938
+ if (!shellCmd) {
939
+ callback(new Error("Empty command after $"), void 0);
940
+ return;
941
+ }
942
+ const command = ["sh", "-c", shellCmd];
943
+ runCommand(state, command).then((output) => callback(null, output)).catch((error) => callback(error, void 0));
944
+ return;
945
+ }
922
946
  originalEval.call(this, cmd3, context, filename, async (err, result) => {
923
947
  if (err) {
924
948
  callback(err, void 0);
@@ -1023,10 +1047,14 @@ async function startWorkbench() {
1023
1047
  const state = createState();
1024
1048
  state.availableProviders = getAvailableProviders();
1025
1049
  const detectedProvider = autoDetectProvider();
1026
- if (detectedProvider === "gateway") {
1027
- const backendProviders = state.availableProviders.filter((p) => p !== "gateway");
1050
+ const hasGateway = state.availableProviders.includes("gateway");
1051
+ const backendProviders = state.availableProviders.filter((p) => p !== "gateway");
1052
+ if (hasGateway && backendProviders.length > 0) {
1028
1053
  state.currentProvider = backendProviders[0] || "e2b";
1029
1054
  state.useDirectMode = false;
1055
+ } else if (backendProviders.length > 0) {
1056
+ state.currentProvider = backendProviders[0];
1057
+ state.useDirectMode = true;
1030
1058
  } else {
1031
1059
  state.currentProvider = detectedProvider;
1032
1060
  state.useDirectMode = false;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/state.ts","../src/cli/repl.ts","../src/cli/commands.ts","../src/cli/output.ts","../src/cli/providers.ts","../src/cli/types.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox, ProviderSandbox } from 'computesdk';\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\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 };\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}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\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 * 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, createProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose } 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: 'workbench> ',\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 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 // 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 = createProviderCommand(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.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\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']);\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 // 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 // Not a command, 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 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\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 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 callback(null, [allHits, partial]);\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 if (suggestions && 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 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 callback(null, result);\n });\n } else {\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 command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from 'computesdk';\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): 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 rl.question(`${question} (y/N): `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n resolve(trimmed === 'y' || trimmed === 'yes');\n });\n });\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 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 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 gateway with provider hint and credentials\n const gatewayModule = await import('computesdk');\n const gatewayFactory = gatewayModule.gateway;\n \n // Get provider-specific credentials to pass to gateway\n const providerConfig = getProviderConfig(providerName as ProviderName);\n \n // Map provider config to provider headers for gateway\n const providerHeaders: Record<string, string> = {};\n \n // Add provider-specific auth headers based on the provider\n switch (providerName) {\n case 'e2b':\n if (providerConfig.apiKey) providerHeaders['X-E2B-API-Key'] = providerConfig.apiKey;\n break;\n case 'railway':\n if (providerConfig.apiKey) providerHeaders['X-Railway-API-Key'] = providerConfig.apiKey;\n if (providerConfig.projectId) providerHeaders['X-Railway-Project-ID'] = providerConfig.projectId;\n if (providerConfig.environmentId) providerHeaders['X-Railway-Environment-ID'] = providerConfig.environmentId;\n break;\n case 'daytona':\n if (providerConfig.apiKey) providerHeaders['X-Daytona-API-Key'] = providerConfig.apiKey;\n break;\n case 'modal':\n if (providerConfig.tokenId) providerHeaders['X-Modal-Token-ID'] = providerConfig.tokenId;\n if (providerConfig.tokenSecret) providerHeaders['X-Modal-Token-Secret'] = providerConfig.tokenSecret;\n break;\n case 'vercel':\n if (providerConfig.token) providerHeaders['X-Vercel-Token'] = providerConfig.token;\n if (providerConfig.teamId) providerHeaders['X-Vercel-Team-ID'] = providerConfig.teamId;\n if (providerConfig.projectId) providerHeaders['X-Vercel-Project-ID'] = providerConfig.projectId;\n break;\n // Add other providers as needed\n }\n \n const config = {\n apiKey: process.env.COMPUTESDK_API_KEY!,\n provider: providerName, // Tell gateway which backend to use\n providerHeaders, // Pass provider credentials via headers\n };\n \n compute = createCompute({\n defaultProvider: gatewayFactory(config),\n });\n }\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 if (!hasSandbox(state)) {\n logWarning('No active sandbox');\n return;\n }\n \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 const result = await sandbox.runCommand(command[0], command.slice(1));\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 throw error;\n }\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 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 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 createProviderCommand(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 * 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 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 * 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 \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 console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\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('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:')}\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.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 factory pattern to dynamically import provider packages\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\n\n/**\n * Provider names supported by workbench\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Required environment variables for each provider\n */\nexport const PROVIDER_ENV_VARS: Record<ProviderName, string[]> = {\n gateway: ['COMPUTESDK_API_KEY'],\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...PROVIDER_ENV_VARS[provider]],\n };\n }\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n name: provider,\n isComplete: missing.length === 0,\n present: [...present],\n missing: [...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 * Maps environment variable names to provider-specific config keys\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n \n switch (providerName) {\n case 'e2b':\n if (process.env.E2B_API_KEY) config.apiKey = process.env.E2B_API_KEY;\n break;\n case 'railway':\n if (process.env.RAILWAY_API_KEY) config.apiKey = process.env.RAILWAY_API_KEY;\n if (process.env.RAILWAY_PROJECT_ID) config.projectId = process.env.RAILWAY_PROJECT_ID;\n if (process.env.RAILWAY_ENVIRONMENT_ID) config.environmentId = process.env.RAILWAY_ENVIRONMENT_ID;\n break;\n case 'daytona':\n if (process.env.DAYTONA_API_KEY) config.apiKey = process.env.DAYTONA_API_KEY;\n break;\n case 'modal':\n if (process.env.MODAL_TOKEN_ID) config.tokenId = process.env.MODAL_TOKEN_ID;\n if (process.env.MODAL_TOKEN_SECRET) config.tokenSecret = process.env.MODAL_TOKEN_SECRET;\n break;\n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) config.apiKey = process.env.RUNLOOP_API_KEY;\n break;\n case 'vercel':\n if (process.env.VERCEL_TOKEN) config.token = process.env.VERCEL_TOKEN;\n if (process.env.VERCEL_TEAM_ID) config.teamId = process.env.VERCEL_TEAM_ID;\n if (process.env.VERCEL_PROJECT_ID) config.projectId = process.env.VERCEL_PROJECT_ID;\n break;\n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) config.apiToken = process.env.CLOUDFLARE_API_TOKEN;\n if (process.env.CLOUDFLARE_ACCOUNT_ID) config.accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n break;\n case 'codesandbox':\n if (process.env.CSB_API_KEY) config.apiKey = process.env.CSB_API_KEY;\n break;\n case 'blaxel':\n if (process.env.BL_API_KEY) config.apiKey = process.env.BL_API_KEY;\n if (process.env.BL_WORKSPACE) config.workspace = process.env.BL_WORKSPACE;\n break;\n case 'gateway':\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n break;\n }\n \n return config;\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","/**\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 // Default to gateway mode with first available provider\n if (detectedProvider === 'gateway') {\n // Gateway is available, pick first backend provider\n const backendProviders = state.availableProviders.filter(p => p !== 'gateway');\n state.currentProvider = backendProviders[0] || 'e2b';\n state.useDirectMode = false; // Default to gateway mode\n } else {\n state.currentProvider = detectedProvider;\n state.useDirectMode = false; // Default to gateway mode\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"],"mappings":"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","names":["cmd"]}
1
+ {"version":3,"sources":["../src/cli/state.ts","../src/cli/repl.ts","../src/cli/commands.ts","../src/cli/output.ts","../src/cli/providers.ts","../src/cli/types.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * Workbench State Management\n *\n * Tracks current sandbox and provider state in-memory (no persistence)\n */\n\nimport type { Sandbox, ProviderSandbox } from 'computesdk';\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\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 };\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}\n\n/**\n * Clear current sandbox\n */\nexport function clearSandbox(state: WorkbenchState) {\n state.currentSandbox = null;\n state.sandboxCreatedAt = null;\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 * 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, createProviderCommand, restartSandbox, destroySandbox, toggleMode, showMode, toggleVerbose, showVerbose } 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: 'workbench> ',\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 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 = createProviderCommand(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.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\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']);\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 // Not a command, 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 'info': [],\n 'env': [],\n 'help': [],\n 'verbose': [],\n 'exit': [],\n '.exit': [],\n };\n \n (replServer as any).completer = function (line: string, callback: (err: Error | null, result: [string[], string]) => void) {\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 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 callback(null, [allHits, partial]);\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 if (suggestions && 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 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 callback(null, result);\n });\n } else {\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 command handlers\n * \n * Core operations using factory providers directly\n */\n\nimport { createCompute } from 'computesdk';\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): 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 rl.question(`${question} (y/N): `, (answer) => {\n rl.close();\n // Trim the answer to handle any extra characters\n const trimmed = answer.trim().toLowerCase();\n resolve(trimmed === 'y' || trimmed === 'yes');\n });\n });\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 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 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 gateway with provider hint and credentials\n const gatewayModule = await import('computesdk');\n const gatewayFactory = gatewayModule.gateway;\n \n // Get provider-specific credentials to pass to gateway\n const providerConfig = getProviderConfig(providerName as ProviderName);\n \n // Map provider config to provider headers for gateway\n const providerHeaders: Record<string, string> = {};\n \n // Add provider-specific auth headers based on the provider\n switch (providerName) {\n case 'e2b':\n if (providerConfig.apiKey) providerHeaders['X-E2B-API-Key'] = providerConfig.apiKey;\n break;\n case 'railway':\n if (providerConfig.apiKey) providerHeaders['X-Railway-API-Key'] = providerConfig.apiKey;\n if (providerConfig.projectId) providerHeaders['X-Railway-Project-ID'] = providerConfig.projectId;\n if (providerConfig.environmentId) providerHeaders['X-Railway-Environment-ID'] = providerConfig.environmentId;\n break;\n case 'daytona':\n if (providerConfig.apiKey) providerHeaders['X-Daytona-API-Key'] = providerConfig.apiKey;\n break;\n case 'modal':\n if (providerConfig.tokenId) providerHeaders['X-Modal-Token-ID'] = providerConfig.tokenId;\n if (providerConfig.tokenSecret) providerHeaders['X-Modal-Token-Secret'] = providerConfig.tokenSecret;\n break;\n case 'vercel':\n if (providerConfig.token) providerHeaders['X-Vercel-Token'] = providerConfig.token;\n if (providerConfig.teamId) providerHeaders['X-Vercel-Team-ID'] = providerConfig.teamId;\n if (providerConfig.projectId) providerHeaders['X-Vercel-Project-ID'] = providerConfig.projectId;\n break;\n // Add other providers as needed\n }\n \n const config = {\n apiKey: process.env.COMPUTESDK_API_KEY!,\n provider: providerName, // Tell gateway which backend to use\n providerHeaders, // Pass provider credentials via headers\n };\n \n compute = createCompute({\n defaultProvider: gatewayFactory(config),\n });\n }\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 if (!hasSandbox(state)) {\n logWarning('No active sandbox');\n return;\n }\n \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 const result = await sandbox.runCommand(command[0], command.slice(1));\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 throw error;\n }\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 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 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 createProviderCommand(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 * 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 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 * 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 \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 console.log(` Provider: ${c.green(state.currentProvider || 'unknown')}`);\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('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:')}\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('Compute CLI:')}\n ${c.cyan('compute.install()')} ${c.dim('// Install compute daemon')}\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 factory pattern to dynamically import provider packages\n */\n\nimport type { ProviderStatus } from './types.js';\nimport { c } from './output.js';\n\n/**\n * Provider names supported by workbench\n */\nexport const PROVIDER_NAMES = [\n 'gateway',\n 'e2b',\n 'railway',\n 'daytona',\n 'modal',\n 'runloop',\n 'vercel',\n 'cloudflare',\n 'codesandbox',\n 'blaxel',\n] as const;\n\nexport type ProviderName = typeof PROVIDER_NAMES[number];\n\n/**\n * Required environment variables for each provider\n */\nexport const PROVIDER_ENV_VARS: Record<ProviderName, string[]> = {\n gateway: ['COMPUTESDK_API_KEY'],\n e2b: ['E2B_API_KEY'],\n railway: ['RAILWAY_API_KEY', 'RAILWAY_PROJECT_ID', 'RAILWAY_ENVIRONMENT_ID'],\n daytona: ['DAYTONA_API_KEY'],\n modal: ['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET'],\n runloop: ['RUNLOOP_API_KEY'],\n vercel: ['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'],\n cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID'],\n codesandbox: ['CSB_API_KEY'],\n blaxel: ['BL_API_KEY', 'BL_WORKSPACE'],\n};\n\n/**\n * Get detailed status for a specific provider\n */\nexport function getProviderStatus(provider: ProviderName): ProviderStatus {\n if (typeof process === 'undefined') {\n return {\n name: provider,\n isComplete: false,\n present: [],\n missing: [...PROVIDER_ENV_VARS[provider]],\n };\n }\n \n const requiredVars = PROVIDER_ENV_VARS[provider];\n const present = requiredVars.filter(varName => !!process.env?.[varName]);\n const missing = requiredVars.filter(varName => !process.env?.[varName]);\n \n return {\n name: provider,\n isComplete: missing.length === 0,\n present: [...present],\n missing: [...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 * Maps environment variable names to provider-specific config keys\n */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n \n switch (providerName) {\n case 'e2b':\n if (process.env.E2B_API_KEY) config.apiKey = process.env.E2B_API_KEY;\n break;\n case 'railway':\n if (process.env.RAILWAY_API_KEY) config.apiKey = process.env.RAILWAY_API_KEY;\n if (process.env.RAILWAY_PROJECT_ID) config.projectId = process.env.RAILWAY_PROJECT_ID;\n if (process.env.RAILWAY_ENVIRONMENT_ID) config.environmentId = process.env.RAILWAY_ENVIRONMENT_ID;\n break;\n case 'daytona':\n if (process.env.DAYTONA_API_KEY) config.apiKey = process.env.DAYTONA_API_KEY;\n break;\n case 'modal':\n if (process.env.MODAL_TOKEN_ID) config.tokenId = process.env.MODAL_TOKEN_ID;\n if (process.env.MODAL_TOKEN_SECRET) config.tokenSecret = process.env.MODAL_TOKEN_SECRET;\n break;\n case 'runloop':\n if (process.env.RUNLOOP_API_KEY) config.apiKey = process.env.RUNLOOP_API_KEY;\n break;\n case 'vercel':\n if (process.env.VERCEL_TOKEN) config.token = process.env.VERCEL_TOKEN;\n if (process.env.VERCEL_TEAM_ID) config.teamId = process.env.VERCEL_TEAM_ID;\n if (process.env.VERCEL_PROJECT_ID) config.projectId = process.env.VERCEL_PROJECT_ID;\n break;\n case 'cloudflare':\n if (process.env.CLOUDFLARE_API_TOKEN) config.apiToken = process.env.CLOUDFLARE_API_TOKEN;\n if (process.env.CLOUDFLARE_ACCOUNT_ID) config.accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n break;\n case 'codesandbox':\n if (process.env.CSB_API_KEY) config.apiKey = process.env.CSB_API_KEY;\n break;\n case 'blaxel':\n if (process.env.BL_API_KEY) config.apiKey = process.env.BL_API_KEY;\n if (process.env.BL_WORKSPACE) config.workspace = process.env.BL_WORKSPACE;\n break;\n case 'gateway':\n if (process.env.COMPUTESDK_API_KEY) config.apiKey = process.env.COMPUTESDK_API_KEY;\n break;\n }\n \n return config;\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","/**\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"],"mappings":"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","names":["compute","cmd"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/workbench",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Interactive REPL for testing ComputeSDK sandbox operations",
5
5
  "author": "Garrison",
6
6
  "license": "MIT",
@@ -45,18 +45,18 @@
45
45
  "dependencies": {
46
46
  "dotenv": "^16.4.5",
47
47
  "@computesdk/cmd": "0.2.0",
48
- "computesdk": "1.9.0"
48
+ "computesdk": "1.9.3"
49
49
  },
50
50
  "peerDependencies": {
51
- "@computesdk/blaxel": "1.3.0",
52
- "@computesdk/cloudflare": "1.3.0",
53
- "@computesdk/codesandbox": "1.5.0",
54
- "@computesdk/daytona": "1.6.0",
55
- "@computesdk/modal": "1.6.0",
56
- "@computesdk/e2b": "1.7.0",
57
- "@computesdk/railway": "1.1.0",
58
- "@computesdk/runloop": "1.3.0",
59
- "@computesdk/vercel": "1.6.0"
51
+ "@computesdk/blaxel": "1.3.2",
52
+ "@computesdk/codesandbox": "1.5.2",
53
+ "@computesdk/cloudflare": "1.3.2",
54
+ "@computesdk/daytona": "1.6.2",
55
+ "@computesdk/e2b": "1.7.2",
56
+ "@computesdk/modal": "1.6.2",
57
+ "@computesdk/railway": "1.1.2",
58
+ "@computesdk/runloop": "1.3.2",
59
+ "@computesdk/vercel": "1.6.2"
60
60
  },
61
61
  "peerDependenciesMeta": {
62
62
  "@computesdk/e2b": {