agentenkit 0.3.0 → 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.
- package/README.md +34 -14
- 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/memory.d.ts +65 -3
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +267 -3
- package/dist/adapters/memory.js.map +1 -1
- 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/sqlite.d.ts +52 -2
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +342 -35
- 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/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/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 +33 -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 +855 -352
- 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/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 +117 -22
- package/dist/core/subagent.js.map +1 -1
- package/dist/core/types.d.ts +195 -12
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +26 -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 +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -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 +171 -20
- package/dist/ports/runtime.d.ts.map +1 -1
- 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/pricing.d.ts +5 -0
- package/dist/pricing.d.ts.map +1 -1
- package/dist/pricing.js +35 -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 +144 -46
- package/dist/runtime.js.map +1 -1
- 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
|
|
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, {
|
|
114
|
-
for await (const
|
|
115
|
-
const
|
|
116
|
-
const
|
|
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);
|
|
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 /
|
|
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,
|
|
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,
|
|
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`
|
|
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
|
|
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
|
-
/**
|
|
21
|
-
|
|
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
|
-
/**
|
|
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,
|
|
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"}
|
package/dist/adapters/inline.js
CHANGED
|
@@ -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
|
-
/**
|
|
19
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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":"
|
|
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
|
|
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:
|
|
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;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
|