agentic-qe 2.5.5 → 2.5.7

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 (168) hide show
  1. package/.claude/agents/n8n/n8n-base-agent.md +376 -0
  2. package/.claude/agents/n8n/n8n-bdd-scenario-tester.md +613 -0
  3. package/.claude/agents/n8n/n8n-chaos-tester.md +654 -0
  4. package/.claude/agents/n8n/n8n-ci-orchestrator.md +850 -0
  5. package/.claude/agents/n8n/n8n-compliance-validator.md +685 -0
  6. package/.claude/agents/n8n/n8n-expression-validator.md +560 -0
  7. package/.claude/agents/n8n/n8n-integration-test.md +602 -0
  8. package/.claude/agents/n8n/n8n-monitoring-validator.md +589 -0
  9. package/.claude/agents/n8n/n8n-node-validator.md +455 -0
  10. package/.claude/agents/n8n/n8n-performance-tester.md +630 -0
  11. package/.claude/agents/n8n/n8n-security-auditor.md +786 -0
  12. package/.claude/agents/n8n/n8n-trigger-test.md +500 -0
  13. package/.claude/agents/n8n/n8n-unit-tester.md +633 -0
  14. package/.claude/agents/n8n/n8n-version-comparator.md +567 -0
  15. package/.claude/agents/n8n/n8n-workflow-executor.md +392 -0
  16. package/.claude/skills/n8n-expression-testing/SKILL.md +434 -0
  17. package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
  18. package/.claude/skills/n8n-security-testing/SKILL.md +599 -0
  19. package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
  20. package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
  21. package/CHANGELOG.md +111 -0
  22. package/README.md +7 -4
  23. package/dist/adapters/MemoryStoreAdapter.d.ts +75 -123
  24. package/dist/adapters/MemoryStoreAdapter.d.ts.map +1 -1
  25. package/dist/adapters/MemoryStoreAdapter.js +204 -219
  26. package/dist/adapters/MemoryStoreAdapter.js.map +1 -1
  27. package/dist/agents/AccessibilityAllyAgent.d.ts.map +1 -1
  28. package/dist/agents/AccessibilityAllyAgent.js +17 -1
  29. package/dist/agents/AccessibilityAllyAgent.js.map +1 -1
  30. package/dist/agents/BaseAgent.d.ts +18 -250
  31. package/dist/agents/BaseAgent.d.ts.map +1 -1
  32. package/dist/agents/BaseAgent.js +122 -520
  33. package/dist/agents/BaseAgent.js.map +1 -1
  34. package/dist/agents/n8n/N8nAPIClient.d.ts +121 -0
  35. package/dist/agents/n8n/N8nAPIClient.d.ts.map +1 -0
  36. package/dist/agents/n8n/N8nAPIClient.js +367 -0
  37. package/dist/agents/n8n/N8nAPIClient.js.map +1 -0
  38. package/dist/agents/n8n/N8nAuditPersistence.d.ts +120 -0
  39. package/dist/agents/n8n/N8nAuditPersistence.d.ts.map +1 -0
  40. package/dist/agents/n8n/N8nAuditPersistence.js +473 -0
  41. package/dist/agents/n8n/N8nAuditPersistence.js.map +1 -0
  42. package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts +159 -0
  43. package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts.map +1 -0
  44. package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js +697 -0
  45. package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js.map +1 -0
  46. package/dist/agents/n8n/N8nBaseAgent.d.ts +126 -0
  47. package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -0
  48. package/dist/agents/n8n/N8nBaseAgent.js +446 -0
  49. package/dist/agents/n8n/N8nBaseAgent.js.map +1 -0
  50. package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts +164 -0
  51. package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts.map +1 -0
  52. package/dist/agents/n8n/N8nCIOrchestratorAgent.js +610 -0
  53. package/dist/agents/n8n/N8nCIOrchestratorAgent.js.map +1 -0
  54. package/dist/agents/n8n/N8nChaosTesterAgent.d.ts +205 -0
  55. package/dist/agents/n8n/N8nChaosTesterAgent.d.ts.map +1 -0
  56. package/dist/agents/n8n/N8nChaosTesterAgent.js +729 -0
  57. package/dist/agents/n8n/N8nChaosTesterAgent.js.map +1 -0
  58. package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts +228 -0
  59. package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts.map +1 -0
  60. package/dist/agents/n8n/N8nComplianceValidatorAgent.js +986 -0
  61. package/dist/agents/n8n/N8nComplianceValidatorAgent.js.map +1 -0
  62. package/dist/agents/n8n/N8nContractTesterAgent.d.ts +213 -0
  63. package/dist/agents/n8n/N8nContractTesterAgent.d.ts.map +1 -0
  64. package/dist/agents/n8n/N8nContractTesterAgent.js +989 -0
  65. package/dist/agents/n8n/N8nContractTesterAgent.js.map +1 -0
  66. package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts +99 -0
  67. package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts.map +1 -0
  68. package/dist/agents/n8n/N8nExpressionValidatorAgent.js +632 -0
  69. package/dist/agents/n8n/N8nExpressionValidatorAgent.js.map +1 -0
  70. package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts +238 -0
  71. package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts.map +1 -0
  72. package/dist/agents/n8n/N8nFailureModeTesterAgent.js +956 -0
  73. package/dist/agents/n8n/N8nFailureModeTesterAgent.js.map +1 -0
  74. package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts +242 -0
  75. package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts.map +1 -0
  76. package/dist/agents/n8n/N8nIdempotencyTesterAgent.js +992 -0
  77. package/dist/agents/n8n/N8nIdempotencyTesterAgent.js.map +1 -0
  78. package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts +104 -0
  79. package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts.map +1 -0
  80. package/dist/agents/n8n/N8nIntegrationTestAgent.js +653 -0
  81. package/dist/agents/n8n/N8nIntegrationTestAgent.js.map +1 -0
  82. package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts +210 -0
  83. package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts.map +1 -0
  84. package/dist/agents/n8n/N8nMonitoringValidatorAgent.js +669 -0
  85. package/dist/agents/n8n/N8nMonitoringValidatorAgent.js.map +1 -0
  86. package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts +142 -0
  87. package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts.map +1 -0
  88. package/dist/agents/n8n/N8nNodeValidatorAgent.js +1090 -0
  89. package/dist/agents/n8n/N8nNodeValidatorAgent.js.map +1 -0
  90. package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts +198 -0
  91. package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts.map +1 -0
  92. package/dist/agents/n8n/N8nPerformanceTesterAgent.js +653 -0
  93. package/dist/agents/n8n/N8nPerformanceTesterAgent.js.map +1 -0
  94. package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts +245 -0
  95. package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts.map +1 -0
  96. package/dist/agents/n8n/N8nReplayabilityTesterAgent.js +952 -0
  97. package/dist/agents/n8n/N8nReplayabilityTesterAgent.js.map +1 -0
  98. package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts +325 -0
  99. package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts.map +1 -0
  100. package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js +1187 -0
  101. package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js.map +1 -0
  102. package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts +91 -0
  103. package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts.map +1 -0
  104. package/dist/agents/n8n/N8nSecurityAuditorAgent.js +825 -0
  105. package/dist/agents/n8n/N8nSecurityAuditorAgent.js.map +1 -0
  106. package/dist/agents/n8n/N8nTestHarness.d.ts +131 -0
  107. package/dist/agents/n8n/N8nTestHarness.d.ts.map +1 -0
  108. package/dist/agents/n8n/N8nTestHarness.js +456 -0
  109. package/dist/agents/n8n/N8nTestHarness.js.map +1 -0
  110. package/dist/agents/n8n/N8nTriggerTestAgent.d.ts +119 -0
  111. package/dist/agents/n8n/N8nTriggerTestAgent.d.ts.map +1 -0
  112. package/dist/agents/n8n/N8nTriggerTestAgent.js +652 -0
  113. package/dist/agents/n8n/N8nTriggerTestAgent.js.map +1 -0
  114. package/dist/agents/n8n/N8nUnitTesterAgent.d.ts +130 -0
  115. package/dist/agents/n8n/N8nUnitTesterAgent.d.ts.map +1 -0
  116. package/dist/agents/n8n/N8nUnitTesterAgent.js +522 -0
  117. package/dist/agents/n8n/N8nUnitTesterAgent.js.map +1 -0
  118. package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts +201 -0
  119. package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts.map +1 -0
  120. package/dist/agents/n8n/N8nVersionComparatorAgent.js +645 -0
  121. package/dist/agents/n8n/N8nVersionComparatorAgent.js.map +1 -0
  122. package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts +120 -0
  123. package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts.map +1 -0
  124. package/dist/agents/n8n/N8nWorkflowExecutorAgent.js +347 -0
  125. package/dist/agents/n8n/N8nWorkflowExecutorAgent.js.map +1 -0
  126. package/dist/agents/n8n/index.d.ts +119 -0
  127. package/dist/agents/n8n/index.d.ts.map +1 -0
  128. package/dist/agents/n8n/index.js +298 -0
  129. package/dist/agents/n8n/index.js.map +1 -0
  130. package/dist/agents/n8n/types.d.ts +486 -0
  131. package/dist/agents/n8n/types.d.ts.map +1 -0
  132. package/dist/agents/n8n/types.js +8 -0
  133. package/dist/agents/n8n/types.js.map +1 -0
  134. package/dist/agents/utils/generators.d.ts +30 -0
  135. package/dist/agents/utils/generators.d.ts.map +1 -0
  136. package/dist/agents/utils/generators.js +44 -0
  137. package/dist/agents/utils/generators.js.map +1 -0
  138. package/dist/agents/utils/index.d.ts +10 -0
  139. package/dist/agents/utils/index.d.ts.map +1 -0
  140. package/dist/agents/utils/index.js +19 -0
  141. package/dist/agents/utils/index.js.map +1 -0
  142. package/dist/agents/utils/validation.d.ts +72 -0
  143. package/dist/agents/utils/validation.d.ts.map +1 -0
  144. package/dist/agents/utils/validation.js +75 -0
  145. package/dist/agents/utils/validation.js.map +1 -0
  146. package/dist/cli/init/agents.d.ts.map +1 -1
  147. package/dist/cli/init/agents.js +29 -0
  148. package/dist/cli/init/agents.js.map +1 -1
  149. package/dist/cli/init/skills.d.ts.map +1 -1
  150. package/dist/cli/init/skills.js +7 -1
  151. package/dist/cli/init/skills.js.map +1 -1
  152. package/dist/core/memory/HNSWVectorMemory.js +1 -1
  153. package/dist/core/memory/SwarmMemoryManager.d.ts +114 -90
  154. package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
  155. package/dist/core/memory/SwarmMemoryManager.js +277 -235
  156. package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
  157. package/dist/learning/baselines/StandardTaskSuite.d.ts.map +1 -1
  158. package/dist/learning/baselines/StandardTaskSuite.js +38 -0
  159. package/dist/learning/baselines/StandardTaskSuite.js.map +1 -1
  160. package/dist/mcp/server-instructions.d.ts +1 -1
  161. package/dist/mcp/server-instructions.js +1 -1
  162. package/dist/types/memory-interfaces.d.ts +76 -68
  163. package/dist/types/memory-interfaces.d.ts.map +1 -1
  164. package/dist/types/memory-interfaces.js +3 -0
  165. package/dist/types/memory-interfaces.js.map +1 -1
  166. package/docs/reference/agents.md +91 -2
  167. package/docs/reference/skills.md +97 -2
  168. package/package.json +2 -2
@@ -0,0 +1,632 @@
1
+ "use strict";
2
+ /**
3
+ * N8nExpressionValidatorAgent
4
+ *
5
+ * Validates n8n expressions and data transformations:
6
+ * - Expression syntax checking
7
+ * - Context-aware validation
8
+ * - Security analysis (injection risks)
9
+ * - Code node validation
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.N8nExpressionValidatorAgent = void 0;
13
+ const N8nBaseAgent_1 = require("./N8nBaseAgent");
14
+ // Patterns for expression analysis
15
+ const EXPRESSION_PATTERNS = {
16
+ simple: /^\{\{\s*\$[a-zA-Z]+\.[a-zA-Z_.[\]0-9]+\s*\}\}$/,
17
+ function: /\{\{.*\.(toUpperCase|toLowerCase|split|join|map|filter|reduce|substring|slice|trim|replace|match|includes|startsWith|endsWith)\s*\(/,
18
+ ternary: /\{\{.*\?.*:.*\}\}/,
19
+ arithmetic: /\{\{.*[+\-*/%].*\}\}/,
20
+ comparison: /\{\{.*(===?|!==?|>=?|<=?).*\}\}/,
21
+ };
22
+ // Security patterns to detect
23
+ const SECURITY_PATTERNS = {
24
+ eval: /eval\s*\(/i,
25
+ function: /new\s+Function\s*\(/i,
26
+ processEnv: /process\.env\./,
27
+ require: /require\s*\(/i,
28
+ import: /import\s*\(/,
29
+ fileSystem: /(fs\.|readFile|writeFile|unlink)/i,
30
+ shell: /(exec|spawn|execSync|spawnSync)\s*\(/i,
31
+ sqlInjection: /['"]?\s*\+\s*\$json\./,
32
+ commandInjection: /\$\{?\$json\.[^}]*\}?\s*[;&|`]/,
33
+ };
34
+ class N8nExpressionValidatorAgent extends N8nBaseAgent_1.N8nBaseAgent {
35
+ constructor(config) {
36
+ const capabilities = [
37
+ {
38
+ name: 'expression-extraction',
39
+ version: '1.0.0',
40
+ description: 'Extract and analyze n8n expressions',
41
+ parameters: {},
42
+ },
43
+ {
44
+ name: 'syntax-validation',
45
+ version: '1.0.0',
46
+ description: 'Validate expression syntax',
47
+ parameters: {},
48
+ },
49
+ {
50
+ name: 'security-analysis',
51
+ version: '1.0.0',
52
+ description: 'Detect security risks in expressions',
53
+ parameters: {},
54
+ },
55
+ {
56
+ name: 'code-node-validation',
57
+ version: '1.0.0',
58
+ description: 'Validate JavaScript code in Code nodes',
59
+ parameters: {},
60
+ },
61
+ ];
62
+ super({
63
+ ...config,
64
+ type: 'n8n-expression-validator',
65
+ capabilities: [...capabilities, ...(config.capabilities || [])],
66
+ });
67
+ }
68
+ async performTask(task) {
69
+ const exprTask = task;
70
+ if (exprTask.type !== 'expression-validation') {
71
+ throw new Error(`Unsupported task type: ${exprTask.type}`);
72
+ }
73
+ return this.validateExpressions(exprTask.target, exprTask.options);
74
+ }
75
+ /**
76
+ * Validate all expressions in a workflow
77
+ *
78
+ * PRODUCTION DEFAULT: Runtime validation is ENABLED by default.
79
+ * This ensures expressions are actually evaluated, not just statically analyzed.
80
+ * Set executeRuntimeValidation: false to disable if workflow cannot be executed.
81
+ */
82
+ async validateExpressions(workflowId, options) {
83
+ const workflow = await this.getWorkflow(workflowId);
84
+ // Extract all expressions
85
+ const expressions = this.extractAllExpressions(workflow);
86
+ // Validate each expression
87
+ const issues = [];
88
+ for (const expr of expressions) {
89
+ // Syntax validation
90
+ issues.push(...this.validateSyntax(expr));
91
+ // Security validation
92
+ if (options?.validateSecurity !== false) {
93
+ issues.push(...this.validateSecurity(expr));
94
+ }
95
+ // Data reference validation - ENABLED BY DEFAULT for production
96
+ if (options?.validateDataReferences !== false) {
97
+ issues.push(...this.validateDataReferences(expr, workflow));
98
+ }
99
+ }
100
+ // Validate Code nodes
101
+ if (options?.checkCodeNodes !== false) {
102
+ issues.push(...this.validateCodeNodes(workflow));
103
+ }
104
+ // Runtime expression validation - ENABLED BY DEFAULT
105
+ // This is critical for production - static analysis alone misses runtime errors
106
+ // Set executeRuntimeValidation: false explicitly to skip
107
+ let runtimeResults = [];
108
+ if (options?.executeRuntimeValidation !== false) {
109
+ try {
110
+ runtimeResults = await this.executeRuntimeValidation(workflowId, expressions, options?.testData);
111
+ // Add issues for failed runtime evaluations
112
+ for (const result of runtimeResults) {
113
+ if (!result.success) {
114
+ issues.push({
115
+ node: result.node,
116
+ field: result.field,
117
+ expression: result.expression,
118
+ severity: 'error',
119
+ message: `Runtime evaluation failed: ${result.error}`,
120
+ suggestion: 'Expression may reference undefined data or contain syntax errors',
121
+ });
122
+ }
123
+ }
124
+ }
125
+ catch (error) {
126
+ // If runtime execution fails, emit warning but continue with static results
127
+ this.emitEvent('expression.runtime.skipped', {
128
+ workflowId,
129
+ reason: error instanceof Error ? error.message : 'Runtime validation failed',
130
+ note: 'Static analysis completed, but runtime expression validation was skipped',
131
+ });
132
+ }
133
+ }
134
+ const result = {
135
+ valid: issues.filter(i => i.severity === 'error').length === 0,
136
+ expressions,
137
+ issues,
138
+ runtimeResults,
139
+ };
140
+ // Store result
141
+ await this.storeTestResult(`expression-validation:${workflowId}`, result);
142
+ // Emit event
143
+ this.emitEvent('expression.validation.completed', {
144
+ workflowId,
145
+ expressionsFound: expressions.length,
146
+ issuesFound: issues.length,
147
+ });
148
+ return result;
149
+ }
150
+ /**
151
+ * Extract all expressions from workflow
152
+ */
153
+ extractAllExpressions(workflow) {
154
+ const expressions = [];
155
+ const baseExpressions = this.extractExpressions(workflow);
156
+ for (const expr of baseExpressions) {
157
+ expressions.push({
158
+ node: expr.node,
159
+ field: expr.field,
160
+ expression: expr.expression,
161
+ type: this.classifyExpression(expr.expression),
162
+ referencedFields: this.extractReferencedFields(expr.expression),
163
+ });
164
+ }
165
+ return expressions;
166
+ }
167
+ /**
168
+ * Classify expression type
169
+ */
170
+ classifyExpression(expression) {
171
+ if (EXPRESSION_PATTERNS.ternary.test(expression)) {
172
+ return 'ternary';
173
+ }
174
+ if (EXPRESSION_PATTERNS.function.test(expression)) {
175
+ return 'function';
176
+ }
177
+ if (EXPRESSION_PATTERNS.simple.test(expression)) {
178
+ return 'simple';
179
+ }
180
+ return 'code';
181
+ }
182
+ /**
183
+ * Extract referenced fields from expression
184
+ */
185
+ extractReferencedFields(expression) {
186
+ const fields = [];
187
+ // Match $json.field patterns
188
+ const jsonMatches = expression.match(/\$json\.([a-zA-Z_][a-zA-Z0-9_]*)/g);
189
+ if (jsonMatches) {
190
+ fields.push(...jsonMatches.map(m => m.replace('$json.', '')));
191
+ }
192
+ // Match $input patterns
193
+ const inputMatches = expression.match(/\$input\.(first|last|all|item)\(\)\.json\.([a-zA-Z_][a-zA-Z0-9_]*)/g);
194
+ if (inputMatches) {
195
+ fields.push(...inputMatches.map(m => {
196
+ const match = m.match(/\.json\.([a-zA-Z_][a-zA-Z0-9_]*)/);
197
+ return match ? match[1] : m;
198
+ }));
199
+ }
200
+ // Match $env patterns
201
+ const envMatches = expression.match(/\$env\.([a-zA-Z_][a-zA-Z0-9_]*)/g);
202
+ if (envMatches) {
203
+ fields.push(...envMatches.map(m => `env:${m.replace('$env.', '')}`));
204
+ }
205
+ return [...new Set(fields)];
206
+ }
207
+ /**
208
+ * Validate expression syntax
209
+ */
210
+ validateSyntax(expr) {
211
+ const issues = [];
212
+ // Check for balanced braces
213
+ const openBraces = (expr.expression.match(/\{\{/g) || []).length;
214
+ const closeBraces = (expr.expression.match(/\}\}/g) || []).length;
215
+ if (openBraces !== closeBraces) {
216
+ issues.push({
217
+ node: expr.node,
218
+ field: expr.field,
219
+ expression: expr.expression,
220
+ severity: 'error',
221
+ message: 'Unbalanced expression braces',
222
+ suggestion: 'Ensure all {{ have matching }}',
223
+ });
224
+ }
225
+ // Check for empty expressions
226
+ if (/\{\{\s*\}\}/.test(expr.expression)) {
227
+ issues.push({
228
+ node: expr.node,
229
+ field: expr.field,
230
+ expression: expr.expression,
231
+ severity: 'warning',
232
+ message: 'Empty expression',
233
+ suggestion: 'Remove empty expression or add content',
234
+ });
235
+ }
236
+ // Check for invalid variable references
237
+ if (/\{\{[^}]*\$\s+/.test(expr.expression)) {
238
+ issues.push({
239
+ node: expr.node,
240
+ field: expr.field,
241
+ expression: expr.expression,
242
+ severity: 'error',
243
+ message: 'Invalid variable reference - space after $',
244
+ suggestion: 'Remove space after $ in variable reference',
245
+ });
246
+ }
247
+ // Check for common mistakes
248
+ if (/\$json\[/.test(expr.expression) && !/\$json\[['"]/.test(expr.expression)) {
249
+ issues.push({
250
+ node: expr.node,
251
+ field: expr.field,
252
+ expression: expr.expression,
253
+ severity: 'warning',
254
+ message: 'Bracket notation should use quotes',
255
+ suggestion: 'Use $json["field"] instead of $json[field]',
256
+ });
257
+ }
258
+ return issues;
259
+ }
260
+ /**
261
+ * Validate expression for security issues
262
+ */
263
+ validateSecurity(expr) {
264
+ const issues = [];
265
+ for (const [name, pattern] of Object.entries(SECURITY_PATTERNS)) {
266
+ if (pattern.test(expr.expression)) {
267
+ const severity = ['eval', 'function', 'shell', 'sqlInjection', 'commandInjection'].includes(name)
268
+ ? 'error'
269
+ : 'warning';
270
+ issues.push({
271
+ node: expr.node,
272
+ field: expr.field,
273
+ expression: expr.expression,
274
+ severity,
275
+ message: `Potential security risk: ${name}`,
276
+ suggestion: this.getSecuritySuggestion(name),
277
+ });
278
+ }
279
+ }
280
+ return issues;
281
+ }
282
+ /**
283
+ * Get security suggestion for issue type
284
+ */
285
+ getSecuritySuggestion(issueType) {
286
+ const suggestions = {
287
+ eval: 'Avoid using eval() - use safer alternatives',
288
+ function: 'Avoid new Function() - use predefined functions',
289
+ processEnv: 'Use n8n credentials instead of process.env',
290
+ require: 'External modules should be pre-approved',
291
+ import: 'Dynamic imports are not recommended',
292
+ fileSystem: 'File system access should be carefully controlled',
293
+ shell: 'Avoid shell execution - use dedicated nodes',
294
+ sqlInjection: 'Use parameterized queries instead of string concatenation',
295
+ commandInjection: 'Sanitize user input before using in commands',
296
+ };
297
+ return suggestions[issueType] || 'Review and secure this expression';
298
+ }
299
+ /**
300
+ * Validate data references exist
301
+ */
302
+ validateDataReferences(expr, workflow) {
303
+ const issues = [];
304
+ // Check $node references
305
+ const nodeRefs = expr.expression.match(/\$node\["([^"]+)"\]/g);
306
+ if (nodeRefs) {
307
+ const nodeNames = new Set(workflow.nodes.map(n => n.name));
308
+ for (const ref of nodeRefs) {
309
+ const nodeName = ref.match(/\$node\["([^"]+)"\]/)?.[1];
310
+ if (nodeName && !nodeNames.has(nodeName)) {
311
+ issues.push({
312
+ node: expr.node,
313
+ field: expr.field,
314
+ expression: expr.expression,
315
+ severity: 'error',
316
+ message: `Referenced node "${nodeName}" does not exist`,
317
+ suggestion: 'Check node name spelling or use existing node',
318
+ });
319
+ }
320
+ }
321
+ }
322
+ return issues;
323
+ }
324
+ /**
325
+ * Validate Code nodes
326
+ */
327
+ validateCodeNodes(workflow) {
328
+ const issues = [];
329
+ const codeNodes = this.findNodesByType(workflow, 'n8n-nodes-base.code');
330
+ for (const node of codeNodes) {
331
+ const jsCode = node.parameters.jsCode;
332
+ if (!jsCode)
333
+ continue;
334
+ // Check for security patterns in code
335
+ for (const [name, pattern] of Object.entries(SECURITY_PATTERNS)) {
336
+ if (pattern.test(jsCode)) {
337
+ issues.push({
338
+ node: node.name,
339
+ field: 'jsCode',
340
+ expression: jsCode.substring(0, 100) + '...',
341
+ severity: ['eval', 'function', 'shell'].includes(name) ? 'error' : 'warning',
342
+ message: `Code node contains potential security risk: ${name}`,
343
+ suggestion: this.getSecuritySuggestion(name),
344
+ });
345
+ }
346
+ }
347
+ // Check for common code issues
348
+ if (!/return\s/.test(jsCode)) {
349
+ issues.push({
350
+ node: node.name,
351
+ field: 'jsCode',
352
+ expression: jsCode.substring(0, 100) + '...',
353
+ severity: 'warning',
354
+ message: 'Code node may not return data',
355
+ suggestion: 'Ensure the code returns data using return statement',
356
+ });
357
+ }
358
+ // Check for infinite loops
359
+ if (/while\s*\(\s*true\s*\)/.test(jsCode) && !/break/.test(jsCode)) {
360
+ issues.push({
361
+ node: node.name,
362
+ field: 'jsCode',
363
+ expression: jsCode.substring(0, 100) + '...',
364
+ severity: 'error',
365
+ message: 'Potential infinite loop detected',
366
+ suggestion: 'Add break condition to while(true) loop',
367
+ });
368
+ }
369
+ }
370
+ return issues;
371
+ }
372
+ /**
373
+ * Validate a single expression string
374
+ */
375
+ validateSingleExpression(expression, nodeName = 'unknown') {
376
+ const expr = {
377
+ node: nodeName,
378
+ field: 'input',
379
+ expression,
380
+ type: this.classifyExpression(expression),
381
+ referencedFields: this.extractReferencedFields(expression),
382
+ };
383
+ return [
384
+ ...this.validateSyntax(expr),
385
+ ...this.validateSecurity(expr),
386
+ ];
387
+ }
388
+ /**
389
+ * Get expression complexity score
390
+ */
391
+ getExpressionComplexity(expression) {
392
+ let score = 1;
393
+ const factors = [];
394
+ if (EXPRESSION_PATTERNS.function.test(expression)) {
395
+ score += 2;
396
+ factors.push('function call');
397
+ }
398
+ if (EXPRESSION_PATTERNS.ternary.test(expression)) {
399
+ score += 2;
400
+ factors.push('ternary operator');
401
+ }
402
+ if (EXPRESSION_PATTERNS.arithmetic.test(expression)) {
403
+ score += 1;
404
+ factors.push('arithmetic');
405
+ }
406
+ const nestedBraces = (expression.match(/\{\{/g) || []).length;
407
+ if (nestedBraces > 1) {
408
+ score += nestedBraces;
409
+ factors.push(`${nestedBraces} nested expressions`);
410
+ }
411
+ const chainedCalls = (expression.match(/\.[a-zA-Z]+\(/g) || []).length;
412
+ if (chainedCalls > 2) {
413
+ score += chainedCalls;
414
+ factors.push(`${chainedCalls} chained calls`);
415
+ }
416
+ return { score, factors };
417
+ }
418
+ /**
419
+ * Execute expressions at runtime to validate they evaluate correctly
420
+ * This actually runs the workflow with test data and captures expression outputs
421
+ */
422
+ async executeRuntimeValidation(workflowId, expressions, testData) {
423
+ const results = [];
424
+ // Default test data that covers common scenarios
425
+ const defaultTestData = {
426
+ id: 1,
427
+ name: 'Test User',
428
+ email: 'test@example.com',
429
+ status: 'active',
430
+ items: [{ id: 1, value: 'item1' }, { id: 2, value: 'item2' }],
431
+ metadata: { created: new Date().toISOString(), version: '1.0.0' },
432
+ count: 42,
433
+ enabled: true,
434
+ ...testData,
435
+ };
436
+ try {
437
+ // Execute the workflow with test data to get actual expression results
438
+ const execution = await this.executeWorkflow(workflowId, defaultTestData, {
439
+ waitForCompletion: true,
440
+ timeout: 30000,
441
+ });
442
+ // Wait for completion
443
+ const completedExecution = await this.waitForExecution(execution.id, 30000);
444
+ // Analyze the execution to see which expressions were evaluated
445
+ const runData = completedExecution.data?.resultData?.runData;
446
+ if (runData) {
447
+ // For each expression, check if the node executed and what data it produced
448
+ for (const expr of expressions) {
449
+ const startTime = Date.now();
450
+ const nodeRuns = runData[expr.node];
451
+ if (nodeRuns && nodeRuns.length > 0) {
452
+ const lastRun = nodeRuns[nodeRuns.length - 1];
453
+ // If node executed successfully, expression likely evaluated
454
+ if (lastRun.executionStatus === 'success') {
455
+ // Try to find the evaluated value in the output
456
+ const outputData = lastRun.data?.main?.[0]?.[0]?.json;
457
+ results.push({
458
+ expression: expr.expression,
459
+ node: expr.node,
460
+ field: expr.field,
461
+ success: true,
462
+ evaluatedValue: outputData,
463
+ executionTimeMs: Date.now() - startTime,
464
+ });
465
+ }
466
+ else {
467
+ results.push({
468
+ expression: expr.expression,
469
+ node: expr.node,
470
+ field: expr.field,
471
+ success: false,
472
+ error: lastRun.error?.message || 'Node execution failed',
473
+ executionTimeMs: Date.now() - startTime,
474
+ });
475
+ }
476
+ }
477
+ else {
478
+ // Node didn't execute - might be in a branch that wasn't triggered
479
+ results.push({
480
+ expression: expr.expression,
481
+ node: expr.node,
482
+ field: expr.field,
483
+ success: true, // Not an error, just not executed
484
+ evaluatedValue: undefined,
485
+ executionTimeMs: Date.now() - startTime,
486
+ });
487
+ }
488
+ }
489
+ }
490
+ // If workflow failed entirely, all expressions are suspect
491
+ if (completedExecution.status === 'failed' || completedExecution.status === 'crashed') {
492
+ const errorMsg = completedExecution.data?.resultData?.error?.message || 'Workflow execution failed';
493
+ const failedNode = completedExecution.data?.resultData?.error?.node;
494
+ // Mark expressions in the failed node as failed
495
+ for (const expr of expressions) {
496
+ const existingResult = results.find(r => r.node === expr.node && r.field === expr.field);
497
+ if (existingResult)
498
+ continue;
499
+ if (failedNode && expr.node === failedNode) {
500
+ results.push({
501
+ expression: expr.expression,
502
+ node: expr.node,
503
+ field: expr.field,
504
+ success: false,
505
+ error: errorMsg,
506
+ executionTimeMs: 0,
507
+ });
508
+ }
509
+ }
510
+ }
511
+ }
512
+ catch (error) {
513
+ // If workflow execution fails, evaluate expressions locally
514
+ for (const expr of expressions) {
515
+ const startTime = Date.now();
516
+ const localResult = this.evaluateExpressionLocally(expr.expression, defaultTestData);
517
+ results.push({
518
+ expression: expr.expression,
519
+ node: expr.node,
520
+ field: expr.field,
521
+ success: localResult.success,
522
+ evaluatedValue: localResult.value,
523
+ error: localResult.error,
524
+ executionTimeMs: Date.now() - startTime,
525
+ });
526
+ }
527
+ }
528
+ return results;
529
+ }
530
+ /**
531
+ * Evaluate expression locally as fallback when workflow can't be executed
532
+ *
533
+ * NOTE: This uses safe pattern matching for common n8n expressions instead of
534
+ * dynamic code evaluation. This is intentionally LIMITED to avoid the security
535
+ * risks that this agent itself detects (eval, new Function).
536
+ *
537
+ * For full expression evaluation, use executeRuntimeValidation() which
538
+ * executes through n8n's own expression engine.
539
+ */
540
+ evaluateExpressionLocally(expression, testData) {
541
+ try {
542
+ // Extract the expression content (between {{ }})
543
+ const match = expression.match(/\{\{(.+?)\}\}/s);
544
+ if (!match) {
545
+ return { success: false, error: 'Invalid expression format' };
546
+ }
547
+ const exprContent = match[1].trim();
548
+ // SAFE evaluation using pattern matching instead of eval/new Function
549
+ // This handles the most common n8n expression patterns
550
+ // Pattern 1: Simple $json.field access
551
+ const simpleJsonMatch = exprContent.match(/^\$json\.([a-zA-Z_][a-zA-Z0-9_]*)$/);
552
+ if (simpleJsonMatch) {
553
+ const field = simpleJsonMatch[1];
554
+ const value = testData[field];
555
+ return { success: true, value };
556
+ }
557
+ // Pattern 2: Nested $json.field.subfield access
558
+ const nestedJsonMatch = exprContent.match(/^\$json\.([a-zA-Z_][a-zA-Z0-9_.]+)$/);
559
+ if (nestedJsonMatch) {
560
+ const path = nestedJsonMatch[1].split('.');
561
+ let value = testData;
562
+ for (const part of path) {
563
+ if (value === null || value === undefined) {
564
+ return { success: true, value: undefined };
565
+ }
566
+ value = value[part];
567
+ }
568
+ return { success: true, value };
569
+ }
570
+ // Pattern 3: $json["field"] bracket notation
571
+ const bracketMatch = exprContent.match(/^\$json\["([^"]+)"\]$/);
572
+ if (bracketMatch) {
573
+ const field = bracketMatch[1];
574
+ const value = testData[field];
575
+ return { success: true, value };
576
+ }
577
+ // Pattern 4: $input.first().json.field
578
+ const inputFirstMatch = exprContent.match(/^\$input\.first\(\)\.json\.([a-zA-Z_][a-zA-Z0-9_]*)$/);
579
+ if (inputFirstMatch) {
580
+ const field = inputFirstMatch[1];
581
+ const value = testData[field];
582
+ return { success: true, value };
583
+ }
584
+ // Pattern 5: $now (current date)
585
+ if (exprContent === '$now') {
586
+ return { success: true, value: new Date().toISOString() };
587
+ }
588
+ // Pattern 6: String literals
589
+ if (exprContent.match(/^["'].*["']$/)) {
590
+ return { success: true, value: exprContent.slice(1, -1) };
591
+ }
592
+ // Pattern 7: Number literals
593
+ if (exprContent.match(/^-?\d+(\.\d+)?$/)) {
594
+ return { success: true, value: parseFloat(exprContent) };
595
+ }
596
+ // Pattern 8: Boolean literals
597
+ if (exprContent === 'true' || exprContent === 'false') {
598
+ return { success: true, value: exprContent === 'true' };
599
+ }
600
+ // Complex expressions require n8n runtime execution
601
+ // Return success=true but value=undefined to indicate "needs runtime"
602
+ return {
603
+ success: true,
604
+ value: undefined,
605
+ error: 'Complex expression requires runtime validation via n8n execution',
606
+ };
607
+ }
608
+ catch (error) {
609
+ return {
610
+ success: false,
611
+ error: error instanceof Error ? error.message : 'Evaluation failed',
612
+ };
613
+ }
614
+ }
615
+ /**
616
+ * Wait for workflow execution to complete
617
+ */
618
+ async waitForExecution(executionId, timeoutMs) {
619
+ const startTime = Date.now();
620
+ while (Date.now() - startTime < timeoutMs) {
621
+ const execution = await this.getExecution(executionId);
622
+ if (execution.status !== 'running' && execution.status !== 'waiting') {
623
+ return execution;
624
+ }
625
+ // Wait before checking again
626
+ await new Promise(resolve => setTimeout(resolve, 500));
627
+ }
628
+ throw new Error(`Execution ${executionId} timed out after ${timeoutMs}ms`);
629
+ }
630
+ }
631
+ exports.N8nExpressionValidatorAgent = N8nExpressionValidatorAgent;
632
+ //# sourceMappingURL=N8nExpressionValidatorAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"N8nExpressionValidatorAgent.js","sourceRoot":"","sources":["../../../src/agents/n8n/N8nExpressionValidatorAgent.ts"],"names":[],"mappings":"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"}