bunqueue 2.7.0 → 2.7.2

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 (36) hide show
  1. package/README.md +11 -0
  2. package/dist/client/workflow/emitter.d.ts +18 -0
  3. package/dist/client/workflow/emitter.d.ts.map +1 -0
  4. package/dist/client/workflow/emitter.js +75 -0
  5. package/dist/client/workflow/emitter.js.map +1 -0
  6. package/dist/client/workflow/engine.d.ts +18 -1
  7. package/dist/client/workflow/engine.d.ts.map +1 -1
  8. package/dist/client/workflow/engine.js +51 -1
  9. package/dist/client/workflow/engine.js.map +1 -1
  10. package/dist/client/workflow/executor.d.ts +17 -15
  11. package/dist/client/workflow/executor.d.ts.map +1 -1
  12. package/dist/client/workflow/executor.js +141 -126
  13. package/dist/client/workflow/executor.js.map +1 -1
  14. package/dist/client/workflow/index.d.ts +2 -1
  15. package/dist/client/workflow/index.d.ts.map +1 -1
  16. package/dist/client/workflow/index.js +1 -0
  17. package/dist/client/workflow/index.js.map +1 -1
  18. package/dist/client/workflow/loops.d.ts +15 -0
  19. package/dist/client/workflow/loops.d.ts.map +1 -0
  20. package/dist/client/workflow/loops.js +76 -0
  21. package/dist/client/workflow/loops.js.map +1 -0
  22. package/dist/client/workflow/runner.d.ts +21 -0
  23. package/dist/client/workflow/runner.d.ts.map +1 -0
  24. package/dist/client/workflow/runner.js +180 -0
  25. package/dist/client/workflow/runner.js.map +1 -0
  26. package/dist/client/workflow/store.d.ts +6 -0
  27. package/dist/client/workflow/store.d.ts.map +1 -1
  28. package/dist/client/workflow/store.js +55 -0
  29. package/dist/client/workflow/store.js.map +1 -1
  30. package/dist/client/workflow/types.d.ts +95 -0
  31. package/dist/client/workflow/types.d.ts.map +1 -1
  32. package/dist/client/workflow/workflow.d.ts +19 -1
  33. package/dist/client/workflow/workflow.d.ts.map +1 -1
  34. package/dist/client/workflow/workflow.js +93 -0
  35. package/dist/client/workflow/workflow.js.map +1 -1
  36. package/package.json +13 -2
@@ -0,0 +1,180 @@
1
+ /**
2
+ * WorkflowRunner - Step execution with retry, parallel execution, sub-workflow dispatch
3
+ */
4
+ /** Exponential backoff with jitter */
5
+ function backoffDelay(attempt, baseMs = 500, maxMs = 30_000) {
6
+ const delay = Math.min(baseMs * 2 ** (attempt - 1), maxMs);
7
+ const jitter = delay * 0.5 * Math.random();
8
+ return delay + jitter;
9
+ }
10
+ /** Run a promise with a timeout */
11
+ export function runWithTimeout(promise, timeoutMs) {
12
+ if (!(promise instanceof Promise))
13
+ return Promise.resolve(promise);
14
+ if (timeoutMs <= 0)
15
+ return promise;
16
+ return new Promise((resolve, reject) => {
17
+ const timer = setTimeout(() => {
18
+ reject(new Error(`Step timed out after ${timeoutMs}ms`));
19
+ }, timeoutMs);
20
+ promise.then((v) => {
21
+ clearTimeout(timer);
22
+ resolve(v);
23
+ }, (e) => {
24
+ clearTimeout(timer);
25
+ reject(e instanceof Error ? e : new Error(String(e)));
26
+ });
27
+ });
28
+ }
29
+ /** Execute a step with retry logic and exponential backoff */
30
+ export async function executeStepWithRetry(def, ctx, exec, emitter, updateFn) {
31
+ const maxAttempts = def.retry;
32
+ let lastError;
33
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
34
+ const prev = exec.steps[def.name];
35
+ exec.steps[def.name] = {
36
+ status: 'running',
37
+ startedAt: prev?.startedAt ?? Date.now(),
38
+ attempts: attempt,
39
+ };
40
+ updateFn(exec);
41
+ emitter?.emitStep('step:started', exec.id, exec.workflowName, def.name, {
42
+ attempt,
43
+ maxAttempts,
44
+ });
45
+ try {
46
+ if (def.inputSchema) {
47
+ try {
48
+ def.inputSchema.parse(ctx.input);
49
+ }
50
+ catch (e) {
51
+ throw new Error(`Input validation failed for "${def.name}": ${e instanceof Error ? e.message : String(e)}`, { cause: e });
52
+ }
53
+ }
54
+ const result = await runWithTimeout(def.handler(ctx), def.timeout);
55
+ if (def.outputSchema) {
56
+ try {
57
+ def.outputSchema.parse(result);
58
+ }
59
+ catch (e) {
60
+ throw new Error(`Output validation failed for "${def.name}": ${e instanceof Error ? e.message : String(e)}`, { cause: e });
61
+ }
62
+ }
63
+ exec.steps[def.name] = {
64
+ status: 'completed',
65
+ result,
66
+ startedAt: exec.steps[def.name].startedAt,
67
+ completedAt: Date.now(),
68
+ attempts: attempt,
69
+ };
70
+ updateFn(exec);
71
+ emitter?.emitStep('step:completed', exec.id, exec.workflowName, def.name, {
72
+ result,
73
+ attempt,
74
+ maxAttempts,
75
+ });
76
+ return;
77
+ }
78
+ catch (err) {
79
+ lastError = err instanceof Error ? err : new Error(String(err));
80
+ if (attempt < maxAttempts) {
81
+ emitter?.emitStep('step:retry', exec.id, exec.workflowName, def.name, {
82
+ error: lastError.message,
83
+ attempt,
84
+ maxAttempts,
85
+ });
86
+ await new Promise((r) => setTimeout(r, backoffDelay(attempt)));
87
+ continue;
88
+ }
89
+ }
90
+ }
91
+ const finalError = lastError ?? new Error('Step failed');
92
+ exec.steps[def.name] = {
93
+ status: 'failed',
94
+ error: String(finalError),
95
+ startedAt: exec.steps[def.name].startedAt,
96
+ completedAt: Date.now(),
97
+ attempts: maxAttempts,
98
+ };
99
+ updateFn(exec);
100
+ emitter?.emitStep('step:failed', exec.id, exec.workflowName, def.name, {
101
+ error: String(finalError),
102
+ attempt: maxAttempts,
103
+ maxAttempts,
104
+ });
105
+ throw finalError;
106
+ }
107
+ /** Execute multiple steps in parallel via Promise.allSettled */
108
+ export async function executeParallelSteps(steps, ctx, exec, emitter, updateFn) {
109
+ const results = await Promise.allSettled(steps.map((def) => executeStepWithRetry(def, ctx, exec, emitter, updateFn)));
110
+ const failed = results.filter((r) => r.status === 'rejected');
111
+ if (failed.length > 0) {
112
+ throw failed[0].reason instanceof Error
113
+ ? failed[0].reason
114
+ : new Error(String(failed[0].reason));
115
+ }
116
+ }
117
+ /** Execute a sub-workflow by starting it and polling for completion */
118
+ export async function executeSubWorkflow(workflowName, input, startFn, getFn, pollIntervalMs = 100) {
119
+ const handle = await startFn(workflowName, input);
120
+ const maxWait = 300_000;
121
+ const start = Date.now();
122
+ while (Date.now() - start < maxWait) {
123
+ const subExec = getFn(handle.id);
124
+ if (subExec?.state === 'completed') {
125
+ const results = {};
126
+ for (const [name, record] of Object.entries(subExec.steps)) {
127
+ if (record.status === 'completed')
128
+ results[name] = record.result;
129
+ }
130
+ return results;
131
+ }
132
+ if (subExec?.state === 'failed') {
133
+ throw new Error(`Sub-workflow "${workflowName}" (${handle.id}) failed`);
134
+ }
135
+ await new Promise((r) => setTimeout(r, pollIntervalMs));
136
+ }
137
+ throw new Error(`Sub-workflow "${workflowName}" (${handle.id}) timed out`);
138
+ }
139
+ /** Find a step definition by name across all node types */
140
+ export function findStepDef(wf, name) {
141
+ for (const node of wf.nodes) {
142
+ if (node.type === 'step' && node.def.name === name)
143
+ return node.def;
144
+ if (node.type === 'branch') {
145
+ for (const steps of node.def.paths.values()) {
146
+ const found = steps.find((s) => s.name === name);
147
+ if (found)
148
+ return found;
149
+ }
150
+ }
151
+ if (node.type === 'parallel') {
152
+ const found = node.def.steps.find((s) => s.name === name);
153
+ if (found)
154
+ return found;
155
+ }
156
+ if (node.type === 'doUntil' || node.type === 'doWhile') {
157
+ const found = node.def.steps.find((s) => s.name === name);
158
+ if (found)
159
+ return found;
160
+ }
161
+ if (node.type === 'forEach' && node.def.step.name === name)
162
+ return node.def.step;
163
+ }
164
+ return null;
165
+ }
166
+ /** Build a StepContext from the current execution state */
167
+ export function buildContext(exec) {
168
+ const stepResults = {};
169
+ for (const [name, record] of Object.entries(exec.steps)) {
170
+ if (record.status === 'completed')
171
+ stepResults[name] = record.result;
172
+ }
173
+ return {
174
+ input: exec.input,
175
+ steps: stepResults,
176
+ signals: exec.signals,
177
+ executionId: exec.id,
178
+ };
179
+ }
180
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/client/workflow/runner.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,12 @@ export declare class WorkflowStore {
10
10
  get(id: string): Execution | null;
11
11
  update(exec: Execution): void;
12
12
  list(workflowName?: string, state?: ExecutionState): Execution[];
13
+ /** Delete executions older than maxAge in terminal states */
14
+ cleanup(maxAgeMs: number, states?: string[]): number;
15
+ /** Archive executions older than maxAge to the archive table */
16
+ archive(maxAgeMs: number, states?: string[]): number;
17
+ /** Get archived execution count */
18
+ getArchivedCount(): number;
13
19
  close(): void;
14
20
  private rowToExecution;
15
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AA+BrE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAQpB;gBAEU,MAAM,CAAC,EAAE,MAAM;IAgC3B,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAe3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKjC,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAa7B,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,EAAE;IAchE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,cAAc;CAgBvB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,SAAS,CAAC;AA8CrE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAQpB;gBAEU,MAAM,CAAC,EAAE,MAAM;IAiC3B,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAe3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKjC,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAa7B,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,EAAE;IAchE,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAA4B,GAAG,MAAM;IAU7E,gEAAgE;IAChE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAA4B,GAAG,MAAM;IAyC7E,mCAAmC;IACnC,gBAAgB,IAAI,MAAM;IAO1B,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,cAAc;CAgBvB"}
@@ -26,6 +26,20 @@ CREATE TABLE IF NOT EXISTS workflow_executions (
26
26
  created_at INTEGER NOT NULL,
27
27
  updated_at INTEGER NOT NULL
28
28
  )`;
29
+ const CREATE_ARCHIVE_TABLE = `
30
+ CREATE TABLE IF NOT EXISTS workflow_executions_archive (
31
+ id TEXT PRIMARY KEY,
32
+ workflow_name TEXT NOT NULL,
33
+ state TEXT NOT NULL,
34
+ input BLOB,
35
+ steps BLOB,
36
+ current_node_index INTEGER NOT NULL DEFAULT 0,
37
+ resolved_steps BLOB,
38
+ signals BLOB,
39
+ created_at INTEGER NOT NULL,
40
+ updated_at INTEGER NOT NULL,
41
+ archived_at INTEGER NOT NULL
42
+ )`;
29
43
  const CREATE_IDX_NAME = `CREATE INDEX IF NOT EXISTS idx_wf_name ON workflow_executions(workflow_name)`;
30
44
  const CREATE_IDX_STATE = `CREATE INDEX IF NOT EXISTS idx_wf_state ON workflow_executions(state)`;
31
45
  export class WorkflowStore {
@@ -35,6 +49,7 @@ export class WorkflowStore {
35
49
  this.db = new Database(dbPath ?? ':memory:', { create: true });
36
50
  this.db.run('PRAGMA journal_mode = WAL');
37
51
  this.db.run(CREATE_TABLE);
52
+ this.db.run(CREATE_ARCHIVE_TABLE);
38
53
  this.db.run(CREATE_IDX_NAME);
39
54
  this.db.run(CREATE_IDX_STATE);
40
55
  this.stmts = {
@@ -82,6 +97,46 @@ export class WorkflowStore {
82
97
  }
83
98
  return rows.map((r) => this.rowToExecution(r));
84
99
  }
100
+ /** Delete executions older than maxAge in terminal states */
101
+ cleanup(maxAgeMs, states = ['completed', 'failed']) {
102
+ const cutoff = Date.now() - maxAgeMs;
103
+ const placeholders = states.map(() => '?').join(',');
104
+ const stmt = this.db.prepare(`DELETE FROM workflow_executions WHERE updated_at < ? AND state IN (${placeholders})`);
105
+ const result = stmt.run(cutoff, ...states);
106
+ return result.changes;
107
+ }
108
+ /** Archive executions older than maxAge to the archive table */
109
+ archive(maxAgeMs, states = ['completed', 'failed']) {
110
+ const cutoff = Date.now() - maxAgeMs;
111
+ const now = Date.now();
112
+ const placeholders = states.map(() => '?').join(',');
113
+ const rows = this.db
114
+ .prepare(`SELECT * FROM workflow_executions WHERE updated_at < ? AND state IN (${placeholders}) LIMIT 1000`)
115
+ .all(cutoff, ...states);
116
+ if (rows.length === 0)
117
+ return 0;
118
+ const insertArchive = this.db.prepare(`
119
+ INSERT OR REPLACE INTO workflow_executions_archive
120
+ (id, workflow_name, state, input, steps, current_node_index, resolved_steps, signals, created_at, updated_at, archived_at)
121
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
122
+ `);
123
+ const deleteOriginal = this.db.prepare(`DELETE FROM workflow_executions WHERE id = ?`);
124
+ const tx = this.db.transaction(() => {
125
+ for (const row of rows) {
126
+ insertArchive.run(row.id, row.workflow_name, row.state, row.input, row.steps, row.current_node_index, row.resolved_steps, row.signals, row.created_at, row.updated_at, now);
127
+ deleteOriginal.run(row.id);
128
+ }
129
+ });
130
+ tx();
131
+ return rows.length;
132
+ }
133
+ /** Get archived execution count */
134
+ getArchivedCount() {
135
+ const row = this.db
136
+ .prepare(`SELECT COUNT(*) as cnt FROM workflow_executions_archive`)
137
+ .get();
138
+ return row.cnt;
139
+ }
85
140
  close() {
86
141
  this.db.close();
87
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/client/workflow/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/client/workflow/store.ts"],"names":[],"mappings":"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"}
@@ -17,11 +17,19 @@ export interface StepContext<TInput = unknown> {
17
17
  export type StepHandler<TInput = unknown, TResult = unknown> = (ctx: StepContext<TInput>) => Promise<TResult> | TResult;
18
18
  /** Compensate handler (rollback on failure) */
19
19
  export type CompensateHandler<TInput = unknown> = (ctx: StepContext<TInput>) => Promise<void> | void;
20
+ /** Schema-like object — any object with a .parse() method (Zod, ArkType, Valibot, etc.) */
21
+ export interface SchemaLike {
22
+ parse(data: unknown): unknown;
23
+ }
20
24
  /** Options for a single step */
21
25
  export interface StepOptions<TInput = unknown> {
22
26
  retry?: number;
23
27
  timeout?: number;
24
28
  compensate?: CompensateHandler<TInput>;
29
+ /** Validate step input before execution */
30
+ inputSchema?: SchemaLike;
31
+ /** Validate step output after execution */
32
+ outputSchema?: SchemaLike;
25
33
  }
26
34
  /** Internal step definition */
27
35
  export interface StepDefinition {
@@ -30,6 +38,8 @@ export interface StepDefinition {
30
38
  compensate?: CompensateHandler;
31
39
  retry: number;
32
40
  timeout: number;
41
+ inputSchema?: SchemaLike;
42
+ outputSchema?: SchemaLike;
33
43
  }
34
44
  /** Branch condition function */
35
45
  export type BranchCondition = (ctx: StepContext) => string;
@@ -38,6 +48,35 @@ export interface BranchDefinition {
38
48
  condition: BranchCondition;
39
49
  paths: Map<string, StepDefinition[]>;
40
50
  }
51
+ /** Definition of a parallel step group */
52
+ export interface ParallelDefinition {
53
+ steps: StepDefinition[];
54
+ }
55
+ /** Input mapper for sub-workflows */
56
+ export type SubWorkflowInputMapper = (ctx: StepContext) => unknown;
57
+ /** Loop condition: receives context + iteration count, returns boolean */
58
+ export type LoopCondition = (ctx: StepContext, iteration: number) => boolean | Promise<boolean>;
59
+ /** Definition of a doUntil/doWhile loop */
60
+ export interface LoopDefinition {
61
+ condition: LoopCondition;
62
+ steps: StepDefinition[];
63
+ maxIterations: number;
64
+ }
65
+ /** Item extractor for forEach */
66
+ export type ForEachItemsExtractor = (ctx: StepContext) => unknown[];
67
+ /** Definition of a forEach loop */
68
+ export interface ForEachDefinition {
69
+ items: ForEachItemsExtractor;
70
+ step: StepDefinition;
71
+ maxIterations: number;
72
+ }
73
+ /** Transform function for map */
74
+ export type MapTransformFn = (ctx: StepContext) => unknown;
75
+ /** Definition of a map node */
76
+ export interface MapDefinition {
77
+ name: string;
78
+ transform: MapTransformFn;
79
+ }
41
80
  /** Workflow node (discriminated union) */
42
81
  export type WorkflowNode = {
43
82
  type: 'step';
@@ -49,6 +88,25 @@ export type WorkflowNode = {
49
88
  type: 'waitFor';
50
89
  event: string;
51
90
  timeout?: number;
91
+ } | {
92
+ type: 'parallel';
93
+ def: ParallelDefinition;
94
+ } | {
95
+ type: 'subWorkflow';
96
+ name: string;
97
+ inputMapper: SubWorkflowInputMapper;
98
+ } | {
99
+ type: 'doUntil';
100
+ def: LoopDefinition;
101
+ } | {
102
+ type: 'doWhile';
103
+ def: LoopDefinition;
104
+ } | {
105
+ type: 'forEach';
106
+ def: ForEachDefinition;
107
+ } | {
108
+ type: 'map';
109
+ def: MapDefinition;
52
110
  };
53
111
  /** Execution state */
54
112
  export type ExecutionState = 'running' | 'waiting' | 'completed' | 'failed' | 'compensating';
@@ -61,6 +119,7 @@ export interface StepRecord {
61
119
  error?: string;
62
120
  startedAt?: number;
63
121
  completedAt?: number;
122
+ attempts?: number;
64
123
  }
65
124
  /** Full execution state */
66
125
  export interface Execution {
@@ -76,6 +135,35 @@ export interface Execution {
76
135
  createdAt: number;
77
136
  updatedAt: number;
78
137
  }
138
+ /** All workflow event types */
139
+ export type WorkflowEventType = 'step:started' | 'step:completed' | 'step:failed' | 'step:retry' | 'workflow:started' | 'workflow:completed' | 'workflow:failed' | 'workflow:compensating' | 'workflow:waiting' | 'signal:received' | 'signal:timeout';
140
+ /** Base event payload */
141
+ export interface WorkflowEvent {
142
+ type: WorkflowEventType;
143
+ executionId: string;
144
+ workflowName: string;
145
+ timestamp: number;
146
+ }
147
+ /** Step-level event payload */
148
+ export interface StepEvent extends WorkflowEvent {
149
+ stepName: string;
150
+ result?: unknown;
151
+ error?: string;
152
+ attempt?: number;
153
+ maxAttempts?: number;
154
+ }
155
+ /** Workflow lifecycle event payload */
156
+ export interface WorkflowLifecycleEvent extends WorkflowEvent {
157
+ state: ExecutionState;
158
+ input?: unknown;
159
+ }
160
+ /** Signal event payload */
161
+ export interface SignalEvent extends WorkflowEvent {
162
+ event: string;
163
+ payload?: unknown;
164
+ }
165
+ /** Event listener function */
166
+ export type WorkflowEventListener = (event: WorkflowEvent | StepEvent | WorkflowLifecycleEvent | SignalEvent) => void;
79
167
  /** Engine configuration */
80
168
  export interface EngineOptions {
81
169
  embedded?: boolean;
@@ -85,6 +173,8 @@ export interface EngineOptions {
85
173
  queueName?: string;
86
174
  /** Worker concurrency (default: 5) */
87
175
  concurrency?: number;
176
+ /** Global event listener for observability */
177
+ onEvent?: WorkflowEventListener;
88
178
  }
89
179
  /** Handle returned from engine.start() */
90
180
  export interface RunHandle {
@@ -97,4 +187,9 @@ export interface StepJobData {
97
187
  workflowName: string;
98
188
  nodeIndex: number;
99
189
  }
190
+ /** Options for cleanup */
191
+ export interface CleanupOptions {
192
+ maxAge: number;
193
+ states?: ExecutionState[];
194
+ }
100
195
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,sCAAsC;AACtC,MAAM,WAAW,WAAW,CAAC,MAAM,GAAG,OAAO;IAC3C,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,4BAA4B;AAC5B,MAAM,MAAM,WAAW,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CAC7D,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,KACrB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,+CAA+C;AAC/C,MAAM,MAAM,iBAAiB,CAAC,MAAM,GAAG,OAAO,IAAI,CAChD,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,KACrB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CAC/B;AAED,gCAAgC;AAChC,MAAM,WAAW,WAAW,CAAC,MAAM,GAAG,OAAO;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,2CAA2C;IAC3C,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,+BAA+B;AAC/B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;AAE3D,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;CACtC;AAED,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,qCAAqC;AACrC,MAAM,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhG,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,iCAAiC;AACjC,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,EAAE,CAAC;AAEpE,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,iCAAiC;AACjC,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;AAE3D,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,gBAAgB,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,kBAAkB,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,sBAAsB,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,aAAa,CAAA;CAAE,CAAC;AAExC,sBAAsB;AACtB,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE7F,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEvE,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,YAAY,GACZ,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,GACjB,uBAAuB,GACvB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,yBAAyB;AACzB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,sBAAsB,GAAG,WAAW,KACpE,IAAI,CAAC;AAEV,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B"}
@@ -2,7 +2,7 @@
2
2
  * Workflow - DSL builder for defining workflow step graphs
3
3
  * Pure data structure, no side effects.
4
4
  */
5
- import type { WorkflowNode, StepHandler, StepOptions, BranchCondition } from './types';
5
+ import type { WorkflowNode, StepHandler, StepOptions, StepContext, BranchCondition, LoopCondition, ForEachItemsExtractor, MapTransformFn } from './types';
6
6
  export declare class Workflow<TInput = unknown> {
7
7
  readonly name: string;
8
8
  readonly nodes: WorkflowNode[];
@@ -13,10 +13,28 @@ export declare class Workflow<TInput = unknown> {
13
13
  branch(condition: BranchCondition): this;
14
14
  /** Define a branch path (must follow a .branch() call) */
15
15
  path(name: string, builder: (w: Workflow<TInput>) => Workflow<TInput>): this;
16
+ /** Run multiple steps in parallel */
17
+ parallel(builder: (w: Workflow<TInput>) => Workflow<TInput>): this;
18
+ /** Call another registered workflow as a step */
19
+ subWorkflow(name: string, inputMapper: (ctx: StepContext<TInput>) => unknown): this;
16
20
  /** Wait for an external signal before continuing */
17
21
  waitFor(event: string, options?: {
18
22
  timeout?: number;
19
23
  }): this;
24
+ /** Repeat steps until condition returns true (checked after each iteration) */
25
+ doUntil(condition: LoopCondition, builder: (w: Workflow<TInput>) => Workflow<TInput>, options?: {
26
+ maxIterations?: number;
27
+ }): this;
28
+ /** Repeat steps while condition returns true (checked before each iteration) */
29
+ doWhile(condition: LoopCondition, builder: (w: Workflow<TInput>) => Workflow<TInput>, options?: {
30
+ maxIterations?: number;
31
+ }): this;
32
+ /** Iterate over items, executing a step for each */
33
+ forEach(items: ForEachItemsExtractor, name: string, handler: StepHandler<TInput>, options?: StepOptions<TInput> & {
34
+ maxIterations?: number;
35
+ }): this;
36
+ /** Transform step results into a new value stored under the given name */
37
+ map(name: string, transform: MapTransformFn): this;
20
38
  /** Get flat list of step names for validation */
21
39
  getStepNames(): string[];
22
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/workflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,WAAW,EAEX,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ,CAAC,MAAM,GAAG,OAAO;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAM;gBAExB,IAAI,EAAE,MAAM;IAIxB,iCAAiC;IACjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAcrF,mEAAmE;IACnE,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAQxC,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAc5E,oDAAoD;IACpD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAS5D,iDAAiD;IACjD,YAAY,IAAI,MAAM,EAAE;CAazB"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../../src/client/workflow/workflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EAEX,WAAW,EAEX,WAAW,EACX,eAAe,EAEf,aAAa,EACb,qBAAqB,EACrB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,qBAAa,QAAQ,CAAC,MAAM,GAAG,OAAO;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAM;gBAExB,IAAI,EAAE,MAAM;IAIxB,iCAAiC;IACjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAgBrF,mEAAmE;IACnE,MAAM,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAQxC,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAc5E,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI;IAalE,iDAAiD;IACjD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,IAAI;IASnF,oDAAoD;IACpD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAS5D,+EAA+E;IAC/E,OAAO,CACL,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAClD,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACnC,IAAI;IAcP,gFAAgF;IAChF,OAAO,CACL,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EAClD,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACnC,IAAI;IAcP,oDAAoD;IACpD,OAAO,CACL,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAC5B,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,IAAI;IAiBP,0EAA0E;IAC1E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI;IAKlD,iDAAiD;IACjD,YAAY,IAAI,MAAM,EAAE;CAuBzB"}
@@ -18,6 +18,8 @@ export class Workflow {
18
18
  compensate: options?.compensate,
19
19
  retry: options?.retry ?? 3,
20
20
  timeout: options?.timeout ?? 30_000,
21
+ inputSchema: options?.inputSchema,
22
+ outputSchema: options?.outputSchema,
21
23
  },
22
24
  });
23
25
  return this;
@@ -44,6 +46,28 @@ export class Workflow {
44
46
  lastNode.def.paths.set(name, steps);
45
47
  return this;
46
48
  }
49
+ /** Run multiple steps in parallel */
50
+ parallel(builder) {
51
+ const sub = new Workflow(`${this.name}:parallel`);
52
+ builder(sub);
53
+ const steps = sub.nodes
54
+ .filter((n) => n.type === 'step')
55
+ .map((n) => n.def);
56
+ if (steps.length === 0) {
57
+ throw new Error('parallel() requires at least one step');
58
+ }
59
+ this.nodes.push({ type: 'parallel', def: { steps } });
60
+ return this;
61
+ }
62
+ /** Call another registered workflow as a step */
63
+ subWorkflow(name, inputMapper) {
64
+ this.nodes.push({
65
+ type: 'subWorkflow',
66
+ name,
67
+ inputMapper: inputMapper,
68
+ });
69
+ return this;
70
+ }
47
71
  /** Wait for an external signal before continuing */
48
72
  waitFor(event, options) {
49
73
  this.nodes.push({
@@ -53,6 +77,58 @@ export class Workflow {
53
77
  });
54
78
  return this;
55
79
  }
80
+ /** Repeat steps until condition returns true (checked after each iteration) */
81
+ doUntil(condition, builder, options) {
82
+ const sub = new Workflow(`${this.name}:doUntil`);
83
+ builder(sub);
84
+ const steps = sub.nodes
85
+ .filter((n) => n.type === 'step')
86
+ .map((n) => n.def);
87
+ if (steps.length === 0)
88
+ throw new Error('doUntil() requires at least one step');
89
+ this.nodes.push({
90
+ type: 'doUntil',
91
+ def: { condition, steps, maxIterations: options?.maxIterations ?? 100 },
92
+ });
93
+ return this;
94
+ }
95
+ /** Repeat steps while condition returns true (checked before each iteration) */
96
+ doWhile(condition, builder, options) {
97
+ const sub = new Workflow(`${this.name}:doWhile`);
98
+ builder(sub);
99
+ const steps = sub.nodes
100
+ .filter((n) => n.type === 'step')
101
+ .map((n) => n.def);
102
+ if (steps.length === 0)
103
+ throw new Error('doWhile() requires at least one step');
104
+ this.nodes.push({
105
+ type: 'doWhile',
106
+ def: { condition, steps, maxIterations: options?.maxIterations ?? 100 },
107
+ });
108
+ return this;
109
+ }
110
+ /** Iterate over items, executing a step for each */
111
+ forEach(items, name, handler, options) {
112
+ const step = {
113
+ name,
114
+ handler: handler,
115
+ compensate: options?.compensate,
116
+ retry: options?.retry ?? 3,
117
+ timeout: options?.timeout ?? 30_000,
118
+ inputSchema: options?.inputSchema,
119
+ outputSchema: options?.outputSchema,
120
+ };
121
+ this.nodes.push({
122
+ type: 'forEach',
123
+ def: { items, step, maxIterations: options?.maxIterations ?? 1000 },
124
+ });
125
+ return this;
126
+ }
127
+ /** Transform step results into a new value stored under the given name */
128
+ map(name, transform) {
129
+ this.nodes.push({ type: 'map', def: { name, transform } });
130
+ return this;
131
+ }
56
132
  /** Get flat list of step names for validation */
57
133
  getStepNames() {
58
134
  const names = [];
@@ -66,6 +142,23 @@ export class Workflow {
66
142
  names.push(s.name);
67
143
  }
68
144
  }
145
+ else if (node.type === 'parallel') {
146
+ for (const s of node.def.steps)
147
+ names.push(s.name);
148
+ }
149
+ else if (node.type === 'subWorkflow') {
150
+ names.push(`sub:${node.name}`);
151
+ }
152
+ else if (node.type === 'doUntil' || node.type === 'doWhile') {
153
+ for (const s of node.def.steps)
154
+ names.push(s.name);
155
+ }
156
+ else if (node.type === 'forEach') {
157
+ names.push(node.def.step.name);
158
+ }
159
+ else if (node.type === 'map') {
160
+ names.push(node.def.name);
161
+ }
69
162
  }
70
163
  return names;
71
164
  }