agentic-qe 2.5.6 → 2.5.8
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.
- package/.claude/agents/n8n/n8n-base-agent.md +376 -0
- package/.claude/agents/n8n/n8n-bdd-scenario-tester.md +613 -0
- package/.claude/agents/n8n/n8n-chaos-tester.md +654 -0
- package/.claude/agents/n8n/n8n-ci-orchestrator.md +850 -0
- package/.claude/agents/n8n/n8n-compliance-validator.md +685 -0
- package/.claude/agents/n8n/n8n-expression-validator.md +560 -0
- package/.claude/agents/n8n/n8n-integration-test.md +602 -0
- package/.claude/agents/n8n/n8n-monitoring-validator.md +589 -0
- package/.claude/agents/n8n/n8n-node-validator.md +455 -0
- package/.claude/agents/n8n/n8n-performance-tester.md +630 -0
- package/.claude/agents/n8n/n8n-security-auditor.md +786 -0
- package/.claude/agents/n8n/n8n-trigger-test.md +500 -0
- package/.claude/agents/n8n/n8n-unit-tester.md +633 -0
- package/.claude/agents/n8n/n8n-version-comparator.md +567 -0
- package/.claude/agents/n8n/n8n-workflow-executor.md +392 -0
- package/.claude/skills/n8n-expression-testing/SKILL.md +434 -0
- package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
- package/.claude/skills/n8n-security-testing/SKILL.md +599 -0
- package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
- package/CHANGELOG.md +127 -0
- package/README.md +7 -4
- package/dist/agents/BaseAgent.d.ts +142 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +372 -2
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +5 -0
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +38 -0
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/n8n/N8nAPIClient.d.ts +121 -0
- package/dist/agents/n8n/N8nAPIClient.d.ts.map +1 -0
- package/dist/agents/n8n/N8nAPIClient.js +367 -0
- package/dist/agents/n8n/N8nAPIClient.js.map +1 -0
- package/dist/agents/n8n/N8nAuditPersistence.d.ts +120 -0
- package/dist/agents/n8n/N8nAuditPersistence.d.ts.map +1 -0
- package/dist/agents/n8n/N8nAuditPersistence.js +473 -0
- package/dist/agents/n8n/N8nAuditPersistence.js.map +1 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts +159 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js +697 -0
- package/dist/agents/n8n/N8nBDDScenarioTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts +126 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.js +446 -0
- package/dist/agents/n8n/N8nBaseAgent.js.map +1 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts +164 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.js +610 -0
- package/dist/agents/n8n/N8nCIOrchestratorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.d.ts +205 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.js +729 -0
- package/dist/agents/n8n/N8nChaosTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts +228 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.js +986 -0
- package/dist/agents/n8n/N8nComplianceValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nContractTesterAgent.d.ts +213 -0
- package/dist/agents/n8n/N8nContractTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nContractTesterAgent.js +989 -0
- package/dist/agents/n8n/N8nContractTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts +99 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.js +632 -0
- package/dist/agents/n8n/N8nExpressionValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts +238 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.js +956 -0
- package/dist/agents/n8n/N8nFailureModeTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts +242 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.js +992 -0
- package/dist/agents/n8n/N8nIdempotencyTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts +104 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.js +653 -0
- package/dist/agents/n8n/N8nIntegrationTestAgent.js.map +1 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts +210 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.js +669 -0
- package/dist/agents/n8n/N8nMonitoringValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts +142 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.js +1090 -0
- package/dist/agents/n8n/N8nNodeValidatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts +198 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.js +653 -0
- package/dist/agents/n8n/N8nPerformanceTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts +245 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.js +952 -0
- package/dist/agents/n8n/N8nReplayabilityTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts +325 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js +1187 -0
- package/dist/agents/n8n/N8nSecretsHygieneAuditorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts +91 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.js +825 -0
- package/dist/agents/n8n/N8nSecurityAuditorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nTestHarness.d.ts +131 -0
- package/dist/agents/n8n/N8nTestHarness.d.ts.map +1 -0
- package/dist/agents/n8n/N8nTestHarness.js +456 -0
- package/dist/agents/n8n/N8nTestHarness.js.map +1 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.d.ts +119 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.js +652 -0
- package/dist/agents/n8n/N8nTriggerTestAgent.js.map +1 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.d.ts +130 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.js +522 -0
- package/dist/agents/n8n/N8nUnitTesterAgent.js.map +1 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts +201 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.js +645 -0
- package/dist/agents/n8n/N8nVersionComparatorAgent.js.map +1 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts +120 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.d.ts.map +1 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.js +347 -0
- package/dist/agents/n8n/N8nWorkflowExecutorAgent.js.map +1 -0
- package/dist/agents/n8n/index.d.ts +119 -0
- package/dist/agents/n8n/index.d.ts.map +1 -0
- package/dist/agents/n8n/index.js +298 -0
- package/dist/agents/n8n/index.js.map +1 -0
- package/dist/agents/n8n/types.d.ts +486 -0
- package/dist/agents/n8n/types.d.ts.map +1 -0
- package/dist/agents/n8n/types.js +8 -0
- package/dist/agents/n8n/types.js.map +1 -0
- package/dist/cli/init/agents.d.ts.map +1 -1
- package/dist/cli/init/agents.js +29 -0
- package/dist/cli/init/agents.js.map +1 -1
- package/dist/cli/init/skills.d.ts.map +1 -1
- package/dist/cli/init/skills.js +7 -1
- package/dist/cli/init/skills.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/core/memory/RuVectorPatternStore.d.ts +90 -0
- package/dist/core/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/core/memory/RuVectorPatternStore.js +209 -0
- package/dist/core/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/learning/FederatedManager.d.ts +232 -0
- package/dist/learning/FederatedManager.d.ts.map +1 -0
- package/dist/learning/FederatedManager.js +489 -0
- package/dist/learning/FederatedManager.js.map +1 -0
- package/dist/learning/HNSWPatternAdapter.d.ts +117 -0
- package/dist/learning/HNSWPatternAdapter.d.ts.map +1 -0
- package/dist/learning/HNSWPatternAdapter.js +262 -0
- package/dist/learning/HNSWPatternAdapter.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +27 -0
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +75 -1
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/PatternCurator.d.ts +217 -0
- package/dist/learning/PatternCurator.d.ts.map +1 -0
- package/dist/learning/PatternCurator.js +393 -0
- package/dist/learning/PatternCurator.js.map +1 -0
- package/dist/learning/index.d.ts +6 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +16 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +4 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/memory/HNSWPatternStore.d.ts +176 -0
- package/dist/memory/HNSWPatternStore.d.ts.map +1 -0
- package/dist/memory/HNSWPatternStore.js +392 -0
- package/dist/memory/HNSWPatternStore.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +13 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/providers/HybridRouter.d.ts +85 -4
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +332 -10
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/LLMBaselineTracker.d.ts +120 -0
- package/dist/providers/LLMBaselineTracker.d.ts.map +1 -0
- package/dist/providers/LLMBaselineTracker.js +305 -0
- package/dist/providers/LLMBaselineTracker.js.map +1 -0
- package/dist/providers/OpenRouterProvider.d.ts +26 -0
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +75 -6
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/providers/RuVectorClient.d.ts +259 -0
- package/dist/providers/RuVectorClient.d.ts.map +1 -0
- package/dist/providers/RuVectorClient.js +416 -0
- package/dist/providers/RuVectorClient.js.map +1 -0
- package/dist/providers/RuvllmPatternCurator.d.ts +116 -0
- package/dist/providers/RuvllmPatternCurator.d.ts.map +1 -0
- package/dist/providers/RuvllmPatternCurator.js +323 -0
- package/dist/providers/RuvllmPatternCurator.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +233 -1
- package/dist/providers/RuvllmProvider.d.ts.map +1 -1
- package/dist/providers/RuvllmProvider.js +781 -11
- package/dist/providers/RuvllmProvider.js.map +1 -1
- package/dist/providers/index.d.ts +5 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +12 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/utils/ruvllm-loader.d.ts +98 -1
- package/dist/utils/ruvllm-loader.d.ts.map +1 -1
- package/dist/utils/ruvllm-loader.js.map +1 -1
- package/docs/reference/agents.md +91 -2
- package/docs/reference/skills.md +97 -2
- 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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"}
|