agentenkit 0.2.3 → 0.4.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 (216) hide show
  1. package/README.md +34 -14
  2. package/dist/adapters/inline.d.ts +19 -5
  3. package/dist/adapters/inline.d.ts.map +1 -1
  4. package/dist/adapters/inline.js +87 -14
  5. package/dist/adapters/inline.js.map +1 -1
  6. package/dist/adapters/memory.d.ts +65 -3
  7. package/dist/adapters/memory.d.ts.map +1 -1
  8. package/dist/adapters/memory.js +267 -3
  9. package/dist/adapters/memory.js.map +1 -1
  10. package/dist/adapters/prisma.d.ts +125 -18
  11. package/dist/adapters/prisma.d.ts.map +1 -1
  12. package/dist/adapters/prisma.js +308 -67
  13. package/dist/adapters/prisma.js.map +1 -1
  14. package/dist/adapters/qstash.d.ts +15 -2
  15. package/dist/adapters/qstash.d.ts.map +1 -1
  16. package/dist/adapters/qstash.js +31 -14
  17. package/dist/adapters/qstash.js.map +1 -1
  18. package/dist/adapters/redis.d.ts +40 -4
  19. package/dist/adapters/redis.d.ts.map +1 -1
  20. package/dist/adapters/redis.js +265 -20
  21. package/dist/adapters/redis.js.map +1 -1
  22. package/dist/adapters/sqlite.d.ts +52 -2
  23. package/dist/adapters/sqlite.d.ts.map +1 -1
  24. package/dist/adapters/sqlite.js +342 -35
  25. package/dist/adapters/sqlite.js.map +1 -1
  26. package/dist/adapters/stream-scripts.d.ts +49 -0
  27. package/dist/adapters/stream-scripts.d.ts.map +1 -0
  28. package/dist/adapters/stream-scripts.js +150 -0
  29. package/dist/adapters/stream-scripts.js.map +1 -0
  30. package/dist/adapters/upstash.d.ts +20 -0
  31. package/dist/adapters/upstash.d.ts.map +1 -1
  32. package/dist/adapters/upstash.js +29 -0
  33. package/dist/adapters/upstash.js.map +1 -1
  34. package/dist/admin/memory.d.ts +11 -1
  35. package/dist/admin/memory.d.ts.map +1 -1
  36. package/dist/admin/memory.js +83 -14
  37. package/dist/admin/memory.js.map +1 -1
  38. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
  39. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
  40. package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
  41. package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
  42. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
  43. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
  44. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
  45. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
  46. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
  47. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
  48. package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
  49. package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
  50. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
  51. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
  52. package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
  53. package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
  54. package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
  55. package/dist/admin/migrations/postgres/index.js +16 -1
  56. package/dist/admin/migrations/postgres/index.js.map +1 -1
  57. package/dist/admin/migrations/runner.d.ts +21 -1
  58. package/dist/admin/migrations/runner.d.ts.map +1 -1
  59. package/dist/admin/migrations/runner.js +41 -4
  60. package/dist/admin/migrations/runner.js.map +1 -1
  61. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
  62. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
  63. package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
  64. package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
  65. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
  66. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
  67. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
  68. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
  69. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
  70. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
  71. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
  72. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
  73. package/dist/admin/migrations/sqlite/index.d.ts +2 -2
  74. package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
  75. package/dist/admin/migrations/sqlite/index.js +17 -3
  76. package/dist/admin/migrations/sqlite/index.js.map +1 -1
  77. package/dist/admin/postgres.d.ts +14 -4
  78. package/dist/admin/postgres.d.ts.map +1 -1
  79. package/dist/admin/postgres.js +131 -36
  80. package/dist/admin/postgres.js.map +1 -1
  81. package/dist/admin/shared.d.ts +19 -0
  82. package/dist/admin/shared.d.ts.map +1 -0
  83. package/dist/admin/shared.js +28 -0
  84. package/dist/admin/shared.js.map +1 -0
  85. package/dist/admin/sqlite.d.ts +9 -1
  86. package/dist/admin/sqlite.d.ts.map +1 -1
  87. package/dist/admin/sqlite.js +112 -29
  88. package/dist/admin/sqlite.js.map +1 -1
  89. package/dist/core/admin.d.ts +28 -6
  90. package/dist/core/admin.d.ts.map +1 -1
  91. package/dist/core/admin.js +92 -23
  92. package/dist/core/admin.js.map +1 -1
  93. package/dist/core/agent.d.ts +7 -4
  94. package/dist/core/agent.d.ts.map +1 -1
  95. package/dist/core/agent.js +15 -11
  96. package/dist/core/agent.js.map +1 -1
  97. package/dist/core/agui.d.ts +17 -0
  98. package/dist/core/agui.d.ts.map +1 -0
  99. package/dist/core/agui.js +69 -0
  100. package/dist/core/agui.js.map +1 -0
  101. package/dist/core/context.d.ts +13 -1
  102. package/dist/core/context.d.ts.map +1 -1
  103. package/dist/core/context.js +70 -19
  104. package/dist/core/context.js.map +1 -1
  105. package/dist/core/deleteThread.d.ts.map +1 -1
  106. package/dist/core/deleteThread.js +33 -4
  107. package/dist/core/deleteThread.js.map +1 -1
  108. package/dist/core/engine.d.ts +41 -11
  109. package/dist/core/engine.d.ts.map +1 -1
  110. package/dist/core/engine.js +855 -352
  111. package/dist/core/engine.js.map +1 -1
  112. package/dist/core/follow.d.ts +63 -1
  113. package/dist/core/follow.d.ts.map +1 -1
  114. package/dist/core/follow.js +293 -16
  115. package/dist/core/follow.js.map +1 -1
  116. package/dist/core/hitl.d.ts +43 -0
  117. package/dist/core/hitl.d.ts.map +1 -1
  118. package/dist/core/hitl.js +163 -35
  119. package/dist/core/hitl.js.map +1 -1
  120. package/dist/core/keys.d.ts +22 -4
  121. package/dist/core/keys.d.ts.map +1 -1
  122. package/dist/core/keys.js +23 -5
  123. package/dist/core/keys.js.map +1 -1
  124. package/dist/core/lease.d.ts +46 -0
  125. package/dist/core/lease.d.ts.map +1 -0
  126. package/dist/core/lease.js +142 -0
  127. package/dist/core/lease.js.map +1 -0
  128. package/dist/core/loop.d.ts +27 -7
  129. package/dist/core/loop.d.ts.map +1 -1
  130. package/dist/core/loop.js +140 -55
  131. package/dist/core/loop.js.map +1 -1
  132. package/dist/core/messages.d.ts +21 -2
  133. package/dist/core/messages.d.ts.map +1 -1
  134. package/dist/core/messages.js +61 -2
  135. package/dist/core/messages.js.map +1 -1
  136. package/dist/core/prune.d.ts +24 -0
  137. package/dist/core/prune.d.ts.map +1 -0
  138. package/dist/core/prune.js +43 -0
  139. package/dist/core/prune.js.map +1 -0
  140. package/dist/core/publish.d.ts +38 -10
  141. package/dist/core/publish.d.ts.map +1 -1
  142. package/dist/core/publish.js +126 -12
  143. package/dist/core/publish.js.map +1 -1
  144. package/dist/core/reclaim.d.ts +8 -1
  145. package/dist/core/reclaim.d.ts.map +1 -1
  146. package/dist/core/reclaim.js +149 -18
  147. package/dist/core/reclaim.js.map +1 -1
  148. package/dist/core/run.d.ts +7 -3
  149. package/dist/core/run.d.ts.map +1 -1
  150. package/dist/core/run.js +95 -35
  151. package/dist/core/run.js.map +1 -1
  152. package/dist/core/segment.d.ts +62 -0
  153. package/dist/core/segment.d.ts.map +1 -0
  154. package/dist/core/segment.js +318 -0
  155. package/dist/core/segment.js.map +1 -0
  156. package/dist/core/settle.d.ts +57 -0
  157. package/dist/core/settle.d.ts.map +1 -0
  158. package/dist/core/settle.js +181 -0
  159. package/dist/core/settle.js.map +1 -0
  160. package/dist/core/snapshot.d.ts +36 -0
  161. package/dist/core/snapshot.d.ts.map +1 -0
  162. package/dist/core/snapshot.js +87 -0
  163. package/dist/core/snapshot.js.map +1 -0
  164. package/dist/core/stop.d.ts +16 -1
  165. package/dist/core/stop.d.ts.map +1 -1
  166. package/dist/core/stop.js +69 -15
  167. package/dist/core/stop.js.map +1 -1
  168. package/dist/core/stream-events.d.ts +184 -0
  169. package/dist/core/stream-events.d.ts.map +1 -0
  170. package/dist/core/stream-events.js +26 -0
  171. package/dist/core/stream-events.js.map +1 -0
  172. package/dist/core/stream.d.ts +29 -0
  173. package/dist/core/stream.d.ts.map +1 -1
  174. package/dist/core/stream.js +79 -0
  175. package/dist/core/stream.js.map +1 -1
  176. package/dist/core/subagent.d.ts +36 -5
  177. package/dist/core/subagent.d.ts.map +1 -1
  178. package/dist/core/subagent.js +117 -22
  179. package/dist/core/subagent.js.map +1 -1
  180. package/dist/core/types.d.ts +197 -11
  181. package/dist/core/types.d.ts.map +1 -1
  182. package/dist/core/types.js +26 -1
  183. package/dist/core/types.js.map +1 -1
  184. package/dist/core/usage.d.ts +53 -5
  185. package/dist/core/usage.d.ts.map +1 -1
  186. package/dist/core/usage.js +170 -47
  187. package/dist/core/usage.js.map +1 -1
  188. package/dist/index.d.ts +16 -11
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +12 -7
  191. package/dist/index.js.map +1 -1
  192. package/dist/ports/admin.d.ts +59 -0
  193. package/dist/ports/admin.d.ts.map +1 -1
  194. package/dist/ports/kv.d.ts +17 -0
  195. package/dist/ports/kv.d.ts.map +1 -1
  196. package/dist/ports/queue.d.ts +87 -7
  197. package/dist/ports/queue.d.ts.map +1 -1
  198. package/dist/ports/queue.js +36 -1
  199. package/dist/ports/queue.js.map +1 -1
  200. package/dist/ports/runtime.d.ts +171 -20
  201. package/dist/ports/runtime.d.ts.map +1 -1
  202. package/dist/ports/storage.d.ts +26 -5
  203. package/dist/ports/storage.d.ts.map +1 -1
  204. package/dist/ports/streams.d.ts +60 -0
  205. package/dist/ports/streams.d.ts.map +1 -0
  206. package/dist/ports/streams.js +20 -0
  207. package/dist/ports/streams.js.map +1 -0
  208. package/dist/pricing.d.ts +5 -0
  209. package/dist/pricing.d.ts.map +1 -1
  210. package/dist/pricing.js +35 -10
  211. package/dist/pricing.js.map +1 -1
  212. package/dist/runtime.d.ts +6 -0
  213. package/dist/runtime.d.ts.map +1 -1
  214. package/dist/runtime.js +144 -46
  215. package/dist/runtime.js.map +1 -1
  216. package/package.json +1 -1
package/README.md CHANGED
@@ -16,14 +16,14 @@ now describe that behaviour.
16
16
 
17
17
  ## Running locally, with nothing to stand up
18
18
 
19
- There is no `createDevRuntime`. Assembling the platform is four adapters and one wire,
19
+ There is no `createDevRuntime`. Assembling the platform is five adapters and one wire,
20
20
  and seeing them is the point — swapping any of them for the durable equivalent later is
21
21
  then obvious rather than magic.
22
22
 
23
23
  ```ts
24
24
  import { Database } from 'bun:sqlite'; // or node:sqlite — see openSqlite
25
25
  import { setupAgentCore } from 'agentenkit';
26
- import { SqliteStorage } from 'agentenkit/adapters/sqlite';
26
+ import { SqliteRunStreams, SqliteStorage } from 'agentenkit/adapters/sqlite';
27
27
  import { InlineQueue } from 'agentenkit/adapters/inline';
28
28
  import { MemoryBus, MemoryKv } from 'agentenkit/adapters/memory';
29
29
  import { SqliteAdminStore } from 'agentenkit/admin/sqlite';
@@ -36,6 +36,7 @@ const queue = new InlineQueue();
36
36
 
37
37
  export const runtime = await setupAgentCore({
38
38
  storage: new SqliteStorage(db), // ← later: PrismaStorage, or your own
39
+ streams: new SqliteRunStreams(db), // ← later: RedisRunStreams, PrismaRunStreams
39
40
  admin: SqliteAdminStore.open(db), // ← later: PostgresAdminStore
40
41
  bus: new MemoryBus(), // ← later: RedisBus
41
42
  kv: new MemoryKv(), // ← later: RedisKv
@@ -79,7 +80,7 @@ import { createClient } from 'redis';
79
80
  import { PrismaClient } from '@prisma/client';
80
81
  import { setupAgentCore } from 'agentenkit';
81
82
  import { PrismaStorage } from 'agentenkit/adapters/prisma';
82
- import { RedisBus, RedisKv } from 'agentenkit/adapters/redis';
83
+ import { RedisBus, RedisKv, RedisRunStreams } from 'agentenkit/adapters/redis';
83
84
  import { QStashQueue } from 'agentenkit/adapters/qstash';
84
85
 
85
86
  const redis = createClient({ url: process.env.REDIS_URL });
@@ -93,6 +94,7 @@ export const runtime = await setupAgentCore({
93
94
  { url: 'https://app.example.com/api/queue/agent-run' },
94
95
  ),
95
96
  kv: new RedisKv(redis),
97
+ streams: new RedisRunStreams(redis), // ← one stream per run segment
96
98
  // `admin` omitted on purpose: with AGENTIC_KIT_ADMIN_DATABASE_URL set, the
97
99
  // platform opens Postgres for its own history (§2.9). Pass one to override.
98
100
  resolveModel: (name) => ({ instance: () => models[name], contextWindow: 128_000 }),
@@ -110,16 +112,27 @@ await chat.run({ prompt: 'hi', state: { orgId } }); // persist + enqueue
110
112
  await chat.stop(threadId); // one write: state → CANCELLED (§2.1)
111
113
  await runtime.hitl.respond({ threadId, toolCallId, approved, payload, state }); // §2.5
112
114
  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
115
+ const { stream, headers } = runtime.events.sse(threadId, { cursor, lastMessageId, signal }); // SSE, any framework
116
+ for await (const frame of runtime.events.follow(threadId, { cursor, signal })) { … } // or iterate
117
+ for await (const item of runtime.streams.read(streamId, null, signal)) { … } // one run stream
118
+ const missed = await runtime.events.since(threadId, lastSeq); // the thread record, raw
119
+ const unsub = await runtime.events.subscribe(threadId, handler); // raw tail of the bus
117
120
  await runtime.worker.handleJob(job); // queue consumer (§2.8)
118
- await runtime.events.publishEvent(threadId, 'MY_EVENT', payload); // your own event, same pipe
121
+ await runtime.events.publishEvent(threadId, 'MY_EVENT', payload); // your own event, live only
122
+ await runtime.events.publishEvent(threadId, 'MY_EVENT', payload, { durable: true }); // …or kept in the record
123
+ await runtime.pruneEvents({ dryRun: true }); // after upgrading: clear old stream-only rows
119
124
  ```
120
125
 
126
+ A follow yields frames: `{ kind: 'thread', event }` (a record entry or a
127
+ notice), `{ kind: 'stream', streamId, item }` (a run stream item) and
128
+ `{ kind: 'snapshot', snapshot }` (sent once when the stream the client was
129
+ reading is gone). The cursor is one string, `<seq> <streamId> <offset>`; every
130
+ SSE frame that moves it carries it as its `id:`, so EventSource sends it back
131
+ as `Last-Event-ID`. See [Run streams](../../docs/run-streams.md).
132
+
121
133
  Tools get `publishEvent` on their second argument, bound to their thread; see
122
- [Custom events](../../docs/custom-events.md).
134
+ [Custom events](../../docs/custom-events.md). It is live only unless you pass
135
+ `{ durable: true }`.
123
136
 
124
137
  The Next.js routes in [`examples/nextjs-app`](../../examples/nextjs-app) show the HTTP
125
138
  wiring — each handler is a few lines over the runtime.
@@ -154,10 +167,16 @@ declare module 'agentenkit' {
154
167
 
155
168
  | Port | Role | Reference adapter |
156
169
  | :--- | :--- | :--- |
157
- | `Storage` | threads / messages / events / usage — incl. atomic `claimState` | `PrismaStorage`, `SqliteStorage` |
170
+ | `Storage` | threads / messages / the thread record / usage — incl. atomic `claimState` | `PrismaStorage`, `SqliteStorage` |
158
171
  | `EventBus` | live fan-out + HITL death notices (at-most-once) | `RedisBus`, `UpstashBus` |
159
172
  | `Queue` | durable run dispatch (at-least-once) | `QStashQueue`, `InlineQueue` (dev) |
160
- | `Kv` | hot state cache, HITL handoff keys, seq/attempt counters | `RedisKv`, `UpstashKv` |
173
+ | `Kv` | hot state cache, HITL handoff keys, segment/attempt counters | `RedisKv`, `UpstashKv` |
174
+ | `RunStreams` | one short-lived stream per run segment | `RedisRunStreams`, `UpstashRunStreams`, `PrismaRunStreams`, `SqliteRunStreams` |
175
+
176
+ Leave `streams` out and they are kept in memory, with a warning logged once.
177
+ Only that process can read them, so when web servers and workers run apart,
178
+ pass a real one. `PrismaRunStreams` needs the `RunStream` and `RunStreamEvent`
179
+ models from [the example schema](../../examples/nextjs-app/prisma/schema.prisma).
161
180
 
162
181
  Implement any of them for your own stack — `core/` imports nothing else. The
163
182
  [`Memory*` adapters](./src/adapters/memory.ts) are a complete implementation used by the
@@ -207,7 +226,7 @@ platform's own tables. You do not implement `AdminStore`; you read it back:
207
226
  await runtime.admin.overview(); // threads and runs by state, plus what's in flight
208
227
  await runtime.admin.listRuns({ state: ['FAILED'], since });
209
228
  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
229
+ await runtime.admin.getRun(runId); // one run: steps, nested runs, its record entries, spend
211
230
  ```
212
231
 
213
232
  Its schema migrates itself, from numbered migration files. `setupAgentCore`
@@ -236,7 +255,8 @@ reading your database at all.
236
255
 
237
256
  ## Adapter invariants (§3.4)
238
257
 
239
- 1. `events.append` receives `seq` from `kv.incr('agent:seq:{threadId}')` — monotonic per thread.
258
+ 1. `events.append` takes an entry without a `seq` and the store mints it — monotonic per
259
+ thread, never repeated.
240
260
  2. `threads.claimState` must be atomic (one conditional UPDATE) — exactly one caller wins.
241
261
  3. `queue.enqueue` is at-least-once and the engine is idempotent. An adapter that cannot
242
262
  honour `delaySeconds` may deliver immediately, but must never throw for it — a HITL
@@ -251,7 +271,7 @@ reading your database at all.
251
271
  | Spec | Where in the package |
252
272
  | :--- | :--- |
253
273
  | §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` |
274
+ | §2.2 Multi-user stream | `ports/bus.ts`, `ports/streams.ts`, `core/follow.ts` + `runtime.events` |
255
275
  | §2.5 HITL park, respond, expiry, reclaim | `core/hitl.ts`, `core/reclaim.ts` |
256
276
  | §2.6 Context ceiling & compaction | `core/context.ts` |
257
277
  | §2.7 Subagents as nested runs | `core/subagent.ts`, `core/loop.ts` |
@@ -1,5 +1,5 @@
1
1
  import type { RunJob } from '../core/types.js';
2
- import type { EnqueueOptions, Queue } from '../ports/queue.js';
2
+ import { type EnqueueOptions, type Queue, type QueueStats, type QueuedJob } from '../ports/queue.js';
3
3
  /** An in-process queue that actually dispatches (§2.8).
4
4
  *
5
5
  * `MemoryQueue` only collects jobs, which is right for tests that drive the
@@ -9,7 +9,9 @@ import type { EnqueueOptions, Queue } from '../ports/queue.js';
9
9
  * whole design rests on.
10
10
  *
11
11
  * It honours `delaySeconds`, so the HITL expiry (§2.5) and the lock-conflict
12
- * redrive (§2.8) work in development exactly as they do against a real queue.
12
+ * redrive (§2.8) work in development exactly as they do against a real queue,
13
+ * however long the delay. A `key` dedupes against the jobs still waiting,
14
+ * and `cancel` withdraws them.
13
15
  *
14
16
  * What it is NOT: durable. A process restart loses whatever was in flight,
15
17
  * which is precisely what the durable adapters exist to fix. Development
@@ -17,11 +19,23 @@ import type { EnqueueOptions, Queue } from '../ports/queue.js';
17
19
  export declare class InlineQueue implements Queue {
18
20
  private handler?;
19
21
  private readonly pending;
20
- /** Wired by setupAgentCore once the worker exists — the queue and the worker
21
- * each need the other, so one of them has to be attached afterwards. */
22
+ /** Jobs that came due before `bind`: held, not dropped. */
23
+ private readonly unbound;
24
+ /** Attach the worker once the runtime exists — the queue and the worker each
25
+ * need the other, so one of them has to be wired afterwards:
26
+ * `queue.bind((job) => runtime.worker.handleJob(job))`. A job that came
27
+ * due before this runs is delivered now rather than lost. */
22
28
  bind(handler: (job: RunJob) => Promise<unknown>): void;
23
29
  enqueue(job: RunJob, opts?: EnqueueOptions): Promise<void>;
24
- /** Drop everything still scheduled — for tests and clean shutdown. */
30
+ /** Set the job's timer, in steps no longer than one timer can hold. */
31
+ private arm;
32
+ cancel(key: string): Promise<void>;
33
+ find(runId: string): Promise<QueuedJob | null>;
34
+ stats(): Promise<QueueStats>;
35
+ private deliver;
36
+ /** Drop everything still scheduled — for tests and clean shutdown. What it
37
+ * drops is logged: a job lost without a trace looks like a queue that does
38
+ * nothing. */
25
39
  clear(): void;
26
40
  }
27
41
  //# sourceMappingURL=inline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/adapters/inline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/D;;;;;;;;;;;;;YAaY;AACZ,qBAAa,WAAY,YAAW,KAAK;IACvC,OAAO,CAAC,OAAO,CAAC,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAEpE;6EACyE;IACzE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAIhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhE,sEAAsE;IACtE,KAAK,IAAI,IAAI;CAId"}
1
+ {"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/adapters/inline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAa3B;;;;;;;;;;;;;;;YAeY;AACZ,qBAAa,WAAY,YAAW,KAAK;IACvC,OAAO,CAAC,OAAO,CAAC,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC;;;kEAG8D;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAKhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAShE,uEAAuE;IACvE,OAAO,CAAC,GAAG;IAWL,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAa9C,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAUlC,OAAO,CAAC,OAAO;IAef;;mBAEe;IACf,KAAK,IAAI,IAAI;CAOd"}
@@ -1,3 +1,7 @@
1
+ import { DuplicateJobError, } from '../ports/queue.js';
2
+ /** The longest delay one timer can hold: past about 24.8 days a timer fires
3
+ * at once. A longer delay is waited out in steps of this. */
4
+ const MAX_TIMER_MS = 2 ** 31 - 1;
1
5
  /** An in-process queue that actually dispatches (§2.8).
2
6
  *
3
7
  * `MemoryQueue` only collects jobs, which is right for tests that drive the
@@ -7,7 +11,9 @@
7
11
  * whole design rests on.
8
12
  *
9
13
  * It honours `delaySeconds`, so the HITL expiry (§2.5) and the lock-conflict
10
- * redrive (§2.8) work in development exactly as they do against a real queue.
14
+ * redrive (§2.8) work in development exactly as they do against a real queue,
15
+ * however long the delay. A `key` dedupes against the jobs still waiting,
16
+ * and `cancel` withdraws them.
11
17
  *
12
18
  * What it is NOT: durable. A process restart loses whatever was in flight,
13
19
  * which is precisely what the durable adapters exist to fix. Development
@@ -15,27 +21,94 @@
15
21
  export class InlineQueue {
16
22
  handler;
17
23
  pending = new Set();
18
- /** Wired by setupAgentCore once the worker exists — the queue and the worker
19
- * each need the other, so one of them has to be attached afterwards. */
24
+ /** Jobs that came due before `bind`: held, not dropped. */
25
+ unbound = [];
26
+ /** Attach the worker once the runtime exists — the queue and the worker each
27
+ * need the other, so one of them has to be wired afterwards:
28
+ * `queue.bind((job) => runtime.worker.handleJob(job))`. A job that came
29
+ * due before this runs is delivered now rather than lost. */
20
30
  bind(handler) {
21
31
  this.handler = handler;
32
+ for (const job of this.unbound.splice(0))
33
+ this.deliver(job);
22
34
  }
23
35
  async enqueue(job, opts) {
24
- const timer = setTimeout(() => {
25
- this.pending.delete(timer);
26
- // Detached on purpose: a queue consumer's failure is the worker's
27
- // business (§2.8 redrive), never the enqueuer's.
28
- void this.handler?.(job)?.catch(() => undefined);
29
- }, (opts?.delaySeconds ?? 0) * 1000);
36
+ if (opts?.key && [...this.pending].some((p) => p.key === opts.key)) {
37
+ throw new DuplicateJobError(opts.key);
38
+ }
39
+ const p = { job, key: opts?.key, runAt: Date.now() + (opts?.delaySeconds ?? 0) * 1000 };
40
+ this.pending.add(p);
41
+ this.arm(p);
42
+ }
43
+ /** Set the job's timer, in steps no longer than one timer can hold. */
44
+ arm(p) {
45
+ const wait = Math.max(0, p.runAt - Date.now());
46
+ p.timer = setTimeout(() => {
47
+ if (Date.now() < p.runAt)
48
+ return this.arm(p); // a long delay, not due yet
49
+ this.pending.delete(p);
50
+ this.deliver(p.job);
51
+ }, Math.min(wait, MAX_TIMER_MS));
30
52
  // Never hold a process open just because an expiry is scheduled.
31
- timer.unref?.();
32
- this.pending.add(timer);
53
+ p.timer.unref?.();
54
+ }
55
+ async cancel(key) {
56
+ if (!key)
57
+ return;
58
+ for (const p of this.pending) {
59
+ if (p.key !== key)
60
+ continue;
61
+ clearTimeout(p.timer);
62
+ this.pending.delete(p);
63
+ }
64
+ }
65
+ async find(runId) {
66
+ let found;
67
+ for (const p of this.pending) {
68
+ if (runId && p.job.runId === runId && (!found || p.runAt < found.runAt))
69
+ found = p;
70
+ }
71
+ return found
72
+ ? {
73
+ id: '', runId, threadId: found.job.threadId, kind: found.job.kind, attempts: 0,
74
+ runAt: new Date(found.runAt), position: -1,
75
+ }
76
+ : null;
77
+ }
78
+ async stats() {
79
+ const now = Date.now();
80
+ let delayed = 0;
81
+ for (const p of this.pending)
82
+ if (p.runAt > now)
83
+ delayed++;
84
+ return {
85
+ ready: this.pending.size - delayed + this.unbound.length, delayed, inFlight: 0, dead: 0,
86
+ oldestReadyMs: 0, paused: false, claimErrors: 0,
87
+ };
88
+ }
89
+ deliver(job) {
90
+ if (!this.handler) {
91
+ this.unbound.push(job);
92
+ return;
93
+ }
94
+ // Detached on purpose: a queue consumer's failure is the worker's
95
+ // business (§2.8 redrive), never the enqueuer's. It is still logged:
96
+ // swallowed, a broken worker looks like a queue that does nothing.
97
+ void Promise.resolve()
98
+ .then(() => this.handler(job))
99
+ .catch((err) => console.error('InlineQueue: job failed', { threadId: job.threadId, runId: job.runId }, err));
33
100
  }
34
- /** Drop everything still scheduled — for tests and clean shutdown. */
101
+ /** Drop everything still scheduled — for tests and clean shutdown. What it
102
+ * drops is logged: a job lost without a trace looks like a queue that does
103
+ * nothing. */
35
104
  clear() {
36
- for (const t of this.pending)
37
- clearTimeout(t);
105
+ const dropped = this.pending.size + this.unbound.length;
106
+ for (const p of this.pending)
107
+ clearTimeout(p.timer);
38
108
  this.pending.clear();
109
+ this.unbound.length = 0;
110
+ if (dropped > 0)
111
+ console.warn(`InlineQueue: cleared with ${dropped} job(s) still waiting`);
39
112
  }
40
113
  }
41
114
  //# sourceMappingURL=inline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../src/adapters/inline.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;YAaY;AACZ,MAAM,OAAO,WAAW;IACd,OAAO,CAAqC;IACnC,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEpE;6EACyE;IACzE,IAAI,CAAC,OAA0C;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAqB;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,kEAAkE;YAClE,iDAAiD;YACjD,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrC,iEAAiE;QAChE,KAA2C,CAAC,KAAK,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,KAAK;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"inline.js","sourceRoot":"","sources":["../../src/adapters/inline.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,39 @@
1
- import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewUsage, RunJob, ThreadDTO, UsageFilter, UsageTotals } from '../core/types.js';
1
+ import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewThreadEvent, ThreadEventFilter, NewUsage, RunJob, ThreadDTO, ThreadTransition, UsageFilter, UsageTotals } from '../core/types.js';
2
2
  import type { Storage } from '../ports/storage.js';
3
3
  import type { EventBus } from '../ports/bus.js';
4
- import type { EnqueueOptions, Queue } from '../ports/queue.js';
4
+ import { type EnqueueOptions, type Queue, type QueueStats, type QueuedJob } from '../ports/queue.js';
5
5
  import type { Kv } from '../ports/kv.js';
6
+ import { type RunStreams, type StreamMeta } from '../ports/streams.js';
7
+ import { type StreamEnd, type StreamEvent, type StreamItem } from '../core/stream-events.js';
6
8
  /** In-memory Kv — tests and local prototyping. Expiry is enforced lazily on
7
9
  * read; incr is synchronous internally, so concurrent callers can never
8
10
  * collide on the same counter (§3.4). */
9
11
  export declare class MemoryKv implements Kv {
10
12
  private m;
13
+ private lastSweep;
14
+ /** Expired keys nobody reads again are dropped as writes come in, at most
15
+ * once a minute: no timer to leak, and the map does not grow for ever. */
16
+ private sweep;
11
17
  get(key: string): Promise<string | null>;
12
18
  set(key: string, value: string, opts?: {
13
19
  exSeconds?: number;
14
20
  onlyIfNotExists?: boolean;
15
21
  }): Promise<boolean>;
16
22
  del(key: string): Promise<void>;
23
+ setIfValue(key: string, expected: string, value: string, opts?: {
24
+ exSeconds?: number;
25
+ }): Promise<boolean>;
26
+ delIfValue(key: string, expected: string): Promise<boolean>;
27
+ incrWithExpiry(key: string, exSeconds: number): Promise<number>;
17
28
  incr(key: string): Promise<number>;
18
29
  }
30
+ /** How many of the latest published events a MemoryBus keeps in `published`:
31
+ * enough for any test, bounded for a dev server that runs for days. */
32
+ export declare const PUBLISHED_KEPT = 10000;
19
33
  /** Synchronous in-memory bus. Publishes are delivered to subscribers in order. */
20
34
  export declare class MemoryBus implements EventBus {
21
35
  private subs;
36
+ /** The latest PUBLISHED_KEPT events published, in order. */
22
37
  readonly published: AgentEvent[];
23
38
  publish(threadId: string, event: AgentEvent): Promise<void>;
24
39
  subscribe(threadId: string, handler: (e: AgentEvent) => void): Promise<() => void>;
@@ -32,7 +47,19 @@ export declare class MemoryQueue implements Queue {
32
47
  readonly items: RunJob[];
33
48
  /** Delivery delay requested per enqueue, index-aligned with `items`. */
34
49
  readonly delays: Array<number | undefined>;
50
+ /** Each job's key and priority, kept on the job itself so a test that
51
+ * shifts `items` by hand leaves nothing out of step. */
52
+ private readonly meta;
53
+ /** Refuses a fresh dispatch past this many waiting jobs; 0 is unbounded. */
54
+ maxDepth: number;
35
55
  enqueue(job: RunJob, opts?: EnqueueOptions): Promise<void>;
56
+ /** The key a queued job was enqueued under. */
57
+ keyOf(job: RunJob): string | undefined;
58
+ /** The priority a queued job was enqueued with. */
59
+ priorityOf(job: RunJob): number;
60
+ cancel(key: string): Promise<void>;
61
+ find(runId: string): Promise<QueuedJob | null>;
62
+ stats(): Promise<QueueStats>;
36
63
  drain(handler: (job: RunJob) => Promise<void>): Promise<number>;
37
64
  }
38
65
  /** Full in-memory Storage — tests, demos, and a template for custom adapters. */
@@ -47,6 +74,9 @@ export declare class MemoryStorage implements Storage {
47
74
  setState(t: string, state: ExecutionState): Promise<void>;
48
75
  delete: (t: string) => Promise<void>;
49
76
  claimState(t: string, from: ExecutionState, to: ExecutionState): Promise<boolean>;
77
+ /** Each thread's current run (ThreadTransition). */
78
+ runs: Map<string, string>;
79
+ transition(t: string, tr: ThreadTransition): Promise<boolean>;
50
80
  };
51
81
  messages: {
52
82
  store: Map<string, MessageDTO[]>;
@@ -58,10 +88,15 @@ export declare class MemoryStorage implements Storage {
58
88
  };
59
89
  events: {
60
90
  store: Map<string, AgentEvent[]>;
61
- append(t: string, e: AgentEvent): Promise<void>;
91
+ append(t: string, e: NewThreadEvent): Promise<AgentEvent>;
92
+ list(t: string, f?: ThreadEventFilter): Promise<AgentEvent[]>;
62
93
  listSince(t: string, sinceSeq: number): Promise<AgentEvent[]>;
63
94
  latest(t: string, type: string): Promise<AgentEvent | null>;
64
95
  listByType(t: string, type: string): Promise<AgentEvent[]>;
96
+ prune(types: string[], opts: {
97
+ limit: number;
98
+ dryRun?: boolean;
99
+ }): Promise<Record<string, number>>;
65
100
  };
66
101
  usage: {
67
102
  recorded: (NewUsage & {
@@ -71,4 +106,31 @@ export declare class MemoryStorage implements Storage {
71
106
  total(t: string, filter?: UsageFilter): Promise<UsageTotals>;
72
107
  };
73
108
  }
109
+ /** In-memory RunStreams — tests and local prototyping. The offset is the
110
+ * item's 1-based position. Expiry is checked on every call, and an open
111
+ * drops every expired stream, so a dev server that runs for days holds only
112
+ * live and recent streams. */
113
+ export declare class MemoryRunStreams implements RunStreams {
114
+ private streams;
115
+ private live;
116
+ private drop;
117
+ private sweep;
118
+ open(streamId: string, meta: StreamMeta, ttlMs: number): Promise<void>;
119
+ append(streamId: string, events: StreamEvent[]): Promise<string[]>;
120
+ read(streamId: string, after: string | null, signal?: AbortSignal): AsyncIterable<StreamItem>;
121
+ snapshot(streamId: string, after?: string | null): Promise<{
122
+ meta: {
123
+ threadId: string;
124
+ runId: string;
125
+ };
126
+ items: StreamItem[];
127
+ end: StreamEnd | null;
128
+ } | null>;
129
+ close(streamId: string, end: StreamEnd, graceMs: number): Promise<void>;
130
+ delete(streamId: string): Promise<void>;
131
+ private wake;
132
+ /** Streams held now, expired ones included until the next sweep — lets a
133
+ * test prove a stream was deleted. */
134
+ get size(): number;
135
+ }
74
136
  //# sourceMappingURL=memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElJ,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAKzC;;0CAE0C;AAC1C,qBAAa,QAAS,YAAW,EAAE;IACjC,OAAO,CAAC,CAAC,CAA+B;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM;IAMf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAWxF,GAAG,CAAC,GAAG,EAAE,MAAM;IACf,IAAI,CAAC,GAAG,EAAE,MAAM;CAOvB;AAED,kFAAkF;AAClF,qBAAa,SAAU,YAAW,QAAQ;IACxC,OAAO,CAAC,IAAI,CAAmD;IAC/D,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAM;IAEhC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAI3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI;IAMlE;8DAC0D;IAC1D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGtC;AAED;wFACwF;AACxF,qBAAa,WAAY,YAAW,KAAK;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAM;IAC1C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc;IAI1C,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAUtE;AAED,iFAAiF;AACjF,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO;;eAEQ,MAAM;sBACC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE;;oBASpB,MAAM,SAAS,cAAc;oBAQ7B,MAAM;sBAOJ,MAAM,QAAQ,cAAc,MAAM,cAAc;MAMpE;IAEF,QAAQ;;kBAEU,MAAM,KAAK,UAAU;gBAUvB,MAAM,SAAS;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE;sBAKpC,MAAM,aAAa,MAAM;MAM7C;IAEF,MAAM;;kBAEY,MAAM,KAAK,UAAU;qBAKlB,MAAM,YAAY,MAAM;kBAI3B,MAAM,QAAQ,MAAM;sBAKhB,MAAM,QAAQ,MAAM;MAIxC;IAEF,KAAK;kBACa,CAAC,QAAQ,GAAG;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE;kBACnC,MAAM,KAAK,QAAQ;iBACpB,MAAM,WAAU,WAAW,GAAQ,OAAO,CAAC,WAAW,CAAC;MAOtE;CAIH"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}