@hasna/sandboxes 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +80 -26
- 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/lib/agent-runner.d.ts.map +1 -1
- package/dist/mcp/index.js +254 -37
- 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 = [];
|
|
@@ -3238,29 +3293,27 @@ async function runAgent(sandboxId, opts) {
|
|
|
3238
3293
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
3239
3294
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
3240
3295
|
const provider = await getProvider(sandbox.provider);
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
return session;
|
|
3259
|
-
} catch (err) {
|
|
3296
|
+
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
3297
|
+
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
3298
|
+
onStdout: (data) => {
|
|
3299
|
+
collector.onStdout(data);
|
|
3300
|
+
opts.onStdout?.(data);
|
|
3301
|
+
},
|
|
3302
|
+
onStderr: (data) => {
|
|
3303
|
+
collector.onStderr(data);
|
|
3304
|
+
opts.onStderr?.(data);
|
|
3305
|
+
},
|
|
3306
|
+
env
|
|
3307
|
+
}).then((result) => {
|
|
3308
|
+
const exitResult = result;
|
|
3309
|
+
const status = exitResult.exit_code === 0 ? "completed" : "failed";
|
|
3310
|
+
endSession(session.id, exitResult.exit_code ?? 0, status);
|
|
3311
|
+
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
|
|
3312
|
+
}).catch((err) => {
|
|
3260
3313
|
endSession(session.id, 1, "failed");
|
|
3261
3314
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
|
|
3262
|
-
|
|
3263
|
-
|
|
3315
|
+
});
|
|
3316
|
+
return session;
|
|
3264
3317
|
}
|
|
3265
3318
|
async function stopAgent(sandboxId) {
|
|
3266
3319
|
const sandbox = getSandbox(sandboxId);
|
|
@@ -3272,14 +3325,15 @@ async function stopAgent(sandboxId) {
|
|
|
3272
3325
|
} catch {}
|
|
3273
3326
|
emitLifecycleEvent(sandbox.id, "Agent stopped by user");
|
|
3274
3327
|
}
|
|
3275
|
-
var AGENT_COMMANDS;
|
|
3328
|
+
var CLAUDE_ONBOARDING_SETUP, AGENT_COMMANDS;
|
|
3276
3329
|
var init_agent_runner = __esm(() => {
|
|
3277
3330
|
init_sandboxes();
|
|
3278
3331
|
init_sessions();
|
|
3279
3332
|
init_providers();
|
|
3280
3333
|
init_stream();
|
|
3334
|
+
CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
|
|
3281
3335
|
AGENT_COMMANDS = {
|
|
3282
|
-
claude: (prompt) =>
|
|
3336
|
+
claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
|
|
3283
3337
|
codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
|
|
3284
3338
|
gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
|
|
3285
3339
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
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,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAc/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -29,7 +29,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
|
29
29
|
var __require = import.meta.require;
|
|
30
30
|
|
|
31
31
|
// src/types/index.ts
|
|
32
|
-
var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError;
|
|
32
|
+
var SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, TemplateNotFoundError;
|
|
33
33
|
var init_types = __esm(() => {
|
|
34
34
|
SandboxNotFoundError = class SandboxNotFoundError extends Error {
|
|
35
35
|
constructor(id) {
|
|
@@ -63,6 +63,12 @@ var init_types = __esm(() => {
|
|
|
63
63
|
this.name = "ProjectNotFoundError";
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
|
+
TemplateNotFoundError = class TemplateNotFoundError extends Error {
|
|
67
|
+
constructor(id) {
|
|
68
|
+
super(`Template not found: ${id}`);
|
|
69
|
+
this.name = "TemplateNotFoundError";
|
|
70
|
+
}
|
|
71
|
+
};
|
|
66
72
|
});
|
|
67
73
|
|
|
68
74
|
// src/providers/e2b.ts
|
|
@@ -82,7 +88,10 @@ class E2BProvider {
|
|
|
82
88
|
try {
|
|
83
89
|
const sandbox = await E2BSandbox.create({
|
|
84
90
|
apiKey: this.apiKey,
|
|
85
|
-
timeoutMs: (opts?.timeout || 3600) * 1000
|
|
91
|
+
timeoutMs: (opts?.timeout || 3600) * 1000,
|
|
92
|
+
...opts?.onTimeout === "pause" ? {
|
|
93
|
+
lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
|
|
94
|
+
} : {}
|
|
86
95
|
});
|
|
87
96
|
instanceCache.set(sandbox.sandboxId, sandbox);
|
|
88
97
|
return {
|
|
@@ -191,6 +200,23 @@ class E2BProvider {
|
|
|
191
200
|
async delete(sandboxId) {
|
|
192
201
|
await this.stop(sandboxId);
|
|
193
202
|
}
|
|
203
|
+
async pause(sandboxId) {
|
|
204
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
205
|
+
try {
|
|
206
|
+
await sandbox.pause();
|
|
207
|
+
instanceCache.delete(sandboxId);
|
|
208
|
+
} catch (err) {
|
|
209
|
+
throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async resume(sandboxId) {
|
|
213
|
+
try {
|
|
214
|
+
const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
|
|
215
|
+
instanceCache.set(sandboxId, sandbox);
|
|
216
|
+
} catch (err) {
|
|
217
|
+
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
194
220
|
async keepAlive(sandboxId, durationMs) {
|
|
195
221
|
const sandbox = await this.getInstance(sandboxId);
|
|
196
222
|
try {
|
|
@@ -351,6 +377,12 @@ class DaytonaProvider {
|
|
|
351
377
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
352
378
|
}
|
|
353
379
|
}
|
|
380
|
+
async pause(_sandboxId) {
|
|
381
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
382
|
+
}
|
|
383
|
+
async resume(_sandboxId) {
|
|
384
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
385
|
+
}
|
|
354
386
|
async keepAlive(sandboxId, durationMs) {
|
|
355
387
|
const sandbox = await this.getInstance(sandboxId);
|
|
356
388
|
try {
|
|
@@ -573,6 +605,12 @@ class ModalProvider {
|
|
|
573
605
|
async delete(sandboxId) {
|
|
574
606
|
await this.stop(sandboxId);
|
|
575
607
|
}
|
|
608
|
+
async pause(_sandboxId) {
|
|
609
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
610
|
+
}
|
|
611
|
+
async resume(_sandboxId) {
|
|
612
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
613
|
+
}
|
|
576
614
|
async keepAlive(_sandboxId, _durationMs) {}
|
|
577
615
|
parseCommand(command) {
|
|
578
616
|
const args = [];
|
|
@@ -4719,6 +4757,25 @@ var MIGRATIONS = [
|
|
|
4719
4757
|
);
|
|
4720
4758
|
|
|
4721
4759
|
INSERT OR IGNORE INTO _migrations (id) VALUES (1);
|
|
4760
|
+
`,
|
|
4761
|
+
`
|
|
4762
|
+
ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
|
|
4763
|
+
ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
|
|
4764
|
+
|
|
4765
|
+
CREATE TABLE IF NOT EXISTS templates (
|
|
4766
|
+
id TEXT PRIMARY KEY,
|
|
4767
|
+
name TEXT NOT NULL UNIQUE,
|
|
4768
|
+
description TEXT,
|
|
4769
|
+
image TEXT,
|
|
4770
|
+
env_vars TEXT NOT NULL DEFAULT '{}',
|
|
4771
|
+
setup_script TEXT,
|
|
4772
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
4773
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
4774
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
4775
|
+
);
|
|
4776
|
+
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
4777
|
+
|
|
4778
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
4722
4779
|
`
|
|
4723
4780
|
];
|
|
4724
4781
|
var db = null;
|
|
@@ -4777,6 +4834,8 @@ function rowToSandbox(row) {
|
|
|
4777
4834
|
env_vars: JSON.parse(row.env_vars),
|
|
4778
4835
|
keep_alive_until: row.keep_alive_until,
|
|
4779
4836
|
project_id: row.project_id,
|
|
4837
|
+
on_timeout: row.on_timeout ?? "terminate",
|
|
4838
|
+
auto_resume: row.auto_resume === 1,
|
|
4780
4839
|
created_at: row.created_at,
|
|
4781
4840
|
updated_at: row.updated_at
|
|
4782
4841
|
};
|
|
@@ -4792,8 +4851,10 @@ function createSandbox(input) {
|
|
|
4792
4851
|
const config = JSON.stringify(input.config ?? {});
|
|
4793
4852
|
const env_vars = JSON.stringify(input.env_vars ?? {});
|
|
4794
4853
|
const project_id = input.project_id ?? null;
|
|
4795
|
-
|
|
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
|
|
|
@@ -5191,8 +5298,9 @@ function emitLifecycleEvent(sandboxId, message) {
|
|
|
5191
5298
|
}
|
|
5192
5299
|
|
|
5193
5300
|
// src/lib/agent-runner.ts
|
|
5301
|
+
var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
|
|
5194
5302
|
var AGENT_COMMANDS = {
|
|
5195
|
-
claude: (prompt) =>
|
|
5303
|
+
claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
|
|
5196
5304
|
codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
|
|
5197
5305
|
gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
|
|
5198
5306
|
};
|
|
@@ -5211,29 +5319,27 @@ async function runAgent(sandboxId, opts) {
|
|
|
5211
5319
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
5212
5320
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
5213
5321
|
const provider = await getProvider(sandbox.provider);
|
|
5214
|
-
|
|
5215
|
-
|
|
5216
|
-
|
|
5217
|
-
|
|
5218
|
-
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
return session;
|
|
5232
|
-
} catch (err) {
|
|
5322
|
+
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
5323
|
+
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
5324
|
+
onStdout: (data) => {
|
|
5325
|
+
collector.onStdout(data);
|
|
5326
|
+
opts.onStdout?.(data);
|
|
5327
|
+
},
|
|
5328
|
+
onStderr: (data) => {
|
|
5329
|
+
collector.onStderr(data);
|
|
5330
|
+
opts.onStderr?.(data);
|
|
5331
|
+
},
|
|
5332
|
+
env
|
|
5333
|
+
}).then((result) => {
|
|
5334
|
+
const exitResult = result;
|
|
5335
|
+
const status = exitResult.exit_code === 0 ? "completed" : "failed";
|
|
5336
|
+
endSession(session.id, exitResult.exit_code ?? 0, status);
|
|
5337
|
+
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
|
|
5338
|
+
}).catch((err) => {
|
|
5233
5339
|
endSession(session.id, 1, "failed");
|
|
5234
5340
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
|
|
5235
|
-
|
|
5236
|
-
|
|
5341
|
+
});
|
|
5342
|
+
return session;
|
|
5237
5343
|
}
|
|
5238
5344
|
async function stopAgent(sandboxId) {
|
|
5239
5345
|
const sandbox = getSandbox(sandboxId);
|
|
@@ -5273,7 +5379,13 @@ var TOOL_CATALOG = [
|
|
|
5273
5379
|
{ name: "register_project", description: "Register a project" },
|
|
5274
5380
|
{ name: "list_projects", description: "List all projects" },
|
|
5275
5381
|
{ name: "describe_tools", description: "List all available tools" },
|
|
5276
|
-
{ name: "search_tools", description: "Search tools by keyword" }
|
|
5382
|
+
{ name: "search_tools", description: "Search tools by keyword" },
|
|
5383
|
+
{ name: "pause_sandbox", description: "Pause a running sandbox, saving its state for later resume" },
|
|
5384
|
+
{ name: "resume_sandbox", description: "Resume a paused sandbox" },
|
|
5385
|
+
{ name: "create_template", description: "Create a reusable sandbox template" },
|
|
5386
|
+
{ name: "list_templates", description: "List all sandbox templates" },
|
|
5387
|
+
{ name: "get_template", description: "Get a sandbox template by ID" },
|
|
5388
|
+
{ name: "delete_template", description: "Delete a sandbox template" }
|
|
5277
5389
|
];
|
|
5278
5390
|
var server = new McpServer({
|
|
5279
5391
|
name: "sandboxes",
|
|
@@ -5284,29 +5396,51 @@ server.tool("create_sandbox", "Create a new sandbox", {
|
|
|
5284
5396
|
image: exports_external.string().optional().describe("Container image"),
|
|
5285
5397
|
timeout: exports_external.number().optional().describe("Timeout in seconds"),
|
|
5286
5398
|
name: exports_external.string().optional().describe("Sandbox name"),
|
|
5287
|
-
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables")
|
|
5399
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
|
|
5400
|
+
template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
|
|
5401
|
+
on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
|
|
5402
|
+
auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
|
|
5288
5403
|
}, async (params) => {
|
|
5289
5404
|
try {
|
|
5290
5405
|
const providerName = params.provider ?? getDefaultProvider();
|
|
5291
5406
|
const timeout = params.timeout ?? getDefaultTimeout();
|
|
5407
|
+
let templateData = {};
|
|
5408
|
+
if (params.template_id) {
|
|
5409
|
+
const tmpl = getTemplate(params.template_id);
|
|
5410
|
+
templateData = { image: tmpl.image ?? undefined, env_vars: tmpl.env_vars, setup_script: tmpl.setup_script };
|
|
5411
|
+
}
|
|
5412
|
+
const image = params.image ?? templateData.image;
|
|
5413
|
+
const envVars = { ...templateData.env_vars, ...params.env_vars };
|
|
5414
|
+
const onTimeout = params.on_timeout ?? "terminate";
|
|
5415
|
+
const autoResume = params.auto_resume ?? false;
|
|
5292
5416
|
const sandbox = createSandbox({
|
|
5293
5417
|
provider: providerName,
|
|
5294
|
-
image
|
|
5418
|
+
image,
|
|
5295
5419
|
timeout,
|
|
5296
5420
|
name: params.name,
|
|
5297
|
-
env_vars:
|
|
5421
|
+
env_vars: envVars,
|
|
5422
|
+
on_timeout: onTimeout,
|
|
5423
|
+
auto_resume: autoResume,
|
|
5424
|
+
template_id: params.template_id
|
|
5298
5425
|
});
|
|
5299
5426
|
const provider = await getProvider(providerName);
|
|
5300
5427
|
const result = await provider.create({
|
|
5301
|
-
image
|
|
5428
|
+
image,
|
|
5302
5429
|
timeout,
|
|
5303
|
-
envVars
|
|
5430
|
+
envVars,
|
|
5431
|
+
onTimeout,
|
|
5432
|
+
autoResume
|
|
5304
5433
|
});
|
|
5305
5434
|
const updated = updateSandbox(sandbox.id, {
|
|
5306
5435
|
provider_sandbox_id: result.id,
|
|
5307
5436
|
status: "running"
|
|
5308
5437
|
});
|
|
5309
5438
|
emitLifecycleEvent(sandbox.id, "sandbox created");
|
|
5439
|
+
if (templateData.setup_script && result.id) {
|
|
5440
|
+
try {
|
|
5441
|
+
await provider.exec(result.id, templateData.setup_script);
|
|
5442
|
+
} catch {}
|
|
5443
|
+
}
|
|
5310
5444
|
return ok(updated);
|
|
5311
5445
|
} catch (e) {
|
|
5312
5446
|
return err(e);
|
|
@@ -5397,14 +5531,25 @@ server.tool("exec_command", "Execute a command in a sandbox", {
|
|
|
5397
5531
|
});
|
|
5398
5532
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
5399
5533
|
const provider = await getProvider(sandbox.provider);
|
|
5400
|
-
const
|
|
5401
|
-
background: params.background,
|
|
5402
|
-
onStdout: collector.onStdout,
|
|
5403
|
-
onStderr: collector.onStderr
|
|
5404
|
-
});
|
|
5534
|
+
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
5405
5535
|
if (params.background) {
|
|
5536
|
+
provider.exec(sandbox.provider_sandbox_id, params.command, {
|
|
5537
|
+
onStdout: collector.onStdout,
|
|
5538
|
+
onStderr: collector.onStderr,
|
|
5539
|
+
env
|
|
5540
|
+
}).then((res) => {
|
|
5541
|
+
const r = res;
|
|
5542
|
+
endSession(session.id, r.exit_code ?? 0);
|
|
5543
|
+
}).catch(() => {
|
|
5544
|
+
endSession(session.id, 1);
|
|
5545
|
+
});
|
|
5406
5546
|
return ok({ session_id: session.id, background: true });
|
|
5407
5547
|
}
|
|
5548
|
+
const result = await provider.exec(sandbox.provider_sandbox_id, params.command, {
|
|
5549
|
+
onStdout: collector.onStdout,
|
|
5550
|
+
onStderr: collector.onStderr,
|
|
5551
|
+
env
|
|
5552
|
+
});
|
|
5408
5553
|
const execResult = result;
|
|
5409
5554
|
endSession(session.id, execResult.exit_code);
|
|
5410
5555
|
return ok({
|
|
@@ -5579,5 +5724,77 @@ server.tool("get_agent_output", "Get output from an agent session", {
|
|
|
5579
5724
|
return err(e);
|
|
5580
5725
|
}
|
|
5581
5726
|
});
|
|
5727
|
+
server.tool("pause_sandbox", "Pause a running sandbox, saving its state for later resume", {
|
|
5728
|
+
id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
5729
|
+
}, async (params) => {
|
|
5730
|
+
try {
|
|
5731
|
+
const sandbox = getSandbox(params.id);
|
|
5732
|
+
if (!sandbox.provider_sandbox_id)
|
|
5733
|
+
throw new Error("Sandbox has no provider ID");
|
|
5734
|
+
const provider = await getProvider(sandbox.provider);
|
|
5735
|
+
await provider.pause(sandbox.provider_sandbox_id);
|
|
5736
|
+
const updated = updateSandbox(sandbox.id, { status: "paused" });
|
|
5737
|
+
emitLifecycleEvent(sandbox.id, "sandbox paused");
|
|
5738
|
+
return ok(updated);
|
|
5739
|
+
} catch (e) {
|
|
5740
|
+
return err(e);
|
|
5741
|
+
}
|
|
5742
|
+
});
|
|
5743
|
+
server.tool("resume_sandbox", "Resume a paused sandbox", {
|
|
5744
|
+
id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
5745
|
+
}, async (params) => {
|
|
5746
|
+
try {
|
|
5747
|
+
const sandbox = getSandbox(params.id);
|
|
5748
|
+
if (!sandbox.provider_sandbox_id)
|
|
5749
|
+
throw new Error("Sandbox has no provider ID");
|
|
5750
|
+
const provider = await getProvider(sandbox.provider);
|
|
5751
|
+
await provider.resume(sandbox.provider_sandbox_id);
|
|
5752
|
+
const updated = updateSandbox(sandbox.id, { status: "running" });
|
|
5753
|
+
emitLifecycleEvent(sandbox.id, "sandbox resumed");
|
|
5754
|
+
return ok(updated);
|
|
5755
|
+
} catch (e) {
|
|
5756
|
+
return err(e);
|
|
5757
|
+
}
|
|
5758
|
+
});
|
|
5759
|
+
server.tool("create_template", "Create a reusable sandbox template", {
|
|
5760
|
+
name: exports_external.string().describe("Template name"),
|
|
5761
|
+
description: exports_external.string().optional(),
|
|
5762
|
+
image: exports_external.string().optional().describe("Container image"),
|
|
5763
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
|
|
5764
|
+
setup_script: exports_external.string().optional().describe("Shell script to run on sandbox creation"),
|
|
5765
|
+
tags: exports_external.array(exports_external.string()).optional()
|
|
5766
|
+
}, async (params) => {
|
|
5767
|
+
try {
|
|
5768
|
+
return ok(createTemplate(params));
|
|
5769
|
+
} catch (e) {
|
|
5770
|
+
return err(e);
|
|
5771
|
+
}
|
|
5772
|
+
});
|
|
5773
|
+
server.tool("list_templates", "List all sandbox templates", {}, async () => {
|
|
5774
|
+
try {
|
|
5775
|
+
return ok(listTemplates());
|
|
5776
|
+
} catch (e) {
|
|
5777
|
+
return err(e);
|
|
5778
|
+
}
|
|
5779
|
+
});
|
|
5780
|
+
server.tool("get_template", "Get a sandbox template by ID", {
|
|
5781
|
+
id: exports_external.string().describe("Template ID or partial ID")
|
|
5782
|
+
}, async (params) => {
|
|
5783
|
+
try {
|
|
5784
|
+
return ok(getTemplate(params.id));
|
|
5785
|
+
} catch (e) {
|
|
5786
|
+
return err(e);
|
|
5787
|
+
}
|
|
5788
|
+
});
|
|
5789
|
+
server.tool("delete_template", "Delete a sandbox template", {
|
|
5790
|
+
id: exports_external.string().describe("Template ID or partial ID")
|
|
5791
|
+
}, async (params) => {
|
|
5792
|
+
try {
|
|
5793
|
+
deleteTemplate(params.id);
|
|
5794
|
+
return ok({ deleted: params.id });
|
|
5795
|
+
} catch (e) {
|
|
5796
|
+
return err(e);
|
|
5797
|
+
}
|
|
5798
|
+
});
|
|
5582
5799
|
var transport = new StdioServerTransport;
|
|
5583
5800
|
await server.connect(transport);
|
|
@@ -12,6 +12,8 @@ export declare class DaytonaProvider implements SandboxProvider {
|
|
|
12
12
|
listFiles(sandboxId: string, path: string): Promise<FileInfo[]>;
|
|
13
13
|
stop(sandboxId: string): Promise<void>;
|
|
14
14
|
delete(sandboxId: string): Promise<void>;
|
|
15
|
+
pause(_sandboxId: string): Promise<void>;
|
|
16
|
+
resume(_sandboxId: string): Promise<void>;
|
|
15
17
|
keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
|
|
16
18
|
}
|
|
17
19
|
//# sourceMappingURL=daytona.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
|
|
1
|
+
{"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/providers/daytona.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,YAAW,eAAe;IACrD,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,MAAM,CAAU;gBAEZ,MAAM,EAAE,MAAM;IAMpB,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YA0BlD,WAAW;IAgBnB,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAgG7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1D,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAYV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAcvE"}
|
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",
|