@computesdk/cli 1.0.9 → 1.0.10

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 CHANGED
@@ -739,6 +739,21 @@ var ActionsClient = class {
739
739
  });
740
740
  return this.parse(res);
741
741
  }
742
+ async put(path5, body = {}) {
743
+ const res = await this.fetchImpl(`${this.auth.baseUrl}${path5}`, {
744
+ method: "PUT",
745
+ headers: { ...this.headers(), "content-type": "application/json" },
746
+ body: JSON.stringify(body)
747
+ });
748
+ return this.parse(res);
749
+ }
750
+ async del(path5) {
751
+ const res = await this.fetchImpl(`${this.auth.baseUrl}${path5}`, {
752
+ method: "DELETE",
753
+ headers: this.headers()
754
+ });
755
+ return this.parse(res);
756
+ }
742
757
  /**
743
758
  * One `data:` JSON payload per SSE event. `next()` resolves to the payload,
744
759
  * or null when the stream ends. Call `close()` to abort.
@@ -935,6 +950,7 @@ function formatRunDetail(run, runUrl) {
935
950
  lines.push(`title: ${run.title}`);
936
951
  lines.push(`started: ${run.startedAt} duration: ${formatDuration(run.durationMs)}`);
937
952
  if (run.cancellationReason) lines.push(`cancelled: ${run.cancellationReason}`);
953
+ if (run.providerOverride) lines.push(`dispatched to: ${run.providerOverride}`);
938
954
  if (run.supersededByRunId) lines.push(`superseded by: ${run.supersededByRunId}`);
939
955
  if (runUrl) lines.push(`url: ${runUrl}`);
940
956
  if (run.jobs.length > 0) {
@@ -1041,11 +1057,63 @@ async function* followRunLogs(client2, runId, jobs, step) {
1041
1057
  await new Promise((r) => setTimeout(r, 1e3));
1042
1058
  }
1043
1059
  }
1060
+ function safeTerm(s) {
1061
+ return s.replace(/[\u0000-\u001F\u007F-\u009F]/g, "\uFFFD");
1062
+ }
1063
+ function formatRunHistory(history) {
1064
+ const lines = [];
1065
+ const parts = Object.entries(history.conclusions).map(([c, n]) => `${n} ${c}`).join(", ");
1066
+ lines.push(`last ${history.runCount} runs: ${parts || "none"}`);
1067
+ if (history.jobs.length > 0) {
1068
+ lines.push("");
1069
+ lines.push(pc.bold("jobs"));
1070
+ for (const job of history.jobs) {
1071
+ const rate = job.runs > 0 ? Math.round(job.failedRuns / job.runs * 100) : 0;
1072
+ const platform = job.failedBeforeSteps > 0 ? pc.dim(` (${job.failedBeforeSteps} failed before steps)`) : "";
1073
+ const count = `${job.failedRuns}/${job.runs} runs failed`;
1074
+ const label = job.failedRuns > 0 ? pc.red(count) : pc.green(count);
1075
+ lines.push(` ${safeTerm(job.job)} ${label} ${rate}%${platform}`);
1076
+ for (const step of job.steps) {
1077
+ lines.push(pc.dim(` step "${safeTerm(step.step)}" failed in ${step.failedRuns} run${step.failedRuns === 1 ? "" : "s"}`));
1078
+ }
1079
+ }
1080
+ }
1081
+ const failed = history.runs.filter(
1082
+ (r) => r.conclusion === "failed" || r.failedJobs.length > 0
1083
+ );
1084
+ if (failed.length > 0) {
1085
+ lines.push("");
1086
+ lines.push(pc.bold("failed runs"));
1087
+ for (const run of failed) {
1088
+ const blame = run.failedJobs.length > 0 ? run.failedJobs.map((j) => safeTerm(j.step === null ? j.job : `${j.job}:${j.step}`)).join(", ") : pc.dim("(no failed job recorded)");
1089
+ lines.push(` ${shortSha(run.headSha)} ${pc.dim(run.startedAt)} ${blame}`);
1090
+ }
1091
+ }
1092
+ return lines.join("\n");
1093
+ }
1094
+ function formatProviderRow(p5) {
1095
+ const icon = p5.usable ? pc.green("\u25CF") : pc.gray("\u25CB");
1096
+ const name = p5.usable ? pc.white(p5.provider) : pc.gray(p5.provider);
1097
+ const flags = [
1098
+ p5.credential,
1099
+ p5.actCapable ? pc.green("act") : pc.gray("no-act"),
1100
+ p5.regions.length > 0 ? `regions: ${p5.regions.join(",")}` : "no region choice",
1101
+ p5.position === null ? pc.gray("not in provider order") : `order #${p5.position}`
1102
+ ].join(" ");
1103
+ return ` ${icon} ${name} ${flags}`;
1104
+ }
1105
+ function formatVerifyResult(r) {
1106
+ const ok = r.verified === true;
1107
+ const head = ok ? pc.green("verified") : pc.red("not verified");
1108
+ const detail = r.key.statusDetail ? pc.dim(` ${r.key.statusDetail}`) : "";
1109
+ const act = r.key.actCapable ? pc.green(" act-capable") : "";
1110
+ return `${head} ${r.key.provider}${act}${detail}`;
1111
+ }
1044
1112
  function registerActionsCommands(program2) {
1045
1113
  const actions = program2.command("actions").alias("ci").description("Drive the benchmarks-platform Actions API");
1046
1114
  const common = (cmd) => cmd.option("--api-key <key>", "API key (default: $COMPUTE_API_KEY)").option("--base-url <url>", "API base URL (default: https://platform.computesdk.com)").option("--allow-untrusted-host", "send the API key to a non-computesdk, non-localhost --base-url").option("--json", "print machine-readable JSON");
1047
1115
  common(
1048
- actions.command("dispatch").description("Dispatch a workflow_dispatch run").argument("<repo>", "repository in owner/repo format").requiredOption("--workflow <path|name>", "workflow path or name").option("--ref <ref>", "git ref to run (default: the workflow's first watched ref)").option("--inputs <pairs...>", "workflow inputs as key=value")
1116
+ actions.command("dispatch").description("Dispatch a workflow_dispatch run").argument("<repo>", "repository in owner/repo format").requiredOption("--workflow <path|name>", "workflow path or name").option("--ref <ref>", "git ref to run (default: the workflow's first watched ref)").option("--inputs <pairs...>", "workflow inputs as key=value").option("--provider <id>", "place the run on one provider (e.g. namespace, vercel:sfo1) instead of the org provider order").option("--provider-region <region>", "region for --provider (same as --provider <id>:<region>)")
1049
1117
  ).action(async (repo, opts) => {
1050
1118
  try {
1051
1119
  const c = client(opts);
@@ -1062,9 +1130,20 @@ function registerActionsCommands(program2) {
1062
1130
  }
1063
1131
  const ref = opts.ref ?? workflow.refs[0];
1064
1132
  if (!ref) throw new Error("No --ref given and the workflow has no watched refs.");
1133
+ if (opts.providerRegion !== void 0 && opts.provider === void 0) {
1134
+ throw new Error("--provider-region requires --provider.");
1135
+ }
1065
1136
  const result = await c.post(
1066
1137
  "/api/v1/actions/dispatch",
1067
- { workflowId: workflow.id, ref, inputs: parseInputs(opts.inputs) }
1138
+ {
1139
+ workflowId: workflow.id,
1140
+ ref,
1141
+ inputs: parseInputs(opts.inputs),
1142
+ ...opts.provider !== void 0 && {
1143
+ provider: opts.provider,
1144
+ ...opts.providerRegion !== void 0 && { providerRegion: opts.providerRegion }
1145
+ }
1146
+ }
1068
1147
  );
1069
1148
  const org = await c.org();
1070
1149
  const url = `${c.baseUrl}/${org.slug}/actions/runs/${result.runId}`;
@@ -1096,6 +1175,29 @@ function registerActionsCommands(program2) {
1096
1175
  fail(e);
1097
1176
  }
1098
1177
  });
1178
+ common(
1179
+ actions.command("history").description("Recent run history for a workflow \u2014 per-job/step failure rates (is this failure flaky?)").argument("<repo>", "repository in owner/repo format").requiredOption("--workflow <path|name>", "workflow path or name").option("--branch <branch...>", "narrow the window to branches/refs").option("--job <job>", "narrow the rollup to one job name or workflow job id").option("--limit <n>", "runs in the window (default 10, max 50)")
1180
+ ).action(async (repo, opts) => {
1181
+ try {
1182
+ const c = client(opts);
1183
+ const { workflows } = await c.get(
1184
+ "/api/v1/actions/workflows",
1185
+ { repo }
1186
+ );
1187
+ const workflow = matchWorkflow(workflows, opts.workflow) ?? workflows.find((w) => w.path === opts.workflow);
1188
+ const workflowPath = workflow?.path ?? opts.workflow;
1189
+ const history = await c.get("/api/v1/actions/history", {
1190
+ repo,
1191
+ workflow: workflowPath,
1192
+ branch: opts.branch,
1193
+ job: opts.job,
1194
+ limit: opts.limit
1195
+ });
1196
+ output(opts, history, (h) => console.log(formatRunHistory(h)));
1197
+ } catch (e) {
1198
+ fail(e);
1199
+ }
1200
+ });
1099
1201
  common(
1100
1202
  actions.command("run").description("Show a run: jobs, provider:region placement, placement attempts").argument("<run-id>", "run ID")
1101
1203
  ).action(async (runId, opts) => {
@@ -1167,6 +1269,74 @@ function registerActionsCommands(program2) {
1167
1269
  fail(e);
1168
1270
  }
1169
1271
  });
1272
+ const providers = actions.command("providers").description("List the org's registered compute providers (regions, act/usable status)");
1273
+ common(providers).action(async (opts) => {
1274
+ try {
1275
+ const data = await client(opts).get("/api/v1/actions/providers");
1276
+ output(opts, data, (d) => {
1277
+ for (const p5 of d.providers) console.log(formatProviderRow(p5));
1278
+ });
1279
+ } catch (e) {
1280
+ fail(e);
1281
+ }
1282
+ });
1283
+ common(
1284
+ providers.command("configure").description("Save the org's credential for a provider (owner/admin API key)").argument("<provider>", "provider id (e.g. tensorlake, blaxel)").option("--key <key>", "provider API key (single-field credentials)").option("--field <pair...>", "credential fields as name=value (multi-field providers)").option("--verify", "run the placement probe after saving")
1285
+ ).action(async (provider, opts) => {
1286
+ try {
1287
+ const c = client(opts);
1288
+ let body;
1289
+ if (opts.field !== void 0) {
1290
+ if (opts.key !== void 0) throw new Error("Pass either --key or --field, not both.");
1291
+ body = { fields: parseInputs(opts.field) };
1292
+ } else if (opts.key !== void 0) {
1293
+ body = { key: opts.key };
1294
+ } else {
1295
+ throw new Error("Pass --key <key> or --field name=value.");
1296
+ }
1297
+ const saved = await c.put(
1298
+ `/api/v1/actions/providers/${provider}/key`,
1299
+ body
1300
+ );
1301
+ const verification = opts.verify ? await c.post(
1302
+ `/api/v1/actions/providers/${provider}/verify`
1303
+ ) : void 0;
1304
+ output(opts, verification ? { key: saved.key, verification } : saved, () => {
1305
+ console.log(`saved ${saved.key.provider} ${pc.dim(saved.key.keyHint)} ${saved.key.status}`);
1306
+ if (verification) console.log(formatVerifyResult(verification));
1307
+ });
1308
+ if (verification?.verified === false) process.exitCode = 1;
1309
+ } catch (e) {
1310
+ fail(e);
1311
+ }
1312
+ });
1313
+ common(
1314
+ providers.command("verify").description('Probe the stored provider key with a real sandbox ("Test" in Settings)').argument("<provider>", "provider id")
1315
+ ).action(async (provider, opts) => {
1316
+ try {
1317
+ const result = await client(opts).post(
1318
+ `/api/v1/actions/providers/${provider}/verify`
1319
+ );
1320
+ output(opts, result, (r) => console.log(formatVerifyResult(r)));
1321
+ if (result.verified === false) process.exitCode = 1;
1322
+ } catch (e) {
1323
+ fail(e);
1324
+ }
1325
+ });
1326
+ common(
1327
+ providers.command("remove").description("Delete the org's stored credential for a provider").argument("<provider>", "provider id")
1328
+ ).action(async (provider, opts) => {
1329
+ try {
1330
+ const result = await client(opts).del(
1331
+ `/api/v1/actions/providers/${provider}/key`
1332
+ );
1333
+ output(opts, result, (r) => {
1334
+ console.log(r.deleted ? `deleted ${r.provider}` : `no key stored for ${r.provider}`);
1335
+ });
1336
+ } catch (e) {
1337
+ fail(e);
1338
+ }
1339
+ });
1170
1340
  common(
1171
1341
  actions.command("cancel").description("Cancel a run").argument("<run-id>", "run ID")
1172
1342
  ).action(async (runId, opts) => {
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, stream logs, 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, 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 CiRun,\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\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.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// ─── 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// ─── 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 ).action(async (repo: string, opts: CommonOpts & { workflow: string; ref?: string; inputs?: 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 const result = await c.post<{ runId: string; created: boolean; headSha: string }>(\n '/api/v1/actions/dispatch',\n { workflowId: workflow.id, ref, inputs: parseInputs(opts.inputs) },\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('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 output(opts, { ...run, url }, (r) => console.log(formatRunDetail(r, r.url)));\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 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 jobs: CiJob[];\n logTail: string[];\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 ActionsOrg {\n organizationId: string;\n name: string;\n slug: string;\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 /**\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","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, stream logs, 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, 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 CiRun,\n type CiRunHistory,\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\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// ─── 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\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 output(opts, { ...run, url }, (r) => console.log(formatRunDetail(r, r.url)));\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 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\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\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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/cli",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "ComputeSDK CLI - Cloud-native workspace management",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",