@marktoflow/core 2.0.2 → 2.0.4

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 (183) hide show
  1. package/README.md +69 -6
  2. package/dist/built-in-operations.d.ts +2 -136
  3. package/dist/built-in-operations.d.ts.map +1 -1
  4. package/dist/built-in-operations.js +7 -743
  5. package/dist/built-in-operations.js.map +1 -1
  6. package/dist/engine/conditions.d.ts +29 -0
  7. package/dist/engine/conditions.d.ts.map +1 -0
  8. package/dist/engine/conditions.js +109 -0
  9. package/dist/engine/conditions.js.map +1 -0
  10. package/dist/engine/control-flow.d.ts +35 -0
  11. package/dist/engine/control-flow.d.ts.map +1 -0
  12. package/dist/engine/control-flow.js +653 -0
  13. package/dist/engine/control-flow.js.map +1 -0
  14. package/dist/engine/index.d.ts +12 -0
  15. package/dist/engine/index.d.ts.map +1 -0
  16. package/dist/engine/index.js +11 -0
  17. package/dist/engine/index.js.map +1 -0
  18. package/dist/engine/retry.d.ts +35 -0
  19. package/dist/engine/retry.d.ts.map +1 -0
  20. package/dist/engine/retry.js +86 -0
  21. package/dist/engine/retry.js.map +1 -0
  22. package/dist/engine/subworkflow.d.ts +31 -0
  23. package/dist/engine/subworkflow.d.ts.map +1 -0
  24. package/dist/engine/subworkflow.js +240 -0
  25. package/dist/engine/subworkflow.js.map +1 -0
  26. package/dist/engine/types.d.ts +55 -0
  27. package/dist/engine/types.d.ts.map +1 -0
  28. package/dist/engine/types.js +5 -0
  29. package/dist/{secrets → engine}/types.js.map +1 -1
  30. package/dist/engine/variable-resolution.d.ts +29 -0
  31. package/dist/engine/variable-resolution.d.ts.map +1 -0
  32. package/dist/engine/variable-resolution.js +130 -0
  33. package/dist/engine/variable-resolution.js.map +1 -0
  34. package/dist/engine.d.ts +17 -211
  35. package/dist/engine.d.ts.map +1 -1
  36. package/dist/engine.js +84 -1351
  37. package/dist/engine.js.map +1 -1
  38. package/dist/file-operations.js +1 -1
  39. package/dist/file-operations.js.map +1 -1
  40. package/dist/filters/array.d.ts +9 -0
  41. package/dist/filters/array.d.ts.map +1 -0
  42. package/dist/filters/array.js +41 -0
  43. package/dist/filters/array.js.map +1 -0
  44. package/dist/filters/date.d.ts +9 -0
  45. package/dist/filters/date.d.ts.map +1 -0
  46. package/dist/filters/date.js +51 -0
  47. package/dist/filters/date.js.map +1 -0
  48. package/dist/filters/index.d.ts +13 -0
  49. package/dist/filters/index.d.ts.map +1 -0
  50. package/dist/filters/index.js +13 -0
  51. package/dist/filters/index.js.map +1 -0
  52. package/dist/filters/json.d.ts +6 -0
  53. package/dist/filters/json.d.ts.map +1 -0
  54. package/dist/filters/json.js +15 -0
  55. package/dist/filters/json.js.map +1 -0
  56. package/dist/filters/logic.d.ts +8 -0
  57. package/dist/filters/logic.d.ts.map +1 -0
  58. package/dist/filters/logic.js +28 -0
  59. package/dist/filters/logic.js.map +1 -0
  60. package/dist/filters/math.d.ts +13 -0
  61. package/dist/filters/math.d.ts.map +1 -0
  62. package/dist/filters/math.js +39 -0
  63. package/dist/filters/math.js.map +1 -0
  64. package/dist/filters/object.d.ts +11 -0
  65. package/dist/filters/object.d.ts.map +1 -0
  66. package/dist/filters/object.js +64 -0
  67. package/dist/filters/object.js.map +1 -0
  68. package/dist/filters/regex.d.ts +7 -0
  69. package/dist/filters/regex.d.ts.map +1 -0
  70. package/dist/filters/regex.js +38 -0
  71. package/dist/filters/regex.js.map +1 -0
  72. package/dist/filters/string.d.ts +11 -0
  73. package/dist/filters/string.d.ts.map +1 -0
  74. package/dist/filters/string.js +35 -0
  75. package/dist/filters/string.js.map +1 -0
  76. package/dist/filters/type-checks.d.ts +10 -0
  77. package/dist/filters/type-checks.d.ts.map +1 -0
  78. package/dist/filters/type-checks.js +30 -0
  79. package/dist/filters/type-checks.js.map +1 -0
  80. package/dist/index.d.ts +5 -1
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +7 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/nunjucks-filters.d.ts +2 -261
  85. package/dist/nunjucks-filters.d.ts.map +1 -1
  86. package/dist/nunjucks-filters.js +24 -582
  87. package/dist/nunjucks-filters.js.map +1 -1
  88. package/dist/operations/compress.d.ts +6 -0
  89. package/dist/operations/compress.d.ts.map +1 -0
  90. package/dist/operations/compress.js +36 -0
  91. package/dist/operations/compress.js.map +1 -0
  92. package/dist/operations/crypto.d.ts +5 -0
  93. package/dist/operations/crypto.d.ts.map +1 -0
  94. package/dist/operations/crypto.js +61 -0
  95. package/dist/operations/crypto.js.map +1 -0
  96. package/dist/operations/data-ops.d.ts +10 -0
  97. package/dist/operations/data-ops.d.ts.map +1 -0
  98. package/dist/operations/data-ops.js +124 -0
  99. package/dist/operations/data-ops.js.map +1 -0
  100. package/dist/operations/datetime.d.ts +5 -0
  101. package/dist/operations/datetime.d.ts.map +1 -0
  102. package/dist/operations/datetime.js +86 -0
  103. package/dist/operations/datetime.js.map +1 -0
  104. package/dist/operations/extract.d.ts +23 -0
  105. package/dist/operations/extract.d.ts.map +1 -0
  106. package/dist/operations/extract.js +31 -0
  107. package/dist/operations/extract.js.map +1 -0
  108. package/dist/operations/format.d.ts +14 -0
  109. package/dist/operations/format.d.ts.map +1 -0
  110. package/dist/operations/format.js +84 -0
  111. package/dist/operations/format.js.map +1 -0
  112. package/dist/operations/index.d.ts +13 -0
  113. package/dist/operations/index.d.ts.map +1 -0
  114. package/dist/operations/index.js +13 -0
  115. package/dist/operations/index.js.map +1 -0
  116. package/dist/operations/parse.d.ts +5 -0
  117. package/dist/operations/parse.d.ts.map +1 -0
  118. package/dist/operations/parse.js +59 -0
  119. package/dist/operations/parse.js.map +1 -0
  120. package/dist/operations/set.d.ts +21 -0
  121. package/dist/operations/set.d.ts.map +1 -0
  122. package/dist/operations/set.js +25 -0
  123. package/dist/operations/set.js.map +1 -0
  124. package/dist/operations/transform.d.ts +15 -0
  125. package/dist/operations/transform.d.ts.map +1 -0
  126. package/dist/operations/transform.js +110 -0
  127. package/dist/operations/transform.js.map +1 -0
  128. package/dist/parallel.d.ts +114 -0
  129. package/dist/parallel.d.ts.map +1 -0
  130. package/dist/parallel.js +325 -0
  131. package/dist/parallel.js.map +1 -0
  132. package/dist/parser.d.ts.map +1 -1
  133. package/dist/parser.js +2 -0
  134. package/dist/parser.js.map +1 -1
  135. package/dist/routing.js +2 -2
  136. package/dist/routing.js.map +1 -1
  137. package/dist/sdk-registry.d.ts.map +1 -1
  138. package/dist/sdk-registry.js +9 -3
  139. package/dist/sdk-registry.js.map +1 -1
  140. package/dist/utils/duration.d.ts +23 -0
  141. package/dist/utils/duration.d.ts.map +1 -0
  142. package/dist/utils/duration.js +41 -0
  143. package/dist/utils/duration.js.map +1 -0
  144. package/dist/utils/errors.d.ts +20 -0
  145. package/dist/utils/errors.d.ts.map +1 -0
  146. package/dist/utils/errors.js +37 -0
  147. package/dist/utils/errors.js.map +1 -0
  148. package/dist/utils/index.d.ts +3 -0
  149. package/dist/utils/index.d.ts.map +1 -0
  150. package/dist/utils/index.js +3 -0
  151. package/dist/utils/index.js.map +1 -0
  152. package/dist/workflow-templates.d.ts +80 -0
  153. package/dist/workflow-templates.d.ts.map +1 -0
  154. package/dist/workflow-templates.js +248 -0
  155. package/dist/workflow-templates.js.map +1 -0
  156. package/package.json +30 -5
  157. package/dist/secrets/index.d.ts +0 -12
  158. package/dist/secrets/index.d.ts.map +0 -1
  159. package/dist/secrets/index.js +0 -11
  160. package/dist/secrets/index.js.map +0 -1
  161. package/dist/secrets/providers/aws.d.ts +0 -32
  162. package/dist/secrets/providers/aws.d.ts.map +0 -1
  163. package/dist/secrets/providers/aws.js +0 -118
  164. package/dist/secrets/providers/aws.js.map +0 -1
  165. package/dist/secrets/providers/azure.d.ts +0 -40
  166. package/dist/secrets/providers/azure.d.ts.map +0 -1
  167. package/dist/secrets/providers/azure.js +0 -170
  168. package/dist/secrets/providers/azure.js.map +0 -1
  169. package/dist/secrets/providers/env.d.ts +0 -26
  170. package/dist/secrets/providers/env.d.ts.map +0 -1
  171. package/dist/secrets/providers/env.js +0 -59
  172. package/dist/secrets/providers/env.js.map +0 -1
  173. package/dist/secrets/providers/vault.d.ts +0 -39
  174. package/dist/secrets/providers/vault.d.ts.map +0 -1
  175. package/dist/secrets/providers/vault.js +0 -180
  176. package/dist/secrets/providers/vault.js.map +0 -1
  177. package/dist/secrets/secret-manager.d.ts +0 -72
  178. package/dist/secrets/secret-manager.d.ts.map +0 -1
  179. package/dist/secrets/secret-manager.js +0 -226
  180. package/dist/secrets/secret-manager.js.map +0 -1
  181. package/dist/secrets/types.d.ts +0 -105
  182. package/dist/secrets/types.d.ts.map +0 -1
  183. package/dist/secrets/types.js +0 -8
@@ -0,0 +1,59 @@
1
+ /**
2
+ * core.parse — Parse structured data formats (json, csv, xml, yaml, url_params).
3
+ */
4
+ export function executeParse(inputs) {
5
+ const data = inputs.data;
6
+ const format = inputs.format;
7
+ if (!data || typeof data !== 'string')
8
+ throw new Error('core.parse: data must be a string');
9
+ if (!format)
10
+ throw new Error('core.parse: format is required');
11
+ switch (format) {
12
+ case 'json':
13
+ return JSON.parse(data);
14
+ case 'csv': {
15
+ const delimiter = inputs.delimiter ?? ',';
16
+ const hasHeader = inputs.header ?? true;
17
+ const lines = data.split('\n').filter((l) => l.trim());
18
+ if (lines.length === 0)
19
+ return [];
20
+ if (hasHeader) {
21
+ const headers = lines[0].split(delimiter).map((h) => h.trim());
22
+ return lines.slice(1).map((line) => {
23
+ const values = line.split(delimiter);
24
+ const obj = {};
25
+ headers.forEach((h, i) => { obj[h] = (values[i] ?? '').trim(); });
26
+ return obj;
27
+ });
28
+ }
29
+ return lines.map((line) => line.split(delimiter).map((v) => v.trim()));
30
+ }
31
+ case 'xml': {
32
+ const result = {};
33
+ const tagRegex = /<(\w+)(?:\s[^>]*)?>([^<]*)<\/\1>/g;
34
+ let match;
35
+ while ((match = tagRegex.exec(data)) !== null) {
36
+ result[match[1]] = match[2].trim();
37
+ }
38
+ return result;
39
+ }
40
+ case 'yaml': {
41
+ try {
42
+ const yaml = require('yaml');
43
+ return yaml.parse(data);
44
+ }
45
+ catch {
46
+ throw new Error('core.parse: yaml format requires the "yaml" package');
47
+ }
48
+ }
49
+ case 'url_params': {
50
+ const params = new URLSearchParams(data);
51
+ const result = {};
52
+ params.forEach((value, key) => { result[key] = value; });
53
+ return result;
54
+ }
55
+ default:
56
+ throw new Error(`core.parse: unknown format "${format}"`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/operations/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * core.set — Simple variable assignment.
3
+ */
4
+ import { ExecutionContext } from '../models.js';
5
+ export interface SetOperationInputs {
6
+ [key: string]: unknown;
7
+ }
8
+ /**
9
+ * Set multiple variables at once with expression resolution.
10
+ *
11
+ * Example:
12
+ * ```yaml
13
+ * action: core.set
14
+ * inputs:
15
+ * owner: "{{ inputs.repo =~ /^([^\/]+)\// }}"
16
+ * repo_name: "{{ inputs.repo =~ /\/(.+)$/ }}"
17
+ * timestamp: "{{ now() }}"
18
+ * ```
19
+ */
20
+ export declare function executeSet(inputs: SetOperationInputs, context: ExecutionContext): Record<string, unknown>;
21
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/operations/set.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * core.set — Simple variable assignment.
3
+ */
4
+ import { resolveTemplates } from '../engine/variable-resolution.js';
5
+ /**
6
+ * Set multiple variables at once with expression resolution.
7
+ *
8
+ * Example:
9
+ * ```yaml
10
+ * action: core.set
11
+ * inputs:
12
+ * owner: "{{ inputs.repo =~ /^([^\/]+)\// }}"
13
+ * repo_name: "{{ inputs.repo =~ /\/(.+)$/ }}"
14
+ * timestamp: "{{ now() }}"
15
+ * ```
16
+ */
17
+ export function executeSet(inputs, context) {
18
+ const result = {};
19
+ for (const [key, value] of Object.entries(inputs)) {
20
+ const resolved = resolveTemplates(value, context);
21
+ result[key] = resolved;
22
+ }
23
+ return result;
24
+ }
25
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/operations/set.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAMpE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,MAA0B,EAC1B,OAAyB;IAEzB,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * core.transform — Array transformations (map, filter, reduce, find, group_by, unique, sort).
3
+ */
4
+ import { ExecutionContext } from '../models.js';
5
+ export interface TransformOperationInputs {
6
+ input: unknown[];
7
+ operation: 'map' | 'filter' | 'reduce' | 'find' | 'group_by' | 'unique' | 'sort';
8
+ expression?: string;
9
+ condition?: string;
10
+ initialValue?: unknown;
11
+ key?: string;
12
+ reverse?: boolean;
13
+ }
14
+ export declare function executeTransform(rawInputs: TransformOperationInputs, resolvedInputs: Record<string, unknown>, context: ExecutionContext): unknown;
15
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/operations/transform.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,wBAAwB,EACnC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CA4BT"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * core.transform — Array transformations (map, filter, reduce, find, group_by, unique, sort).
3
+ */
4
+ import { resolveTemplates, resolveVariablePath } from '../engine/variable-resolution.js';
5
+ export function executeTransform(rawInputs, resolvedInputs, context) {
6
+ const input = resolvedInputs.input;
7
+ if (!Array.isArray(input)) {
8
+ throw new Error('Transform input must be an array');
9
+ }
10
+ const operation = rawInputs.operation;
11
+ switch (operation) {
12
+ case 'map':
13
+ return transformMap(input, rawInputs.expression || '{{ item }}', context);
14
+ case 'filter':
15
+ return transformFilter(input, rawInputs.condition || 'item', context);
16
+ case 'reduce':
17
+ return transformReduce(input, rawInputs.expression || '{{ accumulator }}', resolvedInputs.initialValue, context);
18
+ case 'find':
19
+ return transformFind(input, rawInputs.condition || 'item', context);
20
+ case 'group_by':
21
+ if (!rawInputs.key)
22
+ throw new Error('group_by operation requires "key" parameter');
23
+ return transformGroupBy(input, rawInputs.key, context);
24
+ case 'unique':
25
+ return transformUnique(input, rawInputs.key, context);
26
+ case 'sort':
27
+ return transformSort(input, rawInputs.key, resolvedInputs.reverse || false, context);
28
+ default:
29
+ throw new Error(`Unknown transform operation: ${operation}`);
30
+ }
31
+ }
32
+ function transformMap(items, expression, context) {
33
+ return items.map((item) => {
34
+ const itemContext = { ...context, variables: { ...context.variables, item } };
35
+ return resolveTemplates(expression, itemContext);
36
+ });
37
+ }
38
+ function transformFilter(items, condition, context) {
39
+ return items.filter((item) => {
40
+ const itemContext = { ...context, variables: { ...context.variables, item } };
41
+ const resolved = resolveTemplates(condition, itemContext);
42
+ return Boolean(resolved);
43
+ });
44
+ }
45
+ function transformReduce(items, expression, initialValue, context) {
46
+ let accumulator = initialValue !== undefined ? initialValue : null;
47
+ for (const item of items) {
48
+ const reduceContext = {
49
+ ...context,
50
+ variables: { ...context.variables, item, accumulator },
51
+ };
52
+ accumulator = resolveTemplates(expression, reduceContext);
53
+ }
54
+ return accumulator;
55
+ }
56
+ function transformFind(items, condition, context) {
57
+ for (const item of items) {
58
+ const itemContext = { ...context, variables: { ...context.variables, item } };
59
+ const resolved = resolveTemplates(condition, itemContext);
60
+ if (Boolean(resolved))
61
+ return item;
62
+ }
63
+ return undefined;
64
+ }
65
+ function transformGroupBy(items, key, context) {
66
+ const groups = {};
67
+ for (const item of items) {
68
+ const itemContext = { ...context, variables: { ...context.variables, item } };
69
+ const groupKey = String(resolveVariablePath(key, itemContext));
70
+ if (!groups[groupKey])
71
+ groups[groupKey] = [];
72
+ groups[groupKey].push(item);
73
+ }
74
+ return groups;
75
+ }
76
+ function transformUnique(items, key, context) {
77
+ if (!key)
78
+ return Array.from(new Set(items));
79
+ const seen = new Set();
80
+ const result = [];
81
+ for (const item of items) {
82
+ const itemContext = { ...context, variables: { ...context.variables, item } };
83
+ const keyValue = String(resolveVariablePath(key, itemContext));
84
+ if (!seen.has(keyValue)) {
85
+ seen.add(keyValue);
86
+ result.push(item);
87
+ }
88
+ }
89
+ return result;
90
+ }
91
+ function transformSort(items, key, reverse, context) {
92
+ const sorted = [...items];
93
+ sorted.sort((a, b) => {
94
+ let aVal = a;
95
+ let bVal = b;
96
+ if (key) {
97
+ const aContext = { ...context, variables: { ...context.variables, item: a } };
98
+ const bContext = { ...context, variables: { ...context.variables, item: b } };
99
+ aVal = resolveVariablePath(key, aContext);
100
+ bVal = resolveVariablePath(key, bContext);
101
+ }
102
+ if (typeof aVal === 'number' && typeof bVal === 'number')
103
+ return aVal - bVal;
104
+ if (typeof aVal === 'string' && typeof bVal === 'string')
105
+ return aVal.localeCompare(bVal);
106
+ return String(aVal).localeCompare(String(bVal));
107
+ });
108
+ return reverse ? sorted.reverse() : sorted;
109
+ }
110
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/operations/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Parallel Agent Orchestration for marktoflow
3
+ *
4
+ * Provides parallel execution of multiple AI agents with various wait strategies.
5
+ * - parallel.spawn: Execute multiple AI agents concurrently
6
+ * - parallel.map: Map a function over a collection with parallel agent execution
7
+ */
8
+ import { ExecutionContext, WorkflowStep } from './models.js';
9
+ import type { StepExecutorContext, SDKRegistryLike } from './engine/types.js';
10
+ export interface AgentConfig {
11
+ id: string;
12
+ provider: string;
13
+ model?: string;
14
+ prompt: string;
15
+ inputs?: Record<string, unknown>;
16
+ }
17
+ export interface ParallelSpawnInputs {
18
+ agents: AgentConfig[];
19
+ wait?: 'all' | 'any' | 'majority' | number;
20
+ timeout?: string;
21
+ onError?: 'fail' | 'continue' | 'partial';
22
+ }
23
+ export interface ParallelMapInputs {
24
+ items: unknown[];
25
+ agent: {
26
+ provider: string;
27
+ model?: string;
28
+ prompt: string;
29
+ };
30
+ concurrency?: number;
31
+ timeout?: string;
32
+ onError?: 'fail' | 'continue' | 'partial';
33
+ }
34
+ export interface AgentResult {
35
+ id: string;
36
+ success: boolean;
37
+ output?: unknown;
38
+ error?: string;
39
+ timing: {
40
+ started: string;
41
+ completed: string;
42
+ duration: number;
43
+ };
44
+ cost?: number;
45
+ }
46
+ export interface ParallelResult {
47
+ results: Record<string, AgentResult>;
48
+ successful: string[];
49
+ failed: string[];
50
+ timing: {
51
+ duration: number;
52
+ started: string;
53
+ completed: string;
54
+ };
55
+ costs: {
56
+ total: number;
57
+ byAgent: Record<string, number>;
58
+ };
59
+ }
60
+ /**
61
+ * Execute multiple AI agents in parallel with configurable wait strategies.
62
+ *
63
+ * Example:
64
+ * ```yaml
65
+ * action: parallel.spawn
66
+ * inputs:
67
+ * agents:
68
+ * - id: security_review
69
+ * provider: claude
70
+ * model: sonnet
71
+ * prompt: "Review security of: {{ code }}"
72
+ * - id: performance_review
73
+ * provider: copilot
74
+ * prompt: "Review performance of: {{ code }}"
75
+ * wait: all
76
+ * timeout: 60s
77
+ * onError: continue
78
+ * outputs:
79
+ * results: ${results}
80
+ * ```
81
+ */
82
+ export declare function executeParallelSpawn(inputs: ParallelSpawnInputs, context: ExecutionContext, sdkRegistry: SDKRegistryLike, stepExecutor: (step: WorkflowStep, context: ExecutionContext, sdkRegistry: SDKRegistryLike, executorContext?: StepExecutorContext) => Promise<unknown>): Promise<ParallelResult>;
83
+ /**
84
+ * Process an array of items in parallel using AI agents.
85
+ *
86
+ * Example:
87
+ * ```yaml
88
+ * action: parallel.map
89
+ * inputs:
90
+ * items: ${pull_requests}
91
+ * agent:
92
+ * provider: claude
93
+ * model: haiku
94
+ * prompt: "Review PR: {{ item.url }}"
95
+ * concurrency: 5
96
+ * timeout: 30s
97
+ * outputs:
98
+ * reviews: ${results}
99
+ * ```
100
+ */
101
+ export declare function executeParallelMap(inputs: ParallelMapInputs, context: ExecutionContext, sdkRegistry: SDKRegistryLike, stepExecutor: (step: WorkflowStep, context: ExecutionContext, sdkRegistry: SDKRegistryLike, executorContext?: StepExecutorContext) => Promise<unknown>): Promise<unknown[]>;
102
+ /**
103
+ * Check if an action is a parallel operation
104
+ */
105
+ export declare function isParallelOperation(action: string): boolean;
106
+ /**
107
+ * Execute a parallel operation.
108
+ *
109
+ * @param rawInputs - Original unresolved inputs, used to preserve prompt templates
110
+ * containing per-item variables ({{ item }}, {{ itemIndex }}) that the engine's
111
+ * pre-resolution would replace with empty strings.
112
+ */
113
+ export declare function executeParallelOperation(action: string, resolvedInputs: Record<string, unknown>, context: ExecutionContext, sdkRegistry: SDKRegistryLike, stepExecutor: (step: WorkflowStep, context: ExecutionContext, sdkRegistry: SDKRegistryLike, executorContext?: StepExecutorContext) => Promise<unknown>, rawInputs?: Record<string, unknown>): Promise<unknown>;
114
+ //# sourceMappingURL=parallel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../src/parallel.ts"],"names":[],"mappings":"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"}