@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.
Files changed (319) hide show
  1. package/AGENT_INSTALL.md +223 -0
  2. package/CHANGELOG.md +38 -0
  3. package/LICENSE +21 -0
  4. package/README.md +187 -0
  5. package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
  6. package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
  7. package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
  8. package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
  9. package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
  10. package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
  11. package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
  12. package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
  13. package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
  14. package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
  15. package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
  16. package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
  17. package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
  18. package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
  19. package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
  20. package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
  21. package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
  22. package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
  23. package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
  24. package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
  25. package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
  26. package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
  27. package/dist/autofix/suggestion-fixers/types.js +29 -0
  28. package/dist/autofix/suggestion-fixers/types.js.map +1 -0
  29. package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
  30. package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
  31. package/dist/classification/certification-engine.js +208 -0
  32. package/dist/classification/certification-engine.js.map +1 -0
  33. package/dist/classification/feedback-collector.js +516 -0
  34. package/dist/classification/feedback-collector.js.map +1 -0
  35. package/dist/classification/l5-parameter-analyzer.js +670 -0
  36. package/dist/classification/l5-parameter-analyzer.js.map +1 -0
  37. package/dist/classification/l6-graph-analyzer.js +613 -0
  38. package/dist/classification/l6-graph-analyzer.js.map +1 -0
  39. package/dist/classification/severity-classifier.js +237 -0
  40. package/dist/classification/severity-classifier.js.map +1 -0
  41. package/dist/config/env.js +280 -0
  42. package/dist/config/env.js.map +1 -0
  43. package/dist/config/env.schema.js +234 -0
  44. package/dist/config/env.schema.js.map +1 -0
  45. package/dist/config/scraperEnv.js +55 -0
  46. package/dist/config/scraperEnv.js.map +1 -0
  47. package/dist/db/postgresClient.js +38 -0
  48. package/dist/db/postgresClient.js.map +1 -0
  49. package/dist/db/scraperDb.js +6 -0
  50. package/dist/db/scraperDb.js.map +1 -0
  51. package/dist/db/scraperPostgresClient.js +118 -0
  52. package/dist/db/scraperPostgresClient.js.map +1 -0
  53. package/dist/db/validationRepository.js +55 -0
  54. package/dist/db/validationRepository.js.map +1 -0
  55. package/dist/db/validatorPostgresClient.js +248 -0
  56. package/dist/db/validatorPostgresClient.js.map +1 -0
  57. package/dist/db/workflowInstanceMappingRepository.js +128 -0
  58. package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
  59. package/dist/errors/AppError.js +156 -0
  60. package/dist/errors/AppError.js.map +1 -0
  61. package/dist/errors/index.js +7 -0
  62. package/dist/errors/index.js.map +1 -0
  63. package/dist/factory/error-to-problem-mappers.js +385 -0
  64. package/dist/factory/error-to-problem-mappers.js.map +1 -0
  65. package/dist/factory/gap-recorder.js +260 -0
  66. package/dist/factory/gap-recorder.js.map +1 -0
  67. package/dist/factory/problem-recorder.js +94 -0
  68. package/dist/factory/problem-recorder.js.map +1 -0
  69. package/dist/factory/warning-to-gap-mappers.js +493 -0
  70. package/dist/factory/warning-to-gap-mappers.js.map +1 -0
  71. package/dist/factory/workflow-normalizer.js +247 -0
  72. package/dist/factory/workflow-normalizer.js.map +1 -0
  73. package/dist/mcp/adapters/catalog.js +13 -0
  74. package/dist/mcp/adapters/catalog.js.map +1 -0
  75. package/dist/mcp/adapters/index.js +36 -0
  76. package/dist/mcp/adapters/index.js.map +1 -0
  77. package/dist/mcp/adapters/supabase-catalog.js +467 -0
  78. package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
  79. package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
  80. package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
  81. package/dist/mcp/adapters/validation.js +258 -0
  82. package/dist/mcp/adapters/validation.js.map +1 -0
  83. package/dist/mcp/build-email-workflow.js +113 -0
  84. package/dist/mcp/build-email-workflow.js.map +1 -0
  85. package/dist/mcp/config.js +22 -0
  86. package/dist/mcp/config.js.map +1 -0
  87. package/dist/mcp/formatters/errors.js +217 -0
  88. package/dist/mcp/formatters/errors.js.map +1 -0
  89. package/dist/mcp/formatters/index.js +12 -0
  90. package/dist/mcp/formatters/index.js.map +1 -0
  91. package/dist/mcp/formatters/response.js +141 -0
  92. package/dist/mcp/formatters/response.js.map +1 -0
  93. package/dist/mcp/quick-test.js +33 -0
  94. package/dist/mcp/quick-test.js.map +1 -0
  95. package/dist/mcp/server.js +70 -0
  96. package/dist/mcp/server.js.map +1 -0
  97. package/dist/mcp/test-mcp-error.js +81 -0
  98. package/dist/mcp/test-mcp-error.js.map +1 -0
  99. package/dist/mcp/test-mcp.js +80 -0
  100. package/dist/mcp/test-mcp.js.map +1 -0
  101. package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
  102. package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
  103. package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
  104. package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
  105. package/dist/mcp/tools/fixes/index.js +91 -0
  106. package/dist/mcp/tools/fixes/index.js.map +1 -0
  107. package/dist/mcp/tools/fixes/node-fixes.js +233 -0
  108. package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
  109. package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
  110. package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
  111. package/dist/mcp/tools/fixes/types.js +10 -0
  112. package/dist/mcp/tools/fixes/types.js.map +1 -0
  113. package/dist/mcp/tools/handlers/check-parameter.js +300 -0
  114. package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
  115. package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
  116. package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
  117. package/dist/mcp/tools/handlers/get-node-info.js +131 -0
  118. package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
  119. package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
  120. package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
  121. package/dist/mcp/tools/handlers/list-nodes.js +126 -0
  122. package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
  123. package/dist/mcp/tools/handlers/list-operations.js +138 -0
  124. package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
  125. package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
  126. package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
  127. package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
  128. package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
  129. package/dist/mcp/tools/index.js +190 -0
  130. package/dist/mcp/tools/index.js.map +1 -0
  131. package/dist/mcp/tools/schemas.js +195 -0
  132. package/dist/mcp/tools/schemas.js.map +1 -0
  133. package/dist/mcp/tools/validate.js +95 -0
  134. package/dist/mcp/tools/validate.js.map +1 -0
  135. package/dist/mcp/types/mcp.js +7 -0
  136. package/dist/mcp/types/mcp.js.map +1 -0
  137. package/dist/mcp/utils/timeout.js +78 -0
  138. package/dist/mcp/utils/timeout.js.map +1 -0
  139. package/dist/services/BatchProcessor.js +433 -0
  140. package/dist/services/BatchProcessor.js.map +1 -0
  141. package/dist/services/CheckpointManager.js +281 -0
  142. package/dist/services/CheckpointManager.js.map +1 -0
  143. package/dist/services/CostCalculator.js +211 -0
  144. package/dist/services/CostCalculator.js.map +1 -0
  145. package/dist/services/EmbeddingCache.js +68 -0
  146. package/dist/services/EmbeddingCache.js.map +1 -0
  147. package/dist/services/EmbeddingService.js +143 -0
  148. package/dist/services/EmbeddingService.js.map +1 -0
  149. package/dist/services/RankingService.js +81 -0
  150. package/dist/services/RankingService.js.map +1 -0
  151. package/dist/services/RedisCache.js +376 -0
  152. package/dist/services/RedisCache.js.map +1 -0
  153. package/dist/services/RedisCatalogCache.js +680 -0
  154. package/dist/services/RedisCatalogCache.js.map +1 -0
  155. package/dist/services/ResumeManager.js +252 -0
  156. package/dist/services/ResumeManager.js.map +1 -0
  157. package/dist/services/SearchService.js +282 -0
  158. package/dist/services/SearchService.js.map +1 -0
  159. package/dist/services/SemanticCatalogSearch.js +405 -0
  160. package/dist/services/SemanticCatalogSearch.js.map +1 -0
  161. package/dist/services/ValidationCache.js +157 -0
  162. package/dist/services/ValidationCache.js.map +1 -0
  163. package/dist/services/WorkflowPipelineService.js +1997 -0
  164. package/dist/services/WorkflowPipelineService.js.map +1 -0
  165. package/dist/services/catalog/index.js +34 -0
  166. package/dist/services/catalog/index.js.map +1 -0
  167. package/dist/services/catalog/interfaces.js +17 -0
  168. package/dist/services/catalog/interfaces.js.map +1 -0
  169. package/dist/services/catalog/loaders.js +169 -0
  170. package/dist/services/catalog/loaders.js.map +1 -0
  171. package/dist/services/catalog/types.js +138 -0
  172. package/dist/services/catalog/types.js.map +1 -0
  173. package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
  174. package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
  175. package/dist/services/error-quality/ErrorQualityService.js +262 -0
  176. package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
  177. package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
  178. package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
  179. package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
  180. package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
  181. package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
  182. package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
  183. package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
  184. package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
  185. package/dist/services/error-quality/index.js +25 -0
  186. package/dist/services/error-quality/index.js.map +1 -0
  187. package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
  188. package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
  189. package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
  190. package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
  191. package/dist/services/error-quality/types.js +11 -0
  192. package/dist/services/error-quality/types.js.map +1 -0
  193. package/dist/services/progress/ProgressTracker.js +288 -0
  194. package/dist/services/progress/ProgressTracker.js.map +1 -0
  195. package/dist/services/progress/formatters.js +122 -0
  196. package/dist/services/progress/formatters.js.map +1 -0
  197. package/dist/services/progress/index.js +36 -0
  198. package/dist/services/progress/index.js.map +1 -0
  199. package/dist/services/progress/types.js +7 -0
  200. package/dist/services/progress/types.js.map +1 -0
  201. package/dist/services/search/embeddingGenerator.js +112 -0
  202. package/dist/services/search/embeddingGenerator.js.map +1 -0
  203. package/dist/types/aiCapabilities.js +7 -0
  204. package/dist/types/aiCapabilities.js.map +1 -0
  205. package/dist/types/aiConfigSchema.js +7 -0
  206. package/dist/types/aiConfigSchema.js.map +1 -0
  207. package/dist/utils/bannerLogger.js +186 -0
  208. package/dist/utils/bannerLogger.js.map +1 -0
  209. package/dist/utils/bannerService.js +23 -0
  210. package/dist/utils/bannerService.js.map +1 -0
  211. package/dist/utils/bannerServiceAdapter.js +54 -0
  212. package/dist/utils/bannerServiceAdapter.js.map +1 -0
  213. package/dist/utils/batchLogger.js +171 -0
  214. package/dist/utils/batchLogger.js.map +1 -0
  215. package/dist/utils/bottomStickyBanner.js +239 -0
  216. package/dist/utils/bottomStickyBanner.js.map +1 -0
  217. package/dist/utils/credentialMatcher.js +206 -0
  218. package/dist/utils/credentialMatcher.js.map +1 -0
  219. package/dist/utils/credentialNormalizer.js +442 -0
  220. package/dist/utils/credentialNormalizer.js.map +1 -0
  221. package/dist/utils/integratedBannerLogger.js +59 -0
  222. package/dist/utils/integratedBannerLogger.js.map +1 -0
  223. package/dist/utils/n8nSourceGit.js +195 -0
  224. package/dist/utils/n8nSourceGit.js.map +1 -0
  225. package/dist/utils/nodeTypeNormalizer.js +131 -0
  226. package/dist/utils/nodeTypeNormalizer.js.map +1 -0
  227. package/dist/utils/openaiClient.js +397 -0
  228. package/dist/utils/openaiClient.js.map +1 -0
  229. package/dist/utils/productionLogger.js +16 -0
  230. package/dist/utils/productionLogger.js.map +1 -0
  231. package/dist/utils/progressBarBanner.js +132 -0
  232. package/dist/utils/progressBarBanner.js.map +1 -0
  233. package/dist/utils/scriptHeartbeat.js +117 -0
  234. package/dist/utils/scriptHeartbeat.js.map +1 -0
  235. package/dist/utils/scriptLogger.js +125 -0
  236. package/dist/utils/scriptLogger.js.map +1 -0
  237. package/dist/utils/scriptRunner.js +95 -0
  238. package/dist/utils/scriptRunner.js.map +1 -0
  239. package/dist/utils/scriptTimeout.js +128 -0
  240. package/dist/utils/scriptTimeout.js.map +1 -0
  241. package/dist/utils/scriptWrapper.js +219 -0
  242. package/dist/utils/scriptWrapper.js.map +1 -0
  243. package/dist/utils/stickyBanner.js +226 -0
  244. package/dist/utils/stickyBanner.js.map +1 -0
  245. package/dist/utils/terminalSpinner.js +97 -0
  246. package/dist/utils/terminalSpinner.js.map +1 -0
  247. package/dist/utils/threeLineBanner.js +427 -0
  248. package/dist/utils/threeLineBanner.js.map +1 -0
  249. package/dist/utils/validatorCheckpointManager.js +170 -0
  250. package/dist/utils/validatorCheckpointManager.js.map +1 -0
  251. package/dist/utils/validatorConnectionManager.js +124 -0
  252. package/dist/utils/validatorConnectionManager.js.map +1 -0
  253. package/dist/validation/catalog.js +56 -0
  254. package/dist/validation/catalog.js.map +1 -0
  255. package/dist/validation/config/deprecated-nodes.js +234 -0
  256. package/dist/validation/config/deprecated-nodes.js.map +1 -0
  257. package/dist/validation/config/l6-severity.js +227 -0
  258. package/dist/validation/config/l6-severity.js.map +1 -0
  259. package/dist/validation/config/terminal-nodes.js +132 -0
  260. package/dist/validation/config/terminal-nodes.js.map +1 -0
  261. package/dist/validation/config/unreachable-nodes.js +67 -0
  262. package/dist/validation/config/unreachable-nodes.js.map +1 -0
  263. package/dist/validation/core.js +47 -0
  264. package/dist/validation/core.js.map +1 -0
  265. package/dist/validation/docExtraction.js +12 -0
  266. package/dist/validation/docExtraction.js.map +1 -0
  267. package/dist/validation/dryRunMockRunner.js +128 -0
  268. package/dist/validation/dryRunMockRunner.js.map +1 -0
  269. package/dist/validation/fixtureEngine.js +61 -0
  270. package/dist/validation/fixtureEngine.js.map +1 -0
  271. package/dist/validation/index.js +15 -0
  272. package/dist/validation/index.js.map +1 -0
  273. package/dist/validation/k-levels/k2-blockers.js +222 -0
  274. package/dist/validation/k-levels/k2-blockers.js.map +1 -0
  275. package/dist/validation/l1-structure.js +296 -0
  276. package/dist/validation/l1-structure.js.map +1 -0
  277. package/dist/validation/l2-nodes.js +282 -0
  278. package/dist/validation/l2-nodes.js.map +1 -0
  279. package/dist/validation/l3-credentials.js +322 -0
  280. package/dist/validation/l3-credentials.js.map +1 -0
  281. package/dist/validation/l4-connections.js +698 -0
  282. package/dist/validation/l4-connections.js.map +1 -0
  283. package/dist/validation/l5-parameters.js +803 -0
  284. package/dist/validation/l5-parameters.js.map +1 -0
  285. package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
  286. package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
  287. package/dist/validation/l6-checks/catalog-checks.js +260 -0
  288. package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
  289. package/dist/validation/l6-checks/data-contracts.js +197 -0
  290. package/dist/validation/l6-checks/data-contracts.js.map +1 -0
  291. package/dist/validation/l6-checks/deprecation.js +133 -0
  292. package/dist/validation/l6-checks/deprecation.js.map +1 -0
  293. package/dist/validation/l6-checks/error-handling.js +193 -0
  294. package/dist/validation/l6-checks/error-handling.js.map +1 -0
  295. package/dist/validation/l6-checks/expression-syntax.js +387 -0
  296. package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
  297. package/dist/validation/l6-checks/flow-integrity.js +504 -0
  298. package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
  299. package/dist/validation/l6-checks/index.js +106 -0
  300. package/dist/validation/l6-checks/index.js.map +1 -0
  301. package/dist/validation/l6-checks/loops.js +370 -0
  302. package/dist/validation/l6-checks/loops.js.map +1 -0
  303. package/dist/validation/l6-checks/performance.js +182 -0
  304. package/dist/validation/l6-checks/performance.js.map +1 -0
  305. package/dist/validation/l6-checks/security.js +273 -0
  306. package/dist/validation/l6-checks/security.js.map +1 -0
  307. package/dist/validation/l6-patterns.js +472 -0
  308. package/dist/validation/l6-patterns.js.map +1 -0
  309. package/dist/validation/mockLevelResolver.js +95 -0
  310. package/dist/validation/mockLevelResolver.js.map +1 -0
  311. package/dist/validation/n8nApiClient.js +21 -0
  312. package/dist/validation/n8nApiClient.js.map +1 -0
  313. package/dist/validation/n8nCli.js +87 -0
  314. package/dist/validation/n8nCli.js.map +1 -0
  315. package/dist/validation/types.js +8 -0
  316. package/dist/validation/types.js.map +1 -0
  317. package/dist/validation/usageStats.js +82 -0
  318. package/dist/validation/usageStats.js.map +1 -0
  319. 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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"}