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.
Files changed (126) hide show
  1. package/README.md +48 -1
  2. package/dist/adapters/brave.d.ts +21 -0
  3. package/dist/adapters/brave.d.ts.map +1 -0
  4. package/dist/adapters/brave.js +52 -0
  5. package/dist/adapters/brave.js.map +1 -0
  6. package/dist/adapters/computesdk.d.ts +71 -0
  7. package/dist/adapters/computesdk.d.ts.map +1 -0
  8. package/dist/adapters/computesdk.js +163 -0
  9. package/dist/adapters/computesdk.js.map +1 -0
  10. package/dist/adapters/docker.d.ts +35 -0
  11. package/dist/adapters/docker.d.ts.map +1 -0
  12. package/dist/adapters/docker.js +246 -0
  13. package/dist/adapters/docker.js.map +1 -0
  14. package/dist/adapters/e2b.d.ts +44 -0
  15. package/dist/adapters/e2b.d.ts.map +1 -0
  16. package/dist/adapters/e2b.js +349 -0
  17. package/dist/adapters/e2b.js.map +1 -0
  18. package/dist/adapters/jina.d.ts +34 -0
  19. package/dist/adapters/jina.d.ts.map +1 -0
  20. package/dist/adapters/jina.js +99 -0
  21. package/dist/adapters/jina.js.map +1 -0
  22. package/dist/adapters/local-sandbox.d.ts +32 -0
  23. package/dist/adapters/local-sandbox.d.ts.map +1 -0
  24. package/dist/adapters/local-sandbox.js +257 -0
  25. package/dist/adapters/local-sandbox.js.map +1 -0
  26. package/dist/adapters/mcp.d.ts +71 -0
  27. package/dist/adapters/mcp.d.ts.map +1 -0
  28. package/dist/adapters/mcp.js +344 -0
  29. package/dist/adapters/mcp.js.map +1 -0
  30. package/dist/adapters/memory.d.ts +81 -0
  31. package/dist/adapters/memory.d.ts.map +1 -1
  32. package/dist/adapters/memory.js +207 -0
  33. package/dist/adapters/memory.js.map +1 -1
  34. package/dist/adapters/page-reader.d.ts +39 -0
  35. package/dist/adapters/page-reader.d.ts.map +1 -0
  36. package/dist/adapters/page-reader.js +165 -0
  37. package/dist/adapters/page-reader.js.map +1 -0
  38. package/dist/adapters/sandbox-shell.d.ts +60 -0
  39. package/dist/adapters/sandbox-shell.d.ts.map +1 -0
  40. package/dist/adapters/sandbox-shell.js +129 -0
  41. package/dist/adapters/sandbox-shell.js.map +1 -0
  42. package/dist/adapters/sqlite.d.ts +37 -1
  43. package/dist/adapters/sqlite.d.ts.map +1 -1
  44. package/dist/adapters/sqlite.js +106 -7
  45. package/dist/adapters/sqlite.js.map +1 -1
  46. package/dist/adapters/web-search-shared.d.ts +11 -0
  47. package/dist/adapters/web-search-shared.d.ts.map +1 -0
  48. package/dist/adapters/web-search-shared.js +40 -0
  49. package/dist/adapters/web-search-shared.js.map +1 -0
  50. package/dist/core/builtin/definitions.d.ts +12 -0
  51. package/dist/core/builtin/definitions.d.ts.map +1 -0
  52. package/dist/core/builtin/definitions.js +149 -0
  53. package/dist/core/builtin/definitions.js.map +1 -0
  54. package/dist/core/builtin/html.d.ts +13 -0
  55. package/dist/core/builtin/html.d.ts.map +1 -0
  56. package/dist/core/builtin/html.js +96 -0
  57. package/dist/core/builtin/html.js.map +1 -0
  58. package/dist/core/builtin/index.d.ts +21 -0
  59. package/dist/core/builtin/index.d.ts.map +1 -0
  60. package/dist/core/builtin/index.js +55 -0
  61. package/dist/core/builtin/index.js.map +1 -0
  62. package/dist/core/builtin/run.d.ts +37 -0
  63. package/dist/core/builtin/run.d.ts.map +1 -0
  64. package/dist/core/builtin/run.js +56 -0
  65. package/dist/core/builtin/run.js.map +1 -0
  66. package/dist/core/builtin/sandbox-tools.d.ts +69 -0
  67. package/dist/core/builtin/sandbox-tools.d.ts.map +1 -0
  68. package/dist/core/builtin/sandbox-tools.js +389 -0
  69. package/dist/core/builtin/sandbox-tools.js.map +1 -0
  70. package/dist/core/builtin/sandbox.d.ts +52 -0
  71. package/dist/core/builtin/sandbox.d.ts.map +1 -0
  72. package/dist/core/builtin/sandbox.js +174 -0
  73. package/dist/core/builtin/sandbox.js.map +1 -0
  74. package/dist/core/builtin/web.d.ts +54 -0
  75. package/dist/core/builtin/web.d.ts.map +1 -0
  76. package/dist/core/builtin/web.js +167 -0
  77. package/dist/core/builtin/web.js.map +1 -0
  78. package/dist/core/deleteThread.d.ts.map +1 -1
  79. package/dist/core/deleteThread.js +3 -0
  80. package/dist/core/deleteThread.js.map +1 -1
  81. package/dist/core/engine.d.ts.map +1 -1
  82. package/dist/core/engine.js +29 -5
  83. package/dist/core/engine.js.map +1 -1
  84. package/dist/core/permanent.d.ts +11 -0
  85. package/dist/core/permanent.d.ts.map +1 -0
  86. package/dist/core/permanent.js +37 -0
  87. package/dist/core/permanent.js.map +1 -0
  88. package/dist/core/publish.d.ts +4 -1
  89. package/dist/core/publish.d.ts.map +1 -1
  90. package/dist/core/publish.js +4 -1
  91. package/dist/core/publish.js.map +1 -1
  92. package/dist/core/run.d.ts.map +1 -1
  93. package/dist/core/run.js +5 -4
  94. package/dist/core/run.js.map +1 -1
  95. package/dist/core/subagent.d.ts.map +1 -1
  96. package/dist/core/subagent.js +13 -3
  97. package/dist/core/subagent.js.map +1 -1
  98. package/dist/core/tools.d.ts +9 -3
  99. package/dist/core/tools.d.ts.map +1 -1
  100. package/dist/core/tools.js.map +1 -1
  101. package/dist/core/types.d.ts +25 -1
  102. package/dist/core/types.d.ts.map +1 -1
  103. package/dist/core/types.js +14 -1
  104. package/dist/core/types.js.map +1 -1
  105. package/dist/index.d.ts +16 -3
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +13 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/ports/runtime.d.ts +47 -22
  110. package/dist/ports/runtime.d.ts.map +1 -1
  111. package/dist/ports/sandbox.d.ts +159 -0
  112. package/dist/ports/sandbox.d.ts.map +1 -0
  113. package/dist/ports/sandbox.js +44 -0
  114. package/dist/ports/sandbox.js.map +1 -0
  115. package/dist/ports/tools.d.ts +60 -0
  116. package/dist/ports/tools.d.ts.map +1 -0
  117. package/dist/ports/tools.js +5 -0
  118. package/dist/ports/tools.js.map +1 -0
  119. package/dist/pricing.d.ts +24 -0
  120. package/dist/pricing.d.ts.map +1 -1
  121. package/dist/pricing.js +43 -0
  122. package/dist/pricing.js.map +1 -1
  123. package/dist/runtime.d.ts.map +1 -1
  124. package/dist/runtime.js +18 -10
  125. package/dist/runtime.js.map +1 -1
  126. 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":"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"}
@@ -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"}