@cogitator-ai/workflows 0.8.0 → 0.10.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 +106 -9
- package/dist/builder.d.ts +2 -2
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js.map +1 -1
- package/dist/checkpoint-stores.d.ts.map +1 -1
- package/dist/checkpoint-stores.js +4 -5
- package/dist/checkpoint-stores.js.map +1 -1
- package/dist/executor.d.ts +8 -8
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +83 -8
- package/dist/executor.js.map +1 -1
- package/dist/human/approval-outcomes.d.ts +26 -0
- package/dist/human/approval-outcomes.d.ts.map +1 -0
- package/dist/human/approval-outcomes.js +61 -0
- package/dist/human/approval-outcomes.js.map +1 -0
- package/dist/human/approval-store.d.ts +12 -0
- package/dist/human/approval-store.d.ts.map +1 -1
- package/dist/human/approval-store.js +52 -9
- package/dist/human/approval-store.js.map +1 -1
- package/dist/human/durable-approval-stores.d.ts +118 -0
- package/dist/human/durable-approval-stores.d.ts.map +1 -0
- package/dist/human/durable-approval-stores.js +383 -0
- package/dist/human/durable-approval-stores.js.map +1 -0
- package/dist/human/human-node.d.ts +16 -8
- package/dist/human/human-node.d.ts.map +1 -1
- package/dist/human/human-node.js +48 -26
- package/dist/human/human-node.js.map +1 -1
- package/dist/human/index.d.ts +2 -1
- package/dist/human/index.d.ts.map +1 -1
- package/dist/human/index.js +1 -0
- package/dist/human/index.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/manager/durable-run-stores.d.ts +88 -0
- package/dist/manager/durable-run-stores.d.ts.map +1 -0
- package/dist/manager/durable-run-stores.js +492 -0
- package/dist/manager/durable-run-stores.js.map +1 -0
- package/dist/manager/run-store.d.ts +1 -0
- package/dist/manager/run-store.d.ts.map +1 -1
- package/dist/manager/run-store.js +21 -10
- package/dist/manager/run-store.js.map +1 -1
- package/dist/manager/workflow-manager.d.ts +59 -8
- package/dist/manager/workflow-manager.d.ts.map +1 -1
- package/dist/manager/workflow-manager.js +272 -192
- package/dist/manager/workflow-manager.js.map +1 -1
- package/dist/nodes/adapters.d.ts +3 -2
- package/dist/nodes/adapters.d.ts.map +1 -1
- package/dist/nodes/adapters.js +15 -3
- package/dist/nodes/adapters.js.map +1 -1
- package/dist/nodes/base.d.ts +4 -1
- package/dist/nodes/base.d.ts.map +1 -1
- package/dist/observability/exporters.js +1 -1
- package/dist/observability/exporters.js.map +1 -1
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +4 -0
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/tracer.d.ts +1 -0
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/observability/tracer.js +2 -1
- package/dist/observability/tracer.js.map +1 -1
- package/dist/postgres-schema.d.ts +18 -0
- package/dist/postgres-schema.d.ts.map +1 -0
- package/dist/postgres-schema.js +35 -0
- package/dist/postgres-schema.js.map +1 -0
- package/dist/saga/compensation.d.ts +8 -1
- package/dist/saga/compensation.d.ts.map +1 -1
- package/dist/saga/compensation.js +6 -3
- package/dist/saga/compensation.js.map +1 -1
- package/dist/saga/index.d.ts +1 -1
- package/dist/saga/index.d.ts.map +1 -1
- package/dist/saga/index.js.map +1 -1
- package/dist/subworkflows/parallel-subworkflows.d.ts +15 -11
- package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -1
- package/dist/subworkflows/parallel-subworkflows.js +21 -31
- package/dist/subworkflows/parallel-subworkflows.js.map +1 -1
- package/dist/timers/durable-timer-stores.d.ts +174 -0
- package/dist/timers/durable-timer-stores.d.ts.map +1 -0
- package/dist/timers/durable-timer-stores.js +501 -0
- package/dist/timers/durable-timer-stores.js.map +1 -0
- package/dist/timers/timer-manager.d.ts +28 -1
- package/dist/timers/timer-manager.d.ts.map +1 -1
- package/dist/timers/timer-manager.js +87 -3
- package/dist/timers/timer-manager.js.map +1 -1
- package/dist/timers/timer-node.d.ts +2 -0
- package/dist/timers/timer-node.d.ts.map +1 -1
- package/dist/timers/timer-node.js +6 -0
- package/dist/timers/timer-node.js.map +1 -1
- package/dist/triggers/cron-trigger.d.ts +6 -0
- package/dist/triggers/cron-trigger.d.ts.map +1 -1
- package/dist/triggers/cron-trigger.js +23 -2
- package/dist/triggers/cron-trigger.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable approval stores: Redis and Postgres.
|
|
3
|
+
*
|
|
4
|
+
* A human node often waits in one process (a worker) while the answer is
|
|
5
|
+
* submitted from another (a web server), so `onResponse` both reacts to
|
|
6
|
+
* responses submitted through the same store instance and polls the backend
|
|
7
|
+
* for responses written elsewhere.
|
|
8
|
+
*/
|
|
9
|
+
import { createIfMissing, fromJson, TABLE_NAME } from '../postgres-schema.js';
|
|
10
|
+
import { ApprovalAlreadyAnsweredError, submitOrExisting, withdrawnResponse, } from './approval-outcomes.js';
|
|
11
|
+
const DEFAULT_POLL_INTERVAL = 1000;
|
|
12
|
+
/**
|
|
13
|
+
* Approvals in Redis: requests and responses as JSON under their id, with
|
|
14
|
+
* sorted sets (scored by creation time) of pending request ids overall, per
|
|
15
|
+
* workflow and per assignee, so pending lookups never scan the keyspace.
|
|
16
|
+
*/
|
|
17
|
+
export class RedisApprovalStore {
|
|
18
|
+
client;
|
|
19
|
+
prefix;
|
|
20
|
+
watcher;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.client = options.client;
|
|
23
|
+
this.prefix = options.keyPrefix ?? 'cogitator:workflow-approvals';
|
|
24
|
+
this.watcher = new ResponseWatcher((requestId) => this.getResponse(requestId), options);
|
|
25
|
+
}
|
|
26
|
+
async createRequest(request) {
|
|
27
|
+
const [previous, answered] = await Promise.all([
|
|
28
|
+
this.getRequest(request.id),
|
|
29
|
+
this.client.get(this.responseKey(request.id)),
|
|
30
|
+
]);
|
|
31
|
+
await this.client.set(this.requestKey(request.id), JSON.stringify(request));
|
|
32
|
+
const indexes = answered === null ? this.pendingIndexes(request) : [];
|
|
33
|
+
if (previous) {
|
|
34
|
+
const outdated = this.pendingIndexes(previous).filter((key) => !indexes.includes(key));
|
|
35
|
+
await Promise.all(outdated.map((key) => this.client.zrem(key, request.id)));
|
|
36
|
+
}
|
|
37
|
+
await Promise.all(indexes.map((key) => this.client.zadd(key, request.createdAt, request.id)));
|
|
38
|
+
}
|
|
39
|
+
async getRequest(id) {
|
|
40
|
+
const raw = await this.client.get(this.requestKey(id));
|
|
41
|
+
return raw ? JSON.parse(raw) : null;
|
|
42
|
+
}
|
|
43
|
+
async getPendingRequests(workflowId) {
|
|
44
|
+
if (workflowId) {
|
|
45
|
+
return this.readPending(this.workflowIndexKey(workflowId), (request) => request.workflowId === workflowId);
|
|
46
|
+
}
|
|
47
|
+
return this.readPending(this.pendingKey(), () => true);
|
|
48
|
+
}
|
|
49
|
+
async getPendingForAssignee(assignee) {
|
|
50
|
+
return this.readPending(this.assigneeIndexKey(assignee), (request) => isAssignedTo(request, assignee));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Records the answer; the first answer wins (claimed by adding the request
|
|
54
|
+
* to the answered set), a later one throws `ApprovalAlreadyAnsweredError`.
|
|
55
|
+
*/
|
|
56
|
+
async submitResponse(response) {
|
|
57
|
+
const claimed = await this.client.zadd(this.answeredKey(), Date.now(), response.requestId);
|
|
58
|
+
if (Number(claimed) !== 1) {
|
|
59
|
+
const existing = await this.getResponse(response.requestId);
|
|
60
|
+
throw new ApprovalAlreadyAnsweredError(response.requestId, existing ?? undefined);
|
|
61
|
+
}
|
|
62
|
+
await this.client.set(this.responseKey(response.requestId), JSON.stringify(response));
|
|
63
|
+
const request = await this.getRequest(response.requestId);
|
|
64
|
+
if (request) {
|
|
65
|
+
await Promise.all(this.pendingIndexes(request).map((key) => this.client.zrem(key, request.id)));
|
|
66
|
+
}
|
|
67
|
+
this.watcher.deliver(response);
|
|
68
|
+
}
|
|
69
|
+
async getResponse(requestId) {
|
|
70
|
+
const raw = await this.client.get(this.responseKey(requestId));
|
|
71
|
+
return raw ? JSON.parse(raw) : null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Removes the request. A request nobody answered yet gets `withdrawnResponse`
|
|
75
|
+
* as its answer, which stays stored so waiters in other processes see it.
|
|
76
|
+
*/
|
|
77
|
+
async deleteRequest(id) {
|
|
78
|
+
const request = await this.getRequest(id);
|
|
79
|
+
const pending = request !== null && (await this.getResponse(id)) === null;
|
|
80
|
+
if (pending) {
|
|
81
|
+
await submitOrExisting(this, withdrawnResponse(id));
|
|
82
|
+
await this.client.del(this.requestKey(id));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.watcher.cancel(id);
|
|
86
|
+
await this.client.del(this.requestKey(id), this.responseKey(id));
|
|
87
|
+
await this.client.zrem(this.answeredKey(), id);
|
|
88
|
+
}
|
|
89
|
+
if (request) {
|
|
90
|
+
await Promise.all(this.pendingIndexes(request).map((key) => this.client.zrem(key, id)));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
onResponse(requestId, callback) {
|
|
94
|
+
return this.watcher.watch(requestId, callback);
|
|
95
|
+
}
|
|
96
|
+
/** Stop polling and drop every registered callback. */
|
|
97
|
+
dispose() {
|
|
98
|
+
this.watcher.dispose();
|
|
99
|
+
}
|
|
100
|
+
async readPending(indexKey, belongs) {
|
|
101
|
+
const ids = await this.client.zrange(indexKey, 0, -1);
|
|
102
|
+
if (ids.length === 0)
|
|
103
|
+
return [];
|
|
104
|
+
const [requests, responses] = await Promise.all([
|
|
105
|
+
this.client.mget(...ids.map((id) => this.requestKey(id))),
|
|
106
|
+
this.client.mget(...ids.map((id) => this.responseKey(id))),
|
|
107
|
+
]);
|
|
108
|
+
const pending = [];
|
|
109
|
+
const stale = [];
|
|
110
|
+
ids.forEach((id, index) => {
|
|
111
|
+
const raw = requests[index];
|
|
112
|
+
const request = raw ? JSON.parse(raw) : null;
|
|
113
|
+
if (request && responses[index] === null && belongs(request))
|
|
114
|
+
pending.push(request);
|
|
115
|
+
else
|
|
116
|
+
stale.push(id);
|
|
117
|
+
});
|
|
118
|
+
if (stale.length > 0)
|
|
119
|
+
await this.client.zrem(indexKey, ...stale);
|
|
120
|
+
return pending;
|
|
121
|
+
}
|
|
122
|
+
pendingIndexes(request) {
|
|
123
|
+
const assignees = new Set(request.assigneeGroup ?? []);
|
|
124
|
+
if (request.assignee !== undefined)
|
|
125
|
+
assignees.add(request.assignee);
|
|
126
|
+
return [
|
|
127
|
+
this.pendingKey(),
|
|
128
|
+
this.workflowIndexKey(request.workflowId),
|
|
129
|
+
...[...assignees].map((assignee) => this.assigneeIndexKey(assignee)),
|
|
130
|
+
];
|
|
131
|
+
}
|
|
132
|
+
requestKey(id) {
|
|
133
|
+
return `${this.prefix}:request:${id}`;
|
|
134
|
+
}
|
|
135
|
+
answeredKey() {
|
|
136
|
+
return `${this.prefix}:answered`;
|
|
137
|
+
}
|
|
138
|
+
responseKey(requestId) {
|
|
139
|
+
return `${this.prefix}:response:${requestId}`;
|
|
140
|
+
}
|
|
141
|
+
pendingKey() {
|
|
142
|
+
return `${this.prefix}:pending`;
|
|
143
|
+
}
|
|
144
|
+
workflowIndexKey(workflowId) {
|
|
145
|
+
return `${this.prefix}:pending:workflow:${workflowId}`;
|
|
146
|
+
}
|
|
147
|
+
assigneeIndexKey(assignee) {
|
|
148
|
+
return `${this.prefix}:pending:assignee:${assignee}`;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Approvals in Postgres: a requests table with the workflow and assignees
|
|
153
|
+
* as indexed columns next to the JSONB request, and a responses table keyed
|
|
154
|
+
* by request id; pending means no matching response row.
|
|
155
|
+
*/
|
|
156
|
+
export class PostgresApprovalStore {
|
|
157
|
+
client;
|
|
158
|
+
requests;
|
|
159
|
+
responses;
|
|
160
|
+
indexPrefix;
|
|
161
|
+
watcher;
|
|
162
|
+
ready;
|
|
163
|
+
constructor(options) {
|
|
164
|
+
const prefix = options.tablePrefix ?? 'cogitator_workflow_approvals';
|
|
165
|
+
if (!TABLE_NAME.test(prefix)) {
|
|
166
|
+
throw new Error(`Invalid approval table prefix: ${prefix}`);
|
|
167
|
+
}
|
|
168
|
+
this.client = options.client;
|
|
169
|
+
this.requests = `${prefix}_requests`;
|
|
170
|
+
this.responses = `${prefix}_responses`;
|
|
171
|
+
this.indexPrefix = prefix.replace('.', '_');
|
|
172
|
+
this.watcher = new ResponseWatcher((requestId) => this.getResponse(requestId), options);
|
|
173
|
+
}
|
|
174
|
+
async createRequest(request) {
|
|
175
|
+
await this.ensureTables();
|
|
176
|
+
await this.client.query(`INSERT INTO ${this.requests} (id, workflow_id, assignee, assignee_group, created_at, data)
|
|
177
|
+
VALUES ($1, $2, $3, $4, $5, $6)
|
|
178
|
+
ON CONFLICT (id) DO UPDATE
|
|
179
|
+
SET workflow_id = EXCLUDED.workflow_id, assignee = EXCLUDED.assignee,
|
|
180
|
+
assignee_group = EXCLUDED.assignee_group, created_at = EXCLUDED.created_at,
|
|
181
|
+
data = EXCLUDED.data`, [
|
|
182
|
+
request.id,
|
|
183
|
+
request.workflowId,
|
|
184
|
+
request.assignee ?? null,
|
|
185
|
+
request.assigneeGroup ?? [],
|
|
186
|
+
request.createdAt,
|
|
187
|
+
JSON.stringify(request),
|
|
188
|
+
]);
|
|
189
|
+
}
|
|
190
|
+
async getRequest(id) {
|
|
191
|
+
await this.ensureTables();
|
|
192
|
+
const { rows } = await this.client.query(`SELECT data FROM ${this.requests} WHERE id = $1`, [
|
|
193
|
+
id,
|
|
194
|
+
]);
|
|
195
|
+
return rows[0] ? fromJson(rows[0].data) : null;
|
|
196
|
+
}
|
|
197
|
+
async getPendingRequests(workflowId) {
|
|
198
|
+
await this.ensureTables();
|
|
199
|
+
const { rows } = workflowId
|
|
200
|
+
? await this.client.query(`SELECT r.data FROM ${this.requests} r
|
|
201
|
+
WHERE r.workflow_id = $1 AND ${this.unanswered()}
|
|
202
|
+
ORDER BY r.created_at, r.id`, [workflowId])
|
|
203
|
+
: await this.client.query(`SELECT r.data FROM ${this.requests} r
|
|
204
|
+
WHERE ${this.unanswered()}
|
|
205
|
+
ORDER BY r.created_at, r.id`);
|
|
206
|
+
return rows.map((row) => fromJson(row.data));
|
|
207
|
+
}
|
|
208
|
+
async getPendingForAssignee(assignee) {
|
|
209
|
+
await this.ensureTables();
|
|
210
|
+
const { rows } = await this.client.query(`SELECT r.data FROM ${this.requests} r
|
|
211
|
+
WHERE (r.assignee = $1 OR r.assignee_group @> ARRAY[$1]::text[]) AND ${this.unanswered()}
|
|
212
|
+
ORDER BY r.created_at, r.id`, [assignee]);
|
|
213
|
+
return rows.map((row) => fromJson(row.data));
|
|
214
|
+
}
|
|
215
|
+
/** Records the answer; the first answer wins, a later one throws `ApprovalAlreadyAnsweredError`. */
|
|
216
|
+
async submitResponse(response) {
|
|
217
|
+
await this.ensureTables();
|
|
218
|
+
const { rows } = await this.client.query(`INSERT INTO ${this.responses} (request_id, data)
|
|
219
|
+
VALUES ($1, $2)
|
|
220
|
+
ON CONFLICT (request_id) DO NOTHING
|
|
221
|
+
RETURNING request_id`, [response.requestId, JSON.stringify(response)]);
|
|
222
|
+
if (rows.length === 0) {
|
|
223
|
+
const existing = await this.getResponse(response.requestId);
|
|
224
|
+
throw new ApprovalAlreadyAnsweredError(response.requestId, existing ?? undefined);
|
|
225
|
+
}
|
|
226
|
+
this.watcher.deliver(response);
|
|
227
|
+
}
|
|
228
|
+
async getResponse(requestId) {
|
|
229
|
+
await this.ensureTables();
|
|
230
|
+
const { rows } = await this.client.query(`SELECT data FROM ${this.responses} WHERE request_id = $1`, [requestId]);
|
|
231
|
+
return rows[0] ? fromJson(rows[0].data) : null;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Removes the request. A request nobody answered yet gets `withdrawnResponse`
|
|
235
|
+
* as its answer, which stays stored so waiters in other processes see it.
|
|
236
|
+
*/
|
|
237
|
+
async deleteRequest(id) {
|
|
238
|
+
await this.ensureTables();
|
|
239
|
+
const pending = (await this.getRequest(id)) !== null && (await this.getResponse(id)) === null;
|
|
240
|
+
if (pending) {
|
|
241
|
+
await submitOrExisting(this, withdrawnResponse(id));
|
|
242
|
+
await this.client.query(`DELETE FROM ${this.requests} WHERE id = $1`, [id]);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.watcher.cancel(id);
|
|
246
|
+
await this.client.query(`WITH removed AS (DELETE FROM ${this.responses} WHERE request_id = $1)
|
|
247
|
+
DELETE FROM ${this.requests} WHERE id = $1`, [id]);
|
|
248
|
+
}
|
|
249
|
+
onResponse(requestId, callback) {
|
|
250
|
+
return this.watcher.watch(requestId, callback);
|
|
251
|
+
}
|
|
252
|
+
/** Stop polling and drop every registered callback. */
|
|
253
|
+
dispose() {
|
|
254
|
+
this.watcher.dispose();
|
|
255
|
+
}
|
|
256
|
+
unanswered() {
|
|
257
|
+
return `NOT EXISTS (SELECT 1 FROM ${this.responses} s WHERE s.request_id = r.id)`;
|
|
258
|
+
}
|
|
259
|
+
ensureTables() {
|
|
260
|
+
this.ready ??= this.createTables().catch((error) => {
|
|
261
|
+
this.ready = undefined;
|
|
262
|
+
throw error;
|
|
263
|
+
});
|
|
264
|
+
return this.ready;
|
|
265
|
+
}
|
|
266
|
+
async createTables() {
|
|
267
|
+
const statements = [
|
|
268
|
+
`CREATE TABLE IF NOT EXISTS ${this.requests} (
|
|
269
|
+
id TEXT PRIMARY KEY,
|
|
270
|
+
workflow_id TEXT NOT NULL,
|
|
271
|
+
assignee TEXT,
|
|
272
|
+
assignee_group TEXT[] NOT NULL DEFAULT '{}',
|
|
273
|
+
created_at BIGINT NOT NULL,
|
|
274
|
+
data JSONB NOT NULL
|
|
275
|
+
)`,
|
|
276
|
+
`CREATE TABLE IF NOT EXISTS ${this.responses} (
|
|
277
|
+
request_id TEXT PRIMARY KEY,
|
|
278
|
+
data JSONB NOT NULL
|
|
279
|
+
)`,
|
|
280
|
+
`CREATE INDEX IF NOT EXISTS ${this.indexPrefix}_requests_workflow_idx
|
|
281
|
+
ON ${this.requests} (workflow_id, created_at)`,
|
|
282
|
+
`CREATE INDEX IF NOT EXISTS ${this.indexPrefix}_requests_assignee_idx
|
|
283
|
+
ON ${this.requests} (assignee)`,
|
|
284
|
+
`CREATE INDEX IF NOT EXISTS ${this.indexPrefix}_requests_assignee_group_idx
|
|
285
|
+
ON ${this.requests} USING GIN (assignee_group)`,
|
|
286
|
+
];
|
|
287
|
+
for (const statement of statements)
|
|
288
|
+
await createIfMissing(this.client, statement);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Callbacks waiting for responses: delivered at once for responses submitted
|
|
293
|
+
* through the store, and found by polling for responses written elsewhere
|
|
294
|
+
* while at least one callback for the request is registered.
|
|
295
|
+
*/
|
|
296
|
+
class ResponseWatcher {
|
|
297
|
+
fetch;
|
|
298
|
+
watches = new Map();
|
|
299
|
+
pollInterval;
|
|
300
|
+
onPollError;
|
|
301
|
+
constructor(fetch, options) {
|
|
302
|
+
this.fetch = fetch;
|
|
303
|
+
this.pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;
|
|
304
|
+
this.onPollError = options.onPollError;
|
|
305
|
+
}
|
|
306
|
+
watch(requestId, callback) {
|
|
307
|
+
let watch = this.watches.get(requestId);
|
|
308
|
+
if (!watch) {
|
|
309
|
+
watch = { listeners: new Set() };
|
|
310
|
+
this.watches.set(requestId, watch);
|
|
311
|
+
this.schedule(requestId, watch);
|
|
312
|
+
}
|
|
313
|
+
const listener = { callback };
|
|
314
|
+
watch.listeners.add(listener);
|
|
315
|
+
void this.check(requestId, watch);
|
|
316
|
+
const subscribed = watch;
|
|
317
|
+
return () => {
|
|
318
|
+
subscribed.listeners.delete(listener);
|
|
319
|
+
if (subscribed.listeners.size === 0)
|
|
320
|
+
this.stop(requestId, subscribed);
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
deliver(response) {
|
|
324
|
+
const watch = this.watches.get(response.requestId);
|
|
325
|
+
if (!watch)
|
|
326
|
+
return;
|
|
327
|
+
this.stop(response.requestId, watch);
|
|
328
|
+
const listeners = [...watch.listeners];
|
|
329
|
+
watch.listeners.clear();
|
|
330
|
+
for (const { callback } of listeners) {
|
|
331
|
+
try {
|
|
332
|
+
callback(response);
|
|
333
|
+
}
|
|
334
|
+
catch { }
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
cancel(requestId) {
|
|
338
|
+
const watch = this.watches.get(requestId);
|
|
339
|
+
if (!watch)
|
|
340
|
+
return;
|
|
341
|
+
this.stop(requestId, watch);
|
|
342
|
+
watch.listeners.clear();
|
|
343
|
+
}
|
|
344
|
+
dispose() {
|
|
345
|
+
for (const requestId of [...this.watches.keys()])
|
|
346
|
+
this.cancel(requestId);
|
|
347
|
+
}
|
|
348
|
+
stop(requestId, watch) {
|
|
349
|
+
if (watch.timer !== undefined)
|
|
350
|
+
clearTimeout(watch.timer);
|
|
351
|
+
watch.timer = undefined;
|
|
352
|
+
if (this.watches.get(requestId) === watch)
|
|
353
|
+
this.watches.delete(requestId);
|
|
354
|
+
}
|
|
355
|
+
schedule(requestId, watch) {
|
|
356
|
+
const timer = setTimeout(() => void this.poll(requestId, watch), this.pollInterval);
|
|
357
|
+
if (typeof timer === 'object' && 'unref' in timer)
|
|
358
|
+
timer.unref();
|
|
359
|
+
watch.timer = timer;
|
|
360
|
+
}
|
|
361
|
+
async poll(requestId, watch) {
|
|
362
|
+
watch.timer = undefined;
|
|
363
|
+
await this.check(requestId, watch);
|
|
364
|
+
if (this.watches.get(requestId) === watch)
|
|
365
|
+
this.schedule(requestId, watch);
|
|
366
|
+
}
|
|
367
|
+
async check(requestId, watch) {
|
|
368
|
+
let response;
|
|
369
|
+
try {
|
|
370
|
+
response = await this.fetch(requestId);
|
|
371
|
+
}
|
|
372
|
+
catch (error) {
|
|
373
|
+
this.onPollError?.(error, requestId);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (response && this.watches.get(requestId) === watch)
|
|
377
|
+
this.deliver(response);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
function isAssignedTo(request, assignee) {
|
|
381
|
+
return request.assignee === assignee || (request.assigneeGroup?.includes(assignee) ?? false);
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=durable-approval-stores.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-approval-stores.js","sourceRoot":"","sources":["../../src/human/durable-approval-stores.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - Delegation support
|
|
10
10
|
* - Priority-based routing
|
|
11
11
|
*/
|
|
12
|
-
import type { WorkflowState, HumanNodeConfig, ApprovalResponse, ApprovalStore, ApprovalNotifier, ApprovalChoice, ApprovalChainStep } from '@cogitator-ai/types';
|
|
12
|
+
import type { WorkflowState, HumanNodeConfig, ApprovalRequest, ApprovalResponse, ApprovalStore, ApprovalNotifier, ApprovalChoice, ApprovalChainStep } from '@cogitator-ai/types';
|
|
13
13
|
/**
|
|
14
14
|
* Context for human node execution
|
|
15
15
|
*/
|
|
@@ -19,6 +19,8 @@ export interface HumanNodeContext {
|
|
|
19
19
|
nodeId: string;
|
|
20
20
|
approvalStore: ApprovalStore;
|
|
21
21
|
approvalNotifier?: ApprovalNotifier;
|
|
22
|
+
/** Called for every request created: the node's own, each chain step and escalations */
|
|
23
|
+
onApprovalRequired?: (request: ApprovalRequest) => void;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
24
26
|
* Result of human node execution
|
|
@@ -30,15 +32,21 @@ export interface HumanNodeResult<S extends WorkflowState> {
|
|
|
30
32
|
state: S;
|
|
31
33
|
timedOut?: boolean;
|
|
32
34
|
escalated?: boolean;
|
|
35
|
+
/** The request was deleted, or expired, before anyone answered */
|
|
36
|
+
withdrawn?: boolean;
|
|
33
37
|
}
|
|
34
38
|
/**
|
|
35
39
|
* Execute a human approval node
|
|
36
40
|
*/
|
|
37
41
|
export declare function executeHumanNode<S extends WorkflowState>(state: S, config: HumanNodeConfig<S>, context: HumanNodeContext): Promise<HumanNodeResult<S>>;
|
|
42
|
+
/** A human node config with its name set, as the node factories return it. */
|
|
43
|
+
export type NamedHumanNodeConfig<S extends WorkflowState> = HumanNodeConfig<S> & {
|
|
44
|
+
name: string;
|
|
45
|
+
};
|
|
38
46
|
/**
|
|
39
47
|
* Create a human approval node factory
|
|
40
48
|
*/
|
|
41
|
-
export declare function humanNode<S extends WorkflowState>(name: string, approval: HumanNodeConfig<S>['approval']):
|
|
49
|
+
export declare function humanNode<S extends WorkflowState>(name: string, approval: HumanNodeConfig<S>['approval']): NamedHumanNodeConfig<S>;
|
|
42
50
|
/**
|
|
43
51
|
* Create a simple approve/reject node
|
|
44
52
|
*/
|
|
@@ -49,7 +57,7 @@ export declare function approvalNode<S extends WorkflowState>(name: string, opti
|
|
|
49
57
|
timeout?: number;
|
|
50
58
|
timeoutAction?: 'approve' | 'reject' | 'fail';
|
|
51
59
|
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
52
|
-
}):
|
|
60
|
+
}): NamedHumanNodeConfig<S>;
|
|
53
61
|
/**
|
|
54
62
|
* Create a multi-choice selection node
|
|
55
63
|
*/
|
|
@@ -60,7 +68,7 @@ export declare function choiceNode<S extends WorkflowState>(name: string, option
|
|
|
60
68
|
assignee?: string | ((state: S) => string);
|
|
61
69
|
timeout?: number;
|
|
62
70
|
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
63
|
-
}):
|
|
71
|
+
}): NamedHumanNodeConfig<S>;
|
|
64
72
|
/**
|
|
65
73
|
* Create a free-form input node
|
|
66
74
|
*/
|
|
@@ -70,7 +78,7 @@ export declare function inputNode<S extends WorkflowState>(name: string, options
|
|
|
70
78
|
assignee?: string | ((state: S) => string);
|
|
71
79
|
timeout?: number;
|
|
72
80
|
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
73
|
-
}):
|
|
81
|
+
}): NamedHumanNodeConfig<S>;
|
|
74
82
|
/**
|
|
75
83
|
* Create a rating node
|
|
76
84
|
*/
|
|
@@ -80,7 +88,7 @@ export declare function ratingNode<S extends WorkflowState>(name: string, option
|
|
|
80
88
|
assignee?: string | ((state: S) => string);
|
|
81
89
|
timeout?: number;
|
|
82
90
|
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
83
|
-
}):
|
|
91
|
+
}): NamedHumanNodeConfig<S>;
|
|
84
92
|
/**
|
|
85
93
|
* Create an approval chain node
|
|
86
94
|
*/
|
|
@@ -89,7 +97,7 @@ export declare function chainNode<S extends WorkflowState>(name: string, options
|
|
|
89
97
|
description?: string | ((state: S) => string);
|
|
90
98
|
chain: ApprovalChainStep[];
|
|
91
99
|
priority?: 'low' | 'normal' | 'high' | 'urgent';
|
|
92
|
-
}):
|
|
100
|
+
}): NamedHumanNodeConfig<S>;
|
|
93
101
|
/**
|
|
94
102
|
* Create a manager → director → VP chain
|
|
95
103
|
*/
|
|
@@ -100,5 +108,5 @@ export declare function managementChain<S extends WorkflowState>(name: string, o
|
|
|
100
108
|
director?: string;
|
|
101
109
|
vp?: string;
|
|
102
110
|
timeoutPerStep?: number;
|
|
103
|
-
}):
|
|
111
|
+
}): NamedHumanNodeConfig<S>;
|
|
104
112
|
//# sourceMappingURL=human-node.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"human-node.d.ts","sourceRoot":"","sources":["../../src/human/human-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"human-node.d.ts","sourceRoot":"","sources":["../../src/human/human-node.ts"],"names":[],"mappings":"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"}
|