@hasna/sandboxes 0.1.7 → 0.1.8

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
@@ -2263,6 +2263,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
2263
2263
  CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
2264
2264
  CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
2265
2265
  INSERT OR IGNORE INTO _migrations (id) VALUES (3);
2266
+ `,
2267
+ `
2268
+ CREATE TABLE IF NOT EXISTS snapshots (
2269
+ id TEXT PRIMARY KEY,
2270
+ sandbox_id TEXT NOT NULL,
2271
+ provider_sandbox_id TEXT NOT NULL,
2272
+ provider TEXT NOT NULL,
2273
+ name TEXT,
2274
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
2275
+ );
2276
+ CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
2277
+ INSERT OR IGNORE INTO _migrations (id) VALUES (4);
2266
2278
  `
2267
2279
  ];
2268
2280
  });
@@ -2752,6 +2764,15 @@ class E2BProvider {
2752
2764
  throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
2753
2765
  }
2754
2766
  }
2767
+ async getPublicUrl(sandboxId, port, _protocol) {
2768
+ const sandbox = await this.getInstance(sandboxId);
2769
+ try {
2770
+ const host = sandbox.getHost(port);
2771
+ return `https://${host}`;
2772
+ } catch (err) {
2773
+ throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
2774
+ }
2775
+ }
2755
2776
  async keepAlive(sandboxId, durationMs) {
2756
2777
  const sandbox = await this.getInstance(sandboxId);
2757
2778
  try {
@@ -2912,6 +2933,9 @@ class DaytonaProvider {
2912
2933
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
2913
2934
  }
2914
2935
  }
2936
+ async getPublicUrl(_sandboxId, _port, _protocol) {
2937
+ throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
2938
+ }
2915
2939
  async pause(_sandboxId) {
2916
2940
  throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
2917
2941
  }
@@ -3140,6 +3164,9 @@ class ModalProvider {
3140
3164
  async delete(sandboxId) {
3141
3165
  await this.stop(sandboxId);
3142
3166
  }
3167
+ async getPublicUrl(_sandboxId, _port, _protocol) {
3168
+ throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
3169
+ }
3143
3170
  async pause(_sandboxId) {
3144
3171
  throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
3145
3172
  }
@@ -3409,13 +3436,23 @@ __export(exports_agent_runner, {
3409
3436
  stopAgent: () => stopAgent,
3410
3437
  runAgent: () => runAgent
3411
3438
  });
3439
+ async function fireWebhook(url, payload) {
3440
+ try {
3441
+ await fetch(url, {
3442
+ method: "POST",
3443
+ headers: { "Content-Type": "application/json" },
3444
+ body: JSON.stringify(payload)
3445
+ });
3446
+ } catch {}
3447
+ }
3412
3448
  async function runAgent(sandboxId, opts) {
3413
3449
  const sandbox = getSandbox(sandboxId);
3414
3450
  if (!sandbox.provider_sandbox_id) {
3415
3451
  throw new Error("Sandbox has no provider instance");
3416
3452
  }
3417
3453
  const provider = await getProvider(sandbox.provider);
3418
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
3454
+ const mergedEnv = { ...sandbox.env_vars, ...opts.callEnvVars };
3455
+ const env = Object.keys(mergedEnv).length > 0 ? mergedEnv : undefined;
3419
3456
  let cmd;
3420
3457
  const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
3421
3458
  if (opts.command) {
@@ -3434,6 +3471,18 @@ async function runAgent(sandboxId, opts) {
3434
3471
  command: cmd
3435
3472
  });
3436
3473
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
3474
+ const startedAt = Date.now();
3475
+ const webhookEvents = opts.webhookEvents ?? ["start", "complete", "error"];
3476
+ if (opts.webhookUrl && webhookEvents.includes("start")) {
3477
+ fireWebhook(opts.webhookUrl, {
3478
+ event: "start",
3479
+ session_id: session.id,
3480
+ sandbox_id: sandbox.id,
3481
+ agent_type: opts.agentType,
3482
+ status: "running",
3483
+ timestamp: new Date().toISOString()
3484
+ });
3485
+ }
3437
3486
  const collector = createStreamCollector(sandbox.id, session.id);
3438
3487
  provider.exec(sandbox.provider_sandbox_id, cmd, {
3439
3488
  onStdout: (data) => {
@@ -3450,9 +3499,32 @@ async function runAgent(sandboxId, opts) {
3450
3499
  const status = exitResult.exit_code === 0 ? "completed" : "failed";
3451
3500
  endSession(session.id, exitResult.exit_code ?? 0, status);
3452
3501
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
3502
+ if (opts.webhookUrl && webhookEvents.includes("complete")) {
3503
+ fireWebhook(opts.webhookUrl, {
3504
+ event: "complete",
3505
+ session_id: session.id,
3506
+ sandbox_id: sandbox.id,
3507
+ agent_type: opts.agentType,
3508
+ status,
3509
+ exit_code: exitResult.exit_code,
3510
+ duration_ms: Date.now() - startedAt,
3511
+ timestamp: new Date().toISOString()
3512
+ });
3513
+ }
3453
3514
  }).catch((err) => {
3454
3515
  endSession(session.id, 1, "failed");
3455
3516
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
3517
+ if (opts.webhookUrl && webhookEvents.includes("error")) {
3518
+ fireWebhook(opts.webhookUrl, {
3519
+ event: "error",
3520
+ session_id: session.id,
3521
+ sandbox_id: sandbox.id,
3522
+ agent_type: opts.agentType,
3523
+ status: "failed",
3524
+ duration_ms: Date.now() - startedAt,
3525
+ timestamp: new Date().toISOString()
3526
+ });
3527
+ }
3456
3528
  });
3457
3529
  return session;
3458
3530
  }
@@ -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;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"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2MtC,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"}
@@ -0,0 +1,29 @@
1
+ export interface Snapshot {
2
+ id: string;
3
+ sandbox_id: string;
4
+ provider_sandbox_id: string;
5
+ provider: string;
6
+ name: string | null;
7
+ created_at: string;
8
+ }
9
+ export interface SnapshotRow {
10
+ id: string;
11
+ sandbox_id: string;
12
+ provider_sandbox_id: string;
13
+ provider: string;
14
+ name: string | null;
15
+ created_at: string;
16
+ }
17
+ export declare class SnapshotNotFoundError extends Error {
18
+ constructor(id: string);
19
+ }
20
+ export declare function createSnapshot(input: {
21
+ sandbox_id: string;
22
+ provider_sandbox_id: string;
23
+ provider: string;
24
+ name?: string;
25
+ }): Snapshot;
26
+ export declare function getSnapshot(id: string): Snapshot;
27
+ export declare function listSnapshots(sandboxId?: string): Snapshot[];
28
+ export declare function deleteSnapshot(id: string): void;
29
+ //# sourceMappingURL=snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/db/snapshots.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,EAAE,EAAE,MAAM;CAIvB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,QAAQ,CASX;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAOhD;AAED,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAM5D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAK/C"}
package/dist/index.d.ts CHANGED
@@ -7,6 +7,9 @@ export { registerAgent, getAgent, getAgentByName, listAgents, deleteAgent } from
7
7
  export { createProject, getProject, getProjectByPath, listProjects, ensureProject, deleteProject } from "./db/projects.js";
8
8
  export { createWebhook, getWebhook, listWebhooks, deleteWebhook } from "./db/webhooks.js";
9
9
  export { createTemplate, getTemplate, getTemplateByName, listTemplates, deleteTemplate } from "./db/templates.js";
10
+ export { createSnapshot, getSnapshot, listSnapshots, deleteSnapshot } from "./db/snapshots.js";
11
+ export type { Snapshot, SnapshotRow } from "./db/snapshots.js";
12
+ export { SnapshotNotFoundError } from "./db/snapshots.js";
10
13
  export { loadConfig, saveConfig, getDefaultProvider, getDefaultTimeout, getDefaultImage, getProviderApiKey, setConfigValue, getConfigValue } from "./lib/config.js";
11
14
  export { getProvider } from "./providers/index.js";
12
15
  export type { SandboxProvider, ProviderSandbox, CreateSandboxOpts, ExecOptions } from "./providers/types.js";
@@ -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;AAG/F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,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;AAClH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/F,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,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
@@ -244,6 +244,15 @@ class E2BProvider {
244
244
  throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
245
245
  }
246
246
  }
247
+ async getPublicUrl(sandboxId, port, _protocol) {
248
+ const sandbox = await this.getInstance(sandboxId);
249
+ try {
250
+ const host = sandbox.getHost(port);
251
+ return `https://${host}`;
252
+ } catch (err) {
253
+ throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
254
+ }
255
+ }
247
256
  async keepAlive(sandboxId, durationMs) {
248
257
  const sandbox = await this.getInstance(sandboxId);
249
258
  try {
@@ -404,6 +413,9 @@ class DaytonaProvider {
404
413
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
405
414
  }
406
415
  }
416
+ async getPublicUrl(_sandboxId, _port, _protocol) {
417
+ throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
418
+ }
407
419
  async pause(_sandboxId) {
408
420
  throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
409
421
  }
@@ -632,6 +644,9 @@ class ModalProvider {
632
644
  async delete(sandboxId) {
633
645
  await this.stop(sandboxId);
634
646
  }
647
+ async getPublicUrl(_sandboxId, _port, _protocol) {
648
+ throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
649
+ }
635
650
  async pause(_sandboxId) {
636
651
  throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
637
652
  }
@@ -848,6 +863,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
848
863
  CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
849
864
  CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
850
865
  INSERT OR IGNORE INTO _migrations (id) VALUES (3);
866
+ `,
867
+ `
868
+ CREATE TABLE IF NOT EXISTS snapshots (
869
+ id TEXT PRIMARY KEY,
870
+ sandbox_id TEXT NOT NULL,
871
+ provider_sandbox_id TEXT NOT NULL,
872
+ provider TEXT NOT NULL,
873
+ name TEXT,
874
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
875
+ );
876
+ CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
877
+ INSERT OR IGNORE INTO _migrations (id) VALUES (4);
851
878
  `
852
879
  ];
853
880
  var db = null;
@@ -1343,6 +1370,45 @@ function deleteTemplate(id) {
1343
1370
  throw new TemplateNotFoundError(id);
1344
1371
  db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
1345
1372
  }
1373
+ // src/db/snapshots.ts
1374
+ class SnapshotNotFoundError extends Error {
1375
+ constructor(id) {
1376
+ super(`Snapshot not found: ${id}`);
1377
+ this.name = "SnapshotNotFoundError";
1378
+ }
1379
+ }
1380
+ function createSnapshot(input) {
1381
+ const db2 = getDatabase();
1382
+ const id = uuid();
1383
+ const timestamp = now();
1384
+ db2.query(`INSERT INTO snapshots (id, sandbox_id, provider_sandbox_id, provider, name, created_at)
1385
+ VALUES (?, ?, ?, ?, ?, ?)`).run(id, input.sandbox_id, input.provider_sandbox_id, input.provider, input.name ?? null, timestamp);
1386
+ return getSnapshot(id);
1387
+ }
1388
+ function getSnapshot(id) {
1389
+ const db2 = getDatabase();
1390
+ const resolvedId = resolvePartialId("snapshots", id);
1391
+ if (!resolvedId)
1392
+ throw new SnapshotNotFoundError(id);
1393
+ const row = db2.query("SELECT * FROM snapshots WHERE id = ?").get(resolvedId);
1394
+ if (!row)
1395
+ throw new SnapshotNotFoundError(id);
1396
+ return row;
1397
+ }
1398
+ function listSnapshots(sandboxId) {
1399
+ const db2 = getDatabase();
1400
+ if (sandboxId) {
1401
+ return db2.query("SELECT * FROM snapshots WHERE sandbox_id = ? ORDER BY created_at DESC").all(sandboxId);
1402
+ }
1403
+ return db2.query("SELECT * FROM snapshots ORDER BY created_at DESC").all();
1404
+ }
1405
+ function deleteSnapshot(id) {
1406
+ const db2 = getDatabase();
1407
+ const resolvedId = resolvePartialId("snapshots", id);
1408
+ if (!resolvedId)
1409
+ throw new SnapshotNotFoundError(id);
1410
+ db2.query("DELETE FROM snapshots WHERE id = ?").run(resolvedId);
1411
+ }
1346
1412
  // src/lib/config.ts
1347
1413
  import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
1348
1414
  import { dirname as dirname2, join as join2 } from "path";
@@ -1662,6 +1728,7 @@ export {
1662
1728
  loadConfig,
1663
1729
  listWebhooks,
1664
1730
  listTemplates,
1731
+ listSnapshots,
1665
1732
  listSessions,
1666
1733
  listSandboxes,
1667
1734
  listProjects,
@@ -1671,6 +1738,7 @@ export {
1671
1738
  getWebhook,
1672
1739
  getTemplateByName,
1673
1740
  getTemplate,
1741
+ getSnapshot,
1674
1742
  getSession,
1675
1743
  getSandbox,
1676
1744
  getProviderApiKey,
@@ -1690,12 +1758,14 @@ export {
1690
1758
  emitLifecycleEvent,
1691
1759
  deleteWebhook,
1692
1760
  deleteTemplate,
1761
+ deleteSnapshot,
1693
1762
  deleteSandbox,
1694
1763
  deleteProject,
1695
1764
  deleteAgent,
1696
1765
  createWebhook,
1697
1766
  createTemplate,
1698
1767
  createStreamCollector,
1768
+ createSnapshot,
1699
1769
  createSession,
1700
1770
  createSandbox,
1701
1771
  createProject,
@@ -1704,6 +1774,7 @@ export {
1704
1774
  addEvent,
1705
1775
  WebhookNotFoundError,
1706
1776
  TemplateNotFoundError,
1777
+ SnapshotNotFoundError,
1707
1778
  SessionNotFoundError,
1708
1779
  SandboxNotFoundError,
1709
1780
  SESSION_STATUSES,
@@ -6,6 +6,9 @@ export interface RunAgentOpts {
6
6
  command?: string;
7
7
  onStdout?: (data: string) => void;
8
8
  onStderr?: (data: string) => void;
9
+ callEnvVars?: Record<string, string>;
10
+ webhookUrl?: string;
11
+ webhookEvents?: ('start' | 'complete' | 'error')[];
9
12
  }
10
13
  export declare function runAgent(sandboxId: string, opts: RunAgentOpts): Promise<SandboxSession>;
11
14
  export declare function stopAgent(sandboxId: string): Promise<void>;
@@ -1 +1 @@
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"}
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;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;CACpD;AAcD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAyGzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhE"}
package/dist/mcp/index.js CHANGED
@@ -217,6 +217,15 @@ class E2BProvider {
217
217
  throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
218
218
  }
219
219
  }
220
+ async getPublicUrl(sandboxId, port, _protocol) {
221
+ const sandbox = await this.getInstance(sandboxId);
222
+ try {
223
+ const host = sandbox.getHost(port);
224
+ return `https://${host}`;
225
+ } catch (err) {
226
+ throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
227
+ }
228
+ }
220
229
  async keepAlive(sandboxId, durationMs) {
221
230
  const sandbox = await this.getInstance(sandboxId);
222
231
  try {
@@ -377,6 +386,9 @@ class DaytonaProvider {
377
386
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
378
387
  }
379
388
  }
389
+ async getPublicUrl(_sandboxId, _port, _protocol) {
390
+ throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
391
+ }
380
392
  async pause(_sandboxId) {
381
393
  throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
382
394
  }
@@ -605,6 +617,9 @@ class ModalProvider {
605
617
  async delete(sandboxId) {
606
618
  await this.stop(sandboxId);
607
619
  }
620
+ async getPublicUrl(_sandboxId, _port, _protocol) {
621
+ throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
622
+ }
608
623
  async pause(_sandboxId) {
609
624
  throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
610
625
  }
@@ -4795,6 +4810,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
4795
4810
  CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
4796
4811
  CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
4797
4812
  INSERT OR IGNORE INTO _migrations (id) VALUES (3);
4813
+ `,
4814
+ `
4815
+ CREATE TABLE IF NOT EXISTS snapshots (
4816
+ id TEXT PRIMARY KEY,
4817
+ sandbox_id TEXT NOT NULL,
4818
+ provider_sandbox_id TEXT NOT NULL,
4819
+ provider TEXT NOT NULL,
4820
+ name TEXT,
4821
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
4822
+ );
4823
+ CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
4824
+ INSERT OR IGNORE INTO _migrations (id) VALUES (4);
4798
4825
  `
4799
4826
  ];
4800
4827
  var db = null;
@@ -5183,6 +5210,46 @@ function deleteTemplate(id) {
5183
5210
  db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
5184
5211
  }
5185
5212
 
5213
+ // src/db/snapshots.ts
5214
+ class SnapshotNotFoundError extends Error {
5215
+ constructor(id) {
5216
+ super(`Snapshot not found: ${id}`);
5217
+ this.name = "SnapshotNotFoundError";
5218
+ }
5219
+ }
5220
+ function createSnapshot(input) {
5221
+ const db2 = getDatabase();
5222
+ const id = uuid();
5223
+ const timestamp = now();
5224
+ db2.query(`INSERT INTO snapshots (id, sandbox_id, provider_sandbox_id, provider, name, created_at)
5225
+ VALUES (?, ?, ?, ?, ?, ?)`).run(id, input.sandbox_id, input.provider_sandbox_id, input.provider, input.name ?? null, timestamp);
5226
+ return getSnapshot(id);
5227
+ }
5228
+ function getSnapshot(id) {
5229
+ const db2 = getDatabase();
5230
+ const resolvedId = resolvePartialId("snapshots", id);
5231
+ if (!resolvedId)
5232
+ throw new SnapshotNotFoundError(id);
5233
+ const row = db2.query("SELECT * FROM snapshots WHERE id = ?").get(resolvedId);
5234
+ if (!row)
5235
+ throw new SnapshotNotFoundError(id);
5236
+ return row;
5237
+ }
5238
+ function listSnapshots(sandboxId) {
5239
+ const db2 = getDatabase();
5240
+ if (sandboxId) {
5241
+ return db2.query("SELECT * FROM snapshots WHERE sandbox_id = ? ORDER BY created_at DESC").all(sandboxId);
5242
+ }
5243
+ return db2.query("SELECT * FROM snapshots ORDER BY created_at DESC").all();
5244
+ }
5245
+ function deleteSnapshot(id) {
5246
+ const db2 = getDatabase();
5247
+ const resolvedId = resolvePartialId("snapshots", id);
5248
+ if (!resolvedId)
5249
+ throw new SnapshotNotFoundError(id);
5250
+ db2.query("DELETE FROM snapshots WHERE id = ?").run(resolvedId);
5251
+ }
5252
+
5186
5253
  // src/providers/index.ts
5187
5254
  init_types();
5188
5255
 
@@ -5426,13 +5493,23 @@ function getAgentDriver(name) {
5426
5493
  }
5427
5494
 
5428
5495
  // src/lib/agent-runner.ts
5496
+ async function fireWebhook(url, payload) {
5497
+ try {
5498
+ await fetch(url, {
5499
+ method: "POST",
5500
+ headers: { "Content-Type": "application/json" },
5501
+ body: JSON.stringify(payload)
5502
+ });
5503
+ } catch {}
5504
+ }
5429
5505
  async function runAgent(sandboxId, opts) {
5430
5506
  const sandbox = getSandbox(sandboxId);
5431
5507
  if (!sandbox.provider_sandbox_id) {
5432
5508
  throw new Error("Sandbox has no provider instance");
5433
5509
  }
5434
5510
  const provider = await getProvider(sandbox.provider);
5435
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5511
+ const mergedEnv = { ...sandbox.env_vars, ...opts.callEnvVars };
5512
+ const env = Object.keys(mergedEnv).length > 0 ? mergedEnv : undefined;
5436
5513
  let cmd;
5437
5514
  const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
5438
5515
  if (opts.command) {
@@ -5451,6 +5528,18 @@ async function runAgent(sandboxId, opts) {
5451
5528
  command: cmd
5452
5529
  });
5453
5530
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
5531
+ const startedAt = Date.now();
5532
+ const webhookEvents = opts.webhookEvents ?? ["start", "complete", "error"];
5533
+ if (opts.webhookUrl && webhookEvents.includes("start")) {
5534
+ fireWebhook(opts.webhookUrl, {
5535
+ event: "start",
5536
+ session_id: session.id,
5537
+ sandbox_id: sandbox.id,
5538
+ agent_type: opts.agentType,
5539
+ status: "running",
5540
+ timestamp: new Date().toISOString()
5541
+ });
5542
+ }
5454
5543
  const collector = createStreamCollector(sandbox.id, session.id);
5455
5544
  provider.exec(sandbox.provider_sandbox_id, cmd, {
5456
5545
  onStdout: (data) => {
@@ -5467,9 +5556,32 @@ async function runAgent(sandboxId, opts) {
5467
5556
  const status = exitResult.exit_code === 0 ? "completed" : "failed";
5468
5557
  endSession(session.id, exitResult.exit_code ?? 0, status);
5469
5558
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
5559
+ if (opts.webhookUrl && webhookEvents.includes("complete")) {
5560
+ fireWebhook(opts.webhookUrl, {
5561
+ event: "complete",
5562
+ session_id: session.id,
5563
+ sandbox_id: sandbox.id,
5564
+ agent_type: opts.agentType,
5565
+ status,
5566
+ exit_code: exitResult.exit_code,
5567
+ duration_ms: Date.now() - startedAt,
5568
+ timestamp: new Date().toISOString()
5569
+ });
5570
+ }
5470
5571
  }).catch((err) => {
5471
5572
  endSession(session.id, 1, "failed");
5472
5573
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
5574
+ if (opts.webhookUrl && webhookEvents.includes("error")) {
5575
+ fireWebhook(opts.webhookUrl, {
5576
+ event: "error",
5577
+ session_id: session.id,
5578
+ sandbox_id: sandbox.id,
5579
+ agent_type: opts.agentType,
5580
+ status: "failed",
5581
+ duration_ms: Date.now() - startedAt,
5582
+ timestamp: new Date().toISOString()
5583
+ });
5584
+ }
5473
5585
  });
5474
5586
  return session;
5475
5587
  }
@@ -5485,6 +5597,7 @@ async function stopAgent(sandboxId) {
5485
5597
  }
5486
5598
 
5487
5599
  // src/mcp/index.ts
5600
+ var exposedPorts = new Map;
5488
5601
  function ok(data) {
5489
5602
  return { content: [{ type: "text", text: JSON.stringify(data) }] };
5490
5603
  }
@@ -5518,7 +5631,14 @@ var TOOL_CATALOG = [
5518
5631
  { name: "list_templates", description: "List all sandbox templates" },
5519
5632
  { name: "get_template", description: "Get a sandbox template by ID" },
5520
5633
  { name: "delete_template", description: "Delete a sandbox template" },
5521
- { name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" }
5634
+ { name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" },
5635
+ { name: "snapshot_sandbox", description: "Capture sandbox filesystem state as a snapshot" },
5636
+ { name: "list_snapshots", description: "List filesystem snapshots" },
5637
+ { name: "delete_snapshot", description: "Delete a snapshot" },
5638
+ { name: "expose_port", description: "Forward a sandbox port and get a public URL" },
5639
+ { name: "list_exposed_ports", description: "List all forwarded ports for a sandbox" },
5640
+ { name: "close_port", description: "Stop forwarding a sandbox port" },
5641
+ { name: "get_network_log", description: "Get outbound network connections from a sandbox" }
5522
5642
  ];
5523
5643
  var server = new McpServer({
5524
5644
  name: "sandboxes",
@@ -5532,7 +5652,9 @@ server.tool("create_sandbox", "Create a new sandbox", {
5532
5652
  env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
5533
5653
  template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
5534
5654
  on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
5535
- auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
5655
+ auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect"),
5656
+ snapshot_id: exports_external.string().optional().describe("Snapshot ID to restore from"),
5657
+ network: exports_external.enum(["full", "restricted", "none"]).optional().describe("Network access policy for the sandbox")
5536
5658
  }, async (params) => {
5537
5659
  try {
5538
5660
  const providerName = params.provider ?? getDefaultProvider();
@@ -5554,9 +5676,20 @@ server.tool("create_sandbox", "Create a new sandbox", {
5554
5676
  env_vars: envVars,
5555
5677
  on_timeout: onTimeout,
5556
5678
  auto_resume: autoResume,
5557
- template_id: params.template_id
5679
+ template_id: params.template_id,
5680
+ config: { network: params.network ?? "full" }
5558
5681
  });
5559
5682
  const provider = await getProvider(providerName);
5683
+ if (params.snapshot_id) {
5684
+ const snapshot = getSnapshot(params.snapshot_id);
5685
+ await provider.resume(snapshot.provider_sandbox_id);
5686
+ const updated2 = updateSandbox(sandbox.id, {
5687
+ provider_sandbox_id: snapshot.provider_sandbox_id,
5688
+ status: "running"
5689
+ });
5690
+ emitLifecycleEvent(sandbox.id, `Sandbox restored from snapshot ${snapshot.id}`);
5691
+ return ok(updated2);
5692
+ }
5560
5693
  const result = await provider.create({
5561
5694
  image,
5562
5695
  timeout,
@@ -5652,7 +5785,8 @@ server.tool("keep_alive", "Extend sandbox lifetime", {
5652
5785
  server.tool("exec_command", "Execute a command in a sandbox", {
5653
5786
  sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
5654
5787
  command: exports_external.string().describe("Command to execute"),
5655
- background: exports_external.boolean().optional().describe("Run in background")
5788
+ background: exports_external.boolean().optional().describe("Run in background"),
5789
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Per-call environment variables (merged with sandbox env_vars, not persisted)")
5656
5790
  }, async (params) => {
5657
5791
  try {
5658
5792
  const sandbox = getSandbox(params.sandbox_id);
@@ -5664,7 +5798,8 @@ server.tool("exec_command", "Execute a command in a sandbox", {
5664
5798
  });
5665
5799
  const collector = createStreamCollector(sandbox.id, session.id);
5666
5800
  const provider = await getProvider(sandbox.provider);
5667
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5801
+ const callEnv = { ...sandbox.env_vars, ...params.env_vars };
5802
+ const env = Object.keys(callEnv).length > 0 ? callEnv : undefined;
5668
5803
  if (params.background) {
5669
5804
  provider.exec(sandbox.provider_sandbox_id, params.command, {
5670
5805
  onStdout: collector.onStdout,
@@ -5815,14 +5950,20 @@ server.tool("run_agent", "Run an AI agent inside a sandbox", {
5815
5950
  agent_type: exports_external.enum(["claude", "codex", "gemini", "opencode", "pi", "custom"]).describe("Agent type"),
5816
5951
  prompt: exports_external.string().describe("Prompt for the agent"),
5817
5952
  agent_name: exports_external.string().optional().describe("Agent name"),
5818
- command: exports_external.string().optional().describe("Custom command (for 'custom' type)")
5953
+ command: exports_external.string().optional().describe("Custom command (for 'custom' type)"),
5954
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Per-call environment variables (merged with sandbox env_vars, not persisted)"),
5955
+ webhook_url: exports_external.string().optional().describe("URL to POST result to when agent finishes"),
5956
+ webhook_events: exports_external.array(exports_external.enum(["start", "complete", "error"])).optional().describe("Which events to notify on (default: all)")
5819
5957
  }, async (params) => {
5820
5958
  try {
5821
5959
  const session = await runAgent(params.sandbox_id, {
5822
5960
  agentType: params.agent_type,
5823
5961
  prompt: params.prompt,
5824
5962
  agentName: params.agent_name,
5825
- command: params.command
5963
+ command: params.command,
5964
+ callEnvVars: params.env_vars,
5965
+ webhookUrl: params.webhook_url,
5966
+ webhookEvents: params.webhook_events
5826
5967
  });
5827
5968
  return ok({ session_id: session.id, status: session.status });
5828
5969
  } catch (e) {
@@ -5842,17 +5983,19 @@ server.tool("stop_agent", "Stop a running agent in a sandbox", {
5842
5983
  server.tool("get_agent_output", "Get output from an agent session", {
5843
5984
  sandbox_id: exports_external.string().describe("Sandbox ID"),
5844
5985
  session_id: exports_external.string().optional().describe("Session ID"),
5845
- limit: exports_external.number().optional().describe("Max events")
5986
+ limit: exports_external.number().optional().describe("Max events"),
5987
+ offset: exports_external.number().optional().describe("Skip first N events (for incremental polling)")
5846
5988
  }, async (params) => {
5847
5989
  try {
5848
5990
  const events = listEvents({
5849
5991
  sandbox_id: params.sandbox_id,
5850
5992
  session_id: params.session_id,
5851
- limit: params.limit || 100
5993
+ limit: params.limit || 100,
5994
+ offset: params.offset
5852
5995
  });
5853
5996
  const stdout = events.filter((e) => e.type === "stdout").map((e) => e.data).join("");
5854
5997
  const stderr = events.filter((e) => e.type === "stderr").map((e) => e.data).join("");
5855
- return ok({ stdout, stderr, event_count: events.length });
5998
+ return ok({ stdout, stderr, event_count: events.length, next_offset: (params.offset ?? 0) + events.length });
5856
5999
  } catch (e) {
5857
6000
  return err(e);
5858
6001
  }
@@ -5963,5 +6106,104 @@ server.tool("get_sandbox_status", "Get running processes, disk usage and uptime
5963
6106
  return err(e);
5964
6107
  }
5965
6108
  });
6109
+ server.tool("snapshot_sandbox", "Capture sandbox filesystem state as a snapshot", {
6110
+ id: exports_external.string().describe("Sandbox ID or partial ID"),
6111
+ name: exports_external.string().optional().describe("Snapshot name")
6112
+ }, async (params) => {
6113
+ try {
6114
+ const sandbox = getSandbox(params.id);
6115
+ if (!sandbox.provider_sandbox_id)
6116
+ throw new Error("Sandbox has no provider ID");
6117
+ const provider = await getProvider(sandbox.provider);
6118
+ await provider.pause(sandbox.provider_sandbox_id);
6119
+ updateSandbox(sandbox.id, { status: "paused" });
6120
+ const snapshot = createSnapshot({
6121
+ sandbox_id: sandbox.id,
6122
+ provider_sandbox_id: sandbox.provider_sandbox_id,
6123
+ provider: sandbox.provider,
6124
+ name: params.name
6125
+ });
6126
+ emitLifecycleEvent(sandbox.id, `Snapshot created: ${snapshot.id}`);
6127
+ return ok(snapshot);
6128
+ } catch (e) {
6129
+ return err(e);
6130
+ }
6131
+ });
6132
+ server.tool("list_snapshots", "List filesystem snapshots", {
6133
+ sandbox_id: exports_external.string().optional().describe("Filter by sandbox ID")
6134
+ }, async (params) => {
6135
+ try {
6136
+ return ok(listSnapshots(params.sandbox_id));
6137
+ } catch (e) {
6138
+ return err(e);
6139
+ }
6140
+ });
6141
+ server.tool("delete_snapshot", "Delete a snapshot", {
6142
+ id: exports_external.string().describe("Snapshot ID or partial ID")
6143
+ }, async (params) => {
6144
+ try {
6145
+ deleteSnapshot(params.id);
6146
+ return ok({ deleted: params.id });
6147
+ } catch (e) {
6148
+ return err(e);
6149
+ }
6150
+ });
6151
+ server.tool("expose_port", "Forward a sandbox port and get a public URL", {
6152
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
6153
+ port: exports_external.number().describe("Port number to expose"),
6154
+ protocol: exports_external.string().optional().describe("Protocol: http or ws (default: http)")
6155
+ }, async (params) => {
6156
+ try {
6157
+ const sandbox = getSandbox(params.sandbox_id);
6158
+ if (!sandbox.provider_sandbox_id)
6159
+ throw new Error("Sandbox has no provider ID");
6160
+ const provider = await getProvider(sandbox.provider);
6161
+ const url = await provider.getPublicUrl(sandbox.provider_sandbox_id, params.port, params.protocol);
6162
+ if (!exposedPorts.has(sandbox.id))
6163
+ exposedPorts.set(sandbox.id, new Map);
6164
+ exposedPorts.get(sandbox.id).set(params.port, url);
6165
+ return ok({ sandbox_id: sandbox.id, port: params.port, url });
6166
+ } catch (e) {
6167
+ return err(e);
6168
+ }
6169
+ });
6170
+ server.tool("list_exposed_ports", "List all forwarded ports for a sandbox", {
6171
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
6172
+ }, async (params) => {
6173
+ try {
6174
+ const sandbox = getSandbox(params.sandbox_id);
6175
+ const ports = exposedPorts.get(sandbox.id) ?? new Map;
6176
+ const result = Array.from(ports.entries()).map(([port, url]) => ({ port, url }));
6177
+ return ok(result);
6178
+ } catch (e) {
6179
+ return err(e);
6180
+ }
6181
+ });
6182
+ server.tool("close_port", "Stop forwarding a sandbox port", {
6183
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
6184
+ port: exports_external.number().describe("Port number to close")
6185
+ }, async (params) => {
6186
+ try {
6187
+ const sandbox = getSandbox(params.sandbox_id);
6188
+ exposedPorts.get(sandbox.id)?.delete(params.port);
6189
+ return ok({ sandbox_id: sandbox.id, port: params.port, closed: true });
6190
+ } catch (e) {
6191
+ return err(e);
6192
+ }
6193
+ });
6194
+ server.tool("get_network_log", "Get outbound network connections from a sandbox", {
6195
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
6196
+ }, async (params) => {
6197
+ try {
6198
+ const sandbox = getSandbox(params.sandbox_id);
6199
+ if (!sandbox.provider_sandbox_id)
6200
+ throw new Error("Sandbox has no provider ID");
6201
+ const provider = await getProvider(sandbox.provider);
6202
+ const result = await provider.exec(sandbox.provider_sandbox_id, "ss -tnp 2>/dev/null || netstat -tnp 2>/dev/null || echo 'Network log not available'");
6203
+ return ok({ sandbox_id: sandbox.id, connections: (result.stdout || "").trim() });
6204
+ } catch (e) {
6205
+ return err(e);
6206
+ }
6207
+ });
5966
6208
  var transport = new StdioServerTransport;
5967
6209
  await server.connect(transport);
@@ -12,6 +12,7 @@ export declare class DaytonaProvider implements SandboxProvider {
12
12
  listFiles(sandboxId: string, path: string): Promise<FileInfo[]>;
13
13
  stop(sandboxId: string): Promise<void>;
14
14
  delete(sandboxId: string): Promise<void>;
15
+ getPublicUrl(_sandboxId: string, _port: number, _protocol?: string): Promise<string>;
15
16
  pause(_sandboxId: string): Promise<void>;
16
17
  resume(_sandboxId: string): Promise<void>;
17
18
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
1
+ {"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpF,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
@@ -14,6 +14,7 @@ export declare class E2BProvider implements SandboxProvider {
14
14
  delete(sandboxId: string): Promise<void>;
15
15
  pause(sandboxId: string): Promise<void>;
16
16
  resume(sandboxId: string): Promise<void>;
17
+ getPublicUrl(sandboxId: string, port: number, _protocol?: string): Promise<string>;
17
18
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
18
19
  }
19
20
  //# sourceMappingURL=e2b.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"e2b.d.ts","sourceRoot":"","sources":["../../src/providers/e2b.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YAwBlD,WAAW;IAkBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IA0D7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvE"}
1
+ {"version":3,"file":"e2b.d.ts","sourceRoot":"","sources":["../../src/providers/e2b.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,WAAY,YAAW,eAAe;IACjD,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAIpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YAwBlD,WAAW;IAkBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IA0D7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvE"}
@@ -15,6 +15,7 @@ export declare class ModalProvider implements SandboxProvider {
15
15
  listFiles(sandboxId: string, path: string): Promise<FileInfo[]>;
16
16
  stop(sandboxId: string): Promise<void>;
17
17
  delete(sandboxId: string): Promise<void>;
18
+ getPublicUrl(_sandboxId: string, _port: number, _protocol?: string): Promise<string>;
18
19
  pause(_sandboxId: string): Promise<void>;
19
20
  resume(_sandboxId: string): Promise<void>;
20
21
  keepAlive(_sandboxId: string, _durationMs?: number): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../src/providers/modal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAKpB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,CAAC,EAAE,MAAM;YAIb,YAAY;IAiBpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsChE,OAAO,CAAC,UAAU;IAWZ,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAmF7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAoBV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmD/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"}
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../src/providers/modal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAKpB,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAS;gBAEb,MAAM,CAAC,EAAE,MAAM;YAIb,YAAY;IAiBpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsChE,OAAO,CAAC,UAAU;IAWZ,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAmF7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAoBV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmD/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpF,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE;;OAEG;IACH,OAAO,CAAC,YAAY;IAuCpB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB"}
@@ -30,5 +30,6 @@ export interface SandboxProvider {
30
30
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
31
31
  pause(sandboxId: string): Promise<void>;
32
32
  resume(sandboxId: string): Promise<void>;
33
+ getPublicUrl(sandboxId: string, port: number, protocol?: string): Promise<string>;
33
34
  }
34
35
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;IAEpC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE3D,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;IAEpC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnF"}
@@ -217,6 +217,15 @@ class E2BProvider {
217
217
  throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
218
218
  }
219
219
  }
220
+ async getPublicUrl(sandboxId, port, _protocol) {
221
+ const sandbox = await this.getInstance(sandboxId);
222
+ try {
223
+ const host = sandbox.getHost(port);
224
+ return `https://${host}`;
225
+ } catch (err) {
226
+ throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
227
+ }
228
+ }
220
229
  async keepAlive(sandboxId, durationMs) {
221
230
  const sandbox = await this.getInstance(sandboxId);
222
231
  try {
@@ -377,6 +386,9 @@ class DaytonaProvider {
377
386
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
378
387
  }
379
388
  }
389
+ async getPublicUrl(_sandboxId, _port, _protocol) {
390
+ throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
391
+ }
380
392
  async pause(_sandboxId) {
381
393
  throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
382
394
  }
@@ -605,6 +617,9 @@ class ModalProvider {
605
617
  async delete(sandboxId) {
606
618
  await this.stop(sandboxId);
607
619
  }
620
+ async getPublicUrl(_sandboxId, _port, _protocol) {
621
+ throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
622
+ }
608
623
  async pause(_sandboxId) {
609
624
  throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
610
625
  }
@@ -821,6 +836,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
821
836
  CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
822
837
  CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
823
838
  INSERT OR IGNORE INTO _migrations (id) VALUES (3);
839
+ `,
840
+ `
841
+ CREATE TABLE IF NOT EXISTS snapshots (
842
+ id TEXT PRIMARY KEY,
843
+ sandbox_id TEXT NOT NULL,
844
+ provider_sandbox_id TEXT NOT NULL,
845
+ provider TEXT NOT NULL,
846
+ name TEXT,
847
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
848
+ );
849
+ CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
850
+ INSERT OR IGNORE INTO _migrations (id) VALUES (4);
824
851
  `
825
852
  ];
826
853
  var db = null;
@@ -53,6 +53,7 @@ export interface CreateSandboxInput {
53
53
  on_timeout?: 'pause' | 'terminate';
54
54
  auto_resume?: boolean;
55
55
  template_id?: string;
56
+ network?: 'full' | 'restricted' | 'none';
56
57
  }
57
58
  export interface SandboxSession {
58
59
  id: string;
@@ -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.7",
3
+ "version": "0.1.8",
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.6",
13
+ "@hasna/sandboxes": "^0.1.7",
14
14
  "@modelcontextprotocol/sdk": "^1.12.1",
15
15
  "chalk": "^5.4.1",
16
16
  "commander": "^13.1.0",