@marktoflow/core 2.0.0-alpha.12 → 2.0.0-alpha.13

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 (53) hide show
  1. package/README.md +147 -4
  2. package/dist/built-in-operations.d.ts +140 -0
  3. package/dist/built-in-operations.d.ts.map +1 -0
  4. package/dist/built-in-operations.js +414 -0
  5. package/dist/built-in-operations.js.map +1 -0
  6. package/dist/engine.d.ts +11 -1
  7. package/dist/engine.d.ts.map +1 -1
  8. package/dist/engine.js +76 -42
  9. package/dist/engine.js.map +1 -1
  10. package/dist/file-operations.d.ts +86 -0
  11. package/dist/file-operations.d.ts.map +1 -0
  12. package/dist/file-operations.js +363 -0
  13. package/dist/file-operations.js.map +1 -0
  14. package/dist/index.d.ts +6 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +29 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/logging.d.ts +40 -2
  19. package/dist/logging.d.ts.map +1 -1
  20. package/dist/logging.js +166 -13
  21. package/dist/logging.js.map +1 -1
  22. package/dist/models.d.ts +144 -8
  23. package/dist/models.d.ts.map +1 -1
  24. package/dist/models.js +15 -1
  25. package/dist/models.js.map +1 -1
  26. package/dist/nunjucks-filters.d.ts +271 -0
  27. package/dist/nunjucks-filters.d.ts.map +1 -0
  28. package/dist/nunjucks-filters.js +648 -0
  29. package/dist/nunjucks-filters.js.map +1 -0
  30. package/dist/parser.d.ts.map +1 -1
  31. package/dist/parser.js +16 -2
  32. package/dist/parser.js.map +1 -1
  33. package/dist/prompt-loader.d.ts +8 -2
  34. package/dist/prompt-loader.d.ts.map +1 -1
  35. package/dist/prompt-loader.js +26 -89
  36. package/dist/prompt-loader.js.map +1 -1
  37. package/dist/scheduler.d.ts +22 -3
  38. package/dist/scheduler.d.ts.map +1 -1
  39. package/dist/scheduler.js +72 -73
  40. package/dist/scheduler.js.map +1 -1
  41. package/dist/script-executor.d.ts +65 -0
  42. package/dist/script-executor.d.ts.map +1 -0
  43. package/dist/script-executor.js +261 -0
  44. package/dist/script-executor.js.map +1 -0
  45. package/dist/template-engine.d.ts +51 -0
  46. package/dist/template-engine.d.ts.map +1 -0
  47. package/dist/template-engine.js +227 -0
  48. package/dist/template-engine.js.map +1 -0
  49. package/dist/templates.d.ts +10 -0
  50. package/dist/templates.d.ts.map +1 -1
  51. package/dist/templates.js +21 -17
  52. package/dist/templates.js.map +1 -1
  53. package/package.json +16 -2
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Built-in Operations for marktoflow
3
+ *
4
+ * Provides common operations that eliminate the need for verbose script blocks:
5
+ * - core.set: Simple variable assignment
6
+ * - core.transform: Map/filter/reduce transformations
7
+ * - core.extract: Nested path access
8
+ * - core.format: Date/number/string formatting
9
+ * - file.read: Read files with format conversion (docx, pdf, xlsx)
10
+ * - file.write: Write files (text or binary)
11
+ */
12
+ import { resolveTemplates, resolveVariablePath } from './engine.js';
13
+ import { executeFileOperation, isFileOperation } from './file-operations.js';
14
+ // ============================================================================
15
+ // core.set - Simple Variable Assignment
16
+ // ============================================================================
17
+ /**
18
+ * Set multiple variables at once with expression resolution.
19
+ *
20
+ * Example:
21
+ * ```yaml
22
+ * action: core.set
23
+ * inputs:
24
+ * owner: "{{ inputs.repo =~ /^([^\/]+)\// }}"
25
+ * repo_name: "{{ inputs.repo =~ /\/(.+)$/ }}"
26
+ * timestamp: "{{ now() }}"
27
+ * ```
28
+ */
29
+ export function executeSet(inputs, context) {
30
+ const result = {};
31
+ for (const [key, value] of Object.entries(inputs)) {
32
+ const resolved = resolveTemplates(value, context);
33
+ result[key] = resolved;
34
+ }
35
+ return result;
36
+ }
37
+ // ============================================================================
38
+ // core.transform - Array Transformations
39
+ // ============================================================================
40
+ /**
41
+ * Transform arrays using common operations like map, filter, reduce.
42
+ *
43
+ * Examples:
44
+ *
45
+ * Map:
46
+ * ```yaml
47
+ * action: core.transform
48
+ * inputs:
49
+ * input: "{{ oncall_response.data.oncalls }}"
50
+ * operation: map
51
+ * expression: "@{{ item.user.name }}"
52
+ * ```
53
+ *
54
+ * Filter:
55
+ * ```yaml
56
+ * action: core.transform
57
+ * inputs:
58
+ * input: "{{ issues }}"
59
+ * operation: filter
60
+ * condition: "item.priority == 'high'"
61
+ * ```
62
+ *
63
+ * Reduce:
64
+ * ```yaml
65
+ * action: core.transform
66
+ * inputs:
67
+ * input: "{{ numbers }}"
68
+ * operation: reduce
69
+ * expression: "{{ accumulator + item }}"
70
+ * initialValue: 0
71
+ * ```
72
+ */
73
+ export function executeTransform(rawInputs, resolvedInputs, context) {
74
+ // Use resolved input array
75
+ const input = resolvedInputs.input;
76
+ if (!Array.isArray(input)) {
77
+ throw new Error('Transform input must be an array');
78
+ }
79
+ // Use raw (unresolved) expression and condition to preserve templates
80
+ const operation = rawInputs.operation;
81
+ switch (operation) {
82
+ case 'map':
83
+ return transformMap(input, rawInputs.expression || '{{ item }}', context);
84
+ case 'filter':
85
+ return transformFilter(input, rawInputs.condition || 'item', context);
86
+ case 'reduce':
87
+ return transformReduce(input, rawInputs.expression || '{{ accumulator }}', resolvedInputs.initialValue, // Resolve initialValue upfront
88
+ context);
89
+ case 'find':
90
+ return transformFind(input, rawInputs.condition || 'item', context);
91
+ case 'group_by':
92
+ if (!rawInputs.key) {
93
+ throw new Error('group_by operation requires "key" parameter');
94
+ }
95
+ return transformGroupBy(input, rawInputs.key, context);
96
+ case 'unique':
97
+ return transformUnique(input, rawInputs.key, context);
98
+ case 'sort':
99
+ return transformSort(input, rawInputs.key, resolvedInputs.reverse || false, context);
100
+ default:
101
+ throw new Error(`Unknown transform operation: ${operation}`);
102
+ }
103
+ }
104
+ /**
105
+ * Map transformation - transform each item in an array
106
+ */
107
+ function transformMap(items, expression, context) {
108
+ return items.map((item) => {
109
+ const itemContext = { ...context, variables: { ...context.variables, item } };
110
+ return resolveTemplates(expression, itemContext);
111
+ });
112
+ }
113
+ /**
114
+ * Filter transformation - keep items that match a condition
115
+ */
116
+ function transformFilter(items, condition, context) {
117
+ return items.filter((item) => {
118
+ const itemContext = { ...context, variables: { ...context.variables, item } };
119
+ const resolved = resolveTemplates(condition, itemContext);
120
+ return Boolean(resolved);
121
+ });
122
+ }
123
+ /**
124
+ * Reduce transformation - aggregate items to a single value
125
+ */
126
+ function transformReduce(items, expression, initialValue, context) {
127
+ let accumulator = initialValue !== undefined ? initialValue : null;
128
+ for (const item of items) {
129
+ const reduceContext = {
130
+ ...context,
131
+ variables: { ...context.variables, item, accumulator },
132
+ };
133
+ accumulator = resolveTemplates(expression, reduceContext);
134
+ }
135
+ return accumulator;
136
+ }
137
+ /**
138
+ * Find transformation - find first item that matches condition
139
+ */
140
+ function transformFind(items, condition, context) {
141
+ for (const item of items) {
142
+ const itemContext = { ...context, variables: { ...context.variables, item } };
143
+ const resolved = resolveTemplates(condition, itemContext);
144
+ if (Boolean(resolved)) {
145
+ return item;
146
+ }
147
+ }
148
+ return undefined;
149
+ }
150
+ /**
151
+ * Group by transformation - group items by a key
152
+ */
153
+ function transformGroupBy(items, key, context) {
154
+ const groups = {};
155
+ for (const item of items) {
156
+ const itemContext = { ...context, variables: { ...context.variables, item } };
157
+ const groupKey = String(resolveVariablePath(key, itemContext));
158
+ if (!groups[groupKey]) {
159
+ groups[groupKey] = [];
160
+ }
161
+ groups[groupKey].push(item);
162
+ }
163
+ return groups;
164
+ }
165
+ /**
166
+ * Unique transformation - remove duplicates
167
+ */
168
+ function transformUnique(items, key, context) {
169
+ if (!key) {
170
+ // Simple unique for primitive values
171
+ return Array.from(new Set(items));
172
+ }
173
+ // Unique based on key
174
+ const seen = new Set();
175
+ const result = [];
176
+ for (const item of items) {
177
+ const itemContext = { ...context, variables: { ...context.variables, item } };
178
+ const keyValue = String(resolveVariablePath(key, itemContext));
179
+ if (!seen.has(keyValue)) {
180
+ seen.add(keyValue);
181
+ result.push(item);
182
+ }
183
+ }
184
+ return result;
185
+ }
186
+ /**
187
+ * Sort transformation - sort items by key or value
188
+ */
189
+ function transformSort(items, key, reverse, context) {
190
+ const sorted = [...items];
191
+ sorted.sort((a, b) => {
192
+ let aVal = a;
193
+ let bVal = b;
194
+ if (key) {
195
+ const aContext = { ...context, variables: { ...context.variables, item: a } };
196
+ const bContext = { ...context, variables: { ...context.variables, item: b } };
197
+ aVal = resolveVariablePath(key, aContext);
198
+ bVal = resolveVariablePath(key, bContext);
199
+ }
200
+ // Handle different types
201
+ if (typeof aVal === 'number' && typeof bVal === 'number') {
202
+ return aVal - bVal;
203
+ }
204
+ if (typeof aVal === 'string' && typeof bVal === 'string') {
205
+ return aVal.localeCompare(bVal);
206
+ }
207
+ // Fall back to string comparison
208
+ return String(aVal).localeCompare(String(bVal));
209
+ });
210
+ return reverse ? sorted.reverse() : sorted;
211
+ }
212
+ // ============================================================================
213
+ // core.extract - Nested Path Access
214
+ // ============================================================================
215
+ /**
216
+ * Extract values from nested objects safely.
217
+ *
218
+ * Example:
219
+ * ```yaml
220
+ * action: core.extract
221
+ * inputs:
222
+ * input: "{{ api_response }}"
223
+ * path: "data.users[0].email"
224
+ * default: "unknown@example.com"
225
+ * ```
226
+ */
227
+ export function executeExtract(inputs, context) {
228
+ const input = resolveTemplates(inputs.input, context);
229
+ const path = inputs.path;
230
+ const defaultValue = inputs.default;
231
+ // Create a temporary context with the input as a variable
232
+ const tempContext = {
233
+ ...context,
234
+ variables: { ...context.variables, __extract_input: input },
235
+ };
236
+ const result = resolveVariablePath(`__extract_input.${path}`, tempContext);
237
+ if (result === undefined) {
238
+ return defaultValue !== undefined ? defaultValue : null;
239
+ }
240
+ return result;
241
+ }
242
+ // ============================================================================
243
+ // core.format - Value Formatting
244
+ // ============================================================================
245
+ /**
246
+ * Format values for display (dates, numbers, strings, currency).
247
+ *
248
+ * Examples:
249
+ *
250
+ * Date:
251
+ * ```yaml
252
+ * action: core.format
253
+ * inputs:
254
+ * value: "{{ now() }}"
255
+ * type: date
256
+ * format: "YYYY-MM-DD HH:mm:ss"
257
+ * ```
258
+ *
259
+ * Number:
260
+ * ```yaml
261
+ * action: core.format
262
+ * inputs:
263
+ * value: 1234.56
264
+ * type: number
265
+ * precision: 2
266
+ * ```
267
+ *
268
+ * Currency:
269
+ * ```yaml
270
+ * action: core.format
271
+ * inputs:
272
+ * value: 1234.56
273
+ * type: currency
274
+ * currency: USD
275
+ * locale: en-US
276
+ * ```
277
+ */
278
+ export function executeFormat(inputs, context) {
279
+ const value = resolveTemplates(inputs.value, context);
280
+ switch (inputs.type) {
281
+ case 'date':
282
+ return formatDate(value, inputs.format);
283
+ case 'number':
284
+ return formatNumber(value, inputs.precision, inputs.locale);
285
+ case 'currency':
286
+ return formatCurrency(value, inputs.currency || 'USD', inputs.locale);
287
+ case 'string':
288
+ return formatString(value, inputs.format);
289
+ case 'json':
290
+ return JSON.stringify(value, null, 2);
291
+ default:
292
+ throw new Error(`Unknown format type: ${inputs.type}`);
293
+ }
294
+ }
295
+ /**
296
+ * Format a date value
297
+ * Supports simple format tokens: YYYY, MM, DD, HH, mm, ss
298
+ */
299
+ function formatDate(value, format) {
300
+ let date;
301
+ if (value instanceof Date) {
302
+ date = value;
303
+ }
304
+ else if (typeof value === 'string' || typeof value === 'number') {
305
+ date = new Date(value);
306
+ }
307
+ else {
308
+ date = new Date();
309
+ }
310
+ if (isNaN(date.getTime())) {
311
+ throw new Error('Invalid date value');
312
+ }
313
+ if (!format) {
314
+ return date.toISOString();
315
+ }
316
+ // Simple date formatting (basic implementation)
317
+ let formatted = format;
318
+ formatted = formatted.replace('YYYY', date.getFullYear().toString());
319
+ formatted = formatted.replace('MM', String(date.getMonth() + 1).padStart(2, '0'));
320
+ formatted = formatted.replace('DD', String(date.getDate()).padStart(2, '0'));
321
+ formatted = formatted.replace('HH', String(date.getHours()).padStart(2, '0'));
322
+ formatted = formatted.replace('mm', String(date.getMinutes()).padStart(2, '0'));
323
+ formatted = formatted.replace('ss', String(date.getSeconds()).padStart(2, '0'));
324
+ return formatted;
325
+ }
326
+ /**
327
+ * Format a number value
328
+ */
329
+ function formatNumber(value, precision, locale) {
330
+ const num = Number(value);
331
+ if (isNaN(num)) {
332
+ throw new Error('Invalid number value');
333
+ }
334
+ if (precision !== undefined) {
335
+ return num.toFixed(precision);
336
+ }
337
+ if (locale) {
338
+ return num.toLocaleString(locale);
339
+ }
340
+ return num.toString();
341
+ }
342
+ /**
343
+ * Format a currency value
344
+ */
345
+ function formatCurrency(value, currency, locale) {
346
+ const num = Number(value);
347
+ if (isNaN(num)) {
348
+ throw new Error('Invalid currency value');
349
+ }
350
+ return num.toLocaleString(locale || 'en-US', {
351
+ style: 'currency',
352
+ currency,
353
+ });
354
+ }
355
+ /**
356
+ * Format a string value
357
+ * Supports: upper, lower, title, capitalize, trim
358
+ */
359
+ function formatString(value, format) {
360
+ let str = String(value);
361
+ if (!format) {
362
+ return str;
363
+ }
364
+ switch (format.toLowerCase()) {
365
+ case 'upper':
366
+ case 'uppercase':
367
+ return str.toUpperCase();
368
+ case 'lower':
369
+ case 'lowercase':
370
+ return str.toLowerCase();
371
+ case 'title':
372
+ case 'titlecase':
373
+ return str.replace(/\w\S*/g, (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase());
374
+ case 'capitalize':
375
+ return str.charAt(0).toUpperCase() + str.slice(1);
376
+ case 'trim':
377
+ return str.trim();
378
+ default:
379
+ return str;
380
+ }
381
+ }
382
+ // ============================================================================
383
+ // Helper Functions
384
+ // ============================================================================
385
+ /**
386
+ * Execute a built-in operation based on action name
387
+ */
388
+ export function executeBuiltInOperation(action, rawInputs, resolvedInputs, context) {
389
+ switch (action) {
390
+ case 'core.set':
391
+ return executeSet(resolvedInputs, context);
392
+ case 'core.transform':
393
+ // For transform operations, use raw inputs to preserve template expressions
394
+ return executeTransform(rawInputs, resolvedInputs, context);
395
+ case 'core.extract':
396
+ return executeExtract(resolvedInputs, context);
397
+ case 'core.format':
398
+ return executeFormat(resolvedInputs, context);
399
+ default:
400
+ // Check if it's a file operation
401
+ if (isFileOperation(action)) {
402
+ return executeFileOperation(action, resolvedInputs, context);
403
+ }
404
+ return null; // Not a built-in operation
405
+ }
406
+ }
407
+ /**
408
+ * Check if an action is a built-in operation
409
+ */
410
+ export function isBuiltInOperation(action) {
411
+ const builtInActions = ['core.set', 'core.transform', 'core.extract', 'core.format'];
412
+ return builtInActions.includes(action) || isFileOperation(action);
413
+ }
414
+ //# sourceMappingURL=built-in-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in-operations.js","sourceRoot":"","sources":["../src/built-in-operations.ts"],"names":[],"mappings":"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"}
package/dist/engine.d.ts CHANGED
@@ -85,7 +85,12 @@ export declare class CircuitBreaker {
85
85
  }
86
86
  /**
87
87
  * Resolve template variables in a value.
88
- * Supports {{variable}} and {{inputs.name}} syntax.
88
+ * Supports {{variable}}, {{inputs.name}}, and Nunjucks filters.
89
+ *
90
+ * Uses Nunjucks as the template engine with:
91
+ * - Legacy regex operator support (=~, !~, //) converted to filters
92
+ * - Custom filters for string, array, object, date operations
93
+ * - Jinja2-style control flow ({% for %}, {% if %}, etc.)
89
94
  */
90
95
  export declare function resolveTemplates(value: unknown, context: ExecutionContext): unknown;
91
96
  /**
@@ -177,6 +182,7 @@ export declare class WorkflowEngine {
177
182
  /**
178
183
  * Resolve a condition value with support for nested properties.
179
184
  * Handles direct variable references and nested paths.
185
+ * Uses Nunjucks for template expressions with filters/regex.
180
186
  */
181
187
  private resolveConditionValue;
182
188
  /**
@@ -227,6 +233,10 @@ export declare class WorkflowEngine {
227
233
  * Execute try/catch/finally step.
228
234
  */
229
235
  private executeTryStep;
236
+ /**
237
+ * Execute a script step (inline JavaScript).
238
+ */
239
+ private executeScriptStep;
230
240
  /**
231
241
  * Clone execution context for parallel branches.
232
242
  */
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js CHANGED
@@ -4,12 +4,15 @@
4
4
  * Executes workflow steps with retry logic, variable resolution,
5
5
  * and SDK invocation.
6
6
  */
7
- import { StepStatus, WorkflowStatus, createExecutionContext, createStepResult, isActionStep, isSubWorkflowStep, isIfStep, isSwitchStep, isForEachStep, isWhileStep, isMapStep, isFilterStep, isReduceStep, isParallelStep, isTryStep, } from './models.js';
7
+ import { StepStatus, WorkflowStatus, createExecutionContext, createStepResult, isActionStep, isSubWorkflowStep, isIfStep, isSwitchStep, isForEachStep, isWhileStep, isMapStep, isFilterStep, isReduceStep, isParallelStep, isTryStep, isScriptStep, } from './models.js';
8
8
  import { mergePermissions, toSecurityPolicy, } from './permissions.js';
9
9
  import { loadPromptFile, resolvePromptTemplate, validatePromptInputs, } from './prompt-loader.js';
10
10
  import { DEFAULT_FAILOVER_CONFIG, AgentHealthTracker, FailoverReason, } from './failover.js';
11
11
  import { parseFile } from './parser.js';
12
12
  import { resolve, dirname } from 'node:path';
13
+ import { executeBuiltInOperation, isBuiltInOperation } from './built-in-operations.js';
14
+ import { renderTemplate } from './template-engine.js';
15
+ import { executeScriptAsync } from './script-executor.js';
13
16
  // ============================================================================
14
17
  // Helper Functions
15
18
  // ============================================================================
@@ -112,50 +115,27 @@ export class CircuitBreaker {
112
115
  // ============================================================================
113
116
  // Variable Resolution
114
117
  // ============================================================================
115
- /**
116
- * Smart serialization for template interpolation.
117
- * Converts values to strings in a meaningful way for different types.
118
- */
119
- function serializeValue(value) {
120
- if (value === undefined || value === null) {
121
- return '';
122
- }
123
- // For primitives, use standard string conversion
124
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
125
- return String(value);
126
- }
127
- // For objects and arrays, use JSON serialization for readability
128
- // This makes them useful in prompts and messages instead of "[object Object]"
129
- try {
130
- return JSON.stringify(value, null, 2);
131
- }
132
- catch (error) {
133
- // Fallback to string conversion if JSON serialization fails
134
- return String(value);
135
- }
136
- }
137
118
  /**
138
119
  * Resolve template variables in a value.
139
- * Supports {{variable}} and {{inputs.name}} syntax.
120
+ * Supports {{variable}}, {{inputs.name}}, and Nunjucks filters.
121
+ *
122
+ * Uses Nunjucks as the template engine with:
123
+ * - Legacy regex operator support (=~, !~, //) converted to filters
124
+ * - Custom filters for string, array, object, date operations
125
+ * - Jinja2-style control flow ({% for %}, {% if %}, etc.)
140
126
  */
141
127
  export function resolveTemplates(value, context) {
142
128
  if (typeof value === 'string') {
143
- // Check if the entire string is a single template expression
144
- const singleTemplateMatch = value.match(/^\{\{([^}]+)\}\}$/);
145
- if (singleTemplateMatch) {
146
- // Return the actual value without converting to string
147
- const path = singleTemplateMatch[1].trim();
148
- const resolved = resolveVariablePath(path, context);
149
- // For single template expressions, return the actual value (could be object, array, etc.)
150
- // If undefined, return empty string for backward compatibility
151
- return resolved !== undefined ? resolved : '';
152
- }
153
- // Otherwise, do string interpolation with smart serialization
154
- return value.replace(/\{\{([^}]+)\}\}/g, (_, varPath) => {
155
- const path = varPath.trim();
156
- const resolved = resolveVariablePath(path, context);
157
- return serializeValue(resolved);
158
- });
129
+ // Build the template context with all available variables
130
+ // Spread inputs first, then variables (variables override inputs if same key)
131
+ // Also keep inputs accessible via inputs.* for explicit access
132
+ const templateContext = {
133
+ ...context.inputs, // Spread inputs at root level for direct access ({{ path }})
134
+ ...context.variables, // Variables override inputs if same key
135
+ inputs: context.inputs, // Also keep inputs accessible as inputs.*
136
+ };
137
+ // Use the new Nunjucks-based template engine with legacy syntax support
138
+ return renderTemplate(value, templateContext);
159
139
  }
160
140
  if (Array.isArray(value)) {
161
141
  return value.map((v) => resolveTemplates(v, context));
@@ -185,6 +165,11 @@ export function resolveVariablePath(path, context) {
185
165
  if (fromVars !== undefined) {
186
166
  return fromVars;
187
167
  }
168
+ // Check inputs (for bare variable names like "value" instead of "inputs.value")
169
+ const fromInputs = getNestedValue(context.inputs, path);
170
+ if (fromInputs !== undefined) {
171
+ return fromInputs;
172
+ }
188
173
  // Check step metadata (for status checks like: step_id.status)
189
174
  const fromStepMeta = getNestedValue(context.stepMetadata, path);
190
175
  if (fromStepMeta !== undefined) {
@@ -317,6 +302,9 @@ export class WorkflowEngine {
317
302
  if (isTryStep(step)) {
318
303
  return this.executeTryStep(step, context, sdkRegistry, stepExecutor);
319
304
  }
305
+ if (isScriptStep(step)) {
306
+ return this.executeScriptStep(step, context);
307
+ }
320
308
  // Default: action or workflow step
321
309
  return this.executeStepWithFailover(step, context, sdkRegistry, stepExecutor);
322
310
  }
@@ -834,8 +822,19 @@ Execute the workflow steps in order and return the final outputs as JSON.`;
834
822
  resolvedInputs = resolveTemplates(step.inputs, context);
835
823
  }
836
824
  const stepWithResolvedInputs = { ...step, inputs: resolvedInputs };
837
- // Execute step with executor context
838
- const output = await this.executeWithTimeout(() => stepExecutor(stepWithResolvedInputs, context, sdkRegistry, executorContext), step.timeout ?? this.config.defaultTimeout);
825
+ // Check if this is a built-in operation
826
+ let output;
827
+ if (isBuiltInOperation(step.action)) {
828
+ // Execute built-in operation directly (no timeout, no SDK executor needed)
829
+ // For built-in operations, pass both resolved and unresolved inputs
830
+ // to allow selective resolution of template expressions
831
+ // Await in case operation is async (e.g., file operations)
832
+ output = await executeBuiltInOperation(step.action, step.inputs, resolvedInputs, context);
833
+ }
834
+ else {
835
+ // Execute step with executor context
836
+ output = await this.executeWithTimeout(() => stepExecutor(stepWithResolvedInputs, context, sdkRegistry, executorContext), step.timeout ?? this.config.defaultTimeout);
837
+ }
839
838
  circuitBreaker.recordSuccess();
840
839
  const result = createStepResult(step.id, StepStatus.COMPLETED, output, startedAt, attempt);
841
840
  this.events.onStepComplete?.(step, result);
@@ -977,8 +976,18 @@ Execute the workflow steps in order and return the final outputs as JSON.`;
977
976
  /**
978
977
  * Resolve a condition value with support for nested properties.
979
978
  * Handles direct variable references and nested paths.
979
+ * Uses Nunjucks for template expressions with filters/regex.
980
980
  */
981
981
  resolveConditionValue(path, context) {
982
+ // If it looks like a template expression, resolve it
983
+ if (path.includes('|') || path.includes('=~') || path.includes('!~')) {
984
+ // Build template context
985
+ const templateContext = {
986
+ inputs: context.inputs,
987
+ ...context.variables,
988
+ };
989
+ return renderTemplate(`{{ ${path} }}`, templateContext);
990
+ }
982
991
  // First try to parse as a literal value (true, false, numbers, etc.)
983
992
  const parsedValue = this.parseValue(path);
984
993
  // If parseValue returned the same string, try to resolve as a variable
@@ -1401,6 +1410,31 @@ Execute the workflow steps in order and return the final outputs as JSON.`;
1401
1410
  return createStepResult(step.id, StepStatus.FAILED, null, startedAt, 0, error instanceof Error ? error.message : String(error));
1402
1411
  }
1403
1412
  }
1413
+ /**
1414
+ * Execute a script step (inline JavaScript).
1415
+ */
1416
+ async executeScriptStep(step, context) {
1417
+ const startedAt = new Date();
1418
+ try {
1419
+ // Resolve any templates in the code
1420
+ const resolvedInputs = resolveTemplates(step.inputs, context);
1421
+ // Execute the script with the workflow context
1422
+ const result = await executeScriptAsync(resolvedInputs.code, {
1423
+ variables: context.variables,
1424
+ inputs: context.inputs,
1425
+ steps: context.stepMetadata,
1426
+ }, {
1427
+ timeout: resolvedInputs.timeout ?? 5000,
1428
+ });
1429
+ if (!result.success) {
1430
+ return createStepResult(step.id, StepStatus.FAILED, null, startedAt, 0, result.error ?? 'Script execution failed');
1431
+ }
1432
+ return createStepResult(step.id, StepStatus.COMPLETED, result.value, startedAt);
1433
+ }
1434
+ catch (error) {
1435
+ return createStepResult(step.id, StepStatus.FAILED, null, startedAt, 0, error instanceof Error ? error.message : String(error));
1436
+ }
1437
+ }
1404
1438
  // ============================================================================
1405
1439
  // Helper Methods for Control Flow
1406
1440
  // ============================================================================