agentenkit 0.3.0 → 0.5.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 +82 -15
- 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/inline.d.ts +19 -5
- package/dist/adapters/inline.d.ts.map +1 -1
- package/dist/adapters/inline.js +87 -14
- package/dist/adapters/inline.js.map +1 -1
- 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/memory.d.ts +146 -3
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +474 -3
- 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/prisma.d.ts +125 -18
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +308 -67
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/qstash.d.ts +15 -2
- package/dist/adapters/qstash.d.ts.map +1 -1
- package/dist/adapters/qstash.js +31 -14
- package/dist/adapters/qstash.js.map +1 -1
- package/dist/adapters/redis.d.ts +40 -4
- package/dist/adapters/redis.d.ts.map +1 -1
- package/dist/adapters/redis.js +265 -20
- package/dist/adapters/redis.js.map +1 -1
- 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 +88 -2
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +443 -37
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/adapters/stream-scripts.d.ts +49 -0
- package/dist/adapters/stream-scripts.d.ts.map +1 -0
- package/dist/adapters/stream-scripts.js +150 -0
- package/dist/adapters/stream-scripts.js.map +1 -0
- package/dist/adapters/upstash.d.ts +20 -0
- package/dist/adapters/upstash.d.ts.map +1 -1
- package/dist/adapters/upstash.js +29 -0
- package/dist/adapters/upstash.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/admin/memory.d.ts +11 -1
- package/dist/admin/memory.d.ts.map +1 -1
- package/dist/admin/memory.js +83 -14
- package/dist/admin/memory.js.map +1 -1
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
- package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
- package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
- package/dist/admin/migrations/postgres/index.js +16 -1
- package/dist/admin/migrations/postgres/index.js.map +1 -1
- package/dist/admin/migrations/runner.d.ts +21 -1
- package/dist/admin/migrations/runner.d.ts.map +1 -1
- package/dist/admin/migrations/runner.js +41 -4
- package/dist/admin/migrations/runner.js.map +1 -1
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
- package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
- package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
- package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
- package/dist/admin/migrations/sqlite/index.d.ts +2 -2
- package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
- package/dist/admin/migrations/sqlite/index.js +17 -3
- package/dist/admin/migrations/sqlite/index.js.map +1 -1
- package/dist/admin/postgres.d.ts +14 -4
- package/dist/admin/postgres.d.ts.map +1 -1
- package/dist/admin/postgres.js +131 -36
- package/dist/admin/postgres.js.map +1 -1
- package/dist/admin/shared.d.ts +19 -0
- package/dist/admin/shared.d.ts.map +1 -0
- package/dist/admin/shared.js +28 -0
- package/dist/admin/shared.js.map +1 -0
- package/dist/admin/sqlite.d.ts +9 -1
- package/dist/admin/sqlite.d.ts.map +1 -1
- package/dist/admin/sqlite.js +112 -29
- package/dist/admin/sqlite.js.map +1 -1
- package/dist/core/admin.d.ts +28 -6
- package/dist/core/admin.d.ts.map +1 -1
- package/dist/core/admin.js +92 -23
- package/dist/core/admin.js.map +1 -1
- package/dist/core/agent.d.ts +7 -4
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +15 -11
- package/dist/core/agent.js.map +1 -1
- package/dist/core/agui.d.ts +17 -0
- package/dist/core/agui.d.ts.map +1 -0
- package/dist/core/agui.js +69 -0
- package/dist/core/agui.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 +55 -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/context.d.ts +13 -1
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +70 -19
- package/dist/core/context.js.map +1 -1
- package/dist/core/deleteThread.d.ts.map +1 -1
- package/dist/core/deleteThread.js +36 -4
- package/dist/core/deleteThread.js.map +1 -1
- package/dist/core/engine.d.ts +41 -11
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +880 -353
- package/dist/core/engine.js.map +1 -1
- package/dist/core/follow.d.ts +63 -1
- package/dist/core/follow.d.ts.map +1 -1
- package/dist/core/follow.js +293 -16
- package/dist/core/follow.js.map +1 -1
- package/dist/core/hitl.d.ts +43 -0
- package/dist/core/hitl.d.ts.map +1 -1
- package/dist/core/hitl.js +163 -35
- package/dist/core/hitl.js.map +1 -1
- package/dist/core/keys.d.ts +22 -4
- package/dist/core/keys.d.ts.map +1 -1
- package/dist/core/keys.js +23 -5
- package/dist/core/keys.js.map +1 -1
- package/dist/core/lease.d.ts +46 -0
- package/dist/core/lease.d.ts.map +1 -0
- package/dist/core/lease.js +142 -0
- package/dist/core/lease.js.map +1 -0
- package/dist/core/loop.d.ts +27 -7
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +140 -55
- package/dist/core/loop.js.map +1 -1
- package/dist/core/messages.d.ts +21 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +61 -2
- package/dist/core/messages.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/prune.d.ts +24 -0
- package/dist/core/prune.d.ts.map +1 -0
- package/dist/core/prune.js +43 -0
- package/dist/core/prune.js.map +1 -0
- package/dist/core/publish.d.ts +38 -10
- package/dist/core/publish.d.ts.map +1 -1
- package/dist/core/publish.js +126 -12
- package/dist/core/publish.js.map +1 -1
- package/dist/core/reclaim.d.ts +8 -1
- package/dist/core/reclaim.d.ts.map +1 -1
- package/dist/core/reclaim.js +149 -18
- package/dist/core/reclaim.js.map +1 -1
- package/dist/core/run.d.ts +7 -3
- package/dist/core/run.d.ts.map +1 -1
- package/dist/core/run.js +95 -35
- package/dist/core/run.js.map +1 -1
- package/dist/core/segment.d.ts +62 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +318 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/settle.d.ts +57 -0
- package/dist/core/settle.d.ts.map +1 -0
- package/dist/core/settle.js +181 -0
- package/dist/core/settle.js.map +1 -0
- package/dist/core/snapshot.d.ts +36 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +87 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/stop.d.ts +16 -1
- package/dist/core/stop.d.ts.map +1 -1
- package/dist/core/stop.js +69 -15
- package/dist/core/stop.js.map +1 -1
- package/dist/core/stream-events.d.ts +184 -0
- package/dist/core/stream-events.d.ts.map +1 -0
- package/dist/core/stream-events.js +26 -0
- package/dist/core/stream-events.js.map +1 -0
- package/dist/core/stream.d.ts +29 -0
- package/dist/core/stream.d.ts.map +1 -1
- package/dist/core/stream.js +79 -0
- package/dist/core/stream.js.map +1 -1
- package/dist/core/subagent.d.ts +36 -5
- package/dist/core/subagent.d.ts.map +1 -1
- package/dist/core/subagent.js +130 -25
- 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 +212 -13
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +29 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/usage.d.ts +53 -5
- package/dist/core/usage.d.ts.map +1 -1
- package/dist/core/usage.js +170 -47
- package/dist/core/usage.js.map +1 -1
- package/dist/index.d.ts +29 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -7
- package/dist/index.js.map +1 -1
- package/dist/ports/admin.d.ts +59 -0
- package/dist/ports/admin.d.ts.map +1 -1
- package/dist/ports/kv.d.ts +17 -0
- package/dist/ports/kv.d.ts.map +1 -1
- package/dist/ports/queue.d.ts +87 -7
- package/dist/ports/queue.d.ts.map +1 -1
- package/dist/ports/queue.js +36 -1
- package/dist/ports/queue.js.map +1 -1
- package/dist/ports/runtime.d.ts +188 -20
- 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/storage.d.ts +26 -5
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/ports/streams.d.ts +60 -0
- package/dist/ports/streams.d.ts.map +1 -0
- package/dist/ports/streams.js +20 -0
- package/dist/ports/streams.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 +29 -0
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +64 -10
- package/dist/pricing.js.map +1 -1
- package/dist/runtime.d.ts +6 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +147 -46
- 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.
|
|
@@ -16,14 +17,14 @@ now describe that behaviour.
|
|
|
16
17
|
|
|
17
18
|
## Running locally, with nothing to stand up
|
|
18
19
|
|
|
19
|
-
There is no `createDevRuntime`. Assembling the platform is
|
|
20
|
+
There is no `createDevRuntime`. Assembling the platform is five adapters and one wire,
|
|
20
21
|
and seeing them is the point — swapping any of them for the durable equivalent later is
|
|
21
22
|
then obvious rather than magic.
|
|
22
23
|
|
|
23
24
|
```ts
|
|
24
25
|
import { Database } from 'bun:sqlite'; // or node:sqlite — see openSqlite
|
|
25
26
|
import { setupAgentCore } from 'agentenkit';
|
|
26
|
-
import { SqliteStorage } from 'agentenkit/adapters/sqlite';
|
|
27
|
+
import { SqliteRunStreams, SqliteStorage } from 'agentenkit/adapters/sqlite';
|
|
27
28
|
import { InlineQueue } from 'agentenkit/adapters/inline';
|
|
28
29
|
import { MemoryBus, MemoryKv } from 'agentenkit/adapters/memory';
|
|
29
30
|
import { SqliteAdminStore } from 'agentenkit/admin/sqlite';
|
|
@@ -36,6 +37,7 @@ const queue = new InlineQueue();
|
|
|
36
37
|
|
|
37
38
|
export const runtime = await setupAgentCore({
|
|
38
39
|
storage: new SqliteStorage(db), // ← later: PrismaStorage, or your own
|
|
40
|
+
streams: new SqliteRunStreams(db), // ← later: RedisRunStreams, PrismaRunStreams
|
|
39
41
|
admin: SqliteAdminStore.open(db), // ← later: PostgresAdminStore
|
|
40
42
|
bus: new MemoryBus(), // ← later: RedisBus
|
|
41
43
|
kv: new MemoryKv(), // ← later: RedisKv
|
|
@@ -79,7 +81,7 @@ import { createClient } from 'redis';
|
|
|
79
81
|
import { PrismaClient } from '@prisma/client';
|
|
80
82
|
import { setupAgentCore } from 'agentenkit';
|
|
81
83
|
import { PrismaStorage } from 'agentenkit/adapters/prisma';
|
|
82
|
-
import { RedisBus, RedisKv } from 'agentenkit/adapters/redis';
|
|
84
|
+
import { RedisBus, RedisKv, RedisRunStreams } from 'agentenkit/adapters/redis';
|
|
83
85
|
import { QStashQueue } from 'agentenkit/adapters/qstash';
|
|
84
86
|
|
|
85
87
|
const redis = createClient({ url: process.env.REDIS_URL });
|
|
@@ -93,6 +95,7 @@ export const runtime = await setupAgentCore({
|
|
|
93
95
|
{ url: 'https://app.example.com/api/queue/agent-run' },
|
|
94
96
|
),
|
|
95
97
|
kv: new RedisKv(redis),
|
|
98
|
+
streams: new RedisRunStreams(redis), // ← one stream per run segment
|
|
96
99
|
// `admin` omitted on purpose: with AGENTIC_KIT_ADMIN_DATABASE_URL set, the
|
|
97
100
|
// platform opens Postgres for its own history (§2.9). Pass one to override.
|
|
98
101
|
resolveModel: (name) => ({ instance: () => models[name], contextWindow: 128_000 }),
|
|
@@ -110,16 +113,27 @@ await chat.run({ prompt: 'hi', state: { orgId } }); // persist + enqueue
|
|
|
110
113
|
await chat.stop(threadId); // one write: state → CANCELLED (§2.1)
|
|
111
114
|
await runtime.hitl.respond({ threadId, toolCallId, approved, payload, state }); // §2.5
|
|
112
115
|
await runtime.getThreadSnapshot(threadId, state); // hydrate a client (§2.2)
|
|
113
|
-
const { stream, headers } = runtime.events.sse(threadId, {
|
|
114
|
-
for await (const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
116
|
+
const { stream, headers } = runtime.events.sse(threadId, { cursor, lastMessageId, signal }); // SSE, any framework
|
|
117
|
+
for await (const frame of runtime.events.follow(threadId, { cursor, signal })) { … } // or iterate
|
|
118
|
+
for await (const item of runtime.streams.read(streamId, null, signal)) { … } // one run stream
|
|
119
|
+
const missed = await runtime.events.since(threadId, lastSeq); // the thread record, raw
|
|
120
|
+
const unsub = await runtime.events.subscribe(threadId, handler); // raw tail of the bus
|
|
117
121
|
await runtime.worker.handleJob(job); // queue consumer (§2.8)
|
|
118
|
-
await runtime.events.publishEvent(threadId, 'MY_EVENT', payload);
|
|
122
|
+
await runtime.events.publishEvent(threadId, 'MY_EVENT', payload); // your own event, live only
|
|
123
|
+
await runtime.events.publishEvent(threadId, 'MY_EVENT', payload, { durable: true }); // …or kept in the record
|
|
124
|
+
await runtime.pruneEvents({ dryRun: true }); // after upgrading: clear old stream-only rows
|
|
119
125
|
```
|
|
120
126
|
|
|
127
|
+
A follow yields frames: `{ kind: 'thread', event }` (a record entry or a
|
|
128
|
+
notice), `{ kind: 'stream', streamId, item }` (a run stream item) and
|
|
129
|
+
`{ kind: 'snapshot', snapshot }` (sent once when the stream the client was
|
|
130
|
+
reading is gone). The cursor is one string, `<seq> <streamId> <offset>`; every
|
|
131
|
+
SSE frame that moves it carries it as its `id:`, so EventSource sends it back
|
|
132
|
+
as `Last-Event-ID`. See [Run streams](../../docs/run-streams.md).
|
|
133
|
+
|
|
121
134
|
Tools get `publishEvent` on their second argument, bound to their thread; see
|
|
122
|
-
[Custom events](../../docs/custom-events.md).
|
|
135
|
+
[Custom events](../../docs/custom-events.md). It is live only unless you pass
|
|
136
|
+
`{ durable: true }`.
|
|
123
137
|
|
|
124
138
|
The Next.js routes in [`examples/nextjs-app`](../../examples/nextjs-app) show the HTTP
|
|
125
139
|
wiring — each handler is a few lines over the runtime.
|
|
@@ -154,10 +168,16 @@ declare module 'agentenkit' {
|
|
|
154
168
|
|
|
155
169
|
| Port | Role | Reference adapter |
|
|
156
170
|
| :--- | :--- | :--- |
|
|
157
|
-
| `Storage` | threads / messages /
|
|
171
|
+
| `Storage` | threads / messages / the thread record / usage — incl. atomic `claimState` | `PrismaStorage`, `SqliteStorage` |
|
|
158
172
|
| `EventBus` | live fan-out + HITL death notices (at-most-once) | `RedisBus`, `UpstashBus` |
|
|
159
173
|
| `Queue` | durable run dispatch (at-least-once) | `QStashQueue`, `InlineQueue` (dev) |
|
|
160
|
-
| `Kv` | hot state cache, HITL handoff keys,
|
|
174
|
+
| `Kv` | hot state cache, HITL handoff keys, segment/attempt counters | `RedisKv`, `UpstashKv` |
|
|
175
|
+
| `RunStreams` | one short-lived stream per run segment | `RedisRunStreams`, `UpstashRunStreams`, `PrismaRunStreams`, `SqliteRunStreams` |
|
|
176
|
+
|
|
177
|
+
Leave `streams` out and they are kept in memory, with a warning logged once.
|
|
178
|
+
Only that process can read them, so when web servers and workers run apart,
|
|
179
|
+
pass a real one. `PrismaRunStreams` needs the `RunStream` and `RunStreamEvent`
|
|
180
|
+
models from [the example schema](../../examples/nextjs-app/prisma/schema.prisma).
|
|
161
181
|
|
|
162
182
|
Implement any of them for your own stack — `core/` imports nothing else. The
|
|
163
183
|
[`Memory*` adapters](./src/adapters/memory.ts) are a complete implementation used by the
|
|
@@ -198,6 +218,51 @@ tokens.
|
|
|
198
218
|
`chain`, to try one then the other. See
|
|
199
219
|
[Cost and pricing](https://eadwincode.github.io/agentic-kit/cost-and-pricing).
|
|
200
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
|
+
|
|
201
266
|
## The admin store (§2.9) — not yours
|
|
202
267
|
|
|
203
268
|
Run records, step timings and a thread index are the **platform's** data, in the
|
|
@@ -207,7 +272,7 @@ platform's own tables. You do not implement `AdminStore`; you read it back:
|
|
|
207
272
|
await runtime.admin.overview(); // threads and runs by state, plus what's in flight
|
|
208
273
|
await runtime.admin.listRuns({ state: ['FAILED'], since });
|
|
209
274
|
await runtime.admin.stats({ since }); // p50/p95 duration and queue wait, tokens, failures
|
|
210
|
-
await runtime.admin.getRun(runId); // one run: steps, nested runs,
|
|
275
|
+
await runtime.admin.getRun(runId); // one run: steps, nested runs, its record entries, spend
|
|
211
276
|
```
|
|
212
277
|
|
|
213
278
|
Its schema migrates itself, from numbered migration files. `setupAgentCore`
|
|
@@ -236,7 +301,8 @@ reading your database at all.
|
|
|
236
301
|
|
|
237
302
|
## Adapter invariants (§3.4)
|
|
238
303
|
|
|
239
|
-
1. `events.append`
|
|
304
|
+
1. `events.append` takes an entry without a `seq` and the store mints it — monotonic per
|
|
305
|
+
thread, never repeated.
|
|
240
306
|
2. `threads.claimState` must be atomic (one conditional UPDATE) — exactly one caller wins.
|
|
241
307
|
3. `queue.enqueue` is at-least-once and the engine is idempotent. An adapter that cannot
|
|
242
308
|
honour `delaySeconds` may deliver immediately, but must never throw for it — a HITL
|
|
@@ -251,13 +317,14 @@ reading your database at all.
|
|
|
251
317
|
| Spec | Where in the package |
|
|
252
318
|
| :--- | :--- |
|
|
253
319
|
| §2.1 Detached execution, stop, run identity | `core/run.ts`, `core/stop.ts`, `core/engine.ts`, `core/keys.ts` |
|
|
254
|
-
| §2.2 Multi-user stream | `ports/bus.ts` + `runtime.events` |
|
|
320
|
+
| §2.2 Multi-user stream | `ports/bus.ts`, `ports/streams.ts`, `core/follow.ts` + `runtime.events` |
|
|
255
321
|
| §2.5 HITL park, respond, expiry, reclaim | `core/hitl.ts`, `core/reclaim.ts` |
|
|
256
322
|
| §2.6 Context ceiling & compaction | `core/context.ts` |
|
|
257
323
|
| §2.7 Subagents as nested runs | `core/subagent.ts`, `core/loop.ts` |
|
|
258
324
|
| §2.8 Queue dispatch + redrive/FAIL policy | `ports/queue.ts`, `core/engine.ts` |
|
|
259
325
|
| §2.9 Operational history | `ports/admin.ts`, `admin/*`, `core/admin.ts` |
|
|
260
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` |
|
|
261
328
|
| §5 Reference HTTP integration | `examples/nextjs-app` |
|
|
262
329
|
|
|
263
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"}
|