@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,273 @@
1
+ /**
2
+ * L6 Security Checks
3
+ *
4
+ * RAG-2.2.40: L6 Pattern Validation
5
+ * Created: January 5, 2026
6
+ *
7
+ * Validates security best practices:
8
+ * - HARDCODED_SECRET: API keys, passwords, tokens in plaintext
9
+ * - HARDCODED_URL: Production URLs hardcoded (should use environment variables)
10
+ *
11
+ * Note: Security issues are flagged but NOT auto-fixable (per PM requirement)
12
+ */
13
+ import { getL6Severity, blocksCertification } from '../config/l6-severity.js';
14
+ /**
15
+ * Patterns that indicate hardcoded secrets
16
+ */
17
+ const SECRET_PATTERNS = [
18
+ // API keys
19
+ /api[_-]?key/i,
20
+ /apikey/i,
21
+ /access[_-]?key/i,
22
+ /secret[_-]?key/i,
23
+ // Tokens
24
+ /bearer[_-]?token/i,
25
+ /auth[_-]?token/i,
26
+ /access[_-]?token/i,
27
+ /refresh[_-]?token/i,
28
+ // Passwords
29
+ /password/i,
30
+ /passwd/i,
31
+ /pwd/i,
32
+ // Credentials
33
+ /credentials/i,
34
+ /client[_-]?secret/i,
35
+ /private[_-]?key/i,
36
+ // Common formats
37
+ /[a-f0-9]{32,}/i, // Long hex strings (API keys often use this format)
38
+ /sk_live_[a-zA-Z0-9]{24,}/i, // Stripe secret keys
39
+ /ghp_[a-zA-Z0-9]{36,}/i, // GitHub personal access tokens
40
+ ];
41
+ /**
42
+ * Patterns that indicate production URLs
43
+ */
44
+ const URL_PATTERNS = [
45
+ /https?:\/\/api\./i,
46
+ /https?:\/\/.*\.com/i,
47
+ /https?:\/\/.*\.net/i,
48
+ /https?:\/\/.*\.org/i,
49
+ /https?:\/\/.*\.io/i,
50
+ /https?:\/\/production\./i,
51
+ /https?:\/\/prod\./i,
52
+ ];
53
+ /**
54
+ * Check if a value looks like a hardcoded secret
55
+ */
56
+ function looksLikeSecret(key, value) {
57
+ if (typeof value !== 'string') {
58
+ return false;
59
+ }
60
+ // Check if key name matches secret patterns
61
+ const keyMatchesPattern = SECRET_PATTERNS.some((pattern) => pattern.test(key));
62
+ // Check if value looks like a secret (long alphanumeric string)
63
+ const valueIsLongString = value.length > 20 && /^[a-zA-Z0-9_-]+$/.test(value);
64
+ // Check if value matches specific secret formats
65
+ const valueMatchesPattern = SECRET_PATTERNS.slice(-3).some((pattern) => pattern.test(value));
66
+ return keyMatchesPattern && (valueIsLongString || valueMatchesPattern);
67
+ }
68
+ /**
69
+ * Check if a value looks like a production URL
70
+ */
71
+ function looksLikeProductionUrl(value) {
72
+ if (typeof value !== 'string') {
73
+ return false;
74
+ }
75
+ return URL_PATTERNS.some((pattern) => pattern.test(value));
76
+ }
77
+ /**
78
+ * Scan object for potential secrets and URLs
79
+ * Returns both errors (HARDCODED_SECRET) and warnings (HARDCODED_URL)
80
+ */
81
+ function scanForSecrets(obj, path, nodeName, nodeType) {
82
+ const errors = [];
83
+ const warnings = [];
84
+ if (!obj || typeof obj !== 'object') {
85
+ return { errors, warnings };
86
+ }
87
+ for (const [key, value] of Object.entries(obj)) {
88
+ const fullPath = path ? `${path}.${key}` : key;
89
+ // Check for hardcoded secrets (ERROR - critical security issue)
90
+ if (looksLikeSecret(key, value)) {
91
+ const code = 'HARDCODED_SECRET';
92
+ errors.push({
93
+ code: 'HARDCODED_SECRET',
94
+ message: `Possible hardcoded secret detected in "${fullPath}". Secrets should be stored in environment variables or credentials.`,
95
+ path: fullPath,
96
+ node_name: nodeName,
97
+ node_type: nodeType,
98
+ severity: getL6Severity(code),
99
+ blocks_certification: blocksCertification(code),
100
+ details: {
101
+ field_name: key,
102
+ value_length: typeof value === 'string' ? value.length : 0,
103
+ },
104
+ suggested_fix: {
105
+ id: `fix-secret-${nodeName}-${fullPath}`,
106
+ fix_type: 'add_error_handling', // Repurposed for security
107
+ confidence: 0.0, // Zero confidence - manual review required
108
+ auto_applicable: false,
109
+ description: `Move secret from "${fullPath}" to environment variable or credential`,
110
+ target_node: nodeName,
111
+ patch: {},
112
+ context: {
113
+ security_issue: 'hardcoded_secret',
114
+ recommendation: 'Use {{ $env.API_KEY }} or configure in credentials',
115
+ field: fullPath,
116
+ },
117
+ },
118
+ });
119
+ }
120
+ // Check for hardcoded production URLs (treated as error for checkHardcodedSecrets)
121
+ if (looksLikeProductionUrl(value)) {
122
+ const code = 'HARDCODED_URL';
123
+ errors.push({
124
+ code: 'HARDCODED_URL',
125
+ message: `Production URL hardcoded in "${fullPath}". URLs should be stored in environment variables.`,
126
+ path: fullPath,
127
+ node_name: nodeName,
128
+ node_type: nodeType,
129
+ severity: getL6Severity(code),
130
+ blocks_certification: blocksCertification(code),
131
+ details: {
132
+ url: typeof value === 'string' ? value.substring(0, 50) : '',
133
+ },
134
+ suggested_fix: {
135
+ id: `fix-url-${nodeName}-${fullPath}`,
136
+ fix_type: 'add_error_handling', // Repurposed for security
137
+ confidence: 0.0, // Zero confidence - manual review required
138
+ auto_applicable: false,
139
+ description: `Move URL from "${fullPath}" to environment variable`,
140
+ target_node: nodeName,
141
+ patch: {},
142
+ context: {
143
+ security_issue: 'hardcoded_url',
144
+ recommendation: 'Use {{ $env.API_URL }} instead of hardcoded URL',
145
+ field: fullPath,
146
+ current_url: typeof value === 'string' ? value.substring(0, 100) : '',
147
+ },
148
+ },
149
+ });
150
+ }
151
+ // Recursively check nested objects
152
+ if (typeof value === 'object' && value !== null) {
153
+ const nested = scanForSecrets(value, fullPath, nodeName, nodeType);
154
+ errors.push(...nested.errors);
155
+ warnings.push(...nested.warnings);
156
+ }
157
+ }
158
+ return { errors, warnings };
159
+ }
160
+ /**
161
+ * Check 1: HARDCODED_SECRET (ERROR) and HARDCODED_URL (ERROR)
162
+ * Detect potential API keys, passwords, tokens in plaintext
163
+ */
164
+ export function checkHardcodedSecrets(context) {
165
+ const { workflow } = context;
166
+ const errors = [];
167
+ // Guard: malformed workflow JSON should not crash L6.
168
+ if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
169
+ return errors;
170
+ }
171
+ for (const node of workflow.nodes) {
172
+ const result = scanForSecrets(node.parameters, `nodes.${node.name}.parameters`, node.name, node.type);
173
+ errors.push(...result.errors);
174
+ }
175
+ return errors;
176
+ }
177
+ /**
178
+ * Check 2: HARDCODED_URL
179
+ * Detect production URLs that should be in environment variables
180
+ *
181
+ * Note: HARDCODED_URL is now detected as an error in checkHardcodedSecrets().
182
+ * This function is kept for backward compatibility but returns empty.
183
+ */
184
+ export function checkHardcodedUrls(_context) {
185
+ // HARDCODED_URL is now returned as an error from checkHardcodedSecrets()
186
+ return [];
187
+ }
188
+ /**
189
+ * Check 3: MISSING_WEBHOOK_AUTH
190
+ * Detect webhook triggers that accept mutating requests without authentication
191
+ *
192
+ * RAG-2.2.77: New pattern check
193
+ *
194
+ * Only warns for POST, PUT, DELETE, PATCH methods - GET is allowed without auth
195
+ */
196
+ export function checkMissingWebhookAuth(context) {
197
+ const { workflow } = context;
198
+ const warnings = [];
199
+ // Guard: Ensure workflow.nodes exists
200
+ if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
201
+ return warnings;
202
+ }
203
+ // Find webhook nodes
204
+ const webhooks = workflow.nodes.filter(n => n.type === 'n8n-nodes-base.webhook');
205
+ for (const webhook of webhooks) {
206
+ const auth = webhook.parameters?.authentication;
207
+ const rawHttpMethod = webhook.parameters?.httpMethod;
208
+ // httpMethod can be a string, array of strings, or undefined
209
+ // Normalize to array for consistent handling
210
+ const httpMethods = Array.isArray(rawHttpMethod)
211
+ ? rawHttpMethod.filter((m) => typeof m === 'string')
212
+ : typeof rawHttpMethod === 'string'
213
+ ? [rawHttpMethod]
214
+ : ['GET']; // Default to GET if not specified
215
+ // Only warn for mutating methods without auth
216
+ const mutatingMethods = ['POST', 'PUT', 'DELETE', 'PATCH'];
217
+ const hasMutatingMethod = httpMethods.some(m => mutatingMethods.includes(m.toUpperCase()));
218
+ if (hasMutatingMethod && (!auth || auth === 'none')) {
219
+ const mutatingMethodsUsed = httpMethods.filter(m => mutatingMethods.includes(m.toUpperCase()));
220
+ const methodDisplay = mutatingMethodsUsed.join(', ');
221
+ const code = 'MISSING_WEBHOOK_AUTH';
222
+ warnings.push({
223
+ code: 'MISSING_WEBHOOK_AUTH',
224
+ message: `Webhook "${webhook.name}" accepts ${methodDisplay} requests without authentication - potential security risk`,
225
+ node_name: webhook.name,
226
+ node_type: webhook.type,
227
+ severity: getL6Severity(code),
228
+ blocks_certification: blocksCertification(code),
229
+ details: {
230
+ http_method: methodDisplay,
231
+ http_methods: mutatingMethodsUsed,
232
+ current_auth: auth || 'none',
233
+ },
234
+ suggested_fix: {
235
+ id: `fix-webhook-auth-${webhook.name}-${Date.now()}`,
236
+ fix_type: 'add_auth',
237
+ confidence: 0.7,
238
+ auto_applicable: false,
239
+ description: 'Add authentication (Basic Auth, Header Auth, or JWT)',
240
+ target_node: webhook.name,
241
+ patch: {},
242
+ context: {
243
+ http_method: methodDisplay,
244
+ suggested_auth_options: ['basicAuth', 'headerAuth', 'jwt'],
245
+ },
246
+ },
247
+ });
248
+ }
249
+ }
250
+ return warnings;
251
+ }
252
+ /**
253
+ * Run all security checks in parallel
254
+ *
255
+ * RAG-2.2.77: Added MISSING_WEBHOOK_AUTH check
256
+ */
257
+ export async function checkSecurity(context) {
258
+ if (context.options?.skipSecurityCheck) {
259
+ return { errors: [], warnings: [] };
260
+ }
261
+ const startTime = performance.now();
262
+ // Security checks scan the same data, but split into errors vs warnings for gating policy.
263
+ // RAG-2.2.77: Added webhookAuthWarnings
264
+ const errors = checkHardcodedSecrets(context);
265
+ const urlWarnings = checkHardcodedUrls(context);
266
+ const webhookAuthWarnings = checkMissingWebhookAuth(context);
267
+ const duration = performance.now() - startTime;
268
+ return {
269
+ errors,
270
+ warnings: [...urlWarnings, ...webhookAuthWarnings],
271
+ };
272
+ }
273
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/validation/l6-checks/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;GAEG;AACH,MAAM,eAAe,GAAG;IACtB,WAAW;IACX,cAAc;IACd,SAAS;IACT,iBAAiB;IACjB,iBAAiB;IAEjB,SAAS;IACT,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;IAEpB,YAAY;IACZ,WAAW;IACX,SAAS;IACT,MAAM;IAEN,cAAc;IACd,cAAc;IACd,oBAAoB;IACpB,kBAAkB;IAElB,iBAAiB;IACjB,gBAAgB,EAAE,oDAAoD;IACtE,2BAA2B,EAAE,qBAAqB;IAClD,uBAAuB,EAAE,gCAAgC;CAC1D,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAAG;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,0BAA0B;IAC1B,oBAAoB;CACrB,CAAC;AAEF;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/E,gEAAgE;IAChE,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9E,iDAAiD;IACjD,MAAM,mBAAmB,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACrE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CACpB,CAAC;IAEF,OAAO,iBAAiB,IAAI,CAAC,iBAAiB,IAAI,mBAAmB,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAY,EACZ,IAAY,EACZ,QAAgB,EAChB,QAAgB;IAEhB,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAE/C,gEAAgE;QAChE,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,kBAAkB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,0CAA0C,QAAQ,sEAAsE;gBACjI,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC;gBAC7B,oBAAoB,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/C,OAAO,EAAE;oBACP,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBAC3D;gBACD,aAAa,EAAE;oBACb,EAAE,EAAE,cAAc,QAAQ,IAAI,QAAQ,EAAE;oBACxC,QAAQ,EAAE,oBAAoB,EAAE,0BAA0B;oBAC1D,UAAU,EAAE,GAAG,EAAE,2CAA2C;oBAC5D,eAAe,EAAE,KAAK;oBACtB,WAAW,EAAE,qBAAqB,QAAQ,yCAAyC;oBACnF,WAAW,EAAE,QAAQ;oBACrB,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,cAAc,EAAE,oDAAoD;wBACpE,KAAK,EAAE,QAAQ;qBAChB;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,mFAAmF;QACnF,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,eAAe,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,gCAAgC,QAAQ,oDAAoD;gBACrG,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,QAAQ;gBACnB,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC;gBAC7B,oBAAoB,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/C,OAAO,EAAE;oBACP,GAAG,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC7D;gBACD,aAAa,EAAE;oBACb,EAAE,EAAE,WAAW,QAAQ,IAAI,QAAQ,EAAE;oBACrC,QAAQ,EAAE,oBAAoB,EAAE,0BAA0B;oBAC1D,UAAU,EAAE,GAAG,EAAE,2CAA2C;oBAC5D,eAAe,EAAE,KAAK;oBACtB,WAAW,EAAE,kBAAkB,QAAQ,2BAA2B;oBAClE,WAAW,EAAE,QAAQ;oBACrB,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE;wBACP,cAAc,EAAE,eAAe;wBAC/B,cAAc,EAAE,iDAAiD;wBACjE,KAAK,EAAE,QAAQ;wBACf,WAAW,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;qBACtE;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAkB;IACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,sDAAsD;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,cAAc,CAC3B,IAAI,CAAC,UAAU,EACf,SAAS,IAAI,CAAC,IAAI,aAAa,EAC/B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,IAAI,CACV,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAmB;IACpD,yEAAyE;IACzE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAkB;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IAEjC,sCAAsC;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACzC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CACpC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,cAAoC,CAAC;QACtE,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;QAErD,6DAA6D;QAC7D,6CAA6C;QAC7C,MAAM,WAAW,GAAa,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YACxD,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACjE,CAAC,CAAC,OAAO,aAAa,KAAK,QAAQ;gBACjC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACjB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,kCAAkC;QAEjD,8CAA8C;QAC9C,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC7C,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC1C,CAAC;QAEF,IAAI,iBAAiB,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YACpD,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACjD,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAC1C,CAAC;YACF,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,sBAAsB,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,YAAY,OAAO,CAAC,IAAI,aAAa,aAAa,4DAA4D;gBACvH,SAAS,EAAE,OAAO,CAAC,IAAI;gBACvB,SAAS,EAAE,OAAO,CAAC,IAAI;gBACvB,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC;gBAC7B,oBAAoB,EAAE,mBAAmB,CAAC,IAAI,CAAC;gBAC/C,OAAO,EAAE;oBACP,WAAW,EAAE,aAAa;oBAC1B,YAAY,EAAE,mBAAmB;oBACjC,YAAY,EAAE,IAAI,IAAI,MAAM;iBAC7B;gBACD,aAAa,EAAE;oBACb,EAAE,EAAE,oBAAoB,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;oBACpD,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,GAAG;oBACf,eAAe,EAAE,KAAK;oBACtB,WAAW,EAAE,sDAAsD;oBACnE,WAAW,EAAE,OAAO,CAAC,IAAI;oBACzB,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE;wBACP,WAAW,EAAE,aAAa;wBAC1B,sBAAsB,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC;qBAC3D;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAkB;IAIpD,IAAI,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEpC,2FAA2F;IAC3F,wCAAwC;IACxC,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE/C,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,mBAAmB,CAAC;KACnD,CAAC;AACJ,CAAC"}