@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,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']): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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
- }): HumanNodeConfig<S>;
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,EAEf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAEhB,cAAc,EACd,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,aAAa;IACtD,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EAC5D,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAsD7B;AAoPD;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GACvC,eAAe,CAAC,CAAC,CAAC,CAKpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjD,GACA,eAAe,CAAC,CAAC,CAAC,CAUpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,EAChD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjD,GACA,eAAe,CAAC,CAAC,CAAC,CAUpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjD,GACA,eAAe,CAAC,CAAC,CAAC,CASpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,aAAa,EAChD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjD,GACA,eAAe,CAAC,CAAC,CAAC,CASpB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,aAAa,EAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;CACjD,GACA,eAAe,CAAC,CAAC,CAAC,CAQpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,aAAa,EACrD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACA,eAAe,CAAC,CAAC,CAAC,CAiCpB"}
1
+ {"version":3,"file":"human-node.d.ts","sourceRoot":"","sources":["../../src/human/human-node.ts"],"names":[],"mappings":"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"}