@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,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* K2/K3 Blocking Logic
|
|
3
|
+
*
|
|
4
|
+
* RAG-2.2.77: L6 New Pattern Checks
|
|
5
|
+
* RAG-2.2.107.3: L5 External Dependency K2 Eligibility Update
|
|
6
|
+
* Created: 2026-01-17
|
|
7
|
+
* Updated: 2026-02-01
|
|
8
|
+
*
|
|
9
|
+
* Defines which L6 problem codes should block K2 (sandbox) and K3 (live) testing.
|
|
10
|
+
* This ensures dangerous workflows don't proceed to execution phases.
|
|
11
|
+
*
|
|
12
|
+
* K2 (Sandbox Testing):
|
|
13
|
+
* - Uses mocked credentials
|
|
14
|
+
* - Safe environment but still executes code
|
|
15
|
+
* - Block: Infinite loops, deprecated code that may crash
|
|
16
|
+
* - L5 External dependencies (URLs, file paths, credentials) are MOCKED, not blocked
|
|
17
|
+
* - L5 Internal config errors (missing operation, resource) BLOCK K2
|
|
18
|
+
*
|
|
19
|
+
* K3 (Live Testing):
|
|
20
|
+
* - Real n8n instance with actual credentials
|
|
21
|
+
* - Block: Everything that blocks K2, plus deprecated nodes past sunset
|
|
22
|
+
*/
|
|
23
|
+
import { isExternalDepReclassificationEnabled } from '../../classification/severity-classifier.js';
|
|
24
|
+
/**
|
|
25
|
+
* L6 problem codes that block K2 sandbox testing
|
|
26
|
+
*
|
|
27
|
+
* These issues would cause problems even in a sandbox environment:
|
|
28
|
+
* - CIRCULAR_REFERENCE: Would cause infinite loop, hanging the executor
|
|
29
|
+
*/
|
|
30
|
+
export const K2_BLOCKING_L6_CODES = [
|
|
31
|
+
'CIRCULAR_REFERENCE', // Would cause infinite loop
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* L6 problem codes that block K3 live testing
|
|
35
|
+
*
|
|
36
|
+
* These issues would cause problems in production n8n:
|
|
37
|
+
* - CIRCULAR_REFERENCE: Would hang the n8n instance
|
|
38
|
+
* - DEPRECATED_NODE: May fail in production if past sunset date
|
|
39
|
+
*/
|
|
40
|
+
export const K3_BLOCKING_L6_CODES = [
|
|
41
|
+
'CIRCULAR_REFERENCE', // Would hang n8n
|
|
42
|
+
'DEPRECATED_NODE', // May fail in production (if past sunset)
|
|
43
|
+
];
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// L5 K2 Blocking Logic (RAG-2.2.107.3)
|
|
46
|
+
// =============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* L5 problem codes that block K2 sandbox testing
|
|
49
|
+
*
|
|
50
|
+
* These are internal configuration errors that indicate incomplete workflow design:
|
|
51
|
+
* - Missing operation: Node doesn't know what action to perform
|
|
52
|
+
* - Missing resource: Node doesn't know what entity to work with
|
|
53
|
+
* - Missing condition: Control flow cannot be evaluated
|
|
54
|
+
* - Missing field mapping: Data transformation incomplete
|
|
55
|
+
*
|
|
56
|
+
* These MUST be fixed before K2 validation can proceed.
|
|
57
|
+
*/
|
|
58
|
+
export const K2_BLOCKING_L5_CODES = [
|
|
59
|
+
'L5_MISSING_OPERATION',
|
|
60
|
+
'L5_MISSING_RESOURCE',
|
|
61
|
+
'L5_MISSING_CONDITION',
|
|
62
|
+
'L5_MISSING_FIELD_MAPPING',
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* L5 external dependency types that are MOCKED by K2 (do not block)
|
|
66
|
+
*
|
|
67
|
+
* These are user-environment-specific values that:
|
|
68
|
+
* - Cannot be auto-fixed (they depend on user's infrastructure)
|
|
69
|
+
* - Can be mocked during K2 validation using pinData
|
|
70
|
+
* - Require user configuration before deployment
|
|
71
|
+
*
|
|
72
|
+
* External dependencies do NOT prevent K2 validation.
|
|
73
|
+
*/
|
|
74
|
+
export const K2_MOCKABLE_L5_EXTERNAL_DEPS = [
|
|
75
|
+
'EXTERNAL_URL',
|
|
76
|
+
'EXTERNAL_FILE_PATH',
|
|
77
|
+
'EXTERNAL_CREDENTIAL',
|
|
78
|
+
'EXTERNAL_LLM_CONFIG',
|
|
79
|
+
'EXTERNAL_QUERY',
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Check if an L5 issue should block K2 validation
|
|
83
|
+
*
|
|
84
|
+
* When ENABLE_EXTERNAL_DEP_RECLASSIFICATION is enabled:
|
|
85
|
+
* - External dependencies (URLs, file paths, credentials) → do NOT block K2
|
|
86
|
+
* - Internal configuration errors (missing operation, resource) → BLOCK K2
|
|
87
|
+
*
|
|
88
|
+
* When feature flag is disabled:
|
|
89
|
+
* - All L5 issues block K2 (backward compatible behavior)
|
|
90
|
+
*
|
|
91
|
+
* @param isExternalDep - Whether the L5 issue is an external dependency
|
|
92
|
+
* @param externalDepType - Type of external dependency (if applicable)
|
|
93
|
+
* @returns true if the L5 issue should block K2 validation
|
|
94
|
+
*/
|
|
95
|
+
export function shouldL5BlockK2(isExternalDep, externalDepType) {
|
|
96
|
+
// Check feature flag
|
|
97
|
+
if (!isExternalDepReclassificationEnabled()) {
|
|
98
|
+
// Feature flag disabled - all L5 issues block K2 (backward compatible)
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
// Feature flag enabled - external dependencies are mocked, not blocked
|
|
102
|
+
if (isExternalDep && externalDepType) {
|
|
103
|
+
return !K2_MOCKABLE_L5_EXTERNAL_DEPS.includes(externalDepType);
|
|
104
|
+
}
|
|
105
|
+
// Not an external dependency - internal config error blocks K2
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if an L5 issue should block K2 using ExtendedParameterAnalysis
|
|
110
|
+
*
|
|
111
|
+
* Convenience function that takes the full analysis object from RAG-2.2.107.1
|
|
112
|
+
*
|
|
113
|
+
* @param analysis - Extended parameter analysis with external dependency classification
|
|
114
|
+
* @returns true if the L5 issue should block K2 validation
|
|
115
|
+
*/
|
|
116
|
+
export function shouldL5BlockK2FromAnalysis(analysis) {
|
|
117
|
+
return shouldL5BlockK2(analysis.is_external_dependency, analysis.external_dependency_type);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Assess L5 K2 readiness for a set of parameter analyses
|
|
121
|
+
*
|
|
122
|
+
* @param analyses - Array of extended parameter analyses from L5 validation
|
|
123
|
+
* @returns L5 K2 readiness assessment
|
|
124
|
+
*/
|
|
125
|
+
export function getL5K2Readiness(analyses) {
|
|
126
|
+
const reclassificationEnabled = isExternalDepReclassificationEnabled();
|
|
127
|
+
if (!reclassificationEnabled) {
|
|
128
|
+
// Feature flag disabled - all L5 issues block K2
|
|
129
|
+
return {
|
|
130
|
+
k2_ready: analyses.length === 0,
|
|
131
|
+
blocking_count: analyses.length,
|
|
132
|
+
external_dep_count: 0,
|
|
133
|
+
external_dep_types: [],
|
|
134
|
+
reclassification_enabled: false,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// Feature flag enabled - classify each analysis
|
|
138
|
+
const externalDeps = analyses.filter((a) => a.is_external_dependency);
|
|
139
|
+
const internalConfigs = analyses.filter((a) => !a.is_external_dependency);
|
|
140
|
+
const externalDepTypes = [
|
|
141
|
+
...new Set(externalDeps.map((a) => a.external_dependency_type)),
|
|
142
|
+
];
|
|
143
|
+
return {
|
|
144
|
+
k2_ready: internalConfigs.length === 0,
|
|
145
|
+
blocking_count: internalConfigs.length,
|
|
146
|
+
external_dep_count: externalDeps.length,
|
|
147
|
+
external_dep_types: externalDepTypes,
|
|
148
|
+
reclassification_enabled: true,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if a workflow's L6 result is ready for K2 sandbox testing
|
|
153
|
+
*
|
|
154
|
+
* @param l6Result - L6 validation result
|
|
155
|
+
* @returns true if no K2-blocking issues found
|
|
156
|
+
*/
|
|
157
|
+
export function isK2Ready(l6Result) {
|
|
158
|
+
// Check if any errors have blocking codes
|
|
159
|
+
const hasBlockingError = l6Result.errors.some((error) => K2_BLOCKING_L6_CODES.includes(error.code));
|
|
160
|
+
return !hasBlockingError;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if a workflow's L6 result is ready for K3 live testing
|
|
164
|
+
*
|
|
165
|
+
* @param l6Result - L6 validation result
|
|
166
|
+
* @returns true if no K3-blocking issues found
|
|
167
|
+
*/
|
|
168
|
+
export function isK3Ready(l6Result) {
|
|
169
|
+
// Check if any errors have blocking codes
|
|
170
|
+
const hasBlockingError = l6Result.errors.some((error) => K3_BLOCKING_L6_CODES.includes(error.code));
|
|
171
|
+
return !hasBlockingError;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get K2-blocking issues from an L6 result
|
|
175
|
+
*
|
|
176
|
+
* @param l6Result - L6 validation result
|
|
177
|
+
* @returns Array of blocking errors
|
|
178
|
+
*/
|
|
179
|
+
export function getK2BlockingIssues(l6Result) {
|
|
180
|
+
return l6Result.errors.filter((error) => K2_BLOCKING_L6_CODES.includes(error.code));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get K3-blocking issues from an L6 result
|
|
184
|
+
*
|
|
185
|
+
* @param l6Result - L6 validation result
|
|
186
|
+
* @returns Array of blocking errors
|
|
187
|
+
*/
|
|
188
|
+
export function getK3BlockingIssues(l6Result) {
|
|
189
|
+
return l6Result.errors.filter((error) => K3_BLOCKING_L6_CODES.includes(error.code));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get complete K-level readiness assessment
|
|
193
|
+
*
|
|
194
|
+
* RAG-2.2.107.3: Extended to support L5 analyses
|
|
195
|
+
*
|
|
196
|
+
* @param l6Result - L6 validation result
|
|
197
|
+
* @param l5Analyses - Optional L5 parameter analyses for L5 K2 eligibility
|
|
198
|
+
* @returns Readiness summary for K2 and K3
|
|
199
|
+
*/
|
|
200
|
+
export function getKLevelReadiness(l6Result, l5Analyses) {
|
|
201
|
+
const k2BlockingIssues = getK2BlockingIssues(l6Result);
|
|
202
|
+
const k3BlockingIssues = getK3BlockingIssues(l6Result);
|
|
203
|
+
const result = {
|
|
204
|
+
k2_ready: k2BlockingIssues.length === 0,
|
|
205
|
+
k2_blocking_count: k2BlockingIssues.length,
|
|
206
|
+
k2_blocking_codes: [...new Set(k2BlockingIssues.map((e) => e.code))],
|
|
207
|
+
k3_ready: k3BlockingIssues.length === 0,
|
|
208
|
+
k3_blocking_count: k3BlockingIssues.length,
|
|
209
|
+
k3_blocking_codes: [...new Set(k3BlockingIssues.map((e) => e.code))],
|
|
210
|
+
};
|
|
211
|
+
// Add L5 readiness if analyses provided
|
|
212
|
+
if (l5Analyses) {
|
|
213
|
+
const l5Readiness = getL5K2Readiness(l5Analyses);
|
|
214
|
+
result.l5_k2_ready = l5Readiness.k2_ready;
|
|
215
|
+
result.l5_blocking_count = l5Readiness.blocking_count;
|
|
216
|
+
result.l5_external_dep_count = l5Readiness.external_dep_count;
|
|
217
|
+
// Combined K2 readiness requires both L6 and L5 to be ready
|
|
218
|
+
result.k2_ready = result.k2_ready && l5Readiness.k2_ready;
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=k2-blockers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k2-blockers.js","sourceRoot":"","sources":["../../../src/validation/k-levels/k2-blockers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L1: Structure Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates basic JSON structure and required fields without execution.
|
|
5
|
+
* Performance target: <50ms for typical workflow
|
|
6
|
+
*
|
|
7
|
+
* RAG-2.1.1: L1-L3 Core Validators
|
|
8
|
+
* Created: December 13, 2025
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Validate workflow JSON structure
|
|
12
|
+
*
|
|
13
|
+
* Checks:
|
|
14
|
+
* 1. Valid JSON (parseable)
|
|
15
|
+
* 2. Has nodes array (non-empty)
|
|
16
|
+
* 3. Has connections object
|
|
17
|
+
* 4. Each node has required fields: id, type, name, position
|
|
18
|
+
* 5. Each connection references valid node IDs
|
|
19
|
+
* 6. No orphan connections (referencing non-existent nodes)
|
|
20
|
+
*/
|
|
21
|
+
export async function validateL1Structure(workflowJson) {
|
|
22
|
+
const startTime = performance.now();
|
|
23
|
+
const errors = [];
|
|
24
|
+
let workflow;
|
|
25
|
+
// Step 1: Parse JSON if string
|
|
26
|
+
if (typeof workflowJson === 'string') {
|
|
27
|
+
try {
|
|
28
|
+
workflow = JSON.parse(workflowJson);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
32
|
+
return {
|
|
33
|
+
passed: false,
|
|
34
|
+
errors: [
|
|
35
|
+
{
|
|
36
|
+
code: 'INVALID_JSON',
|
|
37
|
+
message: `Failed to parse workflow JSON: ${errorMessage}`,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
duration_ms: performance.now() - startTime,
|
|
41
|
+
node_count: 0,
|
|
42
|
+
connection_count: 0,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
workflow = workflowJson;
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Validate nodes array exists
|
|
50
|
+
if (!workflow.nodes) {
|
|
51
|
+
errors.push({
|
|
52
|
+
code: 'MISSING_NODES',
|
|
53
|
+
message: 'Workflow must have a "nodes" array',
|
|
54
|
+
path: 'nodes',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else if (!Array.isArray(workflow.nodes)) {
|
|
58
|
+
errors.push({
|
|
59
|
+
code: 'INVALID_NODE_STRUCTURE',
|
|
60
|
+
message: '"nodes" must be an array',
|
|
61
|
+
path: 'nodes',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (workflow.nodes.length === 0) {
|
|
65
|
+
errors.push({
|
|
66
|
+
code: 'EMPTY_NODES',
|
|
67
|
+
message: 'Workflow must have at least one node',
|
|
68
|
+
path: 'nodes',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Step 3: Validate connections object exists
|
|
72
|
+
if (!workflow.connections) {
|
|
73
|
+
errors.push({
|
|
74
|
+
code: 'MISSING_CONNECTIONS',
|
|
75
|
+
message: 'Workflow must have a "connections" object',
|
|
76
|
+
path: 'connections',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (typeof workflow.connections !== 'object') {
|
|
80
|
+
errors.push({
|
|
81
|
+
code: 'INVALID_NODE_STRUCTURE',
|
|
82
|
+
message: '"connections" must be an object',
|
|
83
|
+
path: 'connections',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// If critical errors, return early
|
|
87
|
+
if (errors.some((e) => e.code === 'MISSING_NODES' ||
|
|
88
|
+
e.code === 'INVALID_NODE_STRUCTURE' ||
|
|
89
|
+
e.code === 'EMPTY_NODES')) {
|
|
90
|
+
return {
|
|
91
|
+
passed: false,
|
|
92
|
+
errors,
|
|
93
|
+
duration_ms: performance.now() - startTime,
|
|
94
|
+
node_count: 0,
|
|
95
|
+
connection_count: 0,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Step 4: Validate each node structure
|
|
99
|
+
const nodeIds = new Set();
|
|
100
|
+
const nodeNames = new Set();
|
|
101
|
+
// RAG-2.2.106.1: Track nodes by name to detect duplicates
|
|
102
|
+
const nodesByName = new Map();
|
|
103
|
+
for (let i = 0; i < workflow.nodes.length; i++) {
|
|
104
|
+
const node = workflow.nodes[i];
|
|
105
|
+
const nodePath = `nodes[${i}]`;
|
|
106
|
+
// Check required fields
|
|
107
|
+
if (!node.id) {
|
|
108
|
+
errors.push({
|
|
109
|
+
code: 'MISSING_NODE_FIELD',
|
|
110
|
+
message: `Node at index ${i} is missing required field: "id"`,
|
|
111
|
+
path: `${nodePath}.id`,
|
|
112
|
+
details: { node_name: node.name, node_type: node.type },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
nodeIds.add(node.id);
|
|
117
|
+
}
|
|
118
|
+
if (!node.type) {
|
|
119
|
+
errors.push({
|
|
120
|
+
code: 'MISSING_NODE_FIELD',
|
|
121
|
+
message: `Node at index ${i} is missing required field: "type"`,
|
|
122
|
+
path: `${nodePath}.type`,
|
|
123
|
+
details: { node_id: node.id, node_name: node.name },
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (!node.name) {
|
|
127
|
+
errors.push({
|
|
128
|
+
code: 'MISSING_NODE_FIELD',
|
|
129
|
+
message: `Node at index ${i} is missing required field: "name"`,
|
|
130
|
+
path: `${nodePath}.name`,
|
|
131
|
+
details: { node_id: node.id, node_type: node.type },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
nodeNames.add(node.name);
|
|
136
|
+
// RAG-2.2.106.1: Track all nodes with the same name
|
|
137
|
+
const existing = nodesByName.get(node.name) || [];
|
|
138
|
+
existing.push({ id: node.id, index: i });
|
|
139
|
+
nodesByName.set(node.name, existing);
|
|
140
|
+
}
|
|
141
|
+
if (!node.position) {
|
|
142
|
+
errors.push({
|
|
143
|
+
code: 'MISSING_NODE_FIELD',
|
|
144
|
+
message: `Node at index ${i} is missing required field: "position"`,
|
|
145
|
+
path: `${nodePath}.position`,
|
|
146
|
+
details: {
|
|
147
|
+
node_id: node.id,
|
|
148
|
+
node_name: node.name,
|
|
149
|
+
node_type: node.type,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else if (!Array.isArray(node.position) ||
|
|
154
|
+
node.position.length !== 2 ||
|
|
155
|
+
typeof node.position[0] !== 'number' ||
|
|
156
|
+
typeof node.position[1] !== 'number') {
|
|
157
|
+
errors.push({
|
|
158
|
+
code: 'INVALID_POSITION',
|
|
159
|
+
message: `Node "${node.name}" has invalid position (must be [number, number])`,
|
|
160
|
+
path: `${nodePath}.position`,
|
|
161
|
+
details: {
|
|
162
|
+
node_id: node.id,
|
|
163
|
+
node_name: node.name,
|
|
164
|
+
actual_position: node.position,
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// RAG-2.2.106.1: Step 4b - Detect duplicate node names
|
|
170
|
+
for (const [name, nodesWithName] of nodesByName) {
|
|
171
|
+
if (nodesWithName.length > 1) {
|
|
172
|
+
errors.push({
|
|
173
|
+
code: 'DUPLICATE_NODE_NAME',
|
|
174
|
+
message: `${nodesWithName.length} nodes share the same name "${name}"`,
|
|
175
|
+
path: `nodes`,
|
|
176
|
+
details: {
|
|
177
|
+
duplicate_name: name,
|
|
178
|
+
node_ids: nodesWithName.map((n) => n.id),
|
|
179
|
+
node_indices: nodesWithName.map((n) => n.index),
|
|
180
|
+
count: nodesWithName.length,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Step 5: Validate connections reference valid nodes
|
|
186
|
+
let connectionCount = 0;
|
|
187
|
+
if (workflow.connections && typeof workflow.connections === 'object') {
|
|
188
|
+
for (const sourceNodeName in workflow.connections) {
|
|
189
|
+
// Check source node exists
|
|
190
|
+
if (!nodeNames.has(sourceNodeName)) {
|
|
191
|
+
// Determine if sourceNodeName looks like a UUID or a name
|
|
192
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(sourceNodeName);
|
|
193
|
+
const referenceType = isUuid ? 'UUID' : 'name';
|
|
194
|
+
// Find similar node names (fuzzy match for better diagnostics)
|
|
195
|
+
const similarNames = Array.from(nodeNames)
|
|
196
|
+
.filter((name) => name.toLowerCase().includes(sourceNodeName.toLowerCase().substring(0, 5)) ||
|
|
197
|
+
sourceNodeName.toLowerCase().includes(name.toLowerCase().substring(0, 5)))
|
|
198
|
+
.slice(0, 3);
|
|
199
|
+
errors.push({
|
|
200
|
+
code: 'ORPHAN_CONNECTION',
|
|
201
|
+
message: `Connection references non-existent source node by ${referenceType}: "${sourceNodeName}"`,
|
|
202
|
+
path: `connections.${sourceNodeName}`,
|
|
203
|
+
details: {
|
|
204
|
+
source_node_reference: sourceNodeName,
|
|
205
|
+
reference_type: referenceType,
|
|
206
|
+
available_node_count: nodeNames.size,
|
|
207
|
+
similar_node_names: similarNames.length > 0 ? similarNames : undefined,
|
|
208
|
+
suggestion: similarNames.length > 0
|
|
209
|
+
? `Did you mean one of: ${similarNames.join(', ')}?`
|
|
210
|
+
: 'Source node does not exist in workflow. Node may have been deleted or connection is stale.',
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const connectionGroup = workflow.connections[sourceNodeName];
|
|
216
|
+
if (!connectionGroup || typeof connectionGroup !== 'object')
|
|
217
|
+
continue;
|
|
218
|
+
// Check main connections
|
|
219
|
+
// Fix: Handle null case - connectionGroup.main can be null, not just undefined
|
|
220
|
+
// Also handle null items in the main array (outputGroup can be null)
|
|
221
|
+
if (connectionGroup.main !== null &&
|
|
222
|
+
connectionGroup.main !== undefined &&
|
|
223
|
+
Array.isArray(connectionGroup.main)) {
|
|
224
|
+
for (let i = 0; i < connectionGroup.main.length; i++) {
|
|
225
|
+
const outputGroup = connectionGroup.main[i];
|
|
226
|
+
// Fix: Handle null outputGroup - skip if null or not an array
|
|
227
|
+
if (outputGroup === null ||
|
|
228
|
+
outputGroup === undefined ||
|
|
229
|
+
!Array.isArray(outputGroup))
|
|
230
|
+
continue;
|
|
231
|
+
for (let j = 0; j < outputGroup.length; j++) {
|
|
232
|
+
const connection = outputGroup[j];
|
|
233
|
+
connectionCount++;
|
|
234
|
+
if (!connection.node) {
|
|
235
|
+
errors.push({
|
|
236
|
+
code: 'ORPHAN_CONNECTION',
|
|
237
|
+
message: `Connection from "${sourceNodeName}" (output ${i}, connection ${j}) is missing target node property`,
|
|
238
|
+
path: `connections.${sourceNodeName}.main[${i}][${j}]`,
|
|
239
|
+
details: {
|
|
240
|
+
source_node: sourceNodeName,
|
|
241
|
+
output_index: i,
|
|
242
|
+
connection_index: j,
|
|
243
|
+
connection_type: connection.type || 'unknown',
|
|
244
|
+
issue: 'target_node_missing',
|
|
245
|
+
suggestion: 'Connection object is missing required "node" property. This may indicate incomplete workflow data or a corrupted connection.',
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Check target node exists
|
|
251
|
+
if (!nodeNames.has(connection.node)) {
|
|
252
|
+
// Determine if target node reference looks like a UUID or a name
|
|
253
|
+
const targetRef = connection.node;
|
|
254
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(targetRef);
|
|
255
|
+
const referenceType = isUuid ? 'UUID' : 'name';
|
|
256
|
+
// Find similar node names for better diagnostics
|
|
257
|
+
const similarNames = Array.from(nodeNames)
|
|
258
|
+
.filter((name) => name
|
|
259
|
+
.toLowerCase()
|
|
260
|
+
.includes(targetRef.toLowerCase().substring(0, 5)) ||
|
|
261
|
+
targetRef.toLowerCase().includes(name.toLowerCase().substring(0, 5)))
|
|
262
|
+
.slice(0, 3);
|
|
263
|
+
errors.push({
|
|
264
|
+
code: 'ORPHAN_CONNECTION',
|
|
265
|
+
message: `Connection from "${sourceNodeName}" (output ${i}, connection ${j}) references non-existent target node by ${referenceType}: "${targetRef}"`,
|
|
266
|
+
path: `connections.${sourceNodeName}.main[${i}][${j}]`,
|
|
267
|
+
details: {
|
|
268
|
+
source_node: sourceNodeName,
|
|
269
|
+
target_node_reference: targetRef,
|
|
270
|
+
reference_type: referenceType,
|
|
271
|
+
output_index: i,
|
|
272
|
+
connection_index: j,
|
|
273
|
+
connection_type: connection.type || 'unknown',
|
|
274
|
+
available_node_count: nodeNames.size,
|
|
275
|
+
similar_node_names: similarNames.length > 0 ? similarNames : undefined,
|
|
276
|
+
suggestion: similarNames.length > 0
|
|
277
|
+
? `Did you mean one of: ${similarNames.join(', ')}?`
|
|
278
|
+
: `Target node "${targetRef}" does not exist. Node may have been deleted, renamed, or connection is stale.`,
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const duration_ms = performance.now() - startTime;
|
|
288
|
+
return {
|
|
289
|
+
passed: errors.length === 0,
|
|
290
|
+
errors,
|
|
291
|
+
duration_ms,
|
|
292
|
+
node_count: workflow.nodes.length,
|
|
293
|
+
connection_count: connectionCount,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=l1-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l1-structure.js","sourceRoot":"","sources":["../../src/validation/l1-structure.ts"],"names":[],"mappings":"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"}
|