@hasna/sandboxes 0.1.7 → 0.1.8
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 +73 -1
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/snapshots.d.ts +29 -0
- package/dist/db/snapshots.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -0
- package/dist/lib/agent-runner.d.ts +3 -0
- package/dist/lib/agent-runner.d.ts.map +1 -1
- package/dist/mcp/index.js +253 -11
- package/dist/providers/daytona.d.ts +1 -0
- package/dist/providers/daytona.d.ts.map +1 -1
- package/dist/providers/e2b.d.ts +1 -0
- package/dist/providers/e2b.d.ts.map +1 -1
- package/dist/providers/modal.d.ts +1 -0
- package/dist/providers/modal.d.ts.map +1 -1
- package/dist/providers/types.d.ts +1 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/server/index.js +27 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/cli/index.js
CHANGED
|
@@ -2263,6 +2263,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
|
2263
2263
|
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
2264
2264
|
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
2265
2265
|
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
2266
|
+
`,
|
|
2267
|
+
`
|
|
2268
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
2269
|
+
id TEXT PRIMARY KEY,
|
|
2270
|
+
sandbox_id TEXT NOT NULL,
|
|
2271
|
+
provider_sandbox_id TEXT NOT NULL,
|
|
2272
|
+
provider TEXT NOT NULL,
|
|
2273
|
+
name TEXT,
|
|
2274
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
2275
|
+
);
|
|
2276
|
+
CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
|
|
2277
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (4);
|
|
2266
2278
|
`
|
|
2267
2279
|
];
|
|
2268
2280
|
});
|
|
@@ -2752,6 +2764,15 @@ class E2BProvider {
|
|
|
2752
2764
|
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
2753
2765
|
}
|
|
2754
2766
|
}
|
|
2767
|
+
async getPublicUrl(sandboxId, port, _protocol) {
|
|
2768
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
2769
|
+
try {
|
|
2770
|
+
const host = sandbox.getHost(port);
|
|
2771
|
+
return `https://${host}`;
|
|
2772
|
+
} catch (err) {
|
|
2773
|
+
throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
|
|
2774
|
+
}
|
|
2775
|
+
}
|
|
2755
2776
|
async keepAlive(sandboxId, durationMs) {
|
|
2756
2777
|
const sandbox = await this.getInstance(sandboxId);
|
|
2757
2778
|
try {
|
|
@@ -2912,6 +2933,9 @@ class DaytonaProvider {
|
|
|
2912
2933
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
2913
2934
|
}
|
|
2914
2935
|
}
|
|
2936
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
2937
|
+
throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
|
|
2938
|
+
}
|
|
2915
2939
|
async pause(_sandboxId) {
|
|
2916
2940
|
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
2917
2941
|
}
|
|
@@ -3140,6 +3164,9 @@ class ModalProvider {
|
|
|
3140
3164
|
async delete(sandboxId) {
|
|
3141
3165
|
await this.stop(sandboxId);
|
|
3142
3166
|
}
|
|
3167
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
3168
|
+
throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
|
|
3169
|
+
}
|
|
3143
3170
|
async pause(_sandboxId) {
|
|
3144
3171
|
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
3145
3172
|
}
|
|
@@ -3409,13 +3436,23 @@ __export(exports_agent_runner, {
|
|
|
3409
3436
|
stopAgent: () => stopAgent,
|
|
3410
3437
|
runAgent: () => runAgent
|
|
3411
3438
|
});
|
|
3439
|
+
async function fireWebhook(url, payload) {
|
|
3440
|
+
try {
|
|
3441
|
+
await fetch(url, {
|
|
3442
|
+
method: "POST",
|
|
3443
|
+
headers: { "Content-Type": "application/json" },
|
|
3444
|
+
body: JSON.stringify(payload)
|
|
3445
|
+
});
|
|
3446
|
+
} catch {}
|
|
3447
|
+
}
|
|
3412
3448
|
async function runAgent(sandboxId, opts) {
|
|
3413
3449
|
const sandbox = getSandbox(sandboxId);
|
|
3414
3450
|
if (!sandbox.provider_sandbox_id) {
|
|
3415
3451
|
throw new Error("Sandbox has no provider instance");
|
|
3416
3452
|
}
|
|
3417
3453
|
const provider = await getProvider(sandbox.provider);
|
|
3418
|
-
const
|
|
3454
|
+
const mergedEnv = { ...sandbox.env_vars, ...opts.callEnvVars };
|
|
3455
|
+
const env = Object.keys(mergedEnv).length > 0 ? mergedEnv : undefined;
|
|
3419
3456
|
let cmd;
|
|
3420
3457
|
const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
|
|
3421
3458
|
if (opts.command) {
|
|
@@ -3434,6 +3471,18 @@ async function runAgent(sandboxId, opts) {
|
|
|
3434
3471
|
command: cmd
|
|
3435
3472
|
});
|
|
3436
3473
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
3474
|
+
const startedAt = Date.now();
|
|
3475
|
+
const webhookEvents = opts.webhookEvents ?? ["start", "complete", "error"];
|
|
3476
|
+
if (opts.webhookUrl && webhookEvents.includes("start")) {
|
|
3477
|
+
fireWebhook(opts.webhookUrl, {
|
|
3478
|
+
event: "start",
|
|
3479
|
+
session_id: session.id,
|
|
3480
|
+
sandbox_id: sandbox.id,
|
|
3481
|
+
agent_type: opts.agentType,
|
|
3482
|
+
status: "running",
|
|
3483
|
+
timestamp: new Date().toISOString()
|
|
3484
|
+
});
|
|
3485
|
+
}
|
|
3437
3486
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
3438
3487
|
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
3439
3488
|
onStdout: (data) => {
|
|
@@ -3450,9 +3499,32 @@ async function runAgent(sandboxId, opts) {
|
|
|
3450
3499
|
const status = exitResult.exit_code === 0 ? "completed" : "failed";
|
|
3451
3500
|
endSession(session.id, exitResult.exit_code ?? 0, status);
|
|
3452
3501
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
|
|
3502
|
+
if (opts.webhookUrl && webhookEvents.includes("complete")) {
|
|
3503
|
+
fireWebhook(opts.webhookUrl, {
|
|
3504
|
+
event: "complete",
|
|
3505
|
+
session_id: session.id,
|
|
3506
|
+
sandbox_id: sandbox.id,
|
|
3507
|
+
agent_type: opts.agentType,
|
|
3508
|
+
status,
|
|
3509
|
+
exit_code: exitResult.exit_code,
|
|
3510
|
+
duration_ms: Date.now() - startedAt,
|
|
3511
|
+
timestamp: new Date().toISOString()
|
|
3512
|
+
});
|
|
3513
|
+
}
|
|
3453
3514
|
}).catch((err) => {
|
|
3454
3515
|
endSession(session.id, 1, "failed");
|
|
3455
3516
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
|
|
3517
|
+
if (opts.webhookUrl && webhookEvents.includes("error")) {
|
|
3518
|
+
fireWebhook(opts.webhookUrl, {
|
|
3519
|
+
event: "error",
|
|
3520
|
+
session_id: session.id,
|
|
3521
|
+
sandbox_id: sandbox.id,
|
|
3522
|
+
agent_type: opts.agentType,
|
|
3523
|
+
status: "failed",
|
|
3524
|
+
duration_ms: Date.now() - startedAt,
|
|
3525
|
+
timestamp: new Date().toISOString()
|
|
3526
|
+
});
|
|
3527
|
+
}
|
|
3456
3528
|
});
|
|
3457
3529
|
return session;
|
|
3458
3530
|
}
|
|
@@ -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;AA2MtC,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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface Snapshot {
|
|
2
|
+
id: string;
|
|
3
|
+
sandbox_id: string;
|
|
4
|
+
provider_sandbox_id: string;
|
|
5
|
+
provider: string;
|
|
6
|
+
name: string | null;
|
|
7
|
+
created_at: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SnapshotRow {
|
|
10
|
+
id: string;
|
|
11
|
+
sandbox_id: string;
|
|
12
|
+
provider_sandbox_id: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
name: string | null;
|
|
15
|
+
created_at: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class SnapshotNotFoundError extends Error {
|
|
18
|
+
constructor(id: string);
|
|
19
|
+
}
|
|
20
|
+
export declare function createSnapshot(input: {
|
|
21
|
+
sandbox_id: string;
|
|
22
|
+
provider_sandbox_id: string;
|
|
23
|
+
provider: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
}): Snapshot;
|
|
26
|
+
export declare function getSnapshot(id: string): Snapshot;
|
|
27
|
+
export declare function listSnapshots(sandboxId?: string): Snapshot[];
|
|
28
|
+
export declare function deleteSnapshot(id: string): void;
|
|
29
|
+
//# sourceMappingURL=snapshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../../src/db/snapshots.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,EAAE,EAAE,MAAM;CAIvB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,QAAQ,CASX;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,CAOhD;AAED,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAM5D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAK/C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export { registerAgent, getAgent, getAgentByName, listAgents, deleteAgent } from
|
|
|
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
9
|
export { createTemplate, getTemplate, getTemplateByName, listTemplates, deleteTemplate } from "./db/templates.js";
|
|
10
|
+
export { createSnapshot, getSnapshot, listSnapshots, deleteSnapshot } from "./db/snapshots.js";
|
|
11
|
+
export type { Snapshot, SnapshotRow } from "./db/snapshots.js";
|
|
12
|
+
export { SnapshotNotFoundError } from "./db/snapshots.js";
|
|
10
13
|
export { loadConfig, saveConfig, getDefaultProvider, getDefaultTimeout, getDefaultImage, getProviderApiKey, setConfigValue, getConfigValue } from "./lib/config.js";
|
|
11
14
|
export { getProvider } from "./providers/index.js";
|
|
12
15
|
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;AAC1F,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,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;AAClH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/F,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,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;AAG/F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -244,6 +244,15 @@ class E2BProvider {
|
|
|
244
244
|
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
|
+
async getPublicUrl(sandboxId, port, _protocol) {
|
|
248
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
249
|
+
try {
|
|
250
|
+
const host = sandbox.getHost(port);
|
|
251
|
+
return `https://${host}`;
|
|
252
|
+
} catch (err) {
|
|
253
|
+
throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
247
256
|
async keepAlive(sandboxId, durationMs) {
|
|
248
257
|
const sandbox = await this.getInstance(sandboxId);
|
|
249
258
|
try {
|
|
@@ -404,6 +413,9 @@ class DaytonaProvider {
|
|
|
404
413
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
405
414
|
}
|
|
406
415
|
}
|
|
416
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
417
|
+
throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
|
|
418
|
+
}
|
|
407
419
|
async pause(_sandboxId) {
|
|
408
420
|
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
409
421
|
}
|
|
@@ -632,6 +644,9 @@ class ModalProvider {
|
|
|
632
644
|
async delete(sandboxId) {
|
|
633
645
|
await this.stop(sandboxId);
|
|
634
646
|
}
|
|
647
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
648
|
+
throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
|
|
649
|
+
}
|
|
635
650
|
async pause(_sandboxId) {
|
|
636
651
|
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
637
652
|
}
|
|
@@ -848,6 +863,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
|
848
863
|
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
849
864
|
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
850
865
|
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
866
|
+
`,
|
|
867
|
+
`
|
|
868
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
869
|
+
id TEXT PRIMARY KEY,
|
|
870
|
+
sandbox_id TEXT NOT NULL,
|
|
871
|
+
provider_sandbox_id TEXT NOT NULL,
|
|
872
|
+
provider TEXT NOT NULL,
|
|
873
|
+
name TEXT,
|
|
874
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
875
|
+
);
|
|
876
|
+
CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
|
|
877
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (4);
|
|
851
878
|
`
|
|
852
879
|
];
|
|
853
880
|
var db = null;
|
|
@@ -1343,6 +1370,45 @@ function deleteTemplate(id) {
|
|
|
1343
1370
|
throw new TemplateNotFoundError(id);
|
|
1344
1371
|
db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
|
|
1345
1372
|
}
|
|
1373
|
+
// src/db/snapshots.ts
|
|
1374
|
+
class SnapshotNotFoundError extends Error {
|
|
1375
|
+
constructor(id) {
|
|
1376
|
+
super(`Snapshot not found: ${id}`);
|
|
1377
|
+
this.name = "SnapshotNotFoundError";
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
function createSnapshot(input) {
|
|
1381
|
+
const db2 = getDatabase();
|
|
1382
|
+
const id = uuid();
|
|
1383
|
+
const timestamp = now();
|
|
1384
|
+
db2.query(`INSERT INTO snapshots (id, sandbox_id, provider_sandbox_id, provider, name, created_at)
|
|
1385
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(id, input.sandbox_id, input.provider_sandbox_id, input.provider, input.name ?? null, timestamp);
|
|
1386
|
+
return getSnapshot(id);
|
|
1387
|
+
}
|
|
1388
|
+
function getSnapshot(id) {
|
|
1389
|
+
const db2 = getDatabase();
|
|
1390
|
+
const resolvedId = resolvePartialId("snapshots", id);
|
|
1391
|
+
if (!resolvedId)
|
|
1392
|
+
throw new SnapshotNotFoundError(id);
|
|
1393
|
+
const row = db2.query("SELECT * FROM snapshots WHERE id = ?").get(resolvedId);
|
|
1394
|
+
if (!row)
|
|
1395
|
+
throw new SnapshotNotFoundError(id);
|
|
1396
|
+
return row;
|
|
1397
|
+
}
|
|
1398
|
+
function listSnapshots(sandboxId) {
|
|
1399
|
+
const db2 = getDatabase();
|
|
1400
|
+
if (sandboxId) {
|
|
1401
|
+
return db2.query("SELECT * FROM snapshots WHERE sandbox_id = ? ORDER BY created_at DESC").all(sandboxId);
|
|
1402
|
+
}
|
|
1403
|
+
return db2.query("SELECT * FROM snapshots ORDER BY created_at DESC").all();
|
|
1404
|
+
}
|
|
1405
|
+
function deleteSnapshot(id) {
|
|
1406
|
+
const db2 = getDatabase();
|
|
1407
|
+
const resolvedId = resolvePartialId("snapshots", id);
|
|
1408
|
+
if (!resolvedId)
|
|
1409
|
+
throw new SnapshotNotFoundError(id);
|
|
1410
|
+
db2.query("DELETE FROM snapshots WHERE id = ?").run(resolvedId);
|
|
1411
|
+
}
|
|
1346
1412
|
// src/lib/config.ts
|
|
1347
1413
|
import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
1348
1414
|
import { dirname as dirname2, join as join2 } from "path";
|
|
@@ -1662,6 +1728,7 @@ export {
|
|
|
1662
1728
|
loadConfig,
|
|
1663
1729
|
listWebhooks,
|
|
1664
1730
|
listTemplates,
|
|
1731
|
+
listSnapshots,
|
|
1665
1732
|
listSessions,
|
|
1666
1733
|
listSandboxes,
|
|
1667
1734
|
listProjects,
|
|
@@ -1671,6 +1738,7 @@ export {
|
|
|
1671
1738
|
getWebhook,
|
|
1672
1739
|
getTemplateByName,
|
|
1673
1740
|
getTemplate,
|
|
1741
|
+
getSnapshot,
|
|
1674
1742
|
getSession,
|
|
1675
1743
|
getSandbox,
|
|
1676
1744
|
getProviderApiKey,
|
|
@@ -1690,12 +1758,14 @@ export {
|
|
|
1690
1758
|
emitLifecycleEvent,
|
|
1691
1759
|
deleteWebhook,
|
|
1692
1760
|
deleteTemplate,
|
|
1761
|
+
deleteSnapshot,
|
|
1693
1762
|
deleteSandbox,
|
|
1694
1763
|
deleteProject,
|
|
1695
1764
|
deleteAgent,
|
|
1696
1765
|
createWebhook,
|
|
1697
1766
|
createTemplate,
|
|
1698
1767
|
createStreamCollector,
|
|
1768
|
+
createSnapshot,
|
|
1699
1769
|
createSession,
|
|
1700
1770
|
createSandbox,
|
|
1701
1771
|
createProject,
|
|
@@ -1704,6 +1774,7 @@ export {
|
|
|
1704
1774
|
addEvent,
|
|
1705
1775
|
WebhookNotFoundError,
|
|
1706
1776
|
TemplateNotFoundError,
|
|
1777
|
+
SnapshotNotFoundError,
|
|
1707
1778
|
SessionNotFoundError,
|
|
1708
1779
|
SandboxNotFoundError,
|
|
1709
1780
|
SESSION_STATUSES,
|
|
@@ -6,6 +6,9 @@ export interface RunAgentOpts {
|
|
|
6
6
|
command?: string;
|
|
7
7
|
onStdout?: (data: string) => void;
|
|
8
8
|
onStderr?: (data: string) => void;
|
|
9
|
+
callEnvVars?: Record<string, string>;
|
|
10
|
+
webhookUrl?: string;
|
|
11
|
+
webhookEvents?: ('start' | 'complete' | 'error')[];
|
|
9
12
|
}
|
|
10
13
|
export declare function runAgent(sandboxId: string, opts: RunAgentOpts): Promise<SandboxSession>;
|
|
11
14
|
export declare function stopAgent(sandboxId: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAE/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;
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAE/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;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC;CACpD;AAcD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAyGzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhE"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -217,6 +217,15 @@ class E2BProvider {
|
|
|
217
217
|
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
async getPublicUrl(sandboxId, port, _protocol) {
|
|
221
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
222
|
+
try {
|
|
223
|
+
const host = sandbox.getHost(port);
|
|
224
|
+
return `https://${host}`;
|
|
225
|
+
} catch (err) {
|
|
226
|
+
throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
220
229
|
async keepAlive(sandboxId, durationMs) {
|
|
221
230
|
const sandbox = await this.getInstance(sandboxId);
|
|
222
231
|
try {
|
|
@@ -377,6 +386,9 @@ class DaytonaProvider {
|
|
|
377
386
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
378
387
|
}
|
|
379
388
|
}
|
|
389
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
390
|
+
throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
|
|
391
|
+
}
|
|
380
392
|
async pause(_sandboxId) {
|
|
381
393
|
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
382
394
|
}
|
|
@@ -605,6 +617,9 @@ class ModalProvider {
|
|
|
605
617
|
async delete(sandboxId) {
|
|
606
618
|
await this.stop(sandboxId);
|
|
607
619
|
}
|
|
620
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
621
|
+
throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
|
|
622
|
+
}
|
|
608
623
|
async pause(_sandboxId) {
|
|
609
624
|
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
610
625
|
}
|
|
@@ -4795,6 +4810,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
|
4795
4810
|
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
4796
4811
|
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
4797
4812
|
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
4813
|
+
`,
|
|
4814
|
+
`
|
|
4815
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
4816
|
+
id TEXT PRIMARY KEY,
|
|
4817
|
+
sandbox_id TEXT NOT NULL,
|
|
4818
|
+
provider_sandbox_id TEXT NOT NULL,
|
|
4819
|
+
provider TEXT NOT NULL,
|
|
4820
|
+
name TEXT,
|
|
4821
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
4822
|
+
);
|
|
4823
|
+
CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
|
|
4824
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (4);
|
|
4798
4825
|
`
|
|
4799
4826
|
];
|
|
4800
4827
|
var db = null;
|
|
@@ -5183,6 +5210,46 @@ function deleteTemplate(id) {
|
|
|
5183
5210
|
db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
|
|
5184
5211
|
}
|
|
5185
5212
|
|
|
5213
|
+
// src/db/snapshots.ts
|
|
5214
|
+
class SnapshotNotFoundError extends Error {
|
|
5215
|
+
constructor(id) {
|
|
5216
|
+
super(`Snapshot not found: ${id}`);
|
|
5217
|
+
this.name = "SnapshotNotFoundError";
|
|
5218
|
+
}
|
|
5219
|
+
}
|
|
5220
|
+
function createSnapshot(input) {
|
|
5221
|
+
const db2 = getDatabase();
|
|
5222
|
+
const id = uuid();
|
|
5223
|
+
const timestamp = now();
|
|
5224
|
+
db2.query(`INSERT INTO snapshots (id, sandbox_id, provider_sandbox_id, provider, name, created_at)
|
|
5225
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(id, input.sandbox_id, input.provider_sandbox_id, input.provider, input.name ?? null, timestamp);
|
|
5226
|
+
return getSnapshot(id);
|
|
5227
|
+
}
|
|
5228
|
+
function getSnapshot(id) {
|
|
5229
|
+
const db2 = getDatabase();
|
|
5230
|
+
const resolvedId = resolvePartialId("snapshots", id);
|
|
5231
|
+
if (!resolvedId)
|
|
5232
|
+
throw new SnapshotNotFoundError(id);
|
|
5233
|
+
const row = db2.query("SELECT * FROM snapshots WHERE id = ?").get(resolvedId);
|
|
5234
|
+
if (!row)
|
|
5235
|
+
throw new SnapshotNotFoundError(id);
|
|
5236
|
+
return row;
|
|
5237
|
+
}
|
|
5238
|
+
function listSnapshots(sandboxId) {
|
|
5239
|
+
const db2 = getDatabase();
|
|
5240
|
+
if (sandboxId) {
|
|
5241
|
+
return db2.query("SELECT * FROM snapshots WHERE sandbox_id = ? ORDER BY created_at DESC").all(sandboxId);
|
|
5242
|
+
}
|
|
5243
|
+
return db2.query("SELECT * FROM snapshots ORDER BY created_at DESC").all();
|
|
5244
|
+
}
|
|
5245
|
+
function deleteSnapshot(id) {
|
|
5246
|
+
const db2 = getDatabase();
|
|
5247
|
+
const resolvedId = resolvePartialId("snapshots", id);
|
|
5248
|
+
if (!resolvedId)
|
|
5249
|
+
throw new SnapshotNotFoundError(id);
|
|
5250
|
+
db2.query("DELETE FROM snapshots WHERE id = ?").run(resolvedId);
|
|
5251
|
+
}
|
|
5252
|
+
|
|
5186
5253
|
// src/providers/index.ts
|
|
5187
5254
|
init_types();
|
|
5188
5255
|
|
|
@@ -5426,13 +5493,23 @@ function getAgentDriver(name) {
|
|
|
5426
5493
|
}
|
|
5427
5494
|
|
|
5428
5495
|
// src/lib/agent-runner.ts
|
|
5496
|
+
async function fireWebhook(url, payload) {
|
|
5497
|
+
try {
|
|
5498
|
+
await fetch(url, {
|
|
5499
|
+
method: "POST",
|
|
5500
|
+
headers: { "Content-Type": "application/json" },
|
|
5501
|
+
body: JSON.stringify(payload)
|
|
5502
|
+
});
|
|
5503
|
+
} catch {}
|
|
5504
|
+
}
|
|
5429
5505
|
async function runAgent(sandboxId, opts) {
|
|
5430
5506
|
const sandbox = getSandbox(sandboxId);
|
|
5431
5507
|
if (!sandbox.provider_sandbox_id) {
|
|
5432
5508
|
throw new Error("Sandbox has no provider instance");
|
|
5433
5509
|
}
|
|
5434
5510
|
const provider = await getProvider(sandbox.provider);
|
|
5435
|
-
const
|
|
5511
|
+
const mergedEnv = { ...sandbox.env_vars, ...opts.callEnvVars };
|
|
5512
|
+
const env = Object.keys(mergedEnv).length > 0 ? mergedEnv : undefined;
|
|
5436
5513
|
let cmd;
|
|
5437
5514
|
const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
|
|
5438
5515
|
if (opts.command) {
|
|
@@ -5451,6 +5528,18 @@ async function runAgent(sandboxId, opts) {
|
|
|
5451
5528
|
command: cmd
|
|
5452
5529
|
});
|
|
5453
5530
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
5531
|
+
const startedAt = Date.now();
|
|
5532
|
+
const webhookEvents = opts.webhookEvents ?? ["start", "complete", "error"];
|
|
5533
|
+
if (opts.webhookUrl && webhookEvents.includes("start")) {
|
|
5534
|
+
fireWebhook(opts.webhookUrl, {
|
|
5535
|
+
event: "start",
|
|
5536
|
+
session_id: session.id,
|
|
5537
|
+
sandbox_id: sandbox.id,
|
|
5538
|
+
agent_type: opts.agentType,
|
|
5539
|
+
status: "running",
|
|
5540
|
+
timestamp: new Date().toISOString()
|
|
5541
|
+
});
|
|
5542
|
+
}
|
|
5454
5543
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
5455
5544
|
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
5456
5545
|
onStdout: (data) => {
|
|
@@ -5467,9 +5556,32 @@ async function runAgent(sandboxId, opts) {
|
|
|
5467
5556
|
const status = exitResult.exit_code === 0 ? "completed" : "failed";
|
|
5468
5557
|
endSession(session.id, exitResult.exit_code ?? 0, status);
|
|
5469
5558
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
|
|
5559
|
+
if (opts.webhookUrl && webhookEvents.includes("complete")) {
|
|
5560
|
+
fireWebhook(opts.webhookUrl, {
|
|
5561
|
+
event: "complete",
|
|
5562
|
+
session_id: session.id,
|
|
5563
|
+
sandbox_id: sandbox.id,
|
|
5564
|
+
agent_type: opts.agentType,
|
|
5565
|
+
status,
|
|
5566
|
+
exit_code: exitResult.exit_code,
|
|
5567
|
+
duration_ms: Date.now() - startedAt,
|
|
5568
|
+
timestamp: new Date().toISOString()
|
|
5569
|
+
});
|
|
5570
|
+
}
|
|
5470
5571
|
}).catch((err) => {
|
|
5471
5572
|
endSession(session.id, 1, "failed");
|
|
5472
5573
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
|
|
5574
|
+
if (opts.webhookUrl && webhookEvents.includes("error")) {
|
|
5575
|
+
fireWebhook(opts.webhookUrl, {
|
|
5576
|
+
event: "error",
|
|
5577
|
+
session_id: session.id,
|
|
5578
|
+
sandbox_id: sandbox.id,
|
|
5579
|
+
agent_type: opts.agentType,
|
|
5580
|
+
status: "failed",
|
|
5581
|
+
duration_ms: Date.now() - startedAt,
|
|
5582
|
+
timestamp: new Date().toISOString()
|
|
5583
|
+
});
|
|
5584
|
+
}
|
|
5473
5585
|
});
|
|
5474
5586
|
return session;
|
|
5475
5587
|
}
|
|
@@ -5485,6 +5597,7 @@ async function stopAgent(sandboxId) {
|
|
|
5485
5597
|
}
|
|
5486
5598
|
|
|
5487
5599
|
// src/mcp/index.ts
|
|
5600
|
+
var exposedPorts = new Map;
|
|
5488
5601
|
function ok(data) {
|
|
5489
5602
|
return { content: [{ type: "text", text: JSON.stringify(data) }] };
|
|
5490
5603
|
}
|
|
@@ -5518,7 +5631,14 @@ var TOOL_CATALOG = [
|
|
|
5518
5631
|
{ name: "list_templates", description: "List all sandbox templates" },
|
|
5519
5632
|
{ name: "get_template", description: "Get a sandbox template by ID" },
|
|
5520
5633
|
{ name: "delete_template", description: "Delete a sandbox template" },
|
|
5521
|
-
{ name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" }
|
|
5634
|
+
{ name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" },
|
|
5635
|
+
{ name: "snapshot_sandbox", description: "Capture sandbox filesystem state as a snapshot" },
|
|
5636
|
+
{ name: "list_snapshots", description: "List filesystem snapshots" },
|
|
5637
|
+
{ name: "delete_snapshot", description: "Delete a snapshot" },
|
|
5638
|
+
{ name: "expose_port", description: "Forward a sandbox port and get a public URL" },
|
|
5639
|
+
{ name: "list_exposed_ports", description: "List all forwarded ports for a sandbox" },
|
|
5640
|
+
{ name: "close_port", description: "Stop forwarding a sandbox port" },
|
|
5641
|
+
{ name: "get_network_log", description: "Get outbound network connections from a sandbox" }
|
|
5522
5642
|
];
|
|
5523
5643
|
var server = new McpServer({
|
|
5524
5644
|
name: "sandboxes",
|
|
@@ -5532,7 +5652,9 @@ server.tool("create_sandbox", "Create a new sandbox", {
|
|
|
5532
5652
|
env_vars: exports_external.record(exports_external.string()).optional().describe("Environment variables"),
|
|
5533
5653
|
template_id: exports_external.string().optional().describe("Template ID to base this sandbox on"),
|
|
5534
5654
|
on_timeout: exports_external.enum(["pause", "terminate"]).optional().describe("What to do on timeout: pause (saves state) or terminate"),
|
|
5535
|
-
auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect")
|
|
5655
|
+
auto_resume: exports_external.boolean().optional().describe("Auto-resume paused sandbox on next connect"),
|
|
5656
|
+
snapshot_id: exports_external.string().optional().describe("Snapshot ID to restore from"),
|
|
5657
|
+
network: exports_external.enum(["full", "restricted", "none"]).optional().describe("Network access policy for the sandbox")
|
|
5536
5658
|
}, async (params) => {
|
|
5537
5659
|
try {
|
|
5538
5660
|
const providerName = params.provider ?? getDefaultProvider();
|
|
@@ -5554,9 +5676,20 @@ server.tool("create_sandbox", "Create a new sandbox", {
|
|
|
5554
5676
|
env_vars: envVars,
|
|
5555
5677
|
on_timeout: onTimeout,
|
|
5556
5678
|
auto_resume: autoResume,
|
|
5557
|
-
template_id: params.template_id
|
|
5679
|
+
template_id: params.template_id,
|
|
5680
|
+
config: { network: params.network ?? "full" }
|
|
5558
5681
|
});
|
|
5559
5682
|
const provider = await getProvider(providerName);
|
|
5683
|
+
if (params.snapshot_id) {
|
|
5684
|
+
const snapshot = getSnapshot(params.snapshot_id);
|
|
5685
|
+
await provider.resume(snapshot.provider_sandbox_id);
|
|
5686
|
+
const updated2 = updateSandbox(sandbox.id, {
|
|
5687
|
+
provider_sandbox_id: snapshot.provider_sandbox_id,
|
|
5688
|
+
status: "running"
|
|
5689
|
+
});
|
|
5690
|
+
emitLifecycleEvent(sandbox.id, `Sandbox restored from snapshot ${snapshot.id}`);
|
|
5691
|
+
return ok(updated2);
|
|
5692
|
+
}
|
|
5560
5693
|
const result = await provider.create({
|
|
5561
5694
|
image,
|
|
5562
5695
|
timeout,
|
|
@@ -5652,7 +5785,8 @@ server.tool("keep_alive", "Extend sandbox lifetime", {
|
|
|
5652
5785
|
server.tool("exec_command", "Execute a command in a sandbox", {
|
|
5653
5786
|
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
|
|
5654
5787
|
command: exports_external.string().describe("Command to execute"),
|
|
5655
|
-
background: exports_external.boolean().optional().describe("Run in background")
|
|
5788
|
+
background: exports_external.boolean().optional().describe("Run in background"),
|
|
5789
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Per-call environment variables (merged with sandbox env_vars, not persisted)")
|
|
5656
5790
|
}, async (params) => {
|
|
5657
5791
|
try {
|
|
5658
5792
|
const sandbox = getSandbox(params.sandbox_id);
|
|
@@ -5664,7 +5798,8 @@ server.tool("exec_command", "Execute a command in a sandbox", {
|
|
|
5664
5798
|
});
|
|
5665
5799
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
5666
5800
|
const provider = await getProvider(sandbox.provider);
|
|
5667
|
-
const
|
|
5801
|
+
const callEnv = { ...sandbox.env_vars, ...params.env_vars };
|
|
5802
|
+
const env = Object.keys(callEnv).length > 0 ? callEnv : undefined;
|
|
5668
5803
|
if (params.background) {
|
|
5669
5804
|
provider.exec(sandbox.provider_sandbox_id, params.command, {
|
|
5670
5805
|
onStdout: collector.onStdout,
|
|
@@ -5815,14 +5950,20 @@ server.tool("run_agent", "Run an AI agent inside a sandbox", {
|
|
|
5815
5950
|
agent_type: exports_external.enum(["claude", "codex", "gemini", "opencode", "pi", "custom"]).describe("Agent type"),
|
|
5816
5951
|
prompt: exports_external.string().describe("Prompt for the agent"),
|
|
5817
5952
|
agent_name: exports_external.string().optional().describe("Agent name"),
|
|
5818
|
-
command: exports_external.string().optional().describe("Custom command (for 'custom' type)")
|
|
5953
|
+
command: exports_external.string().optional().describe("Custom command (for 'custom' type)"),
|
|
5954
|
+
env_vars: exports_external.record(exports_external.string()).optional().describe("Per-call environment variables (merged with sandbox env_vars, not persisted)"),
|
|
5955
|
+
webhook_url: exports_external.string().optional().describe("URL to POST result to when agent finishes"),
|
|
5956
|
+
webhook_events: exports_external.array(exports_external.enum(["start", "complete", "error"])).optional().describe("Which events to notify on (default: all)")
|
|
5819
5957
|
}, async (params) => {
|
|
5820
5958
|
try {
|
|
5821
5959
|
const session = await runAgent(params.sandbox_id, {
|
|
5822
5960
|
agentType: params.agent_type,
|
|
5823
5961
|
prompt: params.prompt,
|
|
5824
5962
|
agentName: params.agent_name,
|
|
5825
|
-
command: params.command
|
|
5963
|
+
command: params.command,
|
|
5964
|
+
callEnvVars: params.env_vars,
|
|
5965
|
+
webhookUrl: params.webhook_url,
|
|
5966
|
+
webhookEvents: params.webhook_events
|
|
5826
5967
|
});
|
|
5827
5968
|
return ok({ session_id: session.id, status: session.status });
|
|
5828
5969
|
} catch (e) {
|
|
@@ -5842,17 +5983,19 @@ server.tool("stop_agent", "Stop a running agent in a sandbox", {
|
|
|
5842
5983
|
server.tool("get_agent_output", "Get output from an agent session", {
|
|
5843
5984
|
sandbox_id: exports_external.string().describe("Sandbox ID"),
|
|
5844
5985
|
session_id: exports_external.string().optional().describe("Session ID"),
|
|
5845
|
-
limit: exports_external.number().optional().describe("Max events")
|
|
5986
|
+
limit: exports_external.number().optional().describe("Max events"),
|
|
5987
|
+
offset: exports_external.number().optional().describe("Skip first N events (for incremental polling)")
|
|
5846
5988
|
}, async (params) => {
|
|
5847
5989
|
try {
|
|
5848
5990
|
const events = listEvents({
|
|
5849
5991
|
sandbox_id: params.sandbox_id,
|
|
5850
5992
|
session_id: params.session_id,
|
|
5851
|
-
limit: params.limit || 100
|
|
5993
|
+
limit: params.limit || 100,
|
|
5994
|
+
offset: params.offset
|
|
5852
5995
|
});
|
|
5853
5996
|
const stdout = events.filter((e) => e.type === "stdout").map((e) => e.data).join("");
|
|
5854
5997
|
const stderr = events.filter((e) => e.type === "stderr").map((e) => e.data).join("");
|
|
5855
|
-
return ok({ stdout, stderr, event_count: events.length });
|
|
5998
|
+
return ok({ stdout, stderr, event_count: events.length, next_offset: (params.offset ?? 0) + events.length });
|
|
5856
5999
|
} catch (e) {
|
|
5857
6000
|
return err(e);
|
|
5858
6001
|
}
|
|
@@ -5963,5 +6106,104 @@ server.tool("get_sandbox_status", "Get running processes, disk usage and uptime
|
|
|
5963
6106
|
return err(e);
|
|
5964
6107
|
}
|
|
5965
6108
|
});
|
|
6109
|
+
server.tool("snapshot_sandbox", "Capture sandbox filesystem state as a snapshot", {
|
|
6110
|
+
id: exports_external.string().describe("Sandbox ID or partial ID"),
|
|
6111
|
+
name: exports_external.string().optional().describe("Snapshot name")
|
|
6112
|
+
}, async (params) => {
|
|
6113
|
+
try {
|
|
6114
|
+
const sandbox = getSandbox(params.id);
|
|
6115
|
+
if (!sandbox.provider_sandbox_id)
|
|
6116
|
+
throw new Error("Sandbox has no provider ID");
|
|
6117
|
+
const provider = await getProvider(sandbox.provider);
|
|
6118
|
+
await provider.pause(sandbox.provider_sandbox_id);
|
|
6119
|
+
updateSandbox(sandbox.id, { status: "paused" });
|
|
6120
|
+
const snapshot = createSnapshot({
|
|
6121
|
+
sandbox_id: sandbox.id,
|
|
6122
|
+
provider_sandbox_id: sandbox.provider_sandbox_id,
|
|
6123
|
+
provider: sandbox.provider,
|
|
6124
|
+
name: params.name
|
|
6125
|
+
});
|
|
6126
|
+
emitLifecycleEvent(sandbox.id, `Snapshot created: ${snapshot.id}`);
|
|
6127
|
+
return ok(snapshot);
|
|
6128
|
+
} catch (e) {
|
|
6129
|
+
return err(e);
|
|
6130
|
+
}
|
|
6131
|
+
});
|
|
6132
|
+
server.tool("list_snapshots", "List filesystem snapshots", {
|
|
6133
|
+
sandbox_id: exports_external.string().optional().describe("Filter by sandbox ID")
|
|
6134
|
+
}, async (params) => {
|
|
6135
|
+
try {
|
|
6136
|
+
return ok(listSnapshots(params.sandbox_id));
|
|
6137
|
+
} catch (e) {
|
|
6138
|
+
return err(e);
|
|
6139
|
+
}
|
|
6140
|
+
});
|
|
6141
|
+
server.tool("delete_snapshot", "Delete a snapshot", {
|
|
6142
|
+
id: exports_external.string().describe("Snapshot ID or partial ID")
|
|
6143
|
+
}, async (params) => {
|
|
6144
|
+
try {
|
|
6145
|
+
deleteSnapshot(params.id);
|
|
6146
|
+
return ok({ deleted: params.id });
|
|
6147
|
+
} catch (e) {
|
|
6148
|
+
return err(e);
|
|
6149
|
+
}
|
|
6150
|
+
});
|
|
6151
|
+
server.tool("expose_port", "Forward a sandbox port and get a public URL", {
|
|
6152
|
+
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
|
|
6153
|
+
port: exports_external.number().describe("Port number to expose"),
|
|
6154
|
+
protocol: exports_external.string().optional().describe("Protocol: http or ws (default: http)")
|
|
6155
|
+
}, async (params) => {
|
|
6156
|
+
try {
|
|
6157
|
+
const sandbox = getSandbox(params.sandbox_id);
|
|
6158
|
+
if (!sandbox.provider_sandbox_id)
|
|
6159
|
+
throw new Error("Sandbox has no provider ID");
|
|
6160
|
+
const provider = await getProvider(sandbox.provider);
|
|
6161
|
+
const url = await provider.getPublicUrl(sandbox.provider_sandbox_id, params.port, params.protocol);
|
|
6162
|
+
if (!exposedPorts.has(sandbox.id))
|
|
6163
|
+
exposedPorts.set(sandbox.id, new Map);
|
|
6164
|
+
exposedPorts.get(sandbox.id).set(params.port, url);
|
|
6165
|
+
return ok({ sandbox_id: sandbox.id, port: params.port, url });
|
|
6166
|
+
} catch (e) {
|
|
6167
|
+
return err(e);
|
|
6168
|
+
}
|
|
6169
|
+
});
|
|
6170
|
+
server.tool("list_exposed_ports", "List all forwarded ports for a sandbox", {
|
|
6171
|
+
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
6172
|
+
}, async (params) => {
|
|
6173
|
+
try {
|
|
6174
|
+
const sandbox = getSandbox(params.sandbox_id);
|
|
6175
|
+
const ports = exposedPorts.get(sandbox.id) ?? new Map;
|
|
6176
|
+
const result = Array.from(ports.entries()).map(([port, url]) => ({ port, url }));
|
|
6177
|
+
return ok(result);
|
|
6178
|
+
} catch (e) {
|
|
6179
|
+
return err(e);
|
|
6180
|
+
}
|
|
6181
|
+
});
|
|
6182
|
+
server.tool("close_port", "Stop forwarding a sandbox port", {
|
|
6183
|
+
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID"),
|
|
6184
|
+
port: exports_external.number().describe("Port number to close")
|
|
6185
|
+
}, async (params) => {
|
|
6186
|
+
try {
|
|
6187
|
+
const sandbox = getSandbox(params.sandbox_id);
|
|
6188
|
+
exposedPorts.get(sandbox.id)?.delete(params.port);
|
|
6189
|
+
return ok({ sandbox_id: sandbox.id, port: params.port, closed: true });
|
|
6190
|
+
} catch (e) {
|
|
6191
|
+
return err(e);
|
|
6192
|
+
}
|
|
6193
|
+
});
|
|
6194
|
+
server.tool("get_network_log", "Get outbound network connections from a sandbox", {
|
|
6195
|
+
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
6196
|
+
}, async (params) => {
|
|
6197
|
+
try {
|
|
6198
|
+
const sandbox = getSandbox(params.sandbox_id);
|
|
6199
|
+
if (!sandbox.provider_sandbox_id)
|
|
6200
|
+
throw new Error("Sandbox has no provider ID");
|
|
6201
|
+
const provider = await getProvider(sandbox.provider);
|
|
6202
|
+
const result = await provider.exec(sandbox.provider_sandbox_id, "ss -tnp 2>/dev/null || netstat -tnp 2>/dev/null || echo 'Network log not available'");
|
|
6203
|
+
return ok({ sandbox_id: sandbox.id, connections: (result.stdout || "").trim() });
|
|
6204
|
+
} catch (e) {
|
|
6205
|
+
return err(e);
|
|
6206
|
+
}
|
|
6207
|
+
});
|
|
5966
6208
|
var transport = new StdioServerTransport;
|
|
5967
6209
|
await server.connect(transport);
|
|
@@ -12,6 +12,7 @@ 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
|
+
getPublicUrl(_sandboxId: string, _port: number, _protocol?: string): Promise<string>;
|
|
15
16
|
pause(_sandboxId: string): Promise<void>;
|
|
16
17
|
resume(_sandboxId: string): Promise<void>;
|
|
17
18
|
keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
|
|
@@ -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,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"}
|
|
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,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpF,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
|
@@ -14,6 +14,7 @@ export declare class E2BProvider implements SandboxProvider {
|
|
|
14
14
|
delete(sandboxId: string): Promise<void>;
|
|
15
15
|
pause(sandboxId: string): Promise<void>;
|
|
16
16
|
resume(sandboxId: string): Promise<void>;
|
|
17
|
+
getPublicUrl(sandboxId: string, port: number, _protocol?: string): Promise<string>;
|
|
17
18
|
keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
|
|
18
19
|
}
|
|
19
20
|
//# 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;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"}
|
|
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,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvE"}
|
|
@@ -15,6 +15,7 @@ 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
|
+
getPublicUrl(_sandboxId: string, _port: number, _protocol?: string): Promise<string>;
|
|
18
19
|
pause(_sandboxId: string): Promise<void>;
|
|
19
20
|
resume(_sandboxId: string): Promise<void>;
|
|
20
21
|
keepAlive(_sandboxId: string, _durationMs?: number): Promise<void>;
|
|
@@ -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,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"}
|
|
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,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpF,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"}
|
|
@@ -30,5 +30,6 @@ export interface SandboxProvider {
|
|
|
30
30
|
keepAlive(sandboxId: string, durationMs?: number): Promise<void>;
|
|
31
31
|
pause(sandboxId: string): Promise<void>;
|
|
32
32
|
resume(sandboxId: string): Promise<void>;
|
|
33
|
+
getPublicUrl(sandboxId: string, port: number, protocol?: string): Promise<string>;
|
|
33
34
|
}
|
|
34
35
|
//# 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;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;
|
|
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;IAEzC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnF"}
|
package/dist/server/index.js
CHANGED
|
@@ -217,6 +217,15 @@ class E2BProvider {
|
|
|
217
217
|
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
|
+
async getPublicUrl(sandboxId, port, _protocol) {
|
|
221
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
222
|
+
try {
|
|
223
|
+
const host = sandbox.getHost(port);
|
|
224
|
+
return `https://${host}`;
|
|
225
|
+
} catch (err) {
|
|
226
|
+
throw new ProviderError("e2b", `Failed to get public URL for port ${port}: ${err.message}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
220
229
|
async keepAlive(sandboxId, durationMs) {
|
|
221
230
|
const sandbox = await this.getInstance(sandboxId);
|
|
222
231
|
try {
|
|
@@ -377,6 +386,9 @@ class DaytonaProvider {
|
|
|
377
386
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
378
387
|
}
|
|
379
388
|
}
|
|
389
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
390
|
+
throw new ProviderError("daytona", "Port forwarding not supported by Daytona provider");
|
|
391
|
+
}
|
|
380
392
|
async pause(_sandboxId) {
|
|
381
393
|
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
382
394
|
}
|
|
@@ -605,6 +617,9 @@ class ModalProvider {
|
|
|
605
617
|
async delete(sandboxId) {
|
|
606
618
|
await this.stop(sandboxId);
|
|
607
619
|
}
|
|
620
|
+
async getPublicUrl(_sandboxId, _port, _protocol) {
|
|
621
|
+
throw new ProviderError("modal", "Port forwarding not supported by Modal provider");
|
|
622
|
+
}
|
|
608
623
|
async pause(_sandboxId) {
|
|
609
624
|
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
610
625
|
}
|
|
@@ -821,6 +836,18 @@ ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
|
821
836
|
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
822
837
|
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
823
838
|
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
839
|
+
`,
|
|
840
|
+
`
|
|
841
|
+
CREATE TABLE IF NOT EXISTS snapshots (
|
|
842
|
+
id TEXT PRIMARY KEY,
|
|
843
|
+
sandbox_id TEXT NOT NULL,
|
|
844
|
+
provider_sandbox_id TEXT NOT NULL,
|
|
845
|
+
provider TEXT NOT NULL,
|
|
846
|
+
name TEXT,
|
|
847
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
848
|
+
);
|
|
849
|
+
CREATE INDEX IF NOT EXISTS idx_snapshots_sandbox ON snapshots(sandbox_id);
|
|
850
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (4);
|
|
824
851
|
`
|
|
825
852
|
];
|
|
826
853
|
var db = null;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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,oEAAqE,CAAC;AAC9F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,qDAKd,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
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,oEAAqE,CAAC;AAC9F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,qDAKd,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,CAAC;CAC1C;AAID,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE;QACV,GAAG,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3B,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAChD,KAAK,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9B,CAAC;CACH;AAID,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,EAAE,MAAM,CAAC;gBACL,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK9C;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,EAAE,EAAE,MAAM;CAIvB;AAID,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/sandboxes",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"author": "Andrei Hasna <andrei@hasna.com>",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -10,7 +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.
|
|
13
|
+
"@hasna/sandboxes": "^0.1.7",
|
|
14
14
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
15
15
|
"chalk": "^5.4.1",
|
|
16
16
|
"commander": "^13.1.0",
|