@hasna/sandboxes 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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,44 @@ 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);
4779
+ `,
4780
+ `
4781
+ CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
4782
+ id TEXT PRIMARY KEY,
4783
+ sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
4784
+ agent_name TEXT,
4785
+ agent_type TEXT,
4786
+ command TEXT,
4787
+ status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
4788
+ exit_code INTEGER,
4789
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
4790
+ ended_at TEXT
4791
+ );
4792
+ INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
4793
+ DROP TABLE sandbox_sessions;
4794
+ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
4795
+ CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
4796
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
4797
+ INSERT OR IGNORE INTO _migrations (id) VALUES (3);
4722
4798
  `
4723
4799
  ];
4724
4800
  var db = null;
@@ -4777,6 +4853,8 @@ function rowToSandbox(row) {
4777
4853
  env_vars: JSON.parse(row.env_vars),
4778
4854
  keep_alive_until: row.keep_alive_until,
4779
4855
  project_id: row.project_id,
4856
+ on_timeout: row.on_timeout ?? "terminate",
4857
+ auto_resume: row.auto_resume === 1,
4780
4858
  created_at: row.created_at,
4781
4859
  updated_at: row.updated_at
4782
4860
  };
@@ -4792,8 +4870,10 @@ function createSandbox(input) {
4792
4870
  const config = JSON.stringify(input.config ?? {});
4793
4871
  const env_vars = JSON.stringify(input.env_vars ?? {});
4794
4872
  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);
4873
+ const on_timeout = input.on_timeout ?? "terminate";
4874
+ const auto_resume = input.auto_resume ? 1 : 0;
4875
+ db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
4876
+ VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
4797
4877
  return getSandbox(id);
4798
4878
  }
4799
4879
  function getSandbox(id) {
@@ -5057,6 +5137,52 @@ function ensureProject(name, path) {
5057
5137
  return createProject({ name, path });
5058
5138
  }
5059
5139
 
5140
+ // src/db/templates.ts
5141
+ init_types();
5142
+ function rowToTemplate(row) {
5143
+ return {
5144
+ id: row.id,
5145
+ name: row.name,
5146
+ description: row.description,
5147
+ image: row.image,
5148
+ env_vars: JSON.parse(row.env_vars),
5149
+ setup_script: row.setup_script,
5150
+ tags: JSON.parse(row.tags),
5151
+ created_at: row.created_at,
5152
+ updated_at: row.updated_at
5153
+ };
5154
+ }
5155
+ function createTemplate(input) {
5156
+ const db2 = getDatabase();
5157
+ const id = uuid();
5158
+ const timestamp = now();
5159
+ db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
5160
+ 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);
5161
+ return getTemplate(id);
5162
+ }
5163
+ function getTemplate(id) {
5164
+ const db2 = getDatabase();
5165
+ const resolvedId = resolvePartialId("templates", id);
5166
+ if (!resolvedId)
5167
+ throw new TemplateNotFoundError(id);
5168
+ const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
5169
+ if (!row)
5170
+ throw new TemplateNotFoundError(id);
5171
+ return rowToTemplate(row);
5172
+ }
5173
+ function listTemplates() {
5174
+ const db2 = getDatabase();
5175
+ const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
5176
+ return rows.map(rowToTemplate);
5177
+ }
5178
+ function deleteTemplate(id) {
5179
+ const db2 = getDatabase();
5180
+ const resolvedId = resolvePartialId("templates", id);
5181
+ if (!resolvedId)
5182
+ throw new TemplateNotFoundError(id);
5183
+ db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
5184
+ }
5185
+
5060
5186
  // src/providers/index.ts
5061
5187
  init_types();
5062
5188
 
@@ -5190,19 +5316,134 @@ function emitLifecycleEvent(sandboxId, message) {
5190
5316
  notifyListeners(sandboxId, "lifecycle", message);
5191
5317
  }
5192
5318
 
5319
+ // src/lib/agents/claude.ts
5320
+ class ClaudeDriver {
5321
+ name = "claude";
5322
+ requiredEnvVars = ["ANTHROPIC_API_KEY"];
5323
+ async install(provider, providerSandboxId) {
5324
+ const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
5325
+ if (check.stdout.trim() !== "MISSING")
5326
+ return;
5327
+ await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
5328
+ }
5329
+ async configure(provider, providerSandboxId, _envVars) {
5330
+ const config = JSON.stringify({
5331
+ hasCompletedOnboarding: true,
5332
+ hasTrustDialogAccepted: true,
5333
+ hasAcknowledgedCostThreshold: true
5334
+ });
5335
+ await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
5336
+ }
5337
+ buildCommand(prompt) {
5338
+ return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
5339
+ }
5340
+ }
5341
+
5342
+ // src/lib/agents/codex.ts
5343
+ class CodexDriver {
5344
+ name = "codex";
5345
+ requiredEnvVars = ["OPENAI_API_KEY"];
5346
+ async install(provider, providerSandboxId) {
5347
+ const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
5348
+ if (check.stdout.trim() !== "MISSING")
5349
+ return;
5350
+ await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
5351
+ }
5352
+ async configure(provider, providerSandboxId, _envVars) {
5353
+ const config = `[core]
5354
+ approvalMode = "full-auto"
5355
+ quiet = true
5356
+ `;
5357
+ await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
5358
+ }
5359
+ buildCommand(prompt) {
5360
+ return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
5361
+ }
5362
+ }
5363
+
5364
+ // src/lib/agents/gemini.ts
5365
+ class GeminiDriver {
5366
+ name = "gemini";
5367
+ requiredEnvVars = ["GEMINI_API_KEY"];
5368
+ async install(provider, providerSandboxId) {
5369
+ const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
5370
+ if (check.stdout.trim() !== "MISSING")
5371
+ return;
5372
+ await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
5373
+ }
5374
+ async configure(provider, providerSandboxId, _envVars) {
5375
+ const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
5376
+ await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
5377
+ }
5378
+ buildCommand(prompt) {
5379
+ return `gemini -p ${JSON.stringify(prompt)}`;
5380
+ }
5381
+ }
5382
+
5383
+ // src/lib/agents/opencode.ts
5384
+ class OpenCodeDriver {
5385
+ name = "opencode";
5386
+ requiredEnvVars = [];
5387
+ async install(provider, providerSandboxId) {
5388
+ const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
5389
+ if (check.stdout.trim() !== "MISSING")
5390
+ return;
5391
+ await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
5392
+ }
5393
+ async configure(_provider, _providerSandboxId, _envVars) {}
5394
+ buildCommand(prompt) {
5395
+ return `opencode run ${JSON.stringify(prompt)}`;
5396
+ }
5397
+ }
5398
+
5399
+ // src/lib/agents/pi.ts
5400
+ class PiDriver {
5401
+ name = "pi";
5402
+ requiredEnvVars = ["PI_API_KEY"];
5403
+ async install(provider, providerSandboxId) {
5404
+ const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
5405
+ if (check.stdout.trim() !== "MISSING")
5406
+ return;
5407
+ await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
5408
+ }
5409
+ async configure(_provider, _providerSandboxId, _envVars) {}
5410
+ buildCommand(prompt) {
5411
+ return `pi ask ${JSON.stringify(prompt)}`;
5412
+ }
5413
+ }
5414
+
5415
+ // src/lib/agents/index.ts
5416
+ var DRIVERS = [
5417
+ new ClaudeDriver,
5418
+ new CodexDriver,
5419
+ new GeminiDriver,
5420
+ new OpenCodeDriver,
5421
+ new PiDriver
5422
+ ];
5423
+ var DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
5424
+ function getAgentDriver(name) {
5425
+ return DRIVER_MAP.get(name);
5426
+ }
5427
+
5193
5428
  // src/lib/agent-runner.ts
5194
- var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
5195
- var AGENT_COMMANDS = {
5196
- claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5197
- codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
5198
- gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
5199
- };
5200
5429
  async function runAgent(sandboxId, opts) {
5201
5430
  const sandbox = getSandbox(sandboxId);
5202
5431
  if (!sandbox.provider_sandbox_id) {
5203
5432
  throw new Error("Sandbox has no provider instance");
5204
5433
  }
5205
- const cmd = opts.command || AGENT_COMMANDS[opts.agentType]?.(opts.prompt) || opts.prompt;
5434
+ const provider = await getProvider(sandbox.provider);
5435
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5436
+ let cmd;
5437
+ const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
5438
+ if (opts.command) {
5439
+ cmd = opts.command;
5440
+ } else if (driver) {
5441
+ await driver.install(provider, sandbox.provider_sandbox_id);
5442
+ await driver.configure(provider, sandbox.provider_sandbox_id, sandbox.env_vars ?? {});
5443
+ cmd = driver.buildCommand(opts.prompt);
5444
+ } else {
5445
+ cmd = opts.prompt;
5446
+ }
5206
5447
  const session = createSession({
5207
5448
  sandbox_id: sandbox.id,
5208
5449
  agent_name: opts.agentName,
@@ -5211,8 +5452,6 @@ async function runAgent(sandboxId, opts) {
5211
5452
  });
5212
5453
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
5213
5454
  const collector = createStreamCollector(sandbox.id, session.id);
5214
- const provider = await getProvider(sandbox.provider);
5215
- const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5216
5455
  provider.exec(sandbox.provider_sandbox_id, cmd, {
5217
5456
  onStdout: (data) => {
5218
5457
  collector.onStdout(data);
@@ -5240,7 +5479,7 @@ async function stopAgent(sandboxId) {
5240
5479
  return;
5241
5480
  const provider = await getProvider(sandbox.provider);
5242
5481
  try {
5243
- await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini' || true");
5482
+ await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini\\|opencode\\|pi' || true");
5244
5483
  } catch {}
5245
5484
  emitLifecycleEvent(sandbox.id, "Agent stopped by user");
5246
5485
  }
@@ -5272,7 +5511,14 @@ var TOOL_CATALOG = [
5272
5511
  { name: "register_project", description: "Register a project" },
5273
5512
  { name: "list_projects", description: "List all projects" },
5274
5513
  { name: "describe_tools", description: "List all available tools" },
5275
- { name: "search_tools", description: "Search tools by keyword" }
5514
+ { name: "search_tools", description: "Search tools by keyword" },
5515
+ { name: "pause_sandbox", description: "Pause a running sandbox, saving its state for later resume" },
5516
+ { name: "resume_sandbox", description: "Resume a paused sandbox" },
5517
+ { name: "create_template", description: "Create a reusable sandbox template" },
5518
+ { name: "list_templates", description: "List all sandbox templates" },
5519
+ { name: "get_template", description: "Get a sandbox template by ID" },
5520
+ { name: "delete_template", description: "Delete a sandbox template" },
5521
+ { name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" }
5276
5522
  ];
5277
5523
  var server = new McpServer({
5278
5524
  name: "sandboxes",
@@ -5283,29 +5529,51 @@ server.tool("create_sandbox", "Create a new sandbox", {
5283
5529
  image: exports_external.string().optional().describe("Container image"),
5284
5530
  timeout: exports_external.number().optional().describe("Timeout in seconds"),
5285
5531
  name: exports_external.string().optional().describe("Sandbox name"),
5286
- env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables")
5532
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
5533
+ template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
5534
+ on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
5535
+ auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
5287
5536
  }, async (params) => {
5288
5537
  try {
5289
5538
  const providerName = params.provider ?? getDefaultProvider();
5290
5539
  const timeout = params.timeout ?? getDefaultTimeout();
5540
+ let templateData = {};
5541
+ if (params.template_id) {
5542
+ const tmpl = getTemplate(params.template_id);
5543
+ templateData = { image: tmpl.image ?? undefined, env_vars: tmpl.env_vars, setup_script: tmpl.setup_script };
5544
+ }
5545
+ const image = params.image ?? templateData.image;
5546
+ const envVars = { ...templateData.env_vars, ...params.env_vars };
5547
+ const onTimeout = params.on_timeout ?? "terminate";
5548
+ const autoResume = params.auto_resume ?? false;
5291
5549
  const sandbox = createSandbox({
5292
5550
  provider: providerName,
5293
- image: params.image,
5551
+ image,
5294
5552
  timeout,
5295
5553
  name: params.name,
5296
- env_vars: params.env_vars
5554
+ env_vars: envVars,
5555
+ on_timeout: onTimeout,
5556
+ auto_resume: autoResume,
5557
+ template_id: params.template_id
5297
5558
  });
5298
5559
  const provider = await getProvider(providerName);
5299
5560
  const result = await provider.create({
5300
- image: params.image,
5561
+ image,
5301
5562
  timeout,
5302
- envVars: params.env_vars
5563
+ envVars,
5564
+ onTimeout,
5565
+ autoResume
5303
5566
  });
5304
5567
  const updated = updateSandbox(sandbox.id, {
5305
5568
  provider_sandbox_id: result.id,
5306
5569
  status: "running"
5307
5570
  });
5308
5571
  emitLifecycleEvent(sandbox.id, "sandbox created");
5572
+ if (templateData.setup_script && result.id) {
5573
+ try {
5574
+ await provider.exec(result.id, templateData.setup_script);
5575
+ } catch {}
5576
+ }
5309
5577
  return ok(updated);
5310
5578
  } catch (e) {
5311
5579
  return err(e);
@@ -5544,7 +5812,7 @@ server.tool("search_tools", "Search tools by keyword", {
5544
5812
  });
5545
5813
  server.tool("run_agent", "Run an AI agent inside a sandbox", {
5546
5814
  sandbox_id: exports_external.string().describe("Sandbox ID"),
5547
- agent_type: exports_external.enum(["claude", "codex", "gemini", "custom"]).describe("Agent type"),
5815
+ agent_type: exports_external.enum(["claude", "codex", "gemini", "opencode", "pi", "custom"]).describe("Agent type"),
5548
5816
  prompt: exports_external.string().describe("Prompt for the agent"),
5549
5817
  agent_name: exports_external.string().optional().describe("Agent name"),
5550
5818
  command: exports_external.string().optional().describe("Custom command (for 'custom' type)")
@@ -5589,5 +5857,111 @@ server.tool("get_agent_output", "Get output from an agent session", {
5589
5857
  return err(e);
5590
5858
  }
5591
5859
  });
5860
+ server.tool("pause_sandbox", "Pause a running sandbox, saving its state for later resume", {
5861
+ id: exports_external.string().describe("Sandbox ID or partial ID")
5862
+ }, async (params) => {
5863
+ try {
5864
+ const sandbox = getSandbox(params.id);
5865
+ if (!sandbox.provider_sandbox_id)
5866
+ throw new Error("Sandbox has no provider ID");
5867
+ const provider = await getProvider(sandbox.provider);
5868
+ await provider.pause(sandbox.provider_sandbox_id);
5869
+ const updated = updateSandbox(sandbox.id, { status: "paused" });
5870
+ emitLifecycleEvent(sandbox.id, "sandbox paused");
5871
+ return ok(updated);
5872
+ } catch (e) {
5873
+ return err(e);
5874
+ }
5875
+ });
5876
+ server.tool("resume_sandbox", "Resume a paused sandbox", {
5877
+ id: exports_external.string().describe("Sandbox ID or partial ID")
5878
+ }, async (params) => {
5879
+ try {
5880
+ const sandbox = getSandbox(params.id);
5881
+ if (!sandbox.provider_sandbox_id)
5882
+ throw new Error("Sandbox has no provider ID");
5883
+ const provider = await getProvider(sandbox.provider);
5884
+ await provider.resume(sandbox.provider_sandbox_id);
5885
+ const updated = updateSandbox(sandbox.id, { status: "running" });
5886
+ emitLifecycleEvent(sandbox.id, "sandbox resumed");
5887
+ return ok(updated);
5888
+ } catch (e) {
5889
+ return err(e);
5890
+ }
5891
+ });
5892
+ server.tool("create_template", "Create a reusable sandbox template", {
5893
+ name: exports_external.string().describe("Template name"),
5894
+ description: exports_external.string().optional(),
5895
+ image: exports_external.string().optional().describe("Container image"),
5896
+ env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
5897
+ setup_script: exports_external.string().optional().describe("Shell script to run on sandbox creation"),
5898
+ tags: exports_external.array(exports_external.string()).optional()
5899
+ }, async (params) => {
5900
+ try {
5901
+ return ok(createTemplate(params));
5902
+ } catch (e) {
5903
+ return err(e);
5904
+ }
5905
+ });
5906
+ server.tool("list_templates", "List all sandbox templates", {}, async () => {
5907
+ try {
5908
+ return ok(listTemplates());
5909
+ } catch (e) {
5910
+ return err(e);
5911
+ }
5912
+ });
5913
+ server.tool("get_template", "Get a sandbox template by ID", {
5914
+ id: exports_external.string().describe("Template ID or partial ID")
5915
+ }, async (params) => {
5916
+ try {
5917
+ return ok(getTemplate(params.id));
5918
+ } catch (e) {
5919
+ return err(e);
5920
+ }
5921
+ });
5922
+ server.tool("delete_template", "Delete a sandbox template", {
5923
+ id: exports_external.string().describe("Template ID or partial ID")
5924
+ }, async (params) => {
5925
+ try {
5926
+ deleteTemplate(params.id);
5927
+ return ok({ deleted: params.id });
5928
+ } catch (e) {
5929
+ return err(e);
5930
+ }
5931
+ });
5932
+ server.tool("get_sandbox_status", "Get running processes, disk usage and uptime in a sandbox", {
5933
+ sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
5934
+ }, async (params) => {
5935
+ try {
5936
+ const sandbox = getSandbox(params.sandbox_id);
5937
+ if (!sandbox.provider_sandbox_id)
5938
+ throw new Error("Sandbox has no provider ID");
5939
+ const provider = await getProvider(sandbox.provider);
5940
+ const [psResult, dfResult, uptimeResult] = await Promise.all([
5941
+ provider.exec(sandbox.provider_sandbox_id, "ps aux --no-headers 2>/dev/null | head -30 || ps aux 2>/dev/null | tail -n +2 | head -30"),
5942
+ provider.exec(sandbox.provider_sandbox_id, "df -h / 2>/dev/null || df -h 2>/dev/null | head -5"),
5943
+ provider.exec(sandbox.provider_sandbox_id, "uptime 2>/dev/null || echo unknown")
5944
+ ]);
5945
+ const processes = (psResult.stdout || "").trim().split(`
5946
+ `).filter(Boolean).map((line) => {
5947
+ const parts = line.trim().split(/\s+/);
5948
+ return {
5949
+ pid: parts[1] || "",
5950
+ cpu: parts[2] || "0",
5951
+ mem: parts[3] || "0",
5952
+ command: parts.slice(10).join(" ") || parts.slice(4).join(" ")
5953
+ };
5954
+ });
5955
+ return ok({
5956
+ sandbox_id: sandbox.id,
5957
+ status: sandbox.status,
5958
+ processes,
5959
+ disk: (dfResult.stdout || "").trim(),
5960
+ uptime: (uptimeResult.stdout || "").trim()
5961
+ });
5962
+ } catch (e) {
5963
+ return err(e);
5964
+ }
5965
+ });
5592
5966
  var transport = new StdioServerTransport;
5593
5967
  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"}