@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,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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"}