@path58/n8n-mcp 0.1.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.
- package/AGENT_INSTALL.md +223 -0
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/types.js +29 -0
- package/dist/autofix/suggestion-fixers/types.js.map +1 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
- package/dist/classification/certification-engine.js +208 -0
- package/dist/classification/certification-engine.js.map +1 -0
- package/dist/classification/feedback-collector.js +516 -0
- package/dist/classification/feedback-collector.js.map +1 -0
- package/dist/classification/l5-parameter-analyzer.js +670 -0
- package/dist/classification/l5-parameter-analyzer.js.map +1 -0
- package/dist/classification/l6-graph-analyzer.js +613 -0
- package/dist/classification/l6-graph-analyzer.js.map +1 -0
- package/dist/classification/severity-classifier.js +237 -0
- package/dist/classification/severity-classifier.js.map +1 -0
- package/dist/config/env.js +280 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/env.schema.js +234 -0
- package/dist/config/env.schema.js.map +1 -0
- package/dist/config/scraperEnv.js +55 -0
- package/dist/config/scraperEnv.js.map +1 -0
- package/dist/db/postgresClient.js +38 -0
- package/dist/db/postgresClient.js.map +1 -0
- package/dist/db/scraperDb.js +6 -0
- package/dist/db/scraperDb.js.map +1 -0
- package/dist/db/scraperPostgresClient.js +118 -0
- package/dist/db/scraperPostgresClient.js.map +1 -0
- package/dist/db/validationRepository.js +55 -0
- package/dist/db/validationRepository.js.map +1 -0
- package/dist/db/validatorPostgresClient.js +248 -0
- package/dist/db/validatorPostgresClient.js.map +1 -0
- package/dist/db/workflowInstanceMappingRepository.js +128 -0
- package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
- package/dist/errors/AppError.js +156 -0
- package/dist/errors/AppError.js.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/factory/error-to-problem-mappers.js +385 -0
- package/dist/factory/error-to-problem-mappers.js.map +1 -0
- package/dist/factory/gap-recorder.js +260 -0
- package/dist/factory/gap-recorder.js.map +1 -0
- package/dist/factory/problem-recorder.js +94 -0
- package/dist/factory/problem-recorder.js.map +1 -0
- package/dist/factory/warning-to-gap-mappers.js +493 -0
- package/dist/factory/warning-to-gap-mappers.js.map +1 -0
- package/dist/factory/workflow-normalizer.js +247 -0
- package/dist/factory/workflow-normalizer.js.map +1 -0
- package/dist/mcp/adapters/catalog.js +13 -0
- package/dist/mcp/adapters/catalog.js.map +1 -0
- package/dist/mcp/adapters/index.js +36 -0
- package/dist/mcp/adapters/index.js.map +1 -0
- package/dist/mcp/adapters/supabase-catalog.js +467 -0
- package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
- package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
- package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
- package/dist/mcp/adapters/validation.js +258 -0
- package/dist/mcp/adapters/validation.js.map +1 -0
- package/dist/mcp/build-email-workflow.js +113 -0
- package/dist/mcp/build-email-workflow.js.map +1 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/formatters/errors.js +217 -0
- package/dist/mcp/formatters/errors.js.map +1 -0
- package/dist/mcp/formatters/index.js +12 -0
- package/dist/mcp/formatters/index.js.map +1 -0
- package/dist/mcp/formatters/response.js +141 -0
- package/dist/mcp/formatters/response.js.map +1 -0
- package/dist/mcp/quick-test.js +33 -0
- package/dist/mcp/quick-test.js.map +1 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/test-mcp-error.js +81 -0
- package/dist/mcp/test-mcp-error.js.map +1 -0
- package/dist/mcp/test-mcp.js +80 -0
- package/dist/mcp/test-mcp.js.map +1 -0
- package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
- package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
- package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/index.js +91 -0
- package/dist/mcp/tools/fixes/index.js.map +1 -0
- package/dist/mcp/tools/fixes/node-fixes.js +233 -0
- package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/types.js +10 -0
- package/dist/mcp/tools/fixes/types.js.map +1 -0
- package/dist/mcp/tools/handlers/check-parameter.js +300 -0
- package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
- package/dist/mcp/tools/handlers/get-node-info.js +131 -0
- package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
- package/dist/mcp/tools/handlers/list-nodes.js +126 -0
- package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
- package/dist/mcp/tools/handlers/list-operations.js +138 -0
- package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
- package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
- package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
- package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
- package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
- package/dist/mcp/tools/index.js +190 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/schemas.js +195 -0
- package/dist/mcp/tools/schemas.js.map +1 -0
- package/dist/mcp/tools/validate.js +95 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/types/mcp.js +7 -0
- package/dist/mcp/types/mcp.js.map +1 -0
- package/dist/mcp/utils/timeout.js +78 -0
- package/dist/mcp/utils/timeout.js.map +1 -0
- package/dist/services/BatchProcessor.js +433 -0
- package/dist/services/BatchProcessor.js.map +1 -0
- package/dist/services/CheckpointManager.js +281 -0
- package/dist/services/CheckpointManager.js.map +1 -0
- package/dist/services/CostCalculator.js +211 -0
- package/dist/services/CostCalculator.js.map +1 -0
- package/dist/services/EmbeddingCache.js +68 -0
- package/dist/services/EmbeddingCache.js.map +1 -0
- package/dist/services/EmbeddingService.js +143 -0
- package/dist/services/EmbeddingService.js.map +1 -0
- package/dist/services/RankingService.js +81 -0
- package/dist/services/RankingService.js.map +1 -0
- package/dist/services/RedisCache.js +376 -0
- package/dist/services/RedisCache.js.map +1 -0
- package/dist/services/RedisCatalogCache.js +680 -0
- package/dist/services/RedisCatalogCache.js.map +1 -0
- package/dist/services/ResumeManager.js +252 -0
- package/dist/services/ResumeManager.js.map +1 -0
- package/dist/services/SearchService.js +282 -0
- package/dist/services/SearchService.js.map +1 -0
- package/dist/services/SemanticCatalogSearch.js +405 -0
- package/dist/services/SemanticCatalogSearch.js.map +1 -0
- package/dist/services/ValidationCache.js +157 -0
- package/dist/services/ValidationCache.js.map +1 -0
- package/dist/services/WorkflowPipelineService.js +1997 -0
- package/dist/services/WorkflowPipelineService.js.map +1 -0
- package/dist/services/catalog/index.js +34 -0
- package/dist/services/catalog/index.js.map +1 -0
- package/dist/services/catalog/interfaces.js +17 -0
- package/dist/services/catalog/interfaces.js.map +1 -0
- package/dist/services/catalog/loaders.js +169 -0
- package/dist/services/catalog/loaders.js.map +1 -0
- package/dist/services/catalog/types.js +138 -0
- package/dist/services/catalog/types.js.map +1 -0
- package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
- package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
- package/dist/services/error-quality/ErrorQualityService.js +262 -0
- package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
- package/dist/services/error-quality/index.js +25 -0
- package/dist/services/error-quality/index.js.map +1 -0
- package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
- package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
- package/dist/services/error-quality/types.js +11 -0
- package/dist/services/error-quality/types.js.map +1 -0
- package/dist/services/progress/ProgressTracker.js +288 -0
- package/dist/services/progress/ProgressTracker.js.map +1 -0
- package/dist/services/progress/formatters.js +122 -0
- package/dist/services/progress/formatters.js.map +1 -0
- package/dist/services/progress/index.js +36 -0
- package/dist/services/progress/index.js.map +1 -0
- package/dist/services/progress/types.js +7 -0
- package/dist/services/progress/types.js.map +1 -0
- package/dist/services/search/embeddingGenerator.js +112 -0
- package/dist/services/search/embeddingGenerator.js.map +1 -0
- package/dist/types/aiCapabilities.js +7 -0
- package/dist/types/aiCapabilities.js.map +1 -0
- package/dist/types/aiConfigSchema.js +7 -0
- package/dist/types/aiConfigSchema.js.map +1 -0
- package/dist/utils/bannerLogger.js +186 -0
- package/dist/utils/bannerLogger.js.map +1 -0
- package/dist/utils/bannerService.js +23 -0
- package/dist/utils/bannerService.js.map +1 -0
- package/dist/utils/bannerServiceAdapter.js +54 -0
- package/dist/utils/bannerServiceAdapter.js.map +1 -0
- package/dist/utils/batchLogger.js +171 -0
- package/dist/utils/batchLogger.js.map +1 -0
- package/dist/utils/bottomStickyBanner.js +239 -0
- package/dist/utils/bottomStickyBanner.js.map +1 -0
- package/dist/utils/credentialMatcher.js +206 -0
- package/dist/utils/credentialMatcher.js.map +1 -0
- package/dist/utils/credentialNormalizer.js +442 -0
- package/dist/utils/credentialNormalizer.js.map +1 -0
- package/dist/utils/integratedBannerLogger.js +59 -0
- package/dist/utils/integratedBannerLogger.js.map +1 -0
- package/dist/utils/n8nSourceGit.js +195 -0
- package/dist/utils/n8nSourceGit.js.map +1 -0
- package/dist/utils/nodeTypeNormalizer.js +131 -0
- package/dist/utils/nodeTypeNormalizer.js.map +1 -0
- package/dist/utils/openaiClient.js +397 -0
- package/dist/utils/openaiClient.js.map +1 -0
- package/dist/utils/productionLogger.js +16 -0
- package/dist/utils/productionLogger.js.map +1 -0
- package/dist/utils/progressBarBanner.js +132 -0
- package/dist/utils/progressBarBanner.js.map +1 -0
- package/dist/utils/scriptHeartbeat.js +117 -0
- package/dist/utils/scriptHeartbeat.js.map +1 -0
- package/dist/utils/scriptLogger.js +125 -0
- package/dist/utils/scriptLogger.js.map +1 -0
- package/dist/utils/scriptRunner.js +95 -0
- package/dist/utils/scriptRunner.js.map +1 -0
- package/dist/utils/scriptTimeout.js +128 -0
- package/dist/utils/scriptTimeout.js.map +1 -0
- package/dist/utils/scriptWrapper.js +219 -0
- package/dist/utils/scriptWrapper.js.map +1 -0
- package/dist/utils/stickyBanner.js +226 -0
- package/dist/utils/stickyBanner.js.map +1 -0
- package/dist/utils/terminalSpinner.js +97 -0
- package/dist/utils/terminalSpinner.js.map +1 -0
- package/dist/utils/threeLineBanner.js +427 -0
- package/dist/utils/threeLineBanner.js.map +1 -0
- package/dist/utils/validatorCheckpointManager.js +170 -0
- package/dist/utils/validatorCheckpointManager.js.map +1 -0
- package/dist/utils/validatorConnectionManager.js +124 -0
- package/dist/utils/validatorConnectionManager.js.map +1 -0
- package/dist/validation/catalog.js +56 -0
- package/dist/validation/catalog.js.map +1 -0
- package/dist/validation/config/deprecated-nodes.js +234 -0
- package/dist/validation/config/deprecated-nodes.js.map +1 -0
- package/dist/validation/config/l6-severity.js +227 -0
- package/dist/validation/config/l6-severity.js.map +1 -0
- package/dist/validation/config/terminal-nodes.js +132 -0
- package/dist/validation/config/terminal-nodes.js.map +1 -0
- package/dist/validation/config/unreachable-nodes.js +67 -0
- package/dist/validation/config/unreachable-nodes.js.map +1 -0
- package/dist/validation/core.js +47 -0
- package/dist/validation/core.js.map +1 -0
- package/dist/validation/docExtraction.js +12 -0
- package/dist/validation/docExtraction.js.map +1 -0
- package/dist/validation/dryRunMockRunner.js +128 -0
- package/dist/validation/dryRunMockRunner.js.map +1 -0
- package/dist/validation/fixtureEngine.js +61 -0
- package/dist/validation/fixtureEngine.js.map +1 -0
- package/dist/validation/index.js +15 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/k-levels/k2-blockers.js +222 -0
- package/dist/validation/k-levels/k2-blockers.js.map +1 -0
- package/dist/validation/l1-structure.js +296 -0
- package/dist/validation/l1-structure.js.map +1 -0
- package/dist/validation/l2-nodes.js +282 -0
- package/dist/validation/l2-nodes.js.map +1 -0
- package/dist/validation/l3-credentials.js +322 -0
- package/dist/validation/l3-credentials.js.map +1 -0
- package/dist/validation/l4-connections.js +698 -0
- package/dist/validation/l4-connections.js.map +1 -0
- package/dist/validation/l5-parameters.js +803 -0
- package/dist/validation/l5-parameters.js.map +1 -0
- package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
- package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
- package/dist/validation/l6-checks/catalog-checks.js +260 -0
- package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
- package/dist/validation/l6-checks/data-contracts.js +197 -0
- package/dist/validation/l6-checks/data-contracts.js.map +1 -0
- package/dist/validation/l6-checks/deprecation.js +133 -0
- package/dist/validation/l6-checks/deprecation.js.map +1 -0
- package/dist/validation/l6-checks/error-handling.js +193 -0
- package/dist/validation/l6-checks/error-handling.js.map +1 -0
- package/dist/validation/l6-checks/expression-syntax.js +387 -0
- package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
- package/dist/validation/l6-checks/flow-integrity.js +504 -0
- package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
- package/dist/validation/l6-checks/index.js +106 -0
- package/dist/validation/l6-checks/index.js.map +1 -0
- package/dist/validation/l6-checks/loops.js +370 -0
- package/dist/validation/l6-checks/loops.js.map +1 -0
- package/dist/validation/l6-checks/performance.js +182 -0
- package/dist/validation/l6-checks/performance.js.map +1 -0
- package/dist/validation/l6-checks/security.js +273 -0
- package/dist/validation/l6-checks/security.js.map +1 -0
- package/dist/validation/l6-patterns.js +472 -0
- package/dist/validation/l6-patterns.js.map +1 -0
- package/dist/validation/mockLevelResolver.js +95 -0
- package/dist/validation/mockLevelResolver.js.map +1 -0
- package/dist/validation/n8nApiClient.js +21 -0
- package/dist/validation/n8nApiClient.js.map +1 -0
- package/dist/validation/n8nCli.js +87 -0
- package/dist/validation/n8nCli.js.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/usageStats.js +82 -0
- package/dist/validation/usageStats.js.map +1 -0
- package/package.json +274 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix strategies for flow/structure-related validation issues.
|
|
3
|
+
*
|
|
4
|
+
* RAG-4.2.4: suggest_fix MCP tool
|
|
5
|
+
* Handles L6 pattern issues: NO_TRIGGER, UNREACHABLE_NODE, DEAD_END, etc.
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/fixes/flow-fixes
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Strategy for NO_TRIGGER (workflow has no trigger node).
|
|
11
|
+
*/
|
|
12
|
+
export const noTriggerStrategy = {
|
|
13
|
+
supportedCodes: ['NO_TRIGGER', 'L6_NO_TRIGGER', 'MISSING_TRIGGER'],
|
|
14
|
+
async suggest(issueCode, context) {
|
|
15
|
+
return {
|
|
16
|
+
fixable: true,
|
|
17
|
+
fix: {
|
|
18
|
+
action: 'add',
|
|
19
|
+
target: 'nodes',
|
|
20
|
+
to: {
|
|
21
|
+
type: 'n8n-nodes-base.manualTrigger',
|
|
22
|
+
name: 'Manual Trigger',
|
|
23
|
+
position: [250, 300],
|
|
24
|
+
},
|
|
25
|
+
explanation: 'Add a Manual Trigger node to start the workflow. For production, consider Schedule Trigger or Webhook Trigger.',
|
|
26
|
+
confidence: 'high',
|
|
27
|
+
},
|
|
28
|
+
documentation_url: 'https://docs.n8n.io/workflows/executions/manual-executions/',
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Strategy for UNREACHABLE_NODE (node has no input connections).
|
|
34
|
+
*/
|
|
35
|
+
export const unreachableNodeStrategy = {
|
|
36
|
+
supportedCodes: ['UNREACHABLE_NODE', 'L6_UNREACHABLE_NODE', 'DISCONNECTED_NODE'],
|
|
37
|
+
async suggest(issueCode, context) {
|
|
38
|
+
const nodeName = context?.node_name || 'the node';
|
|
39
|
+
return {
|
|
40
|
+
fixable: true,
|
|
41
|
+
fix: {
|
|
42
|
+
action: 'add',
|
|
43
|
+
target: 'connections',
|
|
44
|
+
to: { from: 'previous_node', to: nodeName },
|
|
45
|
+
explanation: `Connect '${nodeName}' to a preceding node in the workflow. The node is currently isolated.`,
|
|
46
|
+
confidence: 'medium',
|
|
47
|
+
},
|
|
48
|
+
alternative: 'If this node is intentionally standalone, it may indicate a workflow design issue.',
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Strategy for DEAD_END_NODE (node has no output connections but isn't terminal).
|
|
54
|
+
*/
|
|
55
|
+
export const deadEndNodeStrategy = {
|
|
56
|
+
supportedCodes: ['DEAD_END_NODE', 'L6_DEAD_END_NODE', 'NO_OUTPUT_CONNECTION'],
|
|
57
|
+
async suggest(issueCode, context) {
|
|
58
|
+
const nodeName = context?.node_name || 'the node';
|
|
59
|
+
const nodeType = context?.node_type || '';
|
|
60
|
+
// Check if it's a known terminal node type
|
|
61
|
+
const terminalTypes = [
|
|
62
|
+
'n8n-nodes-base.respondToWebhook',
|
|
63
|
+
'n8n-nodes-base.stopAndError',
|
|
64
|
+
'n8n-nodes-base.noOp',
|
|
65
|
+
];
|
|
66
|
+
if (terminalTypes.includes(nodeType)) {
|
|
67
|
+
return {
|
|
68
|
+
fixable: false,
|
|
69
|
+
alternative: `'${nodeName}' is a terminal node type that doesn't require output connections.`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
fixable: true,
|
|
74
|
+
fix: {
|
|
75
|
+
action: 'add',
|
|
76
|
+
target: 'connections',
|
|
77
|
+
to: { from: nodeName, to: 'next_node' },
|
|
78
|
+
explanation: `Connect '${nodeName}' to a following node or add a terminal node (like Respond to Webhook).`,
|
|
79
|
+
confidence: 'medium',
|
|
80
|
+
},
|
|
81
|
+
alternative: 'If this is intentionally the last node, you may ignore this warning.',
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Strategy for MULTIPLE_TRIGGERS (workflow has more than one trigger).
|
|
87
|
+
*/
|
|
88
|
+
export const multipleTriggersStrategy = {
|
|
89
|
+
supportedCodes: ['MULTIPLE_TRIGGERS', 'L6_MULTIPLE_TRIGGERS'],
|
|
90
|
+
async suggest(issueCode, context) {
|
|
91
|
+
return {
|
|
92
|
+
fixable: false,
|
|
93
|
+
alternative: 'n8n workflows should have only one trigger. Remove extra triggers or split into separate workflows.',
|
|
94
|
+
documentation_url: 'https://docs.n8n.io/workflows/components/trigger/',
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Strategy for CIRCULAR_CONNECTION (connection creates a loop).
|
|
100
|
+
*/
|
|
101
|
+
export const circularConnectionStrategy = {
|
|
102
|
+
supportedCodes: ['CIRCULAR_CONNECTION', 'L4_CIRCULAR_CONNECTION', 'CYCLE_DETECTED'],
|
|
103
|
+
async suggest(issueCode, context) {
|
|
104
|
+
return {
|
|
105
|
+
fixable: false,
|
|
106
|
+
alternative: 'Remove the connection that creates the loop. If you need iteration, use the Loop Over Items node instead.',
|
|
107
|
+
documentation_url: 'https://docs.n8n.io/code/cookbook/looping/',
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Strategy for ERROR_OUTPUT_UNCONNECTED.
|
|
113
|
+
*/
|
|
114
|
+
export const errorOutputStrategy = {
|
|
115
|
+
supportedCodes: ['ERROR_OUTPUT_UNCONNECTED', 'L6_ERROR_OUTPUT_UNCONNECTED'],
|
|
116
|
+
async suggest(issueCode, context) {
|
|
117
|
+
const nodeName = context?.node_name || 'the node';
|
|
118
|
+
return {
|
|
119
|
+
fixable: true,
|
|
120
|
+
fix: {
|
|
121
|
+
action: 'add',
|
|
122
|
+
target: 'connections',
|
|
123
|
+
to: { from: `${nodeName}[error]`, to: 'error_handler' },
|
|
124
|
+
explanation: `Connect the error output of '${nodeName}' to an error handling node (like Stop and Error or a notification node).`,
|
|
125
|
+
confidence: 'medium',
|
|
126
|
+
},
|
|
127
|
+
documentation_url: 'https://docs.n8n.io/workflows/error-handling/',
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Strategy for NO_RETRY_ON_HTTP (HTTP node without retry configuration).
|
|
133
|
+
*/
|
|
134
|
+
export const noRetryStrategy = {
|
|
135
|
+
supportedCodes: ['NO_RETRY_ON_HTTP', 'L6_NO_RETRY_ON_HTTP'],
|
|
136
|
+
async suggest(issueCode, context) {
|
|
137
|
+
return {
|
|
138
|
+
fixable: true,
|
|
139
|
+
fix: {
|
|
140
|
+
action: 'add',
|
|
141
|
+
target: 'parameters.options',
|
|
142
|
+
to: {
|
|
143
|
+
retry: {
|
|
144
|
+
maxTries: 3,
|
|
145
|
+
delay: 1000,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
explanation: 'Add retry configuration to handle transient network failures gracefully.',
|
|
149
|
+
confidence: 'high',
|
|
150
|
+
},
|
|
151
|
+
documentation_url: 'https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/',
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=flow-fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-fixes.js","sourceRoot":"","sources":["../../../../src/mcp/tools/fixes/flow-fixes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix strategy registry for suggest_fix MCP tool.
|
|
3
|
+
*
|
|
4
|
+
* RAG-4.2.4: suggest_fix MCP tool
|
|
5
|
+
* Central registry for all fix strategies, organized by issue category.
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/fixes
|
|
8
|
+
*/
|
|
9
|
+
import { invalidParameterStrategy, missingParameterStrategy, wrongTypeStrategy, } from './parameter-fixes.js';
|
|
10
|
+
import { unknownNodeStrategy, unknownOperationStrategy, deprecatedNodeStrategy, } from './node-fixes.js';
|
|
11
|
+
import { noTriggerStrategy, unreachableNodeStrategy, deadEndNodeStrategy, multipleTriggersStrategy, circularConnectionStrategy, errorOutputStrategy, noRetryStrategy, } from './flow-fixes.js';
|
|
12
|
+
import { unbalancedBracesStrategy, invalidExpressionStrategy, undefinedReferenceStrategy, hardcodedSecretStrategy, hardcodedUrlStrategy, } from './expression-fixes.js';
|
|
13
|
+
/**
|
|
14
|
+
* All registered fix strategies.
|
|
15
|
+
*/
|
|
16
|
+
const strategies = [
|
|
17
|
+
// Parameter fixes
|
|
18
|
+
invalidParameterStrategy,
|
|
19
|
+
missingParameterStrategy,
|
|
20
|
+
wrongTypeStrategy,
|
|
21
|
+
// Node fixes
|
|
22
|
+
unknownNodeStrategy,
|
|
23
|
+
unknownOperationStrategy,
|
|
24
|
+
deprecatedNodeStrategy,
|
|
25
|
+
// Flow fixes
|
|
26
|
+
noTriggerStrategy,
|
|
27
|
+
unreachableNodeStrategy,
|
|
28
|
+
deadEndNodeStrategy,
|
|
29
|
+
multipleTriggersStrategy,
|
|
30
|
+
circularConnectionStrategy,
|
|
31
|
+
errorOutputStrategy,
|
|
32
|
+
noRetryStrategy,
|
|
33
|
+
// Expression fixes
|
|
34
|
+
unbalancedBracesStrategy,
|
|
35
|
+
invalidExpressionStrategy,
|
|
36
|
+
undefinedReferenceStrategy,
|
|
37
|
+
hardcodedSecretStrategy,
|
|
38
|
+
hardcodedUrlStrategy,
|
|
39
|
+
];
|
|
40
|
+
/**
|
|
41
|
+
* Map of issue codes to their handling strategies.
|
|
42
|
+
* Built from the strategies array for O(1) lookup.
|
|
43
|
+
*/
|
|
44
|
+
const strategyMap = new Map();
|
|
45
|
+
// Populate the map
|
|
46
|
+
for (const strategy of strategies) {
|
|
47
|
+
for (const code of strategy.supportedCodes) {
|
|
48
|
+
strategyMap.set(code.toUpperCase(), strategy);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find a strategy that can handle the given issue code.
|
|
53
|
+
*
|
|
54
|
+
* @param issueCode - The validation issue code
|
|
55
|
+
* @returns The strategy or undefined if not found
|
|
56
|
+
*/
|
|
57
|
+
export function findStrategy(issueCode) {
|
|
58
|
+
return strategyMap.get(issueCode.toUpperCase());
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get a fix suggestion for a validation issue.
|
|
62
|
+
*
|
|
63
|
+
* @param issueCode - The validation issue code
|
|
64
|
+
* @param context - Optional context for targeted suggestions
|
|
65
|
+
* @returns Fix suggestion response
|
|
66
|
+
*/
|
|
67
|
+
export async function suggestFix(issueCode, context) {
|
|
68
|
+
const strategy = findStrategy(issueCode);
|
|
69
|
+
if (!strategy) {
|
|
70
|
+
return {
|
|
71
|
+
fixable: false,
|
|
72
|
+
alternative: `No automatic fix available for issue code '${issueCode}'. Please review the issue manually.`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return strategy.suggest(issueCode, context);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all supported issue codes.
|
|
79
|
+
*/
|
|
80
|
+
export function getSupportedIssueCodes() {
|
|
81
|
+
return Array.from(strategyMap.keys());
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if an issue code has a fix strategy.
|
|
85
|
+
*/
|
|
86
|
+
export function hasFixStrategy(issueCode) {
|
|
87
|
+
return strategyMap.has(issueCode.toUpperCase());
|
|
88
|
+
}
|
|
89
|
+
// Export individual strategies for testing
|
|
90
|
+
export { invalidParameterStrategy, missingParameterStrategy, wrongTypeStrategy, unknownNodeStrategy, unknownOperationStrategy, deprecatedNodeStrategy, noTriggerStrategy, unreachableNodeStrategy, deadEndNodeStrategy, multipleTriggersStrategy, circularConnectionStrategy, errorOutputStrategy, noRetryStrategy, unbalancedBracesStrategy, invalidExpressionStrategy, undefinedReferenceStrategy, hardcodedSecretStrategy, hardcodedUrlStrategy, };
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp/tools/fixes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAM/B;;GAEG;AACH,MAAM,UAAU,GAAkB;IAChC,kBAAkB;IAClB,wBAAwB;IACxB,wBAAwB;IACxB,iBAAiB;IAEjB,aAAa;IACb,mBAAmB;IACnB,wBAAwB;IACxB,sBAAsB;IAEtB,aAAa;IACb,iBAAiB;IACjB,uBAAuB;IACvB,mBAAmB;IACnB,wBAAwB;IACxB,0BAA0B;IAC1B,mBAAmB;IACnB,eAAe;IAEf,mBAAmB;IACnB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;IAC1B,uBAAuB;IACvB,oBAAoB;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,GAA6B,IAAI,GAAG,EAAE,CAAC;AAExD,mBAAmB;AACnB,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC3C,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB,EACjB,OAAsB;IAEtB,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,8CAA8C,SAAS,sCAAsC;SAC3G,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,2CAA2C;AAC3C,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,GACrB,CAAC"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix strategies for node-related validation issues.
|
|
3
|
+
*
|
|
4
|
+
* RAG-4.2.4: suggest_fix MCP tool
|
|
5
|
+
* Handles UNKNOWN_NODE, UNKNOWN_OPERATION, DEPRECATED_NODE
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/fixes/node-fixes
|
|
8
|
+
*/
|
|
9
|
+
import { getCatalogAdapter } from '../../adapters/index.js';
|
|
10
|
+
/** Common node type corrections (package prefix issues) */
|
|
11
|
+
const NODE_TYPE_CORRECTIONS = {
|
|
12
|
+
// Missing package prefix
|
|
13
|
+
slack: 'n8n-nodes-base.slack',
|
|
14
|
+
discord: 'n8n-nodes-base.discord',
|
|
15
|
+
telegram: 'n8n-nodes-base.telegram',
|
|
16
|
+
httpRequest: 'n8n-nodes-base.httpRequest',
|
|
17
|
+
webhook: 'n8n-nodes-base.webhook',
|
|
18
|
+
code: 'n8n-nodes-base.code',
|
|
19
|
+
'set': 'n8n-nodes-base.set',
|
|
20
|
+
'if': 'n8n-nodes-base.if',
|
|
21
|
+
'switch': 'n8n-nodes-base.switch',
|
|
22
|
+
merge: 'n8n-nodes-base.merge',
|
|
23
|
+
'function': 'n8n-nodes-base.function',
|
|
24
|
+
// Old/deprecated names
|
|
25
|
+
'n8n-nodes-base.spreadsheetFile': 'n8n-nodes-base.spreadsheet',
|
|
26
|
+
'n8n-nodes-base.googleSheet': 'n8n-nodes-base.googleSheets',
|
|
27
|
+
'n8n-nodes-base.mailSend': 'n8n-nodes-base.emailSend',
|
|
28
|
+
};
|
|
29
|
+
/** Common operation name corrections */
|
|
30
|
+
const OPERATION_CORRECTIONS = {
|
|
31
|
+
'n8n-nodes-base.slack': {
|
|
32
|
+
sendMessage: 'postMessage',
|
|
33
|
+
send: 'postMessage',
|
|
34
|
+
createMessage: 'postMessage',
|
|
35
|
+
getMessages: 'getAll',
|
|
36
|
+
listChannels: 'getAll',
|
|
37
|
+
},
|
|
38
|
+
'n8n-nodes-base.googleSheets': {
|
|
39
|
+
read: 'read',
|
|
40
|
+
get: 'read',
|
|
41
|
+
write: 'append',
|
|
42
|
+
add: 'append',
|
|
43
|
+
update: 'update',
|
|
44
|
+
},
|
|
45
|
+
'n8n-nodes-base.httpRequest': {
|
|
46
|
+
request: 'GET',
|
|
47
|
+
fetch: 'GET',
|
|
48
|
+
post: 'POST',
|
|
49
|
+
put: 'PUT',
|
|
50
|
+
'delete': 'DELETE',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Calculate Levenshtein distance for typo detection.
|
|
55
|
+
*/
|
|
56
|
+
function levenshteinDistance(str1, str2) {
|
|
57
|
+
const s1 = str1.toLowerCase();
|
|
58
|
+
const s2 = str2.toLowerCase();
|
|
59
|
+
if (s1 === s2)
|
|
60
|
+
return 0;
|
|
61
|
+
if (s1.length === 0)
|
|
62
|
+
return s2.length;
|
|
63
|
+
if (s2.length === 0)
|
|
64
|
+
return s1.length;
|
|
65
|
+
let prevRow = Array.from({ length: s1.length + 1 }, (_, i) => i);
|
|
66
|
+
let currRow = new Array(s1.length + 1);
|
|
67
|
+
for (let i = 1; i <= s2.length; i++) {
|
|
68
|
+
currRow[0] = i;
|
|
69
|
+
for (let j = 1; j <= s1.length; j++) {
|
|
70
|
+
const cost = s2.charAt(i - 1) === s1.charAt(j - 1) ? 0 : 1;
|
|
71
|
+
currRow[j] = Math.min(prevRow[j] + 1, currRow[j - 1] + 1, prevRow[j - 1] + cost);
|
|
72
|
+
}
|
|
73
|
+
[prevRow, currRow] = [currRow, prevRow];
|
|
74
|
+
}
|
|
75
|
+
return prevRow[s1.length];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find similar operations from catalog.
|
|
79
|
+
*/
|
|
80
|
+
async function findSimilarOperation(nodeType, invalidOperation) {
|
|
81
|
+
try {
|
|
82
|
+
const adapter = await getCatalogAdapter();
|
|
83
|
+
const operations = await adapter.listOperations(nodeType);
|
|
84
|
+
let bestMatch;
|
|
85
|
+
const maxDistance = 3;
|
|
86
|
+
for (const op of operations) {
|
|
87
|
+
const distance = levenshteinDistance(invalidOperation, op.operation_name);
|
|
88
|
+
if (distance <= maxDistance && (!bestMatch || distance < bestMatch.distance)) {
|
|
89
|
+
bestMatch = { name: op.operation_name, distance };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return bestMatch;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Strategy for UNKNOWN_NODE (node type doesn't exist).
|
|
100
|
+
*/
|
|
101
|
+
export const unknownNodeStrategy = {
|
|
102
|
+
supportedCodes: ['UNKNOWN_NODE', 'L2_UNKNOWN_NODE', 'L2_UNKNOWN_NODE_TYPE', 'UNKNOWN_NODE_TYPE'],
|
|
103
|
+
async suggest(issueCode, context) {
|
|
104
|
+
const nodeType = context?.node_type || '';
|
|
105
|
+
if (!nodeType) {
|
|
106
|
+
return {
|
|
107
|
+
fixable: false,
|
|
108
|
+
alternative: 'Provide the node type to get a fix suggestion.',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Check for direct corrections
|
|
112
|
+
const correctedType = NODE_TYPE_CORRECTIONS[nodeType] || NODE_TYPE_CORRECTIONS[nodeType.toLowerCase()];
|
|
113
|
+
if (correctedType) {
|
|
114
|
+
return {
|
|
115
|
+
fixable: true,
|
|
116
|
+
fix: {
|
|
117
|
+
action: 'replace_node',
|
|
118
|
+
target: 'node.type',
|
|
119
|
+
from: nodeType,
|
|
120
|
+
to: correctedType,
|
|
121
|
+
explanation: `Replace '${nodeType}' with '${correctedType}'. The node type was missing the package prefix or using an old name.`,
|
|
122
|
+
confidence: 'high',
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// Check if missing package prefix
|
|
127
|
+
if (!nodeType.includes('.')) {
|
|
128
|
+
const guessedType = `n8n-nodes-base.${nodeType}`;
|
|
129
|
+
return {
|
|
130
|
+
fixable: true,
|
|
131
|
+
fix: {
|
|
132
|
+
action: 'replace_node',
|
|
133
|
+
target: 'node.type',
|
|
134
|
+
from: nodeType,
|
|
135
|
+
to: guessedType,
|
|
136
|
+
explanation: `Add package prefix 'n8n-nodes-base.' to the node type. n8n requires the full type identifier.`,
|
|
137
|
+
confidence: 'medium',
|
|
138
|
+
},
|
|
139
|
+
documentation_url: 'https://docs.n8n.io/integrations/builtin/',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
fixable: false,
|
|
144
|
+
alternative: `The node type '${nodeType}' does not exist in the catalog. Check available nodes at https://n8n.io/integrations/`,
|
|
145
|
+
documentation_url: 'https://docs.n8n.io/integrations/builtin/',
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Strategy for UNKNOWN_OPERATION (operation doesn't exist for node).
|
|
151
|
+
*/
|
|
152
|
+
export const unknownOperationStrategy = {
|
|
153
|
+
supportedCodes: ['UNKNOWN_OPERATION', 'L5_UNKNOWN_OPERATION', 'INVALID_OPERATION'],
|
|
154
|
+
async suggest(issueCode, context) {
|
|
155
|
+
const nodeType = context?.node_type || '';
|
|
156
|
+
const operation = context?.operation || '';
|
|
157
|
+
if (!operation) {
|
|
158
|
+
return {
|
|
159
|
+
fixable: false,
|
|
160
|
+
alternative: 'Provide the operation name to get a fix suggestion.',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// Check for known corrections
|
|
164
|
+
const nodeCorrections = OPERATION_CORRECTIONS[nodeType];
|
|
165
|
+
if (nodeCorrections?.[operation] || nodeCorrections?.[operation.toLowerCase()]) {
|
|
166
|
+
const correctedOp = nodeCorrections[operation] || nodeCorrections[operation.toLowerCase()];
|
|
167
|
+
return {
|
|
168
|
+
fixable: true,
|
|
169
|
+
fix: {
|
|
170
|
+
action: 'change_value',
|
|
171
|
+
target: 'parameters.operation',
|
|
172
|
+
from: operation,
|
|
173
|
+
to: correctedOp,
|
|
174
|
+
explanation: `Change '${operation}' to '${correctedOp}'. This is the correct operation name for this node.`,
|
|
175
|
+
confidence: 'high',
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Try fuzzy matching against catalog
|
|
180
|
+
if (nodeType) {
|
|
181
|
+
const match = await findSimilarOperation(nodeType, operation);
|
|
182
|
+
if (match) {
|
|
183
|
+
const confidence = match.distance === 1 ? 'high' : match.distance === 2 ? 'medium' : 'low';
|
|
184
|
+
return {
|
|
185
|
+
fixable: true,
|
|
186
|
+
fix: {
|
|
187
|
+
action: 'change_value',
|
|
188
|
+
target: 'parameters.operation',
|
|
189
|
+
from: operation,
|
|
190
|
+
to: match.name,
|
|
191
|
+
explanation: `'${operation}' is not a valid operation. Did you mean '${match.name}'?`,
|
|
192
|
+
confidence,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
fixable: false,
|
|
199
|
+
alternative: `The operation '${operation}' does not exist for this node. Check the node documentation for available operations.`,
|
|
200
|
+
documentation_url: 'https://docs.n8n.io/integrations/builtin/',
|
|
201
|
+
};
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Strategy for DEPRECATED_NODE.
|
|
206
|
+
*/
|
|
207
|
+
export const deprecatedNodeStrategy = {
|
|
208
|
+
supportedCodes: ['DEPRECATED_NODE', 'L2_DEPRECATED_NODE', 'DEPRECATED_NODE_TYPE'],
|
|
209
|
+
async suggest(issueCode, context) {
|
|
210
|
+
const nodeType = context?.node_type || '';
|
|
211
|
+
// Check for known replacements
|
|
212
|
+
const replacement = NODE_TYPE_CORRECTIONS[nodeType];
|
|
213
|
+
if (replacement) {
|
|
214
|
+
return {
|
|
215
|
+
fixable: true,
|
|
216
|
+
fix: {
|
|
217
|
+
action: 'replace_node',
|
|
218
|
+
target: 'node.type',
|
|
219
|
+
from: nodeType,
|
|
220
|
+
to: replacement,
|
|
221
|
+
explanation: `The node '${nodeType}' is deprecated. Replace with '${replacement}'.`,
|
|
222
|
+
confidence: 'high',
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
fixable: false,
|
|
228
|
+
alternative: `The node '${nodeType}' is deprecated but no automatic replacement is available. Check the n8n changelog for migration guidance.`,
|
|
229
|
+
documentation_url: 'https://docs.n8n.io/breaking-changes/',
|
|
230
|
+
};
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=node-fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-fixes.js","sourceRoot":"","sources":["../../../../src/mcp/tools/fixes/node-fixes.ts"],"names":[],"mappings":"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"}
|