@hasna/sandboxes 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +146 -11
- package/dist/db/database.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +133 -1
- package/dist/lib/agent-runner.d.ts.map +1 -1
- package/dist/lib/agents/claude.d.ts +10 -0
- package/dist/lib/agents/claude.d.ts.map +1 -0
- package/dist/lib/agents/codex.d.ts +10 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/index.d.ts +5 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/opencode.d.ts +10 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/pi.d.ts +10 -0
- package/dist/lib/agents/pi.d.ts.map +1 -0
- package/dist/lib/agents/types.d.ts +23 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/mcp/index.js +179 -12
- package/dist/server/index.js +19 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/cli/index.js
CHANGED
|
@@ -2244,6 +2244,25 @@ CREATE TABLE IF NOT EXISTS templates (
|
|
|
2244
2244
|
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
2245
2245
|
|
|
2246
2246
|
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
2247
|
+
`,
|
|
2248
|
+
`
|
|
2249
|
+
CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
|
|
2250
|
+
id TEXT PRIMARY KEY,
|
|
2251
|
+
sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
|
|
2252
|
+
agent_name TEXT,
|
|
2253
|
+
agent_type TEXT,
|
|
2254
|
+
command TEXT,
|
|
2255
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
|
|
2256
|
+
exit_code INTEGER,
|
|
2257
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
2258
|
+
ended_at TEXT
|
|
2259
|
+
);
|
|
2260
|
+
INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
|
|
2261
|
+
DROP TABLE sandbox_sessions;
|
|
2262
|
+
ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
2263
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
2264
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
2265
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
2247
2266
|
`
|
|
2248
2267
|
];
|
|
2249
2268
|
});
|
|
@@ -3272,6 +3291,118 @@ var init_stream = __esm(() => {
|
|
|
3272
3291
|
listeners = new Map;
|
|
3273
3292
|
});
|
|
3274
3293
|
|
|
3294
|
+
// src/lib/agents/claude.ts
|
|
3295
|
+
class ClaudeDriver {
|
|
3296
|
+
name = "claude";
|
|
3297
|
+
requiredEnvVars = ["ANTHROPIC_API_KEY"];
|
|
3298
|
+
async install(provider, providerSandboxId) {
|
|
3299
|
+
const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
|
|
3300
|
+
if (check.stdout.trim() !== "MISSING")
|
|
3301
|
+
return;
|
|
3302
|
+
await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
|
|
3303
|
+
}
|
|
3304
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
3305
|
+
const config = JSON.stringify({
|
|
3306
|
+
hasCompletedOnboarding: true,
|
|
3307
|
+
hasTrustDialogAccepted: true,
|
|
3308
|
+
hasAcknowledgedCostThreshold: true
|
|
3309
|
+
});
|
|
3310
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
|
|
3311
|
+
}
|
|
3312
|
+
buildCommand(prompt) {
|
|
3313
|
+
return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
|
|
3314
|
+
}
|
|
3315
|
+
}
|
|
3316
|
+
|
|
3317
|
+
// src/lib/agents/codex.ts
|
|
3318
|
+
class CodexDriver {
|
|
3319
|
+
name = "codex";
|
|
3320
|
+
requiredEnvVars = ["OPENAI_API_KEY"];
|
|
3321
|
+
async install(provider, providerSandboxId) {
|
|
3322
|
+
const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
|
|
3323
|
+
if (check.stdout.trim() !== "MISSING")
|
|
3324
|
+
return;
|
|
3325
|
+
await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
|
|
3326
|
+
}
|
|
3327
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
3328
|
+
const config = `[core]
|
|
3329
|
+
approvalMode = "full-auto"
|
|
3330
|
+
quiet = true
|
|
3331
|
+
`;
|
|
3332
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
|
|
3333
|
+
}
|
|
3334
|
+
buildCommand(prompt) {
|
|
3335
|
+
return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
|
|
3336
|
+
}
|
|
3337
|
+
}
|
|
3338
|
+
|
|
3339
|
+
// src/lib/agents/gemini.ts
|
|
3340
|
+
class GeminiDriver {
|
|
3341
|
+
name = "gemini";
|
|
3342
|
+
requiredEnvVars = ["GEMINI_API_KEY"];
|
|
3343
|
+
async install(provider, providerSandboxId) {
|
|
3344
|
+
const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
|
|
3345
|
+
if (check.stdout.trim() !== "MISSING")
|
|
3346
|
+
return;
|
|
3347
|
+
await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
|
|
3348
|
+
}
|
|
3349
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
3350
|
+
const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
|
|
3351
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
|
|
3352
|
+
}
|
|
3353
|
+
buildCommand(prompt) {
|
|
3354
|
+
return `gemini -p ${JSON.stringify(prompt)}`;
|
|
3355
|
+
}
|
|
3356
|
+
}
|
|
3357
|
+
|
|
3358
|
+
// src/lib/agents/opencode.ts
|
|
3359
|
+
class OpenCodeDriver {
|
|
3360
|
+
name = "opencode";
|
|
3361
|
+
requiredEnvVars = [];
|
|
3362
|
+
async install(provider, providerSandboxId) {
|
|
3363
|
+
const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
|
|
3364
|
+
if (check.stdout.trim() !== "MISSING")
|
|
3365
|
+
return;
|
|
3366
|
+
await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
|
|
3367
|
+
}
|
|
3368
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
3369
|
+
buildCommand(prompt) {
|
|
3370
|
+
return `opencode run ${JSON.stringify(prompt)}`;
|
|
3371
|
+
}
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3374
|
+
// src/lib/agents/pi.ts
|
|
3375
|
+
class PiDriver {
|
|
3376
|
+
name = "pi";
|
|
3377
|
+
requiredEnvVars = ["PI_API_KEY"];
|
|
3378
|
+
async install(provider, providerSandboxId) {
|
|
3379
|
+
const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
|
|
3380
|
+
if (check.stdout.trim() !== "MISSING")
|
|
3381
|
+
return;
|
|
3382
|
+
await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
|
|
3383
|
+
}
|
|
3384
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
3385
|
+
buildCommand(prompt) {
|
|
3386
|
+
return `pi ask ${JSON.stringify(prompt)}`;
|
|
3387
|
+
}
|
|
3388
|
+
}
|
|
3389
|
+
|
|
3390
|
+
// src/lib/agents/index.ts
|
|
3391
|
+
function getAgentDriver(name) {
|
|
3392
|
+
return DRIVER_MAP.get(name);
|
|
3393
|
+
}
|
|
3394
|
+
var DRIVERS, DRIVER_MAP;
|
|
3395
|
+
var init_agents = __esm(() => {
|
|
3396
|
+
DRIVERS = [
|
|
3397
|
+
new ClaudeDriver,
|
|
3398
|
+
new CodexDriver,
|
|
3399
|
+
new GeminiDriver,
|
|
3400
|
+
new OpenCodeDriver,
|
|
3401
|
+
new PiDriver
|
|
3402
|
+
];
|
|
3403
|
+
DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
|
|
3404
|
+
});
|
|
3405
|
+
|
|
3275
3406
|
// src/lib/agent-runner.ts
|
|
3276
3407
|
var exports_agent_runner = {};
|
|
3277
3408
|
__export(exports_agent_runner, {
|
|
@@ -3283,7 +3414,19 @@ async function runAgent(sandboxId, opts) {
|
|
|
3283
3414
|
if (!sandbox.provider_sandbox_id) {
|
|
3284
3415
|
throw new Error("Sandbox has no provider instance");
|
|
3285
3416
|
}
|
|
3286
|
-
const
|
|
3417
|
+
const provider = await getProvider(sandbox.provider);
|
|
3418
|
+
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
3419
|
+
let cmd;
|
|
3420
|
+
const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
|
|
3421
|
+
if (opts.command) {
|
|
3422
|
+
cmd = opts.command;
|
|
3423
|
+
} else if (driver) {
|
|
3424
|
+
await driver.install(provider, sandbox.provider_sandbox_id);
|
|
3425
|
+
await driver.configure(provider, sandbox.provider_sandbox_id, sandbox.env_vars ?? {});
|
|
3426
|
+
cmd = driver.buildCommand(opts.prompt);
|
|
3427
|
+
} else {
|
|
3428
|
+
cmd = opts.prompt;
|
|
3429
|
+
}
|
|
3287
3430
|
const session = createSession({
|
|
3288
3431
|
sandbox_id: sandbox.id,
|
|
3289
3432
|
agent_name: opts.agentName,
|
|
@@ -3292,8 +3435,6 @@ async function runAgent(sandboxId, opts) {
|
|
|
3292
3435
|
});
|
|
3293
3436
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
3294
3437
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
3295
|
-
const provider = await getProvider(sandbox.provider);
|
|
3296
|
-
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
3297
3438
|
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
3298
3439
|
onStdout: (data) => {
|
|
3299
3440
|
collector.onStdout(data);
|
|
@@ -3321,22 +3462,16 @@ async function stopAgent(sandboxId) {
|
|
|
3321
3462
|
return;
|
|
3322
3463
|
const provider = await getProvider(sandbox.provider);
|
|
3323
3464
|
try {
|
|
3324
|
-
await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini' || true");
|
|
3465
|
+
await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini\\|opencode\\|pi' || true");
|
|
3325
3466
|
} catch {}
|
|
3326
3467
|
emitLifecycleEvent(sandbox.id, "Agent stopped by user");
|
|
3327
3468
|
}
|
|
3328
|
-
var CLAUDE_ONBOARDING_SETUP, AGENT_COMMANDS;
|
|
3329
3469
|
var init_agent_runner = __esm(() => {
|
|
3330
3470
|
init_sandboxes();
|
|
3331
3471
|
init_sessions();
|
|
3332
3472
|
init_providers();
|
|
3333
3473
|
init_stream();
|
|
3334
|
-
|
|
3335
|
-
AGENT_COMMANDS = {
|
|
3336
|
-
claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
|
|
3337
|
-
codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
|
|
3338
|
-
gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
|
|
3339
|
-
};
|
|
3474
|
+
init_agents();
|
|
3340
3475
|
});
|
|
3341
3476
|
|
|
3342
3477
|
// node_modules/commander/esm.mjs
|
|
@@ -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;AA6LtC,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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { loadConfig, saveConfig, getDefaultProvider, getDefaultTimeout, getDefau
|
|
|
11
11
|
export { getProvider } from "./providers/index.js";
|
|
12
12
|
export type { SandboxProvider, ProviderSandbox, CreateSandboxOpts, ExecOptions } from "./providers/types.js";
|
|
13
13
|
export { createStreamCollector, addStreamListener, emitLifecycleEvent } from "./lib/stream.js";
|
|
14
|
+
export { getAgentDriver, listAgentDrivers } from "./lib/agents/index.js";
|
|
15
|
+
export type { AgentDriver } from "./lib/agents/types.js";
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
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;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"}
|
|
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;AAG/F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@ var init_types = __esm(() => {
|
|
|
45
45
|
"failed",
|
|
46
46
|
"killed"
|
|
47
47
|
];
|
|
48
|
-
AGENT_TYPES = ["claude", "codex", "gemini", "custom"];
|
|
48
|
+
AGENT_TYPES = ["claude", "codex", "gemini", "opencode", "pi", "custom"];
|
|
49
49
|
EVENT_TYPES = [
|
|
50
50
|
"stdout",
|
|
51
51
|
"stderr",
|
|
@@ -829,6 +829,25 @@ CREATE TABLE IF NOT EXISTS templates (
|
|
|
829
829
|
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
830
830
|
|
|
831
831
|
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
832
|
+
`,
|
|
833
|
+
`
|
|
834
|
+
CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
|
|
835
|
+
id TEXT PRIMARY KEY,
|
|
836
|
+
sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
|
|
837
|
+
agent_name TEXT,
|
|
838
|
+
agent_type TEXT,
|
|
839
|
+
command TEXT,
|
|
840
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
|
|
841
|
+
exit_code INTEGER,
|
|
842
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
843
|
+
ended_at TEXT
|
|
844
|
+
);
|
|
845
|
+
INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
|
|
846
|
+
DROP TABLE sandbox_sessions;
|
|
847
|
+
ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
848
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
849
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
850
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
832
851
|
`
|
|
833
852
|
];
|
|
834
853
|
var db = null;
|
|
@@ -1518,6 +1537,117 @@ function emitLifecycleEvent(sandboxId, message) {
|
|
|
1518
1537
|
});
|
|
1519
1538
|
notifyListeners(sandboxId, "lifecycle", message);
|
|
1520
1539
|
}
|
|
1540
|
+
// src/lib/agents/claude.ts
|
|
1541
|
+
class ClaudeDriver {
|
|
1542
|
+
name = "claude";
|
|
1543
|
+
requiredEnvVars = ["ANTHROPIC_API_KEY"];
|
|
1544
|
+
async install(provider, providerSandboxId) {
|
|
1545
|
+
const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
|
|
1546
|
+
if (check.stdout.trim() !== "MISSING")
|
|
1547
|
+
return;
|
|
1548
|
+
await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
|
|
1549
|
+
}
|
|
1550
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
1551
|
+
const config = JSON.stringify({
|
|
1552
|
+
hasCompletedOnboarding: true,
|
|
1553
|
+
hasTrustDialogAccepted: true,
|
|
1554
|
+
hasAcknowledgedCostThreshold: true
|
|
1555
|
+
});
|
|
1556
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
|
|
1557
|
+
}
|
|
1558
|
+
buildCommand(prompt) {
|
|
1559
|
+
return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
// src/lib/agents/codex.ts
|
|
1564
|
+
class CodexDriver {
|
|
1565
|
+
name = "codex";
|
|
1566
|
+
requiredEnvVars = ["OPENAI_API_KEY"];
|
|
1567
|
+
async install(provider, providerSandboxId) {
|
|
1568
|
+
const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
|
|
1569
|
+
if (check.stdout.trim() !== "MISSING")
|
|
1570
|
+
return;
|
|
1571
|
+
await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
|
|
1572
|
+
}
|
|
1573
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
1574
|
+
const config = `[core]
|
|
1575
|
+
approvalMode = "full-auto"
|
|
1576
|
+
quiet = true
|
|
1577
|
+
`;
|
|
1578
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
|
|
1579
|
+
}
|
|
1580
|
+
buildCommand(prompt) {
|
|
1581
|
+
return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
// src/lib/agents/gemini.ts
|
|
1586
|
+
class GeminiDriver {
|
|
1587
|
+
name = "gemini";
|
|
1588
|
+
requiredEnvVars = ["GEMINI_API_KEY"];
|
|
1589
|
+
async install(provider, providerSandboxId) {
|
|
1590
|
+
const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
|
|
1591
|
+
if (check.stdout.trim() !== "MISSING")
|
|
1592
|
+
return;
|
|
1593
|
+
await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
|
|
1594
|
+
}
|
|
1595
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
1596
|
+
const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
|
|
1597
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
|
|
1598
|
+
}
|
|
1599
|
+
buildCommand(prompt) {
|
|
1600
|
+
return `gemini -p ${JSON.stringify(prompt)}`;
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
// src/lib/agents/opencode.ts
|
|
1605
|
+
class OpenCodeDriver {
|
|
1606
|
+
name = "opencode";
|
|
1607
|
+
requiredEnvVars = [];
|
|
1608
|
+
async install(provider, providerSandboxId) {
|
|
1609
|
+
const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
|
|
1610
|
+
if (check.stdout.trim() !== "MISSING")
|
|
1611
|
+
return;
|
|
1612
|
+
await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
|
|
1613
|
+
}
|
|
1614
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
1615
|
+
buildCommand(prompt) {
|
|
1616
|
+
return `opencode run ${JSON.stringify(prompt)}`;
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
// src/lib/agents/pi.ts
|
|
1621
|
+
class PiDriver {
|
|
1622
|
+
name = "pi";
|
|
1623
|
+
requiredEnvVars = ["PI_API_KEY"];
|
|
1624
|
+
async install(provider, providerSandboxId) {
|
|
1625
|
+
const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
|
|
1626
|
+
if (check.stdout.trim() !== "MISSING")
|
|
1627
|
+
return;
|
|
1628
|
+
await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
|
|
1629
|
+
}
|
|
1630
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
1631
|
+
buildCommand(prompt) {
|
|
1632
|
+
return `pi ask ${JSON.stringify(prompt)}`;
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// src/lib/agents/index.ts
|
|
1637
|
+
var DRIVERS = [
|
|
1638
|
+
new ClaudeDriver,
|
|
1639
|
+
new CodexDriver,
|
|
1640
|
+
new GeminiDriver,
|
|
1641
|
+
new OpenCodeDriver,
|
|
1642
|
+
new PiDriver
|
|
1643
|
+
];
|
|
1644
|
+
var DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
|
|
1645
|
+
function getAgentDriver(name) {
|
|
1646
|
+
return DRIVER_MAP.get(name);
|
|
1647
|
+
}
|
|
1648
|
+
function listAgentDrivers() {
|
|
1649
|
+
return DRIVERS;
|
|
1650
|
+
}
|
|
1521
1651
|
export {
|
|
1522
1652
|
uuid,
|
|
1523
1653
|
updateSession,
|
|
@@ -1537,6 +1667,7 @@ export {
|
|
|
1537
1667
|
listProjects,
|
|
1538
1668
|
listEvents,
|
|
1539
1669
|
listAgents,
|
|
1670
|
+
listAgentDrivers,
|
|
1540
1671
|
getWebhook,
|
|
1541
1672
|
getTemplateByName,
|
|
1542
1673
|
getTemplate,
|
|
@@ -1551,6 +1682,7 @@ export {
|
|
|
1551
1682
|
getDefaultImage,
|
|
1552
1683
|
getDatabase,
|
|
1553
1684
|
getConfigValue,
|
|
1685
|
+
getAgentDriver,
|
|
1554
1686
|
getAgentByName,
|
|
1555
1687
|
getAgent,
|
|
1556
1688
|
ensureProject,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"
|
|
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;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CA8DzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
import type { AgentDriver } from "./types.js";
|
|
3
|
+
export declare class ClaudeDriver implements AgentDriver {
|
|
4
|
+
readonly name = "claude";
|
|
5
|
+
readonly requiredEnvVars: string[];
|
|
6
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
7
|
+
configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
|
|
8
|
+
buildCommand(prompt: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,eAAe,WAAyB;IAE3C,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
import type { AgentDriver } from "./types.js";
|
|
3
|
+
export declare class CodexDriver implements AgentDriver {
|
|
4
|
+
readonly name = "codex";
|
|
5
|
+
readonly requiredEnvVars: string[];
|
|
6
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
7
|
+
configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
|
|
8
|
+
buildCommand(prompt: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,eAAe,WAAsB;IAExC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAStH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
import type { AgentDriver } from "./types.js";
|
|
3
|
+
export declare class GeminiDriver implements AgentDriver {
|
|
4
|
+
readonly name = "gemini";
|
|
5
|
+
readonly requiredEnvVars: string[];
|
|
6
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
7
|
+
configure(provider: SandboxProvider, providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
|
|
8
|
+
buildCommand(prompt: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,eAAe,WAAsB;IAExC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAStH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,YAAY,EAAE,WAAW,EAAE,CAAC;AAc5B,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEpE;AAED,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAEhD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
import type { AgentDriver } from "./types.js";
|
|
3
|
+
export declare class OpenCodeDriver implements AgentDriver {
|
|
4
|
+
readonly name = "opencode";
|
|
5
|
+
readonly requiredEnvVars: never[];
|
|
6
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
7
|
+
configure(_provider: SandboxProvider, _providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
|
|
8
|
+
buildCommand(prompt: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,eAAe,UAAM;IAExB,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5E,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
import type { AgentDriver } from "./types.js";
|
|
3
|
+
export declare class PiDriver implements AgentDriver {
|
|
4
|
+
readonly name = "pi";
|
|
5
|
+
readonly requiredEnvVars: string[];
|
|
6
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
7
|
+
configure(_provider: SandboxProvider, _providerSandboxId: string, _envVars: Record<string, string>): Promise<void>;
|
|
8
|
+
buildCommand(prompt: string): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=pi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,QAAS,YAAW,WAAW;IAC1C,QAAQ,CAAC,IAAI,QAAQ;IACrB,QAAQ,CAAC,eAAe,WAAkB;IAEpC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5E,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SandboxProvider } from "../../providers/types.js";
|
|
2
|
+
export interface AgentDriver {
|
|
3
|
+
/** Agent identifier */
|
|
4
|
+
readonly name: string;
|
|
5
|
+
/** Environment variable keys this agent needs (checked against sandbox env_vars) */
|
|
6
|
+
readonly requiredEnvVars: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Ensure the agent CLI is installed in the sandbox.
|
|
9
|
+
* Should be idempotent — check before installing.
|
|
10
|
+
*/
|
|
11
|
+
install(provider: SandboxProvider, providerSandboxId: string): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Pre-seed config files / onboarding flags so the agent runs non-interactively.
|
|
14
|
+
* Called after install, before buildCommand.
|
|
15
|
+
*/
|
|
16
|
+
configure(provider: SandboxProvider, providerSandboxId: string, envVars: Record<string, string>): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Return the full CLI invocation string for this prompt.
|
|
19
|
+
* Must be non-interactive and must not require user input.
|
|
20
|
+
*/
|
|
21
|
+
buildCommand(prompt: string): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/agents/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,oFAAoF;IACpF,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAEnC;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7E;;;OAGG;IACH,SAAS,CACP,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACtC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -4776,6 +4776,25 @@ CREATE TABLE IF NOT EXISTS templates (
|
|
|
4776
4776
|
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
4777
4777
|
|
|
4778
4778
|
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
4779
|
+
`,
|
|
4780
|
+
`
|
|
4781
|
+
CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
|
|
4782
|
+
id TEXT PRIMARY KEY,
|
|
4783
|
+
sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
|
|
4784
|
+
agent_name TEXT,
|
|
4785
|
+
agent_type TEXT,
|
|
4786
|
+
command TEXT,
|
|
4787
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
|
|
4788
|
+
exit_code INTEGER,
|
|
4789
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
4790
|
+
ended_at TEXT
|
|
4791
|
+
);
|
|
4792
|
+
INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
|
|
4793
|
+
DROP TABLE sandbox_sessions;
|
|
4794
|
+
ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
4795
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
4796
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
4797
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
4779
4798
|
`
|
|
4780
4799
|
];
|
|
4781
4800
|
var db = null;
|
|
@@ -5297,19 +5316,134 @@ function emitLifecycleEvent(sandboxId, message) {
|
|
|
5297
5316
|
notifyListeners(sandboxId, "lifecycle", message);
|
|
5298
5317
|
}
|
|
5299
5318
|
|
|
5319
|
+
// src/lib/agents/claude.ts
|
|
5320
|
+
class ClaudeDriver {
|
|
5321
|
+
name = "claude";
|
|
5322
|
+
requiredEnvVars = ["ANTHROPIC_API_KEY"];
|
|
5323
|
+
async install(provider, providerSandboxId) {
|
|
5324
|
+
const check = await provider.exec(providerSandboxId, "which claude 2>/dev/null || echo MISSING");
|
|
5325
|
+
if (check.stdout.trim() !== "MISSING")
|
|
5326
|
+
return;
|
|
5327
|
+
await provider.exec(providerSandboxId, "npm install -g @anthropic-ai/claude-code 2>&1 || sudo npm install -g @anthropic-ai/claude-code 2>&1");
|
|
5328
|
+
}
|
|
5329
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
5330
|
+
const config = JSON.stringify({
|
|
5331
|
+
hasCompletedOnboarding: true,
|
|
5332
|
+
hasTrustDialogAccepted: true,
|
|
5333
|
+
hasAcknowledgedCostThreshold: true
|
|
5334
|
+
});
|
|
5335
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.claude && echo '${config}' > ~/.claude.json`);
|
|
5336
|
+
}
|
|
5337
|
+
buildCommand(prompt) {
|
|
5338
|
+
return `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`;
|
|
5339
|
+
}
|
|
5340
|
+
}
|
|
5341
|
+
|
|
5342
|
+
// src/lib/agents/codex.ts
|
|
5343
|
+
class CodexDriver {
|
|
5344
|
+
name = "codex";
|
|
5345
|
+
requiredEnvVars = ["OPENAI_API_KEY"];
|
|
5346
|
+
async install(provider, providerSandboxId) {
|
|
5347
|
+
const check = await provider.exec(providerSandboxId, "which codex 2>/dev/null || echo MISSING");
|
|
5348
|
+
if (check.stdout.trim() !== "MISSING")
|
|
5349
|
+
return;
|
|
5350
|
+
await provider.exec(providerSandboxId, "npm install -g @openai/codex 2>&1 || sudo npm install -g @openai/codex 2>&1");
|
|
5351
|
+
}
|
|
5352
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
5353
|
+
const config = `[core]
|
|
5354
|
+
approvalMode = "full-auto"
|
|
5355
|
+
quiet = true
|
|
5356
|
+
`;
|
|
5357
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.codex && printf '${config.replace(/'/g, "'\\''")}' > ~/.codex/config.toml`);
|
|
5358
|
+
}
|
|
5359
|
+
buildCommand(prompt) {
|
|
5360
|
+
return `codex --approval-mode full-auto -q ${JSON.stringify(prompt)}`;
|
|
5361
|
+
}
|
|
5362
|
+
}
|
|
5363
|
+
|
|
5364
|
+
// src/lib/agents/gemini.ts
|
|
5365
|
+
class GeminiDriver {
|
|
5366
|
+
name = "gemini";
|
|
5367
|
+
requiredEnvVars = ["GEMINI_API_KEY"];
|
|
5368
|
+
async install(provider, providerSandboxId) {
|
|
5369
|
+
const check = await provider.exec(providerSandboxId, "which gemini 2>/dev/null || echo MISSING");
|
|
5370
|
+
if (check.stdout.trim() !== "MISSING")
|
|
5371
|
+
return;
|
|
5372
|
+
await provider.exec(providerSandboxId, "npm install -g @google/gemini-cli 2>&1 || sudo npm install -g @google/gemini-cli 2>&1");
|
|
5373
|
+
}
|
|
5374
|
+
async configure(provider, providerSandboxId, _envVars) {
|
|
5375
|
+
const settings = JSON.stringify({ theme: "Default", selectedAuthType: "gemini-api-key" });
|
|
5376
|
+
await provider.exec(providerSandboxId, `mkdir -p ~/.gemini && echo '${settings}' > ~/.gemini/settings.json`);
|
|
5377
|
+
}
|
|
5378
|
+
buildCommand(prompt) {
|
|
5379
|
+
return `gemini -p ${JSON.stringify(prompt)}`;
|
|
5380
|
+
}
|
|
5381
|
+
}
|
|
5382
|
+
|
|
5383
|
+
// src/lib/agents/opencode.ts
|
|
5384
|
+
class OpenCodeDriver {
|
|
5385
|
+
name = "opencode";
|
|
5386
|
+
requiredEnvVars = [];
|
|
5387
|
+
async install(provider, providerSandboxId) {
|
|
5388
|
+
const check = await provider.exec(providerSandboxId, "which opencode 2>/dev/null || echo MISSING");
|
|
5389
|
+
if (check.stdout.trim() !== "MISSING")
|
|
5390
|
+
return;
|
|
5391
|
+
await provider.exec(providerSandboxId, "npm install -g opencode-ai 2>&1 || sudo npm install -g opencode-ai 2>&1");
|
|
5392
|
+
}
|
|
5393
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
5394
|
+
buildCommand(prompt) {
|
|
5395
|
+
return `opencode run ${JSON.stringify(prompt)}`;
|
|
5396
|
+
}
|
|
5397
|
+
}
|
|
5398
|
+
|
|
5399
|
+
// src/lib/agents/pi.ts
|
|
5400
|
+
class PiDriver {
|
|
5401
|
+
name = "pi";
|
|
5402
|
+
requiredEnvVars = ["PI_API_KEY"];
|
|
5403
|
+
async install(provider, providerSandboxId) {
|
|
5404
|
+
const check = await provider.exec(providerSandboxId, "which pi 2>/dev/null || echo MISSING");
|
|
5405
|
+
if (check.stdout.trim() !== "MISSING")
|
|
5406
|
+
return;
|
|
5407
|
+
await provider.exec(providerSandboxId, "npm install -g @pi-ai/cli 2>&1 || sudo npm install -g @pi-ai/cli 2>&1");
|
|
5408
|
+
}
|
|
5409
|
+
async configure(_provider, _providerSandboxId, _envVars) {}
|
|
5410
|
+
buildCommand(prompt) {
|
|
5411
|
+
return `pi ask ${JSON.stringify(prompt)}`;
|
|
5412
|
+
}
|
|
5413
|
+
}
|
|
5414
|
+
|
|
5415
|
+
// src/lib/agents/index.ts
|
|
5416
|
+
var DRIVERS = [
|
|
5417
|
+
new ClaudeDriver,
|
|
5418
|
+
new CodexDriver,
|
|
5419
|
+
new GeminiDriver,
|
|
5420
|
+
new OpenCodeDriver,
|
|
5421
|
+
new PiDriver
|
|
5422
|
+
];
|
|
5423
|
+
var DRIVER_MAP = new Map(DRIVERS.map((d) => [d.name, d]));
|
|
5424
|
+
function getAgentDriver(name) {
|
|
5425
|
+
return DRIVER_MAP.get(name);
|
|
5426
|
+
}
|
|
5427
|
+
|
|
5300
5428
|
// src/lib/agent-runner.ts
|
|
5301
|
-
var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
|
|
5302
|
-
var AGENT_COMMANDS = {
|
|
5303
|
-
claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
|
|
5304
|
-
codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
|
|
5305
|
-
gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
|
|
5306
|
-
};
|
|
5307
5429
|
async function runAgent(sandboxId, opts) {
|
|
5308
5430
|
const sandbox = getSandbox(sandboxId);
|
|
5309
5431
|
if (!sandbox.provider_sandbox_id) {
|
|
5310
5432
|
throw new Error("Sandbox has no provider instance");
|
|
5311
5433
|
}
|
|
5312
|
-
const
|
|
5434
|
+
const provider = await getProvider(sandbox.provider);
|
|
5435
|
+
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
5436
|
+
let cmd;
|
|
5437
|
+
const driver = opts.agentType !== "custom" ? getAgentDriver(opts.agentType) : undefined;
|
|
5438
|
+
if (opts.command) {
|
|
5439
|
+
cmd = opts.command;
|
|
5440
|
+
} else if (driver) {
|
|
5441
|
+
await driver.install(provider, sandbox.provider_sandbox_id);
|
|
5442
|
+
await driver.configure(provider, sandbox.provider_sandbox_id, sandbox.env_vars ?? {});
|
|
5443
|
+
cmd = driver.buildCommand(opts.prompt);
|
|
5444
|
+
} else {
|
|
5445
|
+
cmd = opts.prompt;
|
|
5446
|
+
}
|
|
5313
5447
|
const session = createSession({
|
|
5314
5448
|
sandbox_id: sandbox.id,
|
|
5315
5449
|
agent_name: opts.agentName,
|
|
@@ -5318,8 +5452,6 @@ async function runAgent(sandboxId, opts) {
|
|
|
5318
5452
|
});
|
|
5319
5453
|
emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
|
|
5320
5454
|
const collector = createStreamCollector(sandbox.id, session.id);
|
|
5321
|
-
const provider = await getProvider(sandbox.provider);
|
|
5322
|
-
const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
|
|
5323
5455
|
provider.exec(sandbox.provider_sandbox_id, cmd, {
|
|
5324
5456
|
onStdout: (data) => {
|
|
5325
5457
|
collector.onStdout(data);
|
|
@@ -5347,7 +5479,7 @@ async function stopAgent(sandboxId) {
|
|
|
5347
5479
|
return;
|
|
5348
5480
|
const provider = await getProvider(sandbox.provider);
|
|
5349
5481
|
try {
|
|
5350
|
-
await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini' || true");
|
|
5482
|
+
await provider.exec(sandbox.provider_sandbox_id, "pkill -f 'claude\\|codex\\|gemini\\|opencode\\|pi' || true");
|
|
5351
5483
|
} catch {}
|
|
5352
5484
|
emitLifecycleEvent(sandbox.id, "Agent stopped by user");
|
|
5353
5485
|
}
|
|
@@ -5385,7 +5517,8 @@ var TOOL_CATALOG = [
|
|
|
5385
5517
|
{ name: "create_template", description: "Create a reusable sandbox template" },
|
|
5386
5518
|
{ name: "list_templates", description: "List all sandbox templates" },
|
|
5387
5519
|
{ name: "get_template", description: "Get a sandbox template by ID" },
|
|
5388
|
-
{ name: "delete_template", description: "Delete a sandbox template" }
|
|
5520
|
+
{ name: "delete_template", description: "Delete a sandbox template" },
|
|
5521
|
+
{ name: "get_sandbox_status", description: "Get running processes, disk usage and uptime in a sandbox" }
|
|
5389
5522
|
];
|
|
5390
5523
|
var server = new McpServer({
|
|
5391
5524
|
name: "sandboxes",
|
|
@@ -5679,7 +5812,7 @@ server.tool("search_tools", "Search tools by keyword", {
|
|
|
5679
5812
|
});
|
|
5680
5813
|
server.tool("run_agent", "Run an AI agent inside a sandbox", {
|
|
5681
5814
|
sandbox_id: exports_external.string().describe("Sandbox ID"),
|
|
5682
|
-
agent_type: exports_external.enum(["claude", "codex", "gemini", "custom"]).describe("Agent type"),
|
|
5815
|
+
agent_type: exports_external.enum(["claude", "codex", "gemini", "opencode", "pi", "custom"]).describe("Agent type"),
|
|
5683
5816
|
prompt: exports_external.string().describe("Prompt for the agent"),
|
|
5684
5817
|
agent_name: exports_external.string().optional().describe("Agent name"),
|
|
5685
5818
|
command: exports_external.string().optional().describe("Custom command (for 'custom' type)")
|
|
@@ -5796,5 +5929,39 @@ server.tool("delete_template", "Delete a sandbox template", {
|
|
|
5796
5929
|
return err(e);
|
|
5797
5930
|
}
|
|
5798
5931
|
});
|
|
5932
|
+
server.tool("get_sandbox_status", "Get running processes, disk usage and uptime in a sandbox", {
|
|
5933
|
+
sandbox_id: exports_external.string().describe("Sandbox ID or partial ID")
|
|
5934
|
+
}, async (params) => {
|
|
5935
|
+
try {
|
|
5936
|
+
const sandbox = getSandbox(params.sandbox_id);
|
|
5937
|
+
if (!sandbox.provider_sandbox_id)
|
|
5938
|
+
throw new Error("Sandbox has no provider ID");
|
|
5939
|
+
const provider = await getProvider(sandbox.provider);
|
|
5940
|
+
const [psResult, dfResult, uptimeResult] = await Promise.all([
|
|
5941
|
+
provider.exec(sandbox.provider_sandbox_id, "ps aux --no-headers 2>/dev/null | head -30 || ps aux 2>/dev/null | tail -n +2 | head -30"),
|
|
5942
|
+
provider.exec(sandbox.provider_sandbox_id, "df -h / 2>/dev/null || df -h 2>/dev/null | head -5"),
|
|
5943
|
+
provider.exec(sandbox.provider_sandbox_id, "uptime 2>/dev/null || echo unknown")
|
|
5944
|
+
]);
|
|
5945
|
+
const processes = (psResult.stdout || "").trim().split(`
|
|
5946
|
+
`).filter(Boolean).map((line) => {
|
|
5947
|
+
const parts = line.trim().split(/\s+/);
|
|
5948
|
+
return {
|
|
5949
|
+
pid: parts[1] || "",
|
|
5950
|
+
cpu: parts[2] || "0",
|
|
5951
|
+
mem: parts[3] || "0",
|
|
5952
|
+
command: parts.slice(10).join(" ") || parts.slice(4).join(" ")
|
|
5953
|
+
};
|
|
5954
|
+
});
|
|
5955
|
+
return ok({
|
|
5956
|
+
sandbox_id: sandbox.id,
|
|
5957
|
+
status: sandbox.status,
|
|
5958
|
+
processes,
|
|
5959
|
+
disk: (dfResult.stdout || "").trim(),
|
|
5960
|
+
uptime: (uptimeResult.stdout || "").trim()
|
|
5961
|
+
});
|
|
5962
|
+
} catch (e) {
|
|
5963
|
+
return err(e);
|
|
5964
|
+
}
|
|
5965
|
+
});
|
|
5799
5966
|
var transport = new StdioServerTransport;
|
|
5800
5967
|
await server.connect(transport);
|
package/dist/server/index.js
CHANGED
|
@@ -802,6 +802,25 @@ CREATE TABLE IF NOT EXISTS templates (
|
|
|
802
802
|
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
803
803
|
|
|
804
804
|
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
805
|
+
`,
|
|
806
|
+
`
|
|
807
|
+
CREATE TABLE IF NOT EXISTS sandbox_sessions_new (
|
|
808
|
+
id TEXT PRIMARY KEY,
|
|
809
|
+
sandbox_id TEXT NOT NULL REFERENCES sandboxes(id) ON DELETE CASCADE,
|
|
810
|
+
agent_name TEXT,
|
|
811
|
+
agent_type TEXT,
|
|
812
|
+
command TEXT,
|
|
813
|
+
status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'killed')),
|
|
814
|
+
exit_code INTEGER,
|
|
815
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
816
|
+
ended_at TEXT
|
|
817
|
+
);
|
|
818
|
+
INSERT INTO sandbox_sessions_new SELECT * FROM sandbox_sessions;
|
|
819
|
+
DROP TABLE sandbox_sessions;
|
|
820
|
+
ALTER TABLE sandbox_sessions_new RENAME TO sandbox_sessions;
|
|
821
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_sandbox ON sandbox_sessions(sandbox_id);
|
|
822
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON sandbox_sessions(status);
|
|
823
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (3);
|
|
805
824
|
`
|
|
806
825
|
];
|
|
807
826
|
var db = null;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const SANDBOX_STATUSES: readonly ["creating", "running", "paused"
|
|
|
4
4
|
export type SandboxStatus = (typeof SANDBOX_STATUSES)[number];
|
|
5
5
|
export declare const SESSION_STATUSES: readonly ["running", "completed", "failed", "killed"];
|
|
6
6
|
export type SessionStatus = (typeof SESSION_STATUSES)[number];
|
|
7
|
-
export declare const AGENT_TYPES: readonly ["claude", "codex", "gemini", "custom"];
|
|
7
|
+
export declare const AGENT_TYPES: readonly ["claude", "codex", "gemini", "opencode", "pi", "custom"];
|
|
8
8
|
export type AgentType = (typeof AGENT_TYPES)[number];
|
|
9
9
|
export declare const EVENT_TYPES: readonly ["stdout", "stderr", "lifecycle", "agent"];
|
|
10
10
|
export type EventType = (typeof EVENT_TYPES)[number];
|
|
@@ -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,
|
|
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;CACtB;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.7",
|
|
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.6",
|
|
14
14
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
15
15
|
"chalk": "^5.4.1",
|
|
16
16
|
"commander": "^13.1.0",
|