agentenkit 0.10.0 → 0.12.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/dist/adapters/flow.d.ts +213 -0
- package/dist/adapters/flow.d.ts.map +1 -0
- package/dist/adapters/flow.js +653 -0
- package/dist/adapters/flow.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ports/queue.d.ts +40 -0
- package/dist/ports/queue.d.ts.map +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { Duration, Flow, FlowEnv, FlowFunction } from '@clevix/flow';
|
|
2
|
+
import { type DeadJob, type EnqueueOptions, type PurgeFilter, type Queue, type QueueAdmin, type QueueStats, type QueuedJob } from '../ports/queue.js';
|
|
3
|
+
import type { AgentCore } from '../ports/runtime.js';
|
|
4
|
+
import type { EventBus } from '../ports/bus.js';
|
|
5
|
+
import type { Kv } from '../ports/kv.js';
|
|
6
|
+
import { type RunStreams, type StreamEnd, type StreamEvent, type StreamItem, type StreamMeta, type StreamSnapshot } from '../ports/streams.js';
|
|
7
|
+
import type { AgentEvent, RunJob } from '../core/types.js';
|
|
8
|
+
/** The function ID the queue starts and the worker serves, unless both are
|
|
9
|
+
* given another. */
|
|
10
|
+
export declare const FLOW_FUNCTION_ID = "agentenkit-run";
|
|
11
|
+
/** The event the function lists as its trigger. Nothing sends it: runs come
|
|
12
|
+
* from `flow.start`. Flow needs every function to have a trigger. */
|
|
13
|
+
export declare const FLOW_JOB_EVENT = "agentenkit/job";
|
|
14
|
+
/** What one run of the function carries. */
|
|
15
|
+
export interface FlowJobData {
|
|
16
|
+
job: RunJob;
|
|
17
|
+
/** The singleton key: the enqueue's key, or the job's dispatch id. */
|
|
18
|
+
key: string;
|
|
19
|
+
/** In seconds, for `priority.run`. */
|
|
20
|
+
priority: number;
|
|
21
|
+
/** Epoch ms. The run sleeps until then before it runs the job. */
|
|
22
|
+
notBefore?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface FlowQueueOptions {
|
|
25
|
+
/** The function to start. Defaults to `agentenkit-run`. Must match the
|
|
26
|
+
* ID given to `agentRunFunction`. */
|
|
27
|
+
functionId?: string;
|
|
28
|
+
/** Lets two deployments share one Flow app: it goes in front of the
|
|
29
|
+
* function ID, as `<namespace>-<id>`. Singleton keys belong to one
|
|
30
|
+
* function, so the keys are apart too. Must match `agentRunFunction`'s
|
|
31
|
+
* `namespace`. */
|
|
32
|
+
namespace?: string;
|
|
33
|
+
/** Refuses a fresh dispatch (`QueueFullError`) once this many runs wait to
|
|
34
|
+
* start. Retries, redrives, resumes and expiries always go in. The count
|
|
35
|
+
* comes from Flow's runs index, which lags a few seconds, so a burst can
|
|
36
|
+
* go a little past it. Unset: no limit. */
|
|
37
|
+
maxDepth?: number;
|
|
38
|
+
/** Cloudflare Workers: the handler's `env`, where the Flow keys live. */
|
|
39
|
+
env?: FlowEnv;
|
|
40
|
+
}
|
|
41
|
+
/** Queue adapter over Clevix Flow.
|
|
42
|
+
*
|
|
43
|
+
* Each job is one run of one Flow function (see `agentRunFunction`),
|
|
44
|
+
* started with `flow.start`. A key is the function's singleton key in
|
|
45
|
+
* `skip` mode, so at most one live run holds it, and it is free again as
|
|
46
|
+
* soon as that run ends. A delay is a sleep at the start of the run, so the
|
|
47
|
+
* key stays held while the job waits. `cancel` cancels the run that holds a
|
|
48
|
+
* key. `find` and `stats` read Flow's runs index, which lags the runs by a
|
|
49
|
+
* few seconds.
|
|
50
|
+
*
|
|
51
|
+
* It is also a `QueueAdmin`: `pause` and `resume` pause the function, and
|
|
52
|
+
* the dead jobs are its failed runs.
|
|
53
|
+
*
|
|
54
|
+
* Needs Flow SDK 0.8.0 or later and an engine with the run control routes. */
|
|
55
|
+
export declare class FlowQueue implements Queue, QueueAdmin {
|
|
56
|
+
private readonly flow;
|
|
57
|
+
private readonly opts;
|
|
58
|
+
private readonly functionId;
|
|
59
|
+
constructor(flow: Flow, opts?: FlowQueueOptions);
|
|
60
|
+
private get env();
|
|
61
|
+
enqueue(job: RunJob, opts?: EnqueueOptions): Promise<void>;
|
|
62
|
+
cancel(key: string): Promise<void>;
|
|
63
|
+
find(runId: string): Promise<QueuedJob | null>;
|
|
64
|
+
stats(): Promise<QueueStats>;
|
|
65
|
+
/** Pause the function. Jobs enqueued meanwhile wait, paused, and jobs
|
|
66
|
+
* already started pause at their next step. `resume` lets them all go. */
|
|
67
|
+
pause(): Promise<void>;
|
|
68
|
+
/** Resume the function and its paused runs. */
|
|
69
|
+
resume(): Promise<void>;
|
|
70
|
+
/** Cancel the waiting runs that match. Running runs are left alone. With
|
|
71
|
+
* `includeDead` it deletes the failed runs that match too. It reads Flow's
|
|
72
|
+
* runs index, so a job enqueued in the last few seconds can be missed. */
|
|
73
|
+
purge(filter: PurgeFilter): Promise<number>;
|
|
74
|
+
/** The failed runs, newest first, with the job each carried. It asks each
|
|
75
|
+
* run for its error, so it makes one call per job. */
|
|
76
|
+
listDead(limit?: number): Promise<DeadJob[]>;
|
|
77
|
+
/** Retry a failed run from where it stopped, under the same run ID. False
|
|
78
|
+
* when there is no such failed run (a run `purge` cancelled is not dead),
|
|
79
|
+
* the queue is paused, or another run holds the job's key now. */
|
|
80
|
+
redrive(id: string): Promise<boolean>;
|
|
81
|
+
/** Delete the failed runs that ended longer ago than `olderThanMs`. Runs
|
|
82
|
+
* kept for debugging in the dashboard stay. */
|
|
83
|
+
purgeDead(olderThanMs: number): Promise<number>;
|
|
84
|
+
/** Calls `fn` for each of the function's runs in these statuses, newest
|
|
85
|
+
* first, page by page. `fn` gives back false to stop. */
|
|
86
|
+
private eachRun;
|
|
87
|
+
}
|
|
88
|
+
export interface AgentRunFunctionOptions {
|
|
89
|
+
/** Defaults to `agentenkit-run`. Must match `FlowQueue`'s `functionId`.
|
|
90
|
+
* At most 56 characters with the namespace, since the failure function
|
|
91
|
+
* adds `-failure`. */
|
|
92
|
+
id?: string;
|
|
93
|
+
/** Goes in front of the ID. Must match `FlowQueue`'s `namespace`. */
|
|
94
|
+
namespace?: string;
|
|
95
|
+
/** How many jobs of one `partitionKey` run at once. Unset: no limit.
|
|
96
|
+
* Job priorities only take effect under a limit. */
|
|
97
|
+
concurrency?: number;
|
|
98
|
+
/** How many jobs run at once in all, whatever their `partitionKey`. Unset:
|
|
99
|
+
* no limit. It can be set with `concurrency`. */
|
|
100
|
+
globalConcurrency?: number;
|
|
101
|
+
/** Flow's retries for a job that throws. Flow's default when unset. */
|
|
102
|
+
retries?: number;
|
|
103
|
+
/** How long Flow waits for one job. Defaults to 14 minutes, Flow's most.
|
|
104
|
+
* When a job runs longer, Flow stops waiting and tries the step again,
|
|
105
|
+
* but nothing stops the first call: it keeps running. The retry finds the
|
|
106
|
+
* run lock held and does nothing, so keep segments shorter than this
|
|
107
|
+
* (`segmentTimeoutMs`). */
|
|
108
|
+
stepTimeout?: Duration;
|
|
109
|
+
/** The longest `segmentTimeoutMs` of the agents this function runs. When
|
|
110
|
+
* set, `agentRunFunction` throws if it is not shorter than `stepTimeout`,
|
|
111
|
+
* since a longer segment breaks Flow's retries. */
|
|
112
|
+
segmentTimeoutMs?: number;
|
|
113
|
+
/** The wait in ms before a failed job is tried again, doubled on every
|
|
114
|
+
* further failure up to `retryBackoffMaxMs`, as on the Postgres queue.
|
|
115
|
+
* Unset: Flow's own backoff. `retryBackoffMaxMs` defaults to one minute. */
|
|
116
|
+
retryBackoffMs?: number;
|
|
117
|
+
retryBackoffMaxMs?: number;
|
|
118
|
+
}
|
|
119
|
+
/** The wait before try `attempt + 1`: `base` doubled `attempt` times, up to
|
|
120
|
+
* `max`. */
|
|
121
|
+
export declare function retryBackoff(base: number, max: number, attempt: number): number;
|
|
122
|
+
/** The Flow function that runs `FlowQueue`'s jobs. Serve it with the app's
|
|
123
|
+
* other Flow functions.
|
|
124
|
+
*
|
|
125
|
+
* A job runs in one step. `handleJob` only throws for what a queue should
|
|
126
|
+
* retry (an unknown agent, a store that is down), so Flow's retries cover
|
|
127
|
+
* delivery; agentic-kit retries a failed run itself. When Flow gives up, the
|
|
128
|
+
* failure function hands the job to `handleDeadJob`, which fails the run. */
|
|
129
|
+
export declare function agentRunFunction(flow: Flow, core: Pick<AgentCore, 'worker'>, opts?: AgentRunFunctionOptions): FlowFunction;
|
|
130
|
+
/** The channel a thread's events go on. */
|
|
131
|
+
export declare function flowThreadChannel(threadId: string): Promise<string>;
|
|
132
|
+
export interface FlowBusOptions {
|
|
133
|
+
/** Holds events too big for one realtime message (over about 60 KB). */
|
|
134
|
+
kv: Kv;
|
|
135
|
+
/** How often each subscriber gets a HEARTBEAT notice. Default one minute. */
|
|
136
|
+
heartbeatMs?: number;
|
|
137
|
+
/** How long `subscribe` waits for its socket to open before it returns
|
|
138
|
+
* anyway. Default 10 seconds. */
|
|
139
|
+
openTimeoutMs?: number;
|
|
140
|
+
/** Cloudflare Workers: the handler's `env`, where the Flow keys live. */
|
|
141
|
+
env?: FlowEnv;
|
|
142
|
+
/** A WebSocket class, where the runtime has none. */
|
|
143
|
+
WebSocket?: typeof WebSocket;
|
|
144
|
+
}
|
|
145
|
+
/** EventBus over Clevix Flow realtime.
|
|
146
|
+
*
|
|
147
|
+
* Each thread has its own channel, and a process opens one socket per thread
|
|
148
|
+
* it follows, shared by every subscriber in the process. Realtime keeps
|
|
149
|
+
* nothing and drops what comes while a socket reconnects: the bus is
|
|
150
|
+
* at-most-once anyway, and a follower fills any gap from the log. An event
|
|
151
|
+
* over about 60 KB waits in the kv for a minute, and the channel carries its
|
|
152
|
+
* key. While anyone subscribes, each subscriber gets a HEARTBEAT notice
|
|
153
|
+
* (seq 0) every `heartbeatMs`, as with the other buses.
|
|
154
|
+
*
|
|
155
|
+
* Needs Flow SDK 0.7.0 or later. */
|
|
156
|
+
export declare class FlowBus implements EventBus {
|
|
157
|
+
private readonly flow;
|
|
158
|
+
private readonly opts;
|
|
159
|
+
private readonly channels;
|
|
160
|
+
private heartbeat?;
|
|
161
|
+
constructor(flow: Flow, opts: FlowBusOptions);
|
|
162
|
+
private get env();
|
|
163
|
+
publish(threadId: string, event: AgentEvent): Promise<void>;
|
|
164
|
+
subscribe(threadId: string, handler: (event: AgentEvent) => void): Promise<() => void>;
|
|
165
|
+
/** Opens the thread's socket. `open` settles when it is open, or after
|
|
166
|
+
* `openTimeoutMs`: an event published before then may be missed, which a
|
|
167
|
+
* follower's gap read covers. */
|
|
168
|
+
private connect;
|
|
169
|
+
private receive;
|
|
170
|
+
private deliver;
|
|
171
|
+
private startHeartbeat;
|
|
172
|
+
private stopHeartbeat;
|
|
173
|
+
}
|
|
174
|
+
/** The Flow stream a run stream is kept in. */
|
|
175
|
+
export declare function flowStreamId(streamId: string): Promise<string>;
|
|
176
|
+
export interface FlowStreamsOptions {
|
|
177
|
+
/** Holds items too big for one stream item (over about 60 KB). */
|
|
178
|
+
kv: Kv;
|
|
179
|
+
/** How long such an item stays in the kv. Default 8 days: past Flow's
|
|
180
|
+
* longest time to live, so it outlives its stream. */
|
|
181
|
+
refTtlMs?: number;
|
|
182
|
+
/** Cloudflare Workers: the handler's `env`, where the Flow keys live. */
|
|
183
|
+
env?: FlowEnv;
|
|
184
|
+
/** A WebSocket class, where the runtime has none. */
|
|
185
|
+
WebSocket?: typeof WebSocket;
|
|
186
|
+
}
|
|
187
|
+
/** RunStreams over Clevix Flow streams.
|
|
188
|
+
*
|
|
189
|
+
* Flow keeps the items, gives offsets, and lets a reader start from any
|
|
190
|
+
* offset and follow live, which is what a run stream needs. An item over
|
|
191
|
+
* about 60 KB is kept in the kv and the stream carries its key; readers get
|
|
192
|
+
* the event back. Flow keeps a stream at most 7 days and a grace window at
|
|
193
|
+
* most 7 days, so longer times are cut to that. A stream holds at most
|
|
194
|
+
* 20,000 items and 32 MB; an append past that fails.
|
|
195
|
+
*
|
|
196
|
+
* Needs Flow SDK 0.7.0 or later. */
|
|
197
|
+
export declare class FlowStreams implements RunStreams {
|
|
198
|
+
private readonly flow;
|
|
199
|
+
private readonly opts;
|
|
200
|
+
constructor(flow: Flow, opts: FlowStreamsOptions);
|
|
201
|
+
private get env();
|
|
202
|
+
open(streamId: string, meta: StreamMeta, ttlMs: number): Promise<void>;
|
|
203
|
+
append(streamId: string, events: StreamEvent[]): Promise<string[]>;
|
|
204
|
+
read(streamId: string, after: string | null, signal?: AbortSignal): AsyncIterable<StreamItem>;
|
|
205
|
+
snapshot(streamId: string, after?: string | null): Promise<StreamSnapshot | null>;
|
|
206
|
+
close(streamId: string, end: StreamEnd, graceMs: number): Promise<void>;
|
|
207
|
+
delete(streamId: string): Promise<void>;
|
|
208
|
+
private call;
|
|
209
|
+
/** A Flow item as a run stream item: the event, read back from the kv when
|
|
210
|
+
* the stream holds its key. Null when that kv copy has expired. */
|
|
211
|
+
private decode;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/adapters/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,653 @@
|
|
|
1
|
+
import { RetryAfterError } from '@clevix/flow';
|
|
2
|
+
import { DuplicateJobError, PayloadTooLargeError, QueueFullError, } from '../ports/queue.js';
|
|
3
|
+
import { StreamClosedError, StreamGoneError, } from '../ports/streams.js';
|
|
4
|
+
import { isStreamEnd } from '../core/stream-events.js';
|
|
5
|
+
/** The function ID the queue starts and the worker serves, unless both are
|
|
6
|
+
* given another. */
|
|
7
|
+
export const FLOW_FUNCTION_ID = 'agentenkit-run';
|
|
8
|
+
/** The event the function lists as its trigger. Nothing sends it: runs come
|
|
9
|
+
* from `flow.start`. Flow needs every function to have a trigger. */
|
|
10
|
+
export const FLOW_JOB_EVENT = 'agentenkit/job';
|
|
11
|
+
/** A run's data is at most 1 MB on Flow. */
|
|
12
|
+
const MAX_DATA_BYTES = 1_000_000;
|
|
13
|
+
/** Flow's `priority.run` is in seconds, from -600 to 600. */
|
|
14
|
+
const PRIORITY_SECONDS = 60;
|
|
15
|
+
const MAX_PRIORITY = 600;
|
|
16
|
+
const ACTIVE = ['queued', 'running', 'sleeping', 'waiting', 'waiting_for_app', 'paused'];
|
|
17
|
+
/** A run that has not started its job, or waits between tries. `purge`
|
|
18
|
+
* cancels only these. */
|
|
19
|
+
const WAITING = ['queued', 'sleeping', 'waiting', 'waiting_for_app', 'paused'];
|
|
20
|
+
/** The most runs one list call gives. */
|
|
21
|
+
const PAGE_SIZE = 200;
|
|
22
|
+
/** The function's ID: `id`, or `agentenkit-run`, after the namespace. */
|
|
23
|
+
function functionName(namespace, id) {
|
|
24
|
+
const name = id || FLOW_FUNCTION_ID;
|
|
25
|
+
return namespace ? `${namespace}-${name}` : name;
|
|
26
|
+
}
|
|
27
|
+
/** Queue adapter over Clevix Flow.
|
|
28
|
+
*
|
|
29
|
+
* Each job is one run of one Flow function (see `agentRunFunction`),
|
|
30
|
+
* started with `flow.start`. A key is the function's singleton key in
|
|
31
|
+
* `skip` mode, so at most one live run holds it, and it is free again as
|
|
32
|
+
* soon as that run ends. A delay is a sleep at the start of the run, so the
|
|
33
|
+
* key stays held while the job waits. `cancel` cancels the run that holds a
|
|
34
|
+
* key. `find` and `stats` read Flow's runs index, which lags the runs by a
|
|
35
|
+
* few seconds.
|
|
36
|
+
*
|
|
37
|
+
* It is also a `QueueAdmin`: `pause` and `resume` pause the function, and
|
|
38
|
+
* the dead jobs are its failed runs.
|
|
39
|
+
*
|
|
40
|
+
* Needs Flow SDK 0.8.0 or later and an engine with the run control routes. */
|
|
41
|
+
export class FlowQueue {
|
|
42
|
+
flow;
|
|
43
|
+
opts;
|
|
44
|
+
functionId;
|
|
45
|
+
constructor(flow, opts = {}) {
|
|
46
|
+
this.flow = flow;
|
|
47
|
+
this.opts = opts;
|
|
48
|
+
this.functionId = functionName(opts.namespace, opts.functionId);
|
|
49
|
+
}
|
|
50
|
+
get env() {
|
|
51
|
+
return this.opts.env ? { env: this.opts.env } : {};
|
|
52
|
+
}
|
|
53
|
+
async enqueue(job, opts) {
|
|
54
|
+
// An unkeyed job still needs a singleton key, or every unkeyed job would
|
|
55
|
+
// share one. Its dispatch id is its own; a second start of the same
|
|
56
|
+
// dispatch is the same job, so it is dropped without an error.
|
|
57
|
+
const key = opts?.key || job.dispatchId || crypto.randomUUID();
|
|
58
|
+
const data = {
|
|
59
|
+
job,
|
|
60
|
+
key,
|
|
61
|
+
priority: Math.max(-MAX_PRIORITY, Math.min(MAX_PRIORITY, (opts?.priority ?? 0) * PRIORITY_SECONDS)),
|
|
62
|
+
...(opts?.delaySeconds && opts.delaySeconds > 0
|
|
63
|
+
? { notBefore: Date.now() + Math.ceil(opts.delaySeconds * 1000) }
|
|
64
|
+
: {}),
|
|
65
|
+
};
|
|
66
|
+
if (new TextEncoder().encode(JSON.stringify(data)).length > MAX_DATA_BYTES)
|
|
67
|
+
throw new PayloadTooLargeError();
|
|
68
|
+
// Only new work is refused: a retry or a resume belongs to a run that is
|
|
69
|
+
// already under way, and refusing it would strand that run.
|
|
70
|
+
if (this.opts.maxDepth && this.opts.maxDepth > 0 && !job.kind) {
|
|
71
|
+
const counts = await this.flow.runs.counts({ function: this.functionId, ...this.env });
|
|
72
|
+
if (counts.queued + counts.waiting_for_app + counts.paused >= this.opts.maxDepth)
|
|
73
|
+
throw new QueueFullError();
|
|
74
|
+
}
|
|
75
|
+
// Twice at most: a singleton answer with no active run means the run that
|
|
76
|
+
// held the key ended in between, so the key is free now.
|
|
77
|
+
for (let i = 0; i < 2; i++) {
|
|
78
|
+
// "hold": while the queue is paused, the job waits in it, as it would
|
|
79
|
+
// in any queue, and starts on `resume`.
|
|
80
|
+
const res = await this.flow.start(this.functionId, { data: data, whenPaused: 'hold', ...this.env });
|
|
81
|
+
if (res.started)
|
|
82
|
+
return;
|
|
83
|
+
if (res.reason === 'singleton') {
|
|
84
|
+
if (res.activeRunId === null)
|
|
85
|
+
continue;
|
|
86
|
+
if (opts?.key)
|
|
87
|
+
throw new DuplicateJobError(opts.key);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (res.reason === 'paused')
|
|
91
|
+
throw new Error(`flow: function ${this.functionId} is paused`);
|
|
92
|
+
throw new Error(`flow: no function ${this.functionId}; is the app served and synced?`);
|
|
93
|
+
}
|
|
94
|
+
// Both tries found the key held by a run that had just ended. No run
|
|
95
|
+
// started, so the caller must hear it, or the job is lost.
|
|
96
|
+
throw new Error(`flow: no run started for key ${key}; the key was still being freed`);
|
|
97
|
+
}
|
|
98
|
+
async cancel(key) {
|
|
99
|
+
await this.flow.runs.cancel({ function: this.functionId, singletonKey: key }, this.env);
|
|
100
|
+
}
|
|
101
|
+
async find(runId) {
|
|
102
|
+
const page = await this.flow.runs.list({
|
|
103
|
+
function: this.functionId, tags: { runId }, status: ACTIVE, limit: 50, ...this.env,
|
|
104
|
+
});
|
|
105
|
+
// Newest first: the earliest is the last one.
|
|
106
|
+
const run = page.items[page.items.length - 1];
|
|
107
|
+
return run ? queuedJob(run) : null;
|
|
108
|
+
}
|
|
109
|
+
async stats() {
|
|
110
|
+
const [counts, queued] = await Promise.all([
|
|
111
|
+
this.flow.runs.counts({ function: this.functionId, ...this.env }),
|
|
112
|
+
this.flow.runs.list({ function: this.functionId, status: ['queued'], limit: 1, order: 'oldest', ...this.env }),
|
|
113
|
+
]);
|
|
114
|
+
const oldest = queued.items[0];
|
|
115
|
+
return {
|
|
116
|
+
ready: counts.queued + counts.waiting_for_app,
|
|
117
|
+
delayed: counts.sleeping + counts.waiting,
|
|
118
|
+
inFlight: counts.running,
|
|
119
|
+
dead: counts.failed,
|
|
120
|
+
oldestReadyMs: oldest ? Math.max(0, Date.now() - oldest.createdAt) : 0,
|
|
121
|
+
paused: counts.paused > 0,
|
|
122
|
+
claimErrors: 0,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/** Pause the function. Jobs enqueued meanwhile wait, paused, and jobs
|
|
126
|
+
* already started pause at their next step. `resume` lets them all go. */
|
|
127
|
+
async pause() {
|
|
128
|
+
await this.flow.functions.pause(this.functionId, this.env);
|
|
129
|
+
}
|
|
130
|
+
/** Resume the function and its paused runs. */
|
|
131
|
+
async resume() {
|
|
132
|
+
await this.flow.functions.resume(this.functionId, this.env);
|
|
133
|
+
}
|
|
134
|
+
/** Cancel the waiting runs that match. Running runs are left alone. With
|
|
135
|
+
* `includeDead` it deletes the failed runs that match too. It reads Flow's
|
|
136
|
+
* runs index, so a job enqueued in the last few seconds can be missed. */
|
|
137
|
+
async purge(filter) {
|
|
138
|
+
if (!filter.threadId && !filter.runId && filter.kind === undefined && !(filter.olderThanMs && filter.olderThanMs > 0)) {
|
|
139
|
+
throw new Error('flow queue: purge needs a filter');
|
|
140
|
+
}
|
|
141
|
+
const tags = {};
|
|
142
|
+
if (filter.threadId)
|
|
143
|
+
tags.threadId = filter.threadId;
|
|
144
|
+
if (filter.runId)
|
|
145
|
+
tags.runId = filter.runId;
|
|
146
|
+
// The kind tag of a fresh dispatch is empty, which a tag filter cannot ask
|
|
147
|
+
// for, so the kind is checked here.
|
|
148
|
+
const match = (run) => (filter.kind === undefined || (run.tags.kind ?? '') === (filter.kind ?? '')) &&
|
|
149
|
+
(!filter.olderThanMs || Date.now() - run.createdAt > filter.olderThanMs);
|
|
150
|
+
let n = 0;
|
|
151
|
+
await this.eachRun(WAITING, tags, async (run) => {
|
|
152
|
+
if (!match(run))
|
|
153
|
+
return;
|
|
154
|
+
const res = await this.flow.runs.cancel({ runId: run.id }, this.env);
|
|
155
|
+
n += res.cancelled.length;
|
|
156
|
+
});
|
|
157
|
+
if (!filter.includeDead)
|
|
158
|
+
return n;
|
|
159
|
+
await this.eachRun(['failed'], tags, async (run) => {
|
|
160
|
+
if (!match(run))
|
|
161
|
+
return;
|
|
162
|
+
if ((await this.flow.runs.delete(run.id, this.env)).deleted)
|
|
163
|
+
n++;
|
|
164
|
+
});
|
|
165
|
+
return n;
|
|
166
|
+
}
|
|
167
|
+
/** The failed runs, newest first, with the job each carried. It asks each
|
|
168
|
+
* run for its error, so it makes one call per job. */
|
|
169
|
+
async listDead(limit = 100) {
|
|
170
|
+
if (limit <= 0)
|
|
171
|
+
limit = 100;
|
|
172
|
+
const out = [];
|
|
173
|
+
await this.eachRun(['failed'], {}, async (run) => {
|
|
174
|
+
if (out.length >= limit)
|
|
175
|
+
return false;
|
|
176
|
+
const detail = await this.flow.runs.get(run.id, this.env);
|
|
177
|
+
// Gone since the list: deleted, or past its retention.
|
|
178
|
+
if (!detail)
|
|
179
|
+
return;
|
|
180
|
+
const data = detail.event.data;
|
|
181
|
+
out.push({
|
|
182
|
+
id: run.id,
|
|
183
|
+
job: data?.job ?? {},
|
|
184
|
+
attempts: detail.attempts,
|
|
185
|
+
deadAt: new Date(run.endedAt ?? 0),
|
|
186
|
+
lastError: detail.error?.message ?? '',
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
/** Retry a failed run from where it stopped, under the same run ID. False
|
|
192
|
+
* when there is no such failed run (a run `purge` cancelled is not dead),
|
|
193
|
+
* the queue is paused, or another run holds the job's key now. */
|
|
194
|
+
async redrive(id) {
|
|
195
|
+
const run = await this.flow.runs.get(id, this.env);
|
|
196
|
+
if (run?.status !== 'failed' || run.functionId !== this.functionId)
|
|
197
|
+
return false;
|
|
198
|
+
return (await this.flow.runs.retry(id, this.env)).retried;
|
|
199
|
+
}
|
|
200
|
+
/** Delete the failed runs that ended longer ago than `olderThanMs`. Runs
|
|
201
|
+
* kept for debugging in the dashboard stay. */
|
|
202
|
+
async purgeDead(olderThanMs) {
|
|
203
|
+
let n = 0;
|
|
204
|
+
await this.eachRun(['failed'], {}, async (run) => {
|
|
205
|
+
if (Date.now() - (run.endedAt ?? 0) <= olderThanMs)
|
|
206
|
+
return;
|
|
207
|
+
if ((await this.flow.runs.delete(run.id, this.env)).deleted)
|
|
208
|
+
n++;
|
|
209
|
+
});
|
|
210
|
+
return n;
|
|
211
|
+
}
|
|
212
|
+
/** Calls `fn` for each of the function's runs in these statuses, newest
|
|
213
|
+
* first, page by page. `fn` gives back false to stop. */
|
|
214
|
+
async eachRun(status, tags, fn) {
|
|
215
|
+
let before;
|
|
216
|
+
for (;;) {
|
|
217
|
+
const page = await this.flow.runs.list({
|
|
218
|
+
function: this.functionId, status: status, limit: PAGE_SIZE,
|
|
219
|
+
...(Object.keys(tags).length ? { tags } : {}), ...(before ? { before } : {}), ...this.env,
|
|
220
|
+
});
|
|
221
|
+
for (const run of page.items) {
|
|
222
|
+
if ((await fn(run)) === false)
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (!page.next)
|
|
226
|
+
return;
|
|
227
|
+
before = page.next;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function queuedJob(run) {
|
|
232
|
+
return {
|
|
233
|
+
id: run.id,
|
|
234
|
+
runId: run.tags.runId ?? '',
|
|
235
|
+
threadId: run.tags.threadId ?? '',
|
|
236
|
+
kind: (run.tags.kind || undefined),
|
|
237
|
+
attempts: 0,
|
|
238
|
+
runAt: new Date(run.createdAt),
|
|
239
|
+
position: -1,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/** The wait before try `attempt + 1`: `base` doubled `attempt` times, up to
|
|
243
|
+
* `max`. */
|
|
244
|
+
export function retryBackoff(base, max, attempt) {
|
|
245
|
+
let d = base;
|
|
246
|
+
for (let i = 0; i < attempt && d < max; i++)
|
|
247
|
+
d *= 2;
|
|
248
|
+
return Math.min(d, max);
|
|
249
|
+
}
|
|
250
|
+
/** A Flow duration in ms, read as Flow reads it: a number is ms, a string is
|
|
251
|
+
* like "14m" or "1h30m". NaN when it is not one. */
|
|
252
|
+
function durationMs(d) {
|
|
253
|
+
if (typeof d === 'number')
|
|
254
|
+
return d;
|
|
255
|
+
const unit = { ms: 1, s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000, w: 604_800_000 };
|
|
256
|
+
let total = 0;
|
|
257
|
+
let consumed = 0;
|
|
258
|
+
for (const m of d.trim().matchAll(/(\d+(?:\.\d+)?)(ms|s|m|h|d|w)/g)) {
|
|
259
|
+
total += Number(m[1]) * unit[m[2]];
|
|
260
|
+
consumed += m[0].length;
|
|
261
|
+
}
|
|
262
|
+
return consumed > 0 && consumed === d.trim().length ? total : Number.NaN;
|
|
263
|
+
}
|
|
264
|
+
/** The Flow function that runs `FlowQueue`'s jobs. Serve it with the app's
|
|
265
|
+
* other Flow functions.
|
|
266
|
+
*
|
|
267
|
+
* A job runs in one step. `handleJob` only throws for what a queue should
|
|
268
|
+
* retry (an unknown agent, a store that is down), so Flow's retries cover
|
|
269
|
+
* delivery; agentic-kit retries a failed run itself. When Flow gives up, the
|
|
270
|
+
* failure function hands the job to `handleDeadJob`, which fails the run. */
|
|
271
|
+
export function agentRunFunction(flow, core, opts = {}) {
|
|
272
|
+
const stepTimeout = opts.stepTimeout ?? '14m';
|
|
273
|
+
if (opts.segmentTimeoutMs && opts.segmentTimeoutMs > 0 && !(opts.segmentTimeoutMs < durationMs(stepTimeout))) {
|
|
274
|
+
throw new Error(`flow: segmentTimeoutMs ${opts.segmentTimeoutMs} must be shorter than stepTimeout ${String(stepTimeout)}, or a long segment is tried again while it still runs`);
|
|
275
|
+
}
|
|
276
|
+
const backoffMax = opts.retryBackoffMaxMs && opts.retryBackoffMaxMs > 0 ? opts.retryBackoffMaxMs : 60_000;
|
|
277
|
+
const concurrency = [
|
|
278
|
+
...(opts.concurrency ? [{ limit: opts.concurrency, key: 'event.data.job.partitionKey' }] : []),
|
|
279
|
+
...(opts.globalConcurrency ? [{ limit: opts.globalConcurrency }] : []),
|
|
280
|
+
];
|
|
281
|
+
return flow.createFunction({
|
|
282
|
+
id: functionName(opts.namespace, opts.id),
|
|
283
|
+
singleton: { key: 'event.data.key', mode: 'skip' },
|
|
284
|
+
tags: { runId: 'event.data.job.runId', threadId: 'event.data.job.threadId', kind: 'event.data.job.kind' },
|
|
285
|
+
priority: { run: 'event.data.priority' },
|
|
286
|
+
...(concurrency.length ? { concurrency } : {}),
|
|
287
|
+
...(opts.retries !== undefined ? { retries: opts.retries } : {}),
|
|
288
|
+
timeouts: { step: stepTimeout },
|
|
289
|
+
onFailure: async ({ event, error, attempts }) => {
|
|
290
|
+
const data = event.data?.event?.data;
|
|
291
|
+
if (!data?.job)
|
|
292
|
+
return;
|
|
293
|
+
await core.worker.handleDeadJob(data.job, attempts, new Error(error?.message ?? 'the Flow run failed'));
|
|
294
|
+
},
|
|
295
|
+
}, { event: FLOW_JOB_EVENT }, async ({ event, step }) => {
|
|
296
|
+
const data = event.data;
|
|
297
|
+
if (data.notBefore)
|
|
298
|
+
await step.sleepUntil('delay', data.notBefore);
|
|
299
|
+
return step.run('handle', async ({ attempt }) => {
|
|
300
|
+
try {
|
|
301
|
+
return await core.worker.handleJob(data.job);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
if (!opts.retryBackoffMs || opts.retryBackoffMs <= 0)
|
|
305
|
+
throw err;
|
|
306
|
+
// A job that must not be tried again, or names its own time, keeps it.
|
|
307
|
+
if (err instanceof Error && (err.name === 'NonRetriableError' || err.name === 'RetryAfterError'))
|
|
308
|
+
throw err;
|
|
309
|
+
throw new RetryAfterError(err instanceof Error ? err.message : String(err), Date.now() + retryBackoff(opts.retryBackoffMs, backoffMax, attempt), { cause: err });
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
// ---- names and big values, shared by the bus and the streams ----
|
|
315
|
+
/** Flow's charset for channel and stream names. */
|
|
316
|
+
const NAME_RE = /^[A-Za-z0-9:_.-]{1,256}$/;
|
|
317
|
+
/** Under Flow's 64 KB cap on one message or one stream item, with room for
|
|
318
|
+
* the rest of the request. A value over it goes through the kv. */
|
|
319
|
+
const MAX_INLINE_BYTES = 60_000;
|
|
320
|
+
const byteLength = (s) => new TextEncoder().encode(s).length;
|
|
321
|
+
async function sha256Hex(s) {
|
|
322
|
+
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s));
|
|
323
|
+
return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
324
|
+
}
|
|
325
|
+
/** `prefix + id` when Flow allows it, else `prefix + "h." + sha256(id)`. */
|
|
326
|
+
async function flowName(prefix, id) {
|
|
327
|
+
const name = prefix + id;
|
|
328
|
+
if (NAME_RE.test(name) && name !== '.' && name !== '..' && name !== 'token' && name !== 'connect')
|
|
329
|
+
return name;
|
|
330
|
+
return `${prefix}h.${await sha256Hex(id)}`;
|
|
331
|
+
}
|
|
332
|
+
// ---- FlowBus ----
|
|
333
|
+
/** The channel a thread's events go on. */
|
|
334
|
+
export function flowThreadChannel(threadId) {
|
|
335
|
+
return flowName('agentenkit.thread.', threadId);
|
|
336
|
+
}
|
|
337
|
+
const BUS_TOPIC = 'events';
|
|
338
|
+
/** How long an event too big for one message waits in the kv. */
|
|
339
|
+
const BUS_REF_SECONDS = 60;
|
|
340
|
+
/** EventBus over Clevix Flow realtime.
|
|
341
|
+
*
|
|
342
|
+
* Each thread has its own channel, and a process opens one socket per thread
|
|
343
|
+
* it follows, shared by every subscriber in the process. Realtime keeps
|
|
344
|
+
* nothing and drops what comes while a socket reconnects: the bus is
|
|
345
|
+
* at-most-once anyway, and a follower fills any gap from the log. An event
|
|
346
|
+
* over about 60 KB waits in the kv for a minute, and the channel carries its
|
|
347
|
+
* key. While anyone subscribes, each subscriber gets a HEARTBEAT notice
|
|
348
|
+
* (seq 0) every `heartbeatMs`, as with the other buses.
|
|
349
|
+
*
|
|
350
|
+
* Needs Flow SDK 0.7.0 or later. */
|
|
351
|
+
export class FlowBus {
|
|
352
|
+
flow;
|
|
353
|
+
opts;
|
|
354
|
+
channels = new Map();
|
|
355
|
+
heartbeat;
|
|
356
|
+
constructor(flow, opts) {
|
|
357
|
+
this.flow = flow;
|
|
358
|
+
this.opts = opts;
|
|
359
|
+
}
|
|
360
|
+
get env() {
|
|
361
|
+
return this.opts.env ? { env: this.opts.env } : {};
|
|
362
|
+
}
|
|
363
|
+
async publish(threadId, event) {
|
|
364
|
+
const raw = JSON.stringify(event);
|
|
365
|
+
let frame = { event };
|
|
366
|
+
if (byteLength(raw) > MAX_INLINE_BYTES) {
|
|
367
|
+
const ref = `agentenkit:flowbus:${threadId}:${crypto.randomUUID()}`;
|
|
368
|
+
await this.opts.kv.set(ref, raw, { exSeconds: BUS_REF_SECONDS });
|
|
369
|
+
frame = { ref };
|
|
370
|
+
}
|
|
371
|
+
const channel = await flowThreadChannel(threadId);
|
|
372
|
+
await this.flow.realtime.publish({ channel, topic: BUS_TOPIC, data: frame }, this.env);
|
|
373
|
+
}
|
|
374
|
+
async subscribe(threadId, handler) {
|
|
375
|
+
let ch = this.channels.get(threadId);
|
|
376
|
+
if (!ch)
|
|
377
|
+
ch = this.connect(threadId);
|
|
378
|
+
ch.handlers.add(handler);
|
|
379
|
+
this.startHeartbeat();
|
|
380
|
+
await ch.open;
|
|
381
|
+
if (ch.failed) {
|
|
382
|
+
ch.handlers.delete(handler);
|
|
383
|
+
if (this.channels.size === 0)
|
|
384
|
+
this.stopHeartbeat();
|
|
385
|
+
throw ch.failed.error;
|
|
386
|
+
}
|
|
387
|
+
let done = false;
|
|
388
|
+
const mine = ch;
|
|
389
|
+
return () => {
|
|
390
|
+
if (done)
|
|
391
|
+
return;
|
|
392
|
+
done = true;
|
|
393
|
+
mine.handlers.delete(handler);
|
|
394
|
+
if (mine.handlers.size === 0 && this.channels.get(threadId) === mine) {
|
|
395
|
+
this.channels.delete(threadId);
|
|
396
|
+
mine.stop();
|
|
397
|
+
}
|
|
398
|
+
if (this.channels.size === 0)
|
|
399
|
+
this.stopHeartbeat();
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/** Opens the thread's socket. `open` settles when it is open, or after
|
|
403
|
+
* `openTimeoutMs`: an event published before then may be missed, which a
|
|
404
|
+
* follower's gap read covers. */
|
|
405
|
+
connect(threadId) {
|
|
406
|
+
let opened;
|
|
407
|
+
const open = new Promise((resolve) => (opened = resolve));
|
|
408
|
+
const timer = setTimeout(opened, this.opts.openTimeoutMs ?? 10_000);
|
|
409
|
+
timer.unref?.();
|
|
410
|
+
let stop;
|
|
411
|
+
let stopped = false;
|
|
412
|
+
const ch = {
|
|
413
|
+
handlers: new Set(),
|
|
414
|
+
open,
|
|
415
|
+
queue: Promise.resolve(),
|
|
416
|
+
stop: () => {
|
|
417
|
+
stopped = true;
|
|
418
|
+
clearTimeout(timer);
|
|
419
|
+
opened();
|
|
420
|
+
stop?.();
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
this.channels.set(threadId, ch);
|
|
424
|
+
flowThreadChannel(threadId)
|
|
425
|
+
.then((channel) => {
|
|
426
|
+
if (stopped)
|
|
427
|
+
return;
|
|
428
|
+
stop = this.flow.realtime.subscribe({
|
|
429
|
+
channel,
|
|
430
|
+
topics: [BUS_TOPIC],
|
|
431
|
+
...this.env,
|
|
432
|
+
...(this.opts.WebSocket ? { WebSocket: this.opts.WebSocket } : {}),
|
|
433
|
+
onState: (state) => {
|
|
434
|
+
if (state === 'open') {
|
|
435
|
+
clearTimeout(timer);
|
|
436
|
+
opened();
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
onMessage: (message) => {
|
|
440
|
+
ch.queue = ch.queue.then(() => this.receive(ch, message.data));
|
|
441
|
+
},
|
|
442
|
+
});
|
|
443
|
+
})
|
|
444
|
+
.catch((error) => {
|
|
445
|
+
// No socket (no WebSocket class, bad options): every subscriber
|
|
446
|
+
// waiting on it gets the error, as Go's Subscribe returns it.
|
|
447
|
+
ch.failed = { error };
|
|
448
|
+
if (this.channels.get(threadId) === ch)
|
|
449
|
+
this.channels.delete(threadId);
|
|
450
|
+
clearTimeout(timer);
|
|
451
|
+
opened();
|
|
452
|
+
});
|
|
453
|
+
return ch;
|
|
454
|
+
}
|
|
455
|
+
async receive(ch, frame) {
|
|
456
|
+
let event;
|
|
457
|
+
try {
|
|
458
|
+
if ('event' in frame) {
|
|
459
|
+
event = frame.event;
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
const raw = await this.opts.kv.get(frame.ref);
|
|
463
|
+
if (raw === null)
|
|
464
|
+
return; // expired: the follower reads it from the log
|
|
465
|
+
event = JSON.parse(raw);
|
|
466
|
+
}
|
|
467
|
+
event.createdAt = new Date(event.createdAt);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
return; // a malformed frame never kills the subscription
|
|
471
|
+
}
|
|
472
|
+
this.deliver(ch.handlers, event);
|
|
473
|
+
}
|
|
474
|
+
deliver(handlers, event) {
|
|
475
|
+
for (const handler of [...handlers]) {
|
|
476
|
+
try {
|
|
477
|
+
handler(event);
|
|
478
|
+
}
|
|
479
|
+
catch {
|
|
480
|
+
// one throwing handler must not stop the others
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
startHeartbeat() {
|
|
485
|
+
if (this.heartbeat)
|
|
486
|
+
return;
|
|
487
|
+
this.heartbeat = setInterval(() => {
|
|
488
|
+
for (const [threadId, ch] of this.channels) {
|
|
489
|
+
this.deliver(ch.handlers, { threadId, seq: 0, type: 'HEARTBEAT', payload: null, createdAt: new Date() });
|
|
490
|
+
}
|
|
491
|
+
}, this.opts.heartbeatMs ?? 60_000);
|
|
492
|
+
this.heartbeat.unref?.();
|
|
493
|
+
}
|
|
494
|
+
stopHeartbeat() {
|
|
495
|
+
if (this.heartbeat)
|
|
496
|
+
clearInterval(this.heartbeat);
|
|
497
|
+
this.heartbeat = undefined;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
// ---- FlowStreams ----
|
|
501
|
+
/** The Flow stream a run stream is kept in. */
|
|
502
|
+
export function flowStreamId(streamId) {
|
|
503
|
+
return flowName('agentenkit.', streamId);
|
|
504
|
+
}
|
|
505
|
+
/** Flow's limits on one stream call. */
|
|
506
|
+
const MAX_APPEND_ITEMS = 100;
|
|
507
|
+
const MAX_APPEND_BYTES = 900_000;
|
|
508
|
+
const MAX_STREAM_MS = 7 * 24 * 60 * 60_000;
|
|
509
|
+
/** RunStreams over Clevix Flow streams.
|
|
510
|
+
*
|
|
511
|
+
* Flow keeps the items, gives offsets, and lets a reader start from any
|
|
512
|
+
* offset and follow live, which is what a run stream needs. An item over
|
|
513
|
+
* about 60 KB is kept in the kv and the stream carries its key; readers get
|
|
514
|
+
* the event back. Flow keeps a stream at most 7 days and a grace window at
|
|
515
|
+
* most 7 days, so longer times are cut to that. A stream holds at most
|
|
516
|
+
* 20,000 items and 32 MB; an append past that fails.
|
|
517
|
+
*
|
|
518
|
+
* Needs Flow SDK 0.7.0 or later. */
|
|
519
|
+
export class FlowStreams {
|
|
520
|
+
flow;
|
|
521
|
+
opts;
|
|
522
|
+
constructor(flow, opts) {
|
|
523
|
+
this.flow = flow;
|
|
524
|
+
this.opts = opts;
|
|
525
|
+
}
|
|
526
|
+
get env() {
|
|
527
|
+
return this.opts.env ? { env: this.opts.env } : {};
|
|
528
|
+
}
|
|
529
|
+
async open(streamId, meta, ttlMs) {
|
|
530
|
+
const id = await flowStreamId(streamId);
|
|
531
|
+
const ttl = Math.min(MAX_STREAM_MS, Math.max(1000, Math.ceil(ttlMs)));
|
|
532
|
+
await this.flow.streams.open(id, { meta: { threadId: meta.threadId, runId: meta.runId }, ttl, ...this.env });
|
|
533
|
+
}
|
|
534
|
+
async append(streamId, events) {
|
|
535
|
+
if (events.length === 0)
|
|
536
|
+
return [];
|
|
537
|
+
const id = await flowStreamId(streamId);
|
|
538
|
+
const items = [];
|
|
539
|
+
for (const event of events) {
|
|
540
|
+
const raw = JSON.stringify(event);
|
|
541
|
+
if (byteLength(raw) <= MAX_INLINE_BYTES) {
|
|
542
|
+
items.push({ json: event, bytes: byteLength(raw) });
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
const ref = { agentenkitRef: `agentenkit:flowstream:${streamId}:${crypto.randomUUID()}` };
|
|
546
|
+
await this.opts.kv.set(ref.agentenkitRef, raw, { exSeconds: Math.ceil((this.opts.refTtlMs ?? 8 * 24 * 60 * 60_000) / 1000) });
|
|
547
|
+
items.push({ json: ref, bytes: byteLength(JSON.stringify(ref)) });
|
|
548
|
+
}
|
|
549
|
+
// In batches Flow takes: 100 items and under 1 MB a call.
|
|
550
|
+
const offsets = [];
|
|
551
|
+
let batch = [];
|
|
552
|
+
let size = 0;
|
|
553
|
+
const flush = async () => {
|
|
554
|
+
if (batch.length === 0)
|
|
555
|
+
return;
|
|
556
|
+
offsets.push(...(await this.call(streamId, () => this.flow.streams.append(id, batch, this.env))));
|
|
557
|
+
batch = [];
|
|
558
|
+
size = 0;
|
|
559
|
+
};
|
|
560
|
+
for (const item of items) {
|
|
561
|
+
if (batch.length === MAX_APPEND_ITEMS || size + item.bytes > MAX_APPEND_BYTES)
|
|
562
|
+
await flush();
|
|
563
|
+
batch.push(item.json);
|
|
564
|
+
size += item.bytes;
|
|
565
|
+
}
|
|
566
|
+
await flush();
|
|
567
|
+
return offsets;
|
|
568
|
+
}
|
|
569
|
+
async *read(streamId, after, signal) {
|
|
570
|
+
const id = await flowStreamId(streamId);
|
|
571
|
+
const items = this.flow.streams.read(id, {
|
|
572
|
+
...(after ? { after } : {}),
|
|
573
|
+
...(signal ? { signal } : {}),
|
|
574
|
+
...(this.opts.WebSocket ? { WebSocket: this.opts.WebSocket } : {}),
|
|
575
|
+
...this.env,
|
|
576
|
+
});
|
|
577
|
+
try {
|
|
578
|
+
for await (const item of items) {
|
|
579
|
+
const decoded = await this.decode(item);
|
|
580
|
+
if (decoded)
|
|
581
|
+
yield decoded;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
catch (err) {
|
|
585
|
+
throw mapStreamError(streamId, err);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
async snapshot(streamId, after) {
|
|
589
|
+
const id = await flowStreamId(streamId);
|
|
590
|
+
const snap = await this.call(streamId, () => this.flow.streams.snapshot(id, { ...(after ? { after } : {}), ...this.env }));
|
|
591
|
+
if (!snap)
|
|
592
|
+
return null;
|
|
593
|
+
const items = [];
|
|
594
|
+
for (const item of snap.items) {
|
|
595
|
+
const decoded = await this.decode(item);
|
|
596
|
+
if (decoded)
|
|
597
|
+
items.push(decoded);
|
|
598
|
+
}
|
|
599
|
+
// The end item is the last one; `end` is the event, without its offset.
|
|
600
|
+
let end = null;
|
|
601
|
+
const last = items[items.length - 1];
|
|
602
|
+
if (snap.ended && last && isStreamEnd(last)) {
|
|
603
|
+
const { offset: _, ...event } = last;
|
|
604
|
+
end = event;
|
|
605
|
+
}
|
|
606
|
+
const meta = snap.meta;
|
|
607
|
+
return {
|
|
608
|
+
meta: { threadId: meta?.threadId ?? '', runId: meta?.runId ?? '' },
|
|
609
|
+
items,
|
|
610
|
+
end,
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
async close(streamId, end, graceMs) {
|
|
614
|
+
const id = await flowStreamId(streamId);
|
|
615
|
+
const grace = Math.min(MAX_STREAM_MS, Math.max(0, Math.ceil(graceMs)));
|
|
616
|
+
await this.call(streamId, () => this.flow.streams.close(id, { end: end, grace, ...this.env }));
|
|
617
|
+
}
|
|
618
|
+
async delete(streamId) {
|
|
619
|
+
const id = await flowStreamId(streamId);
|
|
620
|
+
await this.flow.streams.delete(id, this.env);
|
|
621
|
+
}
|
|
622
|
+
async call(streamId, fn) {
|
|
623
|
+
try {
|
|
624
|
+
return await fn();
|
|
625
|
+
}
|
|
626
|
+
catch (err) {
|
|
627
|
+
throw mapStreamError(streamId, err);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
/** A Flow item as a run stream item: the event, read back from the kv when
|
|
631
|
+
* the stream holds its key. Null when that kv copy has expired. */
|
|
632
|
+
async decode(item) {
|
|
633
|
+
let event = item.item;
|
|
634
|
+
if (event && typeof event === 'object' && 'agentenkitRef' in event) {
|
|
635
|
+
const raw = await this.opts.kv.get(event.agentenkitRef);
|
|
636
|
+
if (raw === null)
|
|
637
|
+
return null;
|
|
638
|
+
event = JSON.parse(raw);
|
|
639
|
+
}
|
|
640
|
+
return { ...event, offset: item.offset };
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/** Flow's stream errors as the port's, by name: the adapter does not load
|
|
644
|
+
* `@clevix/flow` itself. */
|
|
645
|
+
function mapStreamError(streamId, err) {
|
|
646
|
+
const name = err?.name;
|
|
647
|
+
if (name === 'StreamGoneError')
|
|
648
|
+
return new StreamGoneError(streamId);
|
|
649
|
+
if (name === 'StreamClosedError')
|
|
650
|
+
return new StreamClosedError(streamId);
|
|
651
|
+
return err;
|
|
652
|
+
}
|
|
653
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/adapters/flow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { Storage } from './ports/storage.js';
|
|
2
2
|
export type { EventBus } from './ports/bus.js';
|
|
3
|
-
export { PRIORITY_LOW, QueueFullError, PayloadTooLargeError, DuplicateJobError, UnsupportedError, type EnqueueOptions, type Queue, type QueueStats, type QueuedJob, } from './ports/queue.js';
|
|
3
|
+
export { PRIORITY_LOW, QueueFullError, PayloadTooLargeError, DuplicateJobError, UnsupportedError, type EnqueueOptions, type Queue, type QueueStats, type QueuedJob, type QueueAdmin, type PurgeFilter, type DeadJob, } from './ports/queue.js';
|
|
4
4
|
export type { Kv } from './ports/kv.js';
|
|
5
5
|
export { StreamClosedError, StreamGoneError, type RunStreams, type StreamMeta, type StreamSnapshot, } from './ports/streams.js';
|
|
6
6
|
export * from './core/stream-events.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,UAAU,EACf,KAAK,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ports/queue.d.ts
CHANGED
|
@@ -95,4 +95,44 @@ export interface Queue {
|
|
|
95
95
|
/** Count what waits, runs and died. */
|
|
96
96
|
stats(): Promise<QueueStats>;
|
|
97
97
|
}
|
|
98
|
+
/** Picks waiting jobs for `QueueAdmin.purge`. Every set field narrows it; an
|
|
99
|
+
* empty filter is refused, so a typo cannot empty the queue. */
|
|
100
|
+
export interface PurgeFilter {
|
|
101
|
+
threadId?: string;
|
|
102
|
+
runId?: string;
|
|
103
|
+
/** A kind, or null for a fresh dispatch (which has no kind). */
|
|
104
|
+
kind?: RunJob['kind'] | null;
|
|
105
|
+
/** Keeps jobs enqueued more recently than this many ms ago. */
|
|
106
|
+
olderThanMs?: number;
|
|
107
|
+
/** Purges dead jobs too. Without it they are kept for their operator
|
|
108
|
+
* (`purgeDead` drops them by age). */
|
|
109
|
+
includeDead?: boolean;
|
|
110
|
+
}
|
|
111
|
+
/** A job the queue gave up on, kept with the reason. */
|
|
112
|
+
export interface DeadJob {
|
|
113
|
+
id: string;
|
|
114
|
+
job: RunJob;
|
|
115
|
+
attempts: number;
|
|
116
|
+
deadAt: Date;
|
|
117
|
+
lastError: string;
|
|
118
|
+
}
|
|
119
|
+
/** What an operator does to a queue, beside the `Queue` port: stop and start
|
|
120
|
+
* it, clear it, and look at and handle what died. A queue that has these
|
|
121
|
+
* implements it, so admin code works with any of them. */
|
|
122
|
+
export interface QueueAdmin {
|
|
123
|
+
/** Tell the queue to stop running jobs. Jobs enqueued meanwhile wait;
|
|
124
|
+
* `resume` lets them go. */
|
|
125
|
+
pause(): Promise<void>;
|
|
126
|
+
resume(): Promise<void>;
|
|
127
|
+
/** Drop waiting jobs that match, and say how many. Jobs that are running
|
|
128
|
+
* are left alone. */
|
|
129
|
+
purge(filter: PurgeFilter): Promise<number>;
|
|
130
|
+
/** Dead jobs, newest first. Default limit 100. */
|
|
131
|
+
listDead(limit?: number): Promise<DeadJob[]>;
|
|
132
|
+
/** Run a dead job again. False when there is no such dead job, or the
|
|
133
|
+
* queue would not take it back now. */
|
|
134
|
+
redrive(id: string): Promise<boolean>;
|
|
135
|
+
/** Drop dead jobs older than the given age. */
|
|
136
|
+
purgeDead(olderThanMs: number): Promise<number>;
|
|
137
|
+
}
|
|
98
138
|
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/ports/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C;uEACuE;AACvE,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC;;;gBAGgB;AAChB,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,SAAkB;CAItC;AAED,6DAA6D;AAC7D,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,SAA0B;CAI9C;AAED,4DAA4D;AAC5D,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAIxB;AAED;;eAEe;AACf,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,IAAI,EAAE,MAAM;CAIzB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;gBASY;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;kDAE8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;qEACiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd;mBACe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb;kDAC8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;+EAM+E;AAC/E,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D;;gCAE4B;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;sBACkB;IAClB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC/C,uCAAuC;IACvC,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/ports/queue.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentenkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Durable runtime for AI agent runs \u2014 a platform-owned loop, queue-dispatched execution that outlives the request, HITL suspension, nested runs, and context compaction. Bring your own storage, queue, bus and kv via four ports.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -89,7 +89,8 @@
|
|
|
89
89
|
"@upstash/qstash": ">=2.6.0",
|
|
90
90
|
"@upstash/redis": ">=1.31.0",
|
|
91
91
|
"redis": ">=4.7.0",
|
|
92
|
-
"pg": ">=8.0.0"
|
|
92
|
+
"pg": ">=8.0.0",
|
|
93
|
+
"@clevix/flow": ">=0.8.0"
|
|
93
94
|
},
|
|
94
95
|
"peerDependenciesMeta": {
|
|
95
96
|
"@prisma/client": {
|
|
@@ -106,12 +107,16 @@
|
|
|
106
107
|
},
|
|
107
108
|
"pg": {
|
|
108
109
|
"optional": true
|
|
110
|
+
},
|
|
111
|
+
"@clevix/flow": {
|
|
112
|
+
"optional": true
|
|
109
113
|
}
|
|
110
114
|
},
|
|
111
115
|
"devDependencies": {
|
|
116
|
+
"@ai-sdk/provider": "^4.0.0",
|
|
117
|
+
"@clevix/flow": "https://github.com/eadwinCode/flow-sdk/releases/download/v0.8.0/clevix-flow-0.8.0.tgz",
|
|
112
118
|
"@types/bun": "^1.2.0",
|
|
113
119
|
"@types/node": "^22.10.0",
|
|
114
|
-
"@ai-sdk/provider": "^4.0.0",
|
|
115
120
|
"@types/pg": "^8.23.1",
|
|
116
121
|
"ai": "^7.0.0",
|
|
117
122
|
"pg": "^8.13.0",
|