@hasna/sandboxes 0.1.5 → 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/index.js CHANGED
@@ -28,7 +28,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
28
28
  var __require = import.meta.require;
29
29
 
30
30
  // src/types/index.ts
31
- var SANDBOX_PROVIDERS, SANDBOX_STATUSES, SESSION_STATUSES, AGENT_TYPES, EVENT_TYPES, SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, WebhookNotFoundError;
31
+ var SANDBOX_PROVIDERS, SANDBOX_STATUSES, SESSION_STATUSES, AGENT_TYPES, EVENT_TYPES, SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, WebhookNotFoundError, TemplateNotFoundError;
32
32
  var init_types = __esm(() => {
33
33
  SANDBOX_PROVIDERS = ["e2b", "daytona", "modal"];
34
34
  SANDBOX_STATUSES = [
@@ -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",
@@ -90,6 +90,12 @@ var init_types = __esm(() => {
90
90
  this.name = "WebhookNotFoundError";
91
91
  }
92
92
  };
93
+ TemplateNotFoundError = class TemplateNotFoundError extends Error {
94
+ constructor(id) {
95
+ super(`Template not found: ${id}`);
96
+ this.name = "TemplateNotFoundError";
97
+ }
98
+ };
93
99
  });
94
100
 
95
101
  // src/providers/e2b.ts
@@ -109,7 +115,10 @@ class E2BProvider {
109
115
  try {
110
116
  const sandbox = await E2BSandbox.create({
111
117
  apiKey: this.apiKey,
112
- timeoutMs: (opts?.timeout || 3600) * 1000
118
+ timeoutMs: (opts?.timeout || 3600) * 1000,
119
+ ...opts?.onTimeout === "pause" ? {
120
+ lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
121
+ } : {}
113
122
  });
114
123
  instanceCache.set(sandbox.sandboxId, sandbox);
115
124
  return {
@@ -218,6 +227,23 @@ class E2BProvider {
218
227
  async delete(sandboxId) {
219
228
  await this.stop(sandboxId);
220
229
  }
230
+ async pause(sandboxId) {
231
+ const sandbox = await this.getInstance(sandboxId);
232
+ try {
233
+ await sandbox.pause();
234
+ instanceCache.delete(sandboxId);
235
+ } catch (err) {
236
+ throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
237
+ }
238
+ }
239
+ async resume(sandboxId) {
240
+ try {
241
+ const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
242
+ instanceCache.set(sandboxId, sandbox);
243
+ } catch (err) {
244
+ throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
245
+ }
246
+ }
221
247
  async keepAlive(sandboxId, durationMs) {
222
248
  const sandbox = await this.getInstance(sandboxId);
223
249
  try {
@@ -378,6 +404,12 @@ class DaytonaProvider {
378
404
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
379
405
  }
380
406
  }
407
+ async pause(_sandboxId) {
408
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
409
+ }
410
+ async resume(_sandboxId) {
411
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
412
+ }
381
413
  async keepAlive(sandboxId, durationMs) {
382
414
  const sandbox = await this.getInstance(sandboxId);
383
415
  try {
@@ -600,6 +632,12 @@ class ModalProvider {
600
632
  async delete(sandboxId) {
601
633
  await this.stop(sandboxId);
602
634
  }
635
+ async pause(_sandboxId) {
636
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
637
+ }
638
+ async resume(_sandboxId) {
639
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
640
+ }
603
641
  async keepAlive(_sandboxId, _durationMs) {}
604
642
  parseCommand(command) {
605
643
  const args = [];
@@ -772,6 +810,44 @@ var MIGRATIONS = [
772
810
  );
773
811
 
774
812
  INSERT OR IGNORE INTO _migrations (id) VALUES (1);
813
+ `,
814
+ `
815
+ ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
816
+ ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
817
+
818
+ CREATE TABLE IF NOT EXISTS templates (
819
+ id TEXT PRIMARY KEY,
820
+ name TEXT NOT NULL UNIQUE,
821
+ description TEXT,
822
+ image TEXT,
823
+ env_vars TEXT NOT NULL DEFAULT '{}',
824
+ setup_script TEXT,
825
+ tags TEXT NOT NULL DEFAULT '[]',
826
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
827
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
828
+ );
829
+ CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
830
+
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);
775
851
  `
776
852
  ];
777
853
  var db = null;
@@ -844,6 +920,8 @@ function rowToSandbox(row) {
844
920
  env_vars: JSON.parse(row.env_vars),
845
921
  keep_alive_until: row.keep_alive_until,
846
922
  project_id: row.project_id,
923
+ on_timeout: row.on_timeout ?? "terminate",
924
+ auto_resume: row.auto_resume === 1,
847
925
  created_at: row.created_at,
848
926
  updated_at: row.updated_at
849
927
  };
@@ -859,8 +937,10 @@ function createSandbox(input) {
859
937
  const config = JSON.stringify(input.config ?? {});
860
938
  const env_vars = JSON.stringify(input.env_vars ?? {});
861
939
  const project_id = input.project_id ?? null;
862
- db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, created_at, updated_at)
863
- VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, timestamp, timestamp);
940
+ const on_timeout = input.on_timeout ?? "terminate";
941
+ const auto_resume = input.auto_resume ? 1 : 0;
942
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
943
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
864
944
  return getSandbox(id);
865
945
  }
866
946
  function getSandbox(id) {
@@ -1213,6 +1293,56 @@ function deleteWebhook(id) {
1213
1293
  throw new WebhookNotFoundError(id);
1214
1294
  db2.query("DELETE FROM webhooks WHERE id = ?").run(resolvedId);
1215
1295
  }
1296
+ // src/db/templates.ts
1297
+ init_types();
1298
+ function rowToTemplate(row) {
1299
+ return {
1300
+ id: row.id,
1301
+ name: row.name,
1302
+ description: row.description,
1303
+ image: row.image,
1304
+ env_vars: JSON.parse(row.env_vars),
1305
+ setup_script: row.setup_script,
1306
+ tags: JSON.parse(row.tags),
1307
+ created_at: row.created_at,
1308
+ updated_at: row.updated_at
1309
+ };
1310
+ }
1311
+ function createTemplate(input) {
1312
+ const db2 = getDatabase();
1313
+ const id = uuid();
1314
+ const timestamp = now();
1315
+ db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
1316
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.name, input.description ?? null, input.image ?? null, JSON.stringify(input.env_vars ?? {}), input.setup_script ?? null, JSON.stringify(input.tags ?? []), timestamp, timestamp);
1317
+ return getTemplate(id);
1318
+ }
1319
+ function getTemplate(id) {
1320
+ const db2 = getDatabase();
1321
+ const resolvedId = resolvePartialId("templates", id);
1322
+ if (!resolvedId)
1323
+ throw new TemplateNotFoundError(id);
1324
+ const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
1325
+ if (!row)
1326
+ throw new TemplateNotFoundError(id);
1327
+ return rowToTemplate(row);
1328
+ }
1329
+ function getTemplateByName(name) {
1330
+ const db2 = getDatabase();
1331
+ const row = db2.query("SELECT * FROM templates WHERE name = ?").get(name);
1332
+ return row ? rowToTemplate(row) : null;
1333
+ }
1334
+ function listTemplates() {
1335
+ const db2 = getDatabase();
1336
+ const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
1337
+ return rows.map(rowToTemplate);
1338
+ }
1339
+ function deleteTemplate(id) {
1340
+ const db2 = getDatabase();
1341
+ const resolvedId = resolvePartialId("templates", id);
1342
+ if (!resolvedId)
1343
+ throw new TemplateNotFoundError(id);
1344
+ db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
1345
+ }
1216
1346
  // src/lib/config.ts
1217
1347
  import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
1218
1348
  import { dirname as dirname2, join as join2 } from "path";
@@ -1407,6 +1537,117 @@ function emitLifecycleEvent(sandboxId, message) {
1407
1537
  });
1408
1538
  notifyListeners(sandboxId, "lifecycle", message);
1409
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
+ }
1410
1651
  export {
1411
1652
  uuid,
1412
1653
  updateSession,
@@ -1420,12 +1661,16 @@ export {
1420
1661
  now,
1421
1662
  loadConfig,
1422
1663
  listWebhooks,
1664
+ listTemplates,
1423
1665
  listSessions,
1424
1666
  listSandboxes,
1425
1667
  listProjects,
1426
1668
  listEvents,
1427
1669
  listAgents,
1670
+ listAgentDrivers,
1428
1671
  getWebhook,
1672
+ getTemplateByName,
1673
+ getTemplate,
1429
1674
  getSession,
1430
1675
  getSandbox,
1431
1676
  getProviderApiKey,
@@ -1437,16 +1682,19 @@ export {
1437
1682
  getDefaultImage,
1438
1683
  getDatabase,
1439
1684
  getConfigValue,
1685
+ getAgentDriver,
1440
1686
  getAgentByName,
1441
1687
  getAgent,
1442
1688
  ensureProject,
1443
1689
  endSession,
1444
1690
  emitLifecycleEvent,
1445
1691
  deleteWebhook,
1692
+ deleteTemplate,
1446
1693
  deleteSandbox,
1447
1694
  deleteProject,
1448
1695
  deleteAgent,
1449
1696
  createWebhook,
1697
+ createTemplate,
1450
1698
  createStreamCollector,
1451
1699
  createSession,
1452
1700
  createSandbox,
@@ -1455,6 +1703,7 @@ export {
1455
1703
  addStreamListener,
1456
1704
  addEvent,
1457
1705
  WebhookNotFoundError,
1706
+ TemplateNotFoundError,
1458
1707
  SessionNotFoundError,
1459
1708
  SandboxNotFoundError,
1460
1709
  SESSION_STATUSES,
@@ -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"}