@computesdk/workbench 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../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":["#!/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';\n\n// Load .env from current working directory\nconfig({ path: path.join(process.cwd(), '.env') });\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 /** Force gateway mode even if direct providers are available */\n forceGatewayMode: 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 forceGatewayMode: false,\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 <name>\" syntax (without parentheses)\n const providerMatch = trimmedCmd.match(/^provider\\s+(\\w+)$/);\n if (providerMatch) {\n const providerName = providerMatch[1];\n const providerCmd = `await provider('${providerName}')`;\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 const trimmed = line.trim();\n \n // Complete workbench command names\n if (!trimmed.includes(' ') && !trimmed.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, [contextHits, partial]: [string[], string]) => {\n if (err) {\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 const parts = trimmed.split(/\\s+/);\n if (parts.length === 2 && !trimmed.includes('.')) {\n const [command, partial] = parts;\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}`), trimmed]);\n return;\n }\n }\n \n // Fall back to original completer (this handles npm., git., etc.)\n if (originalCompleter) {\n originalCompleter.call(replServer, line, callback);\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 factory provider\n */\nexport async function createSandbox(state: WorkbenchState): Promise<void> {\n const providerName = state.currentProvider || autoDetectProvider(state.forceGatewayMode);\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 if (!isProviderReady(providerName)) {\n logError(`Provider ${providerName} is not fully configured.`);\n console.log(getProviderSetupHelp(providerName));\n throw new Error('Provider not ready');\n }\n \n const spinner = new Spinner(`Creating sandbox with ${providerName}...`).start();\n const startTime = Date.now();\n \n try {\n let compute;\n \n // Gateway uses zero-config mode, other providers use factory pattern\n if (providerName === 'gateway') {\n // Gateway mode: just use createCompute() with env auto-detection\n compute = createCompute();\n } else {\n // Load the provider package\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 }\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 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 */\nexport async function switchProvider(state: WorkbenchState, newProvider: string): Promise<void> {\n // Validate provider\n if (!isValidProvider(newProvider)) {\n logError(`Unknown provider: ${newProvider}`);\n console.log(`Available providers: e2b, railway, daytona, modal, runloop, vercel, cloudflare, codesandbox, blaxel`);\n return;\n }\n \n // Check if configured\n if (!isProviderReady(newProvider)) {\n logError(`Provider ${newProvider} is not fully configured.`);\n console.log(getProviderSetupHelp(newProvider));\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 = newProvider;\n logSuccess(`Switched to ${newProvider}`);\n } else {\n logWarning('Keeping current sandbox. Provider remains unchanged.');\n }\n } else {\n state.currentProvider = newProvider;\n logSuccess(`Switched to ${newProvider}`);\n }\n}\n\n/**\n * Create a provider command handler\n */\nexport function createProviderCommand(state: WorkbenchState) {\n return async function provider(name?: string) {\n if (!name) {\n // Show current provider\n if (state.currentProvider) {\n console.log(`\\nCurrent provider: ${c.green(state.currentProvider)}\\n`);\n } else {\n console.log(c.yellow('\\nNo provider selected\\n'));\n }\n return;\n }\n \n await switchProvider(state, name);\n };\n}\n\n/**\n * Toggle gateway mode on/off\n */\nexport async function toggleMode(state: WorkbenchState, mode?: 'gateway' | 'direct'): Promise<void> {\n const newMode = mode || (state.forceGatewayMode ? 'direct' : 'gateway');\n \n if (newMode === 'gateway') {\n state.forceGatewayMode = true;\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 not gateway, suggest restart\n if (hasSandbox(state) && state.currentProvider !== 'gateway') {\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 } else {\n state.forceGatewayMode = false;\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 gateway, suggest restart\n if (hasSandbox(state) && state.currentProvider === 'gateway') {\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 }\n}\n\n/**\n * Show current mode\n */\nexport function showMode(state: WorkbenchState): void {\n const mode = state.forceGatewayMode || state.currentProvider === 'gateway' ? 'gateway' : 'direct';\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(`\\nToggle with: ${c.cyan('mode gateway')} or ${c.cyan('mode 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) {\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 console.log(`Providers available: ${availableProviders.join(', ')}`);\n \n if (currentProvider) {\n const mode = currentProvider === 'gateway' ? '🌐 gateway mode' : 'šŸ”— direct mode';\n console.log(`Current provider: ${c.green(currentProvider)} (${mode})\\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 * Display help text\n */\nexport function showHelp() {\n console.log(`\n${c.bold('Workbench Commands:')}\n ${c.cyan('provider <name>')} Switch provider (gateway, e2b, railway, etc.)\n ${c.cyan('providers')} List all providers with status\n ${c.cyan('mode')} Show current mode (gateway vs direct)\n ${c.cyan('mode gateway')} Force gateway mode\n ${c.cyan('mode direct')} Force direct mode (auto-detect provider)\n ${c.cyan('restart')} Restart current sandbox\n ${c.cyan('destroy')} Destroy current sandbox \n ${c.cyan('info')} Show sandbox info\n ${c.cyan('env')} Show environment/credentials status\n ${c.cyan('verbose')} Toggle verbose output (show full results)\n ${c.cyan('help')} Show this help\n ${c.cyan('exit')} or ${c.cyan('.exit')} Exit workbench\n\n${c.bold('Provider Modes:')}\n ${c.cyan('gateway')} 🌐 Routes through ComputeSDK API (COMPUTESDK_API_KEY)\n ${c.cyan('e2b, railway, etc.')} šŸ”— Direct connection to provider (requires provider package)\n\n${c.bold('Running Commands:')}\n Just type any ${c.cyan('@computesdk/cmd')} function:\n ${c.dim('npm.install(\"express\")')}\n ${c.dim('git.clone(\"https://github.com/user/repo\")')}\n ${c.dim('python(\"script.py\")')}\n ${c.dim('mkdir(\"/app/src\")')}\n ${c.dim('ls(\"/home\")')}\n \n ${c.green('✨ Tab autocomplete works for all functions!')}\n\n${c.bold('Background Execution:')}\n Run commands in the background (returns immediately):\n ${c.dim('sh(\"sleep 10\", { background: true })')}\n ${c.dim('sh(\"npm start\", { background: true })')}\n\n${c.bold('Examples:')}\n ${c.dim('# Install a package')}\n ${c.cyan('npm.install(\"express\")')}\n \n ${c.dim('# Clone a repo')}\n ${c.cyan('git.clone(\"https://github.com/user/repo\")')}\n \n ${c.dim('# Run Python code')}\n ${c.cyan('python(\"-c\", \"print(\\'hello\\')\")')}\n \n ${c.dim('# Start a server in background')}\n ${c.cyan('sh(\"python -m http.server 8000\", { background: true })')}\n \n ${c.dim('# Switch providers')}\n ${c.cyan('provider railway')}\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 * 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 */\nexport function getProviderConfig(providerName: ProviderName): Record<string, string> {\n const config: Record<string, string> = {};\n const requiredVars = PROVIDER_ENV_VARS[providerName];\n \n for (const varName of requiredVars) {\n const value = process.env[varName];\n if (value) {\n config[varName] = value;\n }\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 state.currentProvider = autoDetectProvider();\n \n // Show welcome banner\n showWelcome(state.availableProviders, state.currentProvider);\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","cmd","path"]}
@@ -0,0 +1,42 @@
1
+ import * as cmd from '@computesdk/cmd';
2
+ import { createCompute, Provider } from 'computesdk';
3
+
4
+ /**
5
+ * Workbench helpers for use in TypeScript files
6
+ *
7
+ * Import these in your .ts files for full TypeScript autocomplete!
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { createWorkbenchSession } from '@computesdk/workbench/helpers';
12
+ *
13
+ * const session = await createWorkbenchSession('e2b');
14
+ *
15
+ * // Now you get full TypeScript autocomplete!
16
+ * await session.npm.install('express');
17
+ * await session.git.clone('https://github.com/user/repo');
18
+ * ```
19
+ */
20
+
21
+ interface WorkbenchSession {
22
+ sandbox: Awaited<ReturnType<ReturnType<typeof createCompute>['sandbox']['create']>>;
23
+ npm: typeof cmd.npm;
24
+ pnpm: typeof cmd.pnpm;
25
+ yarn: typeof cmd.yarn;
26
+ bun: typeof cmd.bun;
27
+ pip: typeof cmd.pip;
28
+ git: typeof cmd.git;
29
+ mkdir: typeof cmd.mkdir;
30
+ ls: typeof cmd.ls;
31
+ pwd: typeof cmd.pwd;
32
+ cat: typeof cmd.cat;
33
+ node: typeof cmd.node;
34
+ python: typeof cmd.python;
35
+ }
36
+ /**
37
+ * Create a workbench session for use in TypeScript files
38
+ * This gives you full TypeScript autocomplete!
39
+ */
40
+ declare function createWorkbenchSession(provider?: Provider): Promise<WorkbenchSession>;
41
+
42
+ export { type WorkbenchSession, createWorkbenchSession };
@@ -0,0 +1,26 @@
1
+ // src/helpers.ts
2
+ import * as cmd from "@computesdk/cmd";
3
+ import { createCompute } from "computesdk";
4
+ async function createWorkbenchSession(provider) {
5
+ const compute = provider ? createCompute({ defaultProvider: provider }) : createCompute();
6
+ const sandbox = await compute.sandbox.create();
7
+ return {
8
+ sandbox,
9
+ npm: cmd.npm,
10
+ pnpm: cmd.pnpm,
11
+ yarn: cmd.yarn,
12
+ bun: cmd.bun,
13
+ pip: cmd.pip,
14
+ git: cmd.git,
15
+ mkdir: cmd.mkdir,
16
+ ls: cmd.ls,
17
+ pwd: cmd.pwd,
18
+ cat: cmd.cat,
19
+ node: cmd.node,
20
+ python: cmd.python
21
+ };
22
+ }
23
+ export {
24
+ createWorkbenchSession
25
+ };
26
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers.ts"],"sourcesContent":["/**\n * Workbench helpers for use in TypeScript files\n * \n * Import these in your .ts files for full TypeScript autocomplete!\n * \n * @example\n * ```typescript\n * import { createWorkbenchSession } from '@computesdk/workbench/helpers';\n * \n * const session = await createWorkbenchSession('e2b');\n * \n * // Now you get full TypeScript autocomplete!\n * await session.npm.install('express');\n * await session.git.clone('https://github.com/user/repo');\n * ```\n */\n\nimport * as cmd from '@computesdk/cmd';\nimport { createCompute, type Provider } from 'computesdk';\n\nexport interface WorkbenchSession {\n sandbox: Awaited<ReturnType<ReturnType<typeof createCompute>['sandbox']['create']>>;\n // Re-export all cmd functions with the sandbox bound\n npm: typeof cmd.npm;\n pnpm: typeof cmd.pnpm;\n yarn: typeof cmd.yarn;\n bun: typeof cmd.bun;\n pip: typeof cmd.pip;\n git: typeof cmd.git;\n mkdir: typeof cmd.mkdir;\n ls: typeof cmd.ls;\n pwd: typeof cmd.pwd;\n cat: typeof cmd.cat;\n node: typeof cmd.node;\n python: typeof cmd.python;\n // ... add more as needed\n}\n\n/**\n * Create a workbench session for use in TypeScript files\n * This gives you full TypeScript autocomplete!\n */\nexport async function createWorkbenchSession(provider?: Provider): Promise<WorkbenchSession> {\n const compute = provider ? createCompute({ defaultProvider: provider }) : createCompute();\n const sandbox = await compute.sandbox.create();\n \n return {\n sandbox,\n npm: cmd.npm,\n pnpm: cmd.pnpm,\n yarn: cmd.yarn,\n bun: cmd.bun,\n pip: cmd.pip,\n git: cmd.git,\n mkdir: cmd.mkdir,\n ls: cmd.ls,\n pwd: cmd.pwd,\n cat: cmd.cat,\n node: cmd.node,\n python: cmd.python,\n };\n}\n"],"mappings":";AAiBA,YAAY,SAAS;AACrB,SAAS,qBAAoC;AAwB7C,eAAsB,uBAAuB,UAAgD;AAC3F,QAAM,UAAU,WAAW,cAAc,EAAE,iBAAiB,SAAS,CAAC,IAAI,cAAc;AACxF,QAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO;AAE7C,SAAO;AAAA,IACL;AAAA,IACA,KAAS;AAAA,IACT,MAAU;AAAA,IACV,MAAU;AAAA,IACV,KAAS;AAAA,IACT,KAAS;AAAA,IACT,KAAS;AAAA,IACT,OAAW;AAAA,IACX,IAAQ;AAAA,IACR,KAAS;AAAA,IACT,KAAS;AAAA,IACT,MAAU;AAAA,IACV,QAAY;AAAA,EACd;AACF;","names":[]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * ComputeSDK Workbench
3
+ *
4
+ * Interactive REPL for testing sandbox lifecycle operations
5
+ */
6
+ /**
7
+ * Start the workbench REPL
8
+ */
9
+ declare function startWorkbench(): Promise<void>;
10
+
11
+ export { startWorkbench };