@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.
Files changed (95) hide show
  1. package/README.md +106 -9
  2. package/dist/builder.d.ts +2 -2
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js.map +1 -1
  5. package/dist/checkpoint-stores.d.ts.map +1 -1
  6. package/dist/checkpoint-stores.js +4 -5
  7. package/dist/checkpoint-stores.js.map +1 -1
  8. package/dist/executor.d.ts +8 -8
  9. package/dist/executor.d.ts.map +1 -1
  10. package/dist/executor.js +83 -8
  11. package/dist/executor.js.map +1 -1
  12. package/dist/human/approval-outcomes.d.ts +26 -0
  13. package/dist/human/approval-outcomes.d.ts.map +1 -0
  14. package/dist/human/approval-outcomes.js +61 -0
  15. package/dist/human/approval-outcomes.js.map +1 -0
  16. package/dist/human/approval-store.d.ts +12 -0
  17. package/dist/human/approval-store.d.ts.map +1 -1
  18. package/dist/human/approval-store.js +52 -9
  19. package/dist/human/approval-store.js.map +1 -1
  20. package/dist/human/durable-approval-stores.d.ts +118 -0
  21. package/dist/human/durable-approval-stores.d.ts.map +1 -0
  22. package/dist/human/durable-approval-stores.js +383 -0
  23. package/dist/human/durable-approval-stores.js.map +1 -0
  24. package/dist/human/human-node.d.ts +16 -8
  25. package/dist/human/human-node.d.ts.map +1 -1
  26. package/dist/human/human-node.js +48 -26
  27. package/dist/human/human-node.js.map +1 -1
  28. package/dist/human/index.d.ts +2 -1
  29. package/dist/human/index.d.ts.map +1 -1
  30. package/dist/human/index.js +1 -0
  31. package/dist/human/index.js.map +1 -1
  32. package/dist/index.d.ts +7 -3
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/manager/durable-run-stores.d.ts +88 -0
  37. package/dist/manager/durable-run-stores.d.ts.map +1 -0
  38. package/dist/manager/durable-run-stores.js +492 -0
  39. package/dist/manager/durable-run-stores.js.map +1 -0
  40. package/dist/manager/run-store.d.ts +1 -0
  41. package/dist/manager/run-store.d.ts.map +1 -1
  42. package/dist/manager/run-store.js +21 -10
  43. package/dist/manager/run-store.js.map +1 -1
  44. package/dist/manager/workflow-manager.d.ts +59 -8
  45. package/dist/manager/workflow-manager.d.ts.map +1 -1
  46. package/dist/manager/workflow-manager.js +272 -192
  47. package/dist/manager/workflow-manager.js.map +1 -1
  48. package/dist/nodes/adapters.d.ts +3 -2
  49. package/dist/nodes/adapters.d.ts.map +1 -1
  50. package/dist/nodes/adapters.js +15 -3
  51. package/dist/nodes/adapters.js.map +1 -1
  52. package/dist/nodes/base.d.ts +4 -1
  53. package/dist/nodes/base.d.ts.map +1 -1
  54. package/dist/observability/exporters.js +1 -1
  55. package/dist/observability/exporters.js.map +1 -1
  56. package/dist/observability/metrics.d.ts +2 -0
  57. package/dist/observability/metrics.d.ts.map +1 -1
  58. package/dist/observability/metrics.js +4 -0
  59. package/dist/observability/metrics.js.map +1 -1
  60. package/dist/observability/tracer.d.ts +1 -0
  61. package/dist/observability/tracer.d.ts.map +1 -1
  62. package/dist/observability/tracer.js +2 -1
  63. package/dist/observability/tracer.js.map +1 -1
  64. package/dist/postgres-schema.d.ts +18 -0
  65. package/dist/postgres-schema.d.ts.map +1 -0
  66. package/dist/postgres-schema.js +35 -0
  67. package/dist/postgres-schema.js.map +1 -0
  68. package/dist/saga/compensation.d.ts +8 -1
  69. package/dist/saga/compensation.d.ts.map +1 -1
  70. package/dist/saga/compensation.js +6 -3
  71. package/dist/saga/compensation.js.map +1 -1
  72. package/dist/saga/index.d.ts +1 -1
  73. package/dist/saga/index.d.ts.map +1 -1
  74. package/dist/saga/index.js.map +1 -1
  75. package/dist/subworkflows/parallel-subworkflows.d.ts +15 -11
  76. package/dist/subworkflows/parallel-subworkflows.d.ts.map +1 -1
  77. package/dist/subworkflows/parallel-subworkflows.js +21 -31
  78. package/dist/subworkflows/parallel-subworkflows.js.map +1 -1
  79. package/dist/timers/durable-timer-stores.d.ts +174 -0
  80. package/dist/timers/durable-timer-stores.d.ts.map +1 -0
  81. package/dist/timers/durable-timer-stores.js +501 -0
  82. package/dist/timers/durable-timer-stores.js.map +1 -0
  83. package/dist/timers/timer-manager.d.ts +28 -1
  84. package/dist/timers/timer-manager.d.ts.map +1 -1
  85. package/dist/timers/timer-manager.js +87 -3
  86. package/dist/timers/timer-manager.js.map +1 -1
  87. package/dist/timers/timer-node.d.ts +2 -0
  88. package/dist/timers/timer-node.d.ts.map +1 -1
  89. package/dist/timers/timer-node.js +6 -0
  90. package/dist/timers/timer-node.js.map +1 -1
  91. package/dist/triggers/cron-trigger.d.ts +6 -0
  92. package/dist/triggers/cron-trigger.d.ts.map +1 -1
  93. package/dist/triggers/cron-trigger.js +23 -2
  94. package/dist/triggers/cron-trigger.js.map +1 -1
  95. package/package.json +4 -4
@@ -0,0 +1,492 @@
1
+ /**
2
+ * Durable workflow run stores: Redis and Postgres.
3
+ */
4
+ import { createIfMissing, fromJson, TABLE_NAME } from '../postgres-schema.js';
5
+ const RUN_STATUSES = [
6
+ 'pending',
7
+ 'scheduled',
8
+ 'running',
9
+ 'paused',
10
+ 'waiting',
11
+ 'completed',
12
+ 'failed',
13
+ 'cancelled',
14
+ 'timeout',
15
+ ];
16
+ const TERMINAL_STATUSES = [
17
+ 'completed',
18
+ 'failed',
19
+ 'cancelled',
20
+ 'timeout',
21
+ ];
22
+ /**
23
+ * Workflow runs in Redis: each as JSON under its id, with sorted sets indexing
24
+ * them by workflow, status, tag, trigger and parent run, and by start and
25
+ * completion time, so listing never scans the keyspace. Runs read through an
26
+ * index are checked against the filters again, so a stale entry left by a
27
+ * concurrent write never leaks into results. Ties in the sort order are broken
28
+ * by run id.
29
+ */
30
+ export class RedisRunStore {
31
+ client;
32
+ prefix;
33
+ constructor(options) {
34
+ this.client = options.client;
35
+ this.prefix = options.keyPrefix ?? 'cogitator:workflow-runs';
36
+ }
37
+ async save(run) {
38
+ await this.write(run, await this.get(run.id));
39
+ }
40
+ async get(id) {
41
+ const raw = await this.client.get(this.runKey(id));
42
+ return raw ? JSON.parse(raw) : null;
43
+ }
44
+ async list(filters = {}) {
45
+ const runs = await this.find(filters);
46
+ return paginate(runs.sort(runComparator(filters)), pageOf(filters));
47
+ }
48
+ async count(filters = {}) {
49
+ return (await this.find(filters)).length;
50
+ }
51
+ async update(id, updates) {
52
+ const run = await this.get(id);
53
+ if (run)
54
+ await this.write({ ...run, ...updates, id }, run);
55
+ }
56
+ async delete(id) {
57
+ const run = await this.get(id);
58
+ await this.client.del(this.runKey(id));
59
+ const keys = run ? this.indexEntries(run).map(([key]) => key) : [this.allKey()];
60
+ await Promise.all(keys.map((key) => this.client.zrem(key, id)));
61
+ }
62
+ async getStats(workflowName) {
63
+ const key = workflowName ? this.indexKey('workflow', workflowName) : this.allKey();
64
+ const runs = await this.load(await this.client.zrange(key, 0, -1), [key]);
65
+ return summarizeStats(aggregateByStatus(runs.filter((run) => !workflowName || run.workflowName === workflowName)));
66
+ }
67
+ async cleanup(olderThan) {
68
+ const threshold = Date.now() - olderThan;
69
+ const keys = TERMINAL_STATUSES.map((status) => this.indexKey('status', status));
70
+ const ids = await this.union(keys);
71
+ const expired = (await this.load(ids, keys)).filter((run) => isTerminal(run.status) && cleanupTimestamp(run) < threshold);
72
+ for (const run of expired) {
73
+ await this.client.del(this.runKey(run.id));
74
+ await Promise.all(this.indexEntries(run).map(([key]) => this.client.zrem(key, run.id)));
75
+ }
76
+ return expired.length;
77
+ }
78
+ async write(run, previous) {
79
+ await this.client.set(this.runKey(run.id), JSON.stringify(run));
80
+ const entries = this.indexEntries(run);
81
+ await Promise.all(entries.map(([key, score]) => this.client.zadd(key, score, run.id)));
82
+ if (!previous)
83
+ return;
84
+ const current = new Set(entries.map(([key]) => key));
85
+ const stale = this.indexEntries(previous)
86
+ .map(([key]) => key)
87
+ .filter((key) => !current.has(key));
88
+ await Promise.all(stale.map((key) => this.client.zrem(key, run.id)));
89
+ }
90
+ async find(filters) {
91
+ const { ids, keys } = await this.candidates(filters);
92
+ const runs = await this.load(ids, keys);
93
+ return runs.filter((run) => matchesFilters(run, filters));
94
+ }
95
+ async candidates(filters) {
96
+ const keys = [];
97
+ const lookups = [];
98
+ const unionOf = (indexKeys) => {
99
+ keys.push(...indexKeys);
100
+ lookups.push(this.union(indexKeys));
101
+ };
102
+ const statuses = statusList(filters.status);
103
+ if (statuses)
104
+ unionOf(statuses.map((status) => this.indexKey('status', status)));
105
+ if (filters.workflowName)
106
+ unionOf([this.indexKey('workflow', filters.workflowName)]);
107
+ if (filters.tags && filters.tags.length > 0) {
108
+ unionOf(filters.tags.map((tag) => this.indexKey('tag', tag)));
109
+ }
110
+ if (filters.triggerId)
111
+ unionOf([this.indexKey('trigger', filters.triggerId)]);
112
+ if (filters.parentRunId)
113
+ unionOf([this.indexKey('parent', filters.parentRunId)]);
114
+ if (filters.startedAfter || filters.startedBefore) {
115
+ keys.push(this.timeKey('started'));
116
+ lookups.push(this.client.zrangebyscore(this.timeKey('started'), filters.startedAfter || '-inf', filters.startedBefore || '+inf'));
117
+ }
118
+ if (filters.completedAfter || filters.completedBefore) {
119
+ keys.push(this.timeKey('completed'));
120
+ lookups.push(this.client.zrangebyscore(this.timeKey('completed'), filters.completedAfter || '-inf', filters.completedBefore || '+inf'));
121
+ }
122
+ if (lookups.length === 0) {
123
+ return { ids: await this.client.zrange(this.allKey(), 0, -1), keys: [this.allKey()] };
124
+ }
125
+ const [smallest, ...others] = (await Promise.all(lookups)).sort((a, b) => a.length - b.length);
126
+ const ids = others.reduce((acc, other) => {
127
+ const members = new Set(other);
128
+ return acc.filter((id) => members.has(id));
129
+ }, smallest);
130
+ return { ids, keys };
131
+ }
132
+ async union(keys) {
133
+ const members = await Promise.all(keys.map((key) => this.client.zrange(key, 0, -1)));
134
+ return [...new Set(members.flat())];
135
+ }
136
+ async load(ids, indexKeys) {
137
+ const raws = await Promise.all(ids.map((id) => this.client.get(this.runKey(id))));
138
+ const runs = [];
139
+ const missing = [];
140
+ raws.forEach((raw, i) => {
141
+ if (raw)
142
+ runs.push(JSON.parse(raw));
143
+ else
144
+ missing.push(ids[i]);
145
+ });
146
+ if (missing.length > 0) {
147
+ const keys = new Set([this.allKey(), ...indexKeys]);
148
+ await Promise.all([...keys].map((key) => this.client.zrem(key, ...missing)));
149
+ }
150
+ return runs;
151
+ }
152
+ indexEntries(run) {
153
+ const entries = [
154
+ [this.allKey(), 0],
155
+ [this.indexKey('workflow', run.workflowName), 0],
156
+ [this.indexKey('status', run.status), 0],
157
+ ];
158
+ for (const tag of new Set(run.tags))
159
+ entries.push([this.indexKey('tag', tag), 0]);
160
+ if (run.triggerId)
161
+ entries.push([this.indexKey('trigger', run.triggerId), 0]);
162
+ if (run.parentRunId)
163
+ entries.push([this.indexKey('parent', run.parentRunId), 0]);
164
+ if (run.startedAt)
165
+ entries.push([this.timeKey('started'), run.startedAt]);
166
+ if (run.completedAt)
167
+ entries.push([this.timeKey('completed'), run.completedAt]);
168
+ return entries;
169
+ }
170
+ runKey(id) {
171
+ return `${this.prefix}:run:${id}`;
172
+ }
173
+ allKey() {
174
+ return `${this.prefix}:index:all`;
175
+ }
176
+ indexKey(field, value) {
177
+ return `${this.prefix}:index:${field}:${value}`;
178
+ }
179
+ timeKey(field) {
180
+ return `${this.prefix}:index:${field}-at`;
181
+ }
182
+ }
183
+ const STORED_COLUMNS = 'workflow_name, status, started_at, completed_at, priority, tags, trigger_id, parent_run_id, has_error, data';
184
+ const ORDER_EXPRESSIONS = {
185
+ startedAt: 'COALESCE(started_at, 0)',
186
+ completedAt: 'COALESCE(completed_at, 0)',
187
+ priority: 'COALESCE(priority, 0)',
188
+ };
189
+ /** The stored columns, derived in SQL from the run document `doc`. */
190
+ function derivedColumns(doc) {
191
+ return [
192
+ `${doc}->>'workflowName'`,
193
+ `${doc}->>'status'`,
194
+ `(${doc}->>'startedAt')::double precision`,
195
+ `(${doc}->>'completedAt')::double precision`,
196
+ `(${doc}->>'priority')::double precision`,
197
+ `ARRAY(SELECT jsonb_array_elements_text(${doc}->'tags'))`,
198
+ `${doc}->>'triggerId'`,
199
+ `${doc}->>'parentRunId'`,
200
+ `COALESCE(${doc}->'error' NOT IN ('null', 'false', '0', '""'), false)`,
201
+ doc,
202
+ ].join(', ');
203
+ }
204
+ /**
205
+ * Workflow runs in a Postgres table: the run as JSONB next to indexed columns
206
+ * for every filterable field, kept in step with the document by SQL. Filters,
207
+ * sorting, pagination, counts and statistics run in the database, and updates
208
+ * merge into the stored document in a single statement. Ties in the sort order
209
+ * are broken by run id.
210
+ */
211
+ export class PostgresRunStore {
212
+ client;
213
+ table;
214
+ ready;
215
+ constructor(options) {
216
+ const table = options.table ?? 'cogitator_workflow_runs';
217
+ if (!TABLE_NAME.test(table)) {
218
+ throw new Error(`Invalid run table name: ${table}`);
219
+ }
220
+ this.client = options.client;
221
+ this.table = table;
222
+ }
223
+ async save(run) {
224
+ await this.ensureTable();
225
+ await this.client.query(`INSERT INTO ${this.table} (id, ${STORED_COLUMNS})
226
+ SELECT $1::text, ${derivedColumns('doc')} FROM (SELECT $2::jsonb AS doc) AS run
227
+ ON CONFLICT (id) DO UPDATE SET (${STORED_COLUMNS}) = (
228
+ EXCLUDED.workflow_name, EXCLUDED.status, EXCLUDED.started_at, EXCLUDED.completed_at,
229
+ EXCLUDED.priority, EXCLUDED.tags, EXCLUDED.trigger_id, EXCLUDED.parent_run_id,
230
+ EXCLUDED.has_error, EXCLUDED.data
231
+ )`, [run.id, JSON.stringify(run)]);
232
+ }
233
+ async get(id) {
234
+ await this.ensureTable();
235
+ const { rows } = await this.client.query(`SELECT data FROM ${this.table} WHERE id = $1`, [id]);
236
+ return rows[0] ? toRun(rows[0].data) : null;
237
+ }
238
+ async list(filters = {}) {
239
+ await this.ensureTable();
240
+ const { where, values } = whereClause(filters);
241
+ const direction = filters.orderDirection === 'asc' ? 'ASC' : 'DESC';
242
+ const order = ORDER_EXPRESSIONS[filters.orderBy ?? 'startedAt'];
243
+ const page = pageOf(filters);
244
+ let sql = `SELECT data FROM ${this.table}${where} ORDER BY ${order} ${direction}, id ${direction}`;
245
+ if (page.limit !== undefined) {
246
+ values.push(page.limit);
247
+ sql += ` LIMIT $${values.length}`;
248
+ }
249
+ if (page.offset > 0) {
250
+ values.push(page.offset);
251
+ sql += ` OFFSET $${values.length}`;
252
+ }
253
+ const { rows } = await this.client.query(sql, values);
254
+ return rows.map((row) => toRun(row.data));
255
+ }
256
+ async count(filters = {}) {
257
+ await this.ensureTable();
258
+ const { where, values } = whereClause(filters);
259
+ const { rows } = await this.client.query(`SELECT COUNT(*)::int AS count FROM ${this.table}${where}`, values);
260
+ return Number(rows[0]?.count ?? 0);
261
+ }
262
+ async update(id, updates) {
263
+ await this.ensureTable();
264
+ const patch = {};
265
+ const removed = [];
266
+ for (const [key, value] of Object.entries(updates)) {
267
+ if (key === 'id')
268
+ continue;
269
+ if (value === undefined)
270
+ removed.push(key);
271
+ else
272
+ patch[key] = value;
273
+ }
274
+ await this.client.query(`UPDATE ${this.table} SET (${STORED_COLUMNS}) = (
275
+ SELECT ${derivedColumns('doc')} FROM (SELECT (data || $2::jsonb) - $3::text[] AS doc) AS run
276
+ )
277
+ WHERE id = $1`, [id, JSON.stringify(patch), removed]);
278
+ }
279
+ async delete(id) {
280
+ await this.ensureTable();
281
+ await this.client.query(`DELETE FROM ${this.table} WHERE id = $1`, [id]);
282
+ }
283
+ async getStats(workflowName) {
284
+ await this.ensureTable();
285
+ const timed = 'started_at <> 0 AND completed_at <> 0';
286
+ const { rows } = await this.client.query(`SELECT status,
287
+ COUNT(*)::int AS runs,
288
+ COALESCE(SUM(completed_at - started_at) FILTER (WHERE ${timed}), 0) AS duration_total,
289
+ (COUNT(*) FILTER (WHERE ${timed}))::int AS duration_count
290
+ FROM ${this.table}${workflowName ? ' WHERE workflow_name = $1' : ''}
291
+ GROUP BY status`, workflowName ? [workflowName] : []);
292
+ return summarizeStats(rows.map((row) => ({
293
+ status: String(row.status),
294
+ runs: Number(row.runs),
295
+ durationTotal: Number(row.duration_total),
296
+ durationCount: Number(row.duration_count),
297
+ })));
298
+ }
299
+ async cleanup(olderThan) {
300
+ await this.ensureTable();
301
+ const { rows } = await this.client.query(`WITH removed AS (
302
+ DELETE FROM ${this.table}
303
+ WHERE status = ANY($1::text[]) AND COALESCE(completed_at, started_at, 0) < $2
304
+ RETURNING 1
305
+ )
306
+ SELECT COUNT(*)::int AS count FROM removed`, [[...TERMINAL_STATUSES], Date.now() - olderThan]);
307
+ return Number(rows[0]?.count ?? 0);
308
+ }
309
+ ensureTable() {
310
+ this.ready ??= this.createTable().catch((error) => {
311
+ this.ready = undefined;
312
+ throw error;
313
+ });
314
+ return this.ready;
315
+ }
316
+ async createTable() {
317
+ const base = this.table.replace('.', '_');
318
+ await createIfMissing(this.client, `CREATE TABLE IF NOT EXISTS ${this.table} (
319
+ id TEXT PRIMARY KEY,
320
+ workflow_name TEXT NOT NULL,
321
+ status TEXT NOT NULL,
322
+ started_at DOUBLE PRECISION,
323
+ completed_at DOUBLE PRECISION,
324
+ priority DOUBLE PRECISION,
325
+ tags TEXT[] NOT NULL,
326
+ trigger_id TEXT,
327
+ parent_run_id TEXT,
328
+ has_error BOOLEAN NOT NULL,
329
+ data JSONB NOT NULL
330
+ )`);
331
+ const indexes = [
332
+ `${base}_workflow_idx ON ${this.table} (workflow_name, (COALESCE(started_at, 0)), id)`,
333
+ `${base}_started_idx ON ${this.table} ((COALESCE(started_at, 0)), id)`,
334
+ `${base}_status_idx ON ${this.table} (status)`,
335
+ `${base}_completed_idx ON ${this.table} (completed_at)`,
336
+ `${base}_tags_idx ON ${this.table} USING GIN (tags)`,
337
+ `${base}_trigger_idx ON ${this.table} (trigger_id) WHERE trigger_id IS NOT NULL`,
338
+ `${base}_parent_idx ON ${this.table} (parent_run_id) WHERE parent_run_id IS NOT NULL`,
339
+ ];
340
+ for (const index of indexes) {
341
+ await createIfMissing(this.client, `CREATE INDEX IF NOT EXISTS ${index}`);
342
+ }
343
+ }
344
+ }
345
+ /** The WHERE clause for `filters`, with every value passed as a parameter. */
346
+ function whereClause(filters) {
347
+ const values = [];
348
+ const conditions = [];
349
+ const param = (value) => {
350
+ values.push(value);
351
+ return `$${values.length}`;
352
+ };
353
+ const range = (column, after, before) => {
354
+ if (!after && !before)
355
+ return;
356
+ conditions.push(`${column} <> 0`);
357
+ if (after)
358
+ conditions.push(`${column} >= ${param(after)}`);
359
+ if (before)
360
+ conditions.push(`${column} <= ${param(before)}`);
361
+ };
362
+ const statuses = statusList(filters.status);
363
+ if (statuses)
364
+ conditions.push(`status = ANY(${param(statuses)}::text[])`);
365
+ if (filters.workflowName)
366
+ conditions.push(`workflow_name = ${param(filters.workflowName)}`);
367
+ if (filters.tags && filters.tags.length > 0) {
368
+ conditions.push(`tags && ${param(filters.tags)}::text[]`);
369
+ }
370
+ if (filters.triggerId)
371
+ conditions.push(`trigger_id = ${param(filters.triggerId)}`);
372
+ if (filters.parentRunId)
373
+ conditions.push(`parent_run_id = ${param(filters.parentRunId)}`);
374
+ range('started_at', filters.startedAfter, filters.startedBefore);
375
+ range('completed_at', filters.completedAfter, filters.completedBefore);
376
+ if (filters.hasError !== undefined)
377
+ conditions.push(`has_error = ${param(filters.hasError)}`);
378
+ return { where: conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '', values };
379
+ }
380
+ function toRun(data) {
381
+ return fromJson(data);
382
+ }
383
+ function statusList(status) {
384
+ if (!status)
385
+ return undefined;
386
+ return Array.isArray(status) ? status : [status];
387
+ }
388
+ function matchesFilters(run, filters) {
389
+ const statuses = statusList(filters.status);
390
+ if (statuses && !statuses.includes(run.status))
391
+ return false;
392
+ if (filters.workflowName && run.workflowName !== filters.workflowName)
393
+ return false;
394
+ if (filters.tags && filters.tags.length > 0 && !filters.tags.some((t) => run.tags.includes(t))) {
395
+ return false;
396
+ }
397
+ if (filters.triggerId && run.triggerId !== filters.triggerId)
398
+ return false;
399
+ if (filters.parentRunId && run.parentRunId !== filters.parentRunId)
400
+ return false;
401
+ if (!withinRange(run.startedAt, filters.startedAfter, filters.startedBefore))
402
+ return false;
403
+ if (!withinRange(run.completedAt, filters.completedAfter, filters.completedBefore))
404
+ return false;
405
+ return filters.hasError === undefined || Boolean(run.error) === filters.hasError;
406
+ }
407
+ function withinRange(value, after, before) {
408
+ if (!after && !before)
409
+ return true;
410
+ if (!value)
411
+ return false;
412
+ return (!after || value >= after) && (!before || value <= before);
413
+ }
414
+ function runComparator(filters) {
415
+ const field = filters.orderBy ?? 'startedAt';
416
+ const sign = filters.orderDirection === 'asc' ? 1 : -1;
417
+ return (a, b) => {
418
+ const byField = (a[field] ?? 0) - (b[field] ?? 0);
419
+ if (byField !== 0)
420
+ return sign * byField;
421
+ return a.id === b.id ? 0 : sign * (a.id < b.id ? -1 : 1);
422
+ };
423
+ }
424
+ /** Offset and limit as non-negative integers; a missing or infinite limit means all. */
425
+ function pageOf(filters) {
426
+ const bound = (value) => value === undefined || !Number.isFinite(value) ? undefined : Math.max(0, Math.trunc(value));
427
+ return { offset: bound(filters.offset) ?? 0, limit: bound(filters.limit) };
428
+ }
429
+ function paginate(items, page) {
430
+ return items.slice(page.offset, page.limit === undefined ? undefined : page.offset + page.limit);
431
+ }
432
+ function isTerminal(status) {
433
+ return TERMINAL_STATUSES.includes(status);
434
+ }
435
+ function cleanupTimestamp(run) {
436
+ return run.completedAt ?? run.startedAt ?? 0;
437
+ }
438
+ function isRunStatus(status) {
439
+ return RUN_STATUSES.includes(status);
440
+ }
441
+ function aggregateByStatus(runs) {
442
+ const byStatus = new Map();
443
+ for (const run of runs) {
444
+ const aggregate = byStatus.get(run.status) ?? {
445
+ status: run.status,
446
+ runs: 0,
447
+ durationTotal: 0,
448
+ durationCount: 0,
449
+ };
450
+ aggregate.runs++;
451
+ if (run.startedAt && run.completedAt) {
452
+ aggregate.durationTotal += run.completedAt - run.startedAt;
453
+ aggregate.durationCount++;
454
+ }
455
+ byStatus.set(run.status, aggregate);
456
+ }
457
+ return [...byStatus.values()];
458
+ }
459
+ function summarizeStats(aggregates) {
460
+ const byStatus = {
461
+ pending: 0,
462
+ scheduled: 0,
463
+ running: 0,
464
+ paused: 0,
465
+ waiting: 0,
466
+ completed: 0,
467
+ failed: 0,
468
+ cancelled: 0,
469
+ timeout: 0,
470
+ };
471
+ let total = 0;
472
+ let durationTotal = 0;
473
+ let durationCount = 0;
474
+ for (const aggregate of aggregates) {
475
+ total += aggregate.runs;
476
+ durationTotal += aggregate.durationTotal;
477
+ durationCount += aggregate.durationCount;
478
+ if (isRunStatus(aggregate.status))
479
+ byStatus[aggregate.status] += aggregate.runs;
480
+ }
481
+ const successCount = byStatus.completed;
482
+ const failureCount = byStatus.failed + byStatus.timeout;
483
+ const terminalCount = successCount + failureCount;
484
+ return {
485
+ total,
486
+ byStatus,
487
+ avgDuration: durationCount > 0 ? durationTotal / durationCount : 0,
488
+ successRate: terminalCount > 0 ? successCount / terminalCount : 0,
489
+ failureRate: terminalCount > 0 ? failureCount / terminalCount : 0,
490
+ };
491
+ }
492
+ //# sourceMappingURL=durable-run-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-run-stores.js","sourceRoot":"","sources":["../../src/manager/durable-run-stores.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare class InMemoryRunStore implements RunStore {
15
15
  private runs;
16
16
  save(run: WorkflowRun): Promise<void>;
17
17
  get(id: string): Promise<WorkflowRun | null>;
18
+ /** Runs matching `filters`, newest started first unless `orderBy` says otherwise. */
18
19
  list(filters?: WorkflowRunFilters): Promise<WorkflowRun[]>;
19
20
  count(filters?: WorkflowRunFilters): Promise<number>;
20
21
  update(id: string, updates: Partial<WorkflowRun>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/manager/run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,IAAI,CAAkC;IAExC,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI5C,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAU1D,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAapD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU1D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAejD,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,WAAW,EAAE;CAGxB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAKd,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkB5C,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK1D,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU1D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAgBnC,WAAW;IAqBzB,OAAO,CAAC,YAAY;IA0DpB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,UAAU,IAAI,IAAI;CAInB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,YAAY,CAEf"}
1
+ {"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/manager/run-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAC;AAI7B;;GAEG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,IAAI,CAAkC;IAExC,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKlD,qFAAqF;IAC/E,IAAI,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9D,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAapD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU1D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAejD,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,WAAW,EAAE;CAGxB;AAgBD;;GAEG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7D,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAKd,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkB5C,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAK1D,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU1D,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAgBnC,WAAW;IAqBzB,OAAO,CAAC,YAAY;IA0DpB,OAAO,CAAC,cAAc;IA4CtB,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,UAAU,IAAI,IAAI;CAInB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,YAAY,CAEf"}
@@ -15,17 +15,15 @@ import * as path from 'node:path';
15
15
  export class InMemoryRunStore {
16
16
  runs = new Map();
17
17
  async save(run) {
18
- this.runs.set(run.id, { ...run });
18
+ this.runs.set(run.id, copyRun(run));
19
19
  }
20
20
  async get(id) {
21
- return this.runs.get(id) ?? null;
21
+ const run = this.runs.get(id);
22
+ return run ? copyRun(run) : null;
22
23
  }
23
- async list(filters) {
24
- let runs = Array.from(this.runs.values());
25
- if (filters) {
26
- runs = this.applyFilters(runs, filters);
27
- }
28
- return runs;
24
+ /** Runs matching `filters`, newest started first unless `orderBy` says otherwise. */
25
+ async list(filters = {}) {
26
+ return this.applyFilters(Array.from(this.runs.values()), filters).map(copyRun);
29
27
  }
30
28
  async count(filters) {
31
29
  let runs = Array.from(this.runs.values());
@@ -40,7 +38,7 @@ export class InMemoryRunStore {
40
38
  async update(id, updates) {
41
39
  const run = this.runs.get(id);
42
40
  if (run) {
43
- this.runs.set(id, { ...run, ...updates });
41
+ this.runs.set(id, copyRun({ ...run, ...updates, id }));
44
42
  }
45
43
  }
46
44
  async delete(id) {
@@ -161,9 +159,22 @@ export class InMemoryRunStore {
161
159
  * Get all runs (for debugging)
162
160
  */
163
161
  getAll() {
164
- return Array.from(this.runs.values());
162
+ return Array.from(this.runs.values()).map(copyRun);
165
163
  }
166
164
  }
165
+ /**
166
+ * A run the caller can change without changing the stored one: the run and
167
+ * its node and tag lists are copied; state, input and output stay shared.
168
+ */
169
+ function copyRun(run) {
170
+ return {
171
+ ...run,
172
+ tags: [...run.tags],
173
+ currentNodes: [...run.currentNodes],
174
+ completedNodes: [...run.completedNodes],
175
+ failedNodes: [...run.failedNodes],
176
+ };
177
+ }
167
178
  /**
168
179
  * File-based run store for persistence
169
180
  */