@hasna/sandboxes 0.1.5 → 0.1.6

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
@@ -2225,6 +2225,25 @@ var init_database = __esm(() => {
2225
2225
  );
2226
2226
 
2227
2227
  INSERT OR IGNORE INTO _migrations (id) VALUES (1);
2228
+ `,
2229
+ `
2230
+ ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
2231
+ ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
2232
+
2233
+ CREATE TABLE IF NOT EXISTS templates (
2234
+ id TEXT PRIMARY KEY,
2235
+ name TEXT NOT NULL UNIQUE,
2236
+ description TEXT,
2237
+ image TEXT,
2238
+ env_vars TEXT NOT NULL DEFAULT '{}',
2239
+ setup_script TEXT,
2240
+ tags TEXT NOT NULL DEFAULT '[]',
2241
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
2242
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
2243
+ );
2244
+ CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
2245
+
2246
+ INSERT OR IGNORE INTO _migrations (id) VALUES (2);
2228
2247
  `
2229
2248
  ];
2230
2249
  });
@@ -2274,6 +2293,8 @@ function rowToSandbox(row) {
2274
2293
  env_vars: JSON.parse(row.env_vars),
2275
2294
  keep_alive_until: row.keep_alive_until,
2276
2295
  project_id: row.project_id,
2296
+ on_timeout: row.on_timeout ?? "terminate",
2297
+ auto_resume: row.auto_resume === 1,
2277
2298
  created_at: row.created_at,
2278
2299
  updated_at: row.updated_at
2279
2300
  };
@@ -2289,8 +2310,10 @@ function createSandbox(input) {
2289
2310
  const config = JSON.stringify(input.config ?? {});
2290
2311
  const env_vars = JSON.stringify(input.env_vars ?? {});
2291
2312
  const project_id = input.project_id ?? null;
2292
- db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, created_at, updated_at)
2293
- VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, timestamp, timestamp);
2313
+ const on_timeout = input.on_timeout ?? "terminate";
2314
+ const auto_resume = input.auto_resume ? 1 : 0;
2315
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
2316
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
2294
2317
  return getSandbox(id);
2295
2318
  }
2296
2319
  function getSandbox(id) {
@@ -2581,7 +2604,10 @@ class E2BProvider {
2581
2604
  try {
2582
2605
  const sandbox = await E2BSandbox.create({
2583
2606
  apiKey: this.apiKey,
2584
- timeoutMs: (opts?.timeout || 3600) * 1000
2607
+ timeoutMs: (opts?.timeout || 3600) * 1000,
2608
+ ...opts?.onTimeout === "pause" ? {
2609
+ lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
2610
+ } : {}
2585
2611
  });
2586
2612
  instanceCache.set(sandbox.sandboxId, sandbox);
2587
2613
  return {
@@ -2690,6 +2716,23 @@ class E2BProvider {
2690
2716
  async delete(sandboxId) {
2691
2717
  await this.stop(sandboxId);
2692
2718
  }
2719
+ async pause(sandboxId) {
2720
+ const sandbox = await this.getInstance(sandboxId);
2721
+ try {
2722
+ await sandbox.pause();
2723
+ instanceCache.delete(sandboxId);
2724
+ } catch (err) {
2725
+ throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
2726
+ }
2727
+ }
2728
+ async resume(sandboxId) {
2729
+ try {
2730
+ const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
2731
+ instanceCache.set(sandboxId, sandbox);
2732
+ } catch (err) {
2733
+ throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
2734
+ }
2735
+ }
2693
2736
  async keepAlive(sandboxId, durationMs) {
2694
2737
  const sandbox = await this.getInstance(sandboxId);
2695
2738
  try {
@@ -2850,6 +2893,12 @@ class DaytonaProvider {
2850
2893
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
2851
2894
  }
2852
2895
  }
2896
+ async pause(_sandboxId) {
2897
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
2898
+ }
2899
+ async resume(_sandboxId) {
2900
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
2901
+ }
2853
2902
  async keepAlive(sandboxId, durationMs) {
2854
2903
  const sandbox = await this.getInstance(sandboxId);
2855
2904
  try {
@@ -3072,6 +3121,12 @@ class ModalProvider {
3072
3121
  async delete(sandboxId) {
3073
3122
  await this.stop(sandboxId);
3074
3123
  }
3124
+ async pause(_sandboxId) {
3125
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
3126
+ }
3127
+ async resume(_sandboxId) {
3128
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
3129
+ }
3075
3130
  async keepAlive(_sandboxId, _durationMs) {}
3076
3131
  parseCommand(command) {
3077
3132
  const args = [];
@@ -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;AAmJtC,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;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 +1 @@
1
- {"version":3,"file":"sandboxes.d.ts","sourceRoot":"","sources":["../../src/db/sandboxes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAKxB,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAgBrD;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CA8BhE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY9C;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,EAAE,CAwBZ;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CACd,IAAI,CACF,OAAO,EACL,QAAQ,GACR,qBAAqB,GACrB,MAAM,GACN,OAAO,GACP,SAAS,GACT,QAAQ,GACR,UAAU,GACV,kBAAkB,CACrB,CACF,GACA,OAAO,CAuDT;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAO9C"}
1
+ {"version":3,"file":"sandboxes.d.ts","sourceRoot":"","sources":["../../src/db/sandboxes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAKxB,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAkBrD;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAkChE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY9C;AAED,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,EAAE,CAwBZ;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CACd,IAAI,CACF,OAAO,EACL,QAAQ,GACR,qBAAqB,GACrB,MAAM,GACN,OAAO,GACP,SAAS,GACT,QAAQ,GACR,UAAU,GACV,kBAAkB,CACrB,CACF,GACA,OAAO,CAuDT;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAO9C"}
@@ -0,0 +1,7 @@
1
+ import type { Template, CreateTemplateInput } from "../types/index.js";
2
+ export declare function createTemplate(input: CreateTemplateInput): Template;
3
+ export declare function getTemplate(id: string): Template;
4
+ export declare function getTemplateByName(name: string): Template | null;
5
+ export declare function listTemplates(): Template[];
6
+ export declare function deleteTemplate(id: string): void;
7
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/db/templates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAe,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAiBpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,QAAQ,CAanE;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAI/D;AAED,wBAAgB,aAAa,IAAI,QAAQ,EAAE,CAI1C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAK/C"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export { addEvent, listEvents } from "./db/events.js";
6
6
  export { registerAgent, getAgent, getAgentByName, listAgents, deleteAgent } from "./db/agents.js";
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
+ export { createTemplate, getTemplate, getTemplateByName, listTemplates, deleteTemplate } from "./db/templates.js";
9
10
  export { loadConfig, saveConfig, getDefaultProvider, getDefaultTimeout, getDefaultImage, getProviderApiKey, setConfigValue, getConfigValue } from "./lib/config.js";
10
11
  export { getProvider } from "./providers/index.js";
11
12
  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;AAG1F,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"}
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 = [
@@ -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,25 @@ 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);
775
832
  `
776
833
  ];
777
834
  var db = null;
@@ -844,6 +901,8 @@ function rowToSandbox(row) {
844
901
  env_vars: JSON.parse(row.env_vars),
845
902
  keep_alive_until: row.keep_alive_until,
846
903
  project_id: row.project_id,
904
+ on_timeout: row.on_timeout ?? "terminate",
905
+ auto_resume: row.auto_resume === 1,
847
906
  created_at: row.created_at,
848
907
  updated_at: row.updated_at
849
908
  };
@@ -859,8 +918,10 @@ function createSandbox(input) {
859
918
  const config = JSON.stringify(input.config ?? {});
860
919
  const env_vars = JSON.stringify(input.env_vars ?? {});
861
920
  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);
921
+ const on_timeout = input.on_timeout ?? "terminate";
922
+ const auto_resume = input.auto_resume ? 1 : 0;
923
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
924
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
864
925
  return getSandbox(id);
865
926
  }
866
927
  function getSandbox(id) {
@@ -1213,6 +1274,56 @@ function deleteWebhook(id) {
1213
1274
  throw new WebhookNotFoundError(id);
1214
1275
  db2.query("DELETE FROM webhooks WHERE id = ?").run(resolvedId);
1215
1276
  }
1277
+ // src/db/templates.ts
1278
+ init_types();
1279
+ function rowToTemplate(row) {
1280
+ return {
1281
+ id: row.id,
1282
+ name: row.name,
1283
+ description: row.description,
1284
+ image: row.image,
1285
+ env_vars: JSON.parse(row.env_vars),
1286
+ setup_script: row.setup_script,
1287
+ tags: JSON.parse(row.tags),
1288
+ created_at: row.created_at,
1289
+ updated_at: row.updated_at
1290
+ };
1291
+ }
1292
+ function createTemplate(input) {
1293
+ const db2 = getDatabase();
1294
+ const id = uuid();
1295
+ const timestamp = now();
1296
+ db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
1297
+ 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);
1298
+ return getTemplate(id);
1299
+ }
1300
+ function getTemplate(id) {
1301
+ const db2 = getDatabase();
1302
+ const resolvedId = resolvePartialId("templates", id);
1303
+ if (!resolvedId)
1304
+ throw new TemplateNotFoundError(id);
1305
+ const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
1306
+ if (!row)
1307
+ throw new TemplateNotFoundError(id);
1308
+ return rowToTemplate(row);
1309
+ }
1310
+ function getTemplateByName(name) {
1311
+ const db2 = getDatabase();
1312
+ const row = db2.query("SELECT * FROM templates WHERE name = ?").get(name);
1313
+ return row ? rowToTemplate(row) : null;
1314
+ }
1315
+ function listTemplates() {
1316
+ const db2 = getDatabase();
1317
+ const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
1318
+ return rows.map(rowToTemplate);
1319
+ }
1320
+ function deleteTemplate(id) {
1321
+ const db2 = getDatabase();
1322
+ const resolvedId = resolvePartialId("templates", id);
1323
+ if (!resolvedId)
1324
+ throw new TemplateNotFoundError(id);
1325
+ db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
1326
+ }
1216
1327
  // src/lib/config.ts
1217
1328
  import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
1218
1329
  import { dirname as dirname2, join as join2 } from "path";
@@ -1420,12 +1531,15 @@ export {
1420
1531
  now,
1421
1532
  loadConfig,
1422
1533
  listWebhooks,
1534
+ listTemplates,
1423
1535
  listSessions,
1424
1536
  listSandboxes,
1425
1537
  listProjects,
1426
1538
  listEvents,
1427
1539
  listAgents,
1428
1540
  getWebhook,
1541
+ getTemplateByName,
1542
+ getTemplate,
1429
1543
  getSession,
1430
1544
  getSandbox,
1431
1545
  getProviderApiKey,
@@ -1443,10 +1557,12 @@ export {
1443
1557
  endSession,
1444
1558
  emitLifecycleEvent,
1445
1559
  deleteWebhook,
1560
+ deleteTemplate,
1446
1561
  deleteSandbox,
1447
1562
  deleteProject,
1448
1563
  deleteAgent,
1449
1564
  createWebhook,
1565
+ createTemplate,
1450
1566
  createStreamCollector,
1451
1567
  createSession,
1452
1568
  createSandbox,
@@ -1455,6 +1571,7 @@ export {
1455
1571
  addStreamListener,
1456
1572
  addEvent,
1457
1573
  WebhookNotFoundError,
1574
+ TemplateNotFoundError,
1458
1575
  SessionNotFoundError,
1459
1576
  SandboxNotFoundError,
1460
1577
  SESSION_STATUSES,
package/dist/mcp/index.js CHANGED
@@ -29,7 +29,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
29
29
  var __require = import.meta.require;
30
30
 
31
31
  // src/types/index.ts
32
- var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError;
32
+ var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, TemplateNotFoundError;
33
33
  var init_types = __esm(() => {
34
34
  SandboxNotFoundError = class SandboxNotFoundError extends Error {
35
35
  constructor(id) {
@@ -63,6 +63,12 @@ var init_types = __esm(() => {
63
63
  this.name = "ProjectNotFoundError";
64
64
  }
65
65
  };
66
+ TemplateNotFoundError = class TemplateNotFoundError extends Error {
67
+ constructor(id) {
68
+ super(`Template not found: ${id}`);
69
+ this.name = "TemplateNotFoundError";
70
+ }
71
+ };
66
72
  });
67
73
 
68
74
  // src/providers/e2b.ts
@@ -82,7 +88,10 @@ class E2BProvider {
82
88
  try {
83
89
  const sandbox = await E2BSandbox.create({
84
90
  apiKey: this.apiKey,
85
- timeoutMs: (opts?.timeout || 3600) * 1000
91
+ timeoutMs: (opts?.timeout || 3600) * 1000,
92
+ ...opts?.onTimeout === "pause" ? {
93
+ lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
94
+ } : {}
86
95
  });
87
96
  instanceCache.set(sandbox.sandboxId, sandbox);
88
97
  return {
@@ -191,6 +200,23 @@ class E2BProvider {
191
200
  async delete(sandboxId) {
192
201
  await this.stop(sandboxId);
193
202
  }
203
+ async pause(sandboxId) {
204
+ const sandbox = await this.getInstance(sandboxId);
205
+ try {
206
+ await sandbox.pause();
207
+ instanceCache.delete(sandboxId);
208
+ } catch (err) {
209
+ throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
210
+ }
211
+ }
212
+ async resume(sandboxId) {
213
+ try {
214
+ const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
215
+ instanceCache.set(sandboxId, sandbox);
216
+ } catch (err) {
217
+ throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
218
+ }
219
+ }
194
220
  async keepAlive(sandboxId, durationMs) {
195
221
  const sandbox = await this.getInstance(sandboxId);
196
222
  try {
@@ -351,6 +377,12 @@ class DaytonaProvider {
351
377
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
352
378
  }
353
379
  }
380
+ async pause(_sandboxId) {
381
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
382
+ }
383
+ async resume(_sandboxId) {
384
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
385
+ }
354
386
  async keepAlive(sandboxId, durationMs) {
355
387
  const sandbox = await this.getInstance(sandboxId);
356
388
  try {
@@ -573,6 +605,12 @@ class ModalProvider {
573
605
  async delete(sandboxId) {
574
606
  await this.stop(sandboxId);
575
607
  }
608
+ async pause(_sandboxId) {
609
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
610
+ }
611
+ async resume(_sandboxId) {
612
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
613
+ }
576
614
  async keepAlive(_sandboxId, _durationMs) {}
577
615
  parseCommand(command) {
578
616
  const args = [];
@@ -4719,6 +4757,25 @@ var MIGRATIONS = [
4719
4757
  );
4720
4758
 
4721
4759
  INSERT OR IGNORE INTO _migrations (id) VALUES (1);
4760
+ `,
4761
+ `
4762
+ ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
4763
+ ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
4764
+
4765
+ CREATE TABLE IF NOT EXISTS templates (
4766
+ id TEXT PRIMARY KEY,
4767
+ name TEXT NOT NULL UNIQUE,
4768
+ description TEXT,
4769
+ image TEXT,
4770
+ env_vars TEXT NOT NULL DEFAULT '{}',
4771
+ setup_script TEXT,
4772
+ tags TEXT NOT NULL DEFAULT '[]',
4773
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
4774
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
4775
+ );
4776
+ CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
4777
+
4778
+ INSERT OR IGNORE INTO _migrations (id) VALUES (2);
4722
4779
  `
4723
4780
  ];
4724
4781
  var db = null;
@@ -4777,6 +4834,8 @@ function rowToSandbox(row) {
4777
4834
  env_vars: JSON.parse(row.env_vars),
4778
4835
  keep_alive_until: row.keep_alive_until,
4779
4836
  project_id: row.project_id,
4837
+ on_timeout: row.on_timeout ?? "terminate",
4838
+ auto_resume: row.auto_resume === 1,
4780
4839
  created_at: row.created_at,
4781
4840
  updated_at: row.updated_at
4782
4841
  };
@@ -4792,8 +4851,10 @@ function createSandbox(input) {
4792
4851
  const config = JSON.stringify(input.config ?? {});
4793
4852
  const env_vars = JSON.stringify(input.env_vars ?? {});
4794
4853
  const project_id = input.project_id ?? null;
4795
- db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, created_at, updated_at)
4796
- VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, timestamp, timestamp);
4854
+ const on_timeout = input.on_timeout ?? "terminate";
4855
+ const auto_resume = input.auto_resume ? 1 : 0;
4856
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
4857
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
4797
4858
  return getSandbox(id);
4798
4859
  }
4799
4860
  function getSandbox(id) {
@@ -5057,6 +5118,52 @@ function ensureProject(name, path) {
5057
5118
  return createProject({ name, path });
5058
5119
  }
5059
5120
 
5121
+ // src/db/templates.ts
5122
+ init_types();
5123
+ function rowToTemplate(row) {
5124
+ return {
5125
+ id: row.id,
5126
+ name: row.name,
5127
+ description: row.description,
5128
+ image: row.image,
5129
+ env_vars: JSON.parse(row.env_vars),
5130
+ setup_script: row.setup_script,
5131
+ tags: JSON.parse(row.tags),
5132
+ created_at: row.created_at,
5133
+ updated_at: row.updated_at
5134
+ };
5135
+ }
5136
+ function createTemplate(input) {
5137
+ const db2 = getDatabase();
5138
+ const id = uuid();
5139
+ const timestamp = now();
5140
+ db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
5141
+ 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);
5142
+ return getTemplate(id);
5143
+ }
5144
+ function getTemplate(id) {
5145
+ const db2 = getDatabase();
5146
+ const resolvedId = resolvePartialId("templates", id);
5147
+ if (!resolvedId)
5148
+ throw new TemplateNotFoundError(id);
5149
+ const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
5150
+ if (!row)
5151
+ throw new TemplateNotFoundError(id);
5152
+ return rowToTemplate(row);
5153
+ }
5154
+ function listTemplates() {
5155
+ const db2 = getDatabase();
5156
+ const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
5157
+ return rows.map(rowToTemplate);
5158
+ }
5159
+ function deleteTemplate(id) {
5160
+ const db2 = getDatabase();
5161
+ const resolvedId = resolvePartialId("templates", id);
5162
+ if (!resolvedId)
5163
+ throw new TemplateNotFoundError(id);
5164
+ db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
5165
+ }
5166
+
5060
5167
  // src/providers/index.ts
5061
5168
  init_types();
5062
5169
 
@@ -5272,7 +5379,13 @@ var TOOL_CATALOG = [
5272
5379
  { name: "register_project", description: "Register a project" },
5273
5380
  { name: "list_projects", description: "List all projects" },
5274
5381
  { name: "describe_tools", description: "List all available tools" },
5275
- { name: "search_tools", description: "Search tools by keyword" }
5382
+ { name: "search_tools", description: "Search tools by keyword" },
5383
+ { name: "pause_sandbox", description: "Pause a running sandbox, saving its state for later resume" },
5384
+ { name: "resume_sandbox", description: "Resume a paused sandbox" },
5385
+ { name: "create_template", description: "Create a reusable sandbox template" },
5386
+ { name: "list_templates", description: "List all sandbox templates" },
5387
+ { name: "get_template", description: "Get a sandbox template by ID" },
5388
+ { name: "delete_template", description: "Delete a sandbox template" }
5276
5389
  ];
5277
5390
  var server = new McpServer({
5278
5391
  name: "sandboxes",
@@ -5283,29 +5396,51 @@ server.tool("create_sandbox", "Create a new sandbox", {
5283
5396
  image: exports_external.string().optional().describe("Container image"),
5284
5397
  timeout: exports_external.number().optional().describe("Timeout in seconds"),
5285
5398
  name: exports_external.string().optional().describe("Sandbox name"),
5286
- env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables")
5399
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
5400
+ template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
5401
+ on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
5402
+ auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
5287
5403
  }, async (params) => {
5288
5404
  try {
5289
5405
  const providerName = params.provider ?? getDefaultProvider();
5290
5406
  const timeout = params.timeout ?? getDefaultTimeout();
5407
+ let templateData = {};
5408
+ if (params.template_id) {
5409
+ const tmpl = getTemplate(params.template_id);
5410
+ templateData = { image: tmpl.image ?? undefined, env_vars: tmpl.env_vars, setup_script: tmpl.setup_script };
5411
+ }
5412
+ const image = params.image ?? templateData.image;
5413
+ const envVars = { ...templateData.env_vars, ...params.env_vars };
5414
+ const onTimeout = params.on_timeout ?? "terminate";
5415
+ const autoResume = params.auto_resume ?? false;
5291
5416
  const sandbox = createSandbox({
5292
5417
  provider: providerName,
5293
- image: params.image,
5418
+ image,
5294
5419
  timeout,
5295
5420
  name: params.name,
5296
- env_vars: params.env_vars
5421
+ env_vars: envVars,
5422
+ on_timeout: onTimeout,
5423
+ auto_resume: autoResume,
5424
+ template_id: params.template_id
5297
5425
  });
5298
5426
  const provider = await getProvider(providerName);
5299
5427
  const result = await provider.create({
5300
- image: params.image,
5428
+ image,
5301
5429
  timeout,
5302
- envVars: params.env_vars
5430
+ envVars,
5431
+ onTimeout,
5432
+ autoResume
5303
5433
  });
5304
5434
  const updated = updateSandbox(sandbox.id, {
5305
5435
  provider_sandbox_id: result.id,
5306
5436
  status: "running"
5307
5437
  });
5308
5438
  emitLifecycleEvent(sandbox.id, "sandbox created");
5439
+ if (templateData.setup_script && result.id) {
5440
+ try {
5441
+ await provider.exec(result.id, templateData.setup_script);
5442
+ } catch {}
5443
+ }
5309
5444
  return ok(updated);
5310
5445
  } catch (e) {
5311
5446
  return err(e);
@@ -5589,5 +5724,77 @@ server.tool("get_agent_output", "Get output from an agent session", {
5589
5724
  return err(e);
5590
5725
  }
5591
5726
  });
5727
+ server.tool("pause_sandbox", "Pause a running sandbox, saving its state for later resume", {
5728
+ id: exports_external.string().describe("Sandbox ID or partial ID")
5729
+ }, async (params) => {
5730
+ try {
5731
+ const sandbox = getSandbox(params.id);
5732
+ if (!sandbox.provider_sandbox_id)
5733
+ throw new Error("Sandbox has no provider ID");
5734
+ const provider = await getProvider(sandbox.provider);
5735
+ await provider.pause(sandbox.provider_sandbox_id);
5736
+ const updated = updateSandbox(sandbox.id, { status: "paused" });
5737
+ emitLifecycleEvent(sandbox.id, "sandbox paused");
5738
+ return ok(updated);
5739
+ } catch (e) {
5740
+ return err(e);
5741
+ }
5742
+ });
5743
+ server.tool("resume_sandbox", "Resume a paused sandbox", {
5744
+ id: exports_external.string().describe("Sandbox ID or partial ID")
5745
+ }, async (params) => {
5746
+ try {
5747
+ const sandbox = getSandbox(params.id);
5748
+ if (!sandbox.provider_sandbox_id)
5749
+ throw new Error("Sandbox has no provider ID");
5750
+ const provider = await getProvider(sandbox.provider);
5751
+ await provider.resume(sandbox.provider_sandbox_id);
5752
+ const updated = updateSandbox(sandbox.id, { status: "running" });
5753
+ emitLifecycleEvent(sandbox.id, "sandbox resumed");
5754
+ return ok(updated);
5755
+ } catch (e) {
5756
+ return err(e);
5757
+ }
5758
+ });
5759
+ server.tool("create_template", "Create a reusable sandbox template", {
5760
+ name: exports_external.string().describe("Template name"),
5761
+ description: exports_external.string().optional(),
5762
+ image: exports_external.string().optional().describe("Container image"),
5763
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
5764
+ setup_script: exports_external.string().optional().describe("Shell script to run on sandbox creation"),
5765
+ tags: exports_external.array(exports_external.string()).optional()
5766
+ }, async (params) => {
5767
+ try {
5768
+ return ok(createTemplate(params));
5769
+ } catch (e) {
5770
+ return err(e);
5771
+ }
5772
+ });
5773
+ server.tool("list_templates", "List all sandbox templates", {}, async () => {
5774
+ try {
5775
+ return ok(listTemplates());
5776
+ } catch (e) {
5777
+ return err(e);
5778
+ }
5779
+ });
5780
+ server.tool("get_template", "Get a sandbox template by ID", {
5781
+ id: exports_external.string().describe("Template ID or partial ID")
5782
+ }, async (params) => {
5783
+ try {
5784
+ return ok(getTemplate(params.id));
5785
+ } catch (e) {
5786
+ return err(e);
5787
+ }
5788
+ });
5789
+ server.tool("delete_template", "Delete a sandbox template", {
5790
+ id: exports_external.string().describe("Template ID or partial ID")
5791
+ }, async (params) => {
5792
+ try {
5793
+ deleteTemplate(params.id);
5794
+ return ok({ deleted: params.id });
5795
+ } catch (e) {
5796
+ return err(e);
5797
+ }
5798
+ });
5592
5799
  var transport = new StdioServerTransport;
5593
5800
  await server.connect(transport);
@@ -12,6 +12,8 @@ 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
+ pause(_sandboxId: string): Promise<void>;
16
+ resume(_sandboxId: string): Promise<void>;
15
17
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
16
18
  }
17
19
  //# sourceMappingURL=daytona.d.ts.map
@@ -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,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,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"}
@@ -12,6 +12,8 @@ export declare class E2BProvider 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
+ pause(sandboxId: string): Promise<void>;
16
+ resume(sandboxId: string): Promise<void>;
15
17
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
16
18
  }
17
19
  //# 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;YAqBlD,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,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,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvE"}
@@ -15,6 +15,8 @@ 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
+ pause(_sandboxId: string): Promise<void>;
19
+ resume(_sandboxId: string): Promise<void>;
18
20
  keepAlive(_sandboxId: string, _durationMs?: number): Promise<void>;
19
21
  /**
20
22
  * Parse a command string into an array of arguments, respecting quotes.
@@ -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,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,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"}
@@ -3,6 +3,8 @@ export interface CreateSandboxOpts {
3
3
  image?: string;
4
4
  timeout?: number;
5
5
  envVars?: Record<string, string>;
6
+ onTimeout?: 'pause' | 'terminate';
7
+ autoResume?: boolean;
6
8
  }
7
9
  export interface ExecOptions {
8
10
  background?: boolean;
@@ -26,5 +28,7 @@ export interface SandboxProvider {
26
28
  stop(sandboxId: string): Promise<void>;
27
29
  delete(sandboxId: string): Promise<void>;
28
30
  keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
31
+ pause(sandboxId: string): Promise<void>;
32
+ resume(sandboxId: string): Promise<void>;
29
33
  }
30
34
  //# 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;CAClC;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;CAClE"}
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"}
@@ -88,7 +88,10 @@ class E2BProvider {
88
88
  try {
89
89
  const sandbox = await E2BSandbox.create({
90
90
  apiKey: this.apiKey,
91
- timeoutMs: (opts?.timeout || 3600) * 1000
91
+ timeoutMs: (opts?.timeout || 3600) * 1000,
92
+ ...opts?.onTimeout === "pause" ? {
93
+ lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
94
+ } : {}
92
95
  });
93
96
  instanceCache.set(sandbox.sandboxId, sandbox);
94
97
  return {
@@ -197,6 +200,23 @@ class E2BProvider {
197
200
  async delete(sandboxId) {
198
201
  await this.stop(sandboxId);
199
202
  }
203
+ async pause(sandboxId) {
204
+ const sandbox = await this.getInstance(sandboxId);
205
+ try {
206
+ await sandbox.pause();
207
+ instanceCache.delete(sandboxId);
208
+ } catch (err) {
209
+ throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
210
+ }
211
+ }
212
+ async resume(sandboxId) {
213
+ try {
214
+ const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
215
+ instanceCache.set(sandboxId, sandbox);
216
+ } catch (err) {
217
+ throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
218
+ }
219
+ }
200
220
  async keepAlive(sandboxId, durationMs) {
201
221
  const sandbox = await this.getInstance(sandboxId);
202
222
  try {
@@ -357,6 +377,12 @@ class DaytonaProvider {
357
377
  throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
358
378
  }
359
379
  }
380
+ async pause(_sandboxId) {
381
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
382
+ }
383
+ async resume(_sandboxId) {
384
+ throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
385
+ }
360
386
  async keepAlive(sandboxId, durationMs) {
361
387
  const sandbox = await this.getInstance(sandboxId);
362
388
  try {
@@ -579,6 +605,12 @@ class ModalProvider {
579
605
  async delete(sandboxId) {
580
606
  await this.stop(sandboxId);
581
607
  }
608
+ async pause(_sandboxId) {
609
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
610
+ }
611
+ async resume(_sandboxId) {
612
+ throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
613
+ }
582
614
  async keepAlive(_sandboxId, _durationMs) {}
583
615
  parseCommand(command) {
584
616
  const args = [];
@@ -751,6 +783,25 @@ var MIGRATIONS = [
751
783
  );
752
784
 
753
785
  INSERT OR IGNORE INTO _migrations (id) VALUES (1);
786
+ `,
787
+ `
788
+ ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
789
+ ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
790
+
791
+ CREATE TABLE IF NOT EXISTS templates (
792
+ id TEXT PRIMARY KEY,
793
+ name TEXT NOT NULL UNIQUE,
794
+ description TEXT,
795
+ image TEXT,
796
+ env_vars TEXT NOT NULL DEFAULT '{}',
797
+ setup_script TEXT,
798
+ tags TEXT NOT NULL DEFAULT '[]',
799
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
800
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
801
+ );
802
+ CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
803
+
804
+ INSERT OR IGNORE INTO _migrations (id) VALUES (2);
754
805
  `
755
806
  ];
756
807
  var db = null;
@@ -809,6 +860,8 @@ function rowToSandbox(row) {
809
860
  env_vars: JSON.parse(row.env_vars),
810
861
  keep_alive_until: row.keep_alive_until,
811
862
  project_id: row.project_id,
863
+ on_timeout: row.on_timeout ?? "terminate",
864
+ auto_resume: row.auto_resume === 1,
812
865
  created_at: row.created_at,
813
866
  updated_at: row.updated_at
814
867
  };
@@ -824,8 +877,10 @@ function createSandbox(input) {
824
877
  const config = JSON.stringify(input.config ?? {});
825
878
  const env_vars = JSON.stringify(input.env_vars ?? {});
826
879
  const project_id = input.project_id ?? null;
827
- db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, created_at, updated_at)
828
- VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, timestamp, timestamp);
880
+ const on_timeout = input.on_timeout ?? "terminate";
881
+ const auto_resume = input.auto_resume ? 1 : 0;
882
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
883
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
829
884
  return getSandbox(id);
830
885
  }
831
886
  function getSandbox(id) {
@@ -20,6 +20,8 @@ export interface Sandbox {
20
20
  env_vars: Record<string, string>;
21
21
  keep_alive_until: string | null;
22
22
  project_id: string | null;
23
+ on_timeout: 'pause' | 'terminate';
24
+ auto_resume: boolean;
23
25
  created_at: string;
24
26
  updated_at: string;
25
27
  }
@@ -35,6 +37,8 @@ export interface SandboxRow {
35
37
  env_vars: string;
36
38
  keep_alive_until: string | null;
37
39
  project_id: string | null;
40
+ on_timeout: string;
41
+ auto_resume: number;
38
42
  created_at: string;
39
43
  updated_at: string;
40
44
  }
@@ -46,6 +50,9 @@ export interface CreateSandboxInput {
46
50
  env_vars?: Record<string, string>;
47
51
  config?: Record<string, unknown>;
48
52
  project_id?: string;
53
+ on_timeout?: 'pause' | 'terminate';
54
+ auto_resume?: boolean;
55
+ template_id?: string;
49
56
  }
50
57
  export interface SandboxSession {
51
58
  id: string;
@@ -196,4 +203,37 @@ export declare class ProjectNotFoundError extends Error {
196
203
  export declare class WebhookNotFoundError extends Error {
197
204
  constructor(id: string);
198
205
  }
206
+ export declare class TemplateNotFoundError extends Error {
207
+ constructor(id: string);
208
+ }
209
+ export interface Template {
210
+ id: string;
211
+ name: string;
212
+ description: string | null;
213
+ image: string | null;
214
+ env_vars: Record<string, string>;
215
+ setup_script: string | null;
216
+ tags: string[];
217
+ created_at: string;
218
+ updated_at: string;
219
+ }
220
+ export interface TemplateRow {
221
+ id: string;
222
+ name: string;
223
+ description: string | null;
224
+ image: string | null;
225
+ env_vars: string;
226
+ setup_script: string | null;
227
+ tags: string;
228
+ created_at: string;
229
+ updated_at: string;
230
+ }
231
+ export interface CreateTemplateInput {
232
+ name: string;
233
+ description?: string;
234
+ image?: string;
235
+ env_vars?: Record<string, string>;
236
+ setup_script?: string;
237
+ tags?: string[];
238
+ }
199
239
  //# sourceMappingURL=index.d.ts.map
@@ -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.5",
3
+ "version": "0.1.6",
4
4
  "author": "Andrei Hasna <andrei@hasna.com>",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,6 +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
14
  "@modelcontextprotocol/sdk": "^1.12.1",
14
15
  "chalk": "^5.4.1",
15
16
  "commander": "^13.1.0",