n8n-mcp 2.12.2 → 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 (72) hide show
  1. package/README.md +6 -4
  2. package/data/nodes.db +0 -0
  3. package/dist/mcp/handlers-n8n-manager.d.ts +1 -0
  4. package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
  5. package/dist/mcp/handlers-n8n-manager.js +144 -1
  6. package/dist/mcp/handlers-n8n-manager.js.map +1 -1
  7. package/dist/mcp/server.d.ts.map +1 -1
  8. package/dist/mcp/server.js +7 -0
  9. package/dist/mcp/server.js.map +1 -1
  10. package/dist/mcp/tool-docs/index.d.ts.map +1 -1
  11. package/dist/mcp/tool-docs/index.js +1 -0
  12. package/dist/mcp/tool-docs/index.js.map +1 -1
  13. package/dist/mcp/tool-docs/validation/validate-workflow.js +1 -1
  14. package/dist/mcp/tool-docs/validation/validate-workflow.js.map +1 -1
  15. package/dist/mcp/tool-docs/workflow_management/index.d.ts +1 -0
  16. package/dist/mcp/tool-docs/workflow_management/index.d.ts.map +1 -1
  17. package/dist/mcp/tool-docs/workflow_management/index.js +3 -1
  18. package/dist/mcp/tool-docs/workflow_management/index.js.map +1 -1
  19. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts +3 -0
  20. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts.map +1 -0
  21. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js +127 -0
  22. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js.map +1 -0
  23. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js +1 -1
  24. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js.map +1 -1
  25. package/dist/mcp/tools-n8n-manager.d.ts.map +1 -1
  26. package/dist/mcp/tools-n8n-manager.js +35 -0
  27. package/dist/mcp/tools-n8n-manager.js.map +1 -1
  28. package/dist/scripts/debug-http-search.d.ts +3 -0
  29. package/dist/scripts/debug-http-search.d.ts.map +1 -0
  30. package/dist/scripts/debug-http-search.js +57 -0
  31. package/dist/scripts/debug-http-search.js.map +1 -0
  32. package/dist/scripts/test-autofix-documentation.d.ts +3 -0
  33. package/dist/scripts/test-autofix-documentation.d.ts.map +1 -0
  34. package/dist/scripts/test-autofix-documentation.js +103 -0
  35. package/dist/scripts/test-autofix-documentation.js.map +1 -0
  36. package/dist/scripts/test-autofix-workflow.d.ts +2 -0
  37. package/dist/scripts/test-autofix-workflow.d.ts.map +1 -0
  38. package/dist/scripts/test-autofix-workflow.js +223 -0
  39. package/dist/scripts/test-autofix-workflow.js.map +1 -0
  40. package/dist/scripts/test-node-suggestions.d.ts +3 -0
  41. package/dist/scripts/test-node-suggestions.d.ts.map +1 -0
  42. package/dist/scripts/test-node-suggestions.js +165 -0
  43. package/dist/scripts/test-node-suggestions.js.map +1 -0
  44. package/dist/scripts/test-summary.d.ts +3 -0
  45. package/dist/scripts/test-summary.d.ts.map +1 -0
  46. package/dist/scripts/test-summary.js +77 -0
  47. package/dist/scripts/test-summary.js.map +1 -0
  48. package/dist/scripts/test-validation-parity.d.ts +2 -0
  49. package/dist/scripts/test-validation-parity.d.ts.map +1 -0
  50. package/dist/scripts/test-validation-parity.js +153 -0
  51. package/dist/scripts/test-validation-parity.js.map +1 -0
  52. package/dist/scripts/test-webhook-autofix.d.ts +3 -0
  53. package/dist/scripts/test-webhook-autofix.d.ts.map +1 -0
  54. package/dist/scripts/test-webhook-autofix.js +117 -0
  55. package/dist/scripts/test-webhook-autofix.js.map +1 -0
  56. package/dist/services/node-similarity-service.d.ts +51 -0
  57. package/dist/services/node-similarity-service.d.ts.map +1 -0
  58. package/dist/services/node-similarity-service.js +335 -0
  59. package/dist/services/node-similarity-service.js.map +1 -0
  60. package/dist/services/workflow-auto-fixer.d.ts +65 -0
  61. package/dist/services/workflow-auto-fixer.d.ts.map +1 -0
  62. package/dist/services/workflow-auto-fixer.js +394 -0
  63. package/dist/services/workflow-auto-fixer.js.map +1 -0
  64. package/dist/services/workflow-validator.d.ts +1 -1
  65. package/dist/services/workflow-validator.d.ts.map +1 -1
  66. package/dist/services/workflow-validator.js +37 -89
  67. package/dist/services/workflow-validator.js.map +1 -1
  68. package/dist/utils/node-type-utils.d.ts +9 -0
  69. package/dist/utils/node-type-utils.d.ts.map +1 -0
  70. package/dist/utils/node-type-utils.js +78 -0
  71. package/dist/utils/node-type-utils.js.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env npx tsx
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const database_adapter_1 = require("../database/database-adapter");
8
+ const node_repository_1 = require("../database/node-repository");
9
+ const node_similarity_service_1 = require("../services/node-similarity-service");
10
+ const workflow_validator_1 = require("../services/workflow-validator");
11
+ const enhanced_config_validator_1 = require("../services/enhanced-config-validator");
12
+ const workflow_auto_fixer_1 = require("../services/workflow-auto-fixer");
13
+ const logger_1 = require("../utils/logger");
14
+ const path_1 = __importDefault(require("path"));
15
+ const logger = new logger_1.Logger({ prefix: '[NodeSuggestions Test]' });
16
+ const console = {
17
+ log: (msg) => logger.info(msg),
18
+ error: (msg, err) => logger.error(msg, err)
19
+ };
20
+ async function testNodeSimilarity() {
21
+ console.log('šŸ” Testing Enhanced Node Type Suggestions\n');
22
+ const dbPath = path_1.default.join(process.cwd(), 'data/nodes.db');
23
+ const db = await (0, database_adapter_1.createDatabaseAdapter)(dbPath);
24
+ const repository = new node_repository_1.NodeRepository(db);
25
+ const similarityService = new node_similarity_service_1.NodeSimilarityService(repository);
26
+ const validator = new workflow_validator_1.WorkflowValidator(repository, enhanced_config_validator_1.EnhancedConfigValidator);
27
+ const testCases = [
28
+ { invalid: 'HttpRequest', expected: 'nodes-base.httpRequest' },
29
+ { invalid: 'HTTPRequest', expected: 'nodes-base.httpRequest' },
30
+ { invalid: 'Webhook', expected: 'nodes-base.webhook' },
31
+ { invalid: 'WebHook', expected: 'nodes-base.webhook' },
32
+ { invalid: 'slack', expected: 'nodes-base.slack' },
33
+ { invalid: 'googleSheets', expected: 'nodes-base.googleSheets' },
34
+ { invalid: 'telegram', expected: 'nodes-base.telegram' },
35
+ { invalid: 'htpRequest', expected: 'nodes-base.httpRequest' },
36
+ { invalid: 'webook', expected: 'nodes-base.webhook' },
37
+ { invalid: 'slak', expected: 'nodes-base.slack' },
38
+ { invalid: 'http', expected: 'nodes-base.httpRequest' },
39
+ { invalid: 'sheet', expected: 'nodes-base.googleSheets' },
40
+ { invalid: 'nodes-base.openai', expected: 'nodes-langchain.openAi' },
41
+ { invalid: 'n8n-nodes-base.httpRequest', expected: 'nodes-base.httpRequest' },
42
+ { invalid: 'foobar', expected: null },
43
+ { invalid: 'xyz123', expected: null },
44
+ ];
45
+ console.log('Testing individual node type suggestions:');
46
+ console.log('='.repeat(60));
47
+ for (const testCase of testCases) {
48
+ const suggestions = await similarityService.findSimilarNodes(testCase.invalid, 3);
49
+ console.log(`\nāŒ Invalid type: "${testCase.invalid}"`);
50
+ if (suggestions.length > 0) {
51
+ console.log('✨ Suggestions:');
52
+ for (const suggestion of suggestions) {
53
+ const confidence = Math.round(suggestion.confidence * 100);
54
+ const marker = suggestion.nodeType === testCase.expected ? 'āœ…' : ' ';
55
+ console.log(`${marker} ${suggestion.nodeType} (${confidence}% match) - ${suggestion.reason}`);
56
+ if (suggestion.confidence >= 0.9) {
57
+ console.log(' šŸ’” Can be auto-fixed!');
58
+ }
59
+ }
60
+ if (testCase.expected) {
61
+ const found = suggestions.some(s => s.nodeType === testCase.expected);
62
+ if (!found) {
63
+ console.log(` āš ļø Expected "${testCase.expected}" was not suggested!`);
64
+ }
65
+ }
66
+ }
67
+ else {
68
+ console.log(' No suggestions found');
69
+ if (testCase.expected) {
70
+ console.log(` āš ļø Expected "${testCase.expected}" was not suggested!`);
71
+ }
72
+ }
73
+ }
74
+ console.log('\n' + '='.repeat(60));
75
+ console.log('\nšŸ“‹ Testing workflow validation with unknown nodes:');
76
+ console.log('='.repeat(60));
77
+ const testWorkflow = {
78
+ id: 'test-workflow',
79
+ name: 'Test Workflow',
80
+ nodes: [
81
+ {
82
+ id: '1',
83
+ name: 'Start',
84
+ type: 'nodes-base.manualTrigger',
85
+ position: [100, 100],
86
+ parameters: {},
87
+ typeVersion: 1
88
+ },
89
+ {
90
+ id: '2',
91
+ name: 'HTTP Request',
92
+ type: 'HTTPRequest',
93
+ position: [300, 100],
94
+ parameters: {},
95
+ typeVersion: 1
96
+ },
97
+ {
98
+ id: '3',
99
+ name: 'Slack',
100
+ type: 'slack',
101
+ position: [500, 100],
102
+ parameters: {},
103
+ typeVersion: 1
104
+ },
105
+ {
106
+ id: '4',
107
+ name: 'Unknown',
108
+ type: 'foobar',
109
+ position: [700, 100],
110
+ parameters: {},
111
+ typeVersion: 1
112
+ }
113
+ ],
114
+ connections: {
115
+ 'Start': {
116
+ main: [[{ node: 'HTTP Request', type: 'main', index: 0 }]]
117
+ },
118
+ 'HTTP Request': {
119
+ main: [[{ node: 'Slack', type: 'main', index: 0 }]]
120
+ },
121
+ 'Slack': {
122
+ main: [[{ node: 'Unknown', type: 'main', index: 0 }]]
123
+ }
124
+ },
125
+ settings: {}
126
+ };
127
+ const validationResult = await validator.validateWorkflow(testWorkflow, {
128
+ validateNodes: true,
129
+ validateConnections: false,
130
+ validateExpressions: false,
131
+ profile: 'runtime'
132
+ });
133
+ console.log('\nValidation Results:');
134
+ for (const error of validationResult.errors) {
135
+ if (error.message?.includes('Unknown node type:')) {
136
+ console.log(`\nšŸ”“ ${error.nodeName}: ${error.message}`);
137
+ }
138
+ }
139
+ console.log('\n' + '='.repeat(60));
140
+ console.log('\nšŸ”§ Testing AutoFixer with node type corrections:');
141
+ console.log('='.repeat(60));
142
+ const autoFixer = new workflow_auto_fixer_1.WorkflowAutoFixer(repository);
143
+ const fixResult = autoFixer.generateFixes(testWorkflow, validationResult, [], {
144
+ applyFixes: false,
145
+ fixTypes: ['node-type-correction'],
146
+ confidenceThreshold: 'high'
147
+ });
148
+ if (fixResult.fixes.length > 0) {
149
+ console.log('\nāœ… Auto-fixable issues found:');
150
+ for (const fix of fixResult.fixes) {
151
+ console.log(` • ${fix.description}`);
152
+ }
153
+ console.log(`\nSummary: ${fixResult.summary}`);
154
+ }
155
+ else {
156
+ console.log('\nāŒ No auto-fixable node type issues found (only high-confidence fixes are applied)');
157
+ }
158
+ console.log('\n' + '='.repeat(60));
159
+ console.log('\n✨ Test complete!');
160
+ }
161
+ testNodeSimilarity().catch(error => {
162
+ console.error('Test failed:', error);
163
+ process.exit(1);
164
+ });
165
+ //# sourceMappingURL=test-node-suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-node-suggestions.js","sourceRoot":"","sources":["../../src/scripts/test-node-suggestions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env npx tsx
2
+ export {};
3
+ //# sourceMappingURL=test-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-summary.d.ts","sourceRoot":"","sources":["../../src/scripts/test-summary.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env npx tsx
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const database_adapter_1 = require("../database/database-adapter");
8
+ const node_repository_1 = require("../database/node-repository");
9
+ const node_similarity_service_1 = require("../services/node-similarity-service");
10
+ const path_1 = __importDefault(require("path"));
11
+ async function testSummary() {
12
+ const dbPath = path_1.default.join(process.cwd(), 'data/nodes.db');
13
+ const db = await (0, database_adapter_1.createDatabaseAdapter)(dbPath);
14
+ const repository = new node_repository_1.NodeRepository(db);
15
+ const similarityService = new node_similarity_service_1.NodeSimilarityService(repository);
16
+ const testCases = [
17
+ { invalid: 'HttpRequest', expected: 'nodes-base.httpRequest' },
18
+ { invalid: 'HTTPRequest', expected: 'nodes-base.httpRequest' },
19
+ { invalid: 'Webhook', expected: 'nodes-base.webhook' },
20
+ { invalid: 'WebHook', expected: 'nodes-base.webhook' },
21
+ { invalid: 'slack', expected: 'nodes-base.slack' },
22
+ { invalid: 'googleSheets', expected: 'nodes-base.googleSheets' },
23
+ { invalid: 'telegram', expected: 'nodes-base.telegram' },
24
+ { invalid: 'htpRequest', expected: 'nodes-base.httpRequest' },
25
+ { invalid: 'webook', expected: 'nodes-base.webhook' },
26
+ { invalid: 'slak', expected: 'nodes-base.slack' },
27
+ { invalid: 'http', expected: 'nodes-base.httpRequest' },
28
+ { invalid: 'sheet', expected: 'nodes-base.googleSheets' },
29
+ { invalid: 'nodes-base.openai', expected: 'nodes-langchain.openAi' },
30
+ { invalid: 'n8n-nodes-base.httpRequest', expected: 'nodes-base.httpRequest' },
31
+ { invalid: 'foobar', expected: null },
32
+ { invalid: 'xyz123', expected: null },
33
+ ];
34
+ let passed = 0;
35
+ let failed = 0;
36
+ console.log('Test Results Summary:');
37
+ console.log('='.repeat(60));
38
+ for (const testCase of testCases) {
39
+ const suggestions = await similarityService.findSimilarNodes(testCase.invalid, 3);
40
+ let result = 'āŒ';
41
+ let status = 'FAILED';
42
+ if (testCase.expected === null) {
43
+ if (suggestions.length === 0) {
44
+ result = 'āœ…';
45
+ status = 'PASSED';
46
+ passed++;
47
+ }
48
+ else {
49
+ failed++;
50
+ }
51
+ }
52
+ else {
53
+ const found = suggestions.some(s => s.nodeType === testCase.expected);
54
+ if (found) {
55
+ const suggestion = suggestions.find(s => s.nodeType === testCase.expected);
56
+ const isAutoFixable = suggestion && suggestion.confidence >= 0.9;
57
+ result = 'āœ…';
58
+ status = isAutoFixable ? 'PASSED (auto-fixable)' : 'PASSED';
59
+ passed++;
60
+ }
61
+ else {
62
+ failed++;
63
+ }
64
+ }
65
+ console.log(`${result} "${testCase.invalid}" → ${testCase.expected || 'no suggestions'}: ${status}`);
66
+ }
67
+ console.log('='.repeat(60));
68
+ console.log(`\nTotal: ${passed}/${testCases.length} tests passed`);
69
+ if (failed === 0) {
70
+ console.log('šŸŽ‰ All tests passed!');
71
+ }
72
+ else {
73
+ console.log(`āš ļø ${failed} tests failed`);
74
+ }
75
+ }
76
+ testSummary().catch(console.error);
77
+ //# sourceMappingURL=test-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-summary.js","sourceRoot":"","sources":["../../src/scripts/test-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-validation-parity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-validation-parity.d.ts","sourceRoot":"","sources":["../../src/scripts/test-validation-parity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mcp_engine_1 = require("../mcp-engine");
4
+ const logger_1 = require("../utils/logger");
5
+ const logger = new logger_1.Logger({ prefix: '[ValidationParity]' });
6
+ async function testValidationParity() {
7
+ const engine = new mcp_engine_1.N8NMCPEngine();
8
+ await engine.initialize();
9
+ const testWorkflow = {
10
+ name: 'Test Validation Parity',
11
+ nodes: [
12
+ {
13
+ id: 'webhook_1',
14
+ name: 'Webhook',
15
+ type: 'n8n-nodes-base.webhook',
16
+ typeVersion: 1.1,
17
+ position: [250, 300],
18
+ parameters: {
19
+ httpMethod: 'GET',
20
+ path: 'test-webhook',
21
+ responseMode: 'onReceived',
22
+ responseData: 'firstEntryJson'
23
+ }
24
+ },
25
+ {
26
+ id: 'http_1',
27
+ name: 'HTTP Request',
28
+ type: 'n8n-nodes-base.httpRequest',
29
+ typeVersion: 5.0,
30
+ position: [450, 300],
31
+ parameters: {
32
+ method: 'GET',
33
+ url: '{{ $json.webhookUrl }}',
34
+ sendHeaders: true,
35
+ headerParameters: {
36
+ parameters: [
37
+ {
38
+ name: 'Authorization',
39
+ value: '{{ $json.token }}'
40
+ }
41
+ ]
42
+ }
43
+ },
44
+ onError: 'continueErrorOutput'
45
+ },
46
+ {
47
+ id: 'respond_1',
48
+ name: 'Respond to Webhook',
49
+ type: 'n8n-nodes-base.respondToWebhook',
50
+ typeVersion: 1.1,
51
+ position: [650, 300],
52
+ parameters: {
53
+ respondWith: 'json',
54
+ responseBody: '={{ $json }}'
55
+ }
56
+ }
57
+ ],
58
+ connections: {
59
+ 'Webhook': {
60
+ main: [
61
+ [
62
+ {
63
+ node: 'HTTP Request',
64
+ type: 'main',
65
+ index: 0
66
+ }
67
+ ]
68
+ ]
69
+ },
70
+ 'HTTP Request': {
71
+ main: [
72
+ [
73
+ {
74
+ node: 'Respond to Webhook',
75
+ type: 'main',
76
+ index: 0
77
+ }
78
+ ]
79
+ ]
80
+ }
81
+ }
82
+ };
83
+ logger.info('Testing validate_workflow tool...');
84
+ const baseValidation = await engine.callTool('validate_workflow', {
85
+ workflow: testWorkflow
86
+ });
87
+ logger.info('Base validation result:', {
88
+ valid: baseValidation.valid,
89
+ errorCount: baseValidation.summary?.errorCount || 0,
90
+ warningCount: baseValidation.summary?.warningCount || 0
91
+ });
92
+ if (baseValidation.errors?.length > 0) {
93
+ logger.info('Errors found in validate_workflow:');
94
+ for (const error of baseValidation.errors) {
95
+ if (error.message.includes('missing prefix') ||
96
+ error.message.includes('expression format') ||
97
+ error.message.includes('onError') ||
98
+ error.message.includes('error output')) {
99
+ logger.info(`āœ“ Found expected error: ${error.message.substring(0, 100)}...`);
100
+ }
101
+ }
102
+ }
103
+ if (baseValidation.warnings?.length > 0) {
104
+ logger.info('Warnings found in validate_workflow:');
105
+ for (const warning of baseValidation.warnings) {
106
+ if (warning.message.includes('missing prefix') ||
107
+ warning.message.includes('expression format')) {
108
+ logger.info(`āœ“ Found expected warning: ${warning.message.substring(0, 100)}...`);
109
+ }
110
+ }
111
+ }
112
+ const capabilities = {
113
+ detectsMissingExpressionPrefix: false,
114
+ detectsErrorOutputMismatch: false,
115
+ detectsIncorrectErrorConfig: false
116
+ };
117
+ const allMessages = [
118
+ ...(baseValidation.errors || []).map((e) => e.message),
119
+ ...(baseValidation.warnings || []).map((w) => w.message)
120
+ ];
121
+ for (const message of allMessages) {
122
+ if (message.includes('missing prefix') || message.includes('expression format')) {
123
+ capabilities.detectsMissingExpressionPrefix = true;
124
+ }
125
+ if (message.includes('onError') && message.includes('error output')) {
126
+ capabilities.detectsErrorOutputMismatch = true;
127
+ }
128
+ if (message.includes('error output configuration')) {
129
+ capabilities.detectsIncorrectErrorConfig = true;
130
+ }
131
+ }
132
+ logger.info('\nValidation Capabilities Detected:', capabilities);
133
+ const allCapabilitiesPresent = Object.values(capabilities).every(cap => cap === true);
134
+ if (allCapabilitiesPresent) {
135
+ logger.info('\nāœ… All validation capabilities are present in validate_workflow!');
136
+ }
137
+ else {
138
+ logger.error('\nāŒ Some validation capabilities are missing:');
139
+ for (const [key, value] of Object.entries(capabilities)) {
140
+ if (!value) {
141
+ logger.error(` - ${key}`);
142
+ }
143
+ }
144
+ }
145
+ logger.info('\nšŸ“ Note: n8n_validate_workflow uses the same WorkflowValidator class');
146
+ logger.info(' and EnhancedConfigValidator, so it has identical capabilities.');
147
+ await engine.shutdown();
148
+ }
149
+ testValidationParity().catch(error => {
150
+ logger.error('Test failed:', error);
151
+ process.exit(1);
152
+ });
153
+ //# sourceMappingURL=test-validation-parity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-validation-parity.js","sourceRoot":"","sources":["../../src/scripts/test-validation-parity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=test-webhook-autofix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-webhook-autofix.d.ts","sourceRoot":"","sources":["../../src/scripts/test-webhook-autofix.ts"],"names":[],"mappings":""}
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const node_repository_1 = require("../database/node-repository");
5
+ const database_adapter_1 = require("../database/database-adapter");
6
+ const workflow_auto_fixer_1 = require("../services/workflow-auto-fixer");
7
+ const workflow_validator_1 = require("../services/workflow-validator");
8
+ const enhanced_config_validator_1 = require("../services/enhanced-config-validator");
9
+ const logger_1 = require("../utils/logger");
10
+ const path_1 = require("path");
11
+ const logger = new logger_1.Logger({ prefix: '[TestWebhookAutofix]' });
12
+ const testWorkflow = {
13
+ id: 'test_webhook_fix',
14
+ name: 'Test Webhook Autofix',
15
+ active: false,
16
+ nodes: [
17
+ {
18
+ id: '1',
19
+ name: 'Webhook',
20
+ type: 'n8n-nodes-base.webhook',
21
+ typeVersion: 2.1,
22
+ position: [250, 300],
23
+ parameters: {},
24
+ },
25
+ {
26
+ id: '2',
27
+ name: 'HTTP Request',
28
+ type: 'n8n-nodes-base.httpRequest',
29
+ typeVersion: 4.2,
30
+ position: [450, 300],
31
+ parameters: {
32
+ url: 'https://api.example.com/data',
33
+ method: 'GET'
34
+ }
35
+ }
36
+ ],
37
+ connections: {
38
+ 'Webhook': {
39
+ main: [[{
40
+ node: 'HTTP Request',
41
+ type: 'main',
42
+ index: 0
43
+ }]]
44
+ }
45
+ },
46
+ settings: {
47
+ executionOrder: 'v1'
48
+ },
49
+ staticData: undefined
50
+ };
51
+ async function testWebhookAutofix() {
52
+ logger.info('Testing webhook path autofixer...');
53
+ const dbPath = (0, path_1.join)(process.cwd(), 'data', 'nodes.db');
54
+ const adapter = await (0, database_adapter_1.createDatabaseAdapter)(dbPath);
55
+ const repository = new node_repository_1.NodeRepository(adapter);
56
+ const validator = new workflow_validator_1.WorkflowValidator(repository, enhanced_config_validator_1.EnhancedConfigValidator);
57
+ const autoFixer = new workflow_auto_fixer_1.WorkflowAutoFixer(repository);
58
+ logger.info('Step 1: Validating workflow to identify issues...');
59
+ const validationResult = await validator.validateWorkflow(testWorkflow);
60
+ console.log('\nšŸ“‹ Validation Summary:');
61
+ console.log(`- Valid: ${validationResult.valid}`);
62
+ console.log(`- Errors: ${validationResult.errors.length}`);
63
+ console.log(`- Warnings: ${validationResult.warnings.length}`);
64
+ if (validationResult.errors.length > 0) {
65
+ console.log('\nāŒ Errors found:');
66
+ validationResult.errors.forEach(error => {
67
+ console.log(` - [${error.nodeName || error.nodeId}] ${error.message}`);
68
+ });
69
+ }
70
+ logger.info('\nStep 2: Generating fixes in preview mode...');
71
+ const fixResult = autoFixer.generateFixes(testWorkflow, validationResult, [], {
72
+ applyFixes: false,
73
+ fixTypes: ['webhook-missing-path']
74
+ });
75
+ console.log('\nšŸ”§ Fix Results:');
76
+ console.log(`- Summary: ${fixResult.summary}`);
77
+ console.log(`- Total fixes: ${fixResult.stats.total}`);
78
+ console.log(`- Webhook path fixes: ${fixResult.stats.byType['webhook-missing-path']}`);
79
+ if (fixResult.fixes.length > 0) {
80
+ console.log('\nšŸ“ Detailed Fixes:');
81
+ fixResult.fixes.forEach(fix => {
82
+ console.log(` - Node: ${fix.node}`);
83
+ console.log(` Field: ${fix.field}`);
84
+ console.log(` Type: ${fix.type}`);
85
+ console.log(` Before: ${fix.before || 'undefined'}`);
86
+ console.log(` After: ${fix.after}`);
87
+ console.log(` Confidence: ${fix.confidence}`);
88
+ console.log(` Description: ${fix.description}`);
89
+ });
90
+ }
91
+ if (fixResult.operations.length > 0) {
92
+ console.log('\nšŸ”„ Operations to Apply:');
93
+ fixResult.operations.forEach(op => {
94
+ if (op.type === 'updateNode') {
95
+ console.log(` - Update Node: ${op.nodeId}`);
96
+ console.log(` Updates: ${JSON.stringify(op.updates, null, 2)}`);
97
+ }
98
+ });
99
+ }
100
+ if (fixResult.fixes.length > 0) {
101
+ const webhookFix = fixResult.fixes.find(f => f.type === 'webhook-missing-path');
102
+ if (webhookFix) {
103
+ const uuid = webhookFix.after;
104
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
105
+ const isValidUUID = uuidRegex.test(uuid);
106
+ console.log('\nāœ… UUID Validation:');
107
+ console.log(` - Generated UUID: ${uuid}`);
108
+ console.log(` - Valid format: ${isValidUUID ? 'Yes' : 'No'}`);
109
+ }
110
+ }
111
+ logger.info('\n✨ Webhook autofix test completed successfully!');
112
+ }
113
+ testWebhookAutofix().catch(error => {
114
+ logger.error('Test failed:', error);
115
+ process.exit(1);
116
+ });
117
+ //# sourceMappingURL=test-webhook-autofix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-webhook-autofix.js","sourceRoot":"","sources":["../../src/scripts/test-webhook-autofix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { NodeRepository } from '../database/node-repository';
2
+ export interface NodeSuggestion {
3
+ nodeType: string;
4
+ displayName: string;
5
+ confidence: number;
6
+ reason: string;
7
+ category?: string;
8
+ description?: string;
9
+ }
10
+ export interface SimilarityScore {
11
+ nameSimilarity: number;
12
+ categoryMatch: number;
13
+ packageMatch: number;
14
+ patternMatch: number;
15
+ totalScore: number;
16
+ }
17
+ export interface CommonMistakePattern {
18
+ pattern: string;
19
+ suggestion: string;
20
+ confidence: number;
21
+ reason: string;
22
+ }
23
+ export declare class NodeSimilarityService {
24
+ private static readonly SCORING_THRESHOLD;
25
+ private static readonly TYPO_EDIT_DISTANCE;
26
+ private static readonly SHORT_SEARCH_LENGTH;
27
+ private static readonly CACHE_DURATION_MS;
28
+ private static readonly AUTO_FIX_CONFIDENCE;
29
+ private repository;
30
+ private commonMistakes;
31
+ private nodeCache;
32
+ private cacheExpiry;
33
+ private cacheVersion;
34
+ constructor(repository: NodeRepository);
35
+ private initializeCommonMistakes;
36
+ private isCommonNodeWithoutPrefix;
37
+ findSimilarNodes(invalidType: string, limit?: number): Promise<NodeSuggestion[]>;
38
+ private checkCommonMistakes;
39
+ private calculateSimilarityScore;
40
+ private createSuggestion;
41
+ private normalizeNodeType;
42
+ private getStringSimilarity;
43
+ private getEditDistance;
44
+ private getCachedNodes;
45
+ invalidateCache(): void;
46
+ refreshCache(): Promise<void>;
47
+ formatSuggestionMessage(suggestions: NodeSuggestion[], invalidType: string): string;
48
+ isAutoFixable(suggestion: NodeSuggestion): boolean;
49
+ clearCache(): void;
50
+ }
51
+ //# sourceMappingURL=node-similarity-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-similarity-service.d.ts","sourceRoot":"","sources":["../../src/services/node-similarity-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;gBAErB,UAAU,EAAE,cAAc;IAStC,OAAO,CAAC,wBAAwB;IAkDhC,OAAO,CAAC,yBAAyB;IAuB3B,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8CzF,OAAO,CAAC,mBAAmB;IA0E3B,OAAO,CAAC,wBAAwB;IAuEhC,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;YAgDT,cAAc;IAqCrB,eAAe,IAAI,IAAI;IAUjB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IA8BnF,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO;IAQlD,UAAU,IAAI,IAAI;CAGnB"}