@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
package/README.md
CHANGED
|
@@ -9,8 +9,14 @@ DAG-based workflow engine for Cogitator agents. Build multi-step workflows with
|
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
pnpm add @cogitator-ai/workflows @cogitator-ai/core
|
|
12
|
+
|
|
13
|
+
# Optional, for the durable stores
|
|
14
|
+
pnpm add pg # PostgreSQL stores
|
|
15
|
+
pnpm add @cogitator-ai/redis ioredis # Redis stores
|
|
12
16
|
```
|
|
13
17
|
|
|
18
|
+
Website docs: [Workflows](https://cogitator.app/docs/workflows), [Builder](https://cogitator.app/docs/workflows/builder), [Nodes](https://cogitator.app/docs/workflows/nodes), [Execution](https://cogitator.app/docs/workflows/execution), [Patterns](https://cogitator.app/docs/workflows/patterns), [Sagas](https://cogitator.app/docs/workflows/sagas), [Scheduling](https://cogitator.app/docs/workflows/scheduling).
|
|
19
|
+
|
|
14
20
|
## Features
|
|
15
21
|
|
|
16
22
|
- **DAG Builder** — nodes, conditionals, loops and parallel fan-out with validation and entry-point detection
|
|
@@ -18,6 +24,7 @@ pnpm add @cogitator-ai/workflows @cogitator-ai/core
|
|
|
18
24
|
- **Node policies** — per-node `timeout`, `retries` and `retryDelay`
|
|
19
25
|
- **Real-time Streaming** — async generator of execution events
|
|
20
26
|
- **Checkpoints** — save and resume workflow state
|
|
27
|
+
- **Durable Stores** — checkpoints, runs, approvals and timers in Redis or PostgreSQL, shared by several processes
|
|
21
28
|
- **Pre-built Nodes** — agent, tool, function and custom nodes, plus adapters for timers, human approvals, map-reduce and subworkflows
|
|
22
29
|
- **Saga Patterns** — retries, circuit breakers, compensation, dead-letter queue, idempotency
|
|
23
30
|
- **Triggers** — cron, webhook and event triggers
|
|
@@ -77,7 +84,7 @@ const workflow = new WorkflowBuilder<{ count: number }>('counter')
|
|
|
77
84
|
.build();
|
|
78
85
|
```
|
|
79
86
|
|
|
80
|
-
- State types must
|
|
87
|
+
- State types must satisfy `WorkflowState` (`Record<string, unknown>`): declare them with `type`, or as `interface MyState extends WorkflowState { ... }` (`import type { WorkflowState } from '@cogitator-ai/types'`). A plain `interface` does not satisfy the constraint.
|
|
81
88
|
- `addNode(name, fnOrNode, { after, config })` accepts a node function or a node created by a factory.
|
|
82
89
|
- The entry point is the single node (or conditional/parallel/loop construct) without `after`. Independent roots are rejected — add a parallel fan-out or call `.entryPoint(name)`.
|
|
83
90
|
- Node functions receive `ctx.state` (a copy), `ctx.input` (outputs of upstream nodes), `ctx.nodeId`, `ctx.workflowId`, `ctx.step`, `ctx.reportProgress()` and — for built-in nodes — `cogitator`, `signal` (run cancellation) and `depth` (subworkflow nesting).
|
|
@@ -205,8 +212,7 @@ const workflow = new WorkflowBuilder<{ attempts: number; done: boolean }>('retry
|
|
|
205
212
|
state: { attempts: ctx.state.attempts + 1, done: await tryIt() },
|
|
206
213
|
}))
|
|
207
214
|
.addLoop('again', {
|
|
208
|
-
condition: (state) =>
|
|
209
|
-
!(state as { done: boolean }).done && (state as { attempts: number }).attempts < 3,
|
|
215
|
+
condition: (state) => !state.done && state.attempts < 3, // typed with the builder's state
|
|
210
216
|
back: 'attempt',
|
|
211
217
|
exit: 'finish',
|
|
212
218
|
after: ['attempt'],
|
|
@@ -259,6 +265,38 @@ new PostgresCheckpointStore({ client: pool, table: 'workflow_checkpoints' }); //
|
|
|
259
265
|
|
|
260
266
|
Resuming runs only the nodes that did not finish, and the nodes after them get the finished nodes' outputs as input.
|
|
261
267
|
|
|
268
|
+
Runs, approvals and timers have the same kind of durable stores:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
import {
|
|
272
|
+
PostgresRunStore,
|
|
273
|
+
RedisApprovalStore,
|
|
274
|
+
PostgresTimerStore,
|
|
275
|
+
createWorkflowManager,
|
|
276
|
+
} from '@cogitator-ai/workflows';
|
|
277
|
+
|
|
278
|
+
createWorkflowManager({ cogitator, runStore: new PostgresRunStore({ client: pool }) });
|
|
279
|
+
new RedisApprovalStore({ client: redis, pollInterval: 1000 }); // answers from other processes arrive by polling
|
|
280
|
+
new PostgresTimerStore({ client: pool, claimTtl: 60_000 }); // each overdue timer is claimed by one TimerManager
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Postgres stores create their tables on first use (safe when two processes start at once); Redis stores index runs and requests in sorted sets instead of scanning keys. Approvals answered in another process reach the waiting human node within `pollInterval` (default 1 s); overdue timers are claimed for `claimTtl` (default 60 s) so several `TimerManager`s can share a store without firing a timer twice, and a crashed worker's timers come back once their claim expires.
|
|
284
|
+
|
|
285
|
+
A `TimerManager` renews a claim right before a handler starts and every `claimTtl / 3` while it runs, so slow handlers keep their timer. If the claim was lost (another worker took it), the handler is skipped or `onClaimLost` reports it; timers without a handler, or beyond a poll's `batchSize`, are released so another manager can take them at once. A failed handler keeps the claim until the lease ends, which spaces out retries:
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
import { createTimerManager, RedisTimerStore } from '@cogitator-ai/workflows';
|
|
289
|
+
|
|
290
|
+
const timers = createTimerManager(new RedisTimerStore({ client: redis, claimTtl: 30_000 }), {
|
|
291
|
+
pollInterval: 1_000,
|
|
292
|
+
onClaimLost: (entry) => console.warn('another worker took timer', entry.id),
|
|
293
|
+
});
|
|
294
|
+
timers.setDefaultHandler(async (entry) => console.log('fired', entry.id));
|
|
295
|
+
await timers.start();
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Custom stores implement `TimerStore`; `claimTtl`, `renew(id)` and `release(id)` are optional there and enable the claim handling above.
|
|
299
|
+
|
|
262
300
|
---
|
|
263
301
|
|
|
264
302
|
## Timers
|
|
@@ -335,6 +373,32 @@ console.log(breaker.getStats('payments'));
|
|
|
335
373
|
|
|
336
374
|
### Compensation
|
|
337
375
|
|
|
376
|
+
Give a node `config.compensation` and the executor rolls it back when a later node of the run fails:
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
builder
|
|
380
|
+
.addNode('reserve', reserveFn, {
|
|
381
|
+
config: { compensation: { compensate: async (state) => inventory.release(state.orderId) } },
|
|
382
|
+
})
|
|
383
|
+
.addNode('charge', chargeFn, {
|
|
384
|
+
after: ['reserve'],
|
|
385
|
+
config: {
|
|
386
|
+
compensation: {
|
|
387
|
+
compensate: async (state) => payments.refund(state.paymentId!),
|
|
388
|
+
compensateTimeout: 10_000,
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
})
|
|
392
|
+
.addNode('ship', shipFn, { after: ['charge'] });
|
|
393
|
+
|
|
394
|
+
const result = await executor.execute(workflow, input, {
|
|
395
|
+
onCompensationStart: (node) => console.log(`rolling back ${node}`),
|
|
396
|
+
onCompensationComplete: (node) => console.log(`rolled back ${node}`),
|
|
397
|
+
});
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Completed nodes with a `compensate` are rolled back in reverse completion order (`compensateOrder: 'parallel' | 'forward'` changes that, `compensateCondition` skips a step); aborted, paused and cancelled runs are not compensated. For rollbacks outside the executor, use a `CompensationManager`:
|
|
401
|
+
|
|
338
402
|
```typescript
|
|
339
403
|
import { compensationBuilder } from '@cogitator-ai/workflows';
|
|
340
404
|
|
|
@@ -346,10 +410,12 @@ const compensation = compensationBuilder<OrderState>()
|
|
|
346
410
|
compensation.markCompleted('reserve', reservation);
|
|
347
411
|
compensation.markCompleted('charge', payment);
|
|
348
412
|
|
|
349
|
-
const report = await compensation.compensate(state, 'ship', new Error('carrier down')
|
|
413
|
+
const report = await compensation.compensate(state, 'ship', new Error('carrier down'), {
|
|
414
|
+
onStepStart: (nodeId) => console.log(`compensating ${nodeId}`),
|
|
415
|
+
});
|
|
350
416
|
```
|
|
351
417
|
|
|
352
|
-
Compensations run in reverse completion order for the steps marked completed.
|
|
418
|
+
Compensations run in reverse completion order for the steps marked completed; the optional `CompensationHooks` argument (`onStepStart`, `onStepComplete`) observes each step that runs.
|
|
353
419
|
|
|
354
420
|
### Dead Letter Queue and Idempotency
|
|
355
421
|
|
|
@@ -453,7 +519,28 @@ await approvalStore.submitResponse({
|
|
|
453
519
|
});
|
|
454
520
|
```
|
|
455
521
|
|
|
456
|
-
Other configs: `choiceNode`, `inputNode`, `ratingNode`, `chainNode`, `managementChain`. Notifiers: `ConsoleNotifier`, `WebhookNotifier`, `slackNotifier`, `CompositeNotifier`, `filteredNotifier`, `priorityRouter`. `FileApprovalStore` persists requests.
|
|
522
|
+
Other configs: `choiceNode`, `inputNode`, `ratingNode`, `chainNode`, `managementChain`; all of them return a config whose `name` is set, so `config.name` is a `string`. Notifiers: `ConsoleNotifier`, `WebhookNotifier`, `slackNotifier`, `CompositeNotifier`, `filteredNotifier`, `priorityRouter`. `FileApprovalStore` persists requests; `RedisApprovalStore` and `PostgresApprovalStore` share them between processes.
|
|
523
|
+
|
|
524
|
+
A request is answered once, in every store (atomically across processes for Redis and Postgres): the first `submitResponse` wins and a later one throws `ApprovalAlreadyAnsweredError` carrying the answer that stands. A human node whose timeout fires just after someone answered keeps that answer. Deleting (or expiring) a request nobody answered withdraws it: waiters in any process get a withdrawal and the node finishes with `withdrawn: true` instead of waiting forever. A timeout or withdrawal never counts as approval, also for `multi-choice` requests.
|
|
525
|
+
|
|
526
|
+
```typescript
|
|
527
|
+
import { ApprovalAlreadyAnsweredError } from '@cogitator-ai/workflows';
|
|
528
|
+
|
|
529
|
+
try {
|
|
530
|
+
await approvalStore.submitResponse({
|
|
531
|
+
requestId,
|
|
532
|
+
decision: false,
|
|
533
|
+
respondedBy: 'cfo@company.com',
|
|
534
|
+
respondedAt: Date.now(),
|
|
535
|
+
});
|
|
536
|
+
} catch (error) {
|
|
537
|
+
if (error instanceof ApprovalAlreadyAnsweredError) {
|
|
538
|
+
console.log('Already decided:', error.existing?.decision);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
await approvalStore.deleteRequest(staleRequestId); // a pending request is withdrawn
|
|
543
|
+
```
|
|
457
544
|
|
|
458
545
|
---
|
|
459
546
|
|
|
@@ -494,7 +581,9 @@ import { createTriggerManager, cronTrigger, webhookTrigger } from '@cogitator-ai
|
|
|
494
581
|
|
|
495
582
|
const triggers = createTriggerManager({
|
|
496
583
|
onTriggerFire: async (trigger, context) => {
|
|
497
|
-
const run = await manager.schedule(workflows[trigger.workflowName], {
|
|
584
|
+
const run = await manager.schedule(workflows[trigger.workflowName], {
|
|
585
|
+
input: { payload: context.payload },
|
|
586
|
+
});
|
|
498
587
|
return run;
|
|
499
588
|
},
|
|
500
589
|
});
|
|
@@ -535,7 +624,7 @@ import { createTracer, createMetricsCollector } from '@cogitator-ai/workflows';
|
|
|
535
624
|
const tracer = createTracer({
|
|
536
625
|
enabled: true,
|
|
537
626
|
serviceName: 'billing-workflows',
|
|
538
|
-
exporter: 'otlp', // 'console' | 'otlp' | 'jaeger' | 'zipkin'
|
|
627
|
+
exporter: 'otlp', // 'console' | 'otlp' | 'jaeger' | 'zipkin' | 'noop'
|
|
539
628
|
exporterEndpoint: 'http://localhost:4318/v1/traces',
|
|
540
629
|
});
|
|
541
630
|
const metricsCollector = createMetricsCollector({ prefix: 'cogitator_workflow' });
|
|
@@ -547,7 +636,7 @@ console.log(metricsCollector.getWorkflowMetrics('report'));
|
|
|
547
636
|
console.log(metricsCollector.toPrometheusFormat());
|
|
548
637
|
```
|
|
549
638
|
|
|
550
|
-
The executor creates one workflow span and a child span per node execution (parallel nodes keep correct parents) and records workflow/node counts, latencies and retries.
|
|
639
|
+
The executor creates one workflow span and a child span per node execution (parallel nodes keep correct parents) and records workflow/node counts, latencies and retries. `sampleRate` (0–1) samples traces; with 0, `tracer.isSampled()` is `false` and nothing is exported.
|
|
551
640
|
|
|
552
641
|
---
|
|
553
642
|
|
|
@@ -574,8 +663,16 @@ await manager.cancel(runId);
|
|
|
574
663
|
const runs = await manager.listRuns({ status: 'failed', workflowName: 'report', limit: 20 });
|
|
575
664
|
const stats = await manager.getStats('report');
|
|
576
665
|
await manager.retry(runs[0].id);
|
|
666
|
+
|
|
667
|
+
const jobId = manager.registerCronJob(workflow, '0 2 * * *', {
|
|
668
|
+
jobOptions: { input, maxRetries: 2 },
|
|
669
|
+
});
|
|
577
670
|
```
|
|
578
671
|
|
|
672
|
+
`registerCronJob` queues a run on every occurrence while the manager is started (`schedule({ cron })` queues only the next one); `unregisterCronJob`, `setCronJobEnabled` and `getCronJobs` manage the jobs. Scheduled runs get the manager's checkpoint store, tracer, metrics and their `timeout` (else `defaultTimeout`), and `maxRetries` retries a failed scheduled run automatically. With a `checkpointStore`, `pause(runId)` aborts a running run and keeps it `paused`, and `resume(runId, options?)` continues it from its last checkpoint.
|
|
673
|
+
|
|
674
|
+
Every run — executed, scheduled or started by a trigger — records `currentNodes`, `completedNodes` and `failedNodes`, all written by the time the run is marked finished. Run stores return copies, so changing a returned run does not change the stored one; `listRuns()` is sorted newest first. `getStats()` counts cancelled runs toward neither the success nor the failure rate. Use `PostgresRunStore` / `RedisRunStore` to share runs between processes: queries, counts and stats run in the database (Postgres) or on sorted-set indexes (Redis).
|
|
675
|
+
|
|
579
676
|
---
|
|
580
677
|
|
|
581
678
|
## License
|
package/dist/builder.d.ts
CHANGED
|
@@ -25,7 +25,7 @@ export declare class WorkflowBuilder<S extends WorkflowState = WorkflowState> {
|
|
|
25
25
|
* Add a node to the workflow. Accepts a node function or a node created by a factory
|
|
26
26
|
* (`agentNode`, `toolNode`, `functionNode`, `customNode`, ...).
|
|
27
27
|
*/
|
|
28
|
-
addNode(name: string, node: NodeFn<S> | WorkflowNode<S>, options?: AddNodeOptions): this;
|
|
28
|
+
addNode(name: string, node: NodeFn<S> | WorkflowNode<S>, options?: AddNodeOptions<S>): this;
|
|
29
29
|
/**
|
|
30
30
|
* Add a conditional routing node
|
|
31
31
|
*/
|
|
@@ -33,7 +33,7 @@ export declare class WorkflowBuilder<S extends WorkflowState = WorkflowState> {
|
|
|
33
33
|
/**
|
|
34
34
|
* Add a loop construct
|
|
35
35
|
*/
|
|
36
|
-
addLoop(name: string, options: AddLoopOptions): this;
|
|
36
|
+
addLoop(name: string, options: AddLoopOptions<S>): this;
|
|
37
37
|
addParallel(name: string, targets: string[], options?: AddParallelOptions): this;
|
|
38
38
|
/**
|
|
39
39
|
* Build and validate the workflow
|
package/dist/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,MAAM,EAEN,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA6B7B,qBAAa,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAClE,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAqB;gBAE1B,IAAI,EAAE,MAAM;IAKxB,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAK5B;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,MAAM,EAEN,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAEnB,MAAM,qBAAqB,CAAC;AA6B7B,qBAAa,eAAe,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAClE,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAqB;gBAE1B,IAAI,EAAE,MAAM;IAKxB,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAK5B;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAgB3F;;OAEG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,EAAE,EAC1C,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI;IAUP;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAYvD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAUhF;;OAEG;IACH,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;IAiKpB,OAAO,CAAC,aAAa;CAgCtB"}
|
package/dist/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0CH,MAAM,OAAO,eAAe;IAClB,IAAI,CAAS;IACb,KAAK,CAAI;IACT,KAAK,GAAsB,EAAE,CAAC;IAC9B,YAAY,GAA6B,EAAE,CAAC;IAC5C,KAAK,GAAsB,EAAE,CAAC;IAC9B,SAAS,GAAuB,EAAE,CAAC;IACnC,cAAc,GAAkB,IAAI,CAAC;IACrC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,EAAO,CAAC;IACvB,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAQ;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAY,EAAE,IAAiC,EAAE,
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-stores.d.ts","sourceRoot":"","sources":["../src/checkpoint-stores.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkpoint-stores.d.ts","sourceRoot":"","sources":["../src/checkpoint-stores.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG/E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,2BAA2B;IAK1C,IAAI,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAanD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKpD,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAazD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,QAAQ;CAGjB;AAED,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CAC5F;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mFAAmF;AACnF,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAC,CAAgB;gBAElB,OAAO,EAAE,8BAA8B;IAS7C,IAAI,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWnD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAMpD,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IASzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,OAAO,CAAC,WAAW;YAQL,WAAW;CAgB1B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Durable workflow checkpoint stores: Redis and Postgres.
|
|
3
3
|
*/
|
|
4
|
+
import { createIfMissing, fromJson, TABLE_NAME } from './postgres-schema.js';
|
|
4
5
|
/**
|
|
5
6
|
* Checkpoints in Redis: each as JSON under its id, with a sorted set per
|
|
6
7
|
* workflow (scored by timestamp) to list them newest first.
|
|
@@ -52,7 +53,6 @@ export class RedisCheckpointStore {
|
|
|
52
53
|
return `${this.prefix}:workflow:${workflowName}`;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
|
-
const TABLE_NAME = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
|
|
56
56
|
/** Checkpoints in a Postgres table, as JSONB rows indexed by workflow and time. */
|
|
57
57
|
export class PostgresCheckpointStore {
|
|
58
58
|
client;
|
|
@@ -96,17 +96,16 @@ export class PostgresCheckpointStore {
|
|
|
96
96
|
}
|
|
97
97
|
async createTable() {
|
|
98
98
|
const index = `${this.table.replace('.', '_')}_workflow_idx`;
|
|
99
|
-
await this.client
|
|
99
|
+
await createIfMissing(this.client, `CREATE TABLE IF NOT EXISTS ${this.table} (
|
|
100
100
|
id TEXT PRIMARY KEY,
|
|
101
101
|
workflow_name TEXT NOT NULL,
|
|
102
102
|
data JSONB NOT NULL,
|
|
103
103
|
created_at BIGINT NOT NULL
|
|
104
104
|
)`);
|
|
105
|
-
await this.client
|
|
105
|
+
await createIfMissing(this.client, `CREATE INDEX IF NOT EXISTS ${index} ON ${this.table} (workflow_name, created_at DESC)`);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
/** `pg` returns JSONB columns parsed; other drivers may return the text. */
|
|
109
108
|
function toCheckpoint(data) {
|
|
110
|
-
return (
|
|
109
|
+
return fromJson(data);
|
|
111
110
|
}
|
|
112
111
|
//# sourceMappingURL=checkpoint-stores.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint-stores.js","sourceRoot":"","sources":["../src/checkpoint-stores.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"checkpoint-stores.js","sourceRoot":"","sources":["../src/checkpoint-stores.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WorkflowExecutor - Main execution engine for workflows
|
|
3
3
|
*/
|
|
4
|
-
import type { Workflow, WorkflowState, WorkflowResult, WorkflowExecuteOptions, StreamingWorkflowEvent, CheckpointStore, RetryConfig, CircuitBreakerConfig, DeadLetterQueue, IdempotencyStore, ApprovalStore, ApprovalNotifier, TimerStore } from '@cogitator-ai/types';
|
|
4
|
+
import type { Workflow, WorkflowState, WorkflowResult, WorkflowExecuteOptions, WorkflowExecuteOptionsV2, StreamingWorkflowEvent, CheckpointStore, RetryConfig, CircuitBreakerConfig, DeadLetterQueue, IdempotencyStore, ApprovalStore, ApprovalNotifier, TimerStore } from '@cogitator-ai/types';
|
|
5
5
|
import type { Cogitator } from '@cogitator-ai/core';
|
|
6
|
-
import type
|
|
7
|
-
import type
|
|
8
|
-
export interface ExecutorExecuteOptions extends WorkflowExecuteOptions {
|
|
6
|
+
import { type WorkflowTracer } from './observability/tracer.js';
|
|
7
|
+
import { type WorkflowMetricsCollector } from './observability/metrics.js';
|
|
8
|
+
export interface ExecutorExecuteOptions extends WorkflowExecuteOptions, Pick<WorkflowExecuteOptionsV2, 'onApprovalRequired' | 'onCompensationStart' | 'onCompensationComplete' | 'onTimerScheduled' | 'onDeadLetter'> {
|
|
9
9
|
/** Abort the run; checked between steps and passed to nodes (`ctx.signal`) */
|
|
10
10
|
signal?: AbortSignal;
|
|
11
|
-
/** Emit a workflow span and one span per node execution */
|
|
11
|
+
/** Emit a workflow span and one span per node execution (defaults to the enabled global tracer) */
|
|
12
12
|
tracer?: WorkflowTracer;
|
|
13
|
-
/** Record workflow and node executions */
|
|
13
|
+
/** Record workflow and node executions (defaults to the enabled global metrics collector) */
|
|
14
14
|
metricsCollector?: WorkflowMetricsCollector;
|
|
15
15
|
/** Subworkflow nesting depth, exposed to nodes as `ctx.depth` */
|
|
16
16
|
depth?: number;
|
|
@@ -51,10 +51,10 @@ export declare class WorkflowExecutor {
|
|
|
51
51
|
/**
|
|
52
52
|
* Resume a workflow from a checkpoint
|
|
53
53
|
*/
|
|
54
|
-
resume<S extends WorkflowState>(workflow: Workflow<S>, checkpointId: string, options?:
|
|
54
|
+
resume<S extends WorkflowState>(workflow: Workflow<S>, checkpointId: string, options?: ExecutorExecuteOptions): Promise<WorkflowResult<S>>;
|
|
55
55
|
/**
|
|
56
56
|
* Stream workflow execution events
|
|
57
57
|
*/
|
|
58
|
-
stream<S extends WorkflowState>(workflow: Workflow<S>, input?: Partial<S>, options?: Omit<
|
|
58
|
+
stream<S extends WorkflowState>(workflow: Workflow<S>, input?: Partial<S>, options?: Omit<ExecutorExecuteOptions, 'onNodeStart' | 'onNodeComplete' | 'onNodeError' | 'onNodeProgress'>): AsyncIterable<StreamingWorkflowEvent>;
|
|
59
59
|
}
|
|
60
60
|
//# sourceMappingURL=executor.d.ts.map
|
package/dist/executor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EAKf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAKpD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/executor.js
CHANGED
|
@@ -4,8 +4,12 @@
|
|
|
4
4
|
import { nanoid } from 'nanoid';
|
|
5
5
|
import { WorkflowScheduler } from './scheduler.js';
|
|
6
6
|
import { InMemoryCheckpointStore, createCheckpointId } from './checkpoint.js';
|
|
7
|
+
import { getGlobalTracer } from './observability/tracer.js';
|
|
8
|
+
import { getGlobalMetrics } from './observability/metrics.js';
|
|
9
|
+
import { COMPENSATION_NODE, COMPENSATION_TRIGGERED } from './observability/span-attributes.js';
|
|
7
10
|
import { computeRetryDelay } from './saga/retry.js';
|
|
8
11
|
import { CircuitBreaker } from './saga/circuit-breaker.js';
|
|
12
|
+
import { CompensationManager } from './saga/compensation.js';
|
|
9
13
|
import { createDLQEntry } from './saga/dead-letter.js';
|
|
10
14
|
const DEFAULT_MAX_CONCURRENCY = 4;
|
|
11
15
|
const DEFAULT_MAX_ITERATIONS = 100;
|
|
@@ -28,6 +32,25 @@ export class NodeTimeoutError extends Error {
|
|
|
28
32
|
this.timeoutMs = timeoutMs;
|
|
29
33
|
}
|
|
30
34
|
}
|
|
35
|
+
/** Call an observer without letting its exception break the run. */
|
|
36
|
+
function notify(name, callback, ...args) {
|
|
37
|
+
if (!callback)
|
|
38
|
+
return;
|
|
39
|
+
try {
|
|
40
|
+
callback(...args);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.warn(`[WorkflowExecutor] ${name} callback failed:`, error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function activeGlobalTracer() {
|
|
47
|
+
const tracer = getGlobalTracer();
|
|
48
|
+
return tracer.isSampled() ? tracer : undefined;
|
|
49
|
+
}
|
|
50
|
+
function activeGlobalMetrics() {
|
|
51
|
+
const metrics = getGlobalMetrics();
|
|
52
|
+
return metrics.isEnabled() ? metrics : undefined;
|
|
53
|
+
}
|
|
31
54
|
function sleep(ms, signal) {
|
|
32
55
|
if (ms <= 0)
|
|
33
56
|
return Promise.resolve();
|
|
@@ -152,14 +175,47 @@ export class WorkflowExecutor {
|
|
|
152
175
|
let error;
|
|
153
176
|
const graph = this.scheduler.buildDependencyGraph(workflow);
|
|
154
177
|
const reachability = this.scheduler.buildReachability(workflow);
|
|
155
|
-
const tracer = options?.tracer;
|
|
156
|
-
const metrics = options?.metricsCollector;
|
|
178
|
+
const tracer = options?.tracer ?? activeGlobalTracer();
|
|
179
|
+
const metrics = options?.metricsCollector ?? activeGlobalMetrics();
|
|
180
|
+
const compensation = new CompensationManager();
|
|
181
|
+
const inFlight = new Set();
|
|
157
182
|
const breaker = options?.defaultCircuitBreaker
|
|
158
183
|
? this.getBreaker(options.defaultCircuitBreaker)
|
|
159
184
|
: undefined;
|
|
160
185
|
const workflowSpan = tracer?.startWorkflowSpan(workflow.name, workflowId, workflowId);
|
|
161
186
|
metrics?.recordWorkflowStart(workflow.name);
|
|
162
187
|
let currentNodes = [workflow.entryPoint];
|
|
188
|
+
const trackCompensation = (nodeName, output) => {
|
|
189
|
+
const config = workflow.nodes.get(nodeName)?.config?.compensation;
|
|
190
|
+
if (!config?.compensate)
|
|
191
|
+
return;
|
|
192
|
+
if (!compensation.hasCompensation(nodeName)) {
|
|
193
|
+
compensation.registerFromConfig(nodeName, config);
|
|
194
|
+
}
|
|
195
|
+
compensation.markCompleted(nodeName, output);
|
|
196
|
+
};
|
|
197
|
+
const compensate = async (failedNode, cause) => {
|
|
198
|
+
await Promise.allSettled(inFlight);
|
|
199
|
+
if (compensation.getCompensableNodes().length === 0)
|
|
200
|
+
return;
|
|
201
|
+
workflowSpan?.setAttribute(COMPENSATION_TRIGGERED, true);
|
|
202
|
+
await compensation.compensate(state, failedNode, cause, {
|
|
203
|
+
onStepStart: (nodeId) => {
|
|
204
|
+
notify('onCompensationStart', options?.onCompensationStart, nodeId);
|
|
205
|
+
},
|
|
206
|
+
onStepComplete: (step) => {
|
|
207
|
+
workflowSpan?.addEvent('compensation', {
|
|
208
|
+
[COMPENSATION_NODE]: step.nodeId,
|
|
209
|
+
'compensation.success': step.success,
|
|
210
|
+
'compensation.duration_ms': step.duration,
|
|
211
|
+
});
|
|
212
|
+
if (!step.success) {
|
|
213
|
+
console.warn(`[WorkflowExecutor] Compensation of node '${step.nodeId}' failed:`, step.error);
|
|
214
|
+
}
|
|
215
|
+
notify('onCompensationComplete', options?.onCompensationComplete, step.nodeId);
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
};
|
|
163
219
|
let lastCheckpointAt = 0;
|
|
164
220
|
const saveCheckpoint = async () => {
|
|
165
221
|
checkpointId = createCheckpointId();
|
|
@@ -207,6 +263,8 @@ export class WorkflowExecutor {
|
|
|
207
263
|
approvalStore: options?.approvalStore,
|
|
208
264
|
approvalNotifier: options?.approvalNotifier,
|
|
209
265
|
timerStore: options?.timerStore,
|
|
266
|
+
onApprovalRequired: options?.onApprovalRequired,
|
|
267
|
+
onTimerScheduled: options?.onTimerScheduled,
|
|
210
268
|
reportProgress: (progress) => {
|
|
211
269
|
const clamped = Math.max(0, Math.min(100, progress));
|
|
212
270
|
options?.onNodeProgress?.(nodeName, clamped);
|
|
@@ -234,6 +292,7 @@ export class WorkflowExecutor {
|
|
|
234
292
|
await idempotencyStore.store(idempotencyKey, result);
|
|
235
293
|
}
|
|
236
294
|
const duration = Date.now() - nodeStart;
|
|
295
|
+
trackCompensation(nodeName, result.output);
|
|
237
296
|
nodeSpan?.setAttribute('node.retries', retries);
|
|
238
297
|
nodeSpan?.end('ok');
|
|
239
298
|
metrics?.recordNodeExecution(workflow.name, nodeName, 'node', duration, true, retries);
|
|
@@ -246,19 +305,29 @@ export class WorkflowExecutor {
|
|
|
246
305
|
nodeSpan?.end('error', err.message);
|
|
247
306
|
metrics?.recordNodeExecution(workflow.name, nodeName, 'node', Date.now() - nodeStart, false, node.config?.retries ?? options?.defaultRetry?.maxRetries ?? 0);
|
|
248
307
|
if (options?.deadLetterQueue) {
|
|
249
|
-
|
|
250
|
-
.add(createDLQEntry(nodeName, workflowId, workflow.name, state, err, {
|
|
308
|
+
const entry = createDLQEntry(nodeName, workflowId, workflow.name, state, err, {
|
|
251
309
|
input,
|
|
252
310
|
attempts: 1 + (node.config?.retries ?? options.defaultRetry?.maxRetries ?? 0),
|
|
253
|
-
}))
|
|
254
|
-
.catch((dlqError) => {
|
|
255
|
-
console.warn('[WorkflowExecutor] Failed to write dead letter entry:', dlqError);
|
|
256
311
|
});
|
|
312
|
+
try {
|
|
313
|
+
const id = await options.deadLetterQueue.add(entry);
|
|
314
|
+
notify('onDeadLetter', options.onDeadLetter, { ...entry, id });
|
|
315
|
+
}
|
|
316
|
+
catch (dlqError) {
|
|
317
|
+
console.warn('[WorkflowExecutor] Failed to write dead letter entry:', dlqError);
|
|
318
|
+
}
|
|
257
319
|
}
|
|
258
320
|
throw new NodeExecutionError(nodeName, err);
|
|
259
321
|
}
|
|
260
322
|
};
|
|
261
|
-
|
|
323
|
+
const running = tracer ? tracer.runInContext(runNode) : runNode();
|
|
324
|
+
inFlight.add(running);
|
|
325
|
+
try {
|
|
326
|
+
return await running;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
inFlight.delete(running);
|
|
330
|
+
}
|
|
262
331
|
};
|
|
263
332
|
const processNodeResult = (nodeName, result, duration, nextNodes) => {
|
|
264
333
|
if (result.state) {
|
|
@@ -293,6 +362,7 @@ export class WorkflowExecutor {
|
|
|
293
362
|
if (completedNodes.has(nodeName))
|
|
294
363
|
continue;
|
|
295
364
|
completedNodes.add(nodeName);
|
|
365
|
+
trackCompensation(nodeName, nodeResults.get(nodeName)?.output);
|
|
296
366
|
for (const next of this.scheduler.getNextNodes(workflow, nodeName, state)) {
|
|
297
367
|
if (completedNodes.has(next) || currentNodes.includes(next))
|
|
298
368
|
continue;
|
|
@@ -333,6 +403,11 @@ export class WorkflowExecutor {
|
|
|
333
403
|
if (e instanceof NodeExecutionError) {
|
|
334
404
|
error = e.cause instanceof Error ? e.cause : e;
|
|
335
405
|
options?.onNodeError?.(e.nodeName, error);
|
|
406
|
+
if (!options?.signal?.aborted) {
|
|
407
|
+
await compensate(e.nodeName, error).catch((compensationError) => {
|
|
408
|
+
console.warn('[WorkflowExecutor] Compensation failed:', compensationError);
|
|
409
|
+
});
|
|
410
|
+
}
|
|
336
411
|
}
|
|
337
412
|
else {
|
|
338
413
|
error = e instanceof Error ? e : new Error(String(e));
|