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.
Files changed (295) hide show
  1. package/README.md +82 -15
  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/inline.d.ts +19 -5
  19. package/dist/adapters/inline.d.ts.map +1 -1
  20. package/dist/adapters/inline.js +87 -14
  21. package/dist/adapters/inline.js.map +1 -1
  22. package/dist/adapters/jina.d.ts +34 -0
  23. package/dist/adapters/jina.d.ts.map +1 -0
  24. package/dist/adapters/jina.js +99 -0
  25. package/dist/adapters/jina.js.map +1 -0
  26. package/dist/adapters/local-sandbox.d.ts +32 -0
  27. package/dist/adapters/local-sandbox.d.ts.map +1 -0
  28. package/dist/adapters/local-sandbox.js +257 -0
  29. package/dist/adapters/local-sandbox.js.map +1 -0
  30. package/dist/adapters/memory.d.ts +146 -3
  31. package/dist/adapters/memory.d.ts.map +1 -1
  32. package/dist/adapters/memory.js +474 -3
  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/prisma.d.ts +125 -18
  39. package/dist/adapters/prisma.d.ts.map +1 -1
  40. package/dist/adapters/prisma.js +308 -67
  41. package/dist/adapters/prisma.js.map +1 -1
  42. package/dist/adapters/qstash.d.ts +15 -2
  43. package/dist/adapters/qstash.d.ts.map +1 -1
  44. package/dist/adapters/qstash.js +31 -14
  45. package/dist/adapters/qstash.js.map +1 -1
  46. package/dist/adapters/redis.d.ts +40 -4
  47. package/dist/adapters/redis.d.ts.map +1 -1
  48. package/dist/adapters/redis.js +265 -20
  49. package/dist/adapters/redis.js.map +1 -1
  50. package/dist/adapters/sandbox-shell.d.ts +60 -0
  51. package/dist/adapters/sandbox-shell.d.ts.map +1 -0
  52. package/dist/adapters/sandbox-shell.js +129 -0
  53. package/dist/adapters/sandbox-shell.js.map +1 -0
  54. package/dist/adapters/sqlite.d.ts +88 -2
  55. package/dist/adapters/sqlite.d.ts.map +1 -1
  56. package/dist/adapters/sqlite.js +443 -37
  57. package/dist/adapters/sqlite.js.map +1 -1
  58. package/dist/adapters/stream-scripts.d.ts +49 -0
  59. package/dist/adapters/stream-scripts.d.ts.map +1 -0
  60. package/dist/adapters/stream-scripts.js +150 -0
  61. package/dist/adapters/stream-scripts.js.map +1 -0
  62. package/dist/adapters/upstash.d.ts +20 -0
  63. package/dist/adapters/upstash.d.ts.map +1 -1
  64. package/dist/adapters/upstash.js +29 -0
  65. package/dist/adapters/upstash.js.map +1 -1
  66. package/dist/adapters/web-search-shared.d.ts +11 -0
  67. package/dist/adapters/web-search-shared.d.ts.map +1 -0
  68. package/dist/adapters/web-search-shared.js +40 -0
  69. package/dist/adapters/web-search-shared.js.map +1 -0
  70. package/dist/admin/memory.d.ts +11 -1
  71. package/dist/admin/memory.d.ts.map +1 -1
  72. package/dist/admin/memory.js +83 -14
  73. package/dist/admin/memory.js.map +1 -1
  74. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
  75. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
  76. package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
  77. package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
  78. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
  79. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
  80. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
  81. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
  82. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
  83. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
  84. package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
  85. package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
  86. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
  87. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
  88. package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
  89. package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
  90. package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
  91. package/dist/admin/migrations/postgres/index.js +16 -1
  92. package/dist/admin/migrations/postgres/index.js.map +1 -1
  93. package/dist/admin/migrations/runner.d.ts +21 -1
  94. package/dist/admin/migrations/runner.d.ts.map +1 -1
  95. package/dist/admin/migrations/runner.js +41 -4
  96. package/dist/admin/migrations/runner.js.map +1 -1
  97. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
  98. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
  99. package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
  100. package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
  101. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
  102. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
  103. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
  104. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
  105. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
  106. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
  107. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
  108. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
  109. package/dist/admin/migrations/sqlite/index.d.ts +2 -2
  110. package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
  111. package/dist/admin/migrations/sqlite/index.js +17 -3
  112. package/dist/admin/migrations/sqlite/index.js.map +1 -1
  113. package/dist/admin/postgres.d.ts +14 -4
  114. package/dist/admin/postgres.d.ts.map +1 -1
  115. package/dist/admin/postgres.js +131 -36
  116. package/dist/admin/postgres.js.map +1 -1
  117. package/dist/admin/shared.d.ts +19 -0
  118. package/dist/admin/shared.d.ts.map +1 -0
  119. package/dist/admin/shared.js +28 -0
  120. package/dist/admin/shared.js.map +1 -0
  121. package/dist/admin/sqlite.d.ts +9 -1
  122. package/dist/admin/sqlite.d.ts.map +1 -1
  123. package/dist/admin/sqlite.js +112 -29
  124. package/dist/admin/sqlite.js.map +1 -1
  125. package/dist/core/admin.d.ts +28 -6
  126. package/dist/core/admin.d.ts.map +1 -1
  127. package/dist/core/admin.js +92 -23
  128. package/dist/core/admin.js.map +1 -1
  129. package/dist/core/agent.d.ts +7 -4
  130. package/dist/core/agent.d.ts.map +1 -1
  131. package/dist/core/agent.js +15 -11
  132. package/dist/core/agent.js.map +1 -1
  133. package/dist/core/agui.d.ts +17 -0
  134. package/dist/core/agui.d.ts.map +1 -0
  135. package/dist/core/agui.js +69 -0
  136. package/dist/core/agui.js.map +1 -0
  137. package/dist/core/builtin/definitions.d.ts +12 -0
  138. package/dist/core/builtin/definitions.d.ts.map +1 -0
  139. package/dist/core/builtin/definitions.js +149 -0
  140. package/dist/core/builtin/definitions.js.map +1 -0
  141. package/dist/core/builtin/html.d.ts +13 -0
  142. package/dist/core/builtin/html.d.ts.map +1 -0
  143. package/dist/core/builtin/html.js +96 -0
  144. package/dist/core/builtin/html.js.map +1 -0
  145. package/dist/core/builtin/index.d.ts +21 -0
  146. package/dist/core/builtin/index.d.ts.map +1 -0
  147. package/dist/core/builtin/index.js +55 -0
  148. package/dist/core/builtin/index.js.map +1 -0
  149. package/dist/core/builtin/run.d.ts +37 -0
  150. package/dist/core/builtin/run.d.ts.map +1 -0
  151. package/dist/core/builtin/run.js +55 -0
  152. package/dist/core/builtin/run.js.map +1 -0
  153. package/dist/core/builtin/sandbox-tools.d.ts +69 -0
  154. package/dist/core/builtin/sandbox-tools.d.ts.map +1 -0
  155. package/dist/core/builtin/sandbox-tools.js +389 -0
  156. package/dist/core/builtin/sandbox-tools.js.map +1 -0
  157. package/dist/core/builtin/sandbox.d.ts +52 -0
  158. package/dist/core/builtin/sandbox.d.ts.map +1 -0
  159. package/dist/core/builtin/sandbox.js +174 -0
  160. package/dist/core/builtin/sandbox.js.map +1 -0
  161. package/dist/core/builtin/web.d.ts +54 -0
  162. package/dist/core/builtin/web.d.ts.map +1 -0
  163. package/dist/core/builtin/web.js +167 -0
  164. package/dist/core/builtin/web.js.map +1 -0
  165. package/dist/core/context.d.ts +13 -1
  166. package/dist/core/context.d.ts.map +1 -1
  167. package/dist/core/context.js +70 -19
  168. package/dist/core/context.js.map +1 -1
  169. package/dist/core/deleteThread.d.ts.map +1 -1
  170. package/dist/core/deleteThread.js +36 -4
  171. package/dist/core/deleteThread.js.map +1 -1
  172. package/dist/core/engine.d.ts +41 -11
  173. package/dist/core/engine.d.ts.map +1 -1
  174. package/dist/core/engine.js +880 -353
  175. package/dist/core/engine.js.map +1 -1
  176. package/dist/core/follow.d.ts +63 -1
  177. package/dist/core/follow.d.ts.map +1 -1
  178. package/dist/core/follow.js +293 -16
  179. package/dist/core/follow.js.map +1 -1
  180. package/dist/core/hitl.d.ts +43 -0
  181. package/dist/core/hitl.d.ts.map +1 -1
  182. package/dist/core/hitl.js +163 -35
  183. package/dist/core/hitl.js.map +1 -1
  184. package/dist/core/keys.d.ts +22 -4
  185. package/dist/core/keys.d.ts.map +1 -1
  186. package/dist/core/keys.js +23 -5
  187. package/dist/core/keys.js.map +1 -1
  188. package/dist/core/lease.d.ts +46 -0
  189. package/dist/core/lease.d.ts.map +1 -0
  190. package/dist/core/lease.js +142 -0
  191. package/dist/core/lease.js.map +1 -0
  192. package/dist/core/loop.d.ts +27 -7
  193. package/dist/core/loop.d.ts.map +1 -1
  194. package/dist/core/loop.js +140 -55
  195. package/dist/core/loop.js.map +1 -1
  196. package/dist/core/messages.d.ts +21 -2
  197. package/dist/core/messages.d.ts.map +1 -1
  198. package/dist/core/messages.js +61 -2
  199. package/dist/core/messages.js.map +1 -1
  200. package/dist/core/permanent.d.ts +11 -0
  201. package/dist/core/permanent.d.ts.map +1 -0
  202. package/dist/core/permanent.js +37 -0
  203. package/dist/core/permanent.js.map +1 -0
  204. package/dist/core/prune.d.ts +24 -0
  205. package/dist/core/prune.d.ts.map +1 -0
  206. package/dist/core/prune.js +43 -0
  207. package/dist/core/prune.js.map +1 -0
  208. package/dist/core/publish.d.ts +38 -10
  209. package/dist/core/publish.d.ts.map +1 -1
  210. package/dist/core/publish.js +126 -12
  211. package/dist/core/publish.js.map +1 -1
  212. package/dist/core/reclaim.d.ts +8 -1
  213. package/dist/core/reclaim.d.ts.map +1 -1
  214. package/dist/core/reclaim.js +149 -18
  215. package/dist/core/reclaim.js.map +1 -1
  216. package/dist/core/run.d.ts +7 -3
  217. package/dist/core/run.d.ts.map +1 -1
  218. package/dist/core/run.js +95 -35
  219. package/dist/core/run.js.map +1 -1
  220. package/dist/core/segment.d.ts +62 -0
  221. package/dist/core/segment.d.ts.map +1 -0
  222. package/dist/core/segment.js +318 -0
  223. package/dist/core/segment.js.map +1 -0
  224. package/dist/core/settle.d.ts +57 -0
  225. package/dist/core/settle.d.ts.map +1 -0
  226. package/dist/core/settle.js +181 -0
  227. package/dist/core/settle.js.map +1 -0
  228. package/dist/core/snapshot.d.ts +36 -0
  229. package/dist/core/snapshot.d.ts.map +1 -0
  230. package/dist/core/snapshot.js +87 -0
  231. package/dist/core/snapshot.js.map +1 -0
  232. package/dist/core/stop.d.ts +16 -1
  233. package/dist/core/stop.d.ts.map +1 -1
  234. package/dist/core/stop.js +69 -15
  235. package/dist/core/stop.js.map +1 -1
  236. package/dist/core/stream-events.d.ts +184 -0
  237. package/dist/core/stream-events.d.ts.map +1 -0
  238. package/dist/core/stream-events.js +26 -0
  239. package/dist/core/stream-events.js.map +1 -0
  240. package/dist/core/stream.d.ts +29 -0
  241. package/dist/core/stream.d.ts.map +1 -1
  242. package/dist/core/stream.js +79 -0
  243. package/dist/core/stream.js.map +1 -1
  244. package/dist/core/subagent.d.ts +36 -5
  245. package/dist/core/subagent.d.ts.map +1 -1
  246. package/dist/core/subagent.js +130 -25
  247. package/dist/core/subagent.js.map +1 -1
  248. package/dist/core/tools.d.ts +9 -3
  249. package/dist/core/tools.d.ts.map +1 -1
  250. package/dist/core/tools.js.map +1 -1
  251. package/dist/core/types.d.ts +212 -13
  252. package/dist/core/types.d.ts.map +1 -1
  253. package/dist/core/types.js +29 -1
  254. package/dist/core/types.js.map +1 -1
  255. package/dist/core/usage.d.ts +53 -5
  256. package/dist/core/usage.d.ts.map +1 -1
  257. package/dist/core/usage.js +170 -47
  258. package/dist/core/usage.js.map +1 -1
  259. package/dist/index.d.ts +29 -12
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +23 -7
  262. package/dist/index.js.map +1 -1
  263. package/dist/ports/admin.d.ts +59 -0
  264. package/dist/ports/admin.d.ts.map +1 -1
  265. package/dist/ports/kv.d.ts +17 -0
  266. package/dist/ports/kv.d.ts.map +1 -1
  267. package/dist/ports/queue.d.ts +87 -7
  268. package/dist/ports/queue.d.ts.map +1 -1
  269. package/dist/ports/queue.js +36 -1
  270. package/dist/ports/queue.js.map +1 -1
  271. package/dist/ports/runtime.d.ts +188 -20
  272. package/dist/ports/runtime.d.ts.map +1 -1
  273. package/dist/ports/sandbox.d.ts +159 -0
  274. package/dist/ports/sandbox.d.ts.map +1 -0
  275. package/dist/ports/sandbox.js +44 -0
  276. package/dist/ports/sandbox.js.map +1 -0
  277. package/dist/ports/storage.d.ts +26 -5
  278. package/dist/ports/storage.d.ts.map +1 -1
  279. package/dist/ports/streams.d.ts +60 -0
  280. package/dist/ports/streams.d.ts.map +1 -0
  281. package/dist/ports/streams.js +20 -0
  282. package/dist/ports/streams.js.map +1 -0
  283. package/dist/ports/tools.d.ts +60 -0
  284. package/dist/ports/tools.d.ts.map +1 -0
  285. package/dist/ports/tools.js +5 -0
  286. package/dist/ports/tools.js.map +1 -0
  287. package/dist/pricing.d.ts +29 -0
  288. package/dist/pricing.d.ts.map +1 -1
  289. package/dist/pricing.js +64 -10
  290. package/dist/pricing.js.map +1 -1
  291. package/dist/runtime.d.ts +6 -0
  292. package/dist/runtime.d.ts.map +1 -1
  293. package/dist/runtime.js +147 -46
  294. package/dist/runtime.js.map +1 -1
  295. 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 four adapters and one wire,
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, { since, signal }); // SSE, any framework
114
- for await (const e of runtime.events.follow(threadId, { signal })) { … } // or iterate
115
- const missed = await runtime.events.since(threadId, lastSeq); // raw replay
116
- const unsub = await runtime.events.subscribe(threadId, handler); // raw tail
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); // your own event, same pipe
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 / events / usage — incl. atomic `claimState` | `PrismaStorage`, `SqliteStorage` |
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, seq/attempt counters | `RedisKv`, `UpstashKv` |
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, timeline, spend
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` receives `seq` from `kv.incr('agent:seq:{threadId}')` — monotonic per thread.
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"}