@hasna/sandboxes 0.1.3 → 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 = [];
@@ -3238,29 +3293,27 @@ async function runAgent(sandboxId, opts) {
3238
3293
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
3239
3294
  const collector = createStreamCollector(sandbox.id, session.id);
3240
3295
  const provider = await getProvider(sandbox.provider);
3241
- try {
3242
- const result = await provider.exec(sandbox.provider_sandbox_id, cmd, {
3243
- onStdout: (data) => {
3244
- collector.onStdout(data);
3245
- opts.onStdout?.(data);
3246
- },
3247
- onStderr: (data) => {
3248
- collector.onStderr(data);
3249
- opts.onStderr?.(data);
3250
- },
3251
- background: true
3252
- });
3253
- if ("exit_code" in result) {
3254
- const exitResult = result;
3255
- const status = exitResult.exit_code === 0 ? "completed" : "failed";
3256
- return endSession(session.id, exitResult.exit_code, status);
3257
- }
3258
- return session;
3259
- } catch (err) {
3296
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
3297
+ provider.exec(sandbox.provider_sandbox_id, cmd, {
3298
+ onStdout: (data) => {
3299
+ collector.onStdout(data);
3300
+ opts.onStdout?.(data);
3301
+ },
3302
+ onStderr: (data) => {
3303
+ collector.onStderr(data);
3304
+ opts.onStderr?.(data);
3305
+ },
3306
+ env
3307
+ }).then((result) => {
3308
+ const exitResult = result;
3309
+ const status = exitResult.exit_code === 0 ? "completed" : "failed";
3310
+ endSession(session.id, exitResult.exit_code ?? 0, status);
3311
+ emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
3312
+ }).catch((err) => {
3260
3313
  endSession(session.id, 1, "failed");
3261
3314
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
3262
- throw err;
3263
- }
3315
+ });
3316
+ return session;
3264
3317
  }
3265
3318
  async function stopAgent(sandboxId) {
3266
3319
  const sandbox = getSandbox(sandboxId);
@@ -3272,14 +3325,15 @@ async function stopAgent(sandboxId) {
3272
3325
  } catch {}
3273
3326
  emitLifecycleEvent(sandbox.id, "Agent stopped by user");
3274
3327
  }
3275
- var AGENT_COMMANDS;
3328
+ var CLAUDE_ONBOARDING_SETUP, AGENT_COMMANDS;
3276
3329
  var init_agent_runner = __esm(() => {
3277
3330
  init_sandboxes();
3278
3331
  init_sessions();
3279
3332
  init_providers();
3280
3333
  init_stream();
3334
+ CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
3281
3335
  AGENT_COMMANDS = {
3282
- claude: (prompt) => `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
3336
+ claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
3283
3337
  codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
3284
3338
  gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
3285
3339
  };
@@ -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,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAS/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,CAuDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
1
+ {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAc/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
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
 
@@ -5191,8 +5298,9 @@ function emitLifecycleEvent(sandboxId, message) {
5191
5298
  }
5192
5299
 
5193
5300
  // src/lib/agent-runner.ts
5301
+ var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
5194
5302
  var AGENT_COMMANDS = {
5195
- claude: (prompt) => `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5303
+ claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5196
5304
  codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
5197
5305
  gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
5198
5306
  };
@@ -5211,29 +5319,27 @@ async function runAgent(sandboxId, opts) {
5211
5319
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
5212
5320
  const collector = createStreamCollector(sandbox.id, session.id);
5213
5321
  const provider = await getProvider(sandbox.provider);
5214
- try {
5215
- const result = await provider.exec(sandbox.provider_sandbox_id, cmd, {
5216
- onStdout: (data) => {
5217
- collector.onStdout(data);
5218
- opts.onStdout?.(data);
5219
- },
5220
- onStderr: (data) => {
5221
- collector.onStderr(data);
5222
- opts.onStderr?.(data);
5223
- },
5224
- background: true
5225
- });
5226
- if ("exit_code" in result) {
5227
- const exitResult = result;
5228
- const status = exitResult.exit_code === 0 ? "completed" : "failed";
5229
- return endSession(session.id, exitResult.exit_code, status);
5230
- }
5231
- return session;
5232
- } catch (err) {
5322
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5323
+ provider.exec(sandbox.provider_sandbox_id, cmd, {
5324
+ onStdout: (data) => {
5325
+ collector.onStdout(data);
5326
+ opts.onStdout?.(data);
5327
+ },
5328
+ onStderr: (data) => {
5329
+ collector.onStderr(data);
5330
+ opts.onStderr?.(data);
5331
+ },
5332
+ env
5333
+ }).then((result) => {
5334
+ const exitResult = result;
5335
+ const status = exitResult.exit_code === 0 ? "completed" : "failed";
5336
+ endSession(session.id, exitResult.exit_code ?? 0, status);
5337
+ emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
5338
+ }).catch((err) => {
5233
5339
  endSession(session.id, 1, "failed");
5234
5340
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
5235
- throw err;
5236
- }
5341
+ });
5342
+ return session;
5237
5343
  }
5238
5344
  async function stopAgent(sandboxId) {
5239
5345
  const sandbox = getSandbox(sandboxId);
@@ -5273,7 +5379,13 @@ var TOOL_CATALOG = [
5273
5379
  { name: "register_project", description: "Register a project" },
5274
5380
  { name: "list_projects", description: "List all projects" },
5275
5381
  { name: "describe_tools", description: "List all available tools" },
5276
- { 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" }
5277
5389
  ];
5278
5390
  var server = new McpServer({
5279
5391
  name: "sandboxes",
@@ -5284,29 +5396,51 @@ server.tool("create_sandbox", "Create a new sandbox", {
5284
5396
  image: exports_external.string().optional().describe("Container image"),
5285
5397
  timeout: exports_external.number().optional().describe("Timeout in seconds"),
5286
5398
  name: exports_external.string().optional().describe("Sandbox name"),
5287
- 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")
5288
5403
  }, async (params) => {
5289
5404
  try {
5290
5405
  const providerName = params.provider ?? getDefaultProvider();
5291
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;
5292
5416
  const sandbox = createSandbox({
5293
5417
  provider: providerName,
5294
- image: params.image,
5418
+ image,
5295
5419
  timeout,
5296
5420
  name: params.name,
5297
- env_vars: params.env_vars
5421
+ env_vars: envVars,
5422
+ on_timeout: onTimeout,
5423
+ auto_resume: autoResume,
5424
+ template_id: params.template_id
5298
5425
  });
5299
5426
  const provider = await getProvider(providerName);
5300
5427
  const result = await provider.create({
5301
- image: params.image,
5428
+ image,
5302
5429
  timeout,
5303
- envVars: params.env_vars
5430
+ envVars,
5431
+ onTimeout,
5432
+ autoResume
5304
5433
  });
5305
5434
  const updated = updateSandbox(sandbox.id, {
5306
5435
  provider_sandbox_id: result.id,
5307
5436
  status: "running"
5308
5437
  });
5309
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
+ }
5310
5444
  return ok(updated);
5311
5445
  } catch (e) {
5312
5446
  return err(e);
@@ -5397,14 +5531,25 @@ server.tool("exec_command", "Execute a command in a sandbox", {
5397
5531
  });
5398
5532
  const collector = createStreamCollector(sandbox.id, session.id);
5399
5533
  const provider = await getProvider(sandbox.provider);
5400
- const result = await provider.exec(sandbox.provider_sandbox_id, params.command, {
5401
- background: params.background,
5402
- onStdout: collector.onStdout,
5403
- onStderr: collector.onStderr
5404
- });
5534
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5405
5535
  if (params.background) {
5536
+ provider.exec(sandbox.provider_sandbox_id, params.command, {
5537
+ onStdout: collector.onStdout,
5538
+ onStderr: collector.onStderr,
5539
+ env
5540
+ }).then((res) => {
5541
+ const r = res;
5542
+ endSession(session.id, r.exit_code ?? 0);
5543
+ }).catch(() => {
5544
+ endSession(session.id, 1);
5545
+ });
5406
5546
  return ok({ session_id: session.id, background: true });
5407
5547
  }
5548
+ const result = await provider.exec(sandbox.provider_sandbox_id, params.command, {
5549
+ onStdout: collector.onStdout,
5550
+ onStderr: collector.onStderr,
5551
+ env
5552
+ });
5408
5553
  const execResult = result;
5409
5554
  endSession(session.id, execResult.exit_code);
5410
5555
  return ok({
@@ -5579,5 +5724,77 @@ server.tool("get_agent_output", "Get output from an agent session", {
5579
5724
  return err(e);
5580
5725
  }
5581
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
+ });
5582
5799
  var transport = new StdioServerTransport;
5583
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":"AAEA,eAAO,MAAM,iBAAiB,sCAAuC,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,eAAO,MAAM,gBAAgB,2EAOnB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB,uDAKnB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,WAAW,kDAAmD,CAAC;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,qDAKd,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE;QACV,GAAG,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3B,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAChD,KAAK,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9B,CAAC;CACH;AAID,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,EAAE,MAAM,CAAC;gBACL,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK9C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,EAAE,EAAE,MAAM;CAIvB;AAID,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/sandboxes",
3
- "version": "0.1.3",
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",