@hasna/sandboxes 0.1.6 → 0.1.7

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/cli/index.js CHANGED
@@ -2244,6 +2244,25 @@ CREATE TABLE IF NOT EXISTS templates (
2244
2244
  CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
2245
2245
 
2246
2246
  INSERT OR IGNORE INTO _migrations (id) VALUES (2);
2247
+ `,
2248
+ `
2249
+ CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
2250
+ id TEXT PRIMARY KEY,
2251
+ sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
2252
+ agent_name TEXT,
2253
+ agent_type TEXT,
2254
+ command TEXT,
2255
+ status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
2256
+ exit_code INTEGER,
2257
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
2258
+ ended_at TEXT
2259
+ );
2260
+ INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
2261
+ DROP TABLE sandbox_sessions;
2262
+ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
2263
+ CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
2264
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
2265
+ INSERT OR IGNORE INTO _migrations (id) VALUES (3);
2247
2266
  `
2248
2267
  ];
2249
2268
  });
@@ -3272,6 +3291,118 @@ var init_stream = __esm(() => {
3272
3291
  listeners = new Map;
3273
3292
  });
3274
3293
 
3294
+ // src/lib/agents/claude.ts
3295
+ class ClaudeDriver {
3296
+ name = "claude";
3297
+ requiredEnvVars = ["ANTHROPIC_API_KEY"];
3298
+ async install(provider, providerSandboxId) {
3299
+ const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
3300
+ if (check.stdout.trim() !== "MISSING")
3301
+ return;
3302
+ await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
3303
+ }
3304
+ async configure(provider, providerSandboxId, _envVars) {
3305
+ const config = JSON.stringify({
3306
+ hasCompletedOnboarding: true,
3307
+ hasTrustDialogAccepted: true,
3308
+ hasAcknowledgedCostThreshold: true
3309
+ });
3310
+ await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
3311
+ }
3312
+ buildCommand(prompt) {
3313
+ return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
3314
+ }
3315
+ }
3316
+
3317
+ // src/lib/agents/codex.ts
3318
+ class CodexDriver {
3319
+ name = "codex";
3320
+ requiredEnvVars = ["OPENAI_API_KEY"];
3321
+ async install(provider, providerSandboxId) {
3322
+ const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
3323
+ if (check.stdout.trim() !== "MISSING")
3324
+ return;
3325
+ await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
3326
+ }
3327
+ async configure(provider, providerSandboxId, _envVars) {
3328
+ const config = `[core]
3329
+ approvalMode = "full-auto"
3330
+ quiet = true
3331
+ `;
3332
+ await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
3333
+ }
3334
+ buildCommand(prompt) {
3335
+ return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
3336
+ }
3337
+ }
3338
+
3339
+ // src/lib/agents/gemini.ts
3340
+ class GeminiDriver {
3341
+ name = "gemini";
3342
+ requiredEnvVars = ["GEMINI_API_KEY"];
3343
+ async install(provider, providerSandboxId) {
3344
+ const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
3345
+ if (check.stdout.trim() !== "MISSING")
3346
+ return;
3347
+ await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
3348
+ }
3349
+ async configure(provider, providerSandboxId, _envVars) {
3350
+ const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
3351
+ await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
3352
+ }
3353
+ buildCommand(prompt) {
3354
+ return `gemini -p ${JSON.stringify(prompt)}`;
3355
+ }
3356
+ }
3357
+
3358
+ // src/lib/agents/opencode.ts
3359
+ class OpenCodeDriver {
3360
+ name = "opencode";
3361
+ requiredEnvVars = [];
3362
+ async install(provider, providerSandboxId) {
3363
+ const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
3364
+ if (check.stdout.trim() !== "MISSING")
3365
+ return;
3366
+ await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
3367
+ }
3368
+ async configure(_provider, _providerSandboxId, _envVars) {}
3369
+ buildCommand(prompt) {
3370
+ return `opencode run ${JSON.stringify(prompt)}`;
3371
+ }
3372
+ }
3373
+
3374
+ // src/lib/agents/pi.ts
3375
+ class PiDriver {
3376
+ name = "pi";
3377
+ requiredEnvVars = ["PI_API_KEY"];
3378
+ async install(provider, providerSandboxId) {
3379
+ const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
3380
+ if (check.stdout.trim() !== "MISSING")
3381
+ return;
3382
+ await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
3383
+ }
3384
+ async configure(_provider, _providerSandboxId, _envVars) {}
3385
+ buildCommand(prompt) {
3386
+ return `pi ask ${JSON.stringify(prompt)}`;
3387
+ }
3388
+ }
3389
+
3390
+ // src/lib/agents/index.ts
3391
+ function getAgentDriver(name) {
3392
+ return DRIVER_MAP.get(name);
3393
+ }
3394
+ var DRIVERS, DRIVER_MAP;
3395
+ var init_agents = __esm(() => {
3396
+ DRIVERS = [
3397
+ new ClaudeDriver,
3398
+ new CodexDriver,
3399
+ new GeminiDriver,
3400
+ new OpenCodeDriver,
3401
+ new PiDriver
3402
+ ];
3403
+ DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
3404
+ });
3405
+
3275
3406
  // src/lib/agent-runner.ts
3276
3407
  var exports_agent_runner = {};
3277
3408
  __export(exports_agent_runner, {
@@ -3283,7 +3414,19 @@ async function runAgent(sandboxId, opts) {
3283
3414
  if (!sandbox.provider_sandbox_id) {
3284
3415
  throw new Error("Sandbox has no provider instance");
3285
3416
  }
3286
- const cmd = opts.command || AGENT_COMMANDS[opts.agentType]?.(opts.prompt) || opts.prompt;
3417
+ const provider = await getProvider(sandbox.provider);
3418
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
3419
+ let cmd;
3420
+ const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
3421
+ if (opts.command) {
3422
+ cmd = opts.command;
3423
+ } else if (driver) {
3424
+ await driver.install(provider, sandbox.provider_sandbox_id);
3425
+ await driver.configure(provider, sandbox.provider_sandbox_id, sandbox.env_vars ?? {});
3426
+ cmd = driver.buildCommand(opts.prompt);
3427
+ } else {
3428
+ cmd = opts.prompt;
3429
+ }
3287
3430
  const session = createSession({
3288
3431
  sandbox_id: sandbox.id,
3289
3432
  agent_name: opts.agentName,
@@ -3292,8 +3435,6 @@ async function runAgent(sandboxId, opts) {
3292
3435
  });
3293
3436
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
3294
3437
  const collector = createStreamCollector(sandbox.id, session.id);
3295
- const provider = await getProvider(sandbox.provider);
3296
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
3297
3438
  provider.exec(sandbox.provider_sandbox_id, cmd, {
3298
3439
  onStdout: (data) => {
3299
3440
  collector.onStdout(data);
@@ -3321,22 +3462,16 @@ async function stopAgent(sandboxId) {
3321
3462
  return;
3322
3463
  const provider = await getProvider(sandbox.provider);
3323
3464
  try {
3324
- await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini' || true");
3465
+ await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini\\|opencode\\|pi' || true");
3325
3466
  } catch {}
3326
3467
  emitLifecycleEvent(sandbox.id, "Agent stopped by user");
3327
3468
  }
3328
- var CLAUDE_ONBOARDING_SETUP, AGENT_COMMANDS;
3329
3469
  var init_agent_runner = __esm(() => {
3330
3470
  init_sandboxes();
3331
3471
  init_sessions();
3332
3472
  init_providers();
3333
3473
  init_stream();
3334
- CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
3335
- AGENT_COMMANDS = {
3336
- claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
3337
- codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
3338
- gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
3339
- };
3474
+ init_agents();
3340
3475
  });
3341
3476
 
3342
3477
  // node_modules/commander/esm.mjs
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwKtC,wBAAgB,WAAW,IAAI,QAAQ,CAYtC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAcf"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6LtC,wBAAgB,WAAW,IAAI,QAAQ,CAYtC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAcf"}
package/dist/index.d.ts CHANGED
@@ -11,4 +11,6 @@ export { loadConfig, saveConfig, getDefaultProvider, getDefaultTimeout, getDefau
11
11
  export { getProvider } from "./providers/index.js";
12
12
  export type { SandboxProvider, ProviderSandbox, CreateSandboxOpts, ExecOptions } from "./providers/types.js";
13
13
  export { createStreamCollector, addStreamListener, emitLifecycleEvent } from "./lib/stream.js";
14
+ export { getAgentDriver, listAgentDrivers } from "./lib/agents/index.js";
15
+ export type { AgentDriver } from "./lib/agents/types.js";
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3H,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGlH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpK,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG7G,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACnH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC3H,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGlH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGpK,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG7G,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG/F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -45,7 +45,7 @@ var init_types = __esm(() => {
45
45
  "failed",
46
46
  "killed"
47
47
  ];
48
- AGENT_TYPES = ["claude", "codex", "gemini", "custom"];
48
+ AGENT_TYPES = ["claude", "codex", "gemini", "opencode", "pi", "custom"];
49
49
  EVENT_TYPES = [
50
50
  "stdout",
51
51
  "stderr",
@@ -829,6 +829,25 @@ CREATE TABLE IF NOT EXISTS templates (
829
829
  CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
830
830
 
831
831
  INSERT OR IGNORE INTO _migrations (id) VALUES (2);
832
+ `,
833
+ `
834
+ CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
835
+ id TEXT PRIMARY KEY,
836
+ sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
837
+ agent_name TEXT,
838
+ agent_type TEXT,
839
+ command TEXT,
840
+ status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
841
+ exit_code INTEGER,
842
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
843
+ ended_at TEXT
844
+ );
845
+ INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
846
+ DROP TABLE sandbox_sessions;
847
+ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
848
+ CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
849
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
850
+ INSERT OR IGNORE INTO _migrations (id) VALUES (3);
832
851
  `
833
852
  ];
834
853
  var db = null;
@@ -1518,6 +1537,117 @@ function emitLifecycleEvent(sandboxId, message) {
1518
1537
  });
1519
1538
  notifyListeners(sandboxId, "lifecycle", message);
1520
1539
  }
1540
+ // src/lib/agents/claude.ts
1541
+ class ClaudeDriver {
1542
+ name = "claude";
1543
+ requiredEnvVars = ["ANTHROPIC_API_KEY"];
1544
+ async install(provider, providerSandboxId) {
1545
+ const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
1546
+ if (check.stdout.trim() !== "MISSING")
1547
+ return;
1548
+ await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
1549
+ }
1550
+ async configure(provider, providerSandboxId, _envVars) {
1551
+ const config = JSON.stringify({
1552
+ hasCompletedOnboarding: true,
1553
+ hasTrustDialogAccepted: true,
1554
+ hasAcknowledgedCostThreshold: true
1555
+ });
1556
+ await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
1557
+ }
1558
+ buildCommand(prompt) {
1559
+ return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
1560
+ }
1561
+ }
1562
+
1563
+ // src/lib/agents/codex.ts
1564
+ class CodexDriver {
1565
+ name = "codex";
1566
+ requiredEnvVars = ["OPENAI_API_KEY"];
1567
+ async install(provider, providerSandboxId) {
1568
+ const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
1569
+ if (check.stdout.trim() !== "MISSING")
1570
+ return;
1571
+ await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
1572
+ }
1573
+ async configure(provider, providerSandboxId, _envVars) {
1574
+ const config = `[core]
1575
+ approvalMode = "full-auto"
1576
+ quiet = true
1577
+ `;
1578
+ await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
1579
+ }
1580
+ buildCommand(prompt) {
1581
+ return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
1582
+ }
1583
+ }
1584
+
1585
+ // src/lib/agents/gemini.ts
1586
+ class GeminiDriver {
1587
+ name = "gemini";
1588
+ requiredEnvVars = ["GEMINI_API_KEY"];
1589
+ async install(provider, providerSandboxId) {
1590
+ const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
1591
+ if (check.stdout.trim() !== "MISSING")
1592
+ return;
1593
+ await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
1594
+ }
1595
+ async configure(provider, providerSandboxId, _envVars) {
1596
+ const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
1597
+ await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
1598
+ }
1599
+ buildCommand(prompt) {
1600
+ return `gemini -p ${JSON.stringify(prompt)}`;
1601
+ }
1602
+ }
1603
+
1604
+ // src/lib/agents/opencode.ts
1605
+ class OpenCodeDriver {
1606
+ name = "opencode";
1607
+ requiredEnvVars = [];
1608
+ async install(provider, providerSandboxId) {
1609
+ const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
1610
+ if (check.stdout.trim() !== "MISSING")
1611
+ return;
1612
+ await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
1613
+ }
1614
+ async configure(_provider, _providerSandboxId, _envVars) {}
1615
+ buildCommand(prompt) {
1616
+ return `opencode run ${JSON.stringify(prompt)}`;
1617
+ }
1618
+ }
1619
+
1620
+ // src/lib/agents/pi.ts
1621
+ class PiDriver {
1622
+ name = "pi";
1623
+ requiredEnvVars = ["PI_API_KEY"];
1624
+ async install(provider, providerSandboxId) {
1625
+ const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
1626
+ if (check.stdout.trim() !== "MISSING")
1627
+ return;
1628
+ await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
1629
+ }
1630
+ async configure(_provider, _providerSandboxId, _envVars) {}
1631
+ buildCommand(prompt) {
1632
+ return `pi ask ${JSON.stringify(prompt)}`;
1633
+ }
1634
+ }
1635
+
1636
+ // src/lib/agents/index.ts
1637
+ var DRIVERS = [
1638
+ new ClaudeDriver,
1639
+ new CodexDriver,
1640
+ new GeminiDriver,
1641
+ new OpenCodeDriver,
1642
+ new PiDriver
1643
+ ];
1644
+ var DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
1645
+ function getAgentDriver(name) {
1646
+ return DRIVER_MAP.get(name);
1647
+ }
1648
+ function listAgentDrivers() {
1649
+ return DRIVERS;
1650
+ }
1521
1651
  export {
1522
1652
  uuid,
1523
1653
  updateSession,
@@ -1537,6 +1667,7 @@ export {
1537
1667
  listProjects,
1538
1668
  listEvents,
1539
1669
  listAgents,
1670
+ listAgentDrivers,
1540
1671
  getWebhook,
1541
1672
  getTemplateByName,
1542
1673
  getTemplate,
@@ -1551,6 +1682,7 @@ export {
1551
1682
  getDefaultImage,
1552
1683
  getDatabase,
1553
1684
  getConfigValue,
1685
+ getAgentDriver,
1554
1686
  getAgentByName,
1555
1687
  getAgent,
1556
1688
  ensureProject,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAc/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
1
+ {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CA8DzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhE"}
@@ -0,0 +1,10 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ import type { AgentDriver } from "./types.js";
3
+ export declare class ClaudeDriver implements AgentDriver {
4
+ readonly name = "claude";
5
+ readonly requiredEnvVars: string[];
6
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
7
+ configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
8
+ buildCommand(prompt: string): string;
9
+ }
10
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,eAAe,WAAyB;IAE3C,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,10 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ import type { AgentDriver } from "./types.js";
3
+ export declare class CodexDriver implements AgentDriver {
4
+ readonly name = "codex";
5
+ readonly requiredEnvVars: string[];
6
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
7
+ configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
8
+ buildCommand(prompt: string): string;
9
+ }
10
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,eAAe,WAAsB;IAExC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAStH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,10 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ import type { AgentDriver } from "./types.js";
3
+ export declare class GeminiDriver implements AgentDriver {
4
+ readonly name = "gemini";
5
+ readonly requiredEnvVars: string[];
6
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
7
+ configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
8
+ buildCommand(prompt: string): string;
9
+ }
10
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,eAAe,WAAsB;IAExC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAStH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,5 @@
1
+ import type { AgentDriver } from "./types.js";
2
+ export type { AgentDriver };
3
+ export declare function getAgentDriver(name: string): AgentDriver | undefined;
4
+ export declare function listAgentDrivers(): AgentDriver[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAc5B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAEhD"}
@@ -0,0 +1,10 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ import type { AgentDriver } from "./types.js";
3
+ export declare class OpenCodeDriver implements AgentDriver {
4
+ readonly name = "opencode";
5
+ readonly requiredEnvVars: never[];
6
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
7
+ configure(_provider: SandboxProvider, _providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
8
+ buildCommand(prompt: string): string;
9
+ }
10
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,eAAe,UAAM;IAExB,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5E,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,10 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ import type { AgentDriver } from "./types.js";
3
+ export declare class PiDriver implements AgentDriver {
4
+ readonly name = "pi";
5
+ readonly requiredEnvVars: string[];
6
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
7
+ configure(_provider: SandboxProvider, _providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
8
+ buildCommand(prompt: string): string;
9
+ }
10
+ //# sourceMappingURL=pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,QAAS,YAAW,WAAW;IAC1C,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,eAAe,WAAkB;IAEpC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5E,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,23 @@
1
+ import type { SandboxProvider } from "../../providers/types.js";
2
+ export interface AgentDriver {
3
+ /** Agent identifier */
4
+ readonly name: string;
5
+ /** Environment variable keys this agent needs (checked against sandbox env_vars) */
6
+ readonly requiredEnvVars: string[];
7
+ /**
8
+ * Ensure the agent CLI is installed in the sandbox.
9
+ * Should be idempotent — check before installing.
10
+ */
11
+ install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
12
+ /**
13
+ * Pre-seed config files / onboarding flags so the agent runs non-interactively.
14
+ * Called after install, before buildCommand.
15
+ */
16
+ configure(provider: SandboxProvider, providerSandboxId: string, envVars: Record<string, string>): Promise<void>;
17
+ /**
18
+ * Return the full CLI invocation string for this prompt.
19
+ * Must be non-interactive and must not require user input.
20
+ */
21
+ buildCommand(prompt: string): string;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,oFAAoF;IACpF,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAEnC;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E;;;OAGG;IACH,SAAS,CACP,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC"}
package/dist/mcp/index.js CHANGED
@@ -4776,6 +4776,25 @@ CREATE TABLE IF NOT EXISTS templates (
4776
4776
  CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
4777
4777
 
4778
4778
  INSERT OR IGNORE INTO _migrations (id) VALUES (2);
4779
+ `,
4780
+ `
4781
+ CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
4782
+ id TEXT PRIMARY KEY,
4783
+ sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
4784
+ agent_name TEXT,
4785
+ agent_type TEXT,
4786
+ command TEXT,
4787
+ status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
4788
+ exit_code INTEGER,
4789
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
4790
+ ended_at TEXT
4791
+ );
4792
+ INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
4793
+ DROP TABLE sandbox_sessions;
4794
+ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
4795
+ CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
4796
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
4797
+ INSERT OR IGNORE INTO _migrations (id) VALUES (3);
4779
4798
  `
4780
4799
  ];
4781
4800
  var db = null;
@@ -5297,19 +5316,134 @@ function emitLifecycleEvent(sandboxId, message) {
5297
5316
  notifyListeners(sandboxId, "lifecycle", message);
5298
5317
  }
5299
5318
 
5319
+ // src/lib/agents/claude.ts
5320
+ class ClaudeDriver {
5321
+ name = "claude";
5322
+ requiredEnvVars = ["ANTHROPIC_API_KEY"];
5323
+ async install(provider, providerSandboxId) {
5324
+ const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
5325
+ if (check.stdout.trim() !== "MISSING")
5326
+ return;
5327
+ await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
5328
+ }
5329
+ async configure(provider, providerSandboxId, _envVars) {
5330
+ const config = JSON.stringify({
5331
+ hasCompletedOnboarding: true,
5332
+ hasTrustDialogAccepted: true,
5333
+ hasAcknowledgedCostThreshold: true
5334
+ });
5335
+ await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
5336
+ }
5337
+ buildCommand(prompt) {
5338
+ return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
5339
+ }
5340
+ }
5341
+
5342
+ // src/lib/agents/codex.ts
5343
+ class CodexDriver {
5344
+ name = "codex";
5345
+ requiredEnvVars = ["OPENAI_API_KEY"];
5346
+ async install(provider, providerSandboxId) {
5347
+ const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
5348
+ if (check.stdout.trim() !== "MISSING")
5349
+ return;
5350
+ await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
5351
+ }
5352
+ async configure(provider, providerSandboxId, _envVars) {
5353
+ const config = `[core]
5354
+ approvalMode = "full-auto"
5355
+ quiet = true
5356
+ `;
5357
+ await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
5358
+ }
5359
+ buildCommand(prompt) {
5360
+ return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
5361
+ }
5362
+ }
5363
+
5364
+ // src/lib/agents/gemini.ts
5365
+ class GeminiDriver {
5366
+ name = "gemini";
5367
+ requiredEnvVars = ["GEMINI_API_KEY"];
5368
+ async install(provider, providerSandboxId) {
5369
+ const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
5370
+ if (check.stdout.trim() !== "MISSING")
5371
+ return;
5372
+ await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
5373
+ }
5374
+ async configure(provider, providerSandboxId, _envVars) {
5375
+ const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
5376
+ await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
5377
+ }
5378
+ buildCommand(prompt) {
5379
+ return `gemini -p ${JSON.stringify(prompt)}`;
5380
+ }
5381
+ }
5382
+
5383
+ // src/lib/agents/opencode.ts
5384
+ class OpenCodeDriver {
5385
+ name = "opencode";
5386
+ requiredEnvVars = [];
5387
+ async install(provider, providerSandboxId) {
5388
+ const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
5389
+ if (check.stdout.trim() !== "MISSING")
5390
+ return;
5391
+ await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
5392
+ }
5393
+ async configure(_provider, _providerSandboxId, _envVars) {}
5394
+ buildCommand(prompt) {
5395
+ return `opencode run ${JSON.stringify(prompt)}`;
5396
+ }
5397
+ }
5398
+
5399
+ // src/lib/agents/pi.ts
5400
+ class PiDriver {
5401
+ name = "pi";
5402
+ requiredEnvVars = ["PI_API_KEY"];
5403
+ async install(provider, providerSandboxId) {
5404
+ const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
5405
+ if (check.stdout.trim() !== "MISSING")
5406
+ return;
5407
+ await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
5408
+ }
5409
+ async configure(_provider, _providerSandboxId, _envVars) {}
5410
+ buildCommand(prompt) {
5411
+ return `pi ask ${JSON.stringify(prompt)}`;
5412
+ }
5413
+ }
5414
+
5415
+ // src/lib/agents/index.ts
5416
+ var DRIVERS = [
5417
+ new ClaudeDriver,
5418
+ new CodexDriver,
5419
+ new GeminiDriver,
5420
+ new OpenCodeDriver,
5421
+ new PiDriver
5422
+ ];
5423
+ var DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
5424
+ function getAgentDriver(name) {
5425
+ return DRIVER_MAP.get(name);
5426
+ }
5427
+
5300
5428
  // src/lib/agent-runner.ts
5301
- var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
5302
- var AGENT_COMMANDS = {
5303
- claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5304
- codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
5305
- gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
5306
- };
5307
5429
  async function runAgent(sandboxId, opts) {
5308
5430
  const sandbox = getSandbox(sandboxId);
5309
5431
  if (!sandbox.provider_sandbox_id) {
5310
5432
  throw new Error("Sandbox has no provider instance");
5311
5433
  }
5312
- const cmd = opts.command || AGENT_COMMANDS[opts.agentType]?.(opts.prompt) || opts.prompt;
5434
+ const provider = await getProvider(sandbox.provider);
5435
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5436
+ let cmd;
5437
+ const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
5438
+ if (opts.command) {
5439
+ cmd = opts.command;
5440
+ } else if (driver) {
5441
+ await driver.install(provider, sandbox.provider_sandbox_id);
5442
+ await driver.configure(provider, sandbox.provider_sandbox_id, sandbox.env_vars ?? {});
5443
+ cmd = driver.buildCommand(opts.prompt);
5444
+ } else {
5445
+ cmd = opts.prompt;
5446
+ }
5313
5447
  const session = createSession({
5314
5448
  sandbox_id: sandbox.id,
5315
5449
  agent_name: opts.agentName,
@@ -5318,8 +5452,6 @@ async function runAgent(sandboxId, opts) {
5318
5452
  });
5319
5453
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
5320
5454
  const collector = createStreamCollector(sandbox.id, session.id);
5321
- const provider = await getProvider(sandbox.provider);
5322
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5323
5455
  provider.exec(sandbox.provider_sandbox_id, cmd, {
5324
5456
  onStdout: (data) => {
5325
5457
  collector.onStdout(data);
@@ -5347,7 +5479,7 @@ async function stopAgent(sandboxId) {
5347
5479
  return;
5348
5480
  const provider = await getProvider(sandbox.provider);
5349
5481
  try {
5350
- await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini' || true");
5482
+ await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini\\|opencode\\|pi' || true");
5351
5483
  } catch {}
5352
5484
  emitLifecycleEvent(sandbox.id, "Agent stopped by user");
5353
5485
  }
@@ -5385,7 +5517,8 @@ var TOOL_CATALOG = [
5385
5517
  { name: "create_template", description: "Create a reusable sandbox template" },
5386
5518
  { name: "list_templates", description: "List all sandbox templates" },
5387
5519
  { name: "get_template", description: "Get a sandbox template by ID" },
5388
- { name: "delete_template", description: "Delete a sandbox template" }
5520
+ { name: "delete_template", description: "Delete a sandbox template" },
5521
+ { name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" }
5389
5522
  ];
5390
5523
  var server = new McpServer({
5391
5524
  name: "sandboxes",
@@ -5679,7 +5812,7 @@ server.tool("search_tools", "Search tools by keyword", {
5679
5812
  });
5680
5813
  server.tool("run_agent", "Run an AI agent inside a sandbox", {
5681
5814
  sandbox_id: exports_external.string().describe("Sandbox ID"),
5682
- agent_type: exports_external.enum(["claude", "codex", "gemini", "custom"]).describe("Agent type"),
5815
+ agent_type: exports_external.enum(["claude", "codex", "gemini", "opencode", "pi", "custom"]).describe("Agent type"),
5683
5816
  prompt: exports_external.string().describe("Prompt for the agent"),
5684
5817
  agent_name: exports_external.string().optional().describe("Agent name"),
5685
5818
  command: exports_external.string().optional().describe("Custom command (for 'custom' type)")
@@ -5796,5 +5929,39 @@ server.tool("delete_template", "Delete a sandbox template", {
5796
5929
  return err(e);
5797
5930
  }
5798
5931
  });
5932
+ server.tool("get_sandbox_status", "Get running processes, disk usage and uptime in a sandbox", {
5933
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
5934
+ }, async (params) => {
5935
+ try {
5936
+ const sandbox = getSandbox(params.sandbox_id);
5937
+ if (!sandbox.provider_sandbox_id)
5938
+ throw new Error("Sandbox has no provider ID");
5939
+ const provider = await getProvider(sandbox.provider);
5940
+ const [psResult, dfResult, uptimeResult] = await Promise.all([
5941
+ provider.exec(sandbox.provider_sandbox_id, "ps aux --no-headers 2>/dev/null | head -30 || ps aux 2>/dev/null | tail -n +2 | head -30"),
5942
+ provider.exec(sandbox.provider_sandbox_id, "df -h / 2>/dev/null || df -h 2>/dev/null | head -5"),
5943
+ provider.exec(sandbox.provider_sandbox_id, "uptime 2>/dev/null || echo unknown")
5944
+ ]);
5945
+ const processes = (psResult.stdout || "").trim().split(`
5946
+ `).filter(Boolean).map((line) => {
5947
+ const parts = line.trim().split(/\s+/);
5948
+ return {
5949
+ pid: parts[1] || "",
5950
+ cpu: parts[2] || "0",
5951
+ mem: parts[3] || "0",
5952
+ command: parts.slice(10).join(" ") || parts.slice(4).join(" ")
5953
+ };
5954
+ });
5955
+ return ok({
5956
+ sandbox_id: sandbox.id,
5957
+ status: sandbox.status,
5958
+ processes,
5959
+ disk: (dfResult.stdout || "").trim(),
5960
+ uptime: (uptimeResult.stdout || "").trim()
5961
+ });
5962
+ } catch (e) {
5963
+ return err(e);
5964
+ }
5965
+ });
5799
5966
  var transport = new StdioServerTransport;
5800
5967
  await server.connect(transport);
@@ -802,6 +802,25 @@ CREATE TABLE IF NOT EXISTS templates (
802
802
  CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
803
803
 
804
804
  INSERT OR IGNORE INTO _migrations (id) VALUES (2);
805
+ `,
806
+ `
807
+ CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
808
+ id TEXT PRIMARY KEY,
809
+ sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
810
+ agent_name TEXT,
811
+ agent_type TEXT,
812
+ command TEXT,
813
+ status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
814
+ exit_code INTEGER,
815
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
816
+ ended_at TEXT
817
+ );
818
+ INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
819
+ DROP TABLE sandbox_sessions;
820
+ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
821
+ CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
822
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
823
+ INSERT OR IGNORE INTO _migrations (id) VALUES (3);
805
824
  `
806
825
  ];
807
826
  var db = null;
@@ -4,7 +4,7 @@ export declare const SANDBOX_STATUSES: readonly ["creating", "running", "paused"
4
4
  export type SandboxStatus = (typeof SANDBOX_STATUSES)[number];
5
5
  export declare const SESSION_STATUSES: readonly ["running", "completed", "failed", "killed"];
6
6
  export type SessionStatus = (typeof SESSION_STATUSES)[number];
7
- export declare const AGENT_TYPES: readonly ["claude", "codex", "gemini", "custom"];
7
+ export declare const AGENT_TYPES: readonly ["claude", "codex", "gemini", "opencode", "pi", "custom"];
8
8
  export type AgentType = (typeof AGENT_TYPES)[number];
9
9
  export declare const EVENT_TYPES: readonly ["stdout", "stderr", "lifecycle", "agent"];
10
10
  export type EventType = (typeof EVENT_TYPES)[number];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/sandboxes",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "author": "Andrei Hasna <andrei@hasna.com>",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,7 +10,7 @@
10
10
  "dependencies": {
11
11
  "@daytonaio/sdk": "^0.18.0",
12
12
  "@e2b/code-interpreter": "^1.5.0",
13
- "@hasna/sandboxes": "^0.1.5",
13
+ "@hasna/sandboxes": "^0.1.6",
14
14
  "@modelcontextprotocol/sdk": "^1.12.1",
15
15
  "chalk": "^5.4.1",
16
16
  "commander": "^13.1.0",