agentenkit 0.4.0 → 0.6.0
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/README.md +48 -1
- package/dist/adapters/brave.d.ts +21 -0
- package/dist/adapters/brave.d.ts.map +1 -0
- package/dist/adapters/brave.js +52 -0
- package/dist/adapters/brave.js.map +1 -0
- package/dist/adapters/computesdk.d.ts +71 -0
- package/dist/adapters/computesdk.d.ts.map +1 -0
- package/dist/adapters/computesdk.js +163 -0
- package/dist/adapters/computesdk.js.map +1 -0
- package/dist/adapters/docker.d.ts +35 -0
- package/dist/adapters/docker.d.ts.map +1 -0
- package/dist/adapters/docker.js +246 -0
- package/dist/adapters/docker.js.map +1 -0
- package/dist/adapters/e2b.d.ts +44 -0
- package/dist/adapters/e2b.d.ts.map +1 -0
- package/dist/adapters/e2b.js +349 -0
- package/dist/adapters/e2b.js.map +1 -0
- package/dist/adapters/jina.d.ts +34 -0
- package/dist/adapters/jina.d.ts.map +1 -0
- package/dist/adapters/jina.js +99 -0
- package/dist/adapters/jina.js.map +1 -0
- package/dist/adapters/local-sandbox.d.ts +32 -0
- package/dist/adapters/local-sandbox.d.ts.map +1 -0
- package/dist/adapters/local-sandbox.js +257 -0
- package/dist/adapters/local-sandbox.js.map +1 -0
- package/dist/adapters/mcp.d.ts +71 -0
- package/dist/adapters/mcp.d.ts.map +1 -0
- package/dist/adapters/mcp.js +344 -0
- package/dist/adapters/mcp.js.map +1 -0
- package/dist/adapters/memory.d.ts +81 -0
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +207 -0
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/page-reader.d.ts +39 -0
- package/dist/adapters/page-reader.d.ts.map +1 -0
- package/dist/adapters/page-reader.js +165 -0
- package/dist/adapters/page-reader.js.map +1 -0
- package/dist/adapters/sandbox-shell.d.ts +60 -0
- package/dist/adapters/sandbox-shell.d.ts.map +1 -0
- package/dist/adapters/sandbox-shell.js +129 -0
- package/dist/adapters/sandbox-shell.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +37 -1
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +106 -7
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/web-search-shared.d.ts +11 -0
- package/dist/adapters/web-search-shared.d.ts.map +1 -0
- package/dist/adapters/web-search-shared.js +40 -0
- package/dist/adapters/web-search-shared.js.map +1 -0
- package/dist/core/builtin/definitions.d.ts +12 -0
- package/dist/core/builtin/definitions.d.ts.map +1 -0
- package/dist/core/builtin/definitions.js +149 -0
- package/dist/core/builtin/definitions.js.map +1 -0
- package/dist/core/builtin/html.d.ts +13 -0
- package/dist/core/builtin/html.d.ts.map +1 -0
- package/dist/core/builtin/html.js +96 -0
- package/dist/core/builtin/html.js.map +1 -0
- package/dist/core/builtin/index.d.ts +21 -0
- package/dist/core/builtin/index.d.ts.map +1 -0
- package/dist/core/builtin/index.js +55 -0
- package/dist/core/builtin/index.js.map +1 -0
- package/dist/core/builtin/run.d.ts +37 -0
- package/dist/core/builtin/run.d.ts.map +1 -0
- package/dist/core/builtin/run.js +56 -0
- package/dist/core/builtin/run.js.map +1 -0
- package/dist/core/builtin/sandbox-tools.d.ts +69 -0
- package/dist/core/builtin/sandbox-tools.d.ts.map +1 -0
- package/dist/core/builtin/sandbox-tools.js +389 -0
- package/dist/core/builtin/sandbox-tools.js.map +1 -0
- package/dist/core/builtin/sandbox.d.ts +52 -0
- package/dist/core/builtin/sandbox.d.ts.map +1 -0
- package/dist/core/builtin/sandbox.js +174 -0
- package/dist/core/builtin/sandbox.js.map +1 -0
- package/dist/core/builtin/web.d.ts +54 -0
- package/dist/core/builtin/web.d.ts.map +1 -0
- package/dist/core/builtin/web.js +167 -0
- package/dist/core/builtin/web.js.map +1 -0
- package/dist/core/deleteThread.d.ts.map +1 -1
- package/dist/core/deleteThread.js +3 -0
- package/dist/core/deleteThread.js.map +1 -1
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +29 -5
- package/dist/core/engine.js.map +1 -1
- package/dist/core/permanent.d.ts +11 -0
- package/dist/core/permanent.d.ts.map +1 -0
- package/dist/core/permanent.js +37 -0
- package/dist/core/permanent.js.map +1 -0
- package/dist/core/publish.d.ts +4 -1
- package/dist/core/publish.d.ts.map +1 -1
- package/dist/core/publish.js +4 -1
- package/dist/core/publish.js.map +1 -1
- package/dist/core/run.d.ts.map +1 -1
- package/dist/core/run.js +5 -4
- package/dist/core/run.js.map +1 -1
- package/dist/core/subagent.d.ts.map +1 -1
- package/dist/core/subagent.js +13 -3
- package/dist/core/subagent.js.map +1 -1
- package/dist/core/tools.d.ts +9 -3
- package/dist/core/tools.d.ts.map +1 -1
- package/dist/core/tools.js.map +1 -1
- package/dist/core/types.d.ts +25 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +16 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/ports/runtime.d.ts +47 -22
- package/dist/ports/runtime.d.ts.map +1 -1
- package/dist/ports/sandbox.d.ts +159 -0
- package/dist/ports/sandbox.d.ts.map +1 -0
- package/dist/ports/sandbox.js +44 -0
- package/dist/ports/sandbox.js.map +1 -0
- package/dist/ports/tools.d.ts +60 -0
- package/dist/ports/tools.d.ts.map +1 -0
- package/dist/ports/tools.js +5 -0
- package/dist/ports/tools.js.map +1 -0
- package/dist/pricing.d.ts +24 -0
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +43 -0
- package/dist/pricing.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +18 -10
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
A durable runtime for AI agent runs, as a **library**.
|
|
4
4
|
|
|
5
|
-
It does not own your prompts, models, or tools — the [AI SDK](https://sdk.vercel.ai) does
|
|
5
|
+
It does not own your prompts, models, or tools — the [AI SDK](https://sdk.vercel.ai) does —
|
|
6
|
+
though it ships a few [built-in tools](#built-in-tools) any model can use.
|
|
6
7
|
It owns the **lifecycle of a run**: that a run outlives the request that started it,
|
|
7
8
|
survives a worker dying mid-step, can be stopped, parked for a human, resumed exactly
|
|
8
9
|
where it stopped, nested, metered, and watched by several people at once.
|
|
@@ -217,6 +218,51 @@ tokens.
|
|
|
217
218
|
`chain`, to try one then the other. See
|
|
218
219
|
[Cost and pricing](https://eadwincode.github.io/agentic-kit/cost-and-pricing).
|
|
219
220
|
|
|
221
|
+
## Built-in tools
|
|
222
|
+
|
|
223
|
+
Tools with one name and one input shape in both runtimes, so any model that can
|
|
224
|
+
call tools can use them. What does the work is an adapter you pass in, with its
|
|
225
|
+
API key, at setup; nothing reads the environment later.
|
|
226
|
+
|
|
227
|
+
```ts
|
|
228
|
+
import { BraveWebSearch, E2BSandbox, PageReader, setupAgentCore } from 'agentenkit';
|
|
229
|
+
|
|
230
|
+
const runtime = await setupAgentCore({
|
|
231
|
+
// ... ports ...
|
|
232
|
+
tools: {
|
|
233
|
+
search: new BraveWebSearch({ apiKey: process.env.BRAVE_API_KEY! }), // or JinaWebSearch
|
|
234
|
+
fetcher: new PageReader(), // or JinaReader
|
|
235
|
+
sandbox: new E2BSandbox({ apiKey: process.env.E2B_API_KEY! }), // or DockerSandbox, LocalSandbox
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const coder = runtime.createStreamTextAgent({
|
|
240
|
+
name: 'coder',
|
|
241
|
+
tools: {
|
|
242
|
+
...runtime.builtinTools(['web_search', 'web_fetch', 'bash', 'code_execution', 'text_editor']),
|
|
243
|
+
lookupInvoice,
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
| Tool | What the model can do | Needs | Asks for approval |
|
|
249
|
+
| :--- | :--- | :--- | :--- |
|
|
250
|
+
| `web_search` | Search; results come back with short ids | `search` | No |
|
|
251
|
+
| `web_fetch` | Read a page, by URL or result id; with a `prompt`, a small model answers from the page | `fetcher` | No |
|
|
252
|
+
| `bash` | Run a command in the thread's sandbox | `sandbox` | Yes |
|
|
253
|
+
| `code_execution` | Run a Python or JavaScript program; lists the files it made | `sandbox` | No |
|
|
254
|
+
| `text_editor` | View, create and edit files by exact replacement, with undo | `sandbox` | For changes |
|
|
255
|
+
|
|
256
|
+
A thread has **one sandbox**, kept between messages: every later run finds the
|
|
257
|
+
same files, and it ends when the thread is deleted or has been idle for
|
|
258
|
+
`sandboxIdleTtlMs` (30 minutes). Each tool call is a usage row, so
|
|
259
|
+
`pricing.tools({ brave: { perUse: 0.005 }, e2b: { perSecond: 0.000028 } })`
|
|
260
|
+
puts tool spend on the bill and under a run's money cap.
|
|
261
|
+
|
|
262
|
+
Your own tools can use the thread's sandbox with `withSandbox(opts, fn)`. See
|
|
263
|
+
[Web tools](https://eadwincode.github.io/agentic-kit/web-tools) and
|
|
264
|
+
[Sandboxes](https://eadwincode.github.io/agentic-kit/sandboxes).
|
|
265
|
+
|
|
220
266
|
## The admin store (§2.9) — not yours
|
|
221
267
|
|
|
222
268
|
Run records, step timings and a thread index are the **platform's** data, in the
|
|
@@ -278,6 +324,7 @@ reading your database at all.
|
|
|
278
324
|
| §2.8 Queue dispatch + redrive/FAIL policy | `ports/queue.ts`, `core/engine.ts` |
|
|
279
325
|
| §2.9 Operational history | `ports/admin.ts`, `admin/*`, `core/admin.ts` |
|
|
280
326
|
| §2.10 Run state | `core/state.ts` |
|
|
327
|
+
| Built-in tools | `core/builtin/*`, `ports/tools.ts`, `ports/sandbox.ts`, `adapters/{brave,jina,page-reader,docker,e2b,local-sandbox,computesdk}.ts` |
|
|
281
328
|
| §5 Reference HTTP integration | `examples/nextjs-app` |
|
|
282
329
|
|
|
283
330
|
## Development
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Search, SearchHit, SearchOptions } from '../ports/tools.js';
|
|
2
|
+
export interface BraveWebSearchOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
/** Two-letter country the results are for, like 'us'. */
|
|
5
|
+
country?: string;
|
|
6
|
+
/** Language of the results, like 'en'. */
|
|
7
|
+
searchLang?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
/** For tests. */
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
}
|
|
12
|
+
/** Web search on the Brave Search API: its own index of the web, $5 per
|
|
13
|
+
* 1,000 searches with $5 free each month (checked 2026-09-26). The default
|
|
14
|
+
* search adapter. */
|
|
15
|
+
export declare class BraveWebSearch implements Search {
|
|
16
|
+
private readonly options;
|
|
17
|
+
readonly name = "brave";
|
|
18
|
+
constructor(options: BraveWebSearchOptions);
|
|
19
|
+
search(query: string, opts: SearchOptions): Promise<SearchHit[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=brave.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brave.d.ts","sourceRoot":"","sources":["../../src/adapters/brave.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAIzF,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAID;;sBAEsB;AACtB,qBAAa,cAAe,YAAW,MAAM;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,QAAQ,CAAC,IAAI,WAAW;gBACK,OAAO,EAAE,qBAAqB;IAIrD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAgCvE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { domainAllowed, withSiteFilters } from './web-search-shared.js';
|
|
2
|
+
import { decodeEntities } from '../core/builtin/html.js';
|
|
3
|
+
const FRESHNESS = { day: 'pd', week: 'pw', month: 'pm', year: 'py' };
|
|
4
|
+
/** Web search on the Brave Search API: its own index of the web, $5 per
|
|
5
|
+
* 1,000 searches with $5 free each month (checked 2026-09-26). The default
|
|
6
|
+
* search adapter. */
|
|
7
|
+
export class BraveWebSearch {
|
|
8
|
+
options;
|
|
9
|
+
name = 'brave';
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
if (!options.apiKey)
|
|
13
|
+
throw new Error('BraveWebSearch: apiKey is required');
|
|
14
|
+
}
|
|
15
|
+
async search(query, opts) {
|
|
16
|
+
const params = new URLSearchParams({
|
|
17
|
+
q: withSiteFilters(query, opts),
|
|
18
|
+
count: String(Math.min(Math.max(opts.maxResults, 1), 20)),
|
|
19
|
+
text_decorations: 'false',
|
|
20
|
+
});
|
|
21
|
+
if (opts.recency)
|
|
22
|
+
params.set('freshness', FRESHNESS[opts.recency]);
|
|
23
|
+
if (this.options.country)
|
|
24
|
+
params.set('country', this.options.country);
|
|
25
|
+
if (this.options.searchLang)
|
|
26
|
+
params.set('search_lang', this.options.searchLang);
|
|
27
|
+
const doFetch = this.options.fetch ?? fetch;
|
|
28
|
+
const res = await doFetch(`${this.options.baseUrl ?? 'https://api.search.brave.com/res/v1/web/search'}?${params}`, {
|
|
29
|
+
headers: { accept: 'application/json', 'x-subscription-token': this.options.apiKey },
|
|
30
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
throw new Error(`brave: ${res.status} ${(await res.text()).slice(0, 200)}`);
|
|
34
|
+
const body = (await res.json());
|
|
35
|
+
const hits = [];
|
|
36
|
+
for (const r of body.web?.results ?? []) {
|
|
37
|
+
if (!r.url || !domainAllowed(r.url, opts))
|
|
38
|
+
continue;
|
|
39
|
+
hits.push({
|
|
40
|
+
// Brave sends text as HTML: tags in snippets, entities in both.
|
|
41
|
+
title: decodeEntities(r.title ?? ''),
|
|
42
|
+
url: r.url,
|
|
43
|
+
snippet: decodeEntities((r.description ?? '').replace(/<[^>]*>/g, '')),
|
|
44
|
+
...(r.page_age ? { publishedAt: r.page_age } : {}),
|
|
45
|
+
});
|
|
46
|
+
if (hits.length >= opts.maxResults)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
return hits;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=brave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brave.js","sourceRoot":"","sources":["../../src/adapters/brave.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type CreateSandboxOptions, type Sandbox, type SandboxProvider } from '../ports/sandbox.js';
|
|
2
|
+
/** The part of a ComputeSDK sandbox this adapter uses. Any ComputeSDK
|
|
3
|
+
* provider's sandbox has it; nothing is imported from ComputeSDK, so it is
|
|
4
|
+
* not a dependency. */
|
|
5
|
+
export interface ComputeSdkSandboxLike {
|
|
6
|
+
readonly sandboxId: string;
|
|
7
|
+
readonly provider: string;
|
|
8
|
+
runCommand(command: string, options?: {
|
|
9
|
+
cwd?: string;
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
timeout?: number;
|
|
12
|
+
background?: boolean;
|
|
13
|
+
onStdout?: (d: string) => void;
|
|
14
|
+
onStderr?: (d: string) => void;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
exitCode: number;
|
|
19
|
+
durationMs: number;
|
|
20
|
+
}>;
|
|
21
|
+
getInfo(): Promise<{
|
|
22
|
+
id: string;
|
|
23
|
+
provider: string;
|
|
24
|
+
status: string;
|
|
25
|
+
createdAt: Date;
|
|
26
|
+
timeout: number;
|
|
27
|
+
metadata?: Record<string, any>;
|
|
28
|
+
}>;
|
|
29
|
+
getUrl(options: {
|
|
30
|
+
port: number;
|
|
31
|
+
protocol?: string;
|
|
32
|
+
}): Promise<string>;
|
|
33
|
+
destroy(): Promise<void>;
|
|
34
|
+
readonly filesystem: {
|
|
35
|
+
readFile(path: string): Promise<string>;
|
|
36
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** A ComputeSDK provider, as `e2b({ apiKey })` or `daytona({ ... })` from
|
|
40
|
+
* the `@computesdk/*` packages returns it. */
|
|
41
|
+
export interface ComputeSdkProviderLike {
|
|
42
|
+
readonly name?: string;
|
|
43
|
+
readonly sandbox: {
|
|
44
|
+
create(options?: Record<string, unknown>): Promise<ComputeSdkSandboxLike>;
|
|
45
|
+
getById(sandboxId: string): Promise<ComputeSdkSandboxLike | null>;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface ComputeSdkSandboxOptions {
|
|
49
|
+
/** A ComputeSDK provider: `e2b({ apiKey })`, `daytona(...)`, `modal(...)`… */
|
|
50
|
+
provider: ComputeSdkProviderLike;
|
|
51
|
+
/** The folder relative paths are taken from. Default `/tmp/agentenkit`. */
|
|
52
|
+
workdir?: string;
|
|
53
|
+
/** How long a sandbox lives. ComputeSDK cannot push a sandbox's time back,
|
|
54
|
+
* so each one ends this long after it was made, used or not. Default 1
|
|
55
|
+
* hour. */
|
|
56
|
+
timeoutMs?: number;
|
|
57
|
+
}
|
|
58
|
+
/** Sandboxes from any ComputeSDK provider (Daytona, Modal, Vercel,
|
|
59
|
+
* Cloudflare, …). TS only: ComputeSDK is a TypeScript library.
|
|
60
|
+
*
|
|
61
|
+
* Files that are not plain text go through `base64` in the sandbox, since
|
|
62
|
+
* ComputeSDK's file calls take text only. */
|
|
63
|
+
export declare class ComputeSdkSandbox implements SandboxProvider {
|
|
64
|
+
private readonly options;
|
|
65
|
+
readonly name: string;
|
|
66
|
+
constructor(options: ComputeSdkSandboxOptions);
|
|
67
|
+
private get workdir();
|
|
68
|
+
create(options: CreateSandboxOptions): Promise<Sandbox>;
|
|
69
|
+
connect(sandboxId: string): Promise<Sandbox>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=computesdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computesdk.d.ts","sourceRoot":"","sources":["../../src/adapters/computesdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,oBAAoB,EAGzB,KAAK,OAAO,EAGZ,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAe7B;;wBAEwB;AACxB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,UAAU,CACR,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GAC/J,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,OAAO,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IACvI,MAAM,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACzD,CAAC;CACH;AAED;+CAC+C;AAC/C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE;QAChB,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC1E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;KACnE,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,8EAA8E;IAC9E,QAAQ,EAAE,sBAAsB,CAAC;IACjC,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;gBAEY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;8CAI8C;AAC9C,qBAAa,iBAAkB,YAAW,eAAe;IAG3C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEO,OAAO,EAAE,wBAAwB;IAI9D,OAAO,KAAK,OAAO,GAElB;IAEK,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAcvD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAOnD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { DEFAULT_COMMAND_TIMEOUT_MS, SandboxFileNotFoundError, SandboxGoneError, SandboxUnsupportedError, TIMED_OUT_EXIT_CODE, } from '../ports/sandbox.js';
|
|
2
|
+
import { FILE_SCRIPTS, NOT_FOUND_EXIT, backgroundCommand, capOutput, decodeBase64, encodeBase64, looksTimedOut, parseListing, resolveIn, shellQuote, toBytes, } from './sandbox-shell.js';
|
|
3
|
+
/** Sandboxes from any ComputeSDK provider (Daytona, Modal, Vercel,
|
|
4
|
+
* Cloudflare, …). TS only: ComputeSDK is a TypeScript library.
|
|
5
|
+
*
|
|
6
|
+
* Files that are not plain text go through `base64` in the sandbox, since
|
|
7
|
+
* ComputeSDK's file calls take text only. */
|
|
8
|
+
export class ComputeSdkSandbox {
|
|
9
|
+
options;
|
|
10
|
+
name;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.name = `computesdk:${options.provider.name ?? 'provider'}`;
|
|
14
|
+
}
|
|
15
|
+
get workdir() {
|
|
16
|
+
return this.options.workdir ?? '/tmp/agentenkit';
|
|
17
|
+
}
|
|
18
|
+
async create(options) {
|
|
19
|
+
const sandbox = await this.options.provider.sandbox.create({
|
|
20
|
+
timeout: this.options.timeoutMs ?? 60 * 60_000,
|
|
21
|
+
metadata: { threadId: options.metadata.threadId, ...(options.metadata.runId ? { runId: options.metadata.runId } : {}) },
|
|
22
|
+
...(options.envs ? { envs: options.envs } : {}),
|
|
23
|
+
...(options.template ? { templateId: options.template } : {}),
|
|
24
|
+
...(options.image ? { image: options.image } : {}),
|
|
25
|
+
...(options.extra ?? {}),
|
|
26
|
+
});
|
|
27
|
+
const box = new ComputeSdkBox(this.name, sandbox, this.workdir);
|
|
28
|
+
await box.filesystem.mkdir('.');
|
|
29
|
+
return box;
|
|
30
|
+
}
|
|
31
|
+
async connect(sandboxId) {
|
|
32
|
+
// Only "not found" means gone; any other error is thrown as it is, so a
|
|
33
|
+
// passing network fault does not throw away a live sandbox.
|
|
34
|
+
const sandbox = await this.options.provider.sandbox.getById(sandboxId);
|
|
35
|
+
if (!sandbox)
|
|
36
|
+
throw new SandboxGoneError(sandboxId);
|
|
37
|
+
return new ComputeSdkBox(this.name, sandbox, this.workdir);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
class ComputeSdkBox {
|
|
41
|
+
provider;
|
|
42
|
+
inner;
|
|
43
|
+
workdir;
|
|
44
|
+
filesystem;
|
|
45
|
+
constructor(provider, inner, workdir) {
|
|
46
|
+
this.provider = provider;
|
|
47
|
+
this.inner = inner;
|
|
48
|
+
this.workdir = workdir;
|
|
49
|
+
this.filesystem = new ComputeSdkFiles(this, inner);
|
|
50
|
+
}
|
|
51
|
+
get sandboxId() {
|
|
52
|
+
return this.inner.sandboxId;
|
|
53
|
+
}
|
|
54
|
+
path(p) {
|
|
55
|
+
return resolveIn(this.workdir, p);
|
|
56
|
+
}
|
|
57
|
+
/** Runs a FILE_SCRIPTS script on one path. */
|
|
58
|
+
script(script, path) {
|
|
59
|
+
return this.inner.runCommand(`sh -c ${shellQuote(script)} sandbox ${shellQuote(this.path(path))}`);
|
|
60
|
+
}
|
|
61
|
+
async runCommand(command, options = {}) {
|
|
62
|
+
if (options.signal?.aborted)
|
|
63
|
+
throw options.signal.reason;
|
|
64
|
+
const limit = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS;
|
|
65
|
+
const r = await this.inner.runCommand(options.background ? backgroundCommand(command) : command, {
|
|
66
|
+
cwd: this.path(options.cwd ?? '.'),
|
|
67
|
+
...(options.env ? { env: options.env } : {}),
|
|
68
|
+
timeout: limit,
|
|
69
|
+
...(options.onStdout ? { onStdout: options.onStdout } : {}),
|
|
70
|
+
...(options.onStderr ? { onStderr: options.onStderr } : {}),
|
|
71
|
+
});
|
|
72
|
+
if (options.background)
|
|
73
|
+
return { stdout: '', stderr: '', exitCode: r.exitCode, durationMs: r.durationMs };
|
|
74
|
+
const timedOut = looksTimedOut(r.exitCode, r.durationMs, limit);
|
|
75
|
+
const stdout = capOutput(r.stdout);
|
|
76
|
+
const stderr = capOutput(r.stderr);
|
|
77
|
+
return {
|
|
78
|
+
stdout: stdout.text,
|
|
79
|
+
stderr: stderr.text,
|
|
80
|
+
exitCode: timedOut ? TIMED_OUT_EXIT_CODE : r.exitCode,
|
|
81
|
+
durationMs: r.durationMs,
|
|
82
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
83
|
+
...(stdout.truncated || stderr.truncated ? { truncated: true } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
getUrl(options) {
|
|
87
|
+
return this.inner.getUrl(options);
|
|
88
|
+
}
|
|
89
|
+
async getInfo() {
|
|
90
|
+
const info = await this.inner.getInfo();
|
|
91
|
+
const metadata = {};
|
|
92
|
+
for (const [k, v] of Object.entries(info.metadata ?? {}))
|
|
93
|
+
if (typeof v === 'string')
|
|
94
|
+
metadata[k] = v;
|
|
95
|
+
const createdAt = new Date(info.createdAt);
|
|
96
|
+
return {
|
|
97
|
+
id: info.id,
|
|
98
|
+
provider: this.provider,
|
|
99
|
+
status: info.status === 'running' ? 'running' : info.status === 'stopped' ? 'stopped' : 'error',
|
|
100
|
+
createdAt,
|
|
101
|
+
...(info.timeout ? { expiresAt: new Date(createdAt.getTime() + info.timeout) } : {}),
|
|
102
|
+
workdir: this.workdir,
|
|
103
|
+
metadata,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async setTimeout() {
|
|
107
|
+
throw new SandboxUnsupportedError(this.provider, "changing a sandbox's time");
|
|
108
|
+
}
|
|
109
|
+
destroy() {
|
|
110
|
+
return this.inner.destroy();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
class ComputeSdkFiles {
|
|
114
|
+
box;
|
|
115
|
+
inner;
|
|
116
|
+
constructor(box, inner) {
|
|
117
|
+
this.box = box;
|
|
118
|
+
this.inner = inner;
|
|
119
|
+
}
|
|
120
|
+
async run(script, path) {
|
|
121
|
+
const r = await this.box.script(script, path);
|
|
122
|
+
if (r.exitCode === NOT_FOUND_EXIT)
|
|
123
|
+
throw new SandboxFileNotFoundError(path);
|
|
124
|
+
if (r.exitCode !== 0)
|
|
125
|
+
throw new Error(`${this.box.provider}: ${r.stderr.trim() || `exit ${r.exitCode}`}`);
|
|
126
|
+
return r;
|
|
127
|
+
}
|
|
128
|
+
async readFile(path) {
|
|
129
|
+
return new TextDecoder().decode(await this.readFileBytes(path));
|
|
130
|
+
}
|
|
131
|
+
async readFileBytes(path) {
|
|
132
|
+
return decodeBase64((await this.run(FILE_SCRIPTS.readBase64, path)).stdout);
|
|
133
|
+
}
|
|
134
|
+
async writeFile(path, content) {
|
|
135
|
+
const full = this.box.path(path);
|
|
136
|
+
await this.run(FILE_SCRIPTS.mkdir, full.slice(0, full.lastIndexOf('/')) || '/');
|
|
137
|
+
if (typeof content === 'string')
|
|
138
|
+
return this.inner.filesystem.writeFile(full, content);
|
|
139
|
+
// Bytes go through base64, in pieces well under the longest argument a
|
|
140
|
+
// command line takes.
|
|
141
|
+
const b64 = encodeBase64(toBytes(content));
|
|
142
|
+
await this.box.script(': > "$1"', path);
|
|
143
|
+
for (let i = 0; i < b64.length; i += 60_000) {
|
|
144
|
+
const piece = b64.slice(i, i + 60_000);
|
|
145
|
+
const r = await this.box.script(`printf %s ${shellQuote(piece)} | base64 -d >> "$1"`, path);
|
|
146
|
+
if (r.exitCode !== 0)
|
|
147
|
+
throw new Error(`${this.box.provider}: could not write ${path}: ${r.stderr.trim()}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async readdir(path) {
|
|
151
|
+
return parseListing((await this.run(FILE_SCRIPTS.list, path)).stdout);
|
|
152
|
+
}
|
|
153
|
+
async mkdir(path) {
|
|
154
|
+
await this.run(FILE_SCRIPTS.mkdir, path);
|
|
155
|
+
}
|
|
156
|
+
async exists(path) {
|
|
157
|
+
return (await this.box.script(FILE_SCRIPTS.exists, path)).exitCode === 0;
|
|
158
|
+
}
|
|
159
|
+
async remove(path) {
|
|
160
|
+
await this.run(FILE_SCRIPTS.remove, path);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=computesdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computesdk.js","sourceRoot":"","sources":["../../src/adapters/computesdk.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GASpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,SAAS,EACT,UAAU,EACV,OAAO,GACR,MAAM,oBAAoB,CAAC;AA0C5B;;;;8CAI8C;AAC9C,MAAM,OAAO,iBAAiB;IAGC;IAFpB,IAAI,CAAS;IAEtB,YAA6B,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;QAC5D,IAAI,CAAC,IAAI,GAAG,cAAc,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;IAClE,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA6B;QACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YACzD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,MAAM;YAC9C,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACvH,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,wEAAwE;QACxE,4DAA4D;QAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACpD,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,aAAa;IAIN;IACQ;IACA;IALV,UAAU,CAAoB;IAEvC,YACW,QAAgB,EACR,KAA4B,EAC5B,OAAe;QAFvB,aAAQ,GAAR,QAAQ,CAAQ;QACR,UAAK,GAAL,KAAK,CAAuB;QAC5B,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,CAAS;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,MAAc,EAAE,IAAY;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,UAA6B,EAAE;QAC/D,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC;QAC9D,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;YAC/F,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;YAClC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QAC1G,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;YACrD,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAsD;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;YAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrG,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YAC/F,SAAS;YACT,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;IAChF,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,eAAe;IAEA;IACA;IAFnB,YACmB,GAAkB,EAClB,KAA4B;QAD5B,QAAG,GAAH,GAAG,CAAe;QAClB,UAAK,GAAL,KAAK,CAAuB;IAC5C,CAAC;IAEI,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAY;QAC5C,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,CAAC,QAAQ,KAAK,cAAc;YAAE,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC1G,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAA4B;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAChF,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvF,uEAAuE;QACvE,sBAAsB;QACtB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,UAAU,CAAC,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YAC5F,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,qBAAqB,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,OAAO,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type CreateSandboxOptions, type Sandbox, type SandboxProvider } from '../ports/sandbox.js';
|
|
2
|
+
export interface DockerSandboxOptions {
|
|
3
|
+
/** The image each sandbox runs. It needs `sh`; bash, Python and
|
|
4
|
+
* `timeout` are used when there. Default `python:3.12-slim`. */
|
|
5
|
+
image?: string;
|
|
6
|
+
/** `none` (the default) or `all`. Docker has no allow list by domain. */
|
|
7
|
+
network?: 'none' | 'all';
|
|
8
|
+
/** The folder commands start in. Default `/workspace`. */
|
|
9
|
+
workdir?: string;
|
|
10
|
+
cpu?: number;
|
|
11
|
+
memoryMiB?: number;
|
|
12
|
+
/** Ports to publish on 127.0.0.1, so `getUrl` can give them. Needs
|
|
13
|
+
* `network: 'all'`. */
|
|
14
|
+
ports?: number[];
|
|
15
|
+
/** Environment variables every command sees. */
|
|
16
|
+
env?: Record<string, string>;
|
|
17
|
+
/** More `docker run` arguments, placed before the image. */
|
|
18
|
+
runArgs?: string[];
|
|
19
|
+
/** The docker CLI. Default `docker` on the PATH. */
|
|
20
|
+
docker?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Sandboxes as Docker containers on the machine the docker CLI talks to:
|
|
23
|
+
* for self-hosting. One container per thread, removed when it has been idle
|
|
24
|
+
* past its time. Uses the docker CLI, so it needs no SDK and follows your
|
|
25
|
+
* DOCKER_HOST and contexts. The Go runtime has the same adapter
|
|
26
|
+
* (adapters/docker). */
|
|
27
|
+
export declare class DockerSandbox implements SandboxProvider {
|
|
28
|
+
private readonly options;
|
|
29
|
+
readonly name = "docker";
|
|
30
|
+
private readonly docker;
|
|
31
|
+
constructor(options?: DockerSandboxOptions);
|
|
32
|
+
create(options: CreateSandboxOptions): Promise<Sandbox>;
|
|
33
|
+
connect(sandboxId: string): Promise<Sandbox>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/adapters/docker.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,oBAAoB,EAGzB,KAAK,OAAO,EAIZ,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAe7B,MAAM,WAAW,oBAAoB;IACnC;qEACiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;4BACwB;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD;;;;yBAIyB;AACzB,qBAAa,aAAc,YAAW,eAAe;IAIvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEH,OAAO,GAAE,oBAAyB;IAIzD,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BvD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAMnD"}
|