@hasna/sandboxes 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +204 -14
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/sandboxes.d.ts.map +1 -1
- package/dist/db/templates.d.ts +7 -0
- package/dist/db/templates.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +254 -5
- package/dist/lib/agent-runner.d.ts.map +1 -1
- package/dist/lib/agents/claude.d.ts +10 -0
- package/dist/lib/agents/claude.d.ts.map +1 -0
- package/dist/lib/agents/codex.d.ts +10 -0
- package/dist/lib/agents/codex.d.ts.map +1 -0
- package/dist/lib/agents/gemini.d.ts +10 -0
- package/dist/lib/agents/gemini.d.ts.map +1 -0
- package/dist/lib/agents/index.d.ts +5 -0
- package/dist/lib/agents/index.d.ts.map +1 -0
- package/dist/lib/agents/opencode.d.ts +10 -0
- package/dist/lib/agents/opencode.d.ts.map +1 -0
- package/dist/lib/agents/pi.d.ts +10 -0
- package/dist/lib/agents/pi.d.ts.map +1 -0
- package/dist/lib/agents/types.d.ts +23 -0
- package/dist/lib/agents/types.d.ts.map +1 -0
- package/dist/mcp/index.js +395 -21
- package/dist/providers/daytona.d.ts +2 -0
- package/dist/providers/daytona.d.ts.map +1 -1
- package/dist/providers/e2b.d.ts +2 -0
- package/dist/providers/e2b.d.ts.map +1 -1
- package/dist/providers/modal.d.ts +2 -0
- package/dist/providers/modal.d.ts.map +1 -1
- package/dist/providers/types.d.ts +4 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/server/index.js +77 -3
- package/dist/types/index.d.ts +41 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
|
28
28
|
var __require = import.meta.require;
|
|
29
29
|
|
|
30
30
|
// src/types/index.ts
|
|
31
|
-
var SANDBOX_PROVIDERS, SANDBOX_STATUSES, SESSION_STATUSES, AGENT_TYPES, EVENT_TYPES, SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, WebhookNotFoundError;
|
|
31
|
+
var SANDBOX_PROVIDERS, SANDBOX_STATUSES, SESSION_STATUSES, AGENT_TYPES, EVENT_TYPES, SandboxNotFoundError, SessionNotFoundError, ProviderError, AgentNotFoundError, ProjectNotFoundError, WebhookNotFoundError, TemplateNotFoundError;
|
|
32
32
|
var init_types = __esm(() => {
|
|
33
33
|
SANDBOX_PROVIDERS = ["e2b", "daytona", "modal"];
|
|
34
34
|
SANDBOX_STATUSES = [
|
|
@@ -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",
|
|
@@ -90,6 +90,12 @@ var init_types = __esm(() => {
|
|
|
90
90
|
this.name = "WebhookNotFoundError";
|
|
91
91
|
}
|
|
92
92
|
};
|
|
93
|
+
TemplateNotFoundError = class TemplateNotFoundError extends Error {
|
|
94
|
+
constructor(id) {
|
|
95
|
+
super(`Template not found: ${id}`);
|
|
96
|
+
this.name = "TemplateNotFoundError";
|
|
97
|
+
}
|
|
98
|
+
};
|
|
93
99
|
});
|
|
94
100
|
|
|
95
101
|
// src/providers/e2b.ts
|
|
@@ -109,7 +115,10 @@ class E2BProvider {
|
|
|
109
115
|
try {
|
|
110
116
|
const sandbox = await E2BSandbox.create({
|
|
111
117
|
apiKey: this.apiKey,
|
|
112
|
-
timeoutMs: (opts?.timeout || 3600) * 1000
|
|
118
|
+
timeoutMs: (opts?.timeout || 3600) * 1000,
|
|
119
|
+
...opts?.onTimeout === "pause" ? {
|
|
120
|
+
lifecycle: { onTimeout: "pause", autoResume: opts?.autoResume ?? true }
|
|
121
|
+
} : {}
|
|
113
122
|
});
|
|
114
123
|
instanceCache.set(sandbox.sandboxId, sandbox);
|
|
115
124
|
return {
|
|
@@ -218,6 +227,23 @@ class E2BProvider {
|
|
|
218
227
|
async delete(sandboxId) {
|
|
219
228
|
await this.stop(sandboxId);
|
|
220
229
|
}
|
|
230
|
+
async pause(sandboxId) {
|
|
231
|
+
const sandbox = await this.getInstance(sandboxId);
|
|
232
|
+
try {
|
|
233
|
+
await sandbox.pause();
|
|
234
|
+
instanceCache.delete(sandboxId);
|
|
235
|
+
} catch (err) {
|
|
236
|
+
throw new ProviderError("e2b", `Failed to pause sandbox: ${err.message}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async resume(sandboxId) {
|
|
240
|
+
try {
|
|
241
|
+
const sandbox = await E2BSandbox.connect(sandboxId, { apiKey: this.apiKey });
|
|
242
|
+
instanceCache.set(sandboxId, sandbox);
|
|
243
|
+
} catch (err) {
|
|
244
|
+
throw new ProviderError("e2b", `Failed to resume sandbox: ${err.message}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
221
247
|
async keepAlive(sandboxId, durationMs) {
|
|
222
248
|
const sandbox = await this.getInstance(sandboxId);
|
|
223
249
|
try {
|
|
@@ -378,6 +404,12 @@ class DaytonaProvider {
|
|
|
378
404
|
throw new ProviderError("daytona", `Failed to delete sandbox: ${err.message}`);
|
|
379
405
|
}
|
|
380
406
|
}
|
|
407
|
+
async pause(_sandboxId) {
|
|
408
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
409
|
+
}
|
|
410
|
+
async resume(_sandboxId) {
|
|
411
|
+
throw new ProviderError("daytona", "Pause/resume not supported by Daytona provider");
|
|
412
|
+
}
|
|
381
413
|
async keepAlive(sandboxId, durationMs) {
|
|
382
414
|
const sandbox = await this.getInstance(sandboxId);
|
|
383
415
|
try {
|
|
@@ -600,6 +632,12 @@ class ModalProvider {
|
|
|
600
632
|
async delete(sandboxId) {
|
|
601
633
|
await this.stop(sandboxId);
|
|
602
634
|
}
|
|
635
|
+
async pause(_sandboxId) {
|
|
636
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
637
|
+
}
|
|
638
|
+
async resume(_sandboxId) {
|
|
639
|
+
throw new ProviderError("modal", "Pause/resume not supported by Modal provider");
|
|
640
|
+
}
|
|
603
641
|
async keepAlive(_sandboxId, _durationMs) {}
|
|
604
642
|
parseCommand(command) {
|
|
605
643
|
const args = [];
|
|
@@ -772,6 +810,44 @@ var MIGRATIONS = [
|
|
|
772
810
|
);
|
|
773
811
|
|
|
774
812
|
INSERT OR IGNORE INTO _migrations (id) VALUES (1);
|
|
813
|
+
`,
|
|
814
|
+
`
|
|
815
|
+
ALTER TABLE sandboxes ADD COLUMN on_timeout TEXT NOT NULL DEFAULT 'terminate' CHECK(on_timeout IN ('pause', 'terminate'));
|
|
816
|
+
ALTER TABLE sandboxes ADD COLUMN auto_resume INTEGER NOT NULL DEFAULT 0;
|
|
817
|
+
|
|
818
|
+
CREATE TABLE IF NOT EXISTS templates (
|
|
819
|
+
id TEXT PRIMARY KEY,
|
|
820
|
+
name TEXT NOT NULL UNIQUE,
|
|
821
|
+
description TEXT,
|
|
822
|
+
image TEXT,
|
|
823
|
+
env_vars TEXT NOT NULL DEFAULT '{}',
|
|
824
|
+
setup_script TEXT,
|
|
825
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
826
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
827
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
828
|
+
);
|
|
829
|
+
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
|
830
|
+
|
|
831
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (2);
|
|
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);
|
|
775
851
|
`
|
|
776
852
|
];
|
|
777
853
|
var db = null;
|
|
@@ -844,6 +920,8 @@ function rowToSandbox(row) {
|
|
|
844
920
|
env_vars: JSON.parse(row.env_vars),
|
|
845
921
|
keep_alive_until: row.keep_alive_until,
|
|
846
922
|
project_id: row.project_id,
|
|
923
|
+
on_timeout: row.on_timeout ?? "terminate",
|
|
924
|
+
auto_resume: row.auto_resume === 1,
|
|
847
925
|
created_at: row.created_at,
|
|
848
926
|
updated_at: row.updated_at
|
|
849
927
|
};
|
|
@@ -859,8 +937,10 @@ function createSandbox(input) {
|
|
|
859
937
|
const config = JSON.stringify(input.config ?? {});
|
|
860
938
|
const env_vars = JSON.stringify(input.env_vars ?? {});
|
|
861
939
|
const project_id = input.project_id ?? null;
|
|
862
|
-
|
|
863
|
-
|
|
940
|
+
const on_timeout = input.on_timeout ?? "terminate";
|
|
941
|
+
const auto_resume = input.auto_resume ? 1 : 0;
|
|
942
|
+
db2.query(`INSERT INTO sandboxes (id, provider, name, status, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, created_at, updated_at)
|
|
943
|
+
VALUES (?, ?, ?, 'creating', ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, provider, name, image, timeout, config, env_vars, project_id, on_timeout, auto_resume, timestamp, timestamp);
|
|
864
944
|
return getSandbox(id);
|
|
865
945
|
}
|
|
866
946
|
function getSandbox(id) {
|
|
@@ -1213,6 +1293,56 @@ function deleteWebhook(id) {
|
|
|
1213
1293
|
throw new WebhookNotFoundError(id);
|
|
1214
1294
|
db2.query("DELETE FROM webhooks WHERE id = ?").run(resolvedId);
|
|
1215
1295
|
}
|
|
1296
|
+
// src/db/templates.ts
|
|
1297
|
+
init_types();
|
|
1298
|
+
function rowToTemplate(row) {
|
|
1299
|
+
return {
|
|
1300
|
+
id: row.id,
|
|
1301
|
+
name: row.name,
|
|
1302
|
+
description: row.description,
|
|
1303
|
+
image: row.image,
|
|
1304
|
+
env_vars: JSON.parse(row.env_vars),
|
|
1305
|
+
setup_script: row.setup_script,
|
|
1306
|
+
tags: JSON.parse(row.tags),
|
|
1307
|
+
created_at: row.created_at,
|
|
1308
|
+
updated_at: row.updated_at
|
|
1309
|
+
};
|
|
1310
|
+
}
|
|
1311
|
+
function createTemplate(input) {
|
|
1312
|
+
const db2 = getDatabase();
|
|
1313
|
+
const id = uuid();
|
|
1314
|
+
const timestamp = now();
|
|
1315
|
+
db2.query(`INSERT INTO templates (id, name, description, image, env_vars, setup_script, tags, created_at, updated_at)
|
|
1316
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.name, input.description ?? null, input.image ?? null, JSON.stringify(input.env_vars ?? {}), input.setup_script ?? null, JSON.stringify(input.tags ?? []), timestamp, timestamp);
|
|
1317
|
+
return getTemplate(id);
|
|
1318
|
+
}
|
|
1319
|
+
function getTemplate(id) {
|
|
1320
|
+
const db2 = getDatabase();
|
|
1321
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
1322
|
+
if (!resolvedId)
|
|
1323
|
+
throw new TemplateNotFoundError(id);
|
|
1324
|
+
const row = db2.query("SELECT * FROM templates WHERE id = ?").get(resolvedId);
|
|
1325
|
+
if (!row)
|
|
1326
|
+
throw new TemplateNotFoundError(id);
|
|
1327
|
+
return rowToTemplate(row);
|
|
1328
|
+
}
|
|
1329
|
+
function getTemplateByName(name) {
|
|
1330
|
+
const db2 = getDatabase();
|
|
1331
|
+
const row = db2.query("SELECT * FROM templates WHERE name = ?").get(name);
|
|
1332
|
+
return row ? rowToTemplate(row) : null;
|
|
1333
|
+
}
|
|
1334
|
+
function listTemplates() {
|
|
1335
|
+
const db2 = getDatabase();
|
|
1336
|
+
const rows = db2.query("SELECT * FROM templates ORDER BY name ASC").all();
|
|
1337
|
+
return rows.map(rowToTemplate);
|
|
1338
|
+
}
|
|
1339
|
+
function deleteTemplate(id) {
|
|
1340
|
+
const db2 = getDatabase();
|
|
1341
|
+
const resolvedId = resolvePartialId("templates", id);
|
|
1342
|
+
if (!resolvedId)
|
|
1343
|
+
throw new TemplateNotFoundError(id);
|
|
1344
|
+
db2.query("DELETE FROM templates WHERE id = ?").run(resolvedId);
|
|
1345
|
+
}
|
|
1216
1346
|
// src/lib/config.ts
|
|
1217
1347
|
import { existsSync as existsSync2, readFileSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
1218
1348
|
import { dirname as dirname2, join as join2 } from "path";
|
|
@@ -1407,6 +1537,117 @@ function emitLifecycleEvent(sandboxId, message) {
|
|
|
1407
1537
|
});
|
|
1408
1538
|
notifyListeners(sandboxId, "lifecycle", message);
|
|
1409
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
|
+
}
|
|
1410
1651
|
export {
|
|
1411
1652
|
uuid,
|
|
1412
1653
|
updateSession,
|
|
@@ -1420,12 +1661,16 @@ export {
|
|
|
1420
1661
|
now,
|
|
1421
1662
|
loadConfig,
|
|
1422
1663
|
listWebhooks,
|
|
1664
|
+
listTemplates,
|
|
1423
1665
|
listSessions,
|
|
1424
1666
|
listSandboxes,
|
|
1425
1667
|
listProjects,
|
|
1426
1668
|
listEvents,
|
|
1427
1669
|
listAgents,
|
|
1670
|
+
listAgentDrivers,
|
|
1428
1671
|
getWebhook,
|
|
1672
|
+
getTemplateByName,
|
|
1673
|
+
getTemplate,
|
|
1429
1674
|
getSession,
|
|
1430
1675
|
getSandbox,
|
|
1431
1676
|
getProviderApiKey,
|
|
@@ -1437,16 +1682,19 @@ export {
|
|
|
1437
1682
|
getDefaultImage,
|
|
1438
1683
|
getDatabase,
|
|
1439
1684
|
getConfigValue,
|
|
1685
|
+
getAgentDriver,
|
|
1440
1686
|
getAgentByName,
|
|
1441
1687
|
getAgent,
|
|
1442
1688
|
ensureProject,
|
|
1443
1689
|
endSession,
|
|
1444
1690
|
emitLifecycleEvent,
|
|
1445
1691
|
deleteWebhook,
|
|
1692
|
+
deleteTemplate,
|
|
1446
1693
|
deleteSandbox,
|
|
1447
1694
|
deleteProject,
|
|
1448
1695
|
deleteAgent,
|
|
1449
1696
|
createWebhook,
|
|
1697
|
+
createTemplate,
|
|
1450
1698
|
createStreamCollector,
|
|
1451
1699
|
createSession,
|
|
1452
1700
|
createSandbox,
|
|
@@ -1455,6 +1703,7 @@ export {
|
|
|
1455
1703
|
addStreamListener,
|
|
1456
1704
|
addEvent,
|
|
1457
1705
|
WebhookNotFoundError,
|
|
1706
|
+
TemplateNotFoundError,
|
|
1458
1707
|
SessionNotFoundError,
|
|
1459
1708
|
SandboxNotFoundError,
|
|
1460
1709
|
SESSION_STATUSES,
|
|
@@ -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"}
|