n8n-mcp 2.11.2 → 2.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.env.example +26 -0
  2. package/README.md +3 -3
  3. package/data/nodes.db +0 -0
  4. package/dist/config/n8n-api.d.ts +6 -0
  5. package/dist/config/n8n-api.d.ts.map +1 -1
  6. package/dist/config/n8n-api.js +12 -0
  7. package/dist/config/n8n-api.js.map +1 -1
  8. package/dist/http-server-single-session.d.ts +6 -1
  9. package/dist/http-server-single-session.d.ts.map +1 -1
  10. package/dist/http-server-single-session.js +116 -4
  11. package/dist/http-server-single-session.js.map +1 -1
  12. package/dist/mcp/handlers-n8n-manager.d.ts +21 -17
  13. package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
  14. package/dist/mcp/handlers-n8n-manager.js +111 -45
  15. package/dist/mcp/handlers-n8n-manager.js.map +1 -1
  16. package/dist/mcp/handlers-workflow-diff.d.ts +2 -1
  17. package/dist/mcp/handlers-workflow-diff.d.ts.map +1 -1
  18. package/dist/mcp/handlers-workflow-diff.js +3 -3
  19. package/dist/mcp/handlers-workflow-diff.js.map +1 -1
  20. package/dist/mcp/server.d.ts +3 -1
  21. package/dist/mcp/server.d.ts.map +1 -1
  22. package/dist/mcp/server.js +34 -22
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js +2 -2
  25. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js.map +1 -1
  26. package/dist/mcp-engine.d.ts +2 -1
  27. package/dist/mcp-engine.d.ts.map +1 -1
  28. package/dist/mcp-engine.js +2 -2
  29. package/dist/mcp-engine.js.map +1 -1
  30. package/dist/scripts/sanitize-templates.js +11 -1
  31. package/dist/scripts/sanitize-templates.js.map +1 -1
  32. package/dist/services/confidence-scorer.d.ts +24 -0
  33. package/dist/services/confidence-scorer.d.ts.map +1 -0
  34. package/dist/services/confidence-scorer.js +139 -0
  35. package/dist/services/confidence-scorer.js.map +1 -0
  36. package/dist/services/expression-format-validator.d.ts +33 -0
  37. package/dist/services/expression-format-validator.d.ts.map +1 -0
  38. package/dist/services/expression-format-validator.js +209 -0
  39. package/dist/services/expression-format-validator.js.map +1 -0
  40. package/dist/services/universal-expression-validator.d.ts +20 -0
  41. package/dist/services/universal-expression-validator.d.ts.map +1 -0
  42. package/dist/services/universal-expression-validator.js +192 -0
  43. package/dist/services/universal-expression-validator.js.map +1 -0
  44. package/dist/services/workflow-diff-engine.js +7 -7
  45. package/dist/services/workflow-ownership.d.ts +35 -0
  46. package/dist/services/workflow-ownership.d.ts.map +1 -0
  47. package/dist/services/workflow-ownership.js +195 -0
  48. package/dist/services/workflow-ownership.js.map +1 -0
  49. package/dist/services/workflow-validator.d.ts +1 -0
  50. package/dist/services/workflow-validator.d.ts.map +1 -1
  51. package/dist/services/workflow-validator.js +94 -1
  52. package/dist/services/workflow-validator.js.map +1 -1
  53. package/dist/types/instance-context.d.ts +15 -0
  54. package/dist/types/instance-context.d.ts.map +1 -0
  55. package/dist/types/instance-context.js +127 -0
  56. package/dist/types/instance-context.js.map +1 -0
  57. package/dist/types/n8n-api.d.ts +6 -0
  58. package/dist/types/n8n-api.d.ts.map +1 -1
  59. package/dist/types/n8n-api.js.map +1 -1
  60. package/dist/types/workflow-diff.d.ts +2 -2
  61. package/dist/utils/cache-utils.d.ts +58 -0
  62. package/dist/utils/cache-utils.d.ts.map +1 -0
  63. package/dist/utils/cache-utils.js +243 -0
  64. package/dist/utils/cache-utils.js.map +1 -0
  65. package/dist/utils/template-sanitizer.d.ts.map +1 -1
  66. package/dist/utils/template-sanitizer.js +6 -3
  67. package/dist/utils/template-sanitizer.js.map +1 -1
  68. package/package.json +2 -1
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfidenceScorer = void 0;
4
+ class ConfidenceScorer {
5
+ static scoreResourceLocatorRecommendation(fieldName, nodeType, value) {
6
+ const factors = [];
7
+ let totalWeight = 0;
8
+ let matchedWeight = 0;
9
+ const exactFieldMatch = this.checkExactFieldMatch(fieldName, nodeType);
10
+ factors.push({
11
+ name: 'exact-field-match',
12
+ weight: 0.5,
13
+ matched: exactFieldMatch,
14
+ description: `Field name '${fieldName}' is known to use resource locator in ${nodeType}`
15
+ });
16
+ const patternMatch = this.checkFieldPattern(fieldName);
17
+ factors.push({
18
+ name: 'field-pattern',
19
+ weight: 0.3,
20
+ matched: patternMatch,
21
+ description: `Field name '${fieldName}' matches common resource locator patterns`
22
+ });
23
+ const valuePattern = this.checkValuePattern(value);
24
+ factors.push({
25
+ name: 'value-pattern',
26
+ weight: 0.1,
27
+ matched: valuePattern,
28
+ description: 'Value contains patterns typical of resource identifiers'
29
+ });
30
+ const nodeCategory = this.checkNodeCategory(nodeType);
31
+ factors.push({
32
+ name: 'node-category',
33
+ weight: 0.1,
34
+ matched: nodeCategory,
35
+ description: `Node type '${nodeType}' typically uses resource locators`
36
+ });
37
+ for (const factor of factors) {
38
+ totalWeight += factor.weight;
39
+ if (factor.matched) {
40
+ matchedWeight += factor.weight;
41
+ }
42
+ }
43
+ const score = totalWeight > 0 ? matchedWeight / totalWeight : 0;
44
+ let reason;
45
+ if (score >= 0.8) {
46
+ reason = 'High confidence: Multiple strong indicators suggest resource locator format';
47
+ }
48
+ else if (score >= 0.5) {
49
+ reason = 'Medium confidence: Some indicators suggest resource locator format';
50
+ }
51
+ else if (score >= 0.3) {
52
+ reason = 'Low confidence: Weak indicators for resource locator format';
53
+ }
54
+ else {
55
+ reason = 'Very low confidence: Minimal evidence for resource locator format';
56
+ }
57
+ return {
58
+ value: score,
59
+ reason,
60
+ factors
61
+ };
62
+ }
63
+ static checkExactFieldMatch(fieldName, nodeType) {
64
+ const nodeBase = nodeType.split('.').pop()?.toLowerCase() || '';
65
+ for (const [pattern, fields] of Object.entries(this.EXACT_FIELD_MAPPINGS)) {
66
+ if (nodeBase === pattern || nodeBase.startsWith(`${pattern}-`)) {
67
+ return fields.includes(fieldName);
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ static checkFieldPattern(fieldName) {
73
+ return this.FIELD_PATTERNS.some(pattern => pattern.test(fieldName));
74
+ }
75
+ static checkValuePattern(value) {
76
+ const content = value.startsWith('=') ? value.substring(1) : value;
77
+ if (!content.includes('{{') || !content.includes('}}')) {
78
+ return false;
79
+ }
80
+ const patterns = [
81
+ /\{\{.*\.(id|Id|ID|key|Key|name|Name|path|Path|url|Url|uri|Uri).*\}\}/i,
82
+ /\{\{.*_(id|Id|ID|key|Key|name|Name|path|Path|url|Url|uri|Uri).*\}\}/i,
83
+ /\{\{.*(id|Id|ID|key|Key|name|Name|path|Path|url|Url|uri|Uri).*\}\}/i
84
+ ];
85
+ return patterns.some(pattern => pattern.test(content));
86
+ }
87
+ static checkNodeCategory(nodeType) {
88
+ const nodeBase = nodeType.split('.').pop()?.toLowerCase() || '';
89
+ return this.RESOURCE_HEAVY_NODES.some(category => nodeBase.includes(category));
90
+ }
91
+ static getConfidenceLevel(score) {
92
+ if (score >= 0.8)
93
+ return 'high';
94
+ if (score >= 0.5)
95
+ return 'medium';
96
+ if (score >= 0.3)
97
+ return 'low';
98
+ return 'very-low';
99
+ }
100
+ static shouldApplyRecommendation(score, threshold = 'normal') {
101
+ const thresholds = {
102
+ strict: 0.8,
103
+ normal: 0.5,
104
+ relaxed: 0.3
105
+ };
106
+ return score >= thresholds[threshold];
107
+ }
108
+ }
109
+ exports.ConfidenceScorer = ConfidenceScorer;
110
+ ConfidenceScorer.EXACT_FIELD_MAPPINGS = {
111
+ 'github': ['owner', 'repository', 'user', 'organization'],
112
+ 'googlesheets': ['sheetId', 'documentId', 'spreadsheetId'],
113
+ 'googledrive': ['fileId', 'folderId', 'driveId'],
114
+ 'slack': ['channel', 'user', 'channelId', 'userId'],
115
+ 'notion': ['databaseId', 'pageId', 'blockId'],
116
+ 'airtable': ['baseId', 'tableId', 'viewId']
117
+ };
118
+ ConfidenceScorer.FIELD_PATTERNS = [
119
+ /^.*Id$/i,
120
+ /^.*Ids$/i,
121
+ /^.*Key$/i,
122
+ /^.*Name$/i,
123
+ /^.*Path$/i,
124
+ /^.*Url$/i,
125
+ /^.*Uri$/i,
126
+ /^(table|database|collection|bucket|folder|file|document|sheet|board|project|issue|user|channel|team|organization|repository|owner)$/i
127
+ ];
128
+ ConfidenceScorer.RESOURCE_HEAVY_NODES = [
129
+ 'github', 'gitlab', 'bitbucket',
130
+ 'googlesheets', 'googledrive', 'dropbox',
131
+ 'slack', 'discord', 'telegram',
132
+ 'notion', 'airtable', 'baserow',
133
+ 'jira', 'asana', 'trello', 'monday',
134
+ 'salesforce', 'hubspot', 'pipedrive',
135
+ 'stripe', 'paypal', 'square',
136
+ 'aws', 'gcp', 'azure',
137
+ 'mysql', 'postgres', 'mongodb', 'redis'
138
+ ];
139
+ //# sourceMappingURL=confidence-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence-scorer.js","sourceRoot":"","sources":["../../src/services/confidence-scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface ExpressionFormatIssue {
2
+ fieldPath: string;
3
+ currentValue: any;
4
+ correctedValue: any;
5
+ issueType: 'missing-prefix' | 'needs-resource-locator' | 'invalid-rl-structure' | 'mixed-format';
6
+ explanation: string;
7
+ severity: 'error' | 'warning';
8
+ confidence?: number;
9
+ }
10
+ export interface ResourceLocatorField {
11
+ __rl: true;
12
+ value: string;
13
+ mode: string;
14
+ }
15
+ export interface ValidationContext {
16
+ nodeType: string;
17
+ nodeName: string;
18
+ nodeId?: string;
19
+ }
20
+ export declare class ExpressionFormatValidator {
21
+ private static readonly VALID_RL_MODES;
22
+ private static readonly MAX_RECURSION_DEPTH;
23
+ private static readonly EXPRESSION_PREFIX;
24
+ private static readonly RESOURCE_LOCATOR_FIELDS;
25
+ private static shouldUseResourceLocator;
26
+ private static isResourceLocator;
27
+ private static generateCorrection;
28
+ static validateAndFix(value: any, fieldPath: string, context: ValidationContext): ExpressionFormatIssue | null;
29
+ static validateNodeParameters(parameters: any, context: ValidationContext): ExpressionFormatIssue[];
30
+ private static validateRecursive;
31
+ static formatErrorMessage(issue: ExpressionFormatIssue, context: ValidationContext): string;
32
+ }
33
+ //# sourceMappingURL=expression-format-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-format-validator.d.ts","sourceRoot":"","sources":["../../src/services/expression-format-validator.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,GAAG,CAAC;IAClB,cAAc,EAAE,GAAG,CAAC;IACpB,SAAS,EAAE,gBAAgB,GAAG,wBAAwB,GAAG,sBAAsB,GAAG,cAAc,CAAC;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAwD;IAC9F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAMhD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAmB7C;IAMF,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoBvC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAoBhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAsBjC,MAAM,CAAC,cAAc,CACnB,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,qBAAqB,GAAG,IAAI;IAgH/B,MAAM,CAAC,sBAAsB,CAC3B,UAAU,EAAE,GAAG,EACf,OAAO,EAAE,iBAAiB,GACzB,qBAAqB,EAAE;IAY1B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA0DhC,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM;CAoB5F"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExpressionFormatValidator = void 0;
4
+ const universal_expression_validator_1 = require("./universal-expression-validator");
5
+ const confidence_scorer_1 = require("./confidence-scorer");
6
+ class ExpressionFormatValidator {
7
+ static shouldUseResourceLocator(fieldName, nodeType) {
8
+ const nodeBase = nodeType.split('.').pop()?.toLowerCase() || '';
9
+ for (const [pattern, fields] of Object.entries(this.RESOURCE_LOCATOR_FIELDS)) {
10
+ if ((nodeBase === pattern || nodeBase.startsWith(`${pattern}-`)) && fields.includes(fieldName)) {
11
+ return true;
12
+ }
13
+ }
14
+ return false;
15
+ }
16
+ static isResourceLocator(value) {
17
+ if (typeof value !== 'object' || value === null || value.__rl !== true) {
18
+ return false;
19
+ }
20
+ if (!('value' in value) || !('mode' in value)) {
21
+ return false;
22
+ }
23
+ if (typeof value.mode !== 'string' || !this.VALID_RL_MODES.includes(value.mode)) {
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ static generateCorrection(value, needsResourceLocator) {
29
+ const correctedValue = value.startsWith(this.EXPRESSION_PREFIX)
30
+ ? value
31
+ : `${this.EXPRESSION_PREFIX}${value}`;
32
+ if (needsResourceLocator) {
33
+ return {
34
+ __rl: true,
35
+ value: correctedValue,
36
+ mode: 'expression'
37
+ };
38
+ }
39
+ return correctedValue;
40
+ }
41
+ static validateAndFix(value, fieldPath, context) {
42
+ if (typeof value !== 'string' && !this.isResourceLocator(value)) {
43
+ return null;
44
+ }
45
+ if (this.isResourceLocator(value)) {
46
+ const universalResults = universal_expression_validator_1.UniversalExpressionValidator.validate(value.value);
47
+ const invalidResult = universalResults.find(r => !r.isValid && r.needsPrefix);
48
+ if (invalidResult) {
49
+ return {
50
+ fieldPath,
51
+ currentValue: value,
52
+ correctedValue: {
53
+ ...value,
54
+ value: universal_expression_validator_1.UniversalExpressionValidator.getCorrectedValue(value.value)
55
+ },
56
+ issueType: 'missing-prefix',
57
+ explanation: `Resource locator value: ${invalidResult.explanation}`,
58
+ severity: 'error'
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ const universalResults = universal_expression_validator_1.UniversalExpressionValidator.validate(value);
64
+ const invalidResults = universalResults.filter(r => !r.isValid);
65
+ if (invalidResults.length > 0) {
66
+ const prefixIssue = invalidResults.find(r => r.needsPrefix);
67
+ if (prefixIssue) {
68
+ const fieldName = fieldPath.split('.').pop() || '';
69
+ const confidenceScore = confidence_scorer_1.ConfidenceScorer.scoreResourceLocatorRecommendation(fieldName, context.nodeType, value);
70
+ if (confidenceScore.value >= 0.8) {
71
+ return {
72
+ fieldPath,
73
+ currentValue: value,
74
+ correctedValue: this.generateCorrection(value, true),
75
+ issueType: 'needs-resource-locator',
76
+ explanation: `Field '${fieldName}' contains expression but needs resource locator format with '${this.EXPRESSION_PREFIX}' prefix for evaluation.`,
77
+ severity: 'error',
78
+ confidence: confidenceScore.value
79
+ };
80
+ }
81
+ else {
82
+ return {
83
+ fieldPath,
84
+ currentValue: value,
85
+ correctedValue: universal_expression_validator_1.UniversalExpressionValidator.getCorrectedValue(value),
86
+ issueType: 'missing-prefix',
87
+ explanation: prefixIssue.explanation,
88
+ severity: 'error'
89
+ };
90
+ }
91
+ }
92
+ const firstIssue = invalidResults[0];
93
+ return {
94
+ fieldPath,
95
+ currentValue: value,
96
+ correctedValue: value,
97
+ issueType: 'mixed-format',
98
+ explanation: firstIssue.explanation,
99
+ severity: 'error'
100
+ };
101
+ }
102
+ const hasExpression = universalResults.some(r => r.hasExpression);
103
+ if (hasExpression && typeof value === 'string') {
104
+ const fieldName = fieldPath.split('.').pop() || '';
105
+ const confidenceScore = confidence_scorer_1.ConfidenceScorer.scoreResourceLocatorRecommendation(fieldName, context.nodeType, value);
106
+ if (confidenceScore.value >= 0.5) {
107
+ return {
108
+ fieldPath,
109
+ currentValue: value,
110
+ correctedValue: this.generateCorrection(value, true),
111
+ issueType: 'needs-resource-locator',
112
+ explanation: `Field '${fieldName}' should use resource locator format for better compatibility. (Confidence: ${Math.round(confidenceScore.value * 100)}%)`,
113
+ severity: 'warning',
114
+ confidence: confidenceScore.value
115
+ };
116
+ }
117
+ }
118
+ return null;
119
+ }
120
+ static validateNodeParameters(parameters, context) {
121
+ const issues = [];
122
+ const visited = new WeakSet();
123
+ this.validateRecursive(parameters, '', context, issues, visited);
124
+ return issues;
125
+ }
126
+ static validateRecursive(obj, path, context, issues, visited, depth = 0) {
127
+ if (depth > this.MAX_RECURSION_DEPTH) {
128
+ issues.push({
129
+ fieldPath: path,
130
+ currentValue: obj,
131
+ correctedValue: obj,
132
+ issueType: 'mixed-format',
133
+ explanation: `Maximum recursion depth (${this.MAX_RECURSION_DEPTH}) exceeded. Object may have circular references or be too deeply nested.`,
134
+ severity: 'warning'
135
+ });
136
+ return;
137
+ }
138
+ if (obj && typeof obj === 'object') {
139
+ if (visited.has(obj))
140
+ return;
141
+ visited.add(obj);
142
+ }
143
+ const issue = this.validateAndFix(obj, path, context);
144
+ if (issue) {
145
+ issues.push(issue);
146
+ }
147
+ if (Array.isArray(obj)) {
148
+ obj.forEach((item, index) => {
149
+ const newPath = path ? `${path}[${index}]` : `[${index}]`;
150
+ this.validateRecursive(item, newPath, context, issues, visited, depth + 1);
151
+ });
152
+ }
153
+ else if (obj && typeof obj === 'object') {
154
+ if (this.isResourceLocator(obj)) {
155
+ return;
156
+ }
157
+ Object.entries(obj).forEach(([key, value]) => {
158
+ if (key.startsWith('__'))
159
+ return;
160
+ const newPath = path ? `${path}.${key}` : key;
161
+ this.validateRecursive(value, newPath, context, issues, visited, depth + 1);
162
+ });
163
+ }
164
+ }
165
+ static formatErrorMessage(issue, context) {
166
+ let message = `Expression format ${issue.severity} in node '${context.nodeName}':\n`;
167
+ message += `Field '${issue.fieldPath}' ${issue.explanation}\n\n`;
168
+ message += `Current (incorrect):\n`;
169
+ if (typeof issue.currentValue === 'string') {
170
+ message += `"${issue.fieldPath}": "${issue.currentValue}"\n\n`;
171
+ }
172
+ else {
173
+ message += `"${issue.fieldPath}": ${JSON.stringify(issue.currentValue, null, 2)}\n\n`;
174
+ }
175
+ message += `Fixed (correct):\n`;
176
+ if (typeof issue.correctedValue === 'string') {
177
+ message += `"${issue.fieldPath}": "${issue.correctedValue}"`;
178
+ }
179
+ else {
180
+ message += `"${issue.fieldPath}": ${JSON.stringify(issue.correctedValue, null, 2)}`;
181
+ }
182
+ return message;
183
+ }
184
+ }
185
+ exports.ExpressionFormatValidator = ExpressionFormatValidator;
186
+ ExpressionFormatValidator.VALID_RL_MODES = ['id', 'url', 'expression', 'name', 'list'];
187
+ ExpressionFormatValidator.MAX_RECURSION_DEPTH = 100;
188
+ ExpressionFormatValidator.EXPRESSION_PREFIX = '=';
189
+ ExpressionFormatValidator.RESOURCE_LOCATOR_FIELDS = {
190
+ 'github': ['owner', 'repository', 'user', 'organization'],
191
+ 'googleSheets': ['sheetId', 'documentId', 'spreadsheetId', 'rangeDefinition'],
192
+ 'googleDrive': ['fileId', 'folderId', 'driveId'],
193
+ 'slack': ['channel', 'user', 'channelId', 'userId', 'teamId'],
194
+ 'notion': ['databaseId', 'pageId', 'blockId'],
195
+ 'airtable': ['baseId', 'tableId', 'viewId'],
196
+ 'monday': ['boardId', 'itemId', 'groupId'],
197
+ 'hubspot': ['contactId', 'companyId', 'dealId'],
198
+ 'salesforce': ['recordId', 'objectName'],
199
+ 'jira': ['projectKey', 'issueKey', 'boardId'],
200
+ 'gitlab': ['projectId', 'mergeRequestId', 'issueId'],
201
+ 'mysql': ['table', 'database', 'schema'],
202
+ 'postgres': ['table', 'database', 'schema'],
203
+ 'mongodb': ['collection', 'database'],
204
+ 's3': ['bucketName', 'key', 'fileName'],
205
+ 'ftp': ['path', 'fileName'],
206
+ 'ssh': ['path', 'fileName'],
207
+ 'redis': ['key'],
208
+ };
209
+ //# sourceMappingURL=expression-format-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-format-validator.js","sourceRoot":"","sources":["../../src/services/expression-format-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface UniversalValidationResult {
2
+ isValid: boolean;
3
+ hasExpression: boolean;
4
+ needsPrefix: boolean;
5
+ isMixedContent: boolean;
6
+ confidence: 1.0;
7
+ suggestion?: string;
8
+ explanation: string;
9
+ }
10
+ export declare class UniversalExpressionValidator {
11
+ private static readonly EXPRESSION_PATTERN;
12
+ private static readonly EXPRESSION_PREFIX;
13
+ static validateExpressionPrefix(value: any): UniversalValidationResult;
14
+ private static hasMixedContent;
15
+ static validateExpressionSyntax(value: string): UniversalValidationResult;
16
+ static validateCommonPatterns(value: string): UniversalValidationResult;
17
+ static validate(value: any): UniversalValidationResult[];
18
+ static getCorrectedValue(value: string): string;
19
+ }
20
+ //# sourceMappingURL=universal-expression-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal-expression-validator.d.ts","sourceRoot":"","sources":["../../src/services/universal-expression-validator.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,GAAG,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,4BAA4B;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAO;IAMhD,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,GAAG,yBAAyB;IA4DtE,OAAO,CAAC,MAAM,CAAC,eAAe;IAe9B,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB;IA8DzE,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB;IAwDvE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,yBAAyB,EAAE;IAyCxD,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAWhD"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UniversalExpressionValidator = void 0;
4
+ class UniversalExpressionValidator {
5
+ static validateExpressionPrefix(value) {
6
+ if (typeof value !== 'string') {
7
+ return {
8
+ isValid: true,
9
+ hasExpression: false,
10
+ needsPrefix: false,
11
+ isMixedContent: false,
12
+ confidence: 1.0,
13
+ explanation: 'Not a string value'
14
+ };
15
+ }
16
+ const hasExpression = this.EXPRESSION_PATTERN.test(value);
17
+ if (!hasExpression) {
18
+ return {
19
+ isValid: true,
20
+ hasExpression: false,
21
+ needsPrefix: false,
22
+ isMixedContent: false,
23
+ confidence: 1.0,
24
+ explanation: 'No n8n expression found'
25
+ };
26
+ }
27
+ const hasPrefix = value.startsWith(this.EXPRESSION_PREFIX);
28
+ const isMixedContent = this.hasMixedContent(value);
29
+ if (!hasPrefix) {
30
+ return {
31
+ isValid: false,
32
+ hasExpression: true,
33
+ needsPrefix: true,
34
+ isMixedContent,
35
+ confidence: 1.0,
36
+ suggestion: `${this.EXPRESSION_PREFIX}${value}`,
37
+ explanation: isMixedContent
38
+ ? 'Mixed literal text and expression requires = prefix for expression evaluation'
39
+ : 'Expression requires = prefix to be evaluated'
40
+ };
41
+ }
42
+ return {
43
+ isValid: true,
44
+ hasExpression: true,
45
+ needsPrefix: false,
46
+ isMixedContent,
47
+ confidence: 1.0,
48
+ explanation: 'Expression is properly formatted with = prefix'
49
+ };
50
+ }
51
+ static hasMixedContent(value) {
52
+ const content = value.startsWith(this.EXPRESSION_PREFIX)
53
+ ? value.substring(1)
54
+ : value;
55
+ const withoutExpressions = content.replace(/\{\{[\s\S]+?\}\}/g, '');
56
+ return withoutExpressions.trim().length > 0;
57
+ }
58
+ static validateExpressionSyntax(value) {
59
+ const hasAnyBrackets = value.includes('{{') || value.includes('}}');
60
+ if (!hasAnyBrackets) {
61
+ return {
62
+ isValid: true,
63
+ hasExpression: false,
64
+ needsPrefix: false,
65
+ isMixedContent: false,
66
+ confidence: 1.0,
67
+ explanation: 'No expression to validate'
68
+ };
69
+ }
70
+ const openCount = (value.match(/\{\{/g) || []).length;
71
+ const closeCount = (value.match(/\}\}/g) || []).length;
72
+ if (openCount !== closeCount) {
73
+ return {
74
+ isValid: false,
75
+ hasExpression: true,
76
+ needsPrefix: false,
77
+ isMixedContent: false,
78
+ confidence: 1.0,
79
+ explanation: `Unmatched expression brackets: ${openCount} opening, ${closeCount} closing`
80
+ };
81
+ }
82
+ const expressions = value.match(/\{\{[\s\S]+?\}\}/g) || [];
83
+ for (const expr of expressions) {
84
+ const content = expr.slice(2, -2).trim();
85
+ if (!content) {
86
+ return {
87
+ isValid: false,
88
+ hasExpression: true,
89
+ needsPrefix: false,
90
+ isMixedContent: false,
91
+ confidence: 1.0,
92
+ explanation: 'Empty expression {{ }} is not valid'
93
+ };
94
+ }
95
+ }
96
+ return {
97
+ isValid: true,
98
+ hasExpression: expressions.length > 0,
99
+ needsPrefix: false,
100
+ isMixedContent: this.hasMixedContent(value),
101
+ confidence: 1.0,
102
+ explanation: 'Expression syntax is valid'
103
+ };
104
+ }
105
+ static validateCommonPatterns(value) {
106
+ if (!this.EXPRESSION_PATTERN.test(value)) {
107
+ return {
108
+ isValid: true,
109
+ hasExpression: false,
110
+ needsPrefix: false,
111
+ isMixedContent: false,
112
+ confidence: 1.0,
113
+ explanation: 'No expression to validate'
114
+ };
115
+ }
116
+ const expressions = value.match(/\{\{[\s\S]+?\}\}/g) || [];
117
+ const warnings = [];
118
+ for (const expr of expressions) {
119
+ const content = expr.slice(2, -2).trim();
120
+ if (content.includes('${') && content.includes('}')) {
121
+ warnings.push(`Template literal syntax \${} found - use n8n syntax instead: ${expr}`);
122
+ }
123
+ if (content.startsWith('=')) {
124
+ warnings.push(`Double prefix detected in expression: ${expr}`);
125
+ }
126
+ if (content.includes('{{') || content.includes('}}')) {
127
+ warnings.push(`Nested brackets detected: ${expr}`);
128
+ }
129
+ }
130
+ if (warnings.length > 0) {
131
+ return {
132
+ isValid: false,
133
+ hasExpression: true,
134
+ needsPrefix: false,
135
+ isMixedContent: false,
136
+ confidence: 1.0,
137
+ explanation: warnings.join('; ')
138
+ };
139
+ }
140
+ return {
141
+ isValid: true,
142
+ hasExpression: true,
143
+ needsPrefix: false,
144
+ isMixedContent: this.hasMixedContent(value),
145
+ confidence: 1.0,
146
+ explanation: 'Expression patterns are valid'
147
+ };
148
+ }
149
+ static validate(value) {
150
+ const results = [];
151
+ const prefixResult = this.validateExpressionPrefix(value);
152
+ if (!prefixResult.isValid) {
153
+ results.push(prefixResult);
154
+ }
155
+ if (typeof value === 'string') {
156
+ const syntaxResult = this.validateExpressionSyntax(value);
157
+ if (!syntaxResult.isValid) {
158
+ results.push(syntaxResult);
159
+ }
160
+ const patternResult = this.validateCommonPatterns(value);
161
+ if (!patternResult.isValid) {
162
+ results.push(patternResult);
163
+ }
164
+ }
165
+ if (results.length === 0) {
166
+ results.push({
167
+ isValid: true,
168
+ hasExpression: prefixResult.hasExpression,
169
+ needsPrefix: false,
170
+ isMixedContent: prefixResult.isMixedContent,
171
+ confidence: 1.0,
172
+ explanation: prefixResult.hasExpression
173
+ ? 'Expression is valid'
174
+ : 'No expression found'
175
+ });
176
+ }
177
+ return results;
178
+ }
179
+ static getCorrectedValue(value) {
180
+ if (!this.EXPRESSION_PATTERN.test(value)) {
181
+ return value;
182
+ }
183
+ if (!value.startsWith(this.EXPRESSION_PREFIX)) {
184
+ return `${this.EXPRESSION_PREFIX}${value}`;
185
+ }
186
+ return value;
187
+ }
188
+ }
189
+ exports.UniversalExpressionValidator = UniversalExpressionValidator;
190
+ UniversalExpressionValidator.EXPRESSION_PATTERN = /\{\{[\s\S]+?\}\}/;
191
+ UniversalExpressionValidator.EXPRESSION_PREFIX = '=';
192
+ //# sourceMappingURL=universal-expression-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"universal-expression-validator.js","sourceRoot":"","sources":["../../src/services/universal-expression-validator.ts"],"names":[],"mappings":"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"}