n8n-mcp 2.11.3 → 2.13.0

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 (122) hide show
  1. package/.env.example +26 -0
  2. package/README.md +8 -6
  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 +22 -17
  13. package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
  14. package/dist/mcp/handlers-n8n-manager.js +255 -46
  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 +2 -2
  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 +41 -22
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/mcp/tool-docs/index.d.ts.map +1 -1
  25. package/dist/mcp/tool-docs/index.js +1 -0
  26. package/dist/mcp/tool-docs/index.js.map +1 -1
  27. package/dist/mcp/tool-docs/validation/validate-workflow.js +1 -1
  28. package/dist/mcp/tool-docs/validation/validate-workflow.js.map +1 -1
  29. package/dist/mcp/tool-docs/workflow_management/index.d.ts +1 -0
  30. package/dist/mcp/tool-docs/workflow_management/index.d.ts.map +1 -1
  31. package/dist/mcp/tool-docs/workflow_management/index.js +3 -1
  32. package/dist/mcp/tool-docs/workflow_management/index.js.map +1 -1
  33. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts +3 -0
  34. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts.map +1 -0
  35. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js +127 -0
  36. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js.map +1 -0
  37. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js +1 -1
  38. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js.map +1 -1
  39. package/dist/mcp/tools-n8n-manager.d.ts.map +1 -1
  40. package/dist/mcp/tools-n8n-manager.js +35 -0
  41. package/dist/mcp/tools-n8n-manager.js.map +1 -1
  42. package/dist/mcp-engine.d.ts +2 -1
  43. package/dist/mcp-engine.d.ts.map +1 -1
  44. package/dist/mcp-engine.js +2 -2
  45. package/dist/mcp-engine.js.map +1 -1
  46. package/dist/scripts/debug-http-search.d.ts +3 -0
  47. package/dist/scripts/debug-http-search.d.ts.map +1 -0
  48. package/dist/scripts/debug-http-search.js +57 -0
  49. package/dist/scripts/debug-http-search.js.map +1 -0
  50. package/dist/scripts/sanitize-templates.js +11 -1
  51. package/dist/scripts/sanitize-templates.js.map +1 -1
  52. package/dist/scripts/test-autofix-documentation.d.ts +3 -0
  53. package/dist/scripts/test-autofix-documentation.d.ts.map +1 -0
  54. package/dist/scripts/test-autofix-documentation.js +103 -0
  55. package/dist/scripts/test-autofix-documentation.js.map +1 -0
  56. package/dist/scripts/test-autofix-workflow.d.ts +2 -0
  57. package/dist/scripts/test-autofix-workflow.d.ts.map +1 -0
  58. package/dist/scripts/test-autofix-workflow.js +223 -0
  59. package/dist/scripts/test-autofix-workflow.js.map +1 -0
  60. package/dist/scripts/test-node-suggestions.d.ts +3 -0
  61. package/dist/scripts/test-node-suggestions.d.ts.map +1 -0
  62. package/dist/scripts/test-node-suggestions.js +165 -0
  63. package/dist/scripts/test-node-suggestions.js.map +1 -0
  64. package/dist/scripts/test-summary.d.ts +3 -0
  65. package/dist/scripts/test-summary.d.ts.map +1 -0
  66. package/dist/scripts/test-summary.js +77 -0
  67. package/dist/scripts/test-summary.js.map +1 -0
  68. package/dist/scripts/test-validation-parity.d.ts +2 -0
  69. package/dist/scripts/test-validation-parity.d.ts.map +1 -0
  70. package/dist/scripts/test-validation-parity.js +153 -0
  71. package/dist/scripts/test-validation-parity.js.map +1 -0
  72. package/dist/scripts/test-webhook-autofix.d.ts +3 -0
  73. package/dist/scripts/test-webhook-autofix.d.ts.map +1 -0
  74. package/dist/scripts/test-webhook-autofix.js +117 -0
  75. package/dist/scripts/test-webhook-autofix.js.map +1 -0
  76. package/dist/services/confidence-scorer.d.ts +24 -0
  77. package/dist/services/confidence-scorer.d.ts.map +1 -0
  78. package/dist/services/confidence-scorer.js +139 -0
  79. package/dist/services/confidence-scorer.js.map +1 -0
  80. package/dist/services/expression-format-validator.d.ts +33 -0
  81. package/dist/services/expression-format-validator.d.ts.map +1 -0
  82. package/dist/services/expression-format-validator.js +209 -0
  83. package/dist/services/expression-format-validator.js.map +1 -0
  84. package/dist/services/node-similarity-service.d.ts +51 -0
  85. package/dist/services/node-similarity-service.d.ts.map +1 -0
  86. package/dist/services/node-similarity-service.js +335 -0
  87. package/dist/services/node-similarity-service.js.map +1 -0
  88. package/dist/services/universal-expression-validator.d.ts +20 -0
  89. package/dist/services/universal-expression-validator.d.ts.map +1 -0
  90. package/dist/services/universal-expression-validator.js +192 -0
  91. package/dist/services/universal-expression-validator.js.map +1 -0
  92. package/dist/services/workflow-auto-fixer.d.ts +65 -0
  93. package/dist/services/workflow-auto-fixer.d.ts.map +1 -0
  94. package/dist/services/workflow-auto-fixer.js +394 -0
  95. package/dist/services/workflow-auto-fixer.js.map +1 -0
  96. package/dist/services/workflow-ownership.d.ts +35 -0
  97. package/dist/services/workflow-ownership.d.ts.map +1 -0
  98. package/dist/services/workflow-ownership.js +195 -0
  99. package/dist/services/workflow-ownership.js.map +1 -0
  100. package/dist/services/workflow-validator.d.ts +2 -1
  101. package/dist/services/workflow-validator.d.ts.map +1 -1
  102. package/dist/services/workflow-validator.js +131 -90
  103. package/dist/services/workflow-validator.js.map +1 -1
  104. package/dist/types/instance-context.d.ts +15 -0
  105. package/dist/types/instance-context.d.ts.map +1 -0
  106. package/dist/types/instance-context.js +127 -0
  107. package/dist/types/instance-context.js.map +1 -0
  108. package/dist/types/n8n-api.d.ts +6 -0
  109. package/dist/types/n8n-api.d.ts.map +1 -1
  110. package/dist/types/n8n-api.js.map +1 -1
  111. package/dist/utils/cache-utils.d.ts +58 -0
  112. package/dist/utils/cache-utils.d.ts.map +1 -0
  113. package/dist/utils/cache-utils.js +243 -0
  114. package/dist/utils/cache-utils.js.map +1 -0
  115. package/dist/utils/node-type-utils.d.ts +9 -0
  116. package/dist/utils/node-type-utils.d.ts.map +1 -0
  117. package/dist/utils/node-type-utils.js +78 -0
  118. package/dist/utils/node-type-utils.js.map +1 -0
  119. package/dist/utils/template-sanitizer.d.ts.map +1 -1
  120. package/dist/utils/template-sanitizer.js +6 -3
  121. package/dist/utils/template-sanitizer.js.map +1 -1
  122. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-auto-fixer.js","sourceRoot":"","sources":["../../src/services/workflow-auto-fixer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { InstanceContext } from '../types/instance-context';
2
+ import { N8nApiClient } from './n8n-api-client';
3
+ import { Workflow } from '../types/n8n-api';
4
+ export interface WorkflowOwnershipInfo {
5
+ workflowId: string;
6
+ instanceId: string;
7
+ instanceUrl: string;
8
+ createdAt: Date;
9
+ lastVerified: Date;
10
+ }
11
+ export declare class WorkflowOwnershipService {
12
+ private apiClient?;
13
+ private ownershipCache;
14
+ private readonly CACHE_TTL;
15
+ private readonly INSTANCE_TAG_PREFIX;
16
+ private readonly MAX_CACHE_SIZE;
17
+ constructor(apiClient?: N8nApiClient | undefined);
18
+ setApiClient(client: N8nApiClient): void;
19
+ private getInstanceIdentifier;
20
+ private getInstanceTag;
21
+ private extractInstanceFromTags;
22
+ validateAccess(workflowId: string, context: InstanceContext): Promise<boolean>;
23
+ trackOwnership(workflowId: string, context: InstanceContext): Promise<void>;
24
+ private claimWorkflow;
25
+ filterWorkflowsByInstance(workflows: Workflow[], context: InstanceContext): Promise<Workflow[]>;
26
+ private updateOwnershipCache;
27
+ private isCacheValid;
28
+ clearCache(): void;
29
+ getCacheStats(): {
30
+ size: number;
31
+ maxSize: number;
32
+ ttl: number;
33
+ };
34
+ }
35
+ //# sourceMappingURL=workflow-ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ownership.d.ts","sourceRoot":"","sources":["../../src/services/workflow-ownership.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAKD,qBAAa,wBAAwB;IAavB,OAAO,CAAC,SAAS,CAAC;IAX9B,OAAO,CAAC,cAAc,CAA4C;IAGlE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAG3C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAmB;IAGvD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAEpB,SAAS,CAAC,EAAE,YAAY,YAAA;IAK5C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAOxC,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,uBAAuB;IAYzB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAiF9E,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;YA6CnE,aAAa;IAkCrB,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA2BrG,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,YAAY;IAQpB,UAAU,IAAI,IAAI;IAQlB,aAAa,IAAI;QACf,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb;CAOF"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkflowOwnershipService = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ const cache_utils_1 = require("../utils/cache-utils");
6
+ class WorkflowOwnershipService {
7
+ constructor(apiClient) {
8
+ this.apiClient = apiClient;
9
+ this.ownershipCache = new Map();
10
+ this.CACHE_TTL = 5 * 60 * 1000;
11
+ this.INSTANCE_TAG_PREFIX = 'mcp-instance:';
12
+ this.MAX_CACHE_SIZE = 10000;
13
+ }
14
+ setApiClient(client) {
15
+ this.apiClient = client;
16
+ }
17
+ getInstanceIdentifier(context) {
18
+ if (context.instanceId) {
19
+ return context.instanceId;
20
+ }
21
+ return (0, cache_utils_1.createCacheKey)(`${context.n8nApiUrl}:${context.n8nApiKey}`).substring(0, 16);
22
+ }
23
+ getInstanceTag(context) {
24
+ return `${this.INSTANCE_TAG_PREFIX}${this.getInstanceIdentifier(context)}`;
25
+ }
26
+ extractInstanceFromTags(tags) {
27
+ if (!tags || tags.length === 0)
28
+ return null;
29
+ const instanceTag = tags.find(tag => tag.startsWith(this.INSTANCE_TAG_PREFIX));
30
+ if (!instanceTag)
31
+ return null;
32
+ return instanceTag.replace(this.INSTANCE_TAG_PREFIX, '');
33
+ }
34
+ async validateAccess(workflowId, context) {
35
+ if (!context?.n8nApiUrl || !context?.n8nApiKey) {
36
+ logger_1.logger.debug('No instance context provided, allowing access for backward compatibility');
37
+ return true;
38
+ }
39
+ const instanceId = this.getInstanceIdentifier(context);
40
+ const cached = this.ownershipCache.get(workflowId);
41
+ if (cached && this.isCacheValid(cached)) {
42
+ const hasAccess = cached.instanceId === instanceId;
43
+ logger_1.logger.debug('Workflow ownership cache hit', {
44
+ workflowId,
45
+ instanceId,
46
+ cachedOwner: cached.instanceId,
47
+ hasAccess
48
+ });
49
+ return hasAccess;
50
+ }
51
+ logger_1.logger.debug('Workflow ownership cache miss, verifying ownership', {
52
+ workflowId,
53
+ instanceId
54
+ });
55
+ try {
56
+ if (!this.apiClient) {
57
+ logger_1.logger.warn('No API client available for ownership verification');
58
+ return true;
59
+ }
60
+ const workflow = await this.apiClient.getWorkflow(workflowId);
61
+ const workflowInstanceId = this.extractInstanceFromTags(workflow.tags);
62
+ if (workflowInstanceId === null) {
63
+ logger_1.logger.info('Workflow has no instance tag, treating as unclaimed', {
64
+ workflowId,
65
+ workflowName: workflow.name
66
+ });
67
+ await this.claimWorkflow(workflowId, workflow, context);
68
+ return true;
69
+ }
70
+ this.updateOwnershipCache(workflowId, workflowInstanceId, context.n8nApiUrl || '');
71
+ const hasAccess = workflowInstanceId === instanceId;
72
+ if (!hasAccess) {
73
+ logger_1.logger.warn('Access denied: workflow belongs to different instance', {
74
+ workflowId,
75
+ requestingInstance: instanceId,
76
+ owningInstance: workflowInstanceId
77
+ });
78
+ }
79
+ return hasAccess;
80
+ }
81
+ catch (error) {
82
+ logger_1.logger.error('Error validating workflow ownership', {
83
+ workflowId,
84
+ instanceId,
85
+ error: error instanceof Error ? error.message : String(error)
86
+ });
87
+ return false;
88
+ }
89
+ }
90
+ async trackOwnership(workflowId, context) {
91
+ if (!context?.n8nApiUrl || !context?.n8nApiKey) {
92
+ logger_1.logger.debug('No instance context for ownership tracking');
93
+ return;
94
+ }
95
+ const instanceId = this.getInstanceIdentifier(context);
96
+ const instanceTag = this.getInstanceTag(context);
97
+ try {
98
+ if (this.apiClient) {
99
+ const workflow = await this.apiClient.getWorkflow(workflowId);
100
+ const tags = workflow.tags || [];
101
+ if (!tags.some(tag => tag.startsWith(this.INSTANCE_TAG_PREFIX))) {
102
+ tags.push(instanceTag);
103
+ await this.apiClient.updateWorkflow(workflowId, { tags });
104
+ logger_1.logger.info('Added instance ownership tag to workflow', {
105
+ workflowId,
106
+ instanceId,
107
+ instanceTag
108
+ });
109
+ }
110
+ }
111
+ this.updateOwnershipCache(workflowId, instanceId, context.n8nApiUrl);
112
+ }
113
+ catch (error) {
114
+ logger_1.logger.error('Error tracking workflow ownership', {
115
+ workflowId,
116
+ instanceId,
117
+ error: error instanceof Error ? error.message : String(error)
118
+ });
119
+ }
120
+ }
121
+ async claimWorkflow(workflowId, workflow, context) {
122
+ if (!this.apiClient)
123
+ return;
124
+ const instanceTag = this.getInstanceTag(context);
125
+ const tags = workflow.tags || [];
126
+ tags.push(instanceTag);
127
+ try {
128
+ await this.apiClient.updateWorkflow(workflowId, { tags });
129
+ logger_1.logger.info('Claimed unclaimed workflow for instance', {
130
+ workflowId,
131
+ workflowName: workflow.name,
132
+ instanceId: this.getInstanceIdentifier(context)
133
+ });
134
+ this.updateOwnershipCache(workflowId, this.getInstanceIdentifier(context), context.n8nApiUrl || '');
135
+ }
136
+ catch (error) {
137
+ logger_1.logger.error('Error claiming workflow', {
138
+ workflowId,
139
+ error: error instanceof Error ? error.message : String(error)
140
+ });
141
+ }
142
+ }
143
+ async filterWorkflowsByInstance(workflows, context) {
144
+ if (!context?.n8nApiUrl || !context?.n8nApiKey) {
145
+ return workflows;
146
+ }
147
+ const instanceId = this.getInstanceIdentifier(context);
148
+ return workflows.filter(workflow => {
149
+ const workflowInstanceId = this.extractInstanceFromTags(workflow.tags);
150
+ if (workflowInstanceId === null) {
151
+ logger_1.logger.debug('Including unclaimed workflow in list', {
152
+ workflowId: workflow.id,
153
+ workflowName: workflow.name
154
+ });
155
+ return true;
156
+ }
157
+ return workflowInstanceId === instanceId;
158
+ });
159
+ }
160
+ updateOwnershipCache(workflowId, instanceId, instanceUrl) {
161
+ if (this.ownershipCache.size >= this.MAX_CACHE_SIZE) {
162
+ const entriesToRemove = Math.floor(this.MAX_CACHE_SIZE * 0.1);
163
+ const keys = Array.from(this.ownershipCache.keys()).slice(0, entriesToRemove);
164
+ keys.forEach(key => this.ownershipCache.delete(key));
165
+ logger_1.logger.debug('Evicted ownership cache entries', {
166
+ evicted: entriesToRemove,
167
+ remaining: this.ownershipCache.size
168
+ });
169
+ }
170
+ this.ownershipCache.set(workflowId, {
171
+ workflowId,
172
+ instanceId,
173
+ instanceUrl,
174
+ createdAt: new Date(),
175
+ lastVerified: new Date()
176
+ });
177
+ }
178
+ isCacheValid(entry) {
179
+ const age = Date.now() - entry.lastVerified.getTime();
180
+ return age < this.CACHE_TTL;
181
+ }
182
+ clearCache() {
183
+ this.ownershipCache.clear();
184
+ logger_1.logger.debug('Cleared workflow ownership cache');
185
+ }
186
+ getCacheStats() {
187
+ return {
188
+ size: this.ownershipCache.size,
189
+ maxSize: this.MAX_CACHE_SIZE,
190
+ ttl: this.CACHE_TTL
191
+ };
192
+ }
193
+ }
194
+ exports.WorkflowOwnershipService = WorkflowOwnershipService;
195
+ //# sourceMappingURL=workflow-ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ownership.js","sourceRoot":"","sources":["../../src/services/workflow-ownership.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,7 @@ export declare class WorkflowValidator {
72
72
  private nodeRepository;
73
73
  private nodeValidator;
74
74
  private currentWorkflow;
75
+ private similarityService;
75
76
  constructor(nodeRepository: NodeRepository, nodeValidator: typeof EnhancedConfigValidator);
76
77
  private isStickyNote;
77
78
  validateWorkflow(workflow: WorkflowJson, options?: {
@@ -84,6 +85,7 @@ export declare class WorkflowValidator {
84
85
  private validateAllNodes;
85
86
  private validateConnections;
86
87
  private validateConnectionOutputs;
88
+ private validateErrorOutputConfiguration;
87
89
  private validateAIToolConnection;
88
90
  private hasCycle;
89
91
  private validateExpressions;
@@ -91,7 +93,6 @@ export declare class WorkflowValidator {
91
93
  private nodeHasInput;
92
94
  private checkWorkflowPatterns;
93
95
  private getLongestLinearChain;
94
- private findSimilarNodeTypes;
95
96
  private generateSuggestions;
96
97
  private checkNodeErrorHandling;
97
98
  private generateErrorHandlingSuggestions;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-validator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-validator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-validator.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.WorkflowValidator = void 0;
4
4
  const expression_validator_1 = require("./expression-validator");
5
+ const expression_format_validator_1 = require("./expression-format-validator");
6
+ const node_similarity_service_1 = require("./node-similarity-service");
7
+ const node_type_utils_1 = require("../utils/node-type-utils");
5
8
  const logger_1 = require("../utils/logger");
6
9
  const logger = new logger_1.Logger({ prefix: '[WorkflowValidator]' });
7
10
  class WorkflowValidator {
@@ -9,6 +12,7 @@ class WorkflowValidator {
9
12
  this.nodeRepository = nodeRepository;
10
13
  this.nodeValidator = nodeValidator;
11
14
  this.currentWorkflow = null;
15
+ this.similarityService = new node_similarity_service_1.NodeSimilarityService(nodeRepository);
12
16
  }
13
17
  isStickyNote(node) {
14
18
  const stickyNoteTypes = [
@@ -115,7 +119,7 @@ class WorkflowValidator {
115
119
  }
116
120
  if (workflow.nodes.length === 1) {
117
121
  const singleNode = workflow.nodes[0];
118
- const normalizedType = singleNode.type.replace('n8n-nodes-base.', 'nodes-base.');
122
+ const normalizedType = (0, node_type_utils_1.normalizeNodeType)(singleNode.type);
119
123
  const isWebhook = normalizedType === 'nodes-base.webhook' ||
120
124
  normalizedType === 'nodes-base.webhookTrigger';
121
125
  if (!isWebhook) {
@@ -163,7 +167,7 @@ class WorkflowValidator {
163
167
  nodeIds.add(node.id);
164
168
  }
165
169
  const triggerNodes = workflow.nodes.filter(n => {
166
- const normalizedType = n.type.replace('n8n-nodes-base.', 'nodes-base.');
170
+ const normalizedType = (0, node_type_utils_1.normalizeNodeType)(n.type);
167
171
  return normalizedType.toLowerCase().includes('trigger') ||
168
172
  normalizedType.toLowerCase().includes('webhook') ||
169
173
  normalizedType === 'nodes-base.start' ||
@@ -223,47 +227,45 @@ class WorkflowValidator {
223
227
  }
224
228
  let nodeInfo = this.nodeRepository.getNode(node.type);
225
229
  if (!nodeInfo) {
226
- let normalizedType = node.type;
227
- if (node.type.startsWith('n8n-nodes-base.')) {
228
- normalizedType = node.type.replace('n8n-nodes-base.', 'nodes-base.');
229
- nodeInfo = this.nodeRepository.getNode(normalizedType);
230
- }
231
- else if (node.type.startsWith('@n8n/n8n-nodes-langchain.')) {
232
- normalizedType = node.type.replace('@n8n/n8n-nodes-langchain.', 'nodes-langchain.');
230
+ const normalizedType = (0, node_type_utils_1.normalizeNodeType)(node.type);
231
+ if (normalizedType !== node.type) {
233
232
  nodeInfo = this.nodeRepository.getNode(normalizedType);
234
233
  }
235
234
  }
236
235
  if (!nodeInfo) {
237
- let suggestion = '';
238
- if (node.type.startsWith('nodes-base.')) {
239
- const withPrefix = node.type.replace('nodes-base.', 'n8n-nodes-base.');
240
- const exists = this.nodeRepository.getNode(withPrefix) ||
241
- this.nodeRepository.getNode(withPrefix.replace('n8n-nodes-base.', 'nodes-base.'));
242
- if (exists) {
243
- suggestion = ` Did you mean "n8n-nodes-base.${node.type.substring(11)}"?`;
244
- }
245
- }
246
- else if (!node.type.includes('.')) {
247
- const commonNodes = [
248
- 'webhook', 'httpRequest', 'set', 'code', 'manualTrigger',
249
- 'scheduleTrigger', 'emailSend', 'slack', 'discord'
250
- ];
251
- if (commonNodes.includes(node.type)) {
252
- suggestion = ` Did you mean "n8n-nodes-base.${node.type}"?`;
236
+ const suggestions = await this.similarityService.findSimilarNodes(node.type, 3);
237
+ let message = `Unknown node type: "${node.type}".`;
238
+ if (suggestions.length > 0) {
239
+ message += '\n\nDid you mean one of these?';
240
+ for (const suggestion of suggestions) {
241
+ const confidence = Math.round(suggestion.confidence * 100);
242
+ message += `\n• ${suggestion.nodeType} (${confidence}% match)`;
243
+ if (suggestion.displayName) {
244
+ message += ` - ${suggestion.displayName}`;
245
+ }
246
+ message += `\n → ${suggestion.reason}`;
247
+ if (suggestion.confidence >= 0.9) {
248
+ message += ' (can be auto-fixed)';
249
+ }
253
250
  }
254
251
  }
255
- if (!suggestion) {
256
- const similarNodes = this.findSimilarNodeTypes(node.type);
257
- if (similarNodes.length > 0) {
258
- suggestion = ` Did you mean: ${similarNodes.map(n => `"${n}"`).join(', ')}?`;
259
- }
252
+ else {
253
+ message += ' No similar nodes found. Node types must include the package prefix (e.g., "n8n-nodes-base.webhook").';
260
254
  }
261
- result.errors.push({
255
+ const error = {
262
256
  type: 'error',
263
257
  nodeId: node.id,
264
258
  nodeName: node.name,
265
- message: `Unknown node type: "${node.type}".${suggestion} Node types must include the package prefix (e.g., "n8n-nodes-base.webhook", not "webhook" or "nodes-base.webhook").`
266
- });
259
+ message
260
+ };
261
+ if (suggestions.length > 0) {
262
+ error.suggestions = suggestions.map(s => ({
263
+ nodeType: s.nodeType,
264
+ confidence: s.confidence,
265
+ reason: s.reason
266
+ }));
267
+ }
268
+ result.errors.push(error);
267
269
  continue;
268
270
  }
269
271
  if (nodeInfo.isVersioned) {
@@ -387,7 +389,7 @@ class WorkflowValidator {
387
389
  for (const node of workflow.nodes) {
388
390
  if (node.disabled || this.isStickyNote(node))
389
391
  continue;
390
- const normalizedType = node.type.replace('n8n-nodes-base.', 'nodes-base.');
392
+ const normalizedType = (0, node_type_utils_1.normalizeNodeType)(node.type);
391
393
  const isTrigger = normalizedType.toLowerCase().includes('trigger') ||
392
394
  normalizedType.toLowerCase().includes('webhook') ||
393
395
  normalizedType === 'nodes-base.start' ||
@@ -411,6 +413,9 @@ class WorkflowValidator {
411
413
  }
412
414
  validateConnectionOutputs(sourceName, outputs, nodeMap, nodeIdMap, result, outputType) {
413
415
  const sourceNode = nodeMap.get(sourceName);
416
+ if (outputType === 'main' && sourceNode) {
417
+ this.validateErrorOutputConfiguration(sourceName, sourceNode, outputs, nodeMap, result);
418
+ }
414
419
  outputs.forEach((outputConnections, outputIndex) => {
415
420
  if (!outputConnections)
416
421
  return;
@@ -468,16 +473,75 @@ class WorkflowValidator {
468
473
  });
469
474
  });
470
475
  }
476
+ validateErrorOutputConfiguration(sourceName, sourceNode, outputs, nodeMap, result) {
477
+ const hasErrorOutputSetting = sourceNode.onError === 'continueErrorOutput';
478
+ const hasErrorConnections = outputs.length > 1 && outputs[1] && outputs[1].length > 0;
479
+ if (hasErrorOutputSetting && !hasErrorConnections) {
480
+ result.errors.push({
481
+ type: 'error',
482
+ nodeId: sourceNode.id,
483
+ nodeName: sourceNode.name,
484
+ message: `Node has onError: 'continueErrorOutput' but no error output connections in main[1]. Add error handler connections to main[1] or change onError to 'continueRegularOutput' or 'stopWorkflow'.`
485
+ });
486
+ }
487
+ if (!hasErrorOutputSetting && hasErrorConnections) {
488
+ result.warnings.push({
489
+ type: 'warning',
490
+ nodeId: sourceNode.id,
491
+ nodeName: sourceNode.name,
492
+ message: `Node has error output connections in main[1] but missing onError: 'continueErrorOutput'. Add this property to properly handle errors.`
493
+ });
494
+ }
495
+ if (outputs.length >= 1 && outputs[0] && outputs[0].length > 1) {
496
+ const potentialErrorHandlers = outputs[0].filter(conn => {
497
+ const targetNode = nodeMap.get(conn.node);
498
+ if (!targetNode)
499
+ return false;
500
+ const nodeName = targetNode.name.toLowerCase();
501
+ const nodeType = targetNode.type.toLowerCase();
502
+ return nodeName.includes('error') ||
503
+ nodeName.includes('fail') ||
504
+ nodeName.includes('catch') ||
505
+ nodeName.includes('exception') ||
506
+ nodeType.includes('respondtowebhook') ||
507
+ nodeType.includes('emailsend');
508
+ });
509
+ if (potentialErrorHandlers.length > 0) {
510
+ const errorHandlerNames = potentialErrorHandlers.map(conn => `"${conn.node}"`).join(', ');
511
+ result.errors.push({
512
+ type: 'error',
513
+ nodeId: sourceNode.id,
514
+ nodeName: sourceNode.name,
515
+ message: `Incorrect error output configuration. Nodes ${errorHandlerNames} appear to be error handlers but are in main[0] (success output) along with other nodes.\n\n` +
516
+ `INCORRECT (current):\n` +
517
+ `"${sourceName}": {\n` +
518
+ ` "main": [\n` +
519
+ ` [ // main[0] has multiple nodes mixed together\n` +
520
+ outputs[0].map(conn => ` {"node": "${conn.node}", "type": "${conn.type}", "index": ${conn.index}}`).join(',\n') + '\n' +
521
+ ` ]\n` +
522
+ ` ]\n` +
523
+ `}\n\n` +
524
+ `CORRECT (should be):\n` +
525
+ `"${sourceName}": {\n` +
526
+ ` "main": [\n` +
527
+ ` [ // main[0] = success output\n` +
528
+ outputs[0].filter(conn => !potentialErrorHandlers.includes(conn)).map(conn => ` {"node": "${conn.node}", "type": "${conn.type}", "index": ${conn.index}}`).join(',\n') + '\n' +
529
+ ` ],\n` +
530
+ ` [ // main[1] = error output\n` +
531
+ potentialErrorHandlers.map(conn => ` {"node": "${conn.node}", "type": "${conn.type}", "index": ${conn.index}}`).join(',\n') + '\n' +
532
+ ` ]\n` +
533
+ ` ]\n` +
534
+ `}\n\n` +
535
+ `Also add: "onError": "continueErrorOutput" to the "${sourceName}" node.`
536
+ });
537
+ }
538
+ }
539
+ }
471
540
  validateAIToolConnection(sourceName, targetNode, result) {
472
541
  let targetNodeInfo = this.nodeRepository.getNode(targetNode.type);
473
542
  if (!targetNodeInfo) {
474
- let normalizedType = targetNode.type;
475
- if (targetNode.type.startsWith('n8n-nodes-base.')) {
476
- normalizedType = targetNode.type.replace('n8n-nodes-base.', 'nodes-base.');
477
- targetNodeInfo = this.nodeRepository.getNode(normalizedType);
478
- }
479
- else if (targetNode.type.startsWith('@n8n/n8n-nodes-langchain.')) {
480
- normalizedType = targetNode.type.replace('@n8n/n8n-nodes-langchain.', 'nodes-langchain.');
543
+ const normalizedType = (0, node_type_utils_1.normalizeNodeType)(targetNode.type);
544
+ if (normalizedType !== targetNode.type) {
481
545
  targetNodeInfo = this.nodeRepository.getNode(normalizedType);
482
546
  }
483
547
  }
@@ -589,6 +653,31 @@ class WorkflowValidator {
589
653
  message: `Expression warning: ${warning}`
590
654
  });
591
655
  });
656
+ const formatContext = {
657
+ nodeType: node.type,
658
+ nodeName: node.name,
659
+ nodeId: node.id
660
+ };
661
+ const formatIssues = expression_format_validator_1.ExpressionFormatValidator.validateNodeParameters(node.parameters, formatContext);
662
+ formatIssues.forEach(issue => {
663
+ const formattedMessage = expression_format_validator_1.ExpressionFormatValidator.formatErrorMessage(issue, formatContext);
664
+ if (issue.severity === 'error') {
665
+ result.errors.push({
666
+ type: 'error',
667
+ nodeId: node.id,
668
+ nodeName: node.name,
669
+ message: formattedMessage
670
+ });
671
+ }
672
+ else {
673
+ result.warnings.push({
674
+ type: 'warning',
675
+ nodeId: node.id,
676
+ nodeName: node.name,
677
+ message: formattedMessage
678
+ });
679
+ }
680
+ });
592
681
  }
593
682
  }
594
683
  countExpressionsInObject(obj) {
@@ -624,7 +713,7 @@ class WorkflowValidator {
624
713
  return false;
625
714
  }
626
715
  checkWorkflowPatterns(workflow, result, profile = 'runtime') {
627
- const hasErrorHandling = Object.values(workflow.connections).some(outputs => outputs.error && outputs.error.length > 0);
716
+ const hasErrorHandling = Object.values(workflow.connections).some(outputs => outputs.main && outputs.main.length > 1 && outputs.main[1] && outputs.main[1].length > 0);
628
717
  if (!hasErrorHandling && workflow.nodes.length > 3 && profile !== 'minimal') {
629
718
  result.warnings.push({
630
719
  type: 'warning',
@@ -712,54 +801,6 @@ class WorkflowValidator {
712
801
  }
713
802
  return maxChain;
714
803
  }
715
- findSimilarNodeTypes(invalidType) {
716
- const suggestions = [];
717
- const nodeName = invalidType.includes('.') ? invalidType.split('.').pop() : invalidType;
718
- const commonNodeMappings = {
719
- 'webhook': ['nodes-base.webhook'],
720
- 'httpRequest': ['nodes-base.httpRequest'],
721
- 'http': ['nodes-base.httpRequest'],
722
- 'set': ['nodes-base.set'],
723
- 'code': ['nodes-base.code'],
724
- 'manualTrigger': ['nodes-base.manualTrigger'],
725
- 'manual': ['nodes-base.manualTrigger'],
726
- 'scheduleTrigger': ['nodes-base.scheduleTrigger'],
727
- 'schedule': ['nodes-base.scheduleTrigger'],
728
- 'cron': ['nodes-base.scheduleTrigger'],
729
- 'emailSend': ['nodes-base.emailSend'],
730
- 'email': ['nodes-base.emailSend'],
731
- 'slack': ['nodes-base.slack'],
732
- 'discord': ['nodes-base.discord'],
733
- 'postgres': ['nodes-base.postgres'],
734
- 'mysql': ['nodes-base.mySql'],
735
- 'mongodb': ['nodes-base.mongoDb'],
736
- 'redis': ['nodes-base.redis'],
737
- 'if': ['nodes-base.if'],
738
- 'switch': ['nodes-base.switch'],
739
- 'merge': ['nodes-base.merge'],
740
- 'splitInBatches': ['nodes-base.splitInBatches'],
741
- 'loop': ['nodes-base.splitInBatches'],
742
- 'googleSheets': ['nodes-base.googleSheets'],
743
- 'sheets': ['nodes-base.googleSheets'],
744
- 'airtable': ['nodes-base.airtable'],
745
- 'github': ['nodes-base.github'],
746
- 'git': ['nodes-base.github'],
747
- };
748
- const lowerNodeName = nodeName.toLowerCase();
749
- if (commonNodeMappings[lowerNodeName]) {
750
- suggestions.push(...commonNodeMappings[lowerNodeName]);
751
- }
752
- Object.entries(commonNodeMappings).forEach(([key, values]) => {
753
- if (key.includes(lowerNodeName) || lowerNodeName.includes(key)) {
754
- values.forEach(v => {
755
- if (!suggestions.includes(v)) {
756
- suggestions.push(v);
757
- }
758
- });
759
- }
760
- });
761
- return suggestions.slice(0, 3);
762
- }
763
804
  generateSuggestions(workflow, result) {
764
805
  if (result.statistics.triggerNodes === 0) {
765
806
  result.suggestions.push('Add a trigger node (e.g., Webhook, Schedule Trigger) to automate workflow execution');