@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/cli/index.js +204 -14
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/sandboxes.d.ts.map +1 -1
- package/dist/db/templates.d.ts +7 -0
- package/dist/db/templates.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +254 -5
- package/dist/lib/agent-runner.d.ts.map +1 -1
- package/dist/lib/agents/claude.d.ts +10 -0
- package/dist/lib/agents/claude.d.ts.map +1 -0
- package/dist/lib/agents/codex.d.ts +10 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/index.d.ts +5 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/opencode.d.ts +10 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/pi.d.ts +10 -0
- package/dist/lib/agents/pi.d.ts.map +1 -0
- package/dist/lib/agents/types.d.ts +23 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/mcp/index.js +395 -21
- package/dist/providers/daytona.d.ts +2 -0
- package/dist/providers/daytona.d.ts.map +1 -1
- package/dist/providers/e2b.d.ts +2 -0
- package/dist/providers/e2b.d.ts.map +1 -1
- package/dist/providers/modal.d.ts +2 -0
- package/dist/providers/modal.d.ts.map +1 -1
- package/dist/providers/types.d.ts +4 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/server/index.js +77 -3
- package/dist/types/index.d.ts +41 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
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
|
-
|
|
4796
|
-
|
|
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
|
|
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
|
|
5551
|
+
image,
|
|
5294
5552
|
timeout,
|
|
5295
5553
|
name: params.name,
|
|
5296
|
-
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
|
|
5561
|
+
image,
|
|
5301
5562
|
timeout,
|
|
5302
|
-
envVars
|
|
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"}
|
package/dist/providers/e2b.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|