@hasna/sandboxes 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +58 -3
- 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -4
- package/dist/mcp/index.js +217 -10
- 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 +58 -3
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
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
|
-
|
|
2293
|
-
|
|
2313
|
+
const on_timeout = input.on_timeout ?? "terminate";
|
|
2314
|
+
const auto_resume = input.auto_resume ? 1 : 0;
|
|
2315
|
+
db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
|
|
2316
|
+
VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
|
|
2294
2317
|
return getSandbox(id);
|
|
2295
2318
|
}
|
|
2296
2319
|
function getSandbox(id) {
|
|
@@ -2581,7 +2604,10 @@ class E2BProvider {
|
|
|
2581
2604
|
try {
|
|
2582
2605
|
const sandbox = await E2BSandbox.create({
|
|
2583
2606
|
apiKey: this.apiKey,
|
|
2584
|
-
timeoutMs: (opts?.timeout || 3600) * 1000
|
|
2607
|
+
timeoutMs: (opts?.timeout || 3600) * 1000,
|
|
2608
|
+
...opts?.onTimeout === "pause" ? {
|
|
2609
|
+
lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
|
|
2610
|
+
} : {}
|
|
2585
2611
|
});
|
|
2586
2612
|
instanceCache.set(sandbox.sandboxId, sandbox);
|
|
2587
2613
|
return {
|
|
@@ -2690,6 +2716,23 @@ class E2BProvider {
|
|
|
2690
2716
|
async delete(sandboxId) {
|
|
2691
2717
|
await this.stop(sandboxId);
|
|
2692
2718
|
}
|
|
2719
|
+
async pause(sandboxId) {
|
|
2720
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
2721
|
+
try {
|
|
2722
|
+
await sandbox.pause();
|
|
2723
|
+
instanceCache.delete(sandboxId);
|
|
2724
|
+
} catch (err) {
|
|
2725
|
+
throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
|
|
2726
|
+
}
|
|
2727
|
+
}
|
|
2728
|
+
async resume(sandboxId) {
|
|
2729
|
+
try {
|
|
2730
|
+
const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
|
|
2731
|
+
instanceCache.set(sandboxId, sandbox);
|
|
2732
|
+
} catch (err) {
|
|
2733
|
+
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
2734
|
+
}
|
|
2735
|
+
}
|
|
2693
2736
|
async keepAlive(sandboxId, durationMs) {
|
|
2694
2737
|
const sandbox = await this.getInstance(sandboxId);
|
|
2695
2738
|
try {
|
|
@@ -2850,6 +2893,12 @@ class DaytonaProvider {
|
|
|
2850
2893
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
2851
2894
|
}
|
|
2852
2895
|
}
|
|
2896
|
+
async pause(_sandboxId) {
|
|
2897
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
2898
|
+
}
|
|
2899
|
+
async resume(_sandboxId) {
|
|
2900
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
2901
|
+
}
|
|
2853
2902
|
async keepAlive(sandboxId, durationMs) {
|
|
2854
2903
|
const sandbox = await this.getInstance(sandboxId);
|
|
2855
2904
|
try {
|
|
@@ -3072,6 +3121,12 @@ class ModalProvider {
|
|
|
3072
3121
|
async delete(sandboxId) {
|
|
3073
3122
|
await this.stop(sandboxId);
|
|
3074
3123
|
}
|
|
3124
|
+
async pause(_sandboxId) {
|
|
3125
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
3126
|
+
}
|
|
3127
|
+
async resume(_sandboxId) {
|
|
3128
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
3129
|
+
}
|
|
3075
3130
|
async keepAlive(_sandboxId, _durationMs) {}
|
|
3076
3131
|
parseCommand(command) {
|
|
3077
3132
|
const args = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
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,
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
863
|
-
|
|
921
|
+
const on_timeout = input.on_timeout ?? "terminate";
|
|
922
|
+
const auto_resume = input.auto_resume ? 1 : 0;
|
|
923
|
+
db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
|
|
924
|
+
VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
|
|
864
925
|
return getSandbox(id);
|
|
865
926
|
}
|
|
866
927
|
function getSandbox(id) {
|
|
@@ -1213,6 +1274,56 @@ function deleteWebhook(id) {
|
|
|
1213
1274
|
throw new WebhookNotFoundError(id);
|
|
1214
1275
|
db2.query("DELETE FROM webhooks WHERE id = ?").run(resolvedId);
|
|
1215
1276
|
}
|
|
1277
|
+
// src/db/templates.ts
|
|
1278
|
+
init_types();
|
|
1279
|
+
function rowToTemplate(row) {
|
|
1280
|
+
return {
|
|
1281
|
+
id: row.id,
|
|
1282
|
+
name: row.name,
|
|
1283
|
+
description: row.description,
|
|
1284
|
+
image: row.image,
|
|
1285
|
+
env_vars: JSON.parse(row.env_vars),
|
|
1286
|
+
setup_script: row.setup_script,
|
|
1287
|
+
tags: JSON.parse(row.tags),
|
|
1288
|
+
created_at: row.created_at,
|
|
1289
|
+
updated_at: row.updated_at
|
|
1290
|
+
};
|
|
1291
|
+
}
|
|
1292
|
+
function createTemplate(input) {
|
|
1293
|
+
const db2 = getDatabase();
|
|
1294
|
+
const id = uuid();
|
|
1295
|
+
const timestamp = now();
|
|
1296
|
+
db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
|
|
1297
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.name, input.description ?? null, input.image ?? null, JSON.stringify(input.env_vars ?? {}), input.setup_script ?? null, JSON.stringify(input.tags ?? []), timestamp, timestamp);
|
|
1298
|
+
return getTemplate(id);
|
|
1299
|
+
}
|
|
1300
|
+
function getTemplate(id) {
|
|
1301
|
+
const db2 = getDatabase();
|
|
1302
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
1303
|
+
if (!resolvedId)
|
|
1304
|
+
throw new TemplateNotFoundError(id);
|
|
1305
|
+
const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
|
|
1306
|
+
if (!row)
|
|
1307
|
+
throw new TemplateNotFoundError(id);
|
|
1308
|
+
return rowToTemplate(row);
|
|
1309
|
+
}
|
|
1310
|
+
function getTemplateByName(name) {
|
|
1311
|
+
const db2 = getDatabase();
|
|
1312
|
+
const row = db2.query("SELECT * FROM templates WHERE name = ?").get(name);
|
|
1313
|
+
return row ? rowToTemplate(row) : null;
|
|
1314
|
+
}
|
|
1315
|
+
function listTemplates() {
|
|
1316
|
+
const db2 = getDatabase();
|
|
1317
|
+
const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
|
|
1318
|
+
return rows.map(rowToTemplate);
|
|
1319
|
+
}
|
|
1320
|
+
function deleteTemplate(id) {
|
|
1321
|
+
const db2 = getDatabase();
|
|
1322
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
1323
|
+
if (!resolvedId)
|
|
1324
|
+
throw new TemplateNotFoundError(id);
|
|
1325
|
+
db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
|
|
1326
|
+
}
|
|
1216
1327
|
// src/lib/config.ts
|
|
1217
1328
|
import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
1218
1329
|
import { dirname as dirname2, join as join2 } from "path";
|
|
@@ -1420,12 +1531,15 @@ export {
|
|
|
1420
1531
|
now,
|
|
1421
1532
|
loadConfig,
|
|
1422
1533
|
listWebhooks,
|
|
1534
|
+
listTemplates,
|
|
1423
1535
|
listSessions,
|
|
1424
1536
|
listSandboxes,
|
|
1425
1537
|
listProjects,
|
|
1426
1538
|
listEvents,
|
|
1427
1539
|
listAgents,
|
|
1428
1540
|
getWebhook,
|
|
1541
|
+
getTemplateByName,
|
|
1542
|
+
getTemplate,
|
|
1429
1543
|
getSession,
|
|
1430
1544
|
getSandbox,
|
|
1431
1545
|
getProviderApiKey,
|
|
@@ -1443,10 +1557,12 @@ export {
|
|
|
1443
1557
|
endSession,
|
|
1444
1558
|
emitLifecycleEvent,
|
|
1445
1559
|
deleteWebhook,
|
|
1560
|
+
deleteTemplate,
|
|
1446
1561
|
deleteSandbox,
|
|
1447
1562
|
deleteProject,
|
|
1448
1563
|
deleteAgent,
|
|
1449
1564
|
createWebhook,
|
|
1565
|
+
createTemplate,
|
|
1450
1566
|
createStreamCollector,
|
|
1451
1567
|
createSession,
|
|
1452
1568
|
createSandbox,
|
|
@@ -1455,6 +1571,7 @@ export {
|
|
|
1455
1571
|
addStreamListener,
|
|
1456
1572
|
addEvent,
|
|
1457
1573
|
WebhookNotFoundError,
|
|
1574
|
+
TemplateNotFoundError,
|
|
1458
1575
|
SessionNotFoundError,
|
|
1459
1576
|
SandboxNotFoundError,
|
|
1460
1577
|
SESSION_STATUSES,
|
package/dist/mcp/index.js
CHANGED
|
@@ -29,7 +29,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
|
29
29
|
var __require = import.meta.require;
|
|
30
30
|
|
|
31
31
|
// src/types/index.ts
|
|
32
|
-
var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError;
|
|
32
|
+
var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, TemplateNotFoundError;
|
|
33
33
|
var init_types = __esm(() => {
|
|
34
34
|
SandboxNotFoundError = class SandboxNotFoundError extends Error {
|
|
35
35
|
constructor(id) {
|
|
@@ -63,6 +63,12 @@ var init_types = __esm(() => {
|
|
|
63
63
|
this.name = "ProjectNotFoundError";
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
|
+
TemplateNotFoundError = class TemplateNotFoundError extends Error {
|
|
67
|
+
constructor(id) {
|
|
68
|
+
super(`Template not found: ${id}`);
|
|
69
|
+
this.name = "TemplateNotFoundError";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
66
72
|
});
|
|
67
73
|
|
|
68
74
|
// src/providers/e2b.ts
|
|
@@ -82,7 +88,10 @@ class E2BProvider {
|
|
|
82
88
|
try {
|
|
83
89
|
const sandbox = await E2BSandbox.create({
|
|
84
90
|
apiKey: this.apiKey,
|
|
85
|
-
timeoutMs: (opts?.timeout || 3600) * 1000
|
|
91
|
+
timeoutMs: (opts?.timeout || 3600) * 1000,
|
|
92
|
+
...opts?.onTimeout === "pause" ? {
|
|
93
|
+
lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
|
|
94
|
+
} : {}
|
|
86
95
|
});
|
|
87
96
|
instanceCache.set(sandbox.sandboxId, sandbox);
|
|
88
97
|
return {
|
|
@@ -191,6 +200,23 @@ class E2BProvider {
|
|
|
191
200
|
async delete(sandboxId) {
|
|
192
201
|
await this.stop(sandboxId);
|
|
193
202
|
}
|
|
203
|
+
async pause(sandboxId) {
|
|
204
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
205
|
+
try {
|
|
206
|
+
await sandbox.pause();
|
|
207
|
+
instanceCache.delete(sandboxId);
|
|
208
|
+
} catch (err) {
|
|
209
|
+
throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async resume(sandboxId) {
|
|
213
|
+
try {
|
|
214
|
+
const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
|
|
215
|
+
instanceCache.set(sandboxId, sandbox);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
194
220
|
async keepAlive(sandboxId, durationMs) {
|
|
195
221
|
const sandbox = await this.getInstance(sandboxId);
|
|
196
222
|
try {
|
|
@@ -351,6 +377,12 @@ class DaytonaProvider {
|
|
|
351
377
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
352
378
|
}
|
|
353
379
|
}
|
|
380
|
+
async pause(_sandboxId) {
|
|
381
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
382
|
+
}
|
|
383
|
+
async resume(_sandboxId) {
|
|
384
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
385
|
+
}
|
|
354
386
|
async keepAlive(sandboxId, durationMs) {
|
|
355
387
|
const sandbox = await this.getInstance(sandboxId);
|
|
356
388
|
try {
|
|
@@ -573,6 +605,12 @@ class ModalProvider {
|
|
|
573
605
|
async delete(sandboxId) {
|
|
574
606
|
await this.stop(sandboxId);
|
|
575
607
|
}
|
|
608
|
+
async pause(_sandboxId) {
|
|
609
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
610
|
+
}
|
|
611
|
+
async resume(_sandboxId) {
|
|
612
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
613
|
+
}
|
|
576
614
|
async keepAlive(_sandboxId, _durationMs) {}
|
|
577
615
|
parseCommand(command) {
|
|
578
616
|
const args = [];
|
|
@@ -4719,6 +4757,25 @@ var MIGRATIONS = [
|
|
|
4719
4757
|
);
|
|
4720
4758
|
|
|
4721
4759
|
INSERT OR IGNORE INTO _migrations (id) VALUES (1);
|
|
4760
|
+
`,
|
|
4761
|
+
`
|
|
4762
|
+
ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
|
|
4763
|
+
ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
|
|
4764
|
+
|
|
4765
|
+
CREATE TABLE IF NOT EXISTS templates (
|
|
4766
|
+
id TEXT PRIMARY KEY,
|
|
4767
|
+
name TEXT NOT NULL UNIQUE,
|
|
4768
|
+
description TEXT,
|
|
4769
|
+
image TEXT,
|
|
4770
|
+
env_vars TEXT NOT NULL DEFAULT '{}',
|
|
4771
|
+
setup_script TEXT,
|
|
4772
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
4773
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
4774
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
4775
|
+
);
|
|
4776
|
+
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
4777
|
+
|
|
4778
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
4722
4779
|
`
|
|
4723
4780
|
];
|
|
4724
4781
|
var db = null;
|
|
@@ -4777,6 +4834,8 @@ function rowToSandbox(row) {
|
|
|
4777
4834
|
env_vars: JSON.parse(row.env_vars),
|
|
4778
4835
|
keep_alive_until: row.keep_alive_until,
|
|
4779
4836
|
project_id: row.project_id,
|
|
4837
|
+
on_timeout: row.on_timeout ?? "terminate",
|
|
4838
|
+
auto_resume: row.auto_resume === 1,
|
|
4780
4839
|
created_at: row.created_at,
|
|
4781
4840
|
updated_at: row.updated_at
|
|
4782
4841
|
};
|
|
@@ -4792,8 +4851,10 @@ function createSandbox(input) {
|
|
|
4792
4851
|
const config = JSON.stringify(input.config ?? {});
|
|
4793
4852
|
const env_vars = JSON.stringify(input.env_vars ?? {});
|
|
4794
4853
|
const project_id = input.project_id ?? null;
|
|
4795
|
-
|
|
4796
|
-
|
|
4854
|
+
const on_timeout = input.on_timeout ?? "terminate";
|
|
4855
|
+
const auto_resume = input.auto_resume ? 1 : 0;
|
|
4856
|
+
db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
|
|
4857
|
+
VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
|
|
4797
4858
|
return getSandbox(id);
|
|
4798
4859
|
}
|
|
4799
4860
|
function getSandbox(id) {
|
|
@@ -5057,6 +5118,52 @@ function ensureProject(name, path) {
|
|
|
5057
5118
|
return createProject({ name, path });
|
|
5058
5119
|
}
|
|
5059
5120
|
|
|
5121
|
+
// src/db/templates.ts
|
|
5122
|
+
init_types();
|
|
5123
|
+
function rowToTemplate(row) {
|
|
5124
|
+
return {
|
|
5125
|
+
id: row.id,
|
|
5126
|
+
name: row.name,
|
|
5127
|
+
description: row.description,
|
|
5128
|
+
image: row.image,
|
|
5129
|
+
env_vars: JSON.parse(row.env_vars),
|
|
5130
|
+
setup_script: row.setup_script,
|
|
5131
|
+
tags: JSON.parse(row.tags),
|
|
5132
|
+
created_at: row.created_at,
|
|
5133
|
+
updated_at: row.updated_at
|
|
5134
|
+
};
|
|
5135
|
+
}
|
|
5136
|
+
function createTemplate(input) {
|
|
5137
|
+
const db2 = getDatabase();
|
|
5138
|
+
const id = uuid();
|
|
5139
|
+
const timestamp = now();
|
|
5140
|
+
db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
|
|
5141
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.name, input.description ?? null, input.image ?? null, JSON.stringify(input.env_vars ?? {}), input.setup_script ?? null, JSON.stringify(input.tags ?? []), timestamp, timestamp);
|
|
5142
|
+
return getTemplate(id);
|
|
5143
|
+
}
|
|
5144
|
+
function getTemplate(id) {
|
|
5145
|
+
const db2 = getDatabase();
|
|
5146
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
5147
|
+
if (!resolvedId)
|
|
5148
|
+
throw new TemplateNotFoundError(id);
|
|
5149
|
+
const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
|
|
5150
|
+
if (!row)
|
|
5151
|
+
throw new TemplateNotFoundError(id);
|
|
5152
|
+
return rowToTemplate(row);
|
|
5153
|
+
}
|
|
5154
|
+
function listTemplates() {
|
|
5155
|
+
const db2 = getDatabase();
|
|
5156
|
+
const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
|
|
5157
|
+
return rows.map(rowToTemplate);
|
|
5158
|
+
}
|
|
5159
|
+
function deleteTemplate(id) {
|
|
5160
|
+
const db2 = getDatabase();
|
|
5161
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
5162
|
+
if (!resolvedId)
|
|
5163
|
+
throw new TemplateNotFoundError(id);
|
|
5164
|
+
db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
|
|
5165
|
+
}
|
|
5166
|
+
|
|
5060
5167
|
// src/providers/index.ts
|
|
5061
5168
|
init_types();
|
|
5062
5169
|
|
|
@@ -5272,7 +5379,13 @@ var TOOL_CATALOG = [
|
|
|
5272
5379
|
{ name: "register_project", description: "Register a project" },
|
|
5273
5380
|
{ name: "list_projects", description: "List all projects" },
|
|
5274
5381
|
{ name: "describe_tools", description: "List all available tools" },
|
|
5275
|
-
{ name: "search_tools", description: "Search tools by keyword" }
|
|
5382
|
+
{ name: "search_tools", description: "Search tools by keyword" },
|
|
5383
|
+
{ name: "pause_sandbox", description: "Pause a running sandbox, saving its state for later resume" },
|
|
5384
|
+
{ name: "resume_sandbox", description: "Resume a paused sandbox" },
|
|
5385
|
+
{ name: "create_template", description: "Create a reusable sandbox template" },
|
|
5386
|
+
{ name: "list_templates", description: "List all sandbox templates" },
|
|
5387
|
+
{ name: "get_template", description: "Get a sandbox template by ID" },
|
|
5388
|
+
{ name: "delete_template", description: "Delete a sandbox template" }
|
|
5276
5389
|
];
|
|
5277
5390
|
var server = new McpServer({
|
|
5278
5391
|
name: "sandboxes",
|
|
@@ -5283,29 +5396,51 @@ server.tool("create_sandbox", "Create a new sandbox", {
|
|
|
5283
5396
|
image: exports_external.string().optional().describe("Container image"),
|
|
5284
5397
|
timeout: exports_external.number().optional().describe("Timeout in seconds"),
|
|
5285
5398
|
name: exports_external.string().optional().describe("Sandbox name"),
|
|
5286
|
-
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables")
|
|
5399
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
|
|
5400
|
+
template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
|
|
5401
|
+
on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
|
|
5402
|
+
auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
|
|
5287
5403
|
}, async (params) => {
|
|
5288
5404
|
try {
|
|
5289
5405
|
const providerName = params.provider ?? getDefaultProvider();
|
|
5290
5406
|
const timeout = params.timeout ?? getDefaultTimeout();
|
|
5407
|
+
let templateData = {};
|
|
5408
|
+
if (params.template_id) {
|
|
5409
|
+
const tmpl = getTemplate(params.template_id);
|
|
5410
|
+
templateData = { image: tmpl.image ?? undefined, env_vars: tmpl.env_vars, setup_script: tmpl.setup_script };
|
|
5411
|
+
}
|
|
5412
|
+
const image = params.image ?? templateData.image;
|
|
5413
|
+
const envVars = { ...templateData.env_vars, ...params.env_vars };
|
|
5414
|
+
const onTimeout = params.on_timeout ?? "terminate";
|
|
5415
|
+
const autoResume = params.auto_resume ?? false;
|
|
5291
5416
|
const sandbox = createSandbox({
|
|
5292
5417
|
provider: providerName,
|
|
5293
|
-
image
|
|
5418
|
+
image,
|
|
5294
5419
|
timeout,
|
|
5295
5420
|
name: params.name,
|
|
5296
|
-
env_vars:
|
|
5421
|
+
env_vars: envVars,
|
|
5422
|
+
on_timeout: onTimeout,
|
|
5423
|
+
auto_resume: autoResume,
|
|
5424
|
+
template_id: params.template_id
|
|
5297
5425
|
});
|
|
5298
5426
|
const provider = await getProvider(providerName);
|
|
5299
5427
|
const result = await provider.create({
|
|
5300
|
-
image
|
|
5428
|
+
image,
|
|
5301
5429
|
timeout,
|
|
5302
|
-
envVars
|
|
5430
|
+
envVars,
|
|
5431
|
+
onTimeout,
|
|
5432
|
+
autoResume
|
|
5303
5433
|
});
|
|
5304
5434
|
const updated = updateSandbox(sandbox.id, {
|
|
5305
5435
|
provider_sandbox_id: result.id,
|
|
5306
5436
|
status: "running"
|
|
5307
5437
|
});
|
|
5308
5438
|
emitLifecycleEvent(sandbox.id, "sandbox created");
|
|
5439
|
+
if (templateData.setup_script && result.id) {
|
|
5440
|
+
try {
|
|
5441
|
+
await provider.exec(result.id, templateData.setup_script);
|
|
5442
|
+
} catch {}
|
|
5443
|
+
}
|
|
5309
5444
|
return ok(updated);
|
|
5310
5445
|
} catch (e) {
|
|
5311
5446
|
return err(e);
|
|
@@ -5589,5 +5724,77 @@ server.tool("get_agent_output", "Get output from an agent session", {
|
|
|
5589
5724
|
return err(e);
|
|
5590
5725
|
}
|
|
5591
5726
|
});
|
|
5727
|
+
server.tool("pause_sandbox", "Pause a running sandbox, saving its state for later resume", {
|
|
5728
|
+
id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
5729
|
+
}, async (params) => {
|
|
5730
|
+
try {
|
|
5731
|
+
const sandbox = getSandbox(params.id);
|
|
5732
|
+
if (!sandbox.provider_sandbox_id)
|
|
5733
|
+
throw new Error("Sandbox has no provider ID");
|
|
5734
|
+
const provider = await getProvider(sandbox.provider);
|
|
5735
|
+
await provider.pause(sandbox.provider_sandbox_id);
|
|
5736
|
+
const updated = updateSandbox(sandbox.id, { status: "paused" });
|
|
5737
|
+
emitLifecycleEvent(sandbox.id, "sandbox paused");
|
|
5738
|
+
return ok(updated);
|
|
5739
|
+
} catch (e) {
|
|
5740
|
+
return err(e);
|
|
5741
|
+
}
|
|
5742
|
+
});
|
|
5743
|
+
server.tool("resume_sandbox", "Resume a paused sandbox", {
|
|
5744
|
+
id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
5745
|
+
}, async (params) => {
|
|
5746
|
+
try {
|
|
5747
|
+
const sandbox = getSandbox(params.id);
|
|
5748
|
+
if (!sandbox.provider_sandbox_id)
|
|
5749
|
+
throw new Error("Sandbox has no provider ID");
|
|
5750
|
+
const provider = await getProvider(sandbox.provider);
|
|
5751
|
+
await provider.resume(sandbox.provider_sandbox_id);
|
|
5752
|
+
const updated = updateSandbox(sandbox.id, { status: "running" });
|
|
5753
|
+
emitLifecycleEvent(sandbox.id, "sandbox resumed");
|
|
5754
|
+
return ok(updated);
|
|
5755
|
+
} catch (e) {
|
|
5756
|
+
return err(e);
|
|
5757
|
+
}
|
|
5758
|
+
});
|
|
5759
|
+
server.tool("create_template", "Create a reusable sandbox template", {
|
|
5760
|
+
name: exports_external.string().describe("Template name"),
|
|
5761
|
+
description: exports_external.string().optional(),
|
|
5762
|
+
image: exports_external.string().optional().describe("Container image"),
|
|
5763
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
|
|
5764
|
+
setup_script: exports_external.string().optional().describe("Shell script to run on sandbox creation"),
|
|
5765
|
+
tags: exports_external.array(exports_external.string()).optional()
|
|
5766
|
+
}, async (params) => {
|
|
5767
|
+
try {
|
|
5768
|
+
return ok(createTemplate(params));
|
|
5769
|
+
} catch (e) {
|
|
5770
|
+
return err(e);
|
|
5771
|
+
}
|
|
5772
|
+
});
|
|
5773
|
+
server.tool("list_templates", "List all sandbox templates", {}, async () => {
|
|
5774
|
+
try {
|
|
5775
|
+
return ok(listTemplates());
|
|
5776
|
+
} catch (e) {
|
|
5777
|
+
return err(e);
|
|
5778
|
+
}
|
|
5779
|
+
});
|
|
5780
|
+
server.tool("get_template", "Get a sandbox template by ID", {
|
|
5781
|
+
id: exports_external.string().describe("Template ID or partial ID")
|
|
5782
|
+
}, async (params) => {
|
|
5783
|
+
try {
|
|
5784
|
+
return ok(getTemplate(params.id));
|
|
5785
|
+
} catch (e) {
|
|
5786
|
+
return err(e);
|
|
5787
|
+
}
|
|
5788
|
+
});
|
|
5789
|
+
server.tool("delete_template", "Delete a sandbox template", {
|
|
5790
|
+
id: exports_external.string().describe("Template ID or partial ID")
|
|
5791
|
+
}, async (params) => {
|
|
5792
|
+
try {
|
|
5793
|
+
deleteTemplate(params.id);
|
|
5794
|
+
return ok({ deleted: params.id });
|
|
5795
|
+
} catch (e) {
|
|
5796
|
+
return err(e);
|
|
5797
|
+
}
|
|
5798
|
+
});
|
|
5592
5799
|
var transport = new StdioServerTransport;
|
|
5593
5800
|
await server.connect(transport);
|
|
@@ -12,6 +12,8 @@ export declare class DaytonaProvider implements SandboxProvider {
|
|
|
12
12
|
listFiles(sandboxId: string, path: string): Promise<FileInfo[]>;
|
|
13
13
|
stop(sandboxId: string): Promise<void>;
|
|
14
14
|
delete(sandboxId: string): Promise<void>;
|
|
15
|
+
pause(_sandboxId: string): Promise<void>;
|
|
16
|
+
resume(_sandboxId: string): Promise<void>;
|
|
15
17
|
keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=daytona.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
|
|
1
|
+
{"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
|
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"}
|
package/dist/server/index.js
CHANGED
|
@@ -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
|
-
|
|
828
|
-
|
|
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) {
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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":"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,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,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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/sandboxes",
|
|
3
|
-
"version": "0.1.
|
|
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",
|