@computesdk/cli 1.0.11 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +211 -71
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.20.3_typescript@5.8.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../src/repl.ts","../src/workspace-cli.ts","../src/index.ts","../src/providers.ts","../src/actions.ts","../src/actions-client.ts","../src/auth.ts","../src/setup.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * REPL Mode - Run commands one at a time\n *\n * Shell-like interface where each line is executed as a command.\n * Special commands prefixed with /.\n */\n\nimport * as readline from 'readline';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport pc from 'picocolors';\nimport { compute, type SandboxInterface } from 'computesdk';\n\ntype SessionResult = 'exit';\n\ninterface ReplContext {\n sandboxes: Map<string, SandboxInterface>;\n activeSandboxId: string;\n}\n\n/**\n * Start REPL mode.\n */\nexport async function startREPL(sandbox: SandboxInterface, provider: string): Promise<void> {\n // Mark provider as used - reserved for future provider-specific REPL behavior\n void provider;\n const ctx: ReplContext = {\n sandboxes: new Map([[sandbox.sandboxId, sandbox]]),\n activeSandboxId: sandbox.sandboxId,\n };\n\n await runSession(ctx);\n}\n\nfunction buildPrompt(sandboxId: string): string {\n if (!sandboxId) return pc.gray('[no sandbox] ') + pc.bold('$ ');\n return pc.cyan(`[${sandboxId}] `) + pc.bold('$ ');\n}\n\n/**\n * Run a single REPL session.\n *\n * Creates a readline interface, processes commands, and returns\n * 'exit' when the user wants to quit.\n */\nfunction runSession(ctx: ReplContext): Promise<SessionResult> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: buildPrompt(ctx.activeSandboxId),\n terminal: true,\n historySize: 1000,\n });\n\n // Load history\n loadHistory(rl);\n\n return new Promise<SessionResult>((resolve) => {\n let resolved = false;\n const done = (result: SessionResult) => {\n if (resolved) return;\n resolved = true;\n rl.close();\n resolve(result);\n };\n\n rl.on('SIGINT', () => {\n console.log();\n rl.prompt();\n });\n\n rl.on('close', () => {\n done('exit');\n });\n\n rl.on('line', async (line: string) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === '.exit') {\n done('exit');\n return;\n }\n\n // Save to history\n saveToHistory(trimmed);\n\n try {\n if (trimmed.startsWith('/')) {\n const result = await handleSpecialCommand(ctx, trimmed, rl);\n if (result === 'exit') {\n done(result);\n return;\n }\n } else if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n } else {\n const sandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n await executeCommand(sandbox, trimmed);\n }\n } catch (error) {\n console.log(pc.red(`✗ ${(error as Error).message}`));\n }\n\n if (!resolved) {\n rl.prompt();\n }\n });\n\n rl.prompt();\n });\n}\n\n/**\n * Execute a shell command in the sandbox\n */\nasync function executeCommand(sandbox: SandboxInterface, command: string): Promise<void> {\n const result = await sandbox.runCommand(command);\n\n // Print stdout\n if (result.stdout) {\n process.stdout.write(result.stdout);\n if (!result.stdout.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Print stderr in red\n if (result.stderr) {\n process.stderr.write(pc.red(result.stderr));\n if (!result.stderr.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Show exit code if non-zero\n if (result.exitCode !== 0) {\n console.log(pc.gray(`exit code: ${result.exitCode}`));\n }\n}\n\n/**\n * Handle special commands (prefixed with /)\n * Returns 'exit' to quit, or null to continue\n */\nasync function handleSpecialCommand(\n ctx: ReplContext,\n input: string,\n rl: readline.Interface,\n): Promise<SessionResult | null> {\n const [cmd, ...args] = input.slice(1).split(/\\s+/);\n\n switch (cmd.toLowerCase()) {\n case 'help':\n case 'h':\n case '?':\n showHelp();\n return null;\n\n case 'info':\n case 'i': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n console.log();\n console.log(pc.bold(' Sandbox Info'));\n console.log(` ID: ${pc.cyan(activeSandbox.sandboxId)}`);\n console.log();\n return null;\n }\n\n case 'url':\n case 'u': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n if (args.length === 0) {\n console.log(pc.gray('Usage: /url <port>'));\n } else {\n const port = parseInt(args[0], 10);\n if (isNaN(port)) {\n console.log(pc.red('Invalid port number'));\n } else {\n const url = await activeSandbox.getUrl({ port });\n console.log(pc.cyan(url));\n }\n }\n return null;\n }\n\n case 'new': {\n console.log(pc.gray(' Creating new sandbox...'));\n const newSandbox = await compute.sandbox.create();\n ctx.sandboxes.set(newSandbox.sandboxId, newSandbox);\n ctx.activeSandboxId = newSandbox.sandboxId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Sandbox ready: ${pc.cyan(newSandbox.sandboxId)}`);\n console.log(` ${pc.gray(`Active sandboxes: ${ctx.sandboxes.size}`)}`);\n return null;\n }\n\n case 'destroy': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /destroy <sandbox-id> or /destroy --all'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n if (args[0] === '--all') {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow(' No sandboxes to destroy.'));\n return null;\n }\n const count = ctx.sandboxes.size;\n console.log(pc.gray(` Destroying ${count} sandbox${count > 1 ? 'es' : ''}...`));\n await Promise.all(\n Array.from(ctx.sandboxes.values()).map(s => s.destroy()),\n );\n ctx.sandboxes.clear();\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Destroyed ${pc.cyan(String(count))} sandbox${count > 1 ? 'es' : ''}`);\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n return null;\n }\n const targetId = args[0];\n const target = ctx.sandboxes.get(targetId);\n if (!target) {\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(targetId));\n if (matches.length === 1) {\n return destroySandbox(ctx, matches[0], rl);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${targetId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n return destroySandbox(ctx, targetId, rl);\n }\n\n case 'list':\n case 'ls': {\n console.log();\n console.log(pc.bold(' Sandboxes'));\n for (const id of ctx.sandboxes.keys()) {\n const marker = id === ctx.activeSandboxId ? pc.green(' ●') : ' ';\n console.log(` ${marker} ${pc.cyan(id)}`);\n }\n console.log();\n return null;\n }\n\n case 'switch':\n case 'sw': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /switch <sandbox-id>'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n const switchId = args[0];\n if (ctx.sandboxes.has(switchId)) {\n ctx.activeSandboxId = switchId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(switchId)}`);\n return null;\n }\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(switchId));\n if (matches.length === 1) {\n ctx.activeSandboxId = matches[0];\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(matches[0])}`);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${switchId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n\n case 'exit':\n case 'quit':\n case 'q':\n return 'exit';\n\n default:\n console.log(pc.yellow(`Unknown command: /${cmd}`));\n console.log(pc.gray('Type /help for available commands'));\n return null;\n }\n}\n\n/**\n * Destroy a sandbox by ID and update context\n */\nasync function destroySandbox(\n ctx: ReplContext,\n sandboxId: string,\n rl: readline.Interface,\n): Promise<null> {\n const target = ctx.sandboxes.get(sandboxId)!;\n console.log(pc.gray(` Destroying ${sandboxId}...`));\n await target.destroy();\n ctx.sandboxes.delete(sandboxId);\n console.log(` Destroyed ${pc.cyan(sandboxId)}`);\n\n // If we destroyed the active sandbox, switch to another\n if (ctx.activeSandboxId === sandboxId && ctx.sandboxes.size > 0) {\n ctx.activeSandboxId = ctx.sandboxes.keys().next().value!;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(ctx.activeSandboxId)}`);\n } else if (ctx.sandboxes.size === 0) {\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n }\n\n return null;\n}\n\n/**\n * Show help message\n */\nfunction showHelp(): void {\n console.log();\n console.log(pc.bold(' Shell Mode'));\n console.log(pc.gray(' Just type commands - they run in the active sandbox'));\n console.log();\n console.log(pc.white(' ls -la'));\n console.log(pc.white(' cat /etc/os-release'));\n console.log(pc.white(' npm install lodash'));\n console.log();\n console.log(pc.bold(' Sandbox Commands') + pc.gray(' (prefix with /)'));\n console.log();\n console.log(pc.cyan(' /new') + pc.gray(' Create a new sandbox and switch to it'));\n console.log(pc.cyan(' /list') + pc.gray(' List all sandboxes'));\n console.log(pc.cyan(' /switch <id>') + pc.gray(' Switch active sandbox'));\n console.log(pc.cyan(' /destroy <id>') + pc.gray(' Destroy a sandbox by ID'));\n console.log(pc.cyan(' /destroy --all') + pc.gray(' Destroy all sandboxes'));\n console.log();\n console.log(pc.bold(' Other Commands'));\n console.log();\n console.log(pc.cyan(' /info') + pc.gray(' Show active sandbox info'));\n console.log(pc.cyan(' /url <port>') + pc.gray(' Get public URL for port'));\n console.log(pc.cyan(' /help') + pc.gray(' Show this help'));\n console.log(pc.cyan(' /exit') + pc.gray(' Exit the REPL'));\n console.log();\n}\n\n// History file path\nconst HISTORY_FILE = path.join(os.homedir(), '.create_compute_history');\n\n/**\n * Load history from file\n */\nfunction loadHistory(rl: readline.Interface): void {\n try {\n if (fs.existsSync(HISTORY_FILE)) {\n const history = fs.readFileSync(HISTORY_FILE, 'utf-8')\n .split('\\n')\n .filter(line => line.trim())\n .reverse();\n\n for (const line of history.slice(0, 1000)) {\n (rl as unknown as { history: string[] }).history?.push(line);\n }\n }\n } catch {\n // Ignore\n }\n}\n\n/**\n * Save a line to history\n */\nfunction saveToHistory(line: string): void {\n try {\n fs.appendFileSync(HISTORY_FILE, line + '\\n');\n } catch {\n // Ignore\n }\n}\n","#!/usr/bin/env node\n/**\n * Minimal workspace CLI using existing PR #344 infrastructure\n * \n * This is a thin wrapper around sandbox.create() + bootstrap script\n * that adds the workspace concept without SDK changes.\n */\n\nimport { compute } from 'computesdk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { startREPL } from './repl.js';\n\nconst WORKSPACE_STATE_FILE = path.join(os.homedir(), '.computesdk', 'workspaces.json');\n\ninterface Workspace {\n id: string; // repo:branch\n repo: string;\n branch: string;\n sandboxId: string;\n provider: string;\n worktreePath: string;\n createdAt: string;\n lastUsed: string;\n}\n\ninterface WorkspaceState {\n workspaces: Record<string, Workspace>;\n}\n\n// Export Workspace interface\nexport type { Workspace, WorkspaceState };\n\n// Shell escape helper to prevent command injection\nfunction shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n// Load workspace state\nexport function loadState(): WorkspaceState {\n try {\n if (!fs.existsSync(WORKSPACE_STATE_FILE)) {\n return { workspaces: {} };\n }\n const raw = fs.readFileSync(WORKSPACE_STATE_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return { workspaces: {} };\n }\n}\n\n// Export alias for index.ts\nexport const loadWorkspaceState = loadState;\n\n// Save workspace state\nexport function saveState(state: WorkspaceState): void {\n const dir = path.dirname(WORKSPACE_STATE_FILE);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(WORKSPACE_STATE_FILE, JSON.stringify(state, null, 2) + '\\n', { mode: 0o600 });\n}\n\n// Get workspace ID from repo and branch\nfunction getWorkspaceId(repo: string, branch: string): string {\n return `${repo}:${branch}`;\n}\n\n// Create or attach to workspace\nexport async function workspaceCreate(options: {\n repo: string;\n branch: string;\n provider?: string;\n}): Promise<Workspace> {\n const { repo, branch, provider } = options;\n const id = getWorkspaceId(repo, branch);\n const state = loadState();\n \n // Check if workspace already exists\n if (state.workspaces[id]) {\n const existing = state.workspaces[id];\n \n // Verify sandbox still exists\n try {\n const sandbox = await compute.sandbox.getById(existing.sandboxId);\n if (!sandbox) {\n throw new Error('Sandbox not found');\n }\n \n // Just update last used\n existing.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to existing workspace: ${pc.cyan(id)}`);\n return existing;\n } catch {\n // Sandbox is gone, remove from state and recreate\n delete state.workspaces[id];\n }\n }\n \n // Create new sandbox\n p.log.info('Creating sandbox...');\n const spinner = p.spinner();\n spinner.start('Provisioning via ComputeSDK...');\n \n let sandbox;\n try {\n // TODO: Configure compute with provider\n sandbox = await compute.sandbox.create();\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n throw error;\n }\n \n // Run bootstrap script\n spinner.start('Bootstrapping workspace (installing gh CLI, cloning repo)...');\n \n // Read bootstrap script\n const bootstrapScript = fs.readFileSync(\n new URL('./bootstrap.sh', import.meta.url),\n 'utf-8'\n );\n \n // Write and execute bootstrap script in sandbox\n try {\n // Write script to sandbox\n await sandbox.filesystem.writeFile('/tmp/bootstrap.sh', bootstrapScript);\n \n // Make executable and run\n await sandbox.runCommand('chmod +x /tmp/bootstrap.sh');\n \n // Run bootstrap with repo and branch\n // Note: This is interactive for device flow auth\n spinner.stop('Running bootstrap (you may need to authenticate with GitHub)...');\n \n const result = await sandbox.runCommand(\n `/tmp/bootstrap.sh ${shellEscape(repo)} ${shellEscape(branch)}`,\n { timeout: 300000 } // 5 min timeout for auth\n );\n \n // Parse bootstrap output for paths\n const output = result.stdout || '';\n const jsonMatch = output.match(/\\{[\\s\\S]*\\}/);\n let worktreePath = `/workspaces/${path.basename(repo)}-${branch}`;\n \n if (jsonMatch) {\n try {\n const bootstrapInfo = JSON.parse(jsonMatch[0]);\n worktreePath = bootstrapInfo.worktree_path || worktreePath;\n } catch {\n // Use default path\n }\n }\n \n // Create workspace record\n const workspace: Workspace = {\n id,\n repo,\n branch,\n sandboxId: sandbox.sandboxId,\n provider: provider || 'e2b', // TODO: Get actual provider\n worktreePath,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n };\n \n state.workspaces[id] = workspace;\n saveState(state);\n \n p.log.success(`Workspace ready: ${pc.cyan(id)}`);\n p.log.info(`Sandbox: ${pc.dim(sandbox.sandboxId)}`);\n p.log.info(`Worktree: ${pc.dim(worktreePath)}`);\n \n return workspace;\n \n } catch (error) {\n spinner.stop(pc.red('Bootstrap failed'));\n // Cleanup sandbox on failure\n try {\n await sandbox.destroy();\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n// Attach to existing workspace\nexport async function workspaceAttach(id: string): Promise<void> {\n const state = loadState();\n const workspace = state.workspaces[id];\n \n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n p.log.info(`Run: compute workspace create --repo owner/repo --branch ${id.split(':')[1] || 'main'}`);\n process.exit(1);\n }\n \n // Get sandbox\n const sandbox = await compute.sandbox.getById(workspace.sandboxId);\n if (!sandbox) {\n p.log.error(`Sandbox no longer exists: ${workspace.sandboxId}`);\n delete state.workspaces[id];\n saveState(state);\n process.exit(1);\n }\n \n // Update last used\n workspace.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to workspace: ${pc.cyan(id)}`);\n p.log.info(`Worktree: ${pc.dim(workspace.worktreePath)}`);\n console.log(pc.gray(`Tip: commands run at sandbox root; use { cwd: \"${workspace.worktreePath}\" } on runCommand to scope them.`));\n\n try {\n await startREPL(sandbox, workspace.provider);\n } catch (error) {\n p.log.error(`Failed to attach: ${(error as Error).message}`);\n process.exit(1);\n }\n}\n\n// List all sandboxes (via workspaces)\nexport async function sandboxList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Sandboxes'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n \n console.log(` ${status} ${pc.cyan(ws.sandboxId)}`);\n console.log(` Workspace: ${pc.dim(ws.id)}`);\n console.log(` Provider: ${ws.provider}`);\n console.log(` Last active: ${pc.gray(ageStr)}`);\n console.log();\n }\n \n console.log(pc.gray('Tip: Use \"compute workspaces\" to see full workspace details'));\n}\n\n// List all workspaces\nexport async function workspaceList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Workspaces'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n \n console.log(` ${pc.cyan(ws.id)}`);\n console.log(` Sandbox: ${pc.dim(ws.sandboxId)} (${ws.provider})`);\n console.log(` Path: ${pc.dim(ws.worktreePath)}`);\n console.log(` Last used: ${pc.gray(ageStr)}`);\n console.log();\n }\n}\n\n// Save a simple sandbox (without workspace/repo info)\nexport async function saveSandbox(sandbox: {\n id: string;\n sandboxId: string;\n provider: string;\n createdAt: string;\n lastUsed: string;\n}): Promise<void> {\n const state = loadState();\n \n // Store as a minimal \"workspace\" with just sandbox info\n state.workspaces[sandbox.id] = {\n id: sandbox.id,\n repo: '(no repo)',\n branch: '(raw sandbox)',\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n worktreePath: '/',\n createdAt: sandbox.createdAt,\n lastUsed: sandbox.lastUsed,\n };\n \n saveState(state);\n}\n\n// Destroy workspace\nexport async function workspaceDestroy(id?: string): Promise<void> {\n const state = loadState();\n \n if (id) {\n // Destroy specific workspace\n const workspace = state.workspaces[id];\n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n return;\n }\n \n p.log.info(`Destroying workspace: ${pc.cyan(id)}`);\n \n try {\n await compute.sandbox.destroy(workspace.sandboxId);\n delete state.workspaces[id];\n saveState(state);\n p.log.success('Workspace destroyed');\n } catch (error) {\n p.log.error(`Failed to destroy: ${(error as Error).message}`);\n }\n } else {\n // Interactive selection\n const choices = Object.values(state.workspaces).map(ws => ({\n value: ws.id,\n label: `${ws.id} (${ws.provider}, last used ${Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24))}d ago)`\n }));\n \n if (choices.length === 0) {\n p.log.info('No workspaces to destroy');\n return;\n }\n \n const selected = await p.select({\n message: 'Select workspace to destroy',\n options: choices,\n });\n \n if (p.isCancel(selected)) {\n return;\n }\n \n await workspaceDestroy(selected as string);\n }\n}\n","/**\n * @computesdk/cli\n *\n * ComputeSDK CLI - Cloud-native workspace management.\n *\n * Usage:\n * compute # interactive workspace creation\n * compute owner/repo # create workspace for repo\n * compute --repo owner/repo --branch fix-auth\n * compute workspace # manage existing workspaces\n * compute exec <id> <cmd...> # run command in sandbox\n * compute connect <id> # open REPL against sandbox\n * compute destroy <id...> # destroy sandboxes\n * compute run -- <cmd...> # create + exec + optional destroy\n * compute providers # list configured providers\n */\n\nimport 'dotenv/config';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { compute, type SandboxInterface } from 'computesdk';\nimport { getProviderStatus } from './providers.js';\nimport { registerActionsCommands } from './actions.js';\nimport { startREPL } from './repl.js';\nimport { clearStoredCredentials } from './auth.js';\nimport { ensureAuth, resolveProvider, configureCompute } from './setup.js';\nimport {\n workspaceCreate,\n workspaceAttach,\n workspaceList,\n workspaceDestroy,\n sandboxList,\n loadWorkspaceState,\n type Workspace,\n} from './workspace-cli.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n);\n\n// Detect if running from dev workspace\nconst isDevBuild = import.meta.url.includes('worktrees') || \n import.meta.url.includes('/packages/cli/');\nconst VERSION = isDevBuild ? `${packageJson.version}-dev` : packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('compute')\n .description('Cloud-native workspace management')\n .version(VERSION)\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ─── Default action: Show help ─────────────────────────────────────────────\n\nprogram\n .option('--login', 'force re-authentication')\n .option('--logout', 'clear stored credentials')\n .action(async (opts) => {\n if (opts.logout) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n process.exit(0);\n }\n\n if (opts.login) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n process.exit(0);\n }\n\n // Show help by default\n program.help();\n });\n\n// ─── Create Command (like create-compute) ─────────────────────────────────\n\nprogram\n .command('create')\n .description('Create a new workspace (same as create-compute)')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length > 0) {\n // Show existing workspaces to attach to\n const choices = workspaceIds.map((id) => {\n const ws = state.workspaces[id];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n return {\n value: id,\n label: `${id} (${ws.provider}, ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to attach (or create new)',\n options: [\n ...choices,\n { value: '__new__', label: pc.gray('+ Create new workspace') },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n if (selected !== '__new__') {\n await workspaceAttach(selected as string);\n return;\n }\n\n // Fall through to create new\n }\n\n // Prompt for repo\n const repoInput = await p.text({\n message: 'Repository to work on?',\n placeholder: 'owner/repo',\n validate: (value) => {\n if (!value || !value.includes('/')) {\n return 'Please enter a repository in owner/repo format';\n }\n },\n });\n\n if (p.isCancel(repoInput)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n repo = repoInput as string;\n }\n\n // Validate repo format\n if (!repo.includes('/')) {\n p.log.error('Invalid repository format. Use: owner/repo');\n process.exit(1);\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\n// ─── Sandbox Commands ───────────────────────────────────────────────────────\n\nconst sandboxCmd = program\n .command('sandbox')\n .alias('sb')\n .description('Manage raw sandboxes (VMs without git/worktree)');\n\nsandboxCmd\n .command('create')\n .description('Create a new sandbox')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .option('--connect', 'drop into the REPL after creation')\n .option('--silent', 'only output the sandbox ID')\n .action(async (opts) => {\n if (!opts.silent) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n }\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n if (!opts.silent) {\n const spinner = p.spinner();\n spinner.start('Creating sandbox...');\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n\n // Track the sandbox in local state\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n } else {\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n // Silent mode: only print sandbox ID for scripting\n process.stdout.write(sandbox.sandboxId);\n\n // Track the sandbox in local state (even in silent mode)\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n process.stderr.write((error as Error).message + '\\n');\n process.exit(1);\n }\n }\n });\n\nsandboxCmd\n .command('destroy')\n .description('Destroy one or more sandboxes')\n .aliases(['rm', 'stop'])\n .argument('[sandbox_id...]', 'sandbox IDs to destroy (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxIds: string[] | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n \n // Load state\n const { loadState, saveState } = await import('./workspace-cli.js');\n const state = loadState();\n \n // If no IDs provided, show interactive picker\n if (!sandboxIds || sandboxIds.length === 0) {\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n // Allow multi-select with space, or single select with enter\n const selected = await p.multiselect({\n message: 'Select sandboxes to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxIds = selected as string[];\n }\n \n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const results = await Promise.allSettled(\n sandboxIds.map(async (id) => {\n await compute.sandbox.destroy(id);\n return id;\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n const sandboxId = result.value;\n console.log(pc.green(`Destroyed ${sandboxId}`));\n \n // Remove from state if tracked\n const workspaceId = Object.keys(state.workspaces).find(\n key => state.workspaces[key].sandboxId === sandboxId\n );\n if (workspaceId) {\n delete state.workspaces[workspaceId];\n }\n } else {\n console.error(pc.red(`Failed to destroy: ${result.reason?.message || result.reason}`));\n }\n }\n \n // Save updated state\n saveState(state);\n });\n\nsandboxCmd\n .command('list')\n .alias('ls')\n .description('List all sandboxes')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await sandboxList();\n });\n\nsandboxCmd\n .command('connect')\n .description('Connect to a sandbox (opens REPL; same as compute connect)')\n .aliases(['ssh', 'shell'])\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\nsandboxCmd\n .command('exec')\n .description('Execute a command in a sandbox')\n .argument('<sandbox_id>', 'sandbox ID')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .action(async (sandboxId: string, command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n console.error(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n process.exit(result.exitCode);\n });\n\n// ─── Connect Command (top-level alias) ───────────────────────────────────────\n\nprogram\n .command('connect')\n .description('Connect to a sandbox (opens REPL)')\n .aliases(['ssh', 'shell']) // Keep aliases but document connect as primary\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\n// ─── Workspace Commands ─────────────────────────────────────────────────────\n\nconst workspaceCmd = program\n .command('workspace')\n .alias('ws')\n .description('Manage workspaces (sandbox + git + worktree)');\n\nworkspaceCmd\n .command('create')\n .description('Create a new workspace')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n p.log.info('Usage: compute workspace create owner/repo --branch main');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\nworkspaceCmd\n .command('list')\n .alias('ls')\n .description('List all workspaces')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await workspaceList();\n });\n\nworkspaceCmd\n .command('destroy')\n .alias('rm')\n .description('Destroy a workspace')\n .argument('[id]', 'Workspace ID (repo:branch format, optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n // Allow multi-select\n const selected = await p.multiselect({\n message: 'Select workspaces to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n // Destroy each selected workspace\n for (const workspaceId of selected as string[]) {\n await workspaceDestroy(workspaceId);\n }\n } else {\n // Direct destroy with provided ID\n await workspaceDestroy(id);\n }\n });\n\nworkspaceCmd\n .command('connect')\n .alias('attach') // Keep attach as alias\n .description('Connect to an existing workspace (with git context)')\n .argument('[id]', 'Workspace ID (optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute create owner/repo');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n id = selected as string;\n }\n\n await workspaceAttach(id);\n });\n\n// ─── run ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('run')\n .description('Create a sandbox, run a command, then optionally destroy it')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .option('--rm', 'destroy sandbox after command finishes')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .action(async (command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n let sandbox: SandboxInterface;\n try {\n sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n } catch (error) {\n console.error(pc.red(`Failed to create sandbox: ${(error as Error).message}`));\n process.exit(1);\n }\n\n try {\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (opts.rm) {\n await sandbox.destroy();\n }\n\n process.exit(result.exitCode);\n } catch (error) {\n if (opts.rm) {\n try { await sandbox.destroy(); } catch { /* ignore cleanup errors */ }\n }\n console.error(pc.red((error as Error).message));\n process.exit(1);\n }\n });\n\n// ─── providers ───────────────────────────────────────────────────────────────\n\nprogram\n .command('providers')\n .description('List all providers and their configuration status')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n const statuses = getProviderStatus();\n\n console.log();\n for (const status of statuses) {\n const icon = status.ready ? pc.green('●') : pc.gray('○');\n const name = status.ready ? pc.white(status.name) : pc.gray(status.name);\n const detail = status.ready\n ? pc.green('ready')\n : pc.gray(`missing: ${status.missing.join(', ')}`);\n console.log(` ${icon} ${name} ${detail}`);\n }\n console.log();\n });\n\n// ─── login / logout ──────────────────────────────────────────────────────────\n\nprogram\n .command('login')\n .description('Authenticate with ComputeSDK')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n });\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(() => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n });\n\n// ─── actions ─────────────────────────────────────────────────────────────────\n\nregisterActionsCommands(program);\n\n// ─── bench ───────────────────────────────────────────────────────────────────\n// `compute bench` is the benchmarks-platform CLI (@benchsdk/runner's `bench`\n// binary) folded under compute: run/check/auth/org/benchmarks/runs/results/\n// iterations/artifacts/logs/export all dispatch through it.\n\nprogram\n .command('bench')\n .description('Benchmarks platform CLI (run, auth, org, benchmarks, runs, results, artifacts, export, ...)')\n .allowUnknownOption()\n .helpOption(false)\n .action(() => {\n // Never reached: bench args are dispatched pre-parse below.\n });\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildCreateOptions(opts: { timeout?: string; name?: string }) {\n const options: Record<string, unknown> = {};\n if (opts.timeout) {\n options.timeout = parseDuration(opts.timeout);\n }\n if (opts.name) {\n options.name = opts.name;\n }\n return options;\n}\n\nexport function shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildExecCommand(\n command: string[],\n opts: { env?: string[]; workdir?: string },\n): string {\n let cmd = command.map(shellEscape).join(' ');\n\n // Prepend cd if workdir is specified\n if (opts.workdir) {\n cmd = `cd ${shellEscape(opts.workdir)} && ${cmd}`;\n }\n\n // Prepend env vars if specified\n if (opts.env && opts.env.length > 0) {\n const envPrefix = opts.env\n .map((entry) => {\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid environment entry \"${entry}\". Expected format KEY=VALUE.`,\n );\n }\n const key = entry.slice(0, eqIndex);\n const val = entry.slice(eqIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(\n `Invalid environment variable name \"${key}\" in entry \"${entry}\".`,\n );\n }\n return `${key}=${shellEscape(val)}`;\n })\n .join(' ');\n cmd = `${envPrefix} ${cmd}`;\n }\n\n return cmd;\n}\n\n/**\n * Parse a human-friendly duration string to milliseconds.\n * Supports: 30s, 5m, 1h, 2h30m\n */\nfunction parseDuration(input: string): number {\n let total = 0;\n const pattern = /(\\d+)\\s*(s|m|h)/gi;\n let match;\n\n while ((match = pattern.exec(input)) !== null) {\n const value = parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n switch (unit) {\n case 's': total += value * 1000; break;\n case 'm': total += value * 60 * 1000; break;\n case 'h': total += value * 60 * 60 * 1000; break;\n }\n }\n\n if (total === 0) {\n // Try as plain number (seconds)\n const num = parseInt(input, 10);\n if (!isNaN(num)) return num * 1000;\n throw new Error(`Invalid duration: ${input}. Use formats like 30s, 5m, 1h`);\n }\n\n return total;\n}\n\n// ─── Run ─────────────────────────────────────────────────────────────────────\n\n// Bench args are opaque to commander (its own --flags, `--` separators, file\n// paths), so they dispatch before parsing. `@benchsdk/runner`'s run() owns the\n// process — it exits itself after dispatch.\nasync function main() {\n if (process.argv[2] === 'bench' || process.argv[2] === 'benchmark') {\n const { run: benchRun } = await import('@benchsdk/runner');\n await benchRun(process.argv.slice(3));\n return;\n }\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n console.error(pc.red(`\\nError: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Provider detection and validation\n *\n * Detection is local: each provider declares the env vars its credentials come\n * from, and \"ready\" means all of them are set. This used to import helpers from\n * `computesdk` that the package no longer exports, which made every `compute`\n * invocation fail at module load.\n */\n\ninterface ProviderEnvSpec {\n /**\n * Alternative complete credential sets — the provider is usable when every\n * var in any one set is present (e.g. Vercel: the traditional tuple OR\n * VERCEL_OIDC_TOKEN; Namespace: NSC_TOKEN or NSC_TOKEN_FILE).\n */\n authOptions: string[][];\n /**\n * Maps each env var to the provider's nested config key (the field names in\n * the provider package's config interface, e.g. `apiKey`, `tokenId`).\n */\n configKeys: Record<string, string>;\n}\n\nconst PROVIDER_ENV: Record<string, ProviderEnvSpec> = {\n e2b: { authOptions: [['E2B_API_KEY']], configKeys: { E2B_API_KEY: 'apiKey' } },\n railway: { authOptions: [['RAILWAY_API_TOKEN']], configKeys: { RAILWAY_API_TOKEN: 'token' } },\n modal: {\n authOptions: [['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET']],\n configKeys: { MODAL_TOKEN_ID: 'tokenId', MODAL_TOKEN_SECRET: 'tokenSecret' },\n },\n vercel: {\n authOptions: [['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'], ['VERCEL_OIDC_TOKEN']],\n configKeys: {\n VERCEL_TOKEN: 'token',\n VERCEL_TEAM_ID: 'teamId',\n VERCEL_PROJECT_ID: 'projectId',\n },\n },\n daytona: { authOptions: [['DAYTONA_API_KEY']], configKeys: { DAYTONA_API_KEY: 'apiKey' } },\n namespace: {\n authOptions: [['NSC_TOKEN'], ['NSC_TOKEN_FILE']],\n configKeys: { NSC_TOKEN: 'token', NSC_TOKEN_FILE: 'tokenFile' },\n },\n blaxel: {\n authOptions: [['BL_API_KEY', 'BL_WORKSPACE']],\n configKeys: { BL_API_KEY: 'apiKey', BL_WORKSPACE: 'workspace' },\n },\n codesandbox: { authOptions: [['CSB_API_KEY']], configKeys: { CSB_API_KEY: 'apiKey' } },\n render: { authOptions: [['RENDER_API_KEY']], configKeys: { RENDER_API_KEY: 'apiKey' } },\n};\n\nconst PROVIDER_NAMES = Object.keys(PROVIDER_ENV);\n\n/** Missing vars from whichever auth option is closest to complete. */\nfunction missingEnvVars(provider: string): string[] {\n const spec = PROVIDER_ENV[provider];\n if (!spec) return [];\n let best: string[] | null = null;\n for (const option of spec.authOptions) {\n const missing = option.filter((name) => !process.env[name]);\n if (missing.length === 0) return [];\n if (!best || missing.length < best.length) best = missing;\n }\n return best ?? [];\n}\n\nfunction isProviderAuthComplete(provider: string): boolean {\n return missingEnvVars(provider).length === 0;\n}\n\n/**\n * Provider status info\n */\nexport interface ProviderStatus {\n name: string;\n ready: boolean;\n missing: string[];\n}\n\n/**\n * Detect all available providers from environment variables\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function detectAvailableProviders(): string[] {\n const available: string[] = [];\n\n // Check for computesdk first (ComputeSDK native - just needs gateway key)\n if (process.env.COMPUTESDK_API_KEY) {\n available.push('computesdk');\n }\n\n // Then check for individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (isProviderAuthComplete(provider)) {\n available.push(provider);\n }\n }\n\n return available;\n}\n\n/**\n * Get status of all providers\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function getProviderStatus(): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n // Add computesdk status (ComputeSDK native)\n const hasGatewayKey = !!process.env.COMPUTESDK_API_KEY;\n statuses.push({\n name: 'computesdk',\n ready: hasGatewayKey,\n missing: hasGatewayKey ? [] : ['COMPUTESDK_API_KEY'],\n });\n\n // Add individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n statuses.push({\n name: provider,\n ready: isProviderAuthComplete(provider),\n missing: missingEnvVars(provider),\n });\n }\n\n return statuses;\n}\n\n/**\n * Check if gateway mode is available\n */\nexport function isGatewayAvailable(): boolean {\n return !!process.env.COMPUTESDK_API_KEY;\n}\n\n/**\n * Build the full compute config for a provider from env vars\n */\nexport function buildProviderConfig(provider: string): Record<string, unknown> {\n const config: Record<string, unknown> = {\n provider,\n apiKey: process.env.COMPUTESDK_API_KEY, // Gateway API key (top-level)\n };\n\n // For 'computesdk' provider, nest the API key under the provider config too\n if (provider === 'computesdk') {\n config.computesdk = {\n computesdk_api_key: process.env.COMPUTESDK_API_KEY,\n };\n return config;\n }\n\n // Add provider-specific config from env vars\n const spec = PROVIDER_ENV[provider];\n if (spec) {\n const providerConfig: Record<string, string> = {};\n for (const [envVar, key] of Object.entries(spec.configKeys)) {\n const value = process.env[envVar];\n if (value) providerConfig[key] = value;\n }\n if (Object.keys(providerConfig).length > 0) {\n config[provider] = providerConfig;\n }\n }\n\n return config;\n}\n","/** A file/dir name reduced to a safe basename — strips `..` and separators. */\nfunction sanitizePathPart(name: string): string {\n const base = basename(name);\n if (base === '' || base === '.' || base === '..') return 'artifact';\n return base;\n}\n\n/**\n * `compute actions` — drive the benchmarks-platform Actions API end-to-end:\n * dispatch workflows, watch runs, inspect run context, stream logs,\n * manage artifacts.\n *\n * Auth: COMPUTE_API_KEY (or --api-key); --base-url overrides the\n * https://platform.computesdk.com default. Every subcommand takes --json for\n * machine-readable output.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { basename, join } from 'path';\nimport {\n ActionsApiError,\n ActionsClient,\n encodeWatchCursor,\n resolveActionsAuth,\n type CiArtifactListItem,\n type CiJob,\n type CiLogSlice,\n type CiProviderInfo,\n type CiProviderKeyResponse,\n type CiProvidersResponse,\n type CiRepo,\n type CiRepoConnectResponse,\n type CiRepoPatchResponse,\n type CiReposResponse,\n type CiRun,\n type CiRunHistory,\n type CiRunInspection,\n type CiRunSummary,\n type CiWorkflow,\n} from './actions-client.js';\n\n/** The jobs inside a `/state` response — a subset of CiJob, no name/steps. */\ninterface CiLiveStateJob {\n id: string;\n state: CiJob['state'];\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n placementAttempts: CiJob['placementAttempts'];\n}\n\ntype JsonOpts = { json?: boolean };\n\ninterface CommonOpts extends JsonOpts {\n apiKey?: string;\n baseUrl?: string;\n allowUntrustedHost?: boolean;\n}\n\nfunction client(opts: CommonOpts): ActionsClient {\n return new ActionsClient(resolveActionsAuth(opts));\n}\n\n/** Print `data` as JSON when --json was passed; otherwise call `render`. */\nfunction output<T>(opts: JsonOpts, data: T, render: (data: T) => void): void {\n if (opts.json) {\n process.stdout.write(JSON.stringify(data, null, 2) + '\\n');\n } else {\n render(data);\n }\n}\n\n/** The run's job list: full detail when the runs detail route exists, else the\n * live-state route (which predates it and lists jobs without names). */\nasync function listRunJobs(c: ActionsClient, runId: string): Promise<CiJob[]> {\n try {\n const run = await c.get<CiRun>(`/api/v1/actions/runs/${runId}`);\n return run.jobs;\n } catch (e) {\n if (!(e instanceof ActionsApiError) || e.status !== 404) throw e;\n }\n const state = await c.get<{ jobs: CiLiveStateJob[] }>(`/api/v1/actions/runs/${runId}/state`);\n return state.jobs.map((j) => ({\n id: j.id,\n name: j.id.slice(0, 8), // the live-state route does not carry job names\n needs: [],\n workflowJobId: null,\n matrix: null,\n state: j.state,\n provider: j.provider,\n region: j.region,\n sandboxId: j.sandboxId,\n placementAttempts: j.placementAttempts,\n durationMs: null,\n steps: [],\n }));\n}\n\n/** The run's failure digest; null when the summary cannot be fetched. */\nasync function fetchRunSummary(c: ActionsClient, runId: string): Promise<CiRunSummary | null> {\n try {\n return await c.get<CiRunSummary>(`/api/v1/actions/runs/${runId}/summary`);\n } catch (e) {\n // The digest rides along with `actions run`; a deployment without the\n // route or a summary error must not hide the run detail itself. The\n // `summary` command fetches directly so its own errors still surface.\n if (!(e instanceof ActionsApiError && e.status === 404)) {\n console.error(\n pc.dim(`summary unavailable: ${e instanceof Error ? e.message : String(e)}`),\n );\n }\n return null;\n }\n}\n\nfunction fail(error: unknown): never {\n if (error instanceof ActionsApiError) {\n console.error(pc.red(`Error (${error.status}): ${error.message}`));\n } else {\n console.error(pc.red(`Error: ${(error as Error).message}`));\n }\n process.exit(1);\n}\n\n// ─── Formatting (pure, exported for tests) ──────────────────────────────────\n\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined) return '-';\n if (ms < 1000) return `${ms}ms`;\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h${m % 60}m`;\n}\n\nexport function shortSha(sha: string): string {\n return sha.slice(0, 8);\n}\n\nexport function conclusionLabel(conclusion: string): string {\n switch (conclusion) {\n case 'passed': return pc.green('passed');\n case 'failed': return pc.red('failed');\n case 'running': return pc.yellow('running');\n case 'cancelled': return pc.gray('cancelled');\n case 'none': return pc.yellow('queued');\n default: return conclusion;\n }\n}\n\nexport function formatRunRow(run: CiRun): string {\n const num = run.runNumber === null ? '-' : `#${run.runNumber}`;\n return [\n run.id,\n pc.dim(num),\n run.workflowName || run.workflowPath,\n conclusionLabel(run.conclusion),\n pc.dim(`${run.repoFullName}@${run.ref}`),\n shortSha(run.headSha),\n formatDuration(run.durationMs),\n run.startedAt,\n ].join(' ');\n}\n\nexport function formatRunDetail(run: CiRun, runUrl?: string): string {\n const lines: string[] = [];\n lines.push(`${pc.bold(run.workflowName || run.workflowPath)} ${conclusionLabel(run.conclusion)}`);\n lines.push(pc.dim(`run ${run.id}${run.runNumber === null ? '' : ` #${run.runNumber}`}`));\n lines.push(`${run.repoFullName} @ ${run.ref} ${shortSha(run.headSha)} ${run.event}${run.prNumber ? ` PR #${run.prNumber}` : ''}`);\n lines.push(`title: ${run.title}`);\n lines.push(`started: ${run.startedAt} duration: ${formatDuration(run.durationMs)}`);\n if (run.cancellationReason) lines.push(`cancelled: ${run.cancellationReason}`);\n if (run.providerOverride) lines.push(`dispatched to: ${run.providerOverride}`);\n if (run.supersededByRunId) lines.push(`superseded by: ${run.supersededByRunId}`);\n if (runUrl) lines.push(`url: ${runUrl}`);\n if (run.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of run.jobs) {\n const placement = job.provider\n ? `${job.provider}${job.region ? `:${job.region}` : ''}`\n : '-';\n lines.push(` ${job.id} ${job.name} ${conclusionLabel(job.state)} ${placement} ${formatDuration(job.durationMs)}`);\n for (const attempt of job.placementAttempts) {\n lines.push(pc.dim(` placement failed on ${attempt.provider}${attempt.region ? `:${attempt.region}` : ''}: ${attempt.error}`));\n }\n for (const step of job.steps) {\n const exit = step.exitCode === null ? '' : ` (exit ${step.exitCode})`;\n lines.push(pc.dim(` ${step.name} ${step.state}${exit} ${formatDuration(step.durationMs)}`));\n }\n }\n }\n return lines.join('\\n');\n}\n\n/** `compute actions inspect` — the run plus everything that shaped it. */\nexport function formatRunInspection(run: CiRunInspection): string {\n const lines: string[] = [];\n lines.push(`${pc.bold('run')} ${conclusionLabel(run.conclusion)}${run.runNumber === null ? '' : ` #${run.runNumber}`}`);\n lines.push(pc.dim(run.id));\n lines.push(`${safeTerm(run.ref)} ${shortSha(run.headSha)} ${safeTerm(run.event)}`);\n lines.push(`queued: ${run.queuedAt} started: ${run.startedAt} finished: ${run.finishedAt}`);\n if (run.cancellationReason) lines.push(`cancelled: ${run.cancellationReason}`);\n if (run.supersededByRunId) lines.push(`superseded by: ${run.supersededByRunId}`);\n if (run.blockedReason) lines.push(pc.red(`blocked: ${safeTerm(run.blockedReason)}`));\n if (run.concurrencyGroup) lines.push(`concurrency: ${safeTerm(run.concurrencyGroup)}`);\n if (run.providerOverride) lines.push(`dispatched to: ${safeTerm(run.providerOverride)}`);\n if (run.definitionStale) {\n const parsed = run.workflowParsedFromSha ? shortSha(run.workflowParsedFromSha) : 'unknown';\n lines.push(pc.yellow(`definition: stored parse is from ${parsed}, not this head — context may be newer than the run`));\n }\n if (run.dispatchInputs && Object.keys(run.dispatchInputs).length > 0) {\n lines.push(`inputs: ${Object.entries(run.dispatchInputs).map(([k, v]) => `${safeTerm(k)}=${safeTerm(v)}`).join(' ')}`);\n }\n if (run.secrets) {\n const names = run.secrets.names.length > 0 ? run.secrets.names.map(safeTerm).join(', ') : 'none';\n lines.push(`secrets (${run.secrets.access}${run.secrets.env ? ', exported to env' : ''}): ${names}`);\n }\n if (run.caches.length > 0) {\n lines.push('');\n lines.push(pc.bold('caches'));\n for (const cache of run.caches) {\n const action = [cache.restoredAt ? 'restored' : null, cache.savedAt ? 'saved' : null]\n .filter(Boolean)\n .join('+');\n lines.push(` ${safeTerm(cache.key)} ${pc.dim(`${action} ${safeTerm(cache.scopeRef)} ${cache.sizeBytes}B`)}`);\n }\n }\n if (run.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of run.jobs) {\n const placement = job.provider\n ? `${safeTerm(job.provider)}${job.region ? `:${safeTerm(job.region)}` : ''}`\n : '-';\n lines.push(` ${safeTerm(job.name)} ${conclusionLabel(job.state)} ${placement}`);\n lines.push(pc.dim(` ${job.id}`));\n if (job.runsOn.length > 0 || job.resolvedRunsOn !== null) {\n const resolved =\n job.resolvedRunsOn !== null && job.resolvedRunsOn.join(',') !== job.runsOn.join(',')\n ? ` → ${job.resolvedRunsOn.map(safeTerm).join(', ')}`\n : '';\n lines.push(` runs-on: ${job.runsOn.map(safeTerm).join(', ') || '(none)'}${resolved}`);\n }\n if (job.runsOnHasExpression) lines.push(pc.dim(' runs-on resolves at runtime (expression)'));\n if (job.container) lines.push(` container: ${safeTerm(job.container)}`);\n if (job.runnerImage) lines.push(` image: ${safeTerm(job.runnerImage)}`);\n if (job.placementHint) {\n lines.push(` pinned: ${safeTerm(job.placementHint.label)}`);\n }\n if (job.concurrencyGroup) {\n lines.push(` concurrency: ${safeTerm(job.concurrencyGroup)}${job.concurrencyCancelInProgress ? ' (cancel-in-progress)' : ''}`);\n }\n const overrides = [\n job.timeoutMinutes !== null ? `timeout ${job.timeoutMinutes}m` : null,\n job.fetchDepth !== null ? `fetch-depth ${job.fetchDepth}` : null,\n ].filter(Boolean);\n if (overrides.length > 0) lines.push(` ${overrides.join(' ')}`);\n if (job.matrix) {\n lines.push(` matrix: ${Object.entries(job.matrix).map(([k, v]) => `${safeTerm(k)}=${safeTerm(v)}`).join(' ')}`);\n }\n if (job.failureReason) lines.push(pc.red(` failed: ${safeTerm(job.failureReason)}`));\n for (const attempt of job.placementAttempts) {\n lines.push(pc.dim(` placement failed on ${safeTerm(attempt.provider)}${attempt.region ? `:${safeTerm(attempt.region)}` : ''}: ${safeTerm(attempt.error)}`));\n }\n }\n }\n return lines.join('\\n');\n}\n\n/** The failure digest rendered for humans — shared by `run` and `summary`. */\nexport function formatRunSummary(summary: CiRunSummary): string {\n const lines: string[] = [];\n lines.push(pc.bold(`failures — run ${summary.runId} ${conclusionLabel(summary.conclusion)}`));\n if (summary.failures.length === 0) {\n lines.push(' no failed jobs');\n return lines.join('\\n');\n }\n for (const job of summary.failures) {\n const placement = job.provider\n ? `${safeTerm(job.provider)}${job.region ? `:${safeTerm(job.region)}` : ''}`\n : '-';\n lines.push(` ${job.id} ${safeTerm(job.name)} ${conclusionLabel(job.conclusion)} ${placement}`);\n if (job.failureReason) lines.push(pc.dim(` ${safeTerm(job.failureReason)}`));\n for (const step of job.failedSteps) {\n const exit = step.exitCode === null ? '' : ` (exit ${step.exitCode})`;\n lines.push(` step ${step.ordinal} ${safeTerm(step.name)}${exit}`);\n }\n if (job.excerpt) {\n const scope = job.excerpt.stepOrdinal === null ? 'job log' : `step ${job.excerpt.stepOrdinal}`;\n const cut = job.excerpt.truncated ? ', truncated' : '';\n lines.push(pc.dim(` ── ${scope} tail${cut} ──`));\n for (const line of job.excerpt.text.split('\\n')) lines.push(` ${safeTerm(line)}`);\n }\n }\n return lines.join('\\n');\n}\n\n// ─── Parsing helpers (pure, exported for tests) ─────────────────────────────\n\n/** `--inputs k=v` pairs → a dispatch inputs object. `k=v` with no `=` is an error. */\nexport function parseInputs(pairs: string[] | undefined): Record<string, string> {\n const inputs: Record<string, string> = {};\n for (const pair of pairs ?? []) {\n const eq = pair.indexOf('=');\n if (eq === -1) {\n throw new Error(`Invalid --inputs entry \"${pair}\". Expected key=value.`);\n }\n inputs[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return inputs;\n}\n\n/** Match `--workflow` to a workflow by path first, then by name. */\nexport function matchWorkflow(\n workflows: CiWorkflow[],\n selector: string,\n): CiWorkflow | undefined {\n return (\n workflows.find((w) => w.path === selector) ??\n workflows.find((w) => w.name === selector) ??\n workflows.find((w) => w.id === selector)\n );\n}\n\n/** Match `--job` to a run's job by id, then by name. */\nexport function matchJob(jobs: CiJob[], selector: string): CiJob | undefined {\n return jobs.find((j) => j.id === selector) ?? jobs.find((j) => j.name === selector);\n}\n\n// ─── Logs ───────────────────────────────────────────────────────────────────\n\nasync function readWholeJobLog(client: ActionsClient, jobId: string, step?: string): Promise<CiLogSlice> {\n const segments: CiLogSlice['segments'] = [];\n let offset = 0;\n let slice: CiLogSlice;\n do {\n slice = await client.get<CiLogSlice>(`/api/v1/actions/jobs/${jobId}/logs`, {\n offset: String(offset),\n step,\n });\n segments.push(...slice.segments);\n offset = slice.nextOffset;\n } while (slice.truncated);\n return { ...slice, segments };\n}\n\n/** Follow one job's log over the SSE `follow=1` slice stream, resuming on reconnect. */\nasync function* followJobLog(client: ActionsClient, jobId: string, step?: string): AsyncGenerator<CiLogSlice> {\n let offset = 0;\n for (;;) {\n let terminal = false;\n for await (const raw of client.sse(`/api/v1/actions/jobs/${jobId}/logs`, {\n offset: String(offset),\n follow: '1',\n step,\n })) {\n const slice = raw as CiLogSlice;\n offset = slice.nextOffset;\n if (slice.segments.length > 0 || slice.state !== 'running') yield slice;\n if (slice.state !== 'running' && slice.state !== 'pending' && !slice.truncated) {\n terminal = true;\n }\n }\n if (terminal) return;\n // The connection ended (server-side ceiling or a drop): resume from the\n // offset we hold — resumable cursors make this a continuation, not a replay.\n }\n}\n\n/** `--step` CLI value → the watch-cursor step field. */\nexport function parseStep(step: string | undefined): number | 'runner' | null {\n if (step === undefined) return null;\n if (step === 'runner') return 'runner';\n const n = Number(step);\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(`Invalid --step \"${step}\". Expected a step ordinal or \"runner\".`);\n }\n return n;\n}\n\n/** Follow a run's logs across jobs via the multiplexed run stream. */\nasync function* followRunLogs(\n client: ActionsClient,\n runId: string,\n jobs: CiJob[],\n step?: string,\n): AsyncGenerator<{ job: CiJob; slice: CiLogSlice }> {\n const cursorStep = parseStep(step);\n const offsets = new Map<string, number>(jobs.map((j) => [j.id, 0]));\n const byCursor = new Map<string, CiJob>(jobs.map((j, i) => [`j${i}`, j]));\n for (;;) {\n let done = false;\n const watch = jobs.map((j, i) =>\n encodeWatchCursor(`j${i}`, j.id, cursorStep, offsets.get(j.id) ?? 0),\n );\n for await (const raw of client.sse(`/api/v1/actions/runs/${runId}/stream`, { watch })) {\n const msg = raw as\n | { type: 'state'; state: unknown }\n | { type: 'log'; cursor: string; slice: CiLogSlice }\n | { type: 'done' }\n | { type: 'reconnect' };\n if (msg.type === 'log') {\n const job = byCursor.get(msg.cursor);\n if (job) {\n offsets.set(msg.slice.jobId, msg.slice.nextOffset);\n yield { job, slice: msg.slice };\n }\n } else if (msg.type === 'done') {\n done = true;\n break;\n } else if (msg.type === 'reconnect') {\n break;\n }\n }\n if (done) return;\n // Both an explicit `reconnect` event and an unexpected EOF resume from the\n // offsets we hold; back off briefly so a repeatedly-closing server doesn't\n // spin the loop.\n await new Promise((r) => setTimeout(r, 1000));\n }\n}\n\n// Job and step names come from workflow files — potentially attacker-controlled\n// in a PR context — so strip control characters before writing to the terminal.\nfunction safeTerm(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, '�');\n}\n\nexport function formatRunHistory(history: CiRunHistory): string {\n const lines: string[] = [];\n const parts = (Object.entries(history.conclusions) as [string, number][])\n .map(([c, n]) => `${n} ${c}`)\n .join(', ');\n lines.push(`last ${history.runCount} runs: ${parts || 'none'}`);\n if (history.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of history.jobs) {\n const rate = job.runs > 0 ? Math.round((job.failedRuns / job.runs) * 100) : 0;\n const platform = job.failedBeforeSteps > 0 ? pc.dim(` (${job.failedBeforeSteps} failed before steps)`) : '';\n const count = `${job.failedRuns}/${job.runs} runs failed`;\n const label = job.failedRuns > 0 ? pc.red(count) : pc.green(count);\n lines.push(` ${safeTerm(job.job)} ${label} ${rate}%${platform}`);\n for (const step of job.steps) {\n lines.push(pc.dim(` step \"${safeTerm(step.step)}\" failed in ${step.failedRuns} run${step.failedRuns === 1 ? '' : 's'}`));\n }\n }\n }\n const failed = history.runs.filter(\n (r) => r.conclusion === 'failed' || r.failedJobs.length > 0,\n );\n if (failed.length > 0) {\n lines.push('');\n lines.push(pc.bold('failed runs'));\n for (const run of failed) {\n const blame = run.failedJobs.length > 0\n ? run.failedJobs.map((j) => safeTerm(j.step === null ? j.job : `${j.job}:${j.step}`)).join(', ')\n : pc.dim('(no failed job recorded)');\n lines.push(` ${shortSha(run.headSha)} ${pc.dim(run.startedAt)} ${blame}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function formatProviderRow(p: CiProviderInfo): string {\n const icon = p.usable ? pc.green('●') : pc.gray('○');\n const name = p.usable ? pc.white(p.provider) : pc.gray(p.provider);\n const flags = [\n p.credential,\n p.actCapable ? pc.green('act') : pc.gray('no-act'),\n p.regions.length > 0 ? `regions: ${p.regions.join(',')}` : 'no region choice',\n p.position === null ? pc.gray('not in provider order') : `order #${p.position}`,\n ].join(' ');\n return ` ${icon} ${name} ${flags}`;\n}\n\nexport function formatVerifyResult(r: CiProviderKeyResponse): string {\n const ok = r.verified === true;\n const head = ok ? pc.green('verified') : pc.red('not verified');\n const detail = r.key.statusDetail ? pc.dim(` ${r.key.statusDetail}`) : '';\n const act = r.key.actCapable ? pc.green(' act-capable') : '';\n return `${head} ${r.key.provider}${act}${detail}`;\n}\n\nfunction formatRepoRow(r: CiRepo): string {\n const head = r.enabled ? pc.green('enabled') : pc.dim('disabled');\n const via = r.authType === 'github_app' ? 'github-app' : r.authType;\n const workflows =\n r.workflowPaths.length > 0\n ? `${r.workflowPaths.length} workflow${r.workflowPaths.length === 1 ? '' : 's'}`\n : 'no workflows yet';\n const error = r.lastPollError ? pc.red(` poll error: ${safeTerm(r.lastPollError)}`) : '';\n return `${head} ${safeTerm(r.fullName)} ${pc.dim(`${safeTerm(via)} · ${safeTerm(r.defaultBranch)} · ${workflows}`)}${error}`;\n}\n\n/** Print what an enable/connect discovered — one dim line, nothing on a clean run. */\nfunction printDiscovery(d: { workflowsFound: boolean; seeded: boolean; error: string | null }): void {\n if (d.error) {\n console.log(pc.yellow(`discovery: ${safeTerm(d.error)} (the poll cron retries)`));\n return;\n }\n console.log(pc.dim(`discovery: ${d.workflowsFound ? 'workflows found' : 'no workflows yet'}${d.seeded ? ', cursors seeded' : ''}`));\n}\n\n// ─── Commands ───────────────────────────────────────────────────────────────\n\nexport function registerActionsCommands(program: Command): void {\n const actions = program\n .command('actions')\n .alias('ci')\n .description('Drive the benchmarks-platform Actions API');\n\n const common = (cmd: Command) =>\n cmd\n .option('--api-key <key>', 'API key (default: $COMPUTE_API_KEY)')\n .option('--base-url <url>', 'API base URL (default: https://platform.computesdk.com)')\n .option('--allow-untrusted-host', 'send the API key to a non-computesdk, non-localhost --base-url')\n .option('--json', 'print machine-readable JSON');\n\n common(\n actions\n .command('dispatch')\n .description('Dispatch a workflow_dispatch run')\n .argument('<repo>', 'repository in owner/repo format')\n .requiredOption('--workflow <path|name>', 'workflow path or name')\n .option('--ref <ref>', 'git ref to run (default: the workflow\\'s first watched ref)')\n .option('--inputs <pairs...>', 'workflow inputs as key=value')\n .option('--provider <id>', 'place the run on one provider (e.g. namespace, vercel:sfo1) instead of the org provider order')\n .option('--provider-region <region>', 'region for --provider (same as --provider <id>:<region>)'),\n ).action(async (repo: string, opts: CommonOpts & { workflow: string; ref?: string; inputs?: string[]; provider?: string; providerRegion?: string }) => {\n try {\n const c = client(opts);\n const { workflows } = await c.get<{ workflows: CiWorkflow[] }>(\n '/api/v1/actions/workflows',\n { repo },\n );\n const workflow = matchWorkflow(workflows, opts.workflow);\n if (!workflow) {\n const choices = workflows.map((w) => `${w.path} (${w.name})`).join(', ') || 'none';\n throw new Error(\n `No dispatchable workflow \"${opts.workflow}\" in ${repo}. Available: ${choices}`,\n );\n }\n const ref = opts.ref ?? workflow.refs[0];\n if (!ref) throw new Error('No --ref given and the workflow has no watched refs.');\n if (opts.providerRegion !== undefined && opts.provider === undefined) {\n throw new Error('--provider-region requires --provider.');\n }\n const result = await c.post<{ runId: string; created: boolean; headSha: string }>(\n '/api/v1/actions/dispatch',\n {\n workflowId: workflow.id,\n ref,\n inputs: parseInputs(opts.inputs),\n ...(opts.provider !== undefined && {\n provider: opts.provider,\n ...(opts.providerRegion !== undefined && { providerRegion: opts.providerRegion }),\n }),\n },\n );\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${result.runId}`;\n output(opts, { ...result, url }, (r) => {\n console.log(`${r.created ? 'dispatched' : 'already running'} ${pc.cyan(r.runId)}`);\n console.log(`sha: ${r.headSha}`);\n console.log(`url: ${r.url}`);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('runs')\n .description('List recent runs for a repo')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--status <status...>', 'filter by conclusion: passed, failed, running, cancelled, none')\n .option('--branch <branch...>', 'filter by branch/ref'),\n ).action(async (repo: string, opts: CommonOpts & { status?: string[]; branch?: string[] }) => {\n try {\n const { runs } = await client(opts).get<{ runs: CiRun[] }>(\n '/api/v1/actions/runs',\n { repo, status: opts.status, branch: opts.branch },\n );\n output(opts, runs, (rs) => {\n if (rs.length === 0) {\n console.log('No runs found.');\n return;\n }\n for (const run of rs) console.log(formatRunRow(run));\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('history')\n .description('Recent run history for a workflow — per-job/step failure rates (is this failure flaky?)')\n .argument('<repo>', 'repository in owner/repo format')\n .requiredOption('--workflow <path|name>', 'workflow path or name')\n .option('--branch <branch...>', 'narrow the window to branches/refs')\n .option('--job <job>', 'narrow the rollup to one job name or workflow job id')\n .option('--limit <n>', 'runs in the window (default 10, max 50)'),\n ).action(async (repo: string, opts: CommonOpts & { workflow: string; branch?: string[]; job?: string; limit?: string }) => {\n try {\n const c = client(opts);\n const { workflows } = await c.get<{ workflows: CiWorkflow[] }>(\n '/api/v1/actions/workflows',\n { repo },\n );\n const workflow = matchWorkflow(workflows, opts.workflow) ?? workflows.find((w) => w.path === opts.workflow);\n const workflowPath = workflow?.path ?? opts.workflow;\n const history = await c.get<CiRunHistory>('/api/v1/actions/history', {\n repo,\n workflow: workflowPath,\n branch: opts.branch,\n job: opts.job,\n limit: opts.limit,\n });\n output(opts, history, (h) => console.log(formatRunHistory(h)));\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('run')\n .description('Show a run: jobs, provider:region placement, placement attempts')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = client(opts);\n const run = await c.get<CiRun>(`/api/v1/actions/runs/${runId}`);\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${run.id}`;\n // A failed run's interesting part is its failure digest; on deployments\n // that have the summary route it prints inline, saving a second command.\n const summary = run.conclusion === 'failed' ? await fetchRunSummary(c, runId) : null;\n output(opts, { ...run, url, summary }, (r) => {\n console.log(formatRunDetail(r, r.url));\n if (summary && summary.failures.length > 0) {\n console.log('');\n console.log(formatRunSummary(summary));\n }\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('summary')\n .description('Show a run\\'s failure digest: failed jobs, failed steps, bounded log tails')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const summary = await client(opts).get<CiRunSummary>(`/api/v1/actions/runs/${runId}/summary`);\n output(opts, summary, (s) => console.log(formatRunSummary(s)));\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('inspect')\n .description('Inspect a run: resolved runner image, caches, secret names, concurrency, placement context')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = client(opts);\n const inspection = await c.get<CiRunInspection>(\n `/api/v1/actions/runs/${runId}/state`,\n );\n output(opts, inspection, (r) => console.log(formatRunInspection(r)));\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('logs')\n .description('Print or follow a run\\'s job logs')\n .argument('<run-id>', 'run ID')\n .option('--job <job>', 'job ID or name (default: all jobs)')\n .option('--step <step>', 'step ordinal or \"runner\" (default: whole job)')\n .option('--follow', 'stream logs while the run is live'),\n ).action(async (runId: string, opts: CommonOpts & { job?: string; step?: string; follow?: boolean }) => {\n try {\n const c = client(opts);\n let jobs = await listRunJobs(c, runId);\n if (opts.job) {\n const job = matchJob(jobs, opts.job);\n if (!job) {\n throw new Error(\n `No job \"${opts.job}\" in run ${runId}. Jobs: ${jobs.map((j) => j.name).join(', ') || 'none'}`,\n );\n }\n jobs = [job];\n }\n if (jobs.length === 0) {\n if (opts.json) output(opts, { segments: [] }, () => {});\n else console.error('Run has no jobs yet.');\n return;\n }\n\n if (!opts.follow) {\n for (const job of jobs) {\n const slice = await readWholeJobLog(c, job.id, opts.step);\n if (opts.json) {\n process.stdout.write(JSON.stringify({ jobId: job.id, name: job.name, slice }) + '\\n');\n } else {\n if (jobs.length > 1) console.log(pc.bold(`── ${job.name} ──`));\n for (const seg of slice.segments) process.stdout.write(seg.text);\n }\n }\n return;\n }\n\n if (jobs.length === 1) {\n // Single job: the slice endpoint's own SSE, resumed on reconnect.\n for await (const slice of followJobLog(c, jobs[0].id, opts.step)) {\n if (opts.json) {\n process.stdout.write(JSON.stringify(slice) + '\\n');\n } else {\n for (const seg of slice.segments) process.stdout.write(seg.text);\n }\n }\n return;\n }\n\n // Multiple jobs: one multiplexed stream, each slice tagged by job.\n for await (const { job, slice } of followRunLogs(c, runId, jobs, opts.step)) {\n if (opts.json) {\n process.stdout.write(JSON.stringify({ jobId: job.id, name: job.name, slice }) + '\\n');\n } else {\n for (const seg of slice.segments) {\n const text = seg.text.replace(/\\n/g, `\\n[${job.name}] `);\n process.stdout.write(`[${job.name}] ${text}`);\n }\n }\n }\n } catch (e) {\n fail(e);\n }\n });\n\n const providers = actions\n .command('providers')\n .description('List the org\\'s registered compute providers (regions, act/usable status)');\n common(providers).action(async (opts: CommonOpts) => {\n try {\n const data = await client(opts).get<CiProvidersResponse>('/api/v1/actions/providers');\n output(opts, data, (d) => {\n for (const p of d.providers) console.log(formatProviderRow(p));\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n providers\n .command('configure')\n .description('Save the org\\'s credential for a provider (owner/admin API key)')\n .argument('<provider>', 'provider id (e.g. tensorlake, blaxel)')\n .option('--key <key>', 'provider API key (single-field credentials)')\n .option('--field <pair...>', 'credential fields as name=value (multi-field providers)')\n .option('--verify', 'run the placement probe after saving'),\n ).action(async (provider: string, opts: CommonOpts & { key?: string; field?: string[]; verify?: boolean }) => {\n try {\n const c = client(opts);\n let body: Record<string, unknown>;\n if (opts.field !== undefined) {\n if (opts.key !== undefined) throw new Error('Pass either --key or --field, not both.');\n body = { fields: parseInputs(opts.field) };\n } else if (opts.key !== undefined) {\n body = { key: opts.key };\n } else {\n throw new Error('Pass --key <key> or --field name=value.');\n }\n const saved = await c.put<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/key`,\n body,\n );\n const verification = opts.verify\n ? await c.post<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/verify`,\n )\n : undefined;\n output(opts, verification ? { key: saved.key, verification } : saved, () => {\n console.log(`saved ${saved.key.provider} ${pc.dim(saved.key.keyHint)} ${saved.key.status}`);\n if (verification) console.log(formatVerifyResult(verification));\n });\n if (verification?.verified === false) process.exitCode = 1;\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n providers\n .command('verify')\n .description('Probe the stored provider key with a real sandbox (\"Test\" in Settings)')\n .argument('<provider>', 'provider id'),\n ).action(async (provider: string, opts: CommonOpts) => {\n try {\n const result = await client(opts).post<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/verify`,\n );\n output(opts, result, (r) => console.log(formatVerifyResult(r)));\n if (result.verified === false) process.exitCode = 1;\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n providers\n .command('remove')\n .description('Delete the org\\'s stored credential for a provider')\n .argument('<provider>', 'provider id'),\n ).action(async (provider: string, opts: CommonOpts) => {\n try {\n const result = await client(opts).del<{ provider: string; deleted: boolean }>(\n `/api/v1/actions/providers/${provider}/key`,\n );\n output(opts, result, (r) => {\n console.log(r.deleted ? `deleted ${r.provider}` : `no key stored for ${r.provider}`);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n const repos = actions\n .command('repos')\n .description('List the org\\'s connected repositories');\n common(repos).action(async (opts: CommonOpts) => {\n try {\n const data = await client(opts).get<CiReposResponse>('/api/v1/actions/repos');\n output(opts, data, (d) => {\n for (const r of d.repos) console.log(formatRepoRow(r));\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n repos\n .command('connect')\n .description('Connect a git remote (validated by a real ls-remote; lands enabled)')\n .argument('<cloneUrl>', 'http(s) or ssh git remote URL')\n .option('--name <owner/repo>', 'repo name override (default: derived from cloneUrl)')\n .option('--branch <branch>', 'default branch (default: main, else the remote\\'s first)')\n .option('--token <token>', 'credential for private http(s) remotes')\n .option('--username <user>', 'username — with --token, makes auth \"basic\" instead of \"token\"')\n .option('--ssh-key-file <path>', 'OpenSSH/PEM private key file for ssh remotes')\n .option('--known-hosts-file <path>', 'known_hosts pin for ssh remotes'),\n ).action(async (cloneUrl: string, opts: CommonOpts & { name?: string; branch?: string; token?: string; username?: string; sshKeyFile?: string; knownHostsFile?: string }) => {\n try {\n let body: Record<string, unknown>;\n if (opts.sshKeyFile !== undefined) {\n if (opts.token !== undefined || opts.username !== undefined) {\n throw new Error('Pass either --ssh-key-file or --token/--username, not both.');\n }\n body = {\n authType: 'ssh',\n credential: readFileSync(opts.sshKeyFile, 'utf8'),\n ...(opts.knownHostsFile !== undefined && {\n knownHosts: readFileSync(opts.knownHostsFile, 'utf8'),\n }),\n };\n } else if (opts.username !== undefined) {\n if (opts.token === undefined) throw new Error('--username requires --token.');\n body = { authType: 'basic', username: opts.username, credential: opts.token };\n } else if (opts.token !== undefined) {\n body = { authType: 'token', credential: opts.token };\n } else {\n body = { authType: 'none' };\n }\n if (opts.knownHostsFile !== undefined && opts.sshKeyFile === undefined) {\n throw new Error('--known-hosts-file requires --ssh-key-file.');\n }\n const result = await client(opts).post<CiRepoConnectResponse>('/api/v1/actions/repos', {\n cloneUrl,\n ...body,\n ...(opts.name !== undefined && { name: opts.name }),\n ...(opts.branch !== undefined && { defaultBranch: opts.branch }),\n });\n output(opts, result, (r) => {\n console.log(`connected ${pc.cyan(safeTerm(r.fullName))} ${pc.dim(`(${safeTerm(r.authType)}, ${safeTerm(r.defaultBranch)})`)}`);\n printDiscovery(r.discovery);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n repos\n .command('enable')\n .description('Enable a repo the org can already see (granted by a GitHub App install, or a connected remote)')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--repo-id <id>', 'scope to one row when two installations grant the same name'),\n ).action(async (repo: string, opts: CommonOpts & { repoId?: string }) => {\n try {\n const result = await client(opts).patch<CiRepoPatchResponse>('/api/v1/actions/repos', {\n fullName: repo,\n enabled: true,\n ...(opts.repoId !== undefined && { repoId: opts.repoId }),\n });\n output(opts, result, (r) => {\n console.log(`enabled ${pc.cyan(safeTerm(r.fullName))}`);\n if (r.discovery) printDiscovery(r.discovery);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n repos\n .command('disable')\n .description('Disable a repo — it stays connected but no runs are scheduled')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--repo-id <id>', 'scope to one row when two installations grant the same name'),\n ).action(async (repo: string, opts: CommonOpts & { repoId?: string }) => {\n try {\n const result = await client(opts).patch<CiRepoPatchResponse>('/api/v1/actions/repos', {\n fullName: repo,\n enabled: false,\n ...(opts.repoId !== undefined && { repoId: opts.repoId }),\n });\n output(opts, result, (r) => console.log(`disabled ${pc.cyan(safeTerm(r.fullName))}`));\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('cancel')\n .description('Cancel a run')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const result = await client(opts).post<{ cancelled: boolean }>(\n `/api/v1/actions/runs/${runId}/cancel`,\n );\n output(opts, result, (r) => {\n console.log(r.cancelled ? `Cancelled ${runId}` : `Run ${runId} was already finished`);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('rerun')\n .description('Re-run a finished run at the same commit')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = client(opts);\n const result = await c.post<{ runId: string; created: boolean }>(\n `/api/v1/actions/runs/${runId}/rerun`,\n );\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${result.runId}`;\n output(opts, { ...result, url }, (r) => {\n console.log(`${r.created ? 'rerun dispatched' : 'rerun already running'} ${pc.cyan(r.runId)}`);\n console.log(`url: ${r.url}`);\n });\n } catch (e) {\n fail(e);\n }\n });\n\n common(\n actions\n .command('artifacts')\n .description('List or download a run\\'s artifacts')\n .argument('<run-id>', 'run ID')\n .option('--job <job>', 'job ID or name (default: all jobs)')\n .option('--out <dir>', 'download artifacts into this directory instead of listing'),\n ).action(async (runId: string, opts: CommonOpts & { job?: string; out?: string }) => {\n try {\n const c = client(opts);\n let jobs = await listRunJobs(c, runId);\n if (opts.job) {\n const job = matchJob(jobs, opts.job);\n if (!job) throw new Error(`No job \"${opts.job}\" in run ${runId}.`);\n jobs = [job];\n }\n const entries: { job: CiJob; artifacts: CiArtifactListItem[] }[] = [];\n for (const job of jobs) {\n const artifacts = await c.get<CiArtifactListItem[]>(\n `/api/v1/actions/jobs/${job.id}/artifacts`,\n );\n entries.push({ job, artifacts });\n }\n\n if (opts.out) {\n const written: { jobId: string; id: string; file: string }[] = [];\n for (const { job, artifacts } of entries) {\n // Per-job directory: artifact names are not unique across jobs.\n const jobDir = join(opts.out, sanitizePathPart(job.name || job.id));\n mkdirSync(jobDir, { recursive: true });\n for (const artifact of artifacts) {\n if (artifact.expired || artifact.skippedReason) continue;\n const bytes = await c.download(\n `/api/v1/actions/jobs/${job.id}/artifacts/${artifact.id}`,\n );\n const file = join(jobDir, sanitizePathPart(artifact.fileName || artifact.name));\n writeFileSync(file, bytes);\n written.push({ jobId: job.id, id: artifact.id, file });\n }\n }\n output(opts, written, (ws) => {\n for (const w of ws) console.log(`wrote ${w.file}`);\n if (ws.length === 0) console.log('No downloadable artifacts.');\n });\n return;\n }\n\n output(opts, entries.map((e) => ({ jobId: e.job.id, job: e.job.name, artifacts: e.artifacts })), (es) => {\n let any = false;\n for (const { job, artifacts } of es) {\n for (const a of artifacts) {\n any = true;\n const flags = a.expired ? ' expired' : a.skippedReason ? ` skipped: ${a.skippedReason}` : '';\n console.log(\n `${job} ${a.id} ${a.name} ${a.contentType} ${a.byteLength}B${flags}`,\n );\n }\n }\n if (!any) console.log('No artifacts.');\n });\n } catch (e) {\n fail(e);\n }\n });\n}\n","/**\n * Thin client for the benchmarks-platform Actions v1 API.\n * Types mirror the wire shapes in benchmarks-platform `lib/ci/types.ts` —\n * keep them in sync by hand; the API is the contract.\n */\n\nexport const DEFAULT_BASE_URL = 'https://platform.computesdk.com';\n\nexport interface ActionsAuth {\n apiKey: string;\n baseUrl: string;\n}\n\nexport interface CiWorkflowInput {\n name: string;\n description: string;\n type: 'string' | 'number' | 'boolean' | 'choice' | 'environment';\n required: boolean;\n default: string;\n options?: string[];\n}\n\nexport interface CiWorkflow {\n id: string;\n repoFullName: string;\n name: string;\n path: string;\n dispatchable: boolean;\n refs: string[];\n inputs: CiWorkflowInput[];\n schedules: unknown[];\n}\n\nexport type CiConclusion = 'passed' | 'failed' | 'running' | 'cancelled' | 'none';\nexport type CiJobState =\n | 'queued'\n | 'running'\n | 'passed'\n | 'failed'\n | 'skipped'\n | 'cancelled';\n\nexport interface CiPlacementAttempt {\n provider: string;\n region?: string | null;\n error: string;\n}\n\nexport interface CiStep {\n name: string;\n state: CiJobState;\n durationMs: number | null;\n exitCode: number | null;\n}\n\nexport interface CiJob {\n id: string;\n name: string;\n needs: string[];\n workflowJobId: string | null;\n matrix: Record<string, string> | null;\n state: CiJobState;\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n placementAttempts: CiPlacementAttempt[];\n durationMs: number | null;\n steps: CiStep[];\n}\n\nexport interface CiRun {\n id: string;\n repoFullName: string;\n ref: string;\n branchReason: string | null;\n headSha: string;\n event: string;\n prNumber: number | null;\n runNumber: number | null;\n title: string;\n workflowPath: string;\n workflowName: string;\n conclusion: CiConclusion;\n startedAt: string;\n durationMs: number | null;\n supersededByRunId: string | null;\n concurrencyGroup: string | null;\n cancellationReason: string | null;\n /** `provider[:region]` the dispatch pinned this run to, else null. */\n providerOverride?: string | null;\n jobs: CiJob[];\n logTail: string[];\n}\n\n/**\n * One job of `GET /api/v1/actions/runs/{id}/state`: the live fields plus the\n * context that decided how the job ran — resolved runner image, container\n * pin, concurrency group, timeout/fetch-depth overrides.\n */\nexport interface CiJobInspection {\n id: string;\n name: string;\n state: CiJobState;\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n placementAttempts: CiPlacementAttempt[];\n /** Why the platform failed the job before steps ran, when it did. */\n failureReason: string | null;\n /** The `runs-on:` labels as declared. */\n runsOn: string[];\n /** The `computesdk:` placement pin the labels carried, when one did. */\n placementHint: { provider: string; region: string | null; label: string } | null;\n /** Labels act actually read (placement labels stripped, default substituted). */\n resolvedRunsOn: string[] | null;\n runsOnHasExpression: boolean;\n /** The image the job's steps ran in: container pin, else the mapped label. */\n runnerImage: string | null;\n /** The literal `container:` image the job declared, if any. */\n container: string | null;\n timeoutMinutes: number | null;\n /** Deepest `fetch-depth` a checkout step pinned (0 = full history). */\n fetchDepth: number | null;\n concurrencyGroup: string | null;\n concurrencyCancelInProgress: boolean;\n matrix: Record<string, string> | null;\n steps: {\n ordinal: number;\n name: string;\n state: CiJobState;\n exitCode: number | null;\n startedAt: string | null;\n finishedAt: string | null;\n }[];\n}\n\n/** A cache entry the run's window touched (saved or restored). */\nexport interface CiRunCacheTouch {\n key: string;\n version: string;\n scopeRef: string;\n sizeBytes: number;\n savedAt: string | null;\n restoredAt: string | null;\n}\n\n/** `GET /api/v1/actions/runs/{id}/state` — a run plus its effective context. */\nexport interface CiRunInspection {\n id: string;\n conclusion: CiConclusion;\n runNumber: number | null;\n ref: string;\n headSha: string;\n event: string;\n queuedAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n supersededByRunId: string | null;\n cancellationReason: string | null;\n /** Why the run was refused before placement, when it was. */\n blockedReason: string | null;\n concurrencyGroup: string | null;\n dispatchInputs: Record<string, string> | null;\n providerOverride: string | null;\n /** The commit the stored workflow definition was parsed from. */\n workflowParsedFromSha: string | null;\n /**\n * True when the stored parse came from a different commit than the run's\n * head — the definition-derived fields may then describe a newer workflow\n * than the run used (a fork pull request always shows this by design).\n */\n definitionStale: boolean;\n /** Secret *names* the jobs could reference — never values. */\n secrets: {\n access: 'declared' | 'all';\n /** Whether named secrets are also exported as job env vars. */\n env: boolean;\n names: string[];\n } | null;\n caches: CiRunCacheTouch[];\n jobs: CiJobInspection[];\n}\n\n/**\n * `GET /api/v1/actions/runs/{runId}/summary` — a run's failure digest.\n * Wire shape mirrors `CiRunSummary` in benchmarks-platform `lib/ci/run-summary.ts`.\n */\nexport interface CiRunSummaryJob {\n id: string;\n name: string;\n conclusion: CiJobState;\n provider: string | null;\n region: string | null;\n}\n\nexport interface CiRunSummaryFailedStep {\n ordinal: number;\n name: string;\n exitCode: number | null;\n}\n\nexport interface CiRunSummaryFailure extends CiRunSummaryJob {\n failureReason: string | null;\n failedSteps: CiRunSummaryFailedStep[];\n excerpt: {\n stepOrdinal: number | null;\n text: string;\n truncated: boolean;\n } | null;\n}\n\nexport interface CiRunSummary {\n runId: string;\n conclusion: CiConclusion;\n jobs: CiRunSummaryJob[];\n failures: CiRunSummaryFailure[];\n}\n\nexport interface CiArtifactListItem {\n id: string;\n name: string;\n fileName: string;\n contentType: string;\n byteLength: number;\n fileCount: number;\n skippedReason: string | null;\n expiresAt: string;\n expired: boolean;\n}\n\nexport interface CiLogSegment {\n byteOffset: number;\n stream: 'stdout' | 'stderr';\n stepOrdinal: number | null;\n text: string;\n}\n\n/** One resumable read of a job log. Resume from `nextOffset`. */\nexport interface CiLogSlice {\n jobId: string;\n fromOffset: number;\n nextOffset: number;\n totalBytes: number;\n segments: CiLogSegment[];\n state: 'running' | 'complete' | 'failed' | 'cancelled' | 'expired' | 'pending';\n truncated: boolean;\n}\n\nexport interface CiProviderInfo {\n provider: string;\n /** Selectable regions for `provider:region` order entries; empty when unknown. */\n regions: string[];\n credential: 'ambient' | 'configured' | 'not-configured';\n /** In the effective act set: built-ins, CI_ACT_PROVIDERS override, act-probe-verified keys. */\n actCapable: boolean;\n /** A placement reaching the provider finds credentials. */\n usable: boolean;\n /** 1-based position in the effective provider order, null when absent. */\n position: number | null;\n}\n\nexport interface CiProvidersResponse {\n providerOrder: string[];\n providers: CiProviderInfo[];\n}\n\n/** A saved provider credential — never carries key material, only the hint. */\nexport interface CiProviderKeyRecord {\n provider: string;\n keyHint: string;\n lastCheckedAt: string | null;\n status: 'connected' | 'error' | 'unconfigured';\n statusDetail: string | null;\n actCapable: boolean;\n credential: 'key';\n fields: unknown[];\n}\n\nexport interface CiProviderKeyResponse {\n key: CiProviderKeyRecord;\n /** Present on the verify response. */\n verified?: boolean;\n}\n\n/** One failed job inside a run-history entry — step is the first failed step. */\nexport interface CiRunJobFailure {\n job: string;\n workflowJobId: string | null;\n step: string | null;\n stepOrdinal: number | null;\n}\n\nexport interface CiRunHistoryEntry {\n id: string;\n ref: string;\n headSha: string;\n runNumber: number | null;\n conclusion: CiConclusion;\n startedAt: string;\n failedJobs: CiRunJobFailure[];\n}\n\nexport interface CiJobHistory {\n job: string;\n /** The workflow job key, when recorded; disambiguates same-named jobs. */\n workflowJobId: string | null;\n /** Runs in the window that contained this job. */\n runs: number;\n failedRuns: number;\n /** Runs where the job failed with no step blamed (platform failures). */\n failedBeforeSteps: number;\n steps: { step: string; ordinal: number; failedRuns: number }[];\n}\n\n/** `GET /api/v1/actions/history` — the window plus the rollup over it. */\nexport interface CiRunHistory {\n runCount: number;\n conclusions: Partial<Record<CiConclusion, number>>;\n jobs: CiJobHistory[];\n runs: CiRunHistoryEntry[];\n}\n\nexport interface ActionsOrg {\n organizationId: string;\n name: string;\n slug: string;\n}\n\n/**\n * One row of `GET /api/v1/actions/repos`: a repo the org can run CI on,\n * GitHub-App-granted or a generic git remote.\n */\nexport interface CiRepo {\n repoId: string;\n fullName: string;\n defaultBranch: string;\n enabled: boolean;\n private: boolean;\n forkPullRequests: boolean;\n /** `github_app` for App-granted repos; `none`/`token`/`basic`/`ssh` for remotes. */\n authType: string;\n cloneUrl: string | null;\n githubInstallationId: number | null;\n workflowPaths: string[];\n disabledWorkflowCount: number;\n lastPolledAt: string | null;\n lastPollError: string | null;\n}\n\nexport interface CiReposResponse {\n repos: CiRepo[];\n}\n\n/** What an enable/remote-connect discovered before answering. */\nexport interface CiRepoDiscovery {\n workflowsFound: boolean;\n seeded: boolean;\n error: string | null;\n}\n\nexport interface CiRepoConnectResponse {\n repoId: string | null;\n fullName: string;\n defaultBranch: string;\n authType: string;\n discovery: CiRepoDiscovery;\n}\n\nexport interface CiRepoPatchResponse {\n fullName: string;\n enabled?: boolean;\n forkPullRequests?: boolean;\n discovery: CiRepoDiscovery | null;\n}\n\nexport class ActionsApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public body?: unknown,\n ) {\n super(message);\n this.name = 'ActionsApiError';\n }\n}\n\nexport class ActionsClient {\n private orgPromise: Promise<ActionsOrg> | null = null;\n\n constructor(\n private readonly auth: ActionsAuth,\n private readonly fetchImpl: typeof fetch = fetch,\n ) {}\n\n get baseUrl(): string {\n return this.auth.baseUrl;\n }\n\n /** The credential's org — fetched once, needed for dashboard URLs. */\n org(): Promise<ActionsOrg> {\n this.orgPromise ??= this.get<ActionsOrg>('/api/v1/actions/org');\n return this.orgPromise;\n }\n\n async get<T>(path: string, params?: Record<string, string | string[] | undefined>): Promise<T> {\n const url = new URL(`${this.auth.baseUrl}${path}`);\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue;\n for (const v of Array.isArray(value) ? value : [value]) url.searchParams.append(key, v);\n }\n const res = await this.fetchImpl(url, { headers: this.headers() });\n return this.parse<T>(res);\n }\n\n async post<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'POST',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async put<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'PUT',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async patch<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'PATCH',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async del<T>(path: string): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'DELETE',\n headers: this.headers(),\n });\n return this.parse<T>(res);\n }\n\n /**\n * One `data:` JSON payload per SSE event. `next()` resolves to the payload,\n * or null when the stream ends. Call `close()` to abort.\n */\n async *sse(path: string, params?: Record<string, string | string[] | undefined>): AsyncGenerator<unknown> {\n const url = new URL(`${this.auth.baseUrl}${path}`);\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue;\n for (const v of Array.isArray(value) ? value : [value]) url.searchParams.append(key, v);\n }\n const res = await this.fetchImpl(url, { headers: this.headers() });\n if (!res.ok) {\n await this.parse(res); // throws\n }\n if (!res.body) throw new Error('SSE response has no body');\n yield* readSseEvents(res.body);\n }\n\n /** Download bytes following redirects (artifact URLs 302 to storage). */\n async download(path: string): Promise<Uint8Array> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n headers: this.headers(),\n redirect: 'follow',\n });\n if (!res.ok) {\n const body = await res.json().catch(() => undefined);\n throw new ActionsApiError(res.status, errorMessage(body, res.status), body);\n }\n return new Uint8Array(await res.arrayBuffer());\n }\n\n private headers(): Record<string, string> {\n return { authorization: `Bearer ${this.auth.apiKey}` };\n }\n\n private async parse<T>(res: Response): Promise<T> {\n const body = await res.json().catch(() => undefined);\n if (!res.ok) throw new ActionsApiError(res.status, errorMessage(body, res.status), body);\n return body as T;\n }\n}\n\nfunction errorMessage(body: unknown, status: number): string {\n if (body && typeof body === 'object' && 'error' in body && typeof (body as { error: unknown }).error === 'string') {\n return (body as { error: string }).error;\n }\n return `Request failed with status ${status}`;\n}\n\n/** Minimal SSE reader: yields the JSON payload of each `data:` event. */\nexport async function* readSseEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const event = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n for (const line of event.split('\\n')) {\n if (line.startsWith('data: ')) {\n yield JSON.parse(line.slice(6));\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/** `id:jobId:step:offset` — the run-stream watch cursor wire format. */\nexport function encodeWatchCursor(\n id: string,\n jobId: string,\n step: number | 'runner' | null,\n offset: number,\n): string {\n const stepPart = step === null ? '-' : step === 'runner' ? 'runner' : String(step);\n return `${id}:${jobId}:${stepPart}:${offset}`;\n}\n\nexport function resolveActionsAuth(opts: {\n apiKey?: string;\n baseUrl?: string;\n allowUntrustedHost?: boolean;\n}): ActionsAuth {\n // `||` not `??`: empty-string env vars (common in CI matrices) should fall\n // through to the next source, not count as configured.\n const apiKey =\n opts.apiKey ||\n process.env.COMPUTE_API_KEY ||\n process.env.BENCHMARKS_PLATFORM_API_KEY; // legacy name\n if (!apiKey) {\n throw new Error(\n 'No API key. Set COMPUTE_API_KEY or pass --api-key.',\n );\n }\n const baseUrl = (\n opts.baseUrl ||\n process.env.COMPUTE_PLATFORM_URL ||\n process.env.BENCHMARKS_PLATFORM_URL || // legacy name\n DEFAULT_BASE_URL\n ).replace(/\\/+$/, '');\n\n // The bearer key is attached to every request, so an attacker-controlled\n // --base-url would exfiltrate it. Only trusted hosts are allowed silently;\n // anything else must be opted into with --allow-untrusted-host.\n if (!opts.allowUntrustedHost && !isTrustedActionsHost(baseUrl)) {\n throw new Error(\n `Refusing to send the API key to ${baseUrl} — it is not a computesdk.com or localhost host. ` +\n 'If this is a self-hosted/dev deployment you trust, pass --allow-untrusted-host.',\n );\n }\n return { apiKey, baseUrl };\n}\n\n/** computesdk.com (and subdomains) or localhost — safe to receive the API key. */\nexport function isTrustedActionsHost(baseUrl: string): boolean {\n let host: string;\n try {\n host = new URL(baseUrl).hostname;\n } catch {\n return false;\n }\n return (\n host === 'computesdk.com' ||\n host.endsWith('.computesdk.com') ||\n host === 'localhost' ||\n host === '127.0.0.1' ||\n host === '::1'\n );\n}\n","/**\n * Browser-based CLI authentication flow\n *\n * Precedence: env var > stored credentials > browser auth flow\n */\n\nimport * as http from 'node:http';\nimport * as crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\n\nfunction getCredentialsDir(): string {\n return path.join(os.homedir(), '.computesdk');\n}\n\nfunction getCredentialsFile(): string {\n return path.join(getCredentialsDir(), 'credentials.json');\n}\n\nconst AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst CONSOLE_AUTH_URL = 'https://console.computesdk.com/cli/auth';\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html>\n<head><title>ComputeSDK CLI</title></head>\n<body style=\"font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1>Authenticated</h1>\n <p>You can close this tab and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n\n/**\n * Load stored credentials from ~/.computesdk/credentials.json.\n * Returns the API key if found and valid, or null.\n */\nexport function loadStoredCredentials(): string | null {\n try {\n if (!fs.existsSync(getCredentialsFile())) {\n return null;\n }\n const raw = fs.readFileSync(getCredentialsFile(), 'utf-8');\n const data = JSON.parse(raw);\n if (typeof data.apiKey === 'string' && data.apiKey.length > 0) {\n return data.apiKey;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Store credentials to ~/.computesdk/credentials.json.\n * Creates ~/.computesdk/ directory if it doesn't exist.\n */\nexport function storeCredentials(apiKey: string): void {\n if (!fs.existsSync(getCredentialsDir())) {\n fs.mkdirSync(getCredentialsDir(), { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(\n getCredentialsFile(),\n JSON.stringify({ apiKey }, null, 2) + '\\n',\n { mode: 0o600 }\n );\n}\n\n/**\n * Delete stored credentials file.\n */\nexport function clearStoredCredentials(): void {\n try {\n if (fs.existsSync(getCredentialsFile())) {\n fs.unlinkSync(getCredentialsFile());\n }\n } catch {\n // Ignore - file may not exist or may not be writable\n }\n}\n\n/**\n * Open a URL in the user's default browser.\n * Falls back to printing the URL if the browser fails to open.\n */\nfunction openBrowser(url: string): void {\n const command =\n process.platform === 'darwin'\n ? `open \"${url}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(command, (err) => {\n if (err) {\n p.log.warn('Could not open browser automatically.');\n p.log.info(`Open this URL manually:\\n ${pc.cyan(url)}`);\n }\n });\n}\n\nexport interface AuthFlowOptions {\n /** Override timeout for tests */\n timeoutMs?: number;\n /** Callback when server is listening (for tests) */\n onServerReady?: (port: number, state: string) => void;\n /** Skip opening browser (for tests) */\n skipBrowserOpen?: boolean;\n}\n\n/**\n * Run the browser-based authentication flow.\n *\n * 1. Start a local HTTP server on a random port\n * 2. Open browser to console.computesdk.com/cli/auth\n * 3. Wait for callback with token and validated state\n * 4. Return the API key\n */\nexport function runBrowserAuthFlow(options?: AuthFlowOptions): Promise<string> {\n const timeoutMs = options?.timeoutMs ?? AUTH_TIMEOUT_MS;\n const state = crypto.randomBytes(32).toString('hex');\n\n return new Promise<string>((resolve, reject) => {\n const server = http.createServer();\n\n const timeout = setTimeout(() => {\n server.close();\n reject(\n new Error('Authentication timed out after 5 minutes. Please try again.')\n );\n }, timeoutMs);\n\n server.on('request', (req, res) => {\n const url = new URL(req.url || '/', 'http://localhost');\n\n if (req.method !== 'GET' || url.pathname !== '/callback') {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n return;\n }\n\n const receivedState = url.searchParams.get('state');\n const token = url.searchParams.get('token');\n\n if (receivedState !== state) {\n res.writeHead(403, { 'Content-Type': 'text/plain' });\n res.end('Error: State mismatch. Please try authenticating again.');\n return;\n }\n\n if (!token) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Error: No token received.');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n\n clearTimeout(timeout);\n server.close();\n resolve(token);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n if (!addr || typeof addr === 'string') {\n clearTimeout(timeout);\n server.close();\n reject(new Error('Failed to start auth server'));\n return;\n }\n\n const port = addr.port;\n const authUrl = `${CONSOLE_AUTH_URL}?port=${port}&state=${state}`;\n\n if (options?.onServerReady) {\n options.onServerReady(port, state);\n }\n\n if (!options?.skipBrowserOpen) {\n openBrowser(authUrl);\n }\n });\n\n server.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`Auth server error: ${err.message}`));\n });\n });\n}\n\n/**\n * Resolve an API key through the precedence chain:\n * env var > stored credentials > browser auth flow\n */\nexport async function resolveApiKey(options?: {\n forceLogin?: boolean;\n}): Promise<string> {\n // 1. Check environment variable (highest precedence)\n if (process.env.COMPUTESDK_API_KEY) {\n return process.env.COMPUTESDK_API_KEY;\n }\n\n // 2. Check stored credentials (skip if forcing re-auth)\n if (!options?.forceLogin) {\n const stored = loadStoredCredentials();\n if (stored) {\n p.log.info(\n `Using stored credentials from ${pc.dim('~/.computesdk/credentials.json')}`\n );\n return stored;\n }\n }\n\n // 3. Run browser auth flow\n p.log.info('No API key found. Starting browser authentication...');\n\n const spinner = p.spinner();\n spinner.start('Waiting for browser authentication...');\n\n try {\n const apiKey = await runBrowserAuthFlow();\n spinner.stop('Authentication successful');\n\n // Store for next time\n try {\n storeCredentials(apiKey);\n p.log.success(\n `Credentials saved to ${pc.dim('~/.computesdk/credentials.json')}`\n );\n } catch {\n p.log.warn('Could not save credentials to disk. You may need to authenticate again next time.');\n }\n\n return apiKey;\n } catch (error) {\n spinner.stop(pc.red('Authentication failed'));\n throw error;\n }\n}\n","/**\n * Shared setup logic for CLI commands\n *\n * Resolves authentication and configures the compute client\n * for a given provider. Used by both subcommands and the REPL.\n */\n\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { compute } from 'computesdk';\nimport { detectAvailableProviders, getProviderStatus, buildProviderConfig, type ProviderStatus } from './providers.js';\nimport { resolveApiKey } from './auth.js';\n\n/**\n * Authenticate and set COMPUTESDK_API_KEY in the environment.\n * Exits the process on failure.\n */\nexport async function ensureAuth(options?: { forceLogin?: boolean }): Promise<void> {\n try {\n const apiKey = await resolveApiKey({ forceLogin: options?.forceLogin });\n process.env.COMPUTESDK_API_KEY = apiKey;\n } catch (error) {\n p.log.error((error as Error).message);\n p.log.info(`Get your API key at ${pc.cyan('https://console.computesdk.com')}`);\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n}\n\n/**\n * Resolve which provider to use.\n *\n * If `--provider` is given, validates it's configured and returns it.\n * If `interactive` is true and multiple providers are available, prompts user.\n * In non-interactive mode, requires `--provider` when multiple are configured.\n * Exits the process if no providers are available.\n */\nexport async function resolveProvider(\n providerFlag?: string,\n options?: { interactive?: boolean },\n): Promise<string> {\n const interactive = options?.interactive ?? false;\n const available = detectAvailableProviders();\n const providerStatus = getProviderStatus();\n\n if (providerFlag) {\n const match = providerStatus.find(\n (s: ProviderStatus) => s.name.toLowerCase() === providerFlag.toLowerCase(),\n );\n\n if (!match) {\n p.log.error(`Unknown provider: ${providerFlag}`);\n p.log.info(`Available providers: ${providerStatus.map((s: ProviderStatus) => s.name).join(', ')}`);\n process.exit(1);\n }\n\n if (!match.ready) {\n p.log.error(`Provider ${providerFlag} is not configured`);\n if (match.missing.length > 0) {\n p.log.info(`Missing env vars: ${match.missing.join(', ')}`);\n }\n process.exit(1);\n }\n\n return match.name;\n }\n\n if (available.length === 0) {\n p.log.error('No provider credentials detected');\n p.log.info('Set one of: E2B_API_KEY, MODAL_TOKEN_ID, RAILWAY_API_KEY, etc.');\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n\n // Single provider — no ambiguity\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple providers — interactive mode can prompt, non-interactive must fail\n if (!interactive) {\n p.log.error('Multiple providers configured. Use --provider to specify one.');\n p.log.info(`Available: ${available.join(', ')}`);\n process.exit(1);\n }\n\n const providerOptions = providerStatus\n .filter((status: ProviderStatus) => status.ready)\n .map((status: ProviderStatus) => ({\n value: status.name,\n label: status.name,\n }));\n\n const provider = await p.select({\n message: 'Select provider',\n options: providerOptions,\n });\n\n if (p.isCancel(provider)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n return provider as string;\n}\n\n/**\n * Configure the compute client for a provider.\n * Must be called after ensureAuth().\n */\nexport function configureCompute(provider: string): void {\n const config = buildProviderConfig(provider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compute.setConfig(config as any);\n}\n"],"mappings":"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","names":["path","pc","compute","fs","path","os","p","pc","sandbox","spinner","output","p","pc","readFileSync","fileURLToPath","dirname","join","compute","path","client","p","program","text","fs","path","os","pc","spinner","p","pc","compute","pc","compute","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc","spinner","compute","saveSandbox","loadState","saveState","shellEscape"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.0_jiti@2.6.1_postcss@8.5.6_tsx@4.20.3_typescript@5.8.3_yaml@2.8.2/node_modules/tsup/assets/esm_shims.js","../src/repl.ts","../src/workspace-cli.ts","../src/index.ts","../src/providers.ts","../src/actions.ts","../src/actions-client.ts","../src/auth.ts","../src/setup.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * REPL Mode - Run commands one at a time\n *\n * Shell-like interface where each line is executed as a command.\n * Special commands prefixed with /.\n */\n\nimport * as readline from 'readline';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport pc from 'picocolors';\nimport { compute, type SandboxInterface } from 'computesdk';\n\ntype SessionResult = 'exit';\n\ninterface ReplContext {\n sandboxes: Map<string, SandboxInterface>;\n activeSandboxId: string;\n}\n\n/**\n * Start REPL mode.\n */\nexport async function startREPL(sandbox: SandboxInterface, provider: string): Promise<void> {\n // Mark provider as used - reserved for future provider-specific REPL behavior\n void provider;\n const ctx: ReplContext = {\n sandboxes: new Map([[sandbox.sandboxId, sandbox]]),\n activeSandboxId: sandbox.sandboxId,\n };\n\n await runSession(ctx);\n}\n\nfunction buildPrompt(sandboxId: string): string {\n if (!sandboxId) return pc.gray('[no sandbox] ') + pc.bold('$ ');\n return pc.cyan(`[${sandboxId}] `) + pc.bold('$ ');\n}\n\n/**\n * Run a single REPL session.\n *\n * Creates a readline interface, processes commands, and returns\n * 'exit' when the user wants to quit.\n */\nfunction runSession(ctx: ReplContext): Promise<SessionResult> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: buildPrompt(ctx.activeSandboxId),\n terminal: true,\n historySize: 1000,\n });\n\n // Load history\n loadHistory(rl);\n\n return new Promise<SessionResult>((resolve) => {\n let resolved = false;\n const done = (result: SessionResult) => {\n if (resolved) return;\n resolved = true;\n rl.close();\n resolve(result);\n };\n\n rl.on('SIGINT', () => {\n console.log();\n rl.prompt();\n });\n\n rl.on('close', () => {\n done('exit');\n });\n\n rl.on('line', async (line: string) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === '.exit') {\n done('exit');\n return;\n }\n\n // Save to history\n saveToHistory(trimmed);\n\n try {\n if (trimmed.startsWith('/')) {\n const result = await handleSpecialCommand(ctx, trimmed, rl);\n if (result === 'exit') {\n done(result);\n return;\n }\n } else if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n } else {\n const sandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n await executeCommand(sandbox, trimmed);\n }\n } catch (error) {\n console.log(pc.red(`✗ ${(error as Error).message}`));\n }\n\n if (!resolved) {\n rl.prompt();\n }\n });\n\n rl.prompt();\n });\n}\n\n/**\n * Execute a shell command in the sandbox\n */\nasync function executeCommand(sandbox: SandboxInterface, command: string): Promise<void> {\n const result = await sandbox.runCommand(command);\n\n // Print stdout\n if (result.stdout) {\n process.stdout.write(result.stdout);\n if (!result.stdout.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Print stderr in red\n if (result.stderr) {\n process.stderr.write(pc.red(result.stderr));\n if (!result.stderr.endsWith('\\n')) {\n console.log();\n }\n }\n\n // Show exit code if non-zero\n if (result.exitCode !== 0) {\n console.log(pc.gray(`exit code: ${result.exitCode}`));\n }\n}\n\n/**\n * Handle special commands (prefixed with /)\n * Returns 'exit' to quit, or null to continue\n */\nasync function handleSpecialCommand(\n ctx: ReplContext,\n input: string,\n rl: readline.Interface,\n): Promise<SessionResult | null> {\n const [cmd, ...args] = input.slice(1).split(/\\s+/);\n\n switch (cmd.toLowerCase()) {\n case 'help':\n case 'h':\n case '?':\n showHelp();\n return null;\n\n case 'info':\n case 'i': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n console.log();\n console.log(pc.bold(' Sandbox Info'));\n console.log(` ID: ${pc.cyan(activeSandbox.sandboxId)}`);\n console.log();\n return null;\n }\n\n case 'url':\n case 'u': {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow('No active sandbox. Use /new to create one.'));\n return null;\n }\n const activeSandbox = ctx.sandboxes.get(ctx.activeSandboxId)!;\n if (args.length === 0) {\n console.log(pc.gray('Usage: /url <port>'));\n } else {\n const port = parseInt(args[0], 10);\n if (isNaN(port)) {\n console.log(pc.red('Invalid port number'));\n } else {\n const url = await activeSandbox.getUrl({ port });\n console.log(pc.cyan(url));\n }\n }\n return null;\n }\n\n case 'new': {\n console.log(pc.gray(' Creating new sandbox...'));\n const newSandbox = await compute.sandbox.create();\n ctx.sandboxes.set(newSandbox.sandboxId, newSandbox);\n ctx.activeSandboxId = newSandbox.sandboxId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Sandbox ready: ${pc.cyan(newSandbox.sandboxId)}`);\n console.log(` ${pc.gray(`Active sandboxes: ${ctx.sandboxes.size}`)}`);\n return null;\n }\n\n case 'destroy': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /destroy <sandbox-id> or /destroy --all'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n if (args[0] === '--all') {\n if (ctx.sandboxes.size === 0) {\n console.log(pc.yellow(' No sandboxes to destroy.'));\n return null;\n }\n const count = ctx.sandboxes.size;\n console.log(pc.gray(` Destroying ${count} sandbox${count > 1 ? 'es' : ''}...`));\n await Promise.all(\n Array.from(ctx.sandboxes.values()).map(s => s.destroy()),\n );\n ctx.sandboxes.clear();\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Destroyed ${pc.cyan(String(count))} sandbox${count > 1 ? 'es' : ''}`);\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n return null;\n }\n const targetId = args[0];\n const target = ctx.sandboxes.get(targetId);\n if (!target) {\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(targetId));\n if (matches.length === 1) {\n return destroySandbox(ctx, matches[0], rl);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${targetId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n return destroySandbox(ctx, targetId, rl);\n }\n\n case 'list':\n case 'ls': {\n console.log();\n console.log(pc.bold(' Sandboxes'));\n for (const id of ctx.sandboxes.keys()) {\n const marker = id === ctx.activeSandboxId ? pc.green(' ●') : ' ';\n console.log(` ${marker} ${pc.cyan(id)}`);\n }\n console.log();\n return null;\n }\n\n case 'switch':\n case 'sw': {\n if (args.length === 0) {\n console.log(pc.gray('Usage: /switch <sandbox-id>'));\n console.log(pc.gray('Use /list to see all sandboxes'));\n return null;\n }\n const switchId = args[0];\n if (ctx.sandboxes.has(switchId)) {\n ctx.activeSandboxId = switchId;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(switchId)}`);\n return null;\n }\n // Try partial match\n const matches = Array.from(ctx.sandboxes.keys()).filter(id => id.startsWith(switchId));\n if (matches.length === 1) {\n ctx.activeSandboxId = matches[0];\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(matches[0])}`);\n } else if (matches.length > 1) {\n console.log(pc.yellow(' Ambiguous ID. Matches:'));\n for (const id of matches) {\n console.log(` ${pc.cyan(id)}`);\n }\n } else {\n console.log(pc.red(` Sandbox not found: ${switchId}`));\n console.log(pc.gray(' Use /list to see all sandboxes'));\n }\n return null;\n }\n\n case 'exit':\n case 'quit':\n case 'q':\n return 'exit';\n\n default:\n console.log(pc.yellow(`Unknown command: /${cmd}`));\n console.log(pc.gray('Type /help for available commands'));\n return null;\n }\n}\n\n/**\n * Destroy a sandbox by ID and update context\n */\nasync function destroySandbox(\n ctx: ReplContext,\n sandboxId: string,\n rl: readline.Interface,\n): Promise<null> {\n const target = ctx.sandboxes.get(sandboxId)!;\n console.log(pc.gray(` Destroying ${sandboxId}...`));\n await target.destroy();\n ctx.sandboxes.delete(sandboxId);\n console.log(` Destroyed ${pc.cyan(sandboxId)}`);\n\n // If we destroyed the active sandbox, switch to another\n if (ctx.activeSandboxId === sandboxId && ctx.sandboxes.size > 0) {\n ctx.activeSandboxId = ctx.sandboxes.keys().next().value!;\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(` Switched to ${pc.cyan(ctx.activeSandboxId)}`);\n } else if (ctx.sandboxes.size === 0) {\n ctx.activeSandboxId = '';\n rl.setPrompt(buildPrompt(ctx.activeSandboxId));\n console.log(pc.yellow(' No sandboxes remaining. Use /new to create one or /exit to quit.'));\n }\n\n return null;\n}\n\n/**\n * Show help message\n */\nfunction showHelp(): void {\n console.log();\n console.log(pc.bold(' Shell Mode'));\n console.log(pc.gray(' Just type commands - they run in the active sandbox'));\n console.log();\n console.log(pc.white(' ls -la'));\n console.log(pc.white(' cat /etc/os-release'));\n console.log(pc.white(' npm install lodash'));\n console.log();\n console.log(pc.bold(' Sandbox Commands') + pc.gray(' (prefix with /)'));\n console.log();\n console.log(pc.cyan(' /new') + pc.gray(' Create a new sandbox and switch to it'));\n console.log(pc.cyan(' /list') + pc.gray(' List all sandboxes'));\n console.log(pc.cyan(' /switch <id>') + pc.gray(' Switch active sandbox'));\n console.log(pc.cyan(' /destroy <id>') + pc.gray(' Destroy a sandbox by ID'));\n console.log(pc.cyan(' /destroy --all') + pc.gray(' Destroy all sandboxes'));\n console.log();\n console.log(pc.bold(' Other Commands'));\n console.log();\n console.log(pc.cyan(' /info') + pc.gray(' Show active sandbox info'));\n console.log(pc.cyan(' /url <port>') + pc.gray(' Get public URL for port'));\n console.log(pc.cyan(' /help') + pc.gray(' Show this help'));\n console.log(pc.cyan(' /exit') + pc.gray(' Exit the REPL'));\n console.log();\n}\n\n// History file path\nconst HISTORY_FILE = path.join(os.homedir(), '.create_compute_history');\n\n/**\n * Load history from file\n */\nfunction loadHistory(rl: readline.Interface): void {\n try {\n if (fs.existsSync(HISTORY_FILE)) {\n const history = fs.readFileSync(HISTORY_FILE, 'utf-8')\n .split('\\n')\n .filter(line => line.trim())\n .reverse();\n\n for (const line of history.slice(0, 1000)) {\n (rl as unknown as { history: string[] }).history?.push(line);\n }\n }\n } catch {\n // Ignore\n }\n}\n\n/**\n * Save a line to history\n */\nfunction saveToHistory(line: string): void {\n try {\n fs.appendFileSync(HISTORY_FILE, line + '\\n');\n } catch {\n // Ignore\n }\n}\n","#!/usr/bin/env node\n/**\n * Minimal workspace CLI using existing PR #344 infrastructure\n * \n * This is a thin wrapper around sandbox.create() + bootstrap script\n * that adds the workspace concept without SDK changes.\n */\n\nimport { compute } from 'computesdk';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { startREPL } from './repl.js';\n\nconst WORKSPACE_STATE_FILE = path.join(os.homedir(), '.computesdk', 'workspaces.json');\n\ninterface Workspace {\n id: string; // repo:branch\n repo: string;\n branch: string;\n sandboxId: string;\n provider: string;\n worktreePath: string;\n createdAt: string;\n lastUsed: string;\n}\n\ninterface WorkspaceState {\n workspaces: Record<string, Workspace>;\n}\n\n// Export Workspace interface\nexport type { Workspace, WorkspaceState };\n\n// Shell escape helper to prevent command injection\nfunction shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n// Load workspace state\nexport function loadState(): WorkspaceState {\n try {\n if (!fs.existsSync(WORKSPACE_STATE_FILE)) {\n return { workspaces: {} };\n }\n const raw = fs.readFileSync(WORKSPACE_STATE_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return { workspaces: {} };\n }\n}\n\n// Export alias for index.ts\nexport const loadWorkspaceState = loadState;\n\n// Save workspace state\nexport function saveState(state: WorkspaceState): void {\n const dir = path.dirname(WORKSPACE_STATE_FILE);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(WORKSPACE_STATE_FILE, JSON.stringify(state, null, 2) + '\\n', { mode: 0o600 });\n}\n\n// Get workspace ID from repo and branch\nfunction getWorkspaceId(repo: string, branch: string): string {\n return `${repo}:${branch}`;\n}\n\n// Create or attach to workspace\nexport async function workspaceCreate(options: {\n repo: string;\n branch: string;\n provider?: string;\n}): Promise<Workspace> {\n const { repo, branch, provider } = options;\n const id = getWorkspaceId(repo, branch);\n const state = loadState();\n \n // Check if workspace already exists\n if (state.workspaces[id]) {\n const existing = state.workspaces[id];\n \n // Verify sandbox still exists\n try {\n const sandbox = await compute.sandbox.getById(existing.sandboxId);\n if (!sandbox) {\n throw new Error('Sandbox not found');\n }\n \n // Just update last used\n existing.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to existing workspace: ${pc.cyan(id)}`);\n return existing;\n } catch {\n // Sandbox is gone, remove from state and recreate\n delete state.workspaces[id];\n }\n }\n \n // Create new sandbox\n p.log.info('Creating sandbox...');\n const spinner = p.spinner();\n spinner.start('Provisioning via ComputeSDK...');\n \n let sandbox;\n try {\n // TODO: Configure compute with provider\n sandbox = await compute.sandbox.create();\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n throw error;\n }\n \n // Run bootstrap script\n spinner.start('Bootstrapping workspace (installing gh CLI, cloning repo)...');\n \n // Read bootstrap script\n const bootstrapScript = fs.readFileSync(\n new URL('./bootstrap.sh', import.meta.url),\n 'utf-8'\n );\n \n // Write and execute bootstrap script in sandbox\n try {\n // Write script to sandbox\n await sandbox.filesystem.writeFile('/tmp/bootstrap.sh', bootstrapScript);\n \n // Make executable and run\n await sandbox.runCommand('chmod +x /tmp/bootstrap.sh');\n \n // Run bootstrap with repo and branch\n // Note: This is interactive for device flow auth\n spinner.stop('Running bootstrap (you may need to authenticate with GitHub)...');\n \n const result = await sandbox.runCommand(\n `/tmp/bootstrap.sh ${shellEscape(repo)} ${shellEscape(branch)}`,\n { timeout: 300000 } // 5 min timeout for auth\n );\n \n // Parse bootstrap output for paths\n const output = result.stdout || '';\n const jsonMatch = output.match(/\\{[\\s\\S]*\\}/);\n let worktreePath = `/workspaces/${path.basename(repo)}-${branch}`;\n \n if (jsonMatch) {\n try {\n const bootstrapInfo = JSON.parse(jsonMatch[0]);\n worktreePath = bootstrapInfo.worktree_path || worktreePath;\n } catch {\n // Use default path\n }\n }\n \n // Create workspace record\n const workspace: Workspace = {\n id,\n repo,\n branch,\n sandboxId: sandbox.sandboxId,\n provider: provider || 'e2b', // TODO: Get actual provider\n worktreePath,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n };\n \n state.workspaces[id] = workspace;\n saveState(state);\n \n p.log.success(`Workspace ready: ${pc.cyan(id)}`);\n p.log.info(`Sandbox: ${pc.dim(sandbox.sandboxId)}`);\n p.log.info(`Worktree: ${pc.dim(worktreePath)}`);\n \n return workspace;\n \n } catch (error) {\n spinner.stop(pc.red('Bootstrap failed'));\n // Cleanup sandbox on failure\n try {\n await sandbox.destroy();\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n// Attach to existing workspace\nexport async function workspaceAttach(id: string): Promise<void> {\n const state = loadState();\n const workspace = state.workspaces[id];\n \n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n p.log.info(`Run: compute workspace create --repo owner/repo --branch ${id.split(':')[1] || 'main'}`);\n process.exit(1);\n }\n \n // Get sandbox\n const sandbox = await compute.sandbox.getById(workspace.sandboxId);\n if (!sandbox) {\n p.log.error(`Sandbox no longer exists: ${workspace.sandboxId}`);\n delete state.workspaces[id];\n saveState(state);\n process.exit(1);\n }\n \n // Update last used\n workspace.lastUsed = new Date().toISOString();\n saveState(state);\n \n p.log.info(`Attaching to workspace: ${pc.cyan(id)}`);\n p.log.info(`Worktree: ${pc.dim(workspace.worktreePath)}`);\n console.log(pc.gray(`Tip: commands run at sandbox root; use { cwd: \"${workspace.worktreePath}\" } on runCommand to scope them.`));\n\n try {\n await startREPL(sandbox, workspace.provider);\n } catch (error) {\n p.log.error(`Failed to attach: ${(error as Error).message}`);\n process.exit(1);\n }\n}\n\n// List all sandboxes (via workspaces)\nexport async function sandboxList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Sandboxes'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n \n console.log(` ${status} ${pc.cyan(ws.sandboxId)}`);\n console.log(` Workspace: ${pc.dim(ws.id)}`);\n console.log(` Provider: ${ws.provider}`);\n console.log(` Last active: ${pc.gray(ageStr)}`);\n console.log();\n }\n \n console.log(pc.gray('Tip: Use \"compute workspaces\" to see full workspace details'));\n}\n\n// List all workspaces\nexport async function workspaceList(): Promise<void> {\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n \n if (workspaces.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute owner/repo --branch main');\n return;\n }\n \n console.log();\n console.log(pc.bold('Workspaces'));\n console.log();\n \n for (const ws of workspaces) {\n const age = Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24));\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n \n console.log(` ${pc.cyan(ws.id)}`);\n console.log(` Sandbox: ${pc.dim(ws.sandboxId)} (${ws.provider})`);\n console.log(` Path: ${pc.dim(ws.worktreePath)}`);\n console.log(` Last used: ${pc.gray(ageStr)}`);\n console.log();\n }\n}\n\n// Save a simple sandbox (without workspace/repo info)\nexport async function saveSandbox(sandbox: {\n id: string;\n sandboxId: string;\n provider: string;\n createdAt: string;\n lastUsed: string;\n}): Promise<void> {\n const state = loadState();\n \n // Store as a minimal \"workspace\" with just sandbox info\n state.workspaces[sandbox.id] = {\n id: sandbox.id,\n repo: '(no repo)',\n branch: '(raw sandbox)',\n sandboxId: sandbox.sandboxId,\n provider: sandbox.provider,\n worktreePath: '/',\n createdAt: sandbox.createdAt,\n lastUsed: sandbox.lastUsed,\n };\n \n saveState(state);\n}\n\n// Destroy workspace\nexport async function workspaceDestroy(id?: string): Promise<void> {\n const state = loadState();\n \n if (id) {\n // Destroy specific workspace\n const workspace = state.workspaces[id];\n if (!workspace) {\n p.log.error(`Workspace not found: ${id}`);\n return;\n }\n \n p.log.info(`Destroying workspace: ${pc.cyan(id)}`);\n \n try {\n await compute.sandbox.destroy(workspace.sandboxId);\n delete state.workspaces[id];\n saveState(state);\n p.log.success('Workspace destroyed');\n } catch (error) {\n p.log.error(`Failed to destroy: ${(error as Error).message}`);\n }\n } else {\n // Interactive selection\n const choices = Object.values(state.workspaces).map(ws => ({\n value: ws.id,\n label: `${ws.id} (${ws.provider}, last used ${Math.round((Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24))}d ago)`\n }));\n \n if (choices.length === 0) {\n p.log.info('No workspaces to destroy');\n return;\n }\n \n const selected = await p.select({\n message: 'Select workspace to destroy',\n options: choices,\n });\n \n if (p.isCancel(selected)) {\n return;\n }\n \n await workspaceDestroy(selected as string);\n }\n}\n","/**\n * @computesdk/cli\n *\n * ComputeSDK CLI - Cloud-native workspace management.\n *\n * Usage:\n * compute # interactive workspace creation\n * compute owner/repo # create workspace for repo\n * compute --repo owner/repo --branch fix-auth\n * compute workspace # manage existing workspaces\n * compute exec <id> <cmd...> # run command in sandbox\n * compute connect <id> # open REPL against sandbox\n * compute destroy <id...> # destroy sandboxes\n * compute run -- <cmd...> # create + exec + optional destroy\n * compute providers # list configured providers\n */\n\nimport 'dotenv/config';\nimport { Command } from 'commander';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { compute, type SandboxInterface } from 'computesdk';\nimport { getProviderStatus } from './providers.js';\nimport { registerActionsCommands } from './actions.js';\nimport { startREPL } from './repl.js';\nimport { clearStoredCredentials } from './auth.js';\nimport { ensureAuth, resolveProvider, configureCompute } from './setup.js';\nimport {\n workspaceCreate,\n workspaceAttach,\n workspaceList,\n workspaceDestroy,\n sandboxList,\n loadWorkspaceState,\n type Workspace,\n} from './workspace-cli.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')\n);\n\n// Detect if running from dev workspace\nconst isDevBuild = import.meta.url.includes('worktrees') || \n import.meta.url.includes('/packages/cli/');\nconst VERSION = isDevBuild ? `${packageJson.version}-dev` : packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('compute')\n .description('Cloud-native workspace management')\n .version(VERSION)\n .enablePositionalOptions()\n .passThroughOptions();\n\n// ─── Default action: Show help ─────────────────────────────────────────────\n\nprogram\n .option('--login', 'force re-authentication')\n .option('--logout', 'clear stored credentials')\n .action(async (opts) => {\n if (opts.logout) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n process.exit(0);\n }\n\n if (opts.login) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n process.exit(0);\n }\n\n // Show help by default\n program.help();\n });\n\n// ─── Create Command (like create-compute) ─────────────────────────────────\n\nprogram\n .command('create')\n .description('Create a new workspace (same as create-compute)')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length > 0) {\n // Show existing workspaces to attach to\n const choices = workspaceIds.map((id) => {\n const ws = state.workspaces[id];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : `${age}d ago`;\n return {\n value: id,\n label: `${id} (${ws.provider}, ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to attach (or create new)',\n options: [\n ...choices,\n { value: '__new__', label: pc.gray('+ Create new workspace') },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n if (selected !== '__new__') {\n await workspaceAttach(selected as string);\n return;\n }\n\n // Fall through to create new\n }\n\n // Prompt for repo\n const repoInput = await p.text({\n message: 'Repository to work on?',\n placeholder: 'owner/repo',\n validate: (value) => {\n if (!value || !value.includes('/')) {\n return 'Please enter a repository in owner/repo format';\n }\n },\n });\n\n if (p.isCancel(repoInput)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n repo = repoInput as string;\n }\n\n // Validate repo format\n if (!repo.includes('/')) {\n p.log.error('Invalid repository format. Use: owner/repo');\n process.exit(1);\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\n// ─── Sandbox Commands ───────────────────────────────────────────────────────\n\nconst sandboxCmd = program\n .command('sandbox')\n .alias('sb')\n .description('Manage raw sandboxes (VMs without git/worktree)');\n\nsandboxCmd\n .command('create')\n .description('Create a new sandbox')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .option('--connect', 'drop into the REPL after creation')\n .option('--silent', 'only output the sandbox ID')\n .action(async (opts) => {\n if (!opts.silent) {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n }\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n if (!opts.silent) {\n const spinner = p.spinner();\n spinner.start('Creating sandbox...');\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n spinner.stop(`Sandbox ready: ${pc.cyan(sandbox.sandboxId)}`);\n\n // Track the sandbox in local state\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create sandbox'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n } else {\n try {\n const sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n // Silent mode: only print sandbox ID for scripting\n process.stdout.write(sandbox.sandboxId);\n\n // Track the sandbox in local state (even in silent mode)\n const { saveSandbox } = await import('./workspace-cli.js');\n await saveSandbox({\n id: sandbox.sandboxId,\n sandboxId: sandbox.sandboxId,\n provider: provider,\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString(),\n });\n\n if (opts.connect) {\n await startREPL(sandbox, provider);\n }\n } catch (error) {\n process.stderr.write((error as Error).message + '\\n');\n process.exit(1);\n }\n }\n });\n\nsandboxCmd\n .command('destroy')\n .description('Destroy one or more sandboxes')\n .aliases(['rm', 'stop'])\n .argument('[sandbox_id...]', 'sandbox IDs to destroy (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxIds: string[] | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n \n // Load state\n const { loadState, saveState } = await import('./workspace-cli.js');\n const state = loadState();\n \n // If no IDs provided, show interactive picker\n if (!sandboxIds || sandboxIds.length === 0) {\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n // Allow multi-select with space, or single select with enter\n const selected = await p.multiselect({\n message: 'Select sandboxes to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxIds = selected as string[];\n }\n \n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const results = await Promise.allSettled(\n sandboxIds.map(async (id) => {\n await compute.sandbox.destroy(id);\n return id;\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n const sandboxId = result.value;\n console.log(pc.green(`Destroyed ${sandboxId}`));\n \n // Remove from state if tracked\n const workspaceId = Object.keys(state.workspaces).find(\n key => state.workspaces[key].sandboxId === sandboxId\n );\n if (workspaceId) {\n delete state.workspaces[workspaceId];\n }\n } else {\n console.error(pc.red(`Failed to destroy: ${result.reason?.message || result.reason}`));\n }\n }\n \n // Save updated state\n saveState(state);\n });\n\nsandboxCmd\n .command('list')\n .alias('ls')\n .description('List all sandboxes')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await sandboxList();\n });\n\nsandboxCmd\n .command('connect')\n .description('Connect to a sandbox (opens REPL; same as compute connect)')\n .aliases(['ssh', 'shell'])\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\nsandboxCmd\n .command('exec')\n .description('Execute a command in a sandbox')\n .argument('<sandbox_id>', 'sandbox ID')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .action(async (sandboxId: string, command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n console.error(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n process.exit(result.exitCode);\n });\n\n// ─── Connect Command (top-level alias) ───────────────────────────────────────\n\nprogram\n .command('connect')\n .description('Connect to a sandbox (opens REPL)')\n .aliases(['ssh', 'shell']) // Keep aliases but document connect as primary\n .argument('[sandbox_id]', 'sandbox ID (optional - will show picker if not provided)')\n .option('-p, --provider <provider>', 'provider to use')\n .action(async (sandboxId: string | undefined, opts) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n // If no sandbox_id provided, show interactive picker\n if (!sandboxId) {\n const { loadState } = await import('./workspace-cli.js');\n const state = loadState();\n const workspaces = Object.values(state.workspaces);\n\n if (workspaces.length === 0) {\n p.log.info('No sandboxes found.');\n p.log.info('Create one with: compute sandbox create');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaces.map((ws) => {\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n const status = age > 7 ? pc.red('stale') : age > 1 ? pc.yellow('idle') : pc.green('active');\n return {\n value: ws.sandboxId,\n label: `${status} ${ws.sandboxId} (${ws.provider}, last active ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select sandbox to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n sandboxId = selected as string;\n }\n\n const spinner = p.spinner();\n spinner.start('Connecting...');\n const sandbox = await compute.sandbox.getById(sandboxId);\n if (!sandbox) {\n spinner.stop(pc.red(`Sandbox not found: ${sandboxId}`));\n process.exit(1);\n }\n\n spinner.stop('');\n\n await startREPL(sandbox, provider);\n });\n\n// ─── Workspace Commands ─────────────────────────────────────────────────────\n\nconst workspaceCmd = program\n .command('workspace')\n .alias('ws')\n .description('Manage workspaces (sandbox + git + worktree)');\n\nworkspaceCmd\n .command('create')\n .description('Create a new workspace')\n .argument('[repo]', 'Repository in owner/repo format')\n .option('-b, --branch <branch>', 'Branch name', 'main')\n .option('-p, --provider <provider>', 'provider to use')\n .option('--no-attach', 'Create workspace but do not attach')\n .action(async (repo, options) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n await ensureAuth();\n\n if (!repo) {\n p.log.info('Usage: compute workspace create owner/repo --branch main');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const provider = await resolveProvider(options.provider, { interactive: true });\n configureCompute(provider);\n\n const spinner = p.spinner();\n spinner.start('Creating workspace...');\n\n try {\n const workspace = await workspaceCreate({\n repo,\n branch: options.branch,\n provider,\n });\n\n spinner.stop(`Workspace ready: ${pc.cyan(workspace.id)}`);\n\n if (options.attach !== false) {\n console.log();\n await workspaceAttach(workspace.id);\n } else {\n p.outro(pc.green('Workspace created!'));\n }\n } catch (error) {\n spinner.stop(pc.red('Failed to create workspace'));\n p.log.error((error as Error).message);\n process.exit(1);\n }\n });\n\nworkspaceCmd\n .command('list')\n .alias('ls')\n .description('List all workspaces')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await workspaceList();\n });\n\nworkspaceCmd\n .command('destroy')\n .alias('rm')\n .description('Destroy a workspace')\n .argument('[id]', 'Workspace ID (repo:branch format, optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces to destroy.');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n // Allow multi-select\n const selected = await p.multiselect({\n message: 'Select workspaces to destroy (space to select, enter to confirm)',\n options: choices,\n });\n\n if (p.isCancel(selected) || (selected as string[]).length === 0) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n // Destroy each selected workspace\n for (const workspaceId of selected as string[]) {\n await workspaceDestroy(workspaceId);\n }\n } else {\n // Direct destroy with provided ID\n await workspaceDestroy(id);\n }\n });\n\nworkspaceCmd\n .command('connect')\n .alias('attach') // Keep attach as alias\n .description('Connect to an existing workspace (with git context)')\n .argument('[id]', 'Workspace ID (optional - will show picker if not provided)')\n .action(async (id: string | undefined) => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n // If no ID provided, show interactive picker\n if (!id) {\n const state = loadWorkspaceState();\n const workspaceIds = Object.keys(state.workspaces);\n\n if (workspaceIds.length === 0) {\n p.log.info('No workspaces found.');\n p.log.info('Create one with: compute create owner/repo');\n p.outro(pc.green('Done!'));\n return;\n }\n\n const choices = workspaceIds.map((key) => {\n const ws = state.workspaces[key];\n const age = Math.round(\n (Date.now() - new Date(ws.lastUsed).getTime()) / (1000 * 60 * 60 * 24),\n );\n const ageStr = age === 0 ? 'today' : age === 1 ? '1 day ago' : `${age} days ago`;\n return {\n value: key,\n label: `${pc.cyan(key)} (${ws.provider}, last used ${ageStr})`,\n };\n });\n\n const selected = await p.select({\n message: 'Select workspace to connect',\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n id = selected as string;\n }\n\n await workspaceAttach(id);\n });\n\n// ─── run ─────────────────────────────────────────────────────────────────────\n\nprogram\n .command('run')\n .description('Create a sandbox, run a command, then optionally destroy it')\n .argument('<command...>', 'command to run')\n .option('-p, --provider <provider>', 'provider to use')\n .option('-e, --env <key=value...>', 'environment variables')\n .option('-w, --workdir <directory>', 'working directory')\n .passThroughOptions()\n .option('--rm', 'destroy sandbox after command finishes')\n .option('--timeout <duration>', 'sandbox timeout (e.g. 5m, 1h)')\n .option('--name <name>', 'sandbox name')\n .action(async (command: string[], opts) => {\n await ensureAuth();\n const provider = await resolveProvider(opts.provider);\n configureCompute(provider);\n\n let sandbox: SandboxInterface;\n try {\n sandbox = await compute.sandbox.create(\n buildCreateOptions(opts),\n );\n } catch (error) {\n console.error(pc.red(`Failed to create sandbox: ${(error as Error).message}`));\n process.exit(1);\n }\n\n try {\n const cmd = buildExecCommand(command, opts);\n const result = await sandbox.runCommand(cmd);\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n if (opts.rm) {\n await sandbox.destroy();\n }\n\n process.exit(result.exitCode);\n } catch (error) {\n if (opts.rm) {\n try { await sandbox.destroy(); } catch { /* ignore cleanup errors */ }\n }\n console.error(pc.red((error as Error).message));\n process.exit(1);\n }\n });\n\n// ─── providers ───────────────────────────────────────────────────────────────\n\nprogram\n .command('providers')\n .description('List all providers and their configuration status')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n\n const statuses = getProviderStatus();\n\n console.log();\n for (const status of statuses) {\n const icon = status.ready ? pc.green('●') : pc.gray('○');\n const name = status.ready ? pc.white(status.name) : pc.gray(status.name);\n const detail = status.ready\n ? pc.green('ready')\n : pc.gray(`missing: ${status.missing.join(', ')}`);\n console.log(` ${icon} ${name} ${detail}`);\n }\n console.log();\n });\n\n// ─── login / logout ──────────────────────────────────────────────────────────\n\nprogram\n .command('login')\n .description('Authenticate with ComputeSDK')\n .action(async () => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n await ensureAuth({ forceLogin: true });\n p.outro(pc.green('Authenticated!'));\n });\n\nprogram\n .command('logout')\n .description('Clear stored credentials')\n .action(() => {\n console.log();\n p.intro(pc.cyan(`@computesdk/cli v${VERSION}`));\n clearStoredCredentials();\n p.log.success('Logged out. Stored credentials removed.');\n p.outro(pc.green('Done!'));\n });\n\n// ─── actions ─────────────────────────────────────────────────────────────────\n\nregisterActionsCommands(program);\n\n// ─── bench ───────────────────────────────────────────────────────────────────\n// `compute bench` is the benchmarks-platform CLI (@benchsdk/runner's `bench`\n// binary) folded under compute: run/check/auth/org/benchmarks/runs/results/\n// iterations/artifacts/logs/export all dispatch through it.\n\nprogram\n .command('bench')\n .description('Benchmarks platform CLI (run, auth, org, benchmarks, runs, results, artifacts, export, ...)')\n .allowUnknownOption()\n .helpOption(false)\n .action(() => {\n // Never reached: bench args are dispatched pre-parse below.\n });\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction buildCreateOptions(opts: { timeout?: string; name?: string }) {\n const options: Record<string, unknown> = {};\n if (opts.timeout) {\n options.timeout = parseDuration(opts.timeout);\n }\n if (opts.name) {\n options.name = opts.name;\n }\n return options;\n}\n\nexport function shellEscape(arg: string): string {\n if (/^[a-zA-Z0-9._\\-/:=@]+$/.test(arg)) return arg;\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction buildExecCommand(\n command: string[],\n opts: { env?: string[]; workdir?: string },\n): string {\n let cmd = command.map(shellEscape).join(' ');\n\n // Prepend cd if workdir is specified\n if (opts.workdir) {\n cmd = `cd ${shellEscape(opts.workdir)} && ${cmd}`;\n }\n\n // Prepend env vars if specified\n if (opts.env && opts.env.length > 0) {\n const envPrefix = opts.env\n .map((entry) => {\n const eqIndex = entry.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(\n `Invalid environment entry \"${entry}\". Expected format KEY=VALUE.`,\n );\n }\n const key = entry.slice(0, eqIndex);\n const val = entry.slice(eqIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(\n `Invalid environment variable name \"${key}\" in entry \"${entry}\".`,\n );\n }\n return `${key}=${shellEscape(val)}`;\n })\n .join(' ');\n cmd = `${envPrefix} ${cmd}`;\n }\n\n return cmd;\n}\n\n/**\n * Parse a human-friendly duration string to milliseconds.\n * Supports: 30s, 5m, 1h, 2h30m\n */\nfunction parseDuration(input: string): number {\n let total = 0;\n const pattern = /(\\d+)\\s*(s|m|h)/gi;\n let match;\n\n while ((match = pattern.exec(input)) !== null) {\n const value = parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n switch (unit) {\n case 's': total += value * 1000; break;\n case 'm': total += value * 60 * 1000; break;\n case 'h': total += value * 60 * 60 * 1000; break;\n }\n }\n\n if (total === 0) {\n // Try as plain number (seconds)\n const num = parseInt(input, 10);\n if (!isNaN(num)) return num * 1000;\n throw new Error(`Invalid duration: ${input}. Use formats like 30s, 5m, 1h`);\n }\n\n return total;\n}\n\n// ─── Run ─────────────────────────────────────────────────────────────────────\n\n// Bench args are opaque to commander (its own --flags, `--` separators, file\n// paths), so they dispatch before parsing. `@benchsdk/runner`'s run() owns the\n// process — it exits itself after dispatch.\nasync function main() {\n if (process.argv[2] === 'bench' || process.argv[2] === 'benchmark') {\n const { run: benchRun } = await import('@benchsdk/runner');\n await benchRun(process.argv.slice(3));\n return;\n }\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n console.error(pc.red(`\\nError: ${error.message}`));\n process.exit(1);\n});\n","/**\n * Provider detection and validation\n *\n * Detection is local: each provider declares the env vars its credentials come\n * from, and \"ready\" means all of them are set. This used to import helpers from\n * `computesdk` that the package no longer exports, which made every `compute`\n * invocation fail at module load.\n */\n\ninterface ProviderEnvSpec {\n /**\n * Alternative complete credential sets — the provider is usable when every\n * var in any one set is present (e.g. Vercel: the traditional tuple OR\n * VERCEL_OIDC_TOKEN; Namespace: NSC_TOKEN or NSC_TOKEN_FILE).\n */\n authOptions: string[][];\n /**\n * Maps each env var to the provider's nested config key (the field names in\n * the provider package's config interface, e.g. `apiKey`, `tokenId`).\n */\n configKeys: Record<string, string>;\n}\n\nconst PROVIDER_ENV: Record<string, ProviderEnvSpec> = {\n e2b: { authOptions: [['E2B_API_KEY']], configKeys: { E2B_API_KEY: 'apiKey' } },\n railway: { authOptions: [['RAILWAY_API_TOKEN']], configKeys: { RAILWAY_API_TOKEN: 'token' } },\n modal: {\n authOptions: [['MODAL_TOKEN_ID', 'MODAL_TOKEN_SECRET']],\n configKeys: { MODAL_TOKEN_ID: 'tokenId', MODAL_TOKEN_SECRET: 'tokenSecret' },\n },\n vercel: {\n authOptions: [['VERCEL_TOKEN', 'VERCEL_TEAM_ID', 'VERCEL_PROJECT_ID'], ['VERCEL_OIDC_TOKEN']],\n configKeys: {\n VERCEL_TOKEN: 'token',\n VERCEL_TEAM_ID: 'teamId',\n VERCEL_PROJECT_ID: 'projectId',\n },\n },\n daytona: { authOptions: [['DAYTONA_API_KEY']], configKeys: { DAYTONA_API_KEY: 'apiKey' } },\n namespace: {\n authOptions: [['NSC_TOKEN'], ['NSC_TOKEN_FILE']],\n configKeys: { NSC_TOKEN: 'token', NSC_TOKEN_FILE: 'tokenFile' },\n },\n blaxel: {\n authOptions: [['BL_API_KEY', 'BL_WORKSPACE']],\n configKeys: { BL_API_KEY: 'apiKey', BL_WORKSPACE: 'workspace' },\n },\n codesandbox: { authOptions: [['CSB_API_KEY']], configKeys: { CSB_API_KEY: 'apiKey' } },\n render: { authOptions: [['RENDER_API_KEY']], configKeys: { RENDER_API_KEY: 'apiKey' } },\n};\n\nconst PROVIDER_NAMES = Object.keys(PROVIDER_ENV);\n\n/** Missing vars from whichever auth option is closest to complete. */\nfunction missingEnvVars(provider: string): string[] {\n const spec = PROVIDER_ENV[provider];\n if (!spec) return [];\n let best: string[] | null = null;\n for (const option of spec.authOptions) {\n const missing = option.filter((name) => !process.env[name]);\n if (missing.length === 0) return [];\n if (!best || missing.length < best.length) best = missing;\n }\n return best ?? [];\n}\n\nfunction isProviderAuthComplete(provider: string): boolean {\n return missingEnvVars(provider).length === 0;\n}\n\n/**\n * Provider status info\n */\nexport interface ProviderStatus {\n name: string;\n ready: boolean;\n missing: string[];\n}\n\n/**\n * Detect all available providers from environment variables\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function detectAvailableProviders(): string[] {\n const available: string[] = [];\n\n // Check for computesdk first (ComputeSDK native - just needs gateway key)\n if (process.env.COMPUTESDK_API_KEY) {\n available.push('computesdk');\n }\n\n // Then check for individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n if (isProviderAuthComplete(provider)) {\n available.push(provider);\n }\n }\n\n return available;\n}\n\n/**\n * Get status of all providers\n * Only includes providers supported by the ComputeSDK gateway\n */\nexport function getProviderStatus(): ProviderStatus[] {\n const statuses: ProviderStatus[] = [];\n\n // Add computesdk status (ComputeSDK native)\n const hasGatewayKey = !!process.env.COMPUTESDK_API_KEY;\n statuses.push({\n name: 'computesdk',\n ready: hasGatewayKey,\n missing: hasGatewayKey ? [] : ['COMPUTESDK_API_KEY'],\n });\n\n // Add individual cloud providers (need their own creds)\n for (const provider of PROVIDER_NAMES) {\n statuses.push({\n name: provider,\n ready: isProviderAuthComplete(provider),\n missing: missingEnvVars(provider),\n });\n }\n\n return statuses;\n}\n\n/**\n * Check if gateway mode is available\n */\nexport function isGatewayAvailable(): boolean {\n return !!process.env.COMPUTESDK_API_KEY;\n}\n\n/**\n * Build the full compute config for a provider from env vars\n */\nexport function buildProviderConfig(provider: string): Record<string, unknown> {\n const config: Record<string, unknown> = {\n provider,\n apiKey: process.env.COMPUTESDK_API_KEY, // Gateway API key (top-level)\n };\n\n // For 'computesdk' provider, nest the API key under the provider config too\n if (provider === 'computesdk') {\n config.computesdk = {\n computesdk_api_key: process.env.COMPUTESDK_API_KEY,\n };\n return config;\n }\n\n // Add provider-specific config from env vars\n const spec = PROVIDER_ENV[provider];\n if (spec) {\n const providerConfig: Record<string, string> = {};\n for (const [envVar, key] of Object.entries(spec.configKeys)) {\n const value = process.env[envVar];\n if (value) providerConfig[key] = value;\n }\n if (Object.keys(providerConfig).length > 0) {\n config[provider] = providerConfig;\n }\n }\n\n return config;\n}\n","/** A file/dir name reduced to a safe basename — strips `..` and separators. */\nfunction sanitizePathPart(name: string): string {\n const base = basename(name);\n if (base === '' || base === '.' || base === '..') return 'artifact';\n return base;\n}\n\n/**\n * `compute actions` — drive the benchmarks-platform Actions API end-to-end:\n * dispatch workflows, watch runs, inspect run context, stream logs,\n * manage artifacts.\n *\n * Auth: --api-key, else COMPUTE_API_KEY, else the platform OAuth credentials\n * `compute bench auth login` stored (refreshed silently, never prompts). The\n * gateway key from `compute login` is not used. --base-url overrides the\n * https://platform.computesdk.com default; a non-computesdk host needs\n * --allow-untrusted-host and an explicit key — stored OAuth is never sent there.\n * Every subcommand takes --json for machine-readable output — on success the\n * data, on failure the `{ ok: false, error: {...} }` envelope on stderr.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { basename, join } from 'path';\nimport {\n ActionsApiError,\n ActionsCliError,\n ActionsClient,\n encodeWatchCursor,\n resolveActionsAuth,\n toErrorEnvelope,\n type CiArtifactListItem,\n type CiJob,\n type CiLogSlice,\n type CiProviderInfo,\n type CiProviderKeyResponse,\n type CiProvidersResponse,\n type CiRepo,\n type CiRepoConnectResponse,\n type CiRepoPatchResponse,\n type CiReposResponse,\n type CiRun,\n type CiRunHistory,\n type CiRunInspection,\n type CiRunSummary,\n type CiWorkflow,\n} from './actions-client.js';\n\n/** The jobs inside a `/state` response — a subset of CiJob, no name/steps. */\ninterface CiLiveStateJob {\n id: string;\n state: CiJob['state'];\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n placementAttempts: CiJob['placementAttempts'];\n}\n\ntype JsonOpts = { json?: boolean };\n\ninterface CommonOpts extends JsonOpts {\n apiKey?: string;\n baseUrl?: string;\n allowUntrustedHost?: boolean;\n}\n\nasync function client(opts: CommonOpts): Promise<ActionsClient> {\n return new ActionsClient(await resolveActionsAuth(opts));\n}\n\n/** Print `data` as JSON when --json was passed; otherwise call `render`. */\nfunction output<T>(opts: JsonOpts, data: T, render: (data: T) => void): void {\n if (opts.json) {\n process.stdout.write(JSON.stringify(data, null, 2) + '\\n');\n } else {\n render(data);\n }\n}\n\n/** The run's job list: full detail when the runs detail route exists, else the\n * live-state route (which predates it and lists jobs without names). */\nasync function listRunJobs(c: ActionsClient, runId: string): Promise<CiJob[]> {\n try {\n const run = await c.get<CiRun>(`/api/v1/actions/runs/${runId}`);\n return run.jobs;\n } catch (e) {\n if (!(e instanceof ActionsApiError) || e.status !== 404) throw e;\n }\n const state = await c.get<{ jobs: CiLiveStateJob[] }>(`/api/v1/actions/runs/${runId}/state`);\n return state.jobs.map((j) => ({\n id: j.id,\n name: j.id.slice(0, 8), // the live-state route does not carry job names\n needs: [],\n workflowJobId: null,\n matrix: null,\n state: j.state,\n provider: j.provider,\n region: j.region,\n sandboxId: j.sandboxId,\n placementAttempts: j.placementAttempts,\n durationMs: null,\n steps: [],\n }));\n}\n\n/** The run's failure digest; null when the summary cannot be fetched. */\nasync function fetchRunSummary(c: ActionsClient, runId: string): Promise<CiRunSummary | null> {\n try {\n return await c.get<CiRunSummary>(`/api/v1/actions/runs/${runId}/summary`);\n } catch (e) {\n // The digest rides along with `actions run`; a deployment without the\n // route or a summary error must not hide the run detail itself. The\n // `summary` command fetches directly so its own errors still surface.\n if (!(e instanceof ActionsApiError && e.status === 404)) {\n console.error(\n pc.dim(`summary unavailable: ${e instanceof Error ? e.message : String(e)}`),\n );\n }\n return null;\n }\n}\n\n/**\n * Report an error and exit 1. With --json the stderr line is the stable\n * envelope from `toErrorEnvelope` (stdout stays empty, so a consumer can parse\n * either stream without guessing); otherwise a one-line human message.\n */\nfunction fail(error: unknown, opts: JsonOpts = {}): never {\n if (opts.json) {\n process.stderr.write(JSON.stringify(toErrorEnvelope(error)) + '\\n');\n } else if (error instanceof ActionsApiError) {\n console.error(pc.red(`Error (${error.status}): ${error.message}`));\n } else {\n console.error(pc.red(`Error: ${error instanceof Error ? error.message : String(error)}`));\n }\n process.exit(1);\n}\n\n/**\n * Commander's own usage errors (unknown option, missing required option or\n * argument) are raised before any action runs, so `fail` never sees them.\n * Route them through the same envelope when --json is among the raw args.\n */\nexport function usageErrorOutput(str: string, write: (str: string) => void, argv: string[] = process.argv): void {\n if (argv.includes('--json')) {\n const message = str.replace(/^error:\\s*/i, '').trim();\n write(JSON.stringify(toErrorEnvelope(new ActionsCliError('invalid_argument', message))) + '\\n');\n } else {\n write(str);\n }\n}\n\n// ─── Formatting (pure, exported for tests) ──────────────────────────────────\n\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined) return '-';\n if (ms < 1000) return `${ms}ms`;\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h${m % 60}m`;\n}\n\nexport function shortSha(sha: string): string {\n return sha.slice(0, 8);\n}\n\nexport function conclusionLabel(conclusion: string): string {\n switch (conclusion) {\n case 'passed': return pc.green('passed');\n case 'failed': return pc.red('failed');\n case 'running': return pc.yellow('running');\n case 'cancelled': return pc.gray('cancelled');\n case 'none': return pc.yellow('queued');\n default: return conclusion;\n }\n}\n\nexport function formatRunRow(run: CiRun): string {\n const num = run.runNumber === null ? '-' : `#${run.runNumber}`;\n return [\n run.id,\n pc.dim(num),\n run.workflowName || run.workflowPath,\n conclusionLabel(run.conclusion),\n pc.dim(`${run.repoFullName}@${run.ref}`),\n shortSha(run.headSha),\n formatDuration(run.durationMs),\n run.startedAt,\n ].join(' ');\n}\n\nexport function formatRunDetail(run: CiRun, runUrl?: string): string {\n const lines: string[] = [];\n lines.push(`${pc.bold(run.workflowName || run.workflowPath)} ${conclusionLabel(run.conclusion)}`);\n lines.push(pc.dim(`run ${run.id}${run.runNumber === null ? '' : ` #${run.runNumber}`}`));\n lines.push(`${run.repoFullName} @ ${run.ref} ${shortSha(run.headSha)} ${run.event}${run.prNumber ? ` PR #${run.prNumber}` : ''}`);\n lines.push(`title: ${run.title}`);\n lines.push(`started: ${run.startedAt} duration: ${formatDuration(run.durationMs)}`);\n if (run.cancellationReason) lines.push(`cancelled: ${run.cancellationReason}`);\n if (run.providerOverride) lines.push(`dispatched to: ${run.providerOverride}`);\n if (run.supersededByRunId) lines.push(`superseded by: ${run.supersededByRunId}`);\n if (runUrl) lines.push(`url: ${runUrl}`);\n if (run.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of run.jobs) {\n const placement = job.provider\n ? `${job.provider}${job.region ? `:${job.region}` : ''}`\n : '-';\n lines.push(` ${job.id} ${job.name} ${conclusionLabel(job.state)} ${placement} ${formatDuration(job.durationMs)}`);\n for (const attempt of job.placementAttempts) {\n lines.push(pc.dim(` placement failed on ${attempt.provider}${attempt.region ? `:${attempt.region}` : ''}: ${attempt.error}`));\n }\n for (const step of job.steps) {\n const exit = step.exitCode === null ? '' : ` (exit ${step.exitCode})`;\n lines.push(pc.dim(` ${step.name} ${step.state}${exit} ${formatDuration(step.durationMs)}`));\n }\n }\n }\n return lines.join('\\n');\n}\n\n/** `compute actions inspect` — the run plus everything that shaped it. */\nexport function formatRunInspection(run: CiRunInspection): string {\n const lines: string[] = [];\n lines.push(`${pc.bold('run')} ${conclusionLabel(run.conclusion)}${run.runNumber === null ? '' : ` #${run.runNumber}`}`);\n lines.push(pc.dim(run.id));\n lines.push(`${safeTerm(run.ref)} ${shortSha(run.headSha)} ${safeTerm(run.event)}`);\n lines.push(`queued: ${run.queuedAt} started: ${run.startedAt} finished: ${run.finishedAt}`);\n if (run.cancellationReason) lines.push(`cancelled: ${run.cancellationReason}`);\n if (run.supersededByRunId) lines.push(`superseded by: ${run.supersededByRunId}`);\n if (run.blockedReason) lines.push(pc.red(`blocked: ${safeTerm(run.blockedReason)}`));\n if (run.concurrencyGroup) lines.push(`concurrency: ${safeTerm(run.concurrencyGroup)}`);\n if (run.providerOverride) lines.push(`dispatched to: ${safeTerm(run.providerOverride)}`);\n if (run.definitionStale) {\n const parsed = run.workflowParsedFromSha ? shortSha(run.workflowParsedFromSha) : 'unknown';\n lines.push(pc.yellow(`definition: stored parse is from ${parsed}, not this head — context may be newer than the run`));\n }\n if (run.dispatchInputs && Object.keys(run.dispatchInputs).length > 0) {\n lines.push(`inputs: ${Object.entries(run.dispatchInputs).map(([k, v]) => `${safeTerm(k)}=${safeTerm(v)}`).join(' ')}`);\n }\n if (run.secrets) {\n const names = run.secrets.names.length > 0 ? run.secrets.names.map(safeTerm).join(', ') : 'none';\n lines.push(`secrets (${run.secrets.access}${run.secrets.env ? ', exported to env' : ''}): ${names}`);\n }\n if (run.caches.length > 0) {\n lines.push('');\n lines.push(pc.bold('caches'));\n for (const cache of run.caches) {\n const action = [cache.restoredAt ? 'restored' : null, cache.savedAt ? 'saved' : null]\n .filter(Boolean)\n .join('+');\n lines.push(` ${safeTerm(cache.key)} ${pc.dim(`${action} ${safeTerm(cache.scopeRef)} ${cache.sizeBytes}B`)}`);\n }\n }\n if (run.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of run.jobs) {\n const placement = job.provider\n ? `${safeTerm(job.provider)}${job.region ? `:${safeTerm(job.region)}` : ''}`\n : '-';\n lines.push(` ${safeTerm(job.name)} ${conclusionLabel(job.state)} ${placement}`);\n lines.push(pc.dim(` ${job.id}`));\n if (job.runsOn.length > 0 || job.resolvedRunsOn !== null) {\n const resolved =\n job.resolvedRunsOn !== null && job.resolvedRunsOn.join(',') !== job.runsOn.join(',')\n ? ` → ${job.resolvedRunsOn.map(safeTerm).join(', ')}`\n : '';\n lines.push(` runs-on: ${job.runsOn.map(safeTerm).join(', ') || '(none)'}${resolved}`);\n }\n if (job.runsOnHasExpression) lines.push(pc.dim(' runs-on resolves at runtime (expression)'));\n if (job.container) lines.push(` container: ${safeTerm(job.container)}`);\n if (job.runnerImage) lines.push(` image: ${safeTerm(job.runnerImage)}`);\n if (job.placementHint) {\n lines.push(` pinned: ${safeTerm(job.placementHint.label)}`);\n }\n if (job.concurrencyGroup) {\n lines.push(` concurrency: ${safeTerm(job.concurrencyGroup)}${job.concurrencyCancelInProgress ? ' (cancel-in-progress)' : ''}`);\n }\n const overrides = [\n job.timeoutMinutes !== null ? `timeout ${job.timeoutMinutes}m` : null,\n job.fetchDepth !== null ? `fetch-depth ${job.fetchDepth}` : null,\n ].filter(Boolean);\n if (overrides.length > 0) lines.push(` ${overrides.join(' ')}`);\n if (job.matrix) {\n lines.push(` matrix: ${Object.entries(job.matrix).map(([k, v]) => `${safeTerm(k)}=${safeTerm(v)}`).join(' ')}`);\n }\n if (job.failureReason) lines.push(pc.red(` failed: ${safeTerm(job.failureReason)}`));\n for (const attempt of job.placementAttempts) {\n lines.push(pc.dim(` placement failed on ${safeTerm(attempt.provider)}${attempt.region ? `:${safeTerm(attempt.region)}` : ''}: ${safeTerm(attempt.error)}`));\n }\n }\n }\n return lines.join('\\n');\n}\n\n/** The failure digest rendered for humans — shared by `run` and `summary`. */\nexport function formatRunSummary(summary: CiRunSummary): string {\n const lines: string[] = [];\n lines.push(pc.bold(`failures — run ${summary.runId} ${conclusionLabel(summary.conclusion)}`));\n if (summary.failures.length === 0) {\n lines.push(' no failed jobs');\n return lines.join('\\n');\n }\n for (const job of summary.failures) {\n const placement = job.provider\n ? `${safeTerm(job.provider)}${job.region ? `:${safeTerm(job.region)}` : ''}`\n : '-';\n lines.push(` ${job.id} ${safeTerm(job.name)} ${conclusionLabel(job.conclusion)} ${placement}`);\n if (job.failureReason) lines.push(pc.dim(` ${safeTerm(job.failureReason)}`));\n for (const step of job.failedSteps) {\n const exit = step.exitCode === null ? '' : ` (exit ${step.exitCode})`;\n lines.push(` step ${step.ordinal} ${safeTerm(step.name)}${exit}`);\n }\n if (job.excerpt) {\n const scope = job.excerpt.stepOrdinal === null ? 'job log' : `step ${job.excerpt.stepOrdinal}`;\n const cut = job.excerpt.truncated ? ', truncated' : '';\n lines.push(pc.dim(` ── ${scope} tail${cut} ──`));\n for (const line of job.excerpt.text.split('\\n')) lines.push(` ${safeTerm(line)}`);\n }\n }\n return lines.join('\\n');\n}\n\n// ─── Parsing helpers (pure, exported for tests) ─────────────────────────────\n\n/** `--inputs k=v` pairs → a dispatch inputs object. `k=v` with no `=` is an error. */\nexport function parseInputs(pairs: string[] | undefined): Record<string, string> {\n const inputs: Record<string, string> = {};\n for (const pair of pairs ?? []) {\n const eq = pair.indexOf('=');\n if (eq === -1) {\n throw new ActionsCliError('invalid_argument', `Invalid --inputs entry \"${pair}\". Expected key=value.`);\n }\n inputs[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return inputs;\n}\n\n/** Match `--workflow` to a workflow by path first, then by name. */\nexport function matchWorkflow(\n workflows: CiWorkflow[],\n selector: string,\n): CiWorkflow | undefined {\n return (\n workflows.find((w) => w.path === selector) ??\n workflows.find((w) => w.name === selector) ??\n workflows.find((w) => w.id === selector)\n );\n}\n\n/** Match `--job` to a run's job by id, then by name. */\nexport function matchJob(jobs: CiJob[], selector: string): CiJob | undefined {\n return jobs.find((j) => j.id === selector) ?? jobs.find((j) => j.name === selector);\n}\n\n// ─── Logs ───────────────────────────────────────────────────────────────────\n\nasync function readWholeJobLog(client: ActionsClient, jobId: string, step?: string): Promise<CiLogSlice> {\n const segments: CiLogSlice['segments'] = [];\n let offset = 0;\n let slice: CiLogSlice;\n do {\n slice = await client.get<CiLogSlice>(`/api/v1/actions/jobs/${jobId}/logs`, {\n offset: String(offset),\n step,\n });\n segments.push(...slice.segments);\n offset = slice.nextOffset;\n } while (slice.truncated);\n return { ...slice, segments };\n}\n\n/** Follow one job's log over the SSE `follow=1` slice stream, resuming on reconnect. */\nasync function* followJobLog(client: ActionsClient, jobId: string, step?: string): AsyncGenerator<CiLogSlice> {\n let offset = 0;\n for (;;) {\n let terminal = false;\n for await (const raw of client.sse(`/api/v1/actions/jobs/${jobId}/logs`, {\n offset: String(offset),\n follow: '1',\n step,\n })) {\n const slice = raw as CiLogSlice;\n offset = slice.nextOffset;\n if (slice.segments.length > 0 || slice.state !== 'running') yield slice;\n if (slice.state !== 'running' && slice.state !== 'pending' && !slice.truncated) {\n terminal = true;\n }\n }\n if (terminal) return;\n // The connection ended (server-side ceiling or a drop): resume from the\n // offset we hold — resumable cursors make this a continuation, not a replay.\n }\n}\n\n/** `--step` CLI value → the watch-cursor step field. */\nexport function parseStep(step: string | undefined): number | 'runner' | null {\n if (step === undefined) return null;\n if (step === 'runner') return 'runner';\n const n = Number(step);\n if (!Number.isInteger(n) || n < 0) {\n throw new ActionsCliError('invalid_argument', `Invalid --step \"${step}\". Expected a step ordinal or \"runner\".`);\n }\n return n;\n}\n\n/** Follow a run's logs across jobs via the multiplexed run stream. */\nasync function* followRunLogs(\n client: ActionsClient,\n runId: string,\n jobs: CiJob[],\n step?: string,\n): AsyncGenerator<{ job: CiJob; slice: CiLogSlice }> {\n const cursorStep = parseStep(step);\n const offsets = new Map<string, number>(jobs.map((j) => [j.id, 0]));\n const byCursor = new Map<string, CiJob>(jobs.map((j, i) => [`j${i}`, j]));\n for (;;) {\n let done = false;\n const watch = jobs.map((j, i) =>\n encodeWatchCursor(`j${i}`, j.id, cursorStep, offsets.get(j.id) ?? 0),\n );\n for await (const raw of client.sse(`/api/v1/actions/runs/${runId}/stream`, { watch })) {\n const msg = raw as\n | { type: 'state'; state: unknown }\n | { type: 'log'; cursor: string; slice: CiLogSlice }\n | { type: 'done' }\n | { type: 'reconnect' };\n if (msg.type === 'log') {\n const job = byCursor.get(msg.cursor);\n if (job) {\n offsets.set(msg.slice.jobId, msg.slice.nextOffset);\n yield { job, slice: msg.slice };\n }\n } else if (msg.type === 'done') {\n done = true;\n break;\n } else if (msg.type === 'reconnect') {\n break;\n }\n }\n if (done) return;\n // Both an explicit `reconnect` event and an unexpected EOF resume from the\n // offsets we hold; back off briefly so a repeatedly-closing server doesn't\n // spin the loop.\n await new Promise((r) => setTimeout(r, 1000));\n }\n}\n\n// Job and step names come from workflow files — potentially attacker-controlled\n// in a PR context — so strip control characters before writing to the terminal.\nfunction safeTerm(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, '�');\n}\n\nexport function formatRunHistory(history: CiRunHistory): string {\n const lines: string[] = [];\n const parts = (Object.entries(history.conclusions) as [string, number][])\n .map(([c, n]) => `${n} ${c}`)\n .join(', ');\n lines.push(`last ${history.runCount} runs: ${parts || 'none'}`);\n if (history.jobs.length > 0) {\n lines.push('');\n lines.push(pc.bold('jobs'));\n for (const job of history.jobs) {\n const rate = job.runs > 0 ? Math.round((job.failedRuns / job.runs) * 100) : 0;\n const platform = job.failedBeforeSteps > 0 ? pc.dim(` (${job.failedBeforeSteps} failed before steps)`) : '';\n const count = `${job.failedRuns}/${job.runs} runs failed`;\n const label = job.failedRuns > 0 ? pc.red(count) : pc.green(count);\n lines.push(` ${safeTerm(job.job)} ${label} ${rate}%${platform}`);\n for (const step of job.steps) {\n lines.push(pc.dim(` step \"${safeTerm(step.step)}\" failed in ${step.failedRuns} run${step.failedRuns === 1 ? '' : 's'}`));\n }\n }\n }\n const failed = history.runs.filter(\n (r) => r.conclusion === 'failed' || r.failedJobs.length > 0,\n );\n if (failed.length > 0) {\n lines.push('');\n lines.push(pc.bold('failed runs'));\n for (const run of failed) {\n const blame = run.failedJobs.length > 0\n ? run.failedJobs.map((j) => safeTerm(j.step === null ? j.job : `${j.job}:${j.step}`)).join(', ')\n : pc.dim('(no failed job recorded)');\n lines.push(` ${shortSha(run.headSha)} ${pc.dim(run.startedAt)} ${blame}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function formatProviderRow(p: CiProviderInfo): string {\n const icon = p.usable ? pc.green('●') : pc.gray('○');\n const name = p.usable ? pc.white(p.provider) : pc.gray(p.provider);\n const flags = [\n p.credential,\n p.actCapable ? pc.green('act') : pc.gray('no-act'),\n p.regions.length > 0 ? `regions: ${p.regions.join(',')}` : 'no region choice',\n p.position === null ? pc.gray('not in provider order') : `order #${p.position}`,\n ].join(' ');\n return ` ${icon} ${name} ${flags}`;\n}\n\nexport function formatVerifyResult(r: CiProviderKeyResponse): string {\n const ok = r.verified === true;\n const head = ok ? pc.green('verified') : pc.red('not verified');\n const detail = r.key.statusDetail ? pc.dim(` ${r.key.statusDetail}`) : '';\n const act = r.key.actCapable ? pc.green(' act-capable') : '';\n return `${head} ${r.key.provider}${act}${detail}`;\n}\n\nfunction formatRepoRow(r: CiRepo): string {\n const head = r.enabled ? pc.green('enabled') : pc.dim('disabled');\n const via = r.authType === 'github_app' ? 'github-app' : r.authType;\n const workflows =\n r.workflowPaths.length > 0\n ? `${r.workflowPaths.length} workflow${r.workflowPaths.length === 1 ? '' : 's'}`\n : 'no workflows yet';\n const error = r.lastPollError ? pc.red(` poll error: ${safeTerm(r.lastPollError)}`) : '';\n return `${head} ${safeTerm(r.fullName)} ${pc.dim(`${safeTerm(via)} · ${safeTerm(r.defaultBranch)} · ${workflows}`)}${error}`;\n}\n\n/** Print what an enable/connect discovered — one dim line, nothing on a clean run. */\nfunction printDiscovery(d: { workflowsFound: boolean; seeded: boolean; error: string | null }): void {\n if (d.error) {\n console.log(pc.yellow(`discovery: ${safeTerm(d.error)} (the poll cron retries)`));\n return;\n }\n console.log(pc.dim(`discovery: ${d.workflowsFound ? 'workflows found' : 'no workflows yet'}${d.seeded ? ', cursors seeded' : ''}`));\n}\n\n// ─── Commands ───────────────────────────────────────────────────────────────\n\n/**\n * The `POST /api/v1/actions/dispatch` body for `dispatch`. Without --manual a\n * workflow must declare `workflow_dispatch`. With it, a workflow that doesn't\n * is run anyway; such a run has no inputs, so any given are refused rather\n * than silently dropped. A dispatchable workflow keeps its inputs either way.\n */\nexport function dispatchBody(\n workflow: CiWorkflow,\n opts: { ref?: string; inputs?: string[]; manual?: boolean; provider?: string; providerRegion?: string },\n): Record<string, unknown> {\n if (!workflow.dispatchable && !opts.manual) {\n throw new ActionsCliError(\n 'invalid_argument',\n `Workflow \"${workflow.path}\" does not declare workflow_dispatch. Pass --manual to run it anyway (no inputs).`,\n );\n }\n if (!workflow.dispatchable && opts.inputs !== undefined && opts.inputs.length > 0) {\n throw new ActionsCliError(\n 'invalid_argument',\n `Workflow \"${workflow.path}\" has no workflow_dispatch inputs; --manual runs of it take no --inputs.`,\n );\n }\n const ref = opts.ref ?? workflow.refs[0];\n if (!ref) throw new ActionsCliError('invalid_argument', 'No --ref given and the workflow has no watched refs.');\n if (opts.providerRegion !== undefined && opts.provider === undefined) {\n throw new ActionsCliError('invalid_argument', '--provider-region requires --provider.');\n }\n return {\n workflowId: workflow.id,\n ref,\n inputs: parseInputs(opts.inputs),\n ...(opts.manual && { manual: true }),\n ...(opts.provider !== undefined && {\n provider: opts.provider,\n ...(opts.providerRegion !== undefined && { providerRegion: opts.providerRegion }),\n }),\n };\n}\n\nexport function registerActionsCommands(program: Command): void {\n const actions = program\n .command('actions')\n .alias('ci')\n .description('Drive the benchmarks-platform Actions API')\n .configureOutput({ outputError: usageErrorOutput });\n\n const common = (cmd: Command) =>\n cmd\n .option('--api-key <key>', 'API key (default: $COMPUTE_API_KEY)')\n .option('--base-url <url>', 'API base URL (default: https://platform.computesdk.com)')\n .option('--allow-untrusted-host', 'send an explicit --api-key/env key to a non-computesdk, non-localhost --base-url (stored login credentials are never sent)')\n .option('--json', 'print machine-readable JSON');\n\n common(\n actions\n .command('dispatch')\n .description('Dispatch a workflow_dispatch run (or any workflow with --manual)')\n .argument('<repo>', 'repository in owner/repo format')\n .requiredOption('--workflow <path|name>', 'workflow path or name')\n .option('--ref <ref>', 'git ref to run (default: the workflow\\'s first watched ref)')\n .option('--inputs <pairs...>', 'workflow inputs as key=value (workflow_dispatch inputs only)')\n .option('--manual', 'run a workflow even if it does not declare workflow_dispatch (such runs take no --inputs)')\n .option('--provider <id>', 'place the run on one provider (e.g. namespace, vercel:sfo1) instead of the org provider order')\n .option('--provider-region <region>', 'region for --provider (same as --provider <id>:<region>)'),\n ).action(async (repo: string, opts: CommonOpts & { workflow: string; ref?: string; inputs?: string[]; manual?: boolean; provider?: string; providerRegion?: string }) => {\n try {\n const c = await client(opts);\n const { workflows } = await c.get<{ workflows: CiWorkflow[] }>(\n '/api/v1/actions/workflows',\n { repo },\n );\n const workflow = matchWorkflow(workflows, opts.workflow);\n if (!workflow) {\n const choices = workflows.map((w) => `${w.path} (${w.name})`).join(', ') || 'none';\n throw new ActionsCliError(\n 'workflow_not_found',\n `No workflow \"${opts.workflow}\" in ${repo}. Available: ${choices}`,\n );\n }\n const body = dispatchBody(workflow, opts);\n const result = await c.post<{ runId: string; created: boolean; headSha: string }>(\n '/api/v1/actions/dispatch',\n body,\n );\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${result.runId}`;\n output(opts, { ...result, url }, (r) => {\n console.log(`${r.created ? 'dispatched' : 'already running'} ${pc.cyan(r.runId)}`);\n console.log(`sha: ${r.headSha}`);\n console.log(`url: ${r.url}`);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('runs')\n .description('List recent runs for a repo')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--status <status...>', 'filter by conclusion: passed, failed, running, cancelled, none')\n .option('--branch <branch...>', 'filter by branch/ref'),\n ).action(async (repo: string, opts: CommonOpts & { status?: string[]; branch?: string[] }) => {\n try {\n const { runs } = await (await client(opts)).get<{ runs: CiRun[] }>(\n '/api/v1/actions/runs',\n { repo, status: opts.status, branch: opts.branch },\n );\n output(opts, runs, (rs) => {\n if (rs.length === 0) {\n console.log('No runs found.');\n return;\n }\n for (const run of rs) console.log(formatRunRow(run));\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('history')\n .description('Recent run history for a workflow — per-job/step failure rates (is this failure flaky?)')\n .argument('<repo>', 'repository in owner/repo format')\n .requiredOption('--workflow <path|name>', 'workflow path or name')\n .option('--branch <branch...>', 'narrow the window to branches/refs')\n .option('--job <job>', 'narrow the rollup to one job name or workflow job id')\n .option('--limit <n>', 'runs in the window (default 10, max 50)'),\n ).action(async (repo: string, opts: CommonOpts & { workflow: string; branch?: string[]; job?: string; limit?: string }) => {\n try {\n const c = await client(opts);\n const { workflows } = await c.get<{ workflows: CiWorkflow[] }>(\n '/api/v1/actions/workflows',\n { repo },\n );\n const workflow = matchWorkflow(workflows, opts.workflow) ?? workflows.find((w) => w.path === opts.workflow);\n const workflowPath = workflow?.path ?? opts.workflow;\n const history = await c.get<CiRunHistory>('/api/v1/actions/history', {\n repo,\n workflow: workflowPath,\n branch: opts.branch,\n job: opts.job,\n limit: opts.limit,\n });\n output(opts, history, (h) => console.log(formatRunHistory(h)));\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('run')\n .description('Show a run: jobs, provider:region placement, placement attempts')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = await client(opts);\n const run = await c.get<CiRun>(`/api/v1/actions/runs/${runId}`);\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${run.id}`;\n // A failed run's interesting part is its failure digest; on deployments\n // that have the summary route it prints inline, saving a second command.\n const summary = run.conclusion === 'failed' ? await fetchRunSummary(c, runId) : null;\n output(opts, { ...run, url, summary }, (r) => {\n console.log(formatRunDetail(r, r.url));\n if (summary && summary.failures.length > 0) {\n console.log('');\n console.log(formatRunSummary(summary));\n }\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('summary')\n .description('Show a run\\'s failure digest: failed jobs, failed steps, bounded log tails')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const summary = await (await client(opts)).get<CiRunSummary>(`/api/v1/actions/runs/${runId}/summary`);\n output(opts, summary, (s) => console.log(formatRunSummary(s)));\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('inspect')\n .description('Inspect a run: resolved runner image, caches, secret names, concurrency, placement context')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = await client(opts);\n const inspection = await c.get<CiRunInspection>(\n `/api/v1/actions/runs/${runId}/state`,\n );\n output(opts, inspection, (r) => console.log(formatRunInspection(r)));\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('logs')\n .description('Print or follow a run\\'s job logs')\n .argument('<run-id>', 'run ID')\n .option('--job <job>', 'job ID or name (default: all jobs)')\n .option('--step <step>', 'step ordinal or \"runner\" (default: whole job)')\n .option('--follow', 'stream logs while the run is live'),\n ).action(async (runId: string, opts: CommonOpts & { job?: string; step?: string; follow?: boolean }) => {\n try {\n const c = await client(opts);\n let jobs = await listRunJobs(c, runId);\n if (opts.job) {\n const job = matchJob(jobs, opts.job);\n if (!job) {\n throw new Error(\n `No job \"${opts.job}\" in run ${runId}. Jobs: ${jobs.map((j) => j.name).join(', ') || 'none'}`,\n );\n }\n jobs = [job];\n }\n if (jobs.length === 0) {\n if (opts.json) output(opts, { segments: [] }, () => {});\n else console.error('Run has no jobs yet.');\n return;\n }\n\n if (!opts.follow) {\n for (const job of jobs) {\n const slice = await readWholeJobLog(c, job.id, opts.step);\n if (opts.json) {\n process.stdout.write(JSON.stringify({ jobId: job.id, name: job.name, slice }) + '\\n');\n } else {\n if (jobs.length > 1) console.log(pc.bold(`── ${job.name} ──`));\n for (const seg of slice.segments) process.stdout.write(seg.text);\n }\n }\n return;\n }\n\n if (jobs.length === 1) {\n // Single job: the slice endpoint's own SSE, resumed on reconnect.\n for await (const slice of followJobLog(c, jobs[0].id, opts.step)) {\n if (opts.json) {\n process.stdout.write(JSON.stringify(slice) + '\\n');\n } else {\n for (const seg of slice.segments) process.stdout.write(seg.text);\n }\n }\n return;\n }\n\n // Multiple jobs: one multiplexed stream, each slice tagged by job.\n for await (const { job, slice } of followRunLogs(c, runId, jobs, opts.step)) {\n if (opts.json) {\n process.stdout.write(JSON.stringify({ jobId: job.id, name: job.name, slice }) + '\\n');\n } else {\n for (const seg of slice.segments) {\n const text = seg.text.replace(/\\n/g, `\\n[${job.name}] `);\n process.stdout.write(`[${job.name}] ${text}`);\n }\n }\n }\n } catch (e) {\n fail(e, opts);\n }\n });\n\n const providers = actions\n .command('providers')\n .description('List the org\\'s registered compute providers (regions, act/usable status)');\n common(providers).action(async (opts: CommonOpts) => {\n try {\n const data = await (await client(opts)).get<CiProvidersResponse>('/api/v1/actions/providers');\n output(opts, data, (d) => {\n for (const p of d.providers) console.log(formatProviderRow(p));\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n providers\n .command('configure')\n .description('Save the org\\'s credential for a provider (owner/admin API key)')\n .argument('<provider>', 'provider id (e.g. tensorlake, blaxel)')\n .option('--key <key>', 'provider API key (single-field credentials)')\n .option('--field <pair...>', 'credential fields as name=value (multi-field providers)')\n .option('--verify', 'run the placement probe after saving'),\n ).action(async (provider: string, opts: CommonOpts & { key?: string; field?: string[]; verify?: boolean }) => {\n try {\n const c = await client(opts);\n let body: Record<string, unknown>;\n if (opts.field !== undefined) {\n if (opts.key !== undefined) throw new Error('Pass either --key or --field, not both.');\n body = { fields: parseInputs(opts.field) };\n } else if (opts.key !== undefined) {\n body = { key: opts.key };\n } else {\n throw new Error('Pass --key <key> or --field name=value.');\n }\n const saved = await c.put<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/key`,\n body,\n );\n const verification = opts.verify\n ? await c.post<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/verify`,\n )\n : undefined;\n output(opts, verification ? { key: saved.key, verification } : saved, () => {\n console.log(`saved ${saved.key.provider} ${pc.dim(saved.key.keyHint)} ${saved.key.status}`);\n if (verification) console.log(formatVerifyResult(verification));\n });\n if (verification?.verified === false) process.exitCode = 1;\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n providers\n .command('verify')\n .description('Probe the stored provider key with a real sandbox (\"Test\" in Settings)')\n .argument('<provider>', 'provider id'),\n ).action(async (provider: string, opts: CommonOpts) => {\n try {\n const result = await (await client(opts)).post<CiProviderKeyResponse>(\n `/api/v1/actions/providers/${provider}/verify`,\n );\n output(opts, result, (r) => console.log(formatVerifyResult(r)));\n if (result.verified === false) process.exitCode = 1;\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n providers\n .command('remove')\n .description('Delete the org\\'s stored credential for a provider')\n .argument('<provider>', 'provider id'),\n ).action(async (provider: string, opts: CommonOpts) => {\n try {\n const result = await (await client(opts)).del<{ provider: string; deleted: boolean }>(\n `/api/v1/actions/providers/${provider}/key`,\n );\n output(opts, result, (r) => {\n console.log(r.deleted ? `deleted ${r.provider}` : `no key stored for ${r.provider}`);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n const repos = actions\n .command('repos')\n .description('List the org\\'s connected repositories');\n common(repos).action(async (opts: CommonOpts) => {\n try {\n const data = await (await client(opts)).get<CiReposResponse>('/api/v1/actions/repos');\n output(opts, data, (d) => {\n for (const r of d.repos) console.log(formatRepoRow(r));\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n repos\n .command('connect')\n .description('Connect a git remote (validated by a real ls-remote; lands enabled)')\n .argument('<cloneUrl>', 'http(s) or ssh git remote URL')\n .option('--name <owner/repo>', 'repo name override (default: derived from cloneUrl)')\n .option('--branch <branch>', 'default branch (default: main, else the remote\\'s first)')\n .option('--token <token>', 'credential for private http(s) remotes')\n .option('--username <user>', 'username — with --token, makes auth \"basic\" instead of \"token\"')\n .option('--ssh-key-file <path>', 'OpenSSH/PEM private key file for ssh remotes')\n .option('--known-hosts-file <path>', 'known_hosts pin for ssh remotes'),\n ).action(async (cloneUrl: string, opts: CommonOpts & { name?: string; branch?: string; token?: string; username?: string; sshKeyFile?: string; knownHostsFile?: string }) => {\n try {\n let body: Record<string, unknown>;\n if (opts.sshKeyFile !== undefined) {\n if (opts.token !== undefined || opts.username !== undefined) {\n throw new Error('Pass either --ssh-key-file or --token/--username, not both.');\n }\n body = {\n authType: 'ssh',\n credential: readFileSync(opts.sshKeyFile, 'utf8'),\n ...(opts.knownHostsFile !== undefined && {\n knownHosts: readFileSync(opts.knownHostsFile, 'utf8'),\n }),\n };\n } else if (opts.username !== undefined) {\n if (opts.token === undefined) throw new Error('--username requires --token.');\n body = { authType: 'basic', username: opts.username, credential: opts.token };\n } else if (opts.token !== undefined) {\n body = { authType: 'token', credential: opts.token };\n } else {\n body = { authType: 'none' };\n }\n if (opts.knownHostsFile !== undefined && opts.sshKeyFile === undefined) {\n throw new Error('--known-hosts-file requires --ssh-key-file.');\n }\n const result = await (await client(opts)).post<CiRepoConnectResponse>('/api/v1/actions/repos', {\n cloneUrl,\n ...body,\n ...(opts.name !== undefined && { name: opts.name }),\n ...(opts.branch !== undefined && { defaultBranch: opts.branch }),\n });\n output(opts, result, (r) => {\n console.log(`connected ${pc.cyan(safeTerm(r.fullName))} ${pc.dim(`(${safeTerm(r.authType)}, ${safeTerm(r.defaultBranch)})`)}`);\n printDiscovery(r.discovery);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n repos\n .command('enable')\n .description('Enable a repo the org can already see (granted by a GitHub App install, or a connected remote)')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--repo-id <id>', 'scope to one row when two installations grant the same name'),\n ).action(async (repo: string, opts: CommonOpts & { repoId?: string }) => {\n try {\n const result = await (await client(opts)).patch<CiRepoPatchResponse>('/api/v1/actions/repos', {\n fullName: repo,\n enabled: true,\n ...(opts.repoId !== undefined && { repoId: opts.repoId }),\n });\n output(opts, result, (r) => {\n console.log(`enabled ${pc.cyan(safeTerm(r.fullName))}`);\n if (r.discovery) printDiscovery(r.discovery);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n repos\n .command('disable')\n .description('Disable a repo — it stays connected but no runs are scheduled')\n .argument('<repo>', 'repository in owner/repo format')\n .option('--repo-id <id>', 'scope to one row when two installations grant the same name'),\n ).action(async (repo: string, opts: CommonOpts & { repoId?: string }) => {\n try {\n const result = await (await client(opts)).patch<CiRepoPatchResponse>('/api/v1/actions/repos', {\n fullName: repo,\n enabled: false,\n ...(opts.repoId !== undefined && { repoId: opts.repoId }),\n });\n output(opts, result, (r) => console.log(`disabled ${pc.cyan(safeTerm(r.fullName))}`));\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('cancel')\n .description('Cancel a run')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const result = await (await client(opts)).post<{ cancelled: boolean }>(\n `/api/v1/actions/runs/${runId}/cancel`,\n );\n output(opts, result, (r) => {\n console.log(r.cancelled ? `Cancelled ${runId}` : `Run ${runId} was already finished`);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('rerun')\n .description('Re-run a finished run at the same commit')\n .argument('<run-id>', 'run ID'),\n ).action(async (runId: string, opts: CommonOpts) => {\n try {\n const c = await client(opts);\n const result = await c.post<{ runId: string; created: boolean }>(\n `/api/v1/actions/runs/${runId}/rerun`,\n );\n const org = await c.org();\n const url = `${c.baseUrl}/${org.slug}/actions/runs/${result.runId}`;\n output(opts, { ...result, url }, (r) => {\n console.log(`${r.created ? 'rerun dispatched' : 'rerun already running'} ${pc.cyan(r.runId)}`);\n console.log(`url: ${r.url}`);\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n\n common(\n actions\n .command('artifacts')\n .description('List or download a run\\'s artifacts')\n .argument('<run-id>', 'run ID')\n .option('--job <job>', 'job ID or name (default: all jobs)')\n .option('--out <dir>', 'download artifacts into this directory instead of listing'),\n ).action(async (runId: string, opts: CommonOpts & { job?: string; out?: string }) => {\n try {\n const c = await client(opts);\n let jobs = await listRunJobs(c, runId);\n if (opts.job) {\n const job = matchJob(jobs, opts.job);\n if (!job) throw new Error(`No job \"${opts.job}\" in run ${runId}.`);\n jobs = [job];\n }\n const entries: { job: CiJob; artifacts: CiArtifactListItem[] }[] = [];\n for (const job of jobs) {\n const artifacts = await c.get<CiArtifactListItem[]>(\n `/api/v1/actions/jobs/${job.id}/artifacts`,\n );\n entries.push({ job, artifacts });\n }\n\n if (opts.out) {\n const written: { jobId: string; id: string; file: string }[] = [];\n for (const { job, artifacts } of entries) {\n // Per-job directory: artifact names are not unique across jobs.\n const jobDir = join(opts.out, sanitizePathPart(job.name || job.id));\n mkdirSync(jobDir, { recursive: true });\n for (const artifact of artifacts) {\n if (artifact.expired || artifact.skippedReason) continue;\n const bytes = await c.download(\n `/api/v1/actions/jobs/${job.id}/artifacts/${artifact.id}`,\n );\n const file = join(jobDir, sanitizePathPart(artifact.fileName || artifact.name));\n writeFileSync(file, bytes);\n written.push({ jobId: job.id, id: artifact.id, file });\n }\n }\n output(opts, written, (ws) => {\n for (const w of ws) console.log(`wrote ${w.file}`);\n if (ws.length === 0) console.log('No downloadable artifacts.');\n });\n return;\n }\n\n output(opts, entries.map((e) => ({ jobId: e.job.id, job: e.job.name, artifacts: e.artifacts })), (es) => {\n let any = false;\n for (const { job, artifacts } of es) {\n for (const a of artifacts) {\n any = true;\n const flags = a.expired ? ' expired' : a.skippedReason ? ` skipped: ${a.skippedReason}` : '';\n console.log(\n `${job} ${a.id} ${a.name} ${a.contentType} ${a.byteLength}B${flags}`,\n );\n }\n }\n if (!any) console.log('No artifacts.');\n });\n } catch (e) {\n fail(e, opts);\n }\n });\n}\n","/**\n * Thin client for the benchmarks-platform Actions v1 API.\n * Types mirror the wire shapes in benchmarks-platform `lib/ci/types.ts` —\n * keep them in sync by hand; the API is the contract.\n */\n\n\nexport const DEFAULT_BASE_URL = 'https://platform.computesdk.com';\n\nexport interface ActionsAuth {\n apiKey: string;\n baseUrl: string;\n}\n\nexport interface CiWorkflowInput {\n name: string;\n description: string;\n type: 'string' | 'number' | 'boolean' | 'choice' | 'environment';\n required: boolean;\n default: string;\n options?: string[];\n}\n\nexport interface CiWorkflow {\n id: string;\n repoFullName: string;\n name: string;\n path: string;\n dispatchable: boolean;\n refs: string[];\n inputs: CiWorkflowInput[];\n schedules: unknown[];\n}\n\nexport type CiConclusion = 'passed' | 'failed' | 'running' | 'cancelled' | 'none';\nexport type CiJobState =\n | 'queued'\n | 'running'\n | 'passed'\n | 'failed'\n | 'skipped'\n | 'cancelled';\n\nexport interface CiPlacementAttempt {\n provider: string;\n region?: string | null;\n error: string;\n}\n\nexport interface CiStep {\n name: string;\n state: CiJobState;\n durationMs: number | null;\n exitCode: number | null;\n}\n\nexport interface CiJob {\n id: string;\n name: string;\n needs: string[];\n workflowJobId: string | null;\n matrix: Record<string, string> | null;\n state: CiJobState;\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n placementAttempts: CiPlacementAttempt[];\n durationMs: number | null;\n steps: CiStep[];\n}\n\nexport interface CiRun {\n id: string;\n repoFullName: string;\n ref: string;\n branchReason: string | null;\n headSha: string;\n event: string;\n prNumber: number | null;\n runNumber: number | null;\n title: string;\n workflowPath: string;\n workflowName: string;\n conclusion: CiConclusion;\n startedAt: string;\n durationMs: number | null;\n supersededByRunId: string | null;\n concurrencyGroup: string | null;\n cancellationReason: string | null;\n /** `provider[:region]` the dispatch pinned this run to, else null. */\n providerOverride?: string | null;\n jobs: CiJob[];\n logTail: string[];\n}\n\n/**\n * One job of `GET /api/v1/actions/runs/{id}/state`: the live fields plus the\n * context that decided how the job ran — resolved runner image, container\n * pin, concurrency group, timeout/fetch-depth overrides.\n */\nexport interface CiJobInspection {\n id: string;\n name: string;\n state: CiJobState;\n provider: string | null;\n region: string | null;\n sandboxId: string | null;\n startedAt: string | null;\n finishedAt: string | null;\n placementAttempts: CiPlacementAttempt[];\n /** Why the platform failed the job before steps ran, when it did. */\n failureReason: string | null;\n /** The `runs-on:` labels as declared. */\n runsOn: string[];\n /** The `computesdk:` placement pin the labels carried, when one did. */\n placementHint: { provider: string; region: string | null; label: string } | null;\n /** Labels act actually read (placement labels stripped, default substituted). */\n resolvedRunsOn: string[] | null;\n runsOnHasExpression: boolean;\n /** The image the job's steps ran in: container pin, else the mapped label. */\n runnerImage: string | null;\n /** The literal `container:` image the job declared, if any. */\n container: string | null;\n timeoutMinutes: number | null;\n /** Deepest `fetch-depth` a checkout step pinned (0 = full history). */\n fetchDepth: number | null;\n concurrencyGroup: string | null;\n concurrencyCancelInProgress: boolean;\n matrix: Record<string, string> | null;\n steps: {\n ordinal: number;\n name: string;\n state: CiJobState;\n exitCode: number | null;\n startedAt: string | null;\n finishedAt: string | null;\n }[];\n}\n\n/** A cache entry the run's window touched (saved or restored). */\nexport interface CiRunCacheTouch {\n key: string;\n version: string;\n scopeRef: string;\n sizeBytes: number;\n savedAt: string | null;\n restoredAt: string | null;\n}\n\n/** `GET /api/v1/actions/runs/{id}/state` — a run plus its effective context. */\nexport interface CiRunInspection {\n id: string;\n conclusion: CiConclusion;\n runNumber: number | null;\n ref: string;\n headSha: string;\n event: string;\n queuedAt: string;\n startedAt: string | null;\n finishedAt: string | null;\n supersededByRunId: string | null;\n cancellationReason: string | null;\n /** Why the run was refused before placement, when it was. */\n blockedReason: string | null;\n concurrencyGroup: string | null;\n dispatchInputs: Record<string, string> | null;\n providerOverride: string | null;\n /** The commit the stored workflow definition was parsed from. */\n workflowParsedFromSha: string | null;\n /**\n * True when the stored parse came from a different commit than the run's\n * head — the definition-derived fields may then describe a newer workflow\n * than the run used (a fork pull request always shows this by design).\n */\n definitionStale: boolean;\n /** Secret *names* the jobs could reference — never values. */\n secrets: {\n access: 'declared' | 'all';\n /** Whether named secrets are also exported as job env vars. */\n env: boolean;\n names: string[];\n } | null;\n caches: CiRunCacheTouch[];\n jobs: CiJobInspection[];\n}\n\n/**\n * `GET /api/v1/actions/runs/{runId}/summary` — a run's failure digest.\n * Wire shape mirrors `CiRunSummary` in benchmarks-platform `lib/ci/run-summary.ts`.\n */\nexport interface CiRunSummaryJob {\n id: string;\n name: string;\n conclusion: CiJobState;\n provider: string | null;\n region: string | null;\n}\n\nexport interface CiRunSummaryFailedStep {\n ordinal: number;\n name: string;\n exitCode: number | null;\n}\n\nexport interface CiRunSummaryFailure extends CiRunSummaryJob {\n failureReason: string | null;\n failedSteps: CiRunSummaryFailedStep[];\n excerpt: {\n stepOrdinal: number | null;\n text: string;\n truncated: boolean;\n } | null;\n}\n\nexport interface CiRunSummary {\n runId: string;\n conclusion: CiConclusion;\n jobs: CiRunSummaryJob[];\n failures: CiRunSummaryFailure[];\n}\n\nexport interface CiArtifactListItem {\n id: string;\n name: string;\n fileName: string;\n contentType: string;\n byteLength: number;\n fileCount: number;\n skippedReason: string | null;\n expiresAt: string;\n expired: boolean;\n}\n\nexport interface CiLogSegment {\n byteOffset: number;\n stream: 'stdout' | 'stderr';\n stepOrdinal: number | null;\n text: string;\n}\n\n/** One resumable read of a job log. Resume from `nextOffset`. */\nexport interface CiLogSlice {\n jobId: string;\n fromOffset: number;\n nextOffset: number;\n totalBytes: number;\n segments: CiLogSegment[];\n state: 'running' | 'complete' | 'failed' | 'cancelled' | 'expired' | 'pending';\n truncated: boolean;\n}\n\nexport interface CiProviderInfo {\n provider: string;\n /** Selectable regions for `provider:region` order entries; empty when unknown. */\n regions: string[];\n credential: 'ambient' | 'configured' | 'not-configured';\n /** In the effective act set: built-ins, CI_ACT_PROVIDERS override, act-probe-verified keys. */\n actCapable: boolean;\n /** A placement reaching the provider finds credentials. */\n usable: boolean;\n /** 1-based position in the effective provider order, null when absent. */\n position: number | null;\n}\n\nexport interface CiProvidersResponse {\n providerOrder: string[];\n providers: CiProviderInfo[];\n}\n\n/** A saved provider credential — never carries key material, only the hint. */\nexport interface CiProviderKeyRecord {\n provider: string;\n keyHint: string;\n lastCheckedAt: string | null;\n status: 'connected' | 'error' | 'unconfigured';\n statusDetail: string | null;\n actCapable: boolean;\n credential: 'key';\n fields: unknown[];\n}\n\nexport interface CiProviderKeyResponse {\n key: CiProviderKeyRecord;\n /** Present on the verify response. */\n verified?: boolean;\n}\n\n/** One failed job inside a run-history entry — step is the first failed step. */\nexport interface CiRunJobFailure {\n job: string;\n workflowJobId: string | null;\n step: string | null;\n stepOrdinal: number | null;\n}\n\nexport interface CiRunHistoryEntry {\n id: string;\n ref: string;\n headSha: string;\n runNumber: number | null;\n conclusion: CiConclusion;\n startedAt: string;\n failedJobs: CiRunJobFailure[];\n}\n\nexport interface CiJobHistory {\n job: string;\n /** The workflow job key, when recorded; disambiguates same-named jobs. */\n workflowJobId: string | null;\n /** Runs in the window that contained this job. */\n runs: number;\n failedRuns: number;\n /** Runs where the job failed with no step blamed (platform failures). */\n failedBeforeSteps: number;\n steps: { step: string; ordinal: number; failedRuns: number }[];\n}\n\n/** `GET /api/v1/actions/history` — the window plus the rollup over it. */\nexport interface CiRunHistory {\n runCount: number;\n conclusions: Partial<Record<CiConclusion, number>>;\n jobs: CiJobHistory[];\n runs: CiRunHistoryEntry[];\n}\n\nexport interface ActionsOrg {\n organizationId: string;\n name: string;\n slug: string;\n}\n\n/**\n * One row of `GET /api/v1/actions/repos`: a repo the org can run CI on,\n * GitHub-App-granted or a generic git remote.\n */\nexport interface CiRepo {\n repoId: string;\n fullName: string;\n defaultBranch: string;\n enabled: boolean;\n private: boolean;\n forkPullRequests: boolean;\n /** `github_app` for App-granted repos; `none`/`token`/`basic`/`ssh` for remotes. */\n authType: string;\n cloneUrl: string | null;\n githubInstallationId: number | null;\n workflowPaths: string[];\n disabledWorkflowCount: number;\n lastPolledAt: string | null;\n lastPollError: string | null;\n}\n\nexport interface CiReposResponse {\n repos: CiRepo[];\n}\n\n/** What an enable/remote-connect discovered before answering. */\nexport interface CiRepoDiscovery {\n workflowsFound: boolean;\n seeded: boolean;\n error: string | null;\n}\n\nexport interface CiRepoConnectResponse {\n repoId: string | null;\n fullName: string;\n defaultBranch: string;\n authType: string;\n discovery: CiRepoDiscovery;\n}\n\nexport interface CiRepoPatchResponse {\n fullName: string;\n enabled?: boolean;\n forkPullRequests?: boolean;\n discovery: CiRepoDiscovery | null;\n}\n\nexport class ActionsApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public body?: unknown,\n ) {\n super(message);\n this.name = 'ActionsApiError';\n }\n}\n\n/** Stable machine-readable codes for errors raised by the CLI itself. */\nexport type ActionsCliErrorCode =\n | 'no_credentials'\n | 'untrusted_host'\n | 'untrusted_host_stored_auth'\n | 'insecure_transport'\n | 'invalid_argument'\n | 'workflow_not_found';\n\n/** An error the CLI raised before or instead of an API call. */\nexport class ActionsCliError extends Error {\n constructor(\n public code: ActionsCliErrorCode,\n message: string,\n ) {\n super(message);\n this.name = 'ActionsCliError';\n }\n}\n\n/** The `--json` error envelope; `code` is stable, `message` is for humans. */\nexport interface ActionsErrorEnvelope {\n ok: false;\n error: {\n code: string;\n message: string;\n /** Present when the platform answered; absent for local/transport failures. */\n httpStatus?: number;\n retryable: boolean;\n /** The platform's `details` object, when its error response carried one. */\n details?: Record<string, unknown>;\n };\n}\n\nfunction codeForStatus(status: number): string {\n switch (status) {\n case 400: return 'bad_request';\n case 401: return 'unauthenticated';\n case 403: return 'forbidden';\n case 404: return 'not_found';\n case 409: return 'conflict';\n case 413: return 'payload_too_large';\n case 429: return 'rate_limited';\n default: return status >= 500 ? 'server_error' : 'http_error';\n }\n}\n\nfunction errorDetails(body: unknown): Record<string, unknown> | undefined {\n if (body && typeof body === 'object' && 'details' in body) {\n const details = (body as { details: unknown }).details;\n if (details && typeof details === 'object' && !Array.isArray(details)) {\n return details as Record<string, unknown>;\n }\n }\n return undefined;\n}\n\n/**\n * Classify any error thrown by an Actions command. API errors carry the HTTP\n * status; CLI errors carry their own code; a fetch rejection (DNS, refused\n * connection, TLS) is `network`; anything else is `unknown`.\n */\nexport function toErrorEnvelope(error: unknown): ActionsErrorEnvelope {\n if (error instanceof ActionsApiError) {\n const details = errorDetails(error.body);\n return {\n ok: false,\n error: {\n code: codeForStatus(error.status),\n message: error.message,\n httpStatus: error.status,\n retryable: error.status === 429 || error.status === 502 || error.status === 503 || error.status === 504,\n ...(details !== undefined && { details }),\n },\n };\n }\n if (error instanceof ActionsCliError) {\n return { ok: false, error: { code: error.code, message: error.message, retryable: false } };\n }\n // undici/Node fetch rejects with a TypeError whose cause is the socket error.\n if (error instanceof TypeError && /fetch failed/i.test(error.message)) {\n const cause = (error as { cause?: unknown }).cause;\n const detail = cause instanceof Error ? `: ${cause.message}` : '';\n return {\n ok: false,\n error: { code: 'network', message: `${error.message}${detail}`, retryable: true },\n };\n }\n return {\n ok: false,\n error: {\n code: 'unknown',\n message: error instanceof Error ? error.message : String(error),\n retryable: false,\n },\n };\n}\n\nexport class ActionsClient {\n private orgPromise: Promise<ActionsOrg> | null = null;\n\n constructor(\n private readonly auth: ActionsAuth,\n private readonly fetchImpl: typeof fetch = fetch,\n ) {}\n\n get baseUrl(): string {\n return this.auth.baseUrl;\n }\n\n /** The credential's org — fetched once, needed for dashboard URLs. */\n org(): Promise<ActionsOrg> {\n this.orgPromise ??= this.get<ActionsOrg>('/api/v1/actions/org');\n return this.orgPromise;\n }\n\n async get<T>(path: string, params?: Record<string, string | string[] | undefined>): Promise<T> {\n const url = new URL(`${this.auth.baseUrl}${path}`);\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue;\n for (const v of Array.isArray(value) ? value : [value]) url.searchParams.append(key, v);\n }\n const res = await this.fetchImpl(url, { headers: this.headers() });\n return this.parse<T>(res);\n }\n\n async post<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'POST',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async put<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'PUT',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async patch<T>(path: string, body: Record<string, unknown> = {}): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'PATCH',\n headers: { ...this.headers(), 'content-type': 'application/json' },\n body: JSON.stringify(body),\n });\n return this.parse<T>(res);\n }\n\n async del<T>(path: string): Promise<T> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n method: 'DELETE',\n headers: this.headers(),\n });\n return this.parse<T>(res);\n }\n\n /**\n * One `data:` JSON payload per SSE event. `next()` resolves to the payload,\n * or null when the stream ends. Call `close()` to abort.\n */\n async *sse(path: string, params?: Record<string, string | string[] | undefined>): AsyncGenerator<unknown> {\n const url = new URL(`${this.auth.baseUrl}${path}`);\n for (const [key, value] of Object.entries(params ?? {})) {\n if (value === undefined) continue;\n for (const v of Array.isArray(value) ? value : [value]) url.searchParams.append(key, v);\n }\n const res = await this.fetchImpl(url, { headers: this.headers() });\n if (!res.ok) {\n await this.parse(res); // throws\n }\n if (!res.body) throw new Error('SSE response has no body');\n yield* readSseEvents(res.body);\n }\n\n /** Download bytes following redirects (artifact URLs 302 to storage). */\n async download(path: string): Promise<Uint8Array> {\n const res = await this.fetchImpl(`${this.auth.baseUrl}${path}`, {\n headers: this.headers(),\n redirect: 'follow',\n });\n if (!res.ok) {\n const body = await res.json().catch(() => undefined);\n throw new ActionsApiError(res.status, errorMessage(body, res.status), body);\n }\n return new Uint8Array(await res.arrayBuffer());\n }\n\n private headers(): Record<string, string> {\n return { authorization: `Bearer ${this.auth.apiKey}` };\n }\n\n private async parse<T>(res: Response): Promise<T> {\n const body = await res.json().catch(() => undefined);\n if (!res.ok) throw new ActionsApiError(res.status, errorMessage(body, res.status), body);\n return body as T;\n }\n}\n\nfunction errorMessage(body: unknown, status: number): string {\n if (body && typeof body === 'object' && 'error' in body && typeof (body as { error: unknown }).error === 'string') {\n return (body as { error: string }).error;\n }\n return `Request failed with status ${status}`;\n}\n\n/** Minimal SSE reader: yields the JSON payload of each `data:` event. */\nexport async function* readSseEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const event = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n for (const line of event.split('\\n')) {\n if (line.startsWith('data: ')) {\n yield JSON.parse(line.slice(6));\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/** `id:jobId:step:offset` — the run-stream watch cursor wire format. */\nexport function encodeWatchCursor(\n id: string,\n jobId: string,\n step: number | 'runner' | null,\n offset: number,\n): string {\n const stepPart = step === null ? '-' : step === 'runner' ? 'runner' : String(step);\n return `${id}:${jobId}:${stepPart}:${offset}`;\n}\n\n/** The subset of `@benchsdk/cli`'s `resolveAuth` result Actions needs. */\nexport type StoredPlatformAuth = { apiKey?: string; token?: string };\nexport type StoredPlatformAuthResolver = (opts: { baseUrl: string }) => Promise<StoredPlatformAuth>;\n\nconst NO_CREDENTIALS_HINT =\n 'Set COMPUTE_API_KEY, pass --api-key, or run `compute bench auth login`.';\n\n/**\n * Precedence: `--api-key` > `COMPUTE_API_KEY` > `BENCHMARKS_PLATFORM_API_KEY`\n * (legacy) > platform OAuth credentials stored by `compute bench auth login`\n * (`~/.benchsdk/credentials.json`, via `@benchsdk/cli`'s `resolveAuth`, which\n * refreshes an expired access token but never opens a browser). The gateway\n * key written by `compute login` is a different credential and is not used.\n */\nexport async function resolveActionsAuth(\n opts: {\n apiKey?: string;\n baseUrl?: string;\n allowUntrustedHost?: boolean;\n },\n resolveStored: StoredPlatformAuthResolver = resolveStoredPlatformAuth,\n): Promise<ActionsAuth> {\n const baseUrl = (\n opts.baseUrl ||\n process.env.COMPUTE_PLATFORM_URL ||\n process.env.BENCHMARKS_PLATFORM_URL || // legacy name\n DEFAULT_BASE_URL\n ).replace(/\\/+$/, '');\n\n // The bearer key is attached to every request, so an attacker-controlled\n // --base-url would exfiltrate it. Only trusted hosts are allowed silently;\n // anything else must be opted into with --allow-untrusted-host.\n if (!opts.allowUntrustedHost && !isTrustedActionsHost(baseUrl)) {\n throw new ActionsCliError(\n 'untrusted_host',\n `Refusing to send the API key to ${baseUrl} — it is not a computesdk.com or localhost host. ` +\n 'If this is a self-hosted/dev deployment you trust, pass --allow-untrusted-host.',\n );\n }\n // Host trust and transport security are separate: --allow-untrusted-host\n // says who may receive the key, never that it may travel in plaintext.\n if (!isSecureActionsTransport(baseUrl)) {\n throw new ActionsCliError(\n 'insecure_transport',\n `Refusing to send the API key over plaintext HTTP to ${baseUrl}. ` +\n 'Use an https:// base URL; http:// is only allowed for localhost/loopback.',\n );\n }\n\n // `||` not `??`: empty-string env vars (common in CI matrices) should fall\n // through to the next source, not count as configured.\n let apiKey =\n opts.apiKey ||\n process.env.COMPUTE_API_KEY ||\n process.env.BENCHMARKS_PLATFORM_API_KEY || // legacy name\n undefined;\n if (!apiKey) {\n // Stored platform OAuth is only ever resolved (and refreshed) for trusted\n // hosts. --allow-untrusted-host opts an explicit key into a host, not the\n // user's saved session.\n if (!isTrustedActionsHost(baseUrl)) {\n throw new ActionsCliError(\n 'untrusted_host_stored_auth',\n `Refusing to use stored platform credentials with untrusted host ${baseUrl}. ` +\n 'Pass --api-key or set COMPUTE_API_KEY to use an explicit key with --allow-untrusted-host.',\n );\n }\n let stored: StoredPlatformAuth;\n try {\n stored = await resolveStored({ baseUrl });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // `@benchsdk/cli`'s \"nothing stored\" message names `bench` commands and\n // env vars that only apply to that CLI; keep ours for that case and\n // surface the reason only for expired/failed-refresh sessions.\n const detail = reason.startsWith('No credentials found') ? 'No API key.' : reason;\n throw new ActionsCliError('no_credentials', `${detail} ${NO_CREDENTIALS_HINT}`);\n }\n apiKey = stored.apiKey || stored.token || undefined;\n }\n if (!apiKey) {\n throw new ActionsCliError('no_credentials', `No API key. ${NO_CREDENTIALS_HINT}`);\n }\n return { apiKey, baseUrl };\n}\n\nasync function resolveStoredPlatformAuth(opts: { baseUrl: string }): Promise<StoredPlatformAuth> {\n const { resolveAuth } = await import('@benchsdk/cli');\n const auth = await resolveAuth({ baseUrl: opts.baseUrl });\n return { apiKey: auth.apiKey, token: auth.token };\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === 'localhost' || host === '127.0.0.1' || host === '[::1]' || host === '::1';\n}\n\n/** https://, or http:// to a loopback host only. */\nexport function isSecureActionsTransport(baseUrl: string): boolean {\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch {\n return false;\n }\n if (url.protocol === 'https:') return true;\n return url.protocol === 'http:' && isLoopbackHost(url.hostname);\n}\n\n/** computesdk.com (and subdomains) or localhost — safe to receive the API key. */\nexport function isTrustedActionsHost(baseUrl: string): boolean {\n let host: string;\n try {\n host = new URL(baseUrl).hostname;\n } catch {\n return false;\n }\n return host === 'computesdk.com' || host.endsWith('.computesdk.com') || isLoopbackHost(host);\n}\n","/**\n * Browser-based CLI authentication flow\n *\n * Precedence: env var > stored credentials > browser auth flow\n */\n\nimport * as http from 'node:http';\nimport * as crypto from 'node:crypto';\nimport { exec } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'os';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\n\nfunction getCredentialsDir(): string {\n return path.join(os.homedir(), '.computesdk');\n}\n\nfunction getCredentialsFile(): string {\n return path.join(getCredentialsDir(), 'credentials.json');\n}\n\nconst AUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\nconst CONSOLE_AUTH_URL = 'https://console.computesdk.com/cli/auth';\n\nconst SUCCESS_HTML = `<!DOCTYPE html>\n<html>\n<head><title>ComputeSDK CLI</title></head>\n<body style=\"font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;\">\n <div style=\"text-align: center;\">\n <h1>Authenticated</h1>\n <p>You can close this tab and return to the terminal.</p>\n </div>\n</body>\n</html>`;\n\n/**\n * Load stored credentials from ~/.computesdk/credentials.json.\n * Returns the API key if found and valid, or null.\n */\nexport function loadStoredCredentials(): string | null {\n try {\n if (!fs.existsSync(getCredentialsFile())) {\n return null;\n }\n const raw = fs.readFileSync(getCredentialsFile(), 'utf-8');\n const data = JSON.parse(raw);\n if (typeof data.apiKey === 'string' && data.apiKey.length > 0) {\n return data.apiKey;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Store credentials to ~/.computesdk/credentials.json.\n * Creates ~/.computesdk/ directory if it doesn't exist.\n */\nexport function storeCredentials(apiKey: string): void {\n if (!fs.existsSync(getCredentialsDir())) {\n fs.mkdirSync(getCredentialsDir(), { recursive: true, mode: 0o700 });\n }\n fs.writeFileSync(\n getCredentialsFile(),\n JSON.stringify({ apiKey }, null, 2) + '\\n',\n { mode: 0o600 }\n );\n}\n\n/**\n * Delete stored credentials file.\n */\nexport function clearStoredCredentials(): void {\n try {\n if (fs.existsSync(getCredentialsFile())) {\n fs.unlinkSync(getCredentialsFile());\n }\n } catch {\n // Ignore - file may not exist or may not be writable\n }\n}\n\n/**\n * Open a URL in the user's default browser.\n * Falls back to printing the URL if the browser fails to open.\n */\nfunction openBrowser(url: string): void {\n const command =\n process.platform === 'darwin'\n ? `open \"${url}\"`\n : process.platform === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n exec(command, (err) => {\n if (err) {\n p.log.warn('Could not open browser automatically.');\n p.log.info(`Open this URL manually:\\n ${pc.cyan(url)}`);\n }\n });\n}\n\nexport interface AuthFlowOptions {\n /** Override timeout for tests */\n timeoutMs?: number;\n /** Callback when server is listening (for tests) */\n onServerReady?: (port: number, state: string) => void;\n /** Skip opening browser (for tests) */\n skipBrowserOpen?: boolean;\n}\n\n/**\n * Run the browser-based authentication flow.\n *\n * 1. Start a local HTTP server on a random port\n * 2. Open browser to console.computesdk.com/cli/auth\n * 3. Wait for callback with token and validated state\n * 4. Return the API key\n */\nexport function runBrowserAuthFlow(options?: AuthFlowOptions): Promise<string> {\n const timeoutMs = options?.timeoutMs ?? AUTH_TIMEOUT_MS;\n const state = crypto.randomBytes(32).toString('hex');\n\n return new Promise<string>((resolve, reject) => {\n const server = http.createServer();\n\n const timeout = setTimeout(() => {\n server.close();\n reject(\n new Error('Authentication timed out after 5 minutes. Please try again.')\n );\n }, timeoutMs);\n\n server.on('request', (req, res) => {\n const url = new URL(req.url || '/', 'http://localhost');\n\n if (req.method !== 'GET' || url.pathname !== '/callback') {\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not Found');\n return;\n }\n\n const receivedState = url.searchParams.get('state');\n const token = url.searchParams.get('token');\n\n if (receivedState !== state) {\n res.writeHead(403, { 'Content-Type': 'text/plain' });\n res.end('Error: State mismatch. Please try authenticating again.');\n return;\n }\n\n if (!token) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Error: No token received.');\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(SUCCESS_HTML);\n\n clearTimeout(timeout);\n server.close();\n resolve(token);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const addr = server.address();\n if (!addr || typeof addr === 'string') {\n clearTimeout(timeout);\n server.close();\n reject(new Error('Failed to start auth server'));\n return;\n }\n\n const port = addr.port;\n const authUrl = `${CONSOLE_AUTH_URL}?port=${port}&state=${state}`;\n\n if (options?.onServerReady) {\n options.onServerReady(port, state);\n }\n\n if (!options?.skipBrowserOpen) {\n openBrowser(authUrl);\n }\n });\n\n server.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`Auth server error: ${err.message}`));\n });\n });\n}\n\n/**\n * Resolve an API key through the precedence chain:\n * env var > stored credentials > browser auth flow\n */\nexport async function resolveApiKey(options?: {\n forceLogin?: boolean;\n}): Promise<string> {\n // 1. Check environment variable (highest precedence)\n if (process.env.COMPUTESDK_API_KEY) {\n return process.env.COMPUTESDK_API_KEY;\n }\n\n // 2. Check stored credentials (skip if forcing re-auth)\n if (!options?.forceLogin) {\n const stored = loadStoredCredentials();\n if (stored) {\n p.log.info(\n `Using stored credentials from ${pc.dim('~/.computesdk/credentials.json')}`\n );\n return stored;\n }\n }\n\n // 3. Run browser auth flow\n p.log.info('No API key found. Starting browser authentication...');\n\n const spinner = p.spinner();\n spinner.start('Waiting for browser authentication...');\n\n try {\n const apiKey = await runBrowserAuthFlow();\n spinner.stop('Authentication successful');\n\n // Store for next time\n try {\n storeCredentials(apiKey);\n p.log.success(\n `Credentials saved to ${pc.dim('~/.computesdk/credentials.json')}`\n );\n } catch {\n p.log.warn('Could not save credentials to disk. You may need to authenticate again next time.');\n }\n\n return apiKey;\n } catch (error) {\n spinner.stop(pc.red('Authentication failed'));\n throw error;\n }\n}\n","/**\n * Shared setup logic for CLI commands\n *\n * Resolves authentication and configures the compute client\n * for a given provider. Used by both subcommands and the REPL.\n */\n\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { compute } from 'computesdk';\nimport { detectAvailableProviders, getProviderStatus, buildProviderConfig, type ProviderStatus } from './providers.js';\nimport { resolveApiKey } from './auth.js';\n\n/**\n * Authenticate and set COMPUTESDK_API_KEY in the environment.\n * Exits the process on failure.\n */\nexport async function ensureAuth(options?: { forceLogin?: boolean }): Promise<void> {\n try {\n const apiKey = await resolveApiKey({ forceLogin: options?.forceLogin });\n process.env.COMPUTESDK_API_KEY = apiKey;\n } catch (error) {\n p.log.error((error as Error).message);\n p.log.info(`Get your API key at ${pc.cyan('https://console.computesdk.com')}`);\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n}\n\n/**\n * Resolve which provider to use.\n *\n * If `--provider` is given, validates it's configured and returns it.\n * If `interactive` is true and multiple providers are available, prompts user.\n * In non-interactive mode, requires `--provider` when multiple are configured.\n * Exits the process if no providers are available.\n */\nexport async function resolveProvider(\n providerFlag?: string,\n options?: { interactive?: boolean },\n): Promise<string> {\n const interactive = options?.interactive ?? false;\n const available = detectAvailableProviders();\n const providerStatus = getProviderStatus();\n\n if (providerFlag) {\n const match = providerStatus.find(\n (s: ProviderStatus) => s.name.toLowerCase() === providerFlag.toLowerCase(),\n );\n\n if (!match) {\n p.log.error(`Unknown provider: ${providerFlag}`);\n p.log.info(`Available providers: ${providerStatus.map((s: ProviderStatus) => s.name).join(', ')}`);\n process.exit(1);\n }\n\n if (!match.ready) {\n p.log.error(`Provider ${providerFlag} is not configured`);\n if (match.missing.length > 0) {\n p.log.info(`Missing env vars: ${match.missing.join(', ')}`);\n }\n process.exit(1);\n }\n\n return match.name;\n }\n\n if (available.length === 0) {\n p.log.error('No provider credentials detected');\n p.log.info('Set one of: E2B_API_KEY, MODAL_TOKEN_ID, RAILWAY_API_KEY, etc.');\n p.outro(pc.red('Setup incomplete'));\n process.exit(1);\n }\n\n // Single provider — no ambiguity\n if (available.length === 1) {\n return available[0];\n }\n\n // Multiple providers — interactive mode can prompt, non-interactive must fail\n if (!interactive) {\n p.log.error('Multiple providers configured. Use --provider to specify one.');\n p.log.info(`Available: ${available.join(', ')}`);\n process.exit(1);\n }\n\n const providerOptions = providerStatus\n .filter((status: ProviderStatus) => status.ready)\n .map((status: ProviderStatus) => ({\n value: status.name,\n label: status.name,\n }));\n\n const provider = await p.select({\n message: 'Select provider',\n options: providerOptions,\n });\n\n if (p.isCancel(provider)) {\n p.cancel('Cancelled');\n process.exit(0);\n }\n\n return provider as string;\n}\n\n/**\n * Configure the compute client for a provider.\n * Must be called after ensureAuth().\n */\nexport function configureCompute(provider: string): void {\n const config = buildProviderConfig(provider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n compute.setConfig(config as any);\n}\n"],"mappings":"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","names":["path","pc","compute","fs","path","os","p","pc","sandbox","spinner","output","p","pc","readFileSync","fileURLToPath","dirname","join","compute","path","client","p","program","text","fs","path","os","pc","spinner","p","pc","compute","pc","compute","__filename","fileURLToPath","__dirname","dirname","readFileSync","join","pc","spinner","compute","saveSandbox","loadState","saveState","shellEscape"]}
|