@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,504 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6 Flow Integrity Checks
|
|
3
|
+
*
|
|
4
|
+
* RAG-2.2.40: L6 Pattern Validation
|
|
5
|
+
* Created: January 5, 2026
|
|
6
|
+
*
|
|
7
|
+
* RAG-2.2.77-FIX: WEBHOOK_NO_RESPONSE now checks responseMode parameter
|
|
8
|
+
* to stay within L6 static analysis philosophy.
|
|
9
|
+
*
|
|
10
|
+
* Validates workflow flow integrity:
|
|
11
|
+
* - NO_TRIGGER: Workflow has no trigger node
|
|
12
|
+
* - UNREACHABLE_NODE: Node cannot be reached from any trigger
|
|
13
|
+
* - DEAD_END_NODE: Non-terminal node with no outgoing connections
|
|
14
|
+
* - MULTIPLE_TRIGGERS: Multiple trigger nodes (ambiguous start point)
|
|
15
|
+
* - WEBHOOK_NO_RESPONSE: responseMode='responseNode' without Respond node
|
|
16
|
+
* - DUPLICATE_NODE_NAMES: Multiple nodes with same name
|
|
17
|
+
*/
|
|
18
|
+
import { shouldFlagAsDeadEnd } from '../config/terminal-nodes.js';
|
|
19
|
+
import { isUnreachableWhitelisted } from '../config/unreachable-nodes.js';
|
|
20
|
+
import { getL6Severity, blocksCertification } from '../config/l6-severity.js';
|
|
21
|
+
/**
|
|
22
|
+
* Helper: Validate workflow structure
|
|
23
|
+
* Returns true if workflow.nodes exists and is an array
|
|
24
|
+
*/
|
|
25
|
+
function hasValidNodes(workflow) {
|
|
26
|
+
return workflow.nodes !== undefined && workflow.nodes !== null && Array.isArray(workflow.nodes);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check 1: NO_TRIGGER
|
|
30
|
+
* Every workflow must have at least one trigger node
|
|
31
|
+
*/
|
|
32
|
+
export function checkNoTrigger(context) {
|
|
33
|
+
const { catalogCache, workflow } = context;
|
|
34
|
+
const errors = [];
|
|
35
|
+
// Guard: Ensure workflow.nodes exists
|
|
36
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
37
|
+
errors.push({
|
|
38
|
+
code: 'NO_TRIGGER',
|
|
39
|
+
message: 'Workflow has no nodes array. Workflow structure is invalid.',
|
|
40
|
+
path: 'workflow.nodes',
|
|
41
|
+
suggested_fix: {
|
|
42
|
+
id: `fix-invalid-workflow-${Date.now()}`,
|
|
43
|
+
fix_type: 'fix_structure',
|
|
44
|
+
confidence: 0.0,
|
|
45
|
+
auto_applicable: false,
|
|
46
|
+
description: 'Workflow structure is invalid - missing nodes array',
|
|
47
|
+
target_node: 'workflow',
|
|
48
|
+
patch: {},
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return errors;
|
|
52
|
+
}
|
|
53
|
+
const triggerNodes = workflow.nodes.filter(node => catalogCache.triggerTypes.has(node.type.toLowerCase()));
|
|
54
|
+
if (triggerNodes.length === 0) {
|
|
55
|
+
const code = 'NO_TRIGGER';
|
|
56
|
+
errors.push({
|
|
57
|
+
code: 'NO_TRIGGER',
|
|
58
|
+
message: 'Workflow has no trigger node. Workflow will never execute.',
|
|
59
|
+
path: 'workflow.nodes',
|
|
60
|
+
severity: getL6Severity(code),
|
|
61
|
+
blocks_certification: blocksCertification(code),
|
|
62
|
+
suggested_fix: {
|
|
63
|
+
id: `fix-no-trigger-${Date.now()}`,
|
|
64
|
+
fix_type: 'add_trigger',
|
|
65
|
+
confidence: 0.85,
|
|
66
|
+
auto_applicable: false, // Requires user to choose trigger type
|
|
67
|
+
description: 'Add a Manual Trigger node to allow workflow execution',
|
|
68
|
+
target_node: 'new-trigger',
|
|
69
|
+
patch: {
|
|
70
|
+
suggested_trigger: {
|
|
71
|
+
type: 'n8n-nodes-base.manualTrigger',
|
|
72
|
+
name: 'Manual Trigger',
|
|
73
|
+
parameters: {},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return errors;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check 2: MULTIPLE_TRIGGERS
|
|
83
|
+
* Workflows with multiple triggers may have ambiguous start points
|
|
84
|
+
*/
|
|
85
|
+
export function checkMultipleTriggers(context) {
|
|
86
|
+
const { catalogCache, workflow } = context;
|
|
87
|
+
const warnings = [];
|
|
88
|
+
// Guard: Ensure workflow.nodes exists
|
|
89
|
+
if (!hasValidNodes(workflow)) {
|
|
90
|
+
return warnings; // Invalid workflow structure - skip this check
|
|
91
|
+
}
|
|
92
|
+
const triggerNodes = workflow.nodes.filter(node => catalogCache.triggerTypes.has(node.type.toLowerCase()));
|
|
93
|
+
if (triggerNodes.length > 1) {
|
|
94
|
+
warnings.push({
|
|
95
|
+
code: 'POSSIBLE_UNDEFINED_REFERENCE',
|
|
96
|
+
message: `Workflow has ${triggerNodes.length} trigger nodes. This may cause confusion about execution flow.`,
|
|
97
|
+
details: {
|
|
98
|
+
trigger_nodes: triggerNodes.map(n => ({ name: n.name, type: n.type })),
|
|
99
|
+
count: triggerNodes.length,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return warnings;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Add connected nodes to queue from a connection object
|
|
107
|
+
*/
|
|
108
|
+
function addConnectedNodesToQueue(connections, reachable, queue) {
|
|
109
|
+
if (!connections)
|
|
110
|
+
return;
|
|
111
|
+
if (Array.isArray(connections)) {
|
|
112
|
+
for (const connectionGroup of connections) {
|
|
113
|
+
if (Array.isArray(connectionGroup)) {
|
|
114
|
+
for (const connection of connectionGroup) {
|
|
115
|
+
if (connection?.node && !reachable.has(connection.node)) {
|
|
116
|
+
queue.push(connection.node);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (connectionGroup && typeof connectionGroup === 'object' && 'node' in connectionGroup) {
|
|
121
|
+
const conn = connectionGroup;
|
|
122
|
+
if (typeof conn.node === 'string' && !reachable.has(conn.node)) {
|
|
123
|
+
queue.push(conn.node);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else if (typeof connections === 'object' && 'node' in connections) {
|
|
129
|
+
const conn = connections;
|
|
130
|
+
if (typeof conn.node === 'string' && !reachable.has(conn.node)) {
|
|
131
|
+
queue.push(conn.node);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Build reachability set using BFS from starting nodes
|
|
137
|
+
*/
|
|
138
|
+
function buildReachabilitySet(startNodes, workflow) {
|
|
139
|
+
const reachable = new Set();
|
|
140
|
+
const queue = [...startNodes];
|
|
141
|
+
while (queue.length > 0) {
|
|
142
|
+
const currentName = queue.shift();
|
|
143
|
+
if (reachable.has(currentName))
|
|
144
|
+
continue;
|
|
145
|
+
reachable.add(currentName);
|
|
146
|
+
const outgoing = workflow.connections?.[currentName];
|
|
147
|
+
if (outgoing) {
|
|
148
|
+
for (const outputType of Object.keys(outgoing)) {
|
|
149
|
+
addConnectedNodesToQueue(outgoing[outputType], reachable, queue);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return reachable;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create unreachable node error
|
|
157
|
+
*/
|
|
158
|
+
function createUnreachableNodeError(node, triggerNames) {
|
|
159
|
+
const code = 'UNREACHABLE_NODE';
|
|
160
|
+
return {
|
|
161
|
+
code: 'UNREACHABLE_NODE',
|
|
162
|
+
message: `Node "${node.name}" cannot be reached from any trigger. It will never execute.`,
|
|
163
|
+
path: `nodes.${node.name}`,
|
|
164
|
+
node_name: node.name,
|
|
165
|
+
node_type: node.type,
|
|
166
|
+
severity: getL6Severity(code),
|
|
167
|
+
blocks_certification: blocksCertification(code),
|
|
168
|
+
suggested_fix: {
|
|
169
|
+
id: `fix-unreachable-${node.name}`,
|
|
170
|
+
fix_type: 'add_connection',
|
|
171
|
+
confidence: 0.40,
|
|
172
|
+
auto_applicable: false,
|
|
173
|
+
description: `Connect "${node.name}" to the workflow flow or remove it if unused`,
|
|
174
|
+
target_node: node.name,
|
|
175
|
+
patch: {},
|
|
176
|
+
context: {
|
|
177
|
+
reason: 'Unreachable from trigger',
|
|
178
|
+
possible_sources: triggerNames,
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check 3: UNREACHABLE_NODE
|
|
185
|
+
* Find nodes that cannot be reached from any trigger node
|
|
186
|
+
*
|
|
187
|
+
* Algorithm:
|
|
188
|
+
* 1. Start from all trigger nodes
|
|
189
|
+
* 2. Traverse connections (DFS/BFS)
|
|
190
|
+
* 3. Mark all reachable nodes
|
|
191
|
+
* 4. Any unmarked node is unreachable
|
|
192
|
+
*
|
|
193
|
+
* Fix for PM bug #6: Triggers are excluded from orphan check
|
|
194
|
+
*/
|
|
195
|
+
export function checkUnreachableNodes(context) {
|
|
196
|
+
const { catalogCache, workflow } = context;
|
|
197
|
+
if (!hasValidNodes(workflow))
|
|
198
|
+
return [];
|
|
199
|
+
const triggerNodes = workflow.nodes.filter((node) => catalogCache.triggerTypes.has(node.type.toLowerCase()));
|
|
200
|
+
const reachable = buildReachabilitySet(triggerNodes.map((n) => n.name), workflow);
|
|
201
|
+
const nonTriggerNodes = workflow.nodes.filter((node) => {
|
|
202
|
+
const nodeType = node.type.toLowerCase();
|
|
203
|
+
if (catalogCache.triggerTypes.has(nodeType))
|
|
204
|
+
return false;
|
|
205
|
+
if (isUnreachableWhitelisted(nodeType))
|
|
206
|
+
return false;
|
|
207
|
+
return true;
|
|
208
|
+
});
|
|
209
|
+
const triggerNames = triggerNodes.map((t) => t.name);
|
|
210
|
+
return nonTriggerNodes
|
|
211
|
+
.filter((node) => !reachable.has(node.name))
|
|
212
|
+
.map((node) => createUnreachableNodeError(node, triggerNames));
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check if a connection group has valid connections
|
|
216
|
+
*/
|
|
217
|
+
function hasValidConnections(connections) {
|
|
218
|
+
if (!connections)
|
|
219
|
+
return false;
|
|
220
|
+
if (Array.isArray(connections)) {
|
|
221
|
+
return connections.length > 0 && connections.some((group) => Array.isArray(group)
|
|
222
|
+
? group.length > 0
|
|
223
|
+
: group && typeof group === 'object' && 'node' in group && typeof group.node === 'string');
|
|
224
|
+
}
|
|
225
|
+
if (typeof connections === 'object' && 'node' in connections) {
|
|
226
|
+
return typeof connections.node === 'string';
|
|
227
|
+
}
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if node has any outgoing connections
|
|
232
|
+
*/
|
|
233
|
+
function nodeHasOutgoingConnections(nodeName, workflow) {
|
|
234
|
+
const outgoing = workflow.connections?.[nodeName];
|
|
235
|
+
if (!outgoing)
|
|
236
|
+
return false;
|
|
237
|
+
return Object.keys(outgoing).some((outputType) => hasValidConnections(outgoing[outputType]));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if node should be skipped for dead-end checking
|
|
241
|
+
*/
|
|
242
|
+
function shouldSkipDeadEndCheck(node, catalogCache, catalogContext) {
|
|
243
|
+
const nodeTypeLower = node.type.toLowerCase();
|
|
244
|
+
if (catalogCache.terminalTypes.has(nodeTypeLower))
|
|
245
|
+
return true;
|
|
246
|
+
if (catalogCache.actionTypes?.has(nodeTypeLower))
|
|
247
|
+
return true;
|
|
248
|
+
if (!shouldFlagAsDeadEnd(node.type, node, catalogContext))
|
|
249
|
+
return true;
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Create dead end node error
|
|
254
|
+
*/
|
|
255
|
+
function createDeadEndNodeError(node) {
|
|
256
|
+
const code = 'DEAD_END_NODE';
|
|
257
|
+
return {
|
|
258
|
+
code: 'DEAD_END_NODE',
|
|
259
|
+
message: `Node "${node.name}" has no outgoing connections. Workflow execution will stop here without completion.`,
|
|
260
|
+
path: `nodes.${node.name}`,
|
|
261
|
+
node_name: node.name,
|
|
262
|
+
node_type: node.type,
|
|
263
|
+
severity: getL6Severity(code),
|
|
264
|
+
blocks_certification: blocksCertification(code),
|
|
265
|
+
suggested_fix: {
|
|
266
|
+
id: `fix-dead-end-${node.name}`,
|
|
267
|
+
fix_type: 'add_connection',
|
|
268
|
+
confidence: 0.30,
|
|
269
|
+
auto_applicable: false,
|
|
270
|
+
description: `Add outgoing connection from "${node.name}" or convert to terminal node`,
|
|
271
|
+
target_node: node.name,
|
|
272
|
+
patch: {},
|
|
273
|
+
context: {
|
|
274
|
+
reason: 'Dead end - no outputs',
|
|
275
|
+
is_terminal: false,
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Check 4: DEAD_END_NODE
|
|
282
|
+
* Find non-terminal nodes with no outgoing connections
|
|
283
|
+
*
|
|
284
|
+
* Terminal nodes (like stopAndError, respondToWebhook) are expected to have no outputs.
|
|
285
|
+
* Whitelisted terminal nodes (messaging, storage, CRM, AI endpoints) are legitimate endpoints.
|
|
286
|
+
* Trigger nodes can never be dead ends (they start workflows).
|
|
287
|
+
* Other nodes without outputs represent dead ends in the workflow.
|
|
288
|
+
*
|
|
289
|
+
* RAG-2.2.50: Enhanced with terminal node whitelist to eliminate false positives.
|
|
290
|
+
* RAG-2.2.90.6: Now uses catalog-based node_role='action' for dynamic terminal detection.
|
|
291
|
+
*/
|
|
292
|
+
export function checkDeadEndNodes(context) {
|
|
293
|
+
const { catalogCache, workflow } = context;
|
|
294
|
+
if (!hasValidNodes(workflow))
|
|
295
|
+
return [];
|
|
296
|
+
const catalogContext = {
|
|
297
|
+
actionTypes: catalogCache.actionTypes,
|
|
298
|
+
triggerTypes: catalogCache.triggerTypes,
|
|
299
|
+
};
|
|
300
|
+
return workflow.nodes
|
|
301
|
+
.filter((node) => !shouldSkipDeadEndCheck(node, catalogCache, catalogContext))
|
|
302
|
+
.filter((node) => !nodeHasOutgoingConnections(node.name, workflow))
|
|
303
|
+
.map(createDeadEndNodeError);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Helper: Check if targetNode is downstream from sourceNode
|
|
307
|
+
* Uses BFS to traverse from sourceNode to find targetNode
|
|
308
|
+
*
|
|
309
|
+
* RAG-2.2.77: Added for WEBHOOK_NO_RESPONSE check
|
|
310
|
+
*/
|
|
311
|
+
function isDownstreamOf(sourceNode, targetNode, workflow) {
|
|
312
|
+
const visited = new Set();
|
|
313
|
+
const queue = [sourceNode];
|
|
314
|
+
while (queue.length > 0) {
|
|
315
|
+
const currentName = queue.shift();
|
|
316
|
+
if (currentName === targetNode) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
if (visited.has(currentName)) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
visited.add(currentName);
|
|
323
|
+
const outgoing = workflow.connections?.[currentName];
|
|
324
|
+
if (outgoing) {
|
|
325
|
+
for (const outputType of Object.keys(outgoing)) {
|
|
326
|
+
const connections = outgoing[outputType];
|
|
327
|
+
if (connections && Array.isArray(connections)) {
|
|
328
|
+
for (const connectionGroup of connections) {
|
|
329
|
+
if (Array.isArray(connectionGroup)) {
|
|
330
|
+
for (const connection of connectionGroup) {
|
|
331
|
+
if (connection && typeof connection === 'object' && connection.node) {
|
|
332
|
+
if (!visited.has(connection.node)) {
|
|
333
|
+
queue.push(connection.node);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check 5: WEBHOOK_NO_RESPONSE
|
|
347
|
+
* Detect webhook triggers that require but lack a response node
|
|
348
|
+
*
|
|
349
|
+
* RAG-2.2.77: New pattern check
|
|
350
|
+
* RAG-2.2.77-FIX: Only flag when responseMode requires explicit response node
|
|
351
|
+
*
|
|
352
|
+
* n8n webhook responseMode options:
|
|
353
|
+
* - 'onReceived': Immediate 200 response (no Respond node needed)
|
|
354
|
+
* - 'lastNode': Last node output becomes response (no explicit Respond needed)
|
|
355
|
+
* - 'responseNode': REQUIRES explicit Respond to Webhook node
|
|
356
|
+
*
|
|
357
|
+
* We only flag when responseMode === 'responseNode' and no response node exists.
|
|
358
|
+
* This keeps the check purely static (parameter inspection) per L6 philosophy.
|
|
359
|
+
*/
|
|
360
|
+
export function checkWebhookNoResponse(context) {
|
|
361
|
+
const { workflow } = context;
|
|
362
|
+
const warnings = [];
|
|
363
|
+
// Guard: Ensure workflow.nodes exists
|
|
364
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
365
|
+
return warnings;
|
|
366
|
+
}
|
|
367
|
+
// Find webhook triggers that explicitly require a response node
|
|
368
|
+
const webhooksNeedingResponse = workflow.nodes.filter(n => {
|
|
369
|
+
// Only check webhook and form triggers
|
|
370
|
+
if (n.type !== 'n8n-nodes-base.webhook' && n.type !== 'n8n-nodes-base.formTrigger') {
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
// Check responseMode parameter
|
|
374
|
+
const responseMode = n.parameters?.responseMode;
|
|
375
|
+
// Only flag if responseMode explicitly requires a response node
|
|
376
|
+
// 'onReceived' = immediate 200 (no node needed)
|
|
377
|
+
// 'lastNode' = last node output (no explicit node needed)
|
|
378
|
+
// 'responseNode' = REQUIRES Respond to Webhook node
|
|
379
|
+
return responseMode === 'responseNode';
|
|
380
|
+
});
|
|
381
|
+
if (webhooksNeedingResponse.length === 0) {
|
|
382
|
+
return warnings;
|
|
383
|
+
}
|
|
384
|
+
// Find response nodes
|
|
385
|
+
const responseNodes = workflow.nodes.filter(n => n.type === 'n8n-nodes-base.respondToWebhook' ||
|
|
386
|
+
n.type === 'n8n-nodes-base.formResponse');
|
|
387
|
+
// Check each webhook that needs response for a downstream response node
|
|
388
|
+
for (const trigger of webhooksNeedingResponse) {
|
|
389
|
+
const hasResponse = responseNodes.some(r => isDownstreamOf(trigger.name, r.name, workflow));
|
|
390
|
+
if (!hasResponse) {
|
|
391
|
+
const code = 'WEBHOOK_NO_RESPONSE';
|
|
392
|
+
warnings.push({
|
|
393
|
+
code: 'WEBHOOK_NO_RESPONSE',
|
|
394
|
+
message: `Webhook "${trigger.name}" has responseMode='responseNode' but no Respond to Webhook node downstream`,
|
|
395
|
+
node_name: trigger.name,
|
|
396
|
+
node_type: trigger.type,
|
|
397
|
+
severity: getL6Severity(code),
|
|
398
|
+
blocks_certification: blocksCertification(code),
|
|
399
|
+
details: {
|
|
400
|
+
trigger_type: trigger.type,
|
|
401
|
+
response_mode: 'responseNode',
|
|
402
|
+
reason: 'responseMode explicitly requires Respond to Webhook node',
|
|
403
|
+
},
|
|
404
|
+
suggested_fix: {
|
|
405
|
+
id: `fix-webhook-response-${trigger.name}-${Date.now()}`,
|
|
406
|
+
fix_type: 'add_node',
|
|
407
|
+
confidence: 0.95, // High confidence - we KNOW it needs a response node
|
|
408
|
+
auto_applicable: false,
|
|
409
|
+
description: 'Add "Respond to Webhook" node at end of workflow path',
|
|
410
|
+
target_node: trigger.name,
|
|
411
|
+
patch: {},
|
|
412
|
+
context: {
|
|
413
|
+
suggested_node_type: 'n8n-nodes-base.respondToWebhook',
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return warnings;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Check 6: DUPLICATE_NODE_NAMES
|
|
423
|
+
* Detect workflows with multiple nodes sharing the same name
|
|
424
|
+
*
|
|
425
|
+
* RAG-2.2.77: New pattern check
|
|
426
|
+
*/
|
|
427
|
+
export function checkDuplicateNodeNames(context) {
|
|
428
|
+
const { workflow } = context;
|
|
429
|
+
const warnings = [];
|
|
430
|
+
// Guard: Ensure workflow.nodes exists
|
|
431
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
432
|
+
return warnings;
|
|
433
|
+
}
|
|
434
|
+
// Count occurrences of each node name
|
|
435
|
+
const nameCount = new Map();
|
|
436
|
+
for (const node of workflow.nodes) {
|
|
437
|
+
const existing = nameCount.get(node.name) || [];
|
|
438
|
+
existing.push(node.id);
|
|
439
|
+
nameCount.set(node.name, existing);
|
|
440
|
+
}
|
|
441
|
+
// Report duplicates
|
|
442
|
+
for (const [name, ids] of nameCount) {
|
|
443
|
+
if (ids.length > 1) {
|
|
444
|
+
const code = 'DUPLICATE_NODE_NAMES';
|
|
445
|
+
warnings.push({
|
|
446
|
+
code: 'DUPLICATE_NODE_NAMES',
|
|
447
|
+
message: `Duplicate node name "${name}" used ${ids.length} times - may cause expression reference issues`,
|
|
448
|
+
node_name: name,
|
|
449
|
+
severity: getL6Severity(code),
|
|
450
|
+
blocks_certification: blocksCertification(code),
|
|
451
|
+
details: {
|
|
452
|
+
duplicate_count: ids.length,
|
|
453
|
+
node_ids: ids,
|
|
454
|
+
},
|
|
455
|
+
suggested_fix: {
|
|
456
|
+
id: `fix-duplicate-names-${name}-${Date.now()}`,
|
|
457
|
+
fix_type: 'rename_node',
|
|
458
|
+
confidence: 0.9,
|
|
459
|
+
auto_applicable: true,
|
|
460
|
+
description: `Rename duplicate nodes to unique names (e.g., "${name} 1", "${name} 2")`,
|
|
461
|
+
target_node: name,
|
|
462
|
+
patch: {},
|
|
463
|
+
context: {
|
|
464
|
+
duplicate_ids: ids,
|
|
465
|
+
suggested_names: ids.map((_, i) => `${name} ${i + 1}`),
|
|
466
|
+
},
|
|
467
|
+
},
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return warnings;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Run all flow integrity checks in parallel
|
|
475
|
+
*
|
|
476
|
+
* RAG-2.2.77: Added WEBHOOK_NO_RESPONSE and DUPLICATE_NODE_NAMES checks
|
|
477
|
+
*/
|
|
478
|
+
export async function checkFlowIntegrity(context) {
|
|
479
|
+
const startTime = performance.now();
|
|
480
|
+
// Run checks in parallel
|
|
481
|
+
// RAG-2.2.77: Added webhookNoResponseWarnings and duplicateNameWarnings
|
|
482
|
+
const [noTriggerErrors, multipleTriggerWarnings, unreachableErrors, deadEndErrors, webhookNoResponseWarnings, duplicateNameWarnings,] = await Promise.all([
|
|
483
|
+
Promise.resolve(checkNoTrigger(context)),
|
|
484
|
+
Promise.resolve(checkMultipleTriggers(context)),
|
|
485
|
+
Promise.resolve(checkUnreachableNodes(context)),
|
|
486
|
+
Promise.resolve(checkDeadEndNodes(context)),
|
|
487
|
+
Promise.resolve(checkWebhookNoResponse(context)),
|
|
488
|
+
Promise.resolve(checkDuplicateNodeNames(context)),
|
|
489
|
+
]);
|
|
490
|
+
const duration = performance.now() - startTime;
|
|
491
|
+
return {
|
|
492
|
+
errors: [
|
|
493
|
+
...noTriggerErrors,
|
|
494
|
+
...unreachableErrors,
|
|
495
|
+
...deadEndErrors,
|
|
496
|
+
],
|
|
497
|
+
warnings: [
|
|
498
|
+
...multipleTriggerWarnings,
|
|
499
|
+
...webhookNoResponseWarnings,
|
|
500
|
+
...duplicateNameWarnings,
|
|
501
|
+
],
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=flow-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-integrity.js","sourceRoot":"","sources":["../../../src/validation/l6-checks/flow-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6 Pattern Validation - Check Registry
|
|
3
|
+
*
|
|
4
|
+
* RAG-2.2.40: L6 Pattern Validation
|
|
5
|
+
* Created: January 5, 2026
|
|
6
|
+
*
|
|
7
|
+
* RAG-2.2.77: Added 8 new pattern checks
|
|
8
|
+
* Updated: January 17, 2026
|
|
9
|
+
*
|
|
10
|
+
* RAG-2.2.90.6: Added catalog-based checks
|
|
11
|
+
* Updated: January 20, 2026
|
|
12
|
+
*
|
|
13
|
+
* Exports all L6 validation checks for use by the main orchestrator.
|
|
14
|
+
*
|
|
15
|
+
* Check modules:
|
|
16
|
+
* - flow-integrity: NO_TRIGGER, UNREACHABLE_NODE, DEAD_END_NODE, MULTIPLE_TRIGGERS,
|
|
17
|
+
* WEBHOOK_NO_RESPONSE (2.2.77), DUPLICATE_NODE_NAMES (2.2.77)
|
|
18
|
+
* - error-handling: ERROR_OUTPUT_UNCONNECTED, NO_RETRY_ON_HTTP
|
|
19
|
+
* - expression-syntax: INVALID_EXPRESSION_SYNTAX, UNBALANCED_BRACES, EMPTY_EXPRESSION (2.2.77)
|
|
20
|
+
* - security: HARDCODED_SECRET, HARDCODED_URL, MISSING_WEBHOOK_AUTH (2.2.77)
|
|
21
|
+
* - data-contracts: POSSIBLE_UNDEFINED_REFERENCE (warnings only)
|
|
22
|
+
* - loops (2.2.77): CIRCULAR_REFERENCE
|
|
23
|
+
* - deprecation (2.2.77): DEPRECATED_NODE
|
|
24
|
+
* - performance (2.2.77): OVERSIZED_WORKFLOW, EXCESSIVE_RETRY
|
|
25
|
+
* - catalog-checks (2.2.90.6): BEST_PRACTICE_VIOLATION, COMMON_ERROR_RISK, NODE_ROLE_MISMATCH
|
|
26
|
+
*/
|
|
27
|
+
export * from './data-contracts.js';
|
|
28
|
+
export * from './error-handling.js';
|
|
29
|
+
export * from './expression-syntax.js';
|
|
30
|
+
export * from './flow-integrity.js';
|
|
31
|
+
export * from './security.js';
|
|
32
|
+
// RAG-2.2.77: New check modules
|
|
33
|
+
export * from './loops.js';
|
|
34
|
+
export * from './deprecation.js';
|
|
35
|
+
export * from './performance.js';
|
|
36
|
+
// RAG-2.2.90.6: Catalog-based checks
|
|
37
|
+
export * from './catalog-checks.js';
|
|
38
|
+
// RAG-4.7.4.3: AI Tool Variant checks
|
|
39
|
+
export * from './ai-tool-variants.js';
|
|
40
|
+
/**
|
|
41
|
+
* Check categories for organized execution and reporting
|
|
42
|
+
*
|
|
43
|
+
* RAG-2.2.77: Added LOOPS, DEPRECATION, PERFORMANCE categories
|
|
44
|
+
* RAG-2.2.90.6: Added CATALOG_PATTERNS category
|
|
45
|
+
*/
|
|
46
|
+
export var L6CheckCategory;
|
|
47
|
+
(function (L6CheckCategory) {
|
|
48
|
+
L6CheckCategory["FLOW_INTEGRITY"] = "FLOW_INTEGRITY";
|
|
49
|
+
L6CheckCategory["ERROR_HANDLING"] = "ERROR_HANDLING";
|
|
50
|
+
L6CheckCategory["EXPRESSION_SYNTAX"] = "EXPRESSION_SYNTAX";
|
|
51
|
+
L6CheckCategory["SECURITY"] = "SECURITY";
|
|
52
|
+
L6CheckCategory["DATA_CONTRACTS"] = "DATA_CONTRACTS";
|
|
53
|
+
// RAG-2.2.77: New categories
|
|
54
|
+
L6CheckCategory["LOOPS"] = "LOOPS";
|
|
55
|
+
L6CheckCategory["DEPRECATION"] = "DEPRECATION";
|
|
56
|
+
L6CheckCategory["PERFORMANCE"] = "PERFORMANCE";
|
|
57
|
+
// RAG-2.2.90.6: Catalog-based checks
|
|
58
|
+
L6CheckCategory["CATALOG_PATTERNS"] = "CATALOG_PATTERNS";
|
|
59
|
+
// RAG-4.7.4.3: AI Tool Variant checks
|
|
60
|
+
L6CheckCategory["AI_TOOL_VARIANTS"] = "AI_TOOL_VARIANTS";
|
|
61
|
+
})(L6CheckCategory || (L6CheckCategory = {}));
|
|
62
|
+
/**
|
|
63
|
+
* Check registry for orchestrator
|
|
64
|
+
* Maps check category to execution function
|
|
65
|
+
*
|
|
66
|
+
* RAG-2.2.77: Added LOOPS, DEPRECATION, PERFORMANCE checks
|
|
67
|
+
* RAG-2.2.90.6: Added CATALOG_PATTERNS check
|
|
68
|
+
*/
|
|
69
|
+
export const L6_CHECKS = {
|
|
70
|
+
[L6CheckCategory.FLOW_INTEGRITY]: async (context) => import('./flow-integrity').then((m) => m.checkFlowIntegrity(context)),
|
|
71
|
+
[L6CheckCategory.ERROR_HANDLING]: async (context) => import('./error-handling').then((m) => m.checkErrorHandling(context)),
|
|
72
|
+
[L6CheckCategory.EXPRESSION_SYNTAX]: async (context) => import('./expression-syntax').then((m) => m.checkExpressionSyntax(context)),
|
|
73
|
+
[L6CheckCategory.SECURITY]: async (context) => import('./security').then((m) => m.checkSecurity(context)),
|
|
74
|
+
[L6CheckCategory.DATA_CONTRACTS]: async (context) => import('./data-contracts').then((m) => m.checkDataContracts(context)),
|
|
75
|
+
// RAG-2.2.77: New check categories
|
|
76
|
+
[L6CheckCategory.LOOPS]: async (context) => import('./loops').then((m) => m.checkLoops(context)),
|
|
77
|
+
[L6CheckCategory.DEPRECATION]: async (context) => import('./deprecation').then((m) => m.checkDeprecation(context)),
|
|
78
|
+
[L6CheckCategory.PERFORMANCE]: async (context) => import('./performance').then((m) => m.checkPerformance(context)),
|
|
79
|
+
// RAG-2.2.90.6: Catalog-based checks
|
|
80
|
+
[L6CheckCategory.CATALOG_PATTERNS]: async (context) => import('./catalog-checks').then((m) => m.checkCatalogPatterns(context)),
|
|
81
|
+
// RAG-4.7.4.3: AI Tool Variant checks
|
|
82
|
+
[L6CheckCategory.AI_TOOL_VARIANTS]: async (context) => import('./ai-tool-variants').then((m) => m.checkAIToolVariants(context)),
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Expected execution times (for performance monitoring)
|
|
86
|
+
*
|
|
87
|
+
* RAG-2.2.77: Added LOOPS, DEPRECATION, PERFORMANCE timeouts
|
|
88
|
+
* RAG-2.2.90.6: Added CATALOG_PATTERNS timeout
|
|
89
|
+
* Target: <50ms total for all new checks
|
|
90
|
+
*/
|
|
91
|
+
export const L6_CHECK_TIMEOUTS = {
|
|
92
|
+
[L6CheckCategory.FLOW_INTEGRITY]: 100, // ms
|
|
93
|
+
[L6CheckCategory.ERROR_HANDLING]: 50, // ms
|
|
94
|
+
[L6CheckCategory.EXPRESSION_SYNTAX]: 100, // ms
|
|
95
|
+
[L6CheckCategory.SECURITY]: 50, // ms
|
|
96
|
+
[L6CheckCategory.DATA_CONTRACTS]: 100, // ms
|
|
97
|
+
// RAG-2.2.77: New check timeouts
|
|
98
|
+
[L6CheckCategory.LOOPS]: 20, // ms - DFS is fast
|
|
99
|
+
[L6CheckCategory.DEPRECATION]: 10, // ms - simple lookup
|
|
100
|
+
[L6CheckCategory.PERFORMANCE]: 10, // ms - simple checks
|
|
101
|
+
// RAG-2.2.90.6: Catalog-based checks
|
|
102
|
+
[L6CheckCategory.CATALOG_PATTERNS]: 50, // ms - async catalog lookups
|
|
103
|
+
// RAG-4.7.4.3: AI Tool Variant checks
|
|
104
|
+
[L6CheckCategory.AI_TOOL_VARIANTS]: 20, // ms - simple node checks
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/validation/l6-checks/index.ts"],"names":[],"mappings":"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"}
|