n8n-atom-mcp 0.0.1

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 (794) hide show
  1. package/.env.example +220 -0
  2. package/LICENSE +21 -0
  3. package/README.md +78 -0
  4. package/data/nodes.db +0 -0
  5. package/dist/community/community-node-fetcher.d.ts +118 -0
  6. package/dist/community/community-node-fetcher.d.ts.map +1 -0
  7. package/dist/community/community-node-fetcher.js +239 -0
  8. package/dist/community/community-node-fetcher.js.map +1 -0
  9. package/dist/community/community-node-service.d.ts +42 -0
  10. package/dist/community/community-node-service.d.ts.map +1 -0
  11. package/dist/community/community-node-service.js +210 -0
  12. package/dist/community/community-node-service.js.map +1 -0
  13. package/dist/community/documentation-batch-processor.d.ts +33 -0
  14. package/dist/community/documentation-batch-processor.d.ts.map +1 -0
  15. package/dist/community/documentation-batch-processor.js +156 -0
  16. package/dist/community/documentation-batch-processor.js.map +1 -0
  17. package/dist/community/documentation-generator.d.ts +65 -0
  18. package/dist/community/documentation-generator.d.ts.map +1 -0
  19. package/dist/community/documentation-generator.js +220 -0
  20. package/dist/community/documentation-generator.js.map +1 -0
  21. package/dist/community/index.d.ts +5 -0
  22. package/dist/community/index.d.ts.map +1 -0
  23. package/dist/community/index.js +14 -0
  24. package/dist/community/index.js.map +1 -0
  25. package/dist/config/n8n-api.d.ts +15 -0
  26. package/dist/config/n8n-api.d.ts.map +1 -0
  27. package/dist/config/n8n-api.js +53 -0
  28. package/dist/config/n8n-api.js.map +1 -0
  29. package/dist/constants/type-structures.d.ts +123 -0
  30. package/dist/constants/type-structures.d.ts.map +1 -0
  31. package/dist/constants/type-structures.js +654 -0
  32. package/dist/constants/type-structures.js.map +1 -0
  33. package/dist/database/database-adapter.d.ts +33 -0
  34. package/dist/database/database-adapter.d.ts.map +1 -0
  35. package/dist/database/database-adapter.js +420 -0
  36. package/dist/database/database-adapter.js.map +1 -0
  37. package/dist/database/node-repository.d.ts +152 -0
  38. package/dist/database/node-repository.d.ts.map +1 -0
  39. package/dist/database/node-repository.js +791 -0
  40. package/dist/database/node-repository.js.map +1 -0
  41. package/dist/errors/validation-service-error.d.ts +10 -0
  42. package/dist/errors/validation-service-error.d.ts.map +1 -0
  43. package/dist/errors/validation-service-error.js +26 -0
  44. package/dist/errors/validation-service-error.js.map +1 -0
  45. package/dist/http-server-single-session.d.ts +52 -0
  46. package/dist/http-server-single-session.d.ts.map +1 -0
  47. package/dist/http-server-single-session.js +1180 -0
  48. package/dist/http-server-single-session.js.map +1 -0
  49. package/dist/http-server.d.ts +9 -0
  50. package/dist/http-server.d.ts.map +1 -0
  51. package/dist/http-server.js +481 -0
  52. package/dist/http-server.js.map +1 -0
  53. package/dist/index.d.ts +11 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +20 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/loaders/node-loader.d.ts +11 -0
  58. package/dist/loaders/node-loader.d.ts.map +1 -0
  59. package/dist/loaders/node-loader.js +79 -0
  60. package/dist/loaders/node-loader.js.map +1 -0
  61. package/dist/mappers/docs-mapper.d.ts +7 -0
  62. package/dist/mappers/docs-mapper.d.ts.map +1 -0
  63. package/dist/mappers/docs-mapper.js +106 -0
  64. package/dist/mappers/docs-mapper.js.map +1 -0
  65. package/dist/mcp/handlers-n8n-manager.d.ts +58 -0
  66. package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -0
  67. package/dist/mcp/handlers-n8n-manager.js +3299 -0
  68. package/dist/mcp/handlers-n8n-manager.js.map +1 -0
  69. package/dist/mcp/handlers-workflow-diff.d.ts +5 -0
  70. package/dist/mcp/handlers-workflow-diff.d.ts.map +1 -0
  71. package/dist/mcp/handlers-workflow-diff.js +461 -0
  72. package/dist/mcp/handlers-workflow-diff.js.map +1 -0
  73. package/dist/mcp/index.d.ts +3 -0
  74. package/dist/mcp/index.d.ts.map +1 -0
  75. package/dist/mcp/index.js +228 -0
  76. package/dist/mcp/index.js.map +1 -0
  77. package/dist/mcp/server.d.ts +82 -0
  78. package/dist/mcp/server.d.ts.map +1 -0
  79. package/dist/mcp/server.js +3006 -0
  80. package/dist/mcp/server.js.map +1 -0
  81. package/dist/mcp/stdio-wrapper.d.ts +3 -0
  82. package/dist/mcp/stdio-wrapper.d.ts.map +1 -0
  83. package/dist/mcp/stdio-wrapper.js +81 -0
  84. package/dist/mcp/stdio-wrapper.js.map +1 -0
  85. package/dist/mcp/tool-docs/configuration/get-node.d.ts +3 -0
  86. package/dist/mcp/tool-docs/configuration/get-node.d.ts.map +1 -0
  87. package/dist/mcp/tool-docs/configuration/get-node.js +90 -0
  88. package/dist/mcp/tool-docs/configuration/get-node.js.map +1 -0
  89. package/dist/mcp/tool-docs/configuration/index.d.ts +2 -0
  90. package/dist/mcp/tool-docs/configuration/index.d.ts.map +1 -0
  91. package/dist/mcp/tool-docs/configuration/index.js +6 -0
  92. package/dist/mcp/tool-docs/configuration/index.js.map +1 -0
  93. package/dist/mcp/tool-docs/discovery/index.d.ts +2 -0
  94. package/dist/mcp/tool-docs/discovery/index.d.ts.map +1 -0
  95. package/dist/mcp/tool-docs/discovery/index.js +6 -0
  96. package/dist/mcp/tool-docs/discovery/index.js.map +1 -0
  97. package/dist/mcp/tool-docs/discovery/search-nodes.d.ts +3 -0
  98. package/dist/mcp/tool-docs/discovery/search-nodes.d.ts.map +1 -0
  99. package/dist/mcp/tool-docs/discovery/search-nodes.js +70 -0
  100. package/dist/mcp/tool-docs/discovery/search-nodes.js.map +1 -0
  101. package/dist/mcp/tool-docs/guides/ai-agents-guide.d.ts +3 -0
  102. package/dist/mcp/tool-docs/guides/ai-agents-guide.d.ts.map +1 -0
  103. package/dist/mcp/tool-docs/guides/ai-agents-guide.js +739 -0
  104. package/dist/mcp/tool-docs/guides/ai-agents-guide.js.map +1 -0
  105. package/dist/mcp/tool-docs/guides/index.d.ts +2 -0
  106. package/dist/mcp/tool-docs/guides/index.d.ts.map +1 -0
  107. package/dist/mcp/tool-docs/guides/index.js +6 -0
  108. package/dist/mcp/tool-docs/guides/index.js.map +1 -0
  109. package/dist/mcp/tool-docs/index.d.ts +4 -0
  110. package/dist/mcp/tool-docs/index.d.ts.map +1 -0
  111. package/dist/mcp/tool-docs/index.js +34 -0
  112. package/dist/mcp/tool-docs/index.js.map +1 -0
  113. package/dist/mcp/tool-docs/system/index.d.ts +3 -0
  114. package/dist/mcp/tool-docs/system/index.d.ts.map +1 -0
  115. package/dist/mcp/tool-docs/system/index.js +8 -0
  116. package/dist/mcp/tool-docs/system/index.js.map +1 -0
  117. package/dist/mcp/tool-docs/system/n8n-diagnostic.d.ts +3 -0
  118. package/dist/mcp/tool-docs/system/n8n-diagnostic.d.ts.map +1 -0
  119. package/dist/mcp/tool-docs/system/n8n-diagnostic.js +99 -0
  120. package/dist/mcp/tool-docs/system/n8n-diagnostic.js.map +1 -0
  121. package/dist/mcp/tool-docs/system/n8n-health-check.d.ts +3 -0
  122. package/dist/mcp/tool-docs/system/n8n-health-check.d.ts.map +1 -0
  123. package/dist/mcp/tool-docs/system/n8n-health-check.js +102 -0
  124. package/dist/mcp/tool-docs/system/n8n-health-check.js.map +1 -0
  125. package/dist/mcp/tool-docs/system/n8n-list-available-tools.d.ts +3 -0
  126. package/dist/mcp/tool-docs/system/n8n-list-available-tools.d.ts.map +1 -0
  127. package/dist/mcp/tool-docs/system/n8n-list-available-tools.js +75 -0
  128. package/dist/mcp/tool-docs/system/n8n-list-available-tools.js.map +1 -0
  129. package/dist/mcp/tool-docs/system/tools-documentation.d.ts +3 -0
  130. package/dist/mcp/tool-docs/system/tools-documentation.d.ts.map +1 -0
  131. package/dist/mcp/tool-docs/system/tools-documentation.js +65 -0
  132. package/dist/mcp/tool-docs/system/tools-documentation.js.map +1 -0
  133. package/dist/mcp/tool-docs/templates/get-template.d.ts +3 -0
  134. package/dist/mcp/tool-docs/templates/get-template.d.ts.map +1 -0
  135. package/dist/mcp/tool-docs/templates/get-template.js +84 -0
  136. package/dist/mcp/tool-docs/templates/get-template.js.map +1 -0
  137. package/dist/mcp/tool-docs/templates/index.d.ts +3 -0
  138. package/dist/mcp/tool-docs/templates/index.d.ts.map +1 -0
  139. package/dist/mcp/tool-docs/templates/index.js +8 -0
  140. package/dist/mcp/tool-docs/templates/index.js.map +1 -0
  141. package/dist/mcp/tool-docs/templates/search-templates.d.ts +3 -0
  142. package/dist/mcp/tool-docs/templates/search-templates.d.ts.map +1 -0
  143. package/dist/mcp/tool-docs/templates/search-templates.js +143 -0
  144. package/dist/mcp/tool-docs/templates/search-templates.js.map +1 -0
  145. package/dist/mcp/tool-docs/types.d.ts +32 -0
  146. package/dist/mcp/tool-docs/types.d.ts.map +1 -0
  147. package/dist/mcp/tool-docs/types.js +3 -0
  148. package/dist/mcp/tool-docs/types.js.map +1 -0
  149. package/dist/mcp/tool-docs/validation/index.d.ts +3 -0
  150. package/dist/mcp/tool-docs/validation/index.d.ts.map +1 -0
  151. package/dist/mcp/tool-docs/validation/index.js +8 -0
  152. package/dist/mcp/tool-docs/validation/index.js.map +1 -0
  153. package/dist/mcp/tool-docs/validation/validate-node.d.ts +3 -0
  154. package/dist/mcp/tool-docs/validation/validate-node.d.ts.map +1 -0
  155. package/dist/mcp/tool-docs/validation/validate-node.js +82 -0
  156. package/dist/mcp/tool-docs/validation/validate-node.js.map +1 -0
  157. package/dist/mcp/tool-docs/validation/validate-workflow.d.ts +3 -0
  158. package/dist/mcp/tool-docs/validation/validate-workflow.d.ts.map +1 -0
  159. package/dist/mcp/tool-docs/validation/validate-workflow.js +86 -0
  160. package/dist/mcp/tool-docs/validation/validate-workflow.js.map +1 -0
  161. package/dist/mcp/tool-docs/workflow_management/index.d.ts +13 -0
  162. package/dist/mcp/tool-docs/workflow_management/index.d.ts.map +1 -0
  163. package/dist/mcp/tool-docs/workflow_management/index.js +28 -0
  164. package/dist/mcp/tool-docs/workflow_management/index.js.map +1 -0
  165. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts +3 -0
  166. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.d.ts.map +1 -0
  167. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js +162 -0
  168. package/dist/mcp/tool-docs/workflow_management/n8n-autofix-workflow.js.map +1 -0
  169. package/dist/mcp/tool-docs/workflow_management/n8n-create-workflow.d.ts +3 -0
  170. package/dist/mcp/tool-docs/workflow_management/n8n-create-workflow.d.ts.map +1 -0
  171. package/dist/mcp/tool-docs/workflow_management/n8n-create-workflow.js +102 -0
  172. package/dist/mcp/tool-docs/workflow_management/n8n-create-workflow.js.map +1 -0
  173. package/dist/mcp/tool-docs/workflow_management/n8n-delete-workflow.d.ts +3 -0
  174. package/dist/mcp/tool-docs/workflow_management/n8n-delete-workflow.d.ts.map +1 -0
  175. package/dist/mcp/tool-docs/workflow_management/n8n-delete-workflow.js +52 -0
  176. package/dist/mcp/tool-docs/workflow_management/n8n-delete-workflow.js.map +1 -0
  177. package/dist/mcp/tool-docs/workflow_management/n8n-deploy-template.d.ts +3 -0
  178. package/dist/mcp/tool-docs/workflow_management/n8n-deploy-template.d.ts.map +1 -0
  179. package/dist/mcp/tool-docs/workflow_management/n8n-deploy-template.js +73 -0
  180. package/dist/mcp/tool-docs/workflow_management/n8n-deploy-template.js.map +1 -0
  181. package/dist/mcp/tool-docs/workflow_management/n8n-executions.d.ts +3 -0
  182. package/dist/mcp/tool-docs/workflow_management/n8n-executions.d.ts.map +1 -0
  183. package/dist/mcp/tool-docs/workflow_management/n8n-executions.js +109 -0
  184. package/dist/mcp/tool-docs/workflow_management/n8n-executions.js.map +1 -0
  185. package/dist/mcp/tool-docs/workflow_management/n8n-get-workflow.d.ts +3 -0
  186. package/dist/mcp/tool-docs/workflow_management/n8n-get-workflow.d.ts.map +1 -0
  187. package/dist/mcp/tool-docs/workflow_management/n8n-get-workflow.js +68 -0
  188. package/dist/mcp/tool-docs/workflow_management/n8n-get-workflow.js.map +1 -0
  189. package/dist/mcp/tool-docs/workflow_management/n8n-list-workflows.d.ts +3 -0
  190. package/dist/mcp/tool-docs/workflow_management/n8n-list-workflows.d.ts.map +1 -0
  191. package/dist/mcp/tool-docs/workflow_management/n8n-list-workflows.js +57 -0
  192. package/dist/mcp/tool-docs/workflow_management/n8n-list-workflows.js.map +1 -0
  193. package/dist/mcp/tool-docs/workflow_management/n8n-test-workflow.d.ts +3 -0
  194. package/dist/mcp/tool-docs/workflow_management/n8n-test-workflow.d.ts.map +1 -0
  195. package/dist/mcp/tool-docs/workflow_management/n8n-test-workflow.js +140 -0
  196. package/dist/mcp/tool-docs/workflow_management/n8n-test-workflow.js.map +1 -0
  197. package/dist/mcp/tool-docs/workflow_management/n8n-update-full-workflow.d.ts +3 -0
  198. package/dist/mcp/tool-docs/workflow_management/n8n-update-full-workflow.d.ts.map +1 -0
  199. package/dist/mcp/tool-docs/workflow_management/n8n-update-full-workflow.js +61 -0
  200. package/dist/mcp/tool-docs/workflow_management/n8n-update-full-workflow.js.map +1 -0
  201. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.d.ts +3 -0
  202. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.d.ts.map +1 -0
  203. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js +420 -0
  204. package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js.map +1 -0
  205. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.d.ts +3 -0
  206. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.d.ts.map +1 -0
  207. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js +73 -0
  208. package/dist/mcp/tool-docs/workflow_management/n8n-validate-workflow.js.map +1 -0
  209. package/dist/mcp/tool-docs/workflow_management/n8n-workflow-versions.d.ts +3 -0
  210. package/dist/mcp/tool-docs/workflow_management/n8n-workflow-versions.d.ts.map +1 -0
  211. package/dist/mcp/tool-docs/workflow_management/n8n-workflow-versions.js +170 -0
  212. package/dist/mcp/tool-docs/workflow_management/n8n-workflow-versions.js.map +1 -0
  213. package/dist/mcp/tools-documentation.d.ts +6 -0
  214. package/dist/mcp/tools-documentation.d.ts.map +1 -0
  215. package/dist/mcp/tools-documentation.js +682 -0
  216. package/dist/mcp/tools-documentation.js.map +1 -0
  217. package/dist/mcp/tools-file-operations.d.ts +154 -0
  218. package/dist/mcp/tools-file-operations.d.ts.map +1 -0
  219. package/dist/mcp/tools-file-operations.js +213 -0
  220. package/dist/mcp/tools-file-operations.js.map +1 -0
  221. package/dist/mcp/tools-n8n-friendly.d.ts +6 -0
  222. package/dist/mcp/tools-n8n-friendly.d.ts.map +1 -0
  223. package/dist/mcp/tools-n8n-friendly.js +89 -0
  224. package/dist/mcp/tools-n8n-friendly.js.map +1 -0
  225. package/dist/mcp/tools-n8n-manager.d.ts +3 -0
  226. package/dist/mcp/tools-n8n-manager.d.ts.map +1 -0
  227. package/dist/mcp/tools-n8n-manager.js +1320 -0
  228. package/dist/mcp/tools-n8n-manager.js.map +1 -0
  229. package/dist/mcp/tools.d.ts +3 -0
  230. package/dist/mcp/tools.d.ts.map +1 -0
  231. package/dist/mcp/tools.js +424 -0
  232. package/dist/mcp/tools.js.map +1 -0
  233. package/dist/mcp/workflow-examples.d.ts +76 -0
  234. package/dist/mcp/workflow-examples.d.ts.map +1 -0
  235. package/dist/mcp/workflow-examples.js +111 -0
  236. package/dist/mcp/workflow-examples.js.map +1 -0
  237. package/dist/mcp-engine.d.ts +36 -0
  238. package/dist/mcp-engine.d.ts.map +1 -0
  239. package/dist/mcp-engine.js +77 -0
  240. package/dist/mcp-engine.js.map +1 -0
  241. package/dist/mcp-tools-engine.d.ts +47 -0
  242. package/dist/mcp-tools-engine.d.ts.map +1 -0
  243. package/dist/mcp-tools-engine.js +89 -0
  244. package/dist/mcp-tools-engine.js.map +1 -0
  245. package/dist/n8n/MCPApi.credentials.d.ts +8 -0
  246. package/dist/n8n/MCPApi.credentials.d.ts.map +1 -0
  247. package/dist/n8n/MCPApi.credentials.js +53 -0
  248. package/dist/n8n/MCPApi.credentials.js.map +1 -0
  249. package/dist/n8n/MCPNode.node.d.ts +13 -0
  250. package/dist/n8n/MCPNode.node.d.ts.map +1 -0
  251. package/dist/n8n/MCPNode.node.js +260 -0
  252. package/dist/n8n/MCPNode.node.js.map +1 -0
  253. package/dist/parsers/node-parser.d.ts +38 -0
  254. package/dist/parsers/node-parser.d.ts.map +1 -0
  255. package/dist/parsers/node-parser.js +250 -0
  256. package/dist/parsers/node-parser.js.map +1 -0
  257. package/dist/parsers/property-extractor.d.ts +11 -0
  258. package/dist/parsers/property-extractor.d.ts.map +1 -0
  259. package/dist/parsers/property-extractor.js +172 -0
  260. package/dist/parsers/property-extractor.js.map +1 -0
  261. package/dist/parsers/simple-parser.d.ts +25 -0
  262. package/dist/parsers/simple-parser.d.ts.map +1 -0
  263. package/dist/parsers/simple-parser.js +212 -0
  264. package/dist/parsers/simple-parser.js.map +1 -0
  265. package/dist/scripts/debug-http-search.d.ts +3 -0
  266. package/dist/scripts/debug-http-search.d.ts.map +1 -0
  267. package/dist/scripts/debug-http-search.js +57 -0
  268. package/dist/scripts/debug-http-search.js.map +1 -0
  269. package/dist/scripts/extract-from-docker.d.ts +3 -0
  270. package/dist/scripts/extract-from-docker.d.ts.map +1 -0
  271. package/dist/scripts/extract-from-docker.js +210 -0
  272. package/dist/scripts/extract-from-docker.js.map +1 -0
  273. package/dist/scripts/fetch-community-nodes.d.ts +3 -0
  274. package/dist/scripts/fetch-community-nodes.d.ts.map +1 -0
  275. package/dist/scripts/fetch-community-nodes.js +114 -0
  276. package/dist/scripts/fetch-community-nodes.js.map +1 -0
  277. package/dist/scripts/fetch-templates-robust.d.ts +4 -0
  278. package/dist/scripts/fetch-templates-robust.d.ts.map +1 -0
  279. package/dist/scripts/fetch-templates-robust.js +132 -0
  280. package/dist/scripts/fetch-templates-robust.js.map +1 -0
  281. package/dist/scripts/fetch-templates.d.ts +4 -0
  282. package/dist/scripts/fetch-templates.d.ts.map +1 -0
  283. package/dist/scripts/fetch-templates.js +411 -0
  284. package/dist/scripts/fetch-templates.js.map +1 -0
  285. package/dist/scripts/generate-community-docs.d.ts +3 -0
  286. package/dist/scripts/generate-community-docs.d.ts.map +1 -0
  287. package/dist/scripts/generate-community-docs.js +183 -0
  288. package/dist/scripts/generate-community-docs.js.map +1 -0
  289. package/dist/scripts/migrate-readme-columns.d.ts +2 -0
  290. package/dist/scripts/migrate-readme-columns.d.ts.map +1 -0
  291. package/dist/scripts/migrate-readme-columns.js +62 -0
  292. package/dist/scripts/migrate-readme-columns.js.map +1 -0
  293. package/dist/scripts/rebuild-database.d.ts +4 -0
  294. package/dist/scripts/rebuild-database.d.ts.map +1 -0
  295. package/dist/scripts/rebuild-database.js +95 -0
  296. package/dist/scripts/rebuild-database.js.map +1 -0
  297. package/dist/scripts/rebuild-optimized.d.ts +3 -0
  298. package/dist/scripts/rebuild-optimized.d.ts.map +1 -0
  299. package/dist/scripts/rebuild-optimized.js +198 -0
  300. package/dist/scripts/rebuild-optimized.js.map +1 -0
  301. package/dist/scripts/rebuild.d.ts +3 -0
  302. package/dist/scripts/rebuild.d.ts.map +1 -0
  303. package/dist/scripts/rebuild.js +258 -0
  304. package/dist/scripts/rebuild.js.map +1 -0
  305. package/dist/scripts/sanitize-templates.d.ts +3 -0
  306. package/dist/scripts/sanitize-templates.d.ts.map +1 -0
  307. package/dist/scripts/sanitize-templates.js +88 -0
  308. package/dist/scripts/sanitize-templates.js.map +1 -0
  309. package/dist/scripts/seed-canonical-ai-examples.d.ts +4 -0
  310. package/dist/scripts/seed-canonical-ai-examples.d.ts.map +1 -0
  311. package/dist/scripts/seed-canonical-ai-examples.js +121 -0
  312. package/dist/scripts/seed-canonical-ai-examples.js.map +1 -0
  313. package/dist/scripts/test-autofix-documentation.d.ts +3 -0
  314. package/dist/scripts/test-autofix-documentation.d.ts.map +1 -0
  315. package/dist/scripts/test-autofix-documentation.js +103 -0
  316. package/dist/scripts/test-autofix-documentation.js.map +1 -0
  317. package/dist/scripts/test-autofix-workflow.d.ts +2 -0
  318. package/dist/scripts/test-autofix-workflow.d.ts.map +1 -0
  319. package/dist/scripts/test-autofix-workflow.js +223 -0
  320. package/dist/scripts/test-autofix-workflow.js.map +1 -0
  321. package/dist/scripts/test-execution-filtering.d.ts +3 -0
  322. package/dist/scripts/test-execution-filtering.d.ts.map +1 -0
  323. package/dist/scripts/test-execution-filtering.js +206 -0
  324. package/dist/scripts/test-execution-filtering.js.map +1 -0
  325. package/dist/scripts/test-node-suggestions.d.ts +3 -0
  326. package/dist/scripts/test-node-suggestions.d.ts.map +1 -0
  327. package/dist/scripts/test-node-suggestions.js +165 -0
  328. package/dist/scripts/test-node-suggestions.js.map +1 -0
  329. package/dist/scripts/test-protocol-negotiation.d.ts +3 -0
  330. package/dist/scripts/test-protocol-negotiation.d.ts.map +1 -0
  331. package/dist/scripts/test-protocol-negotiation.js +154 -0
  332. package/dist/scripts/test-protocol-negotiation.js.map +1 -0
  333. package/dist/scripts/test-summary.d.ts +3 -0
  334. package/dist/scripts/test-summary.d.ts.map +1 -0
  335. package/dist/scripts/test-summary.js +77 -0
  336. package/dist/scripts/test-summary.js.map +1 -0
  337. package/dist/scripts/test-telemetry-mutations-verbose.d.ts +2 -0
  338. package/dist/scripts/test-telemetry-mutations-verbose.d.ts.map +1 -0
  339. package/dist/scripts/test-telemetry-mutations-verbose.js +133 -0
  340. package/dist/scripts/test-telemetry-mutations-verbose.js.map +1 -0
  341. package/dist/scripts/test-telemetry-mutations.d.ts +2 -0
  342. package/dist/scripts/test-telemetry-mutations.d.ts.map +1 -0
  343. package/dist/scripts/test-telemetry-mutations.js +129 -0
  344. package/dist/scripts/test-telemetry-mutations.js.map +1 -0
  345. package/dist/scripts/test-webhook-autofix.d.ts +3 -0
  346. package/dist/scripts/test-webhook-autofix.d.ts.map +1 -0
  347. package/dist/scripts/test-webhook-autofix.js +117 -0
  348. package/dist/scripts/test-webhook-autofix.js.map +1 -0
  349. package/dist/scripts/validate.d.ts +3 -0
  350. package/dist/scripts/validate.d.ts.map +1 -0
  351. package/dist/scripts/validate.js +121 -0
  352. package/dist/scripts/validate.js.map +1 -0
  353. package/dist/scripts/validation-summary.d.ts +3 -0
  354. package/dist/scripts/validation-summary.d.ts.map +1 -0
  355. package/dist/scripts/validation-summary.js +135 -0
  356. package/dist/scripts/validation-summary.js.map +1 -0
  357. package/dist/services/ai-node-validator.d.ts +12 -0
  358. package/dist/services/ai-node-validator.d.ts.map +1 -0
  359. package/dist/services/ai-node-validator.js +429 -0
  360. package/dist/services/ai-node-validator.js.map +1 -0
  361. package/dist/services/ai-tool-validators.d.ts +58 -0
  362. package/dist/services/ai-tool-validators.d.ts.map +1 -0
  363. package/dist/services/ai-tool-validators.js +438 -0
  364. package/dist/services/ai-tool-validators.js.map +1 -0
  365. package/dist/services/breaking-change-detector.d.ts +38 -0
  366. package/dist/services/breaking-change-detector.d.ts.map +1 -0
  367. package/dist/services/breaking-change-detector.js +184 -0
  368. package/dist/services/breaking-change-detector.js.map +1 -0
  369. package/dist/services/breaking-changes-registry.d.ts +28 -0
  370. package/dist/services/breaking-changes-registry.d.ts.map +1 -0
  371. package/dist/services/breaking-changes-registry.js +200 -0
  372. package/dist/services/breaking-changes-registry.js.map +1 -0
  373. package/dist/services/community-package-service.d.ts +69 -0
  374. package/dist/services/community-package-service.d.ts.map +1 -0
  375. package/dist/services/community-package-service.js +202 -0
  376. package/dist/services/community-package-service.js.map +1 -0
  377. package/dist/services/confidence-scorer.d.ts +24 -0
  378. package/dist/services/confidence-scorer.d.ts.map +1 -0
  379. package/dist/services/confidence-scorer.js +139 -0
  380. package/dist/services/confidence-scorer.js.map +1 -0
  381. package/dist/services/config-validator.d.ts +49 -0
  382. package/dist/services/config-validator.d.ts.map +1 -0
  383. package/dist/services/config-validator.js +724 -0
  384. package/dist/services/config-validator.js.map +1 -0
  385. package/dist/services/enhanced-config-validator.d.ts +54 -0
  386. package/dist/services/enhanced-config-validator.d.ts.map +1 -0
  387. package/dist/services/enhanced-config-validator.js +789 -0
  388. package/dist/services/enhanced-config-validator.js.map +1 -0
  389. package/dist/services/error-execution-processor.d.ts +9 -0
  390. package/dist/services/error-execution-processor.d.ts.map +1 -0
  391. package/dist/services/error-execution-processor.js +380 -0
  392. package/dist/services/error-execution-processor.js.map +1 -0
  393. package/dist/services/example-generator.d.ts +14 -0
  394. package/dist/services/example-generator.d.ts.map +1 -0
  395. package/dist/services/example-generator.js +970 -0
  396. package/dist/services/example-generator.js.map +1 -0
  397. package/dist/services/execution-processor.d.ts +8 -0
  398. package/dist/services/execution-processor.d.ts.map +1 -0
  399. package/dist/services/execution-processor.js +381 -0
  400. package/dist/services/execution-processor.js.map +1 -0
  401. package/dist/services/expression-format-validator.d.ts +33 -0
  402. package/dist/services/expression-format-validator.d.ts.map +1 -0
  403. package/dist/services/expression-format-validator.js +209 -0
  404. package/dist/services/expression-format-validator.js.map +1 -0
  405. package/dist/services/expression-validator.d.ts +27 -0
  406. package/dist/services/expression-validator.d.ts.map +1 -0
  407. package/dist/services/expression-validator.js +187 -0
  408. package/dist/services/expression-validator.js.map +1 -0
  409. package/dist/services/installed-node-sync-service.d.ts +32 -0
  410. package/dist/services/installed-node-sync-service.d.ts.map +1 -0
  411. package/dist/services/installed-node-sync-service.js +190 -0
  412. package/dist/services/installed-node-sync-service.js.map +1 -0
  413. package/dist/services/n8n-api-client.d.ts +48 -0
  414. package/dist/services/n8n-api-client.d.ts.map +1 -0
  415. package/dist/services/n8n-api-client.js +458 -0
  416. package/dist/services/n8n-api-client.js.map +1 -0
  417. package/dist/services/n8n-file-format.d.ts +58 -0
  418. package/dist/services/n8n-file-format.d.ts.map +1 -0
  419. package/dist/services/n8n-file-format.js +203 -0
  420. package/dist/services/n8n-file-format.js.map +1 -0
  421. package/dist/services/n8n-validation.d.ts +273 -0
  422. package/dist/services/n8n-validation.d.ts.map +1 -0
  423. package/dist/services/n8n-validation.js +491 -0
  424. package/dist/services/n8n-validation.js.map +1 -0
  425. package/dist/services/n8n-version.d.ts +23 -0
  426. package/dist/services/n8n-version.d.ts.map +1 -0
  427. package/dist/services/n8n-version.js +151 -0
  428. package/dist/services/n8n-version.js.map +1 -0
  429. package/dist/services/node-documentation-service.d.ts +70 -0
  430. package/dist/services/node-documentation-service.d.ts.map +1 -0
  431. package/dist/services/node-documentation-service.js +518 -0
  432. package/dist/services/node-documentation-service.js.map +1 -0
  433. package/dist/services/node-migration-service.d.ts +44 -0
  434. package/dist/services/node-migration-service.d.ts.map +1 -0
  435. package/dist/services/node-migration-service.js +231 -0
  436. package/dist/services/node-migration-service.js.map +1 -0
  437. package/dist/services/node-sanitizer.d.ts +5 -0
  438. package/dist/services/node-sanitizer.d.ts.map +1 -0
  439. package/dist/services/node-sanitizer.js +225 -0
  440. package/dist/services/node-sanitizer.js.map +1 -0
  441. package/dist/services/node-similarity-service.d.ts +51 -0
  442. package/dist/services/node-similarity-service.d.ts.map +1 -0
  443. package/dist/services/node-similarity-service.js +352 -0
  444. package/dist/services/node-similarity-service.js.map +1 -0
  445. package/dist/services/node-specific-validators.d.ts +37 -0
  446. package/dist/services/node-specific-validators.d.ts.map +1 -0
  447. package/dist/services/node-specific-validators.js +1331 -0
  448. package/dist/services/node-specific-validators.js.map +1 -0
  449. package/dist/services/node-version-service.d.ts +63 -0
  450. package/dist/services/node-version-service.d.ts.map +1 -0
  451. package/dist/services/node-version-service.js +215 -0
  452. package/dist/services/node-version-service.js.map +1 -0
  453. package/dist/services/operation-similarity-service.d.ts +32 -0
  454. package/dist/services/operation-similarity-service.d.ts.map +1 -0
  455. package/dist/services/operation-similarity-service.js +341 -0
  456. package/dist/services/operation-similarity-service.js.map +1 -0
  457. package/dist/services/post-update-validator.d.ts +59 -0
  458. package/dist/services/post-update-validator.d.ts.map +1 -0
  459. package/dist/services/post-update-validator.js +231 -0
  460. package/dist/services/post-update-validator.js.map +1 -0
  461. package/dist/services/property-dependencies.d.ts +36 -0
  462. package/dist/services/property-dependencies.d.ts.map +1 -0
  463. package/dist/services/property-dependencies.js +168 -0
  464. package/dist/services/property-dependencies.js.map +1 -0
  465. package/dist/services/property-filter.d.ts +44 -0
  466. package/dist/services/property-filter.d.ts.map +1 -0
  467. package/dist/services/property-filter.js +395 -0
  468. package/dist/services/property-filter.js.map +1 -0
  469. package/dist/services/resource-similarity-service.d.ts +33 -0
  470. package/dist/services/resource-similarity-service.d.ts.map +1 -0
  471. package/dist/services/resource-similarity-service.js +358 -0
  472. package/dist/services/resource-similarity-service.js.map +1 -0
  473. package/dist/services/sqlite-storage-service.d.ts +11 -0
  474. package/dist/services/sqlite-storage-service.d.ts.map +1 -0
  475. package/dist/services/sqlite-storage-service.js +74 -0
  476. package/dist/services/sqlite-storage-service.js.map +1 -0
  477. package/dist/services/task-templates.d.ts +27 -0
  478. package/dist/services/task-templates.d.ts.map +1 -0
  479. package/dist/services/task-templates.js +1397 -0
  480. package/dist/services/task-templates.js.map +1 -0
  481. package/dist/services/tool-variant-generator.d.ts +10 -0
  482. package/dist/services/tool-variant-generator.d.ts.map +1 -0
  483. package/dist/services/tool-variant-generator.js +93 -0
  484. package/dist/services/tool-variant-generator.js.map +1 -0
  485. package/dist/services/type-structure-service.d.ts +23 -0
  486. package/dist/services/type-structure-service.d.ts.map +1 -0
  487. package/dist/services/type-structure-service.js +109 -0
  488. package/dist/services/type-structure-service.js.map +1 -0
  489. package/dist/services/universal-expression-validator.d.ts +20 -0
  490. package/dist/services/universal-expression-validator.d.ts.map +1 -0
  491. package/dist/services/universal-expression-validator.js +192 -0
  492. package/dist/services/universal-expression-validator.js.map +1 -0
  493. package/dist/services/workflow-analytics-service.d.ts +34 -0
  494. package/dist/services/workflow-analytics-service.d.ts.map +1 -0
  495. package/dist/services/workflow-analytics-service.js +144 -0
  496. package/dist/services/workflow-analytics-service.js.map +1 -0
  497. package/dist/services/workflow-auto-fixer.d.ts +74 -0
  498. package/dist/services/workflow-auto-fixer.d.ts.map +1 -0
  499. package/dist/services/workflow-auto-fixer.js +557 -0
  500. package/dist/services/workflow-auto-fixer.js.map +1 -0
  501. package/dist/services/workflow-comparison.d.ts +13 -0
  502. package/dist/services/workflow-comparison.d.ts.map +1 -0
  503. package/dist/services/workflow-comparison.js +306 -0
  504. package/dist/services/workflow-comparison.js.map +1 -0
  505. package/dist/services/workflow-debugging-service.d.ts +62 -0
  506. package/dist/services/workflow-debugging-service.d.ts.map +1 -0
  507. package/dist/services/workflow-debugging-service.js +153 -0
  508. package/dist/services/workflow-debugging-service.js.map +1 -0
  509. package/dist/services/workflow-diff-engine.d.ts +45 -0
  510. package/dist/services/workflow-diff-engine.d.ts.map +1 -0
  511. package/dist/services/workflow-diff-engine.js +830 -0
  512. package/dist/services/workflow-diff-engine.js.map +1 -0
  513. package/dist/services/workflow-validator.d.ts +112 -0
  514. package/dist/services/workflow-validator.d.ts.map +1 -0
  515. package/dist/services/workflow-validator.js +1328 -0
  516. package/dist/services/workflow-validator.js.map +1 -0
  517. package/dist/services/workflow-versioning-service.d.ts +102 -0
  518. package/dist/services/workflow-versioning-service.d.ts.map +1 -0
  519. package/dist/services/workflow-versioning-service.js +264 -0
  520. package/dist/services/workflow-versioning-service.js.map +1 -0
  521. package/dist/telemetry/batch-processor.d.ts +34 -0
  522. package/dist/telemetry/batch-processor.d.ts.map +1 -0
  523. package/dist/telemetry/batch-processor.js +337 -0
  524. package/dist/telemetry/batch-processor.js.map +1 -0
  525. package/dist/telemetry/config-manager.d.ts +32 -0
  526. package/dist/telemetry/config-manager.d.ts.map +1 -0
  527. package/dist/telemetry/config-manager.js +289 -0
  528. package/dist/telemetry/config-manager.js.map +1 -0
  529. package/dist/telemetry/early-error-logger.d.ts +26 -0
  530. package/dist/telemetry/early-error-logger.d.ts.map +1 -0
  531. package/dist/telemetry/early-error-logger.js +187 -0
  532. package/dist/telemetry/early-error-logger.js.map +1 -0
  533. package/dist/telemetry/error-sanitization-utils.d.ts +2 -0
  534. package/dist/telemetry/error-sanitization-utils.d.ts.map +1 -0
  535. package/dist/telemetry/error-sanitization-utils.js +37 -0
  536. package/dist/telemetry/error-sanitization-utils.js.map +1 -0
  537. package/dist/telemetry/error-sanitizer.d.ts +4 -0
  538. package/dist/telemetry/error-sanitizer.d.ts.map +1 -0
  539. package/dist/telemetry/error-sanitizer.js +45 -0
  540. package/dist/telemetry/error-sanitizer.js.map +1 -0
  541. package/dist/telemetry/event-tracker.d.ts +71 -0
  542. package/dist/telemetry/event-tracker.d.ts.map +1 -0
  543. package/dist/telemetry/event-tracker.js +356 -0
  544. package/dist/telemetry/event-tracker.js.map +1 -0
  545. package/dist/telemetry/event-validator.d.ts +78 -0
  546. package/dist/telemetry/event-validator.d.ts.map +1 -0
  547. package/dist/telemetry/event-validator.js +227 -0
  548. package/dist/telemetry/event-validator.js.map +1 -0
  549. package/dist/telemetry/index.d.ts +5 -0
  550. package/dist/telemetry/index.d.ts.map +1 -0
  551. package/dist/telemetry/index.js +11 -0
  552. package/dist/telemetry/index.js.map +1 -0
  553. package/dist/telemetry/intent-classifier.d.ts +11 -0
  554. package/dist/telemetry/intent-classifier.d.ts.map +1 -0
  555. package/dist/telemetry/intent-classifier.js +141 -0
  556. package/dist/telemetry/intent-classifier.js.map +1 -0
  557. package/dist/telemetry/intent-sanitizer.d.ts +9 -0
  558. package/dist/telemetry/intent-sanitizer.d.ts.map +1 -0
  559. package/dist/telemetry/intent-sanitizer.js +103 -0
  560. package/dist/telemetry/intent-sanitizer.js.map +1 -0
  561. package/dist/telemetry/mutation-tracker.d.ts +15 -0
  562. package/dist/telemetry/mutation-tracker.d.ts.map +1 -0
  563. package/dist/telemetry/mutation-tracker.js +177 -0
  564. package/dist/telemetry/mutation-tracker.js.map +1 -0
  565. package/dist/telemetry/mutation-types.d.ts +106 -0
  566. package/dist/telemetry/mutation-types.d.ts.map +1 -0
  567. package/dist/telemetry/mutation-types.js +18 -0
  568. package/dist/telemetry/mutation-types.js.map +1 -0
  569. package/dist/telemetry/mutation-validator.d.ts +20 -0
  570. package/dist/telemetry/mutation-validator.d.ts.map +1 -0
  571. package/dist/telemetry/mutation-validator.js +144 -0
  572. package/dist/telemetry/mutation-validator.js.map +1 -0
  573. package/dist/telemetry/performance-monitor.d.ts +113 -0
  574. package/dist/telemetry/performance-monitor.d.ts.map +1 -0
  575. package/dist/telemetry/performance-monitor.js +208 -0
  576. package/dist/telemetry/performance-monitor.js.map +1 -0
  577. package/dist/telemetry/rate-limiter.d.ts +30 -0
  578. package/dist/telemetry/rate-limiter.d.ts.map +1 -0
  579. package/dist/telemetry/rate-limiter.js +103 -0
  580. package/dist/telemetry/rate-limiter.js.map +1 -0
  581. package/dist/telemetry/startup-checkpoints.d.ts +26 -0
  582. package/dist/telemetry/startup-checkpoints.d.ts.map +1 -0
  583. package/dist/telemetry/startup-checkpoints.js +65 -0
  584. package/dist/telemetry/startup-checkpoints.js.map +1 -0
  585. package/dist/telemetry/telemetry-error.d.ts +44 -0
  586. package/dist/telemetry/telemetry-error.d.ts.map +1 -0
  587. package/dist/telemetry/telemetry-error.js +153 -0
  588. package/dist/telemetry/telemetry-error.js.map +1 -0
  589. package/dist/telemetry/telemetry-manager.d.ts +130 -0
  590. package/dist/telemetry/telemetry-manager.d.ts.map +1 -0
  591. package/dist/telemetry/telemetry-manager.js +257 -0
  592. package/dist/telemetry/telemetry-manager.js.map +1 -0
  593. package/dist/telemetry/telemetry-types.d.ts +103 -0
  594. package/dist/telemetry/telemetry-types.d.ts.map +1 -0
  595. package/dist/telemetry/telemetry-types.js +29 -0
  596. package/dist/telemetry/telemetry-types.js.map +1 -0
  597. package/dist/telemetry/workflow-sanitizer.d.ts +34 -0
  598. package/dist/telemetry/workflow-sanitizer.d.ts.map +1 -0
  599. package/dist/telemetry/workflow-sanitizer.js +242 -0
  600. package/dist/telemetry/workflow-sanitizer.js.map +1 -0
  601. package/dist/templates/batch-processor.d.ts +35 -0
  602. package/dist/templates/batch-processor.d.ts.map +1 -0
  603. package/dist/templates/batch-processor.js +320 -0
  604. package/dist/templates/batch-processor.js.map +1 -0
  605. package/dist/templates/metadata-generator.d.ts +52 -0
  606. package/dist/templates/metadata-generator.d.ts.map +1 -0
  607. package/dist/templates/metadata-generator.js +252 -0
  608. package/dist/templates/metadata-generator.js.map +1 -0
  609. package/dist/templates/template-fetcher.d.ts +45 -0
  610. package/dist/templates/template-fetcher.d.ts.map +1 -0
  611. package/dist/templates/template-fetcher.js +122 -0
  612. package/dist/templates/template-fetcher.js.map +1 -0
  613. package/dist/templates/template-repository.d.ts +93 -0
  614. package/dist/templates/template-repository.d.ts.map +1 -0
  615. package/dist/templates/template-repository.js +644 -0
  616. package/dist/templates/template-repository.js.map +1 -0
  617. package/dist/templates/template-service.d.ts +79 -0
  618. package/dist/templates/template-service.d.ts.map +1 -0
  619. package/dist/templates/template-service.js +300 -0
  620. package/dist/templates/template-service.js.map +1 -0
  621. package/dist/triggers/handlers/base-handler.d.ts +21 -0
  622. package/dist/triggers/handlers/base-handler.d.ts.map +1 -0
  623. package/dist/triggers/handlers/base-handler.js +60 -0
  624. package/dist/triggers/handlers/base-handler.js.map +1 -0
  625. package/dist/triggers/handlers/chat-handler.d.ts +38 -0
  626. package/dist/triggers/handlers/chat-handler.d.ts.map +1 -0
  627. package/dist/triggers/handlers/chat-handler.js +129 -0
  628. package/dist/triggers/handlers/chat-handler.js.map +1 -0
  629. package/dist/triggers/handlers/form-handler.d.ts +35 -0
  630. package/dist/triggers/handlers/form-handler.d.ts.map +1 -0
  631. package/dist/triggers/handlers/form-handler.js +362 -0
  632. package/dist/triggers/handlers/form-handler.js.map +1 -0
  633. package/dist/triggers/handlers/webhook-handler.d.ts +38 -0
  634. package/dist/triggers/handlers/webhook-handler.d.ts.map +1 -0
  635. package/dist/triggers/handlers/webhook-handler.js +115 -0
  636. package/dist/triggers/handlers/webhook-handler.js.map +1 -0
  637. package/dist/triggers/index.d.ts +5 -0
  638. package/dist/triggers/index.d.ts.map +1 -0
  639. package/dist/triggers/index.js +14 -0
  640. package/dist/triggers/index.js.map +1 -0
  641. package/dist/triggers/trigger-detector.d.ts +6 -0
  642. package/dist/triggers/trigger-detector.d.ts.map +1 -0
  643. package/dist/triggers/trigger-detector.js +201 -0
  644. package/dist/triggers/trigger-detector.js.map +1 -0
  645. package/dist/triggers/trigger-registry.d.ts +18 -0
  646. package/dist/triggers/trigger-registry.d.ts.map +1 -0
  647. package/dist/triggers/trigger-registry.js +87 -0
  648. package/dist/triggers/trigger-registry.js.map +1 -0
  649. package/dist/triggers/types.d.ts +76 -0
  650. package/dist/triggers/types.d.ts.map +1 -0
  651. package/dist/triggers/types.js +3 -0
  652. package/dist/triggers/types.js.map +1 -0
  653. package/dist/types/index.d.ts +49 -0
  654. package/dist/types/index.d.ts.map +1 -0
  655. package/dist/types/index.js +21 -0
  656. package/dist/types/index.js.map +1 -0
  657. package/dist/types/instance-context.d.ts +20 -0
  658. package/dist/types/instance-context.d.ts.map +1 -0
  659. package/dist/types/instance-context.js +153 -0
  660. package/dist/types/instance-context.js.map +1 -0
  661. package/dist/types/n8n-api.d.ts +376 -0
  662. package/dist/types/n8n-api.d.ts.map +1 -0
  663. package/dist/types/n8n-api.js +10 -0
  664. package/dist/types/n8n-api.js.map +1 -0
  665. package/dist/types/node-types.d.ts +19 -0
  666. package/dist/types/node-types.d.ts.map +1 -0
  667. package/dist/types/node-types.js +62 -0
  668. package/dist/types/node-types.js.map +1 -0
  669. package/dist/types/session-state.d.ts +15 -0
  670. package/dist/types/session-state.d.ts.map +1 -0
  671. package/dist/types/session-state.js +3 -0
  672. package/dist/types/session-state.js.map +1 -0
  673. package/dist/types/type-structures.d.ts +42 -0
  674. package/dist/types/type-structures.d.ts.map +1 -0
  675. package/dist/types/type-structures.js +32 -0
  676. package/dist/types/type-structures.js.map +1 -0
  677. package/dist/types/workflow-comparison.d.ts +51 -0
  678. package/dist/types/workflow-comparison.d.ts.map +1 -0
  679. package/dist/types/workflow-comparison.js +3 -0
  680. package/dist/types/workflow-comparison.js.map +1 -0
  681. package/dist/types/workflow-diff.d.ts +148 -0
  682. package/dist/types/workflow-diff.d.ts.map +1 -0
  683. package/dist/types/workflow-diff.js +15 -0
  684. package/dist/types/workflow-diff.js.map +1 -0
  685. package/dist/utils/auth.d.ts +13 -0
  686. package/dist/utils/auth.d.ts.map +1 -0
  687. package/dist/utils/auth.js +82 -0
  688. package/dist/utils/auth.js.map +1 -0
  689. package/dist/utils/bridge.d.ts +12 -0
  690. package/dist/utils/bridge.d.ts.map +1 -0
  691. package/dist/utils/bridge.js +127 -0
  692. package/dist/utils/bridge.js.map +1 -0
  693. package/dist/utils/cache-utils.d.ts +58 -0
  694. package/dist/utils/cache-utils.d.ts.map +1 -0
  695. package/dist/utils/cache-utils.js +243 -0
  696. package/dist/utils/cache-utils.js.map +1 -0
  697. package/dist/utils/console-manager.d.ts +10 -0
  698. package/dist/utils/console-manager.d.ts.map +1 -0
  699. package/dist/utils/console-manager.js +63 -0
  700. package/dist/utils/console-manager.js.map +1 -0
  701. package/dist/utils/documentation-fetcher.d.ts +2 -0
  702. package/dist/utils/documentation-fetcher.d.ts.map +1 -0
  703. package/dist/utils/documentation-fetcher.js +18 -0
  704. package/dist/utils/documentation-fetcher.js.map +1 -0
  705. package/dist/utils/enhanced-documentation-fetcher.d.ts +74 -0
  706. package/dist/utils/enhanced-documentation-fetcher.d.ts.map +1 -0
  707. package/dist/utils/enhanced-documentation-fetcher.js +521 -0
  708. package/dist/utils/enhanced-documentation-fetcher.js.map +1 -0
  709. package/dist/utils/error-handler.d.ts +24 -0
  710. package/dist/utils/error-handler.d.ts.map +1 -0
  711. package/dist/utils/error-handler.js +84 -0
  712. package/dist/utils/error-handler.js.map +1 -0
  713. package/dist/utils/example-generator.d.ts +8 -0
  714. package/dist/utils/example-generator.d.ts.map +1 -0
  715. package/dist/utils/example-generator.js +106 -0
  716. package/dist/utils/example-generator.js.map +1 -0
  717. package/dist/utils/expression-utils.d.ts +6 -0
  718. package/dist/utils/expression-utils.d.ts.map +1 -0
  719. package/dist/utils/expression-utils.js +47 -0
  720. package/dist/utils/expression-utils.js.map +1 -0
  721. package/dist/utils/fixed-collection-validator.d.ts +35 -0
  722. package/dist/utils/fixed-collection-validator.d.ts.map +1 -0
  723. package/dist/utils/fixed-collection-validator.js +358 -0
  724. package/dist/utils/fixed-collection-validator.js.map +1 -0
  725. package/dist/utils/logger.d.ts +33 -0
  726. package/dist/utils/logger.d.ts.map +1 -0
  727. package/dist/utils/logger.js +101 -0
  728. package/dist/utils/logger.js.map +1 -0
  729. package/dist/utils/mcp-client.d.ts +21 -0
  730. package/dist/utils/mcp-client.d.ts.map +1 -0
  731. package/dist/utils/mcp-client.js +96 -0
  732. package/dist/utils/mcp-client.js.map +1 -0
  733. package/dist/utils/n8n-errors.d.ts +27 -0
  734. package/dist/utils/n8n-errors.d.ts.map +1 -0
  735. package/dist/utils/n8n-errors.js +138 -0
  736. package/dist/utils/n8n-errors.js.map +1 -0
  737. package/dist/utils/node-classification.d.ts +5 -0
  738. package/dist/utils/node-classification.d.ts.map +1 -0
  739. package/dist/utils/node-classification.js +31 -0
  740. package/dist/utils/node-classification.js.map +1 -0
  741. package/dist/utils/node-source-extractor.d.ts +21 -0
  742. package/dist/utils/node-source-extractor.d.ts.map +1 -0
  743. package/dist/utils/node-source-extractor.js +377 -0
  744. package/dist/utils/node-source-extractor.js.map +1 -0
  745. package/dist/utils/node-type-normalizer.d.ts +17 -0
  746. package/dist/utils/node-type-normalizer.d.ts.map +1 -0
  747. package/dist/utils/node-type-normalizer.js +87 -0
  748. package/dist/utils/node-type-normalizer.js.map +1 -0
  749. package/dist/utils/node-type-utils.d.ts +12 -0
  750. package/dist/utils/node-type-utils.d.ts.map +1 -0
  751. package/dist/utils/node-type-utils.js +126 -0
  752. package/dist/utils/node-type-utils.js.map +1 -0
  753. package/dist/utils/node-utils.d.ts +4 -0
  754. package/dist/utils/node-utils.d.ts.map +1 -0
  755. package/dist/utils/node-utils.js +81 -0
  756. package/dist/utils/node-utils.js.map +1 -0
  757. package/dist/utils/npm-version-checker.d.ts +14 -0
  758. package/dist/utils/npm-version-checker.d.ts.map +1 -0
  759. package/dist/utils/npm-version-checker.js +125 -0
  760. package/dist/utils/npm-version-checker.js.map +1 -0
  761. package/dist/utils/protocol-version.d.ts +19 -0
  762. package/dist/utils/protocol-version.d.ts.map +1 -0
  763. package/dist/utils/protocol-version.js +95 -0
  764. package/dist/utils/protocol-version.js.map +1 -0
  765. package/dist/utils/simple-cache.d.ts +10 -0
  766. package/dist/utils/simple-cache.d.ts.map +1 -0
  767. package/dist/utils/simple-cache.js +42 -0
  768. package/dist/utils/simple-cache.js.map +1 -0
  769. package/dist/utils/ssrf-protection.d.ts +7 -0
  770. package/dist/utils/ssrf-protection.d.ts.map +1 -0
  771. package/dist/utils/ssrf-protection.js +118 -0
  772. package/dist/utils/ssrf-protection.js.map +1 -0
  773. package/dist/utils/template-node-resolver.d.ts +2 -0
  774. package/dist/utils/template-node-resolver.d.ts.map +1 -0
  775. package/dist/utils/template-node-resolver.js +161 -0
  776. package/dist/utils/template-node-resolver.js.map +1 -0
  777. package/dist/utils/template-sanitizer.d.ts +21 -0
  778. package/dist/utils/template-sanitizer.d.ts.map +1 -0
  779. package/dist/utils/template-sanitizer.js +126 -0
  780. package/dist/utils/template-sanitizer.js.map +1 -0
  781. package/dist/utils/url-detector.d.ts +9 -0
  782. package/dist/utils/url-detector.d.ts.map +1 -0
  783. package/dist/utils/url-detector.js +79 -0
  784. package/dist/utils/url-detector.js.map +1 -0
  785. package/dist/utils/validation-schemas.d.ts +32 -0
  786. package/dist/utils/validation-schemas.d.ts.map +1 -0
  787. package/dist/utils/validation-schemas.js +219 -0
  788. package/dist/utils/validation-schemas.js.map +1 -0
  789. package/dist/utils/version.d.ts +2 -0
  790. package/dist/utils/version.d.ts.map +1 -0
  791. package/dist/utils/version.js +18 -0
  792. package/dist/utils/version.js.map +1 -0
  793. package/package.json +178 -0
  794. package/package.runtime.json +24 -0
@@ -0,0 +1,1180 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SingleSessionHTTPServer = void 0;
8
+ const express_1 = __importDefault(require("express"));
9
+ const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
10
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
11
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
12
+ const server_1 = require("./mcp/server");
13
+ const console_manager_1 = require("./utils/console-manager");
14
+ const logger_1 = require("./utils/logger");
15
+ const auth_1 = require("./utils/auth");
16
+ const fs_1 = require("fs");
17
+ const dotenv_1 = __importDefault(require("dotenv"));
18
+ const url_detector_1 = require("./utils/url-detector");
19
+ const version_1 = require("./utils/version");
20
+ const uuid_1 = require("uuid");
21
+ const crypto_1 = require("crypto");
22
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
23
+ const protocol_version_1 = require("./utils/protocol-version");
24
+ const instance_context_1 = require("./types/instance-context");
25
+ dotenv_1.default.config();
26
+ const DEFAULT_PROTOCOL_VERSION = protocol_version_1.STANDARD_PROTOCOL_VERSION;
27
+ const MAX_SESSIONS = Math.max(1, parseInt(process.env.N8N_MCP_MAX_SESSIONS || '100', 10));
28
+ const SESSION_CLEANUP_INTERVAL = 5 * 60 * 1000;
29
+ function extractMultiTenantHeaders(req) {
30
+ return {
31
+ 'x-n8n-url': req.headers['x-n8n-url'],
32
+ 'x-n8n-key': req.headers['x-n8n-key'],
33
+ 'x-instance-id': req.headers['x-instance-id'],
34
+ 'x-session-id': req.headers['x-session-id'],
35
+ };
36
+ }
37
+ function logSecurityEvent(event, details) {
38
+ const timestamp = new Date().toISOString();
39
+ const logEntry = {
40
+ timestamp,
41
+ event,
42
+ ...details
43
+ };
44
+ logger_1.logger.info(`[SECURITY] ${event}`, logEntry);
45
+ }
46
+ class SingleSessionHTTPServer {
47
+ constructor() {
48
+ this.transports = {};
49
+ this.servers = {};
50
+ this.sessionMetadata = {};
51
+ this.sessionContexts = {};
52
+ this.contextSwitchLocks = new Map();
53
+ this.session = null;
54
+ this.consoleManager = new console_manager_1.ConsoleManager();
55
+ this.sessionTimeout = 30 * 60 * 1000;
56
+ this.authToken = null;
57
+ this.cleanupTimer = null;
58
+ this.validateEnvironment();
59
+ this.startSessionCleanup();
60
+ }
61
+ startSessionCleanup() {
62
+ this.cleanupTimer = setInterval(async () => {
63
+ try {
64
+ await this.cleanupExpiredSessions();
65
+ }
66
+ catch (error) {
67
+ logger_1.logger.error('Error during session cleanup', error);
68
+ }
69
+ }, SESSION_CLEANUP_INTERVAL);
70
+ logger_1.logger.info('Session cleanup started', {
71
+ interval: SESSION_CLEANUP_INTERVAL / 1000 / 60,
72
+ maxSessions: MAX_SESSIONS,
73
+ sessionTimeout: this.sessionTimeout / 1000 / 60
74
+ });
75
+ }
76
+ cleanupExpiredSessions() {
77
+ const now = Date.now();
78
+ const expiredSessions = [];
79
+ for (const sessionId in this.sessionMetadata) {
80
+ const metadata = this.sessionMetadata[sessionId];
81
+ if (now - metadata.lastAccess.getTime() > this.sessionTimeout) {
82
+ expiredSessions.push(sessionId);
83
+ }
84
+ }
85
+ for (const sessionId in this.sessionContexts) {
86
+ if (!this.sessionMetadata[sessionId]) {
87
+ delete this.sessionContexts[sessionId];
88
+ logger_1.logger.debug('Cleaned orphaned session context', { sessionId });
89
+ }
90
+ }
91
+ for (const sessionId of expiredSessions) {
92
+ this.removeSession(sessionId, 'expired');
93
+ }
94
+ if (expiredSessions.length > 0) {
95
+ logger_1.logger.info('Cleaned up expired sessions', {
96
+ removed: expiredSessions.length,
97
+ remaining: this.getActiveSessionCount()
98
+ });
99
+ }
100
+ }
101
+ async removeSession(sessionId, reason) {
102
+ try {
103
+ const transport = this.transports[sessionId];
104
+ const server = this.servers[sessionId];
105
+ delete this.transports[sessionId];
106
+ delete this.servers[sessionId];
107
+ delete this.sessionMetadata[sessionId];
108
+ delete this.sessionContexts[sessionId];
109
+ if (server && typeof server.close === 'function') {
110
+ try {
111
+ await server.close();
112
+ }
113
+ catch (serverError) {
114
+ logger_1.logger.warn('Error closing server', { sessionId, error: serverError });
115
+ }
116
+ }
117
+ if (transport) {
118
+ await transport.close();
119
+ }
120
+ logger_1.logger.info('Session removed', { sessionId, reason });
121
+ }
122
+ catch (error) {
123
+ logger_1.logger.warn('Error removing session', { sessionId, reason, error });
124
+ }
125
+ }
126
+ getActiveSessionCount() {
127
+ return Object.keys(this.transports).length;
128
+ }
129
+ canCreateSession() {
130
+ return this.getActiveSessionCount() < MAX_SESSIONS;
131
+ }
132
+ isValidSessionId(sessionId) {
133
+ return Boolean(sessionId && sessionId.length > 0);
134
+ }
135
+ sanitizeErrorForClient(error) {
136
+ const isProduction = process.env.NODE_ENV === 'production';
137
+ if (error instanceof Error) {
138
+ if (isProduction) {
139
+ if (error.message.includes('Unauthorized') || error.message.includes('authentication')) {
140
+ return { message: 'Authentication failed', code: 'AUTH_ERROR' };
141
+ }
142
+ if (error.message.includes('Session') || error.message.includes('session')) {
143
+ return { message: 'Session error', code: 'SESSION_ERROR' };
144
+ }
145
+ if (error.message.includes('Invalid') || error.message.includes('validation')) {
146
+ return { message: 'Validation error', code: 'VALIDATION_ERROR' };
147
+ }
148
+ return { message: 'Internal server error', code: 'INTERNAL_ERROR' };
149
+ }
150
+ return {
151
+ message: error.message.substring(0, 200),
152
+ code: error.name || 'ERROR'
153
+ };
154
+ }
155
+ return { message: 'An error occurred', code: 'UNKNOWN_ERROR' };
156
+ }
157
+ updateSessionAccess(sessionId) {
158
+ if (this.sessionMetadata[sessionId]) {
159
+ this.sessionMetadata[sessionId].lastAccess = new Date();
160
+ }
161
+ }
162
+ async switchSessionContext(sessionId, newContext) {
163
+ const existingLock = this.contextSwitchLocks.get(sessionId);
164
+ if (existingLock) {
165
+ await existingLock;
166
+ return;
167
+ }
168
+ const switchPromise = this.performContextSwitch(sessionId, newContext);
169
+ this.contextSwitchLocks.set(sessionId, switchPromise);
170
+ try {
171
+ await switchPromise;
172
+ }
173
+ finally {
174
+ this.contextSwitchLocks.delete(sessionId);
175
+ }
176
+ }
177
+ async performContextSwitch(sessionId, newContext) {
178
+ const existingContext = this.sessionContexts[sessionId];
179
+ if (JSON.stringify(existingContext) !== JSON.stringify(newContext)) {
180
+ logger_1.logger.info('Multi-tenant shared mode: Updating instance context for session', {
181
+ sessionId,
182
+ oldInstanceId: existingContext?.instanceId,
183
+ newInstanceId: newContext.instanceId
184
+ });
185
+ this.sessionContexts[sessionId] = newContext;
186
+ if (this.servers[sessionId]) {
187
+ this.servers[sessionId].instanceContext = newContext;
188
+ }
189
+ }
190
+ }
191
+ getSessionMetrics() {
192
+ const now = Date.now();
193
+ let expiredCount = 0;
194
+ for (const sessionId in this.sessionMetadata) {
195
+ const metadata = this.sessionMetadata[sessionId];
196
+ if (now - metadata.lastAccess.getTime() > this.sessionTimeout) {
197
+ expiredCount++;
198
+ }
199
+ }
200
+ return {
201
+ totalSessions: Object.keys(this.sessionMetadata).length,
202
+ activeSessions: this.getActiveSessionCount(),
203
+ expiredSessions: expiredCount,
204
+ lastCleanup: new Date()
205
+ };
206
+ }
207
+ loadAuthToken() {
208
+ if (process.env.AUTH_TOKEN) {
209
+ logger_1.logger.info('Using AUTH_TOKEN from environment variable');
210
+ return process.env.AUTH_TOKEN;
211
+ }
212
+ if (process.env.AUTH_TOKEN_FILE) {
213
+ try {
214
+ const token = (0, fs_1.readFileSync)(process.env.AUTH_TOKEN_FILE, 'utf-8').trim();
215
+ logger_1.logger.info(`Loaded AUTH_TOKEN from file: ${process.env.AUTH_TOKEN_FILE}`);
216
+ return token;
217
+ }
218
+ catch (error) {
219
+ logger_1.logger.error(`Failed to read AUTH_TOKEN_FILE: ${process.env.AUTH_TOKEN_FILE}`, error);
220
+ console.error(`ERROR: Failed to read AUTH_TOKEN_FILE: ${process.env.AUTH_TOKEN_FILE}`);
221
+ console.error(error instanceof Error ? error.message : 'Unknown error');
222
+ return null;
223
+ }
224
+ }
225
+ return null;
226
+ }
227
+ validateEnvironment() {
228
+ this.authToken = this.loadAuthToken();
229
+ if (!this.authToken || this.authToken.trim() === '') {
230
+ const message = 'No authentication token found or token is empty. Set AUTH_TOKEN environment variable or AUTH_TOKEN_FILE pointing to a file containing the token.';
231
+ logger_1.logger.error(message);
232
+ throw new Error(message);
233
+ }
234
+ this.authToken = this.authToken.trim();
235
+ if (this.authToken.length < 32) {
236
+ logger_1.logger.warn('AUTH_TOKEN should be at least 32 characters for security');
237
+ }
238
+ const isDefaultToken = this.authToken === 'REPLACE_THIS_AUTH_TOKEN_32_CHARS_MIN_abcdefgh';
239
+ const isProduction = process.env.NODE_ENV === 'production';
240
+ if (isDefaultToken) {
241
+ if (isProduction) {
242
+ const message = 'CRITICAL SECURITY ERROR: Cannot start in production with default AUTH_TOKEN. Generate secure token: openssl rand -base64 32';
243
+ logger_1.logger.error(message);
244
+ console.error('\n🚨 CRITICAL SECURITY ERROR 🚨');
245
+ console.error(message);
246
+ console.error('Set NODE_ENV to development for testing, or update AUTH_TOKEN for production\n');
247
+ throw new Error(message);
248
+ }
249
+ logger_1.logger.warn('⚠️ SECURITY WARNING: Using default AUTH_TOKEN - CHANGE IMMEDIATELY!');
250
+ logger_1.logger.warn('Generate secure token with: openssl rand -base64 32');
251
+ if (process.env.MCP_MODE === 'http') {
252
+ console.warn('\n⚠️ SECURITY WARNING ⚠️');
253
+ console.warn('Using default AUTH_TOKEN - CHANGE IMMEDIATELY!');
254
+ console.warn('Generate secure token: openssl rand -base64 32');
255
+ console.warn('Update via Railway dashboard environment variables\n');
256
+ }
257
+ }
258
+ }
259
+ async handleRequest(req, res, instanceContext) {
260
+ const startTime = Date.now();
261
+ return this.consoleManager.wrapOperation(async () => {
262
+ try {
263
+ const sessionId = req.headers['mcp-session-id'];
264
+ const isInitialize = req.body ? (0, types_js_1.isInitializeRequest)(req.body) : false;
265
+ logger_1.logger.info('handleRequest: Processing MCP request - SDK PATTERN', {
266
+ requestId: req.get('x-request-id') || 'unknown',
267
+ sessionId: sessionId,
268
+ method: req.method,
269
+ url: req.url,
270
+ bodyType: typeof req.body,
271
+ bodyContent: req.body ? JSON.stringify(req.body, null, 2) : 'undefined',
272
+ existingTransports: Object.keys(this.transports),
273
+ isInitializeRequest: isInitialize
274
+ });
275
+ let transport;
276
+ if (isInitialize) {
277
+ if (!this.canCreateSession()) {
278
+ logger_1.logger.warn('handleRequest: Session limit reached', {
279
+ currentSessions: this.getActiveSessionCount(),
280
+ maxSessions: MAX_SESSIONS
281
+ });
282
+ res.status(429).json({
283
+ jsonrpc: '2.0',
284
+ error: {
285
+ code: -32000,
286
+ message: `Session limit reached (${MAX_SESSIONS}). Please wait for existing sessions to expire.`
287
+ },
288
+ id: req.body?.id || null
289
+ });
290
+ return;
291
+ }
292
+ logger_1.logger.info('handleRequest: Creating new transport for initialize request');
293
+ let sessionIdToUse;
294
+ const isMultiTenantEnabled = process.env.ENABLE_MULTI_TENANT === 'true';
295
+ const sessionStrategy = process.env.MULTI_TENANT_SESSION_STRATEGY || 'instance';
296
+ if (isMultiTenantEnabled && sessionStrategy === 'instance' && instanceContext?.instanceId) {
297
+ const configHash = (0, crypto_1.createHash)('sha256')
298
+ .update(JSON.stringify({
299
+ url: instanceContext.n8nApiUrl,
300
+ instanceId: instanceContext.instanceId
301
+ }))
302
+ .digest('hex')
303
+ .substring(0, 8);
304
+ sessionIdToUse = `instance-${instanceContext.instanceId}-${configHash}-${(0, uuid_1.v4)()}`;
305
+ logger_1.logger.info('Multi-tenant mode: Creating instance-specific session', {
306
+ instanceId: instanceContext.instanceId,
307
+ configHash,
308
+ sessionId: sessionIdToUse
309
+ });
310
+ }
311
+ else {
312
+ sessionIdToUse = sessionId || (0, uuid_1.v4)();
313
+ }
314
+ const server = new server_1.N8NDocumentationMCPServer(instanceContext);
315
+ transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
316
+ sessionIdGenerator: () => sessionIdToUse,
317
+ onsessioninitialized: (initializedSessionId) => {
318
+ logger_1.logger.info('handleRequest: Session initialized, storing transport and server', {
319
+ sessionId: initializedSessionId
320
+ });
321
+ this.transports[initializedSessionId] = transport;
322
+ this.servers[initializedSessionId] = server;
323
+ this.sessionMetadata[initializedSessionId] = {
324
+ lastAccess: new Date(),
325
+ createdAt: new Date()
326
+ };
327
+ this.sessionContexts[initializedSessionId] = instanceContext;
328
+ }
329
+ });
330
+ transport.onclose = () => {
331
+ const sid = transport.sessionId;
332
+ if (sid) {
333
+ logger_1.logger.info('handleRequest: Transport closed, cleaning up', { sessionId: sid });
334
+ this.removeSession(sid, 'transport_closed');
335
+ }
336
+ };
337
+ transport.onerror = (error) => {
338
+ const sid = transport.sessionId;
339
+ logger_1.logger.error('Transport error', { sessionId: sid, error: error.message });
340
+ if (sid) {
341
+ this.removeSession(sid, 'transport_error').catch(err => {
342
+ logger_1.logger.error('Error during transport error cleanup', { error: err });
343
+ });
344
+ }
345
+ };
346
+ logger_1.logger.info('handleRequest: Connecting server to new transport');
347
+ await server.connect(transport);
348
+ }
349
+ else if (sessionId && this.transports[sessionId]) {
350
+ if (!this.isValidSessionId(sessionId)) {
351
+ logger_1.logger.warn('handleRequest: Invalid session ID format', { sessionId });
352
+ res.status(400).json({
353
+ jsonrpc: '2.0',
354
+ error: {
355
+ code: -32602,
356
+ message: 'Invalid session ID format'
357
+ },
358
+ id: req.body?.id || null
359
+ });
360
+ return;
361
+ }
362
+ logger_1.logger.info('handleRequest: Reusing existing transport for session', { sessionId });
363
+ transport = this.transports[sessionId];
364
+ const isMultiTenantEnabled = process.env.ENABLE_MULTI_TENANT === 'true';
365
+ const sessionStrategy = process.env.MULTI_TENANT_SESSION_STRATEGY || 'instance';
366
+ if (isMultiTenantEnabled && sessionStrategy === 'shared' && instanceContext) {
367
+ await this.switchSessionContext(sessionId, instanceContext);
368
+ }
369
+ this.updateSessionAccess(sessionId);
370
+ }
371
+ else {
372
+ const errorDetails = {
373
+ hasSessionId: !!sessionId,
374
+ isInitialize: isInitialize,
375
+ sessionIdValid: sessionId ? this.isValidSessionId(sessionId) : false,
376
+ sessionExists: sessionId ? !!this.transports[sessionId] : false
377
+ };
378
+ logger_1.logger.warn('handleRequest: Invalid request - no session ID and not initialize', errorDetails);
379
+ let errorMessage = 'Bad Request: No valid session ID provided and not an initialize request';
380
+ if (sessionId && !this.isValidSessionId(sessionId)) {
381
+ errorMessage = 'Bad Request: Invalid session ID format';
382
+ }
383
+ else if (sessionId && !this.transports[sessionId]) {
384
+ errorMessage = 'Bad Request: Session not found or expired';
385
+ }
386
+ res.status(400).json({
387
+ jsonrpc: '2.0',
388
+ error: {
389
+ code: -32000,
390
+ message: errorMessage
391
+ },
392
+ id: req.body?.id || null
393
+ });
394
+ return;
395
+ }
396
+ logger_1.logger.info('handleRequest: Handling request with transport', {
397
+ sessionId: isInitialize ? 'new' : sessionId,
398
+ isInitialize
399
+ });
400
+ await transport.handleRequest(req, res, req.body);
401
+ const duration = Date.now() - startTime;
402
+ logger_1.logger.info('MCP request completed', { duration, sessionId: transport.sessionId });
403
+ }
404
+ catch (error) {
405
+ logger_1.logger.error('handleRequest: MCP request error:', {
406
+ error: error instanceof Error ? error.message : error,
407
+ errorName: error instanceof Error ? error.name : 'Unknown',
408
+ stack: error instanceof Error ? error.stack : undefined,
409
+ activeTransports: Object.keys(this.transports),
410
+ requestDetails: {
411
+ method: req.method,
412
+ url: req.url,
413
+ hasBody: !!req.body,
414
+ sessionId: req.headers['mcp-session-id']
415
+ },
416
+ duration: Date.now() - startTime
417
+ });
418
+ if (!res.headersSent) {
419
+ const sanitizedError = this.sanitizeErrorForClient(error);
420
+ res.status(500).json({
421
+ jsonrpc: '2.0',
422
+ error: {
423
+ code: -32603,
424
+ message: sanitizedError.message,
425
+ data: {
426
+ code: sanitizedError.code
427
+ }
428
+ },
429
+ id: req.body?.id || null
430
+ });
431
+ }
432
+ }
433
+ });
434
+ }
435
+ async resetSessionSSE(res) {
436
+ if (this.session) {
437
+ try {
438
+ logger_1.logger.info('Closing previous session for SSE', { sessionId: this.session.sessionId });
439
+ await this.session.transport.close();
440
+ }
441
+ catch (error) {
442
+ logger_1.logger.warn('Error closing previous session:', error);
443
+ }
444
+ }
445
+ try {
446
+ logger_1.logger.info('Creating new N8NDocumentationMCPServer for SSE...');
447
+ const server = new server_1.N8NDocumentationMCPServer();
448
+ const sessionId = (0, uuid_1.v4)();
449
+ logger_1.logger.info('Creating SSEServerTransport...');
450
+ const transport = new sse_js_1.SSEServerTransport('/mcp', res);
451
+ logger_1.logger.info('Connecting server to SSE transport...');
452
+ await server.connect(transport);
453
+ this.session = {
454
+ server,
455
+ transport,
456
+ lastAccess: new Date(),
457
+ sessionId,
458
+ initialized: false,
459
+ isSSE: true
460
+ };
461
+ logger_1.logger.info('Created new SSE session successfully', { sessionId: this.session.sessionId });
462
+ }
463
+ catch (error) {
464
+ logger_1.logger.error('Failed to create SSE session:', error);
465
+ throw error;
466
+ }
467
+ }
468
+ isExpired() {
469
+ if (!this.session)
470
+ return true;
471
+ return Date.now() - this.session.lastAccess.getTime() > this.sessionTimeout;
472
+ }
473
+ isSessionExpired(sessionId) {
474
+ const metadata = this.sessionMetadata[sessionId];
475
+ if (!metadata)
476
+ return true;
477
+ return Date.now() - metadata.lastAccess.getTime() > this.sessionTimeout;
478
+ }
479
+ async start() {
480
+ const app = (0, express_1.default)();
481
+ const jsonParser = express_1.default.json({ limit: '10mb' });
482
+ const trustProxy = process.env.TRUST_PROXY ? Number(process.env.TRUST_PROXY) : 0;
483
+ if (trustProxy > 0) {
484
+ app.set('trust proxy', trustProxy);
485
+ logger_1.logger.info(`Trust proxy enabled with ${trustProxy} hop(s)`);
486
+ }
487
+ app.use((req, res, next) => {
488
+ res.setHeader('X-Content-Type-Options', 'nosniff');
489
+ res.setHeader('X-Frame-Options', 'DENY');
490
+ res.setHeader('X-XSS-Protection', '1; mode=block');
491
+ res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
492
+ next();
493
+ });
494
+ app.use((req, res, next) => {
495
+ const allowedOrigin = process.env.CORS_ORIGIN || '*';
496
+ res.setHeader('Access-Control-Allow-Origin', allowedOrigin);
497
+ res.setHeader('Access-Control-Allow-Methods', 'POST, GET, DELETE, OPTIONS');
498
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept, Mcp-Session-Id');
499
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
500
+ res.setHeader('Access-Control-Max-Age', '86400');
501
+ if (req.method === 'OPTIONS') {
502
+ res.sendStatus(204);
503
+ return;
504
+ }
505
+ next();
506
+ });
507
+ app.use((req, res, next) => {
508
+ logger_1.logger.info(`${req.method} ${req.path}`, {
509
+ ip: req.ip,
510
+ userAgent: req.get('user-agent'),
511
+ contentLength: req.get('content-length')
512
+ });
513
+ next();
514
+ });
515
+ app.get('/', (req, res) => {
516
+ const port = parseInt(process.env.PORT || '3000');
517
+ const host = process.env.HOST || '0.0.0.0';
518
+ const baseUrl = (0, url_detector_1.detectBaseUrl)(req, host, port);
519
+ const endpoints = (0, url_detector_1.formatEndpointUrls)(baseUrl);
520
+ res.json({
521
+ name: 'n8n Documentation MCP Server',
522
+ version: version_1.PROJECT_VERSION,
523
+ description: 'Model Context Protocol server providing comprehensive n8n node documentation and workflow management',
524
+ endpoints: {
525
+ health: {
526
+ url: endpoints.health,
527
+ method: 'GET',
528
+ description: 'Health check and status information'
529
+ },
530
+ mcp: {
531
+ url: endpoints.mcp,
532
+ method: 'GET/POST',
533
+ description: 'MCP endpoint - GET for info, POST for JSON-RPC'
534
+ }
535
+ },
536
+ authentication: {
537
+ type: 'Bearer Token',
538
+ header: 'Authorization: Bearer <token>',
539
+ required_for: ['POST /mcp']
540
+ },
541
+ documentation: 'https://github.com/tungkl197/n8n-atom-mcp'
542
+ });
543
+ });
544
+ app.get('/health', (req, res) => {
545
+ const activeTransports = Object.keys(this.transports);
546
+ const activeServers = Object.keys(this.servers);
547
+ const sessionMetrics = this.getSessionMetrics();
548
+ const isProduction = process.env.NODE_ENV === 'production';
549
+ const isDefaultToken = this.authToken === 'REPLACE_THIS_AUTH_TOKEN_32_CHARS_MIN_abcdefgh';
550
+ res.json({
551
+ status: 'ok',
552
+ mode: 'sdk-pattern-transports',
553
+ version: version_1.PROJECT_VERSION,
554
+ environment: process.env.NODE_ENV || 'development',
555
+ uptime: Math.floor(process.uptime()),
556
+ sessions: {
557
+ active: sessionMetrics.activeSessions,
558
+ total: sessionMetrics.totalSessions,
559
+ expired: sessionMetrics.expiredSessions,
560
+ max: MAX_SESSIONS,
561
+ usage: `${sessionMetrics.activeSessions}/${MAX_SESSIONS}`,
562
+ sessionIds: activeTransports
563
+ },
564
+ security: {
565
+ production: isProduction,
566
+ defaultToken: isDefaultToken,
567
+ tokenLength: this.authToken?.length || 0
568
+ },
569
+ activeTransports: activeTransports.length,
570
+ activeServers: activeServers.length,
571
+ legacySessionActive: !!this.session,
572
+ memory: {
573
+ used: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),
574
+ total: Math.round(process.memoryUsage().heapTotal / 1024 / 1024),
575
+ unit: 'MB'
576
+ },
577
+ timestamp: new Date().toISOString()
578
+ });
579
+ });
580
+ app.post('/mcp/test', jsonParser, async (req, res) => {
581
+ logger_1.logger.info('TEST ENDPOINT: Manual test request received', {
582
+ method: req.method,
583
+ headers: req.headers,
584
+ body: req.body,
585
+ bodyType: typeof req.body,
586
+ bodyContent: req.body ? JSON.stringify(req.body, null, 2) : 'undefined'
587
+ });
588
+ const negotiationResult = (0, protocol_version_1.negotiateProtocolVersion)(undefined, undefined, req.get('user-agent'), req.headers);
589
+ (0, protocol_version_1.logProtocolNegotiation)(negotiationResult, logger_1.logger, 'TEST_ENDPOINT');
590
+ const testResponse = {
591
+ jsonrpc: '2.0',
592
+ id: req.body?.id || 1,
593
+ result: {
594
+ protocolVersion: negotiationResult.version,
595
+ capabilities: {
596
+ tools: {}
597
+ },
598
+ serverInfo: {
599
+ name: 'n8n-atom-mcp',
600
+ version: version_1.PROJECT_VERSION
601
+ }
602
+ }
603
+ };
604
+ logger_1.logger.info('TEST ENDPOINT: Sending test response', {
605
+ response: testResponse
606
+ });
607
+ res.json(testResponse);
608
+ });
609
+ app.get('/mcp', async (req, res) => {
610
+ const sessionId = req.headers['mcp-session-id'];
611
+ if (sessionId && this.transports[sessionId]) {
612
+ try {
613
+ await this.transports[sessionId].handleRequest(req, res, undefined);
614
+ return;
615
+ }
616
+ catch (error) {
617
+ logger_1.logger.error('StreamableHTTP GET request failed:', error);
618
+ }
619
+ }
620
+ const accept = req.headers.accept;
621
+ if (accept && accept.includes('text/event-stream')) {
622
+ logger_1.logger.info('SSE stream request received - establishing SSE connection');
623
+ try {
624
+ await this.resetSessionSSE(res);
625
+ logger_1.logger.info('SSE connection established successfully');
626
+ }
627
+ catch (error) {
628
+ logger_1.logger.error('Failed to establish SSE connection:', error);
629
+ res.status(500).json({
630
+ jsonrpc: '2.0',
631
+ error: {
632
+ code: -32603,
633
+ message: 'Failed to establish SSE connection'
634
+ },
635
+ id: null
636
+ });
637
+ }
638
+ return;
639
+ }
640
+ if (process.env.N8N_MODE === 'true') {
641
+ const negotiationResult = (0, protocol_version_1.negotiateProtocolVersion)(undefined, undefined, req.get('user-agent'), req.headers);
642
+ (0, protocol_version_1.logProtocolNegotiation)(negotiationResult, logger_1.logger, 'N8N_MODE_GET');
643
+ res.json({
644
+ protocolVersion: negotiationResult.version,
645
+ serverInfo: {
646
+ name: 'n8n-atom-mcp',
647
+ version: version_1.PROJECT_VERSION,
648
+ capabilities: {
649
+ tools: {}
650
+ }
651
+ }
652
+ });
653
+ return;
654
+ }
655
+ res.json({
656
+ description: 'n8n Documentation MCP Server',
657
+ version: version_1.PROJECT_VERSION,
658
+ endpoints: {
659
+ mcp: {
660
+ method: 'POST',
661
+ path: '/mcp',
662
+ description: 'Main MCP JSON-RPC endpoint',
663
+ authentication: 'Bearer token required'
664
+ },
665
+ health: {
666
+ method: 'GET',
667
+ path: '/health',
668
+ description: 'Health check endpoint',
669
+ authentication: 'None'
670
+ },
671
+ root: {
672
+ method: 'GET',
673
+ path: '/',
674
+ description: 'API information',
675
+ authentication: 'None'
676
+ }
677
+ },
678
+ documentation: 'https://github.com/tungkl197/n8n-atom-mcp'
679
+ });
680
+ });
681
+ app.delete('/mcp', async (req, res) => {
682
+ const mcpSessionId = req.headers['mcp-session-id'];
683
+ if (!mcpSessionId) {
684
+ res.status(400).json({
685
+ jsonrpc: '2.0',
686
+ error: {
687
+ code: -32602,
688
+ message: 'Mcp-Session-Id header is required'
689
+ },
690
+ id: null
691
+ });
692
+ return;
693
+ }
694
+ if (!this.isValidSessionId(mcpSessionId)) {
695
+ res.status(400).json({
696
+ jsonrpc: '2.0',
697
+ error: {
698
+ code: -32602,
699
+ message: 'Invalid session ID format'
700
+ },
701
+ id: null
702
+ });
703
+ return;
704
+ }
705
+ if (this.transports[mcpSessionId]) {
706
+ logger_1.logger.info('Terminating session via DELETE request', { sessionId: mcpSessionId });
707
+ try {
708
+ await this.removeSession(mcpSessionId, 'manual_termination');
709
+ res.status(204).send();
710
+ }
711
+ catch (error) {
712
+ logger_1.logger.error('Error terminating session:', error);
713
+ res.status(500).json({
714
+ jsonrpc: '2.0',
715
+ error: {
716
+ code: -32603,
717
+ message: 'Error terminating session'
718
+ },
719
+ id: null
720
+ });
721
+ }
722
+ }
723
+ else {
724
+ res.status(404).json({
725
+ jsonrpc: '2.0',
726
+ error: {
727
+ code: -32001,
728
+ message: 'Session not found'
729
+ },
730
+ id: null
731
+ });
732
+ }
733
+ });
734
+ const authLimiter = (0, express_rate_limit_1.default)({
735
+ windowMs: parseInt(process.env.AUTH_RATE_LIMIT_WINDOW || '900000'),
736
+ max: parseInt(process.env.AUTH_RATE_LIMIT_MAX || '20'),
737
+ message: {
738
+ jsonrpc: '2.0',
739
+ error: {
740
+ code: -32000,
741
+ message: 'Too many authentication attempts. Please try again later.'
742
+ },
743
+ id: null
744
+ },
745
+ standardHeaders: true,
746
+ legacyHeaders: false,
747
+ handler: (req, res) => {
748
+ logger_1.logger.warn('Rate limit exceeded', {
749
+ ip: req.ip,
750
+ userAgent: req.get('user-agent'),
751
+ event: 'rate_limit'
752
+ });
753
+ res.status(429).json({
754
+ jsonrpc: '2.0',
755
+ error: {
756
+ code: -32000,
757
+ message: 'Too many authentication attempts'
758
+ },
759
+ id: null
760
+ });
761
+ }
762
+ });
763
+ app.post('/mcp', authLimiter, jsonParser, async (req, res) => {
764
+ logger_1.logger.info('POST /mcp request received - DETAILED DEBUG', {
765
+ headers: req.headers,
766
+ readable: req.readable,
767
+ readableEnded: req.readableEnded,
768
+ complete: req.complete,
769
+ bodyType: typeof req.body,
770
+ bodyContent: req.body ? JSON.stringify(req.body, null, 2) : 'undefined',
771
+ contentLength: req.get('content-length'),
772
+ contentType: req.get('content-type'),
773
+ userAgent: req.get('user-agent'),
774
+ ip: req.ip,
775
+ method: req.method,
776
+ url: req.url,
777
+ originalUrl: req.originalUrl
778
+ });
779
+ const sessionId = req.headers['mcp-session-id'];
780
+ if (typeof req.on === 'function') {
781
+ const closeHandler = () => {
782
+ if (!res.headersSent && sessionId) {
783
+ logger_1.logger.info('Connection closed before response sent', { sessionId });
784
+ setImmediate(() => {
785
+ if (this.sessionMetadata[sessionId]) {
786
+ const metadata = this.sessionMetadata[sessionId];
787
+ const timeSinceAccess = Date.now() - metadata.lastAccess.getTime();
788
+ if (timeSinceAccess > 60000) {
789
+ this.removeSession(sessionId, 'connection_closed').catch(err => {
790
+ logger_1.logger.error('Error during connection close cleanup', { error: err });
791
+ });
792
+ }
793
+ }
794
+ });
795
+ }
796
+ };
797
+ req.on('close', closeHandler);
798
+ res.on('finish', () => {
799
+ req.removeListener('close', closeHandler);
800
+ });
801
+ }
802
+ const authHeader = req.headers.authorization;
803
+ if (!authHeader) {
804
+ logger_1.logger.warn('Authentication failed: Missing Authorization header', {
805
+ ip: req.ip,
806
+ userAgent: req.get('user-agent'),
807
+ reason: 'no_auth_header'
808
+ });
809
+ res.status(401).json({
810
+ jsonrpc: '2.0',
811
+ error: {
812
+ code: -32001,
813
+ message: 'Unauthorized'
814
+ },
815
+ id: null
816
+ });
817
+ return;
818
+ }
819
+ if (!authHeader.startsWith('Bearer ')) {
820
+ logger_1.logger.warn('Authentication failed: Invalid Authorization header format (expected Bearer token)', {
821
+ ip: req.ip,
822
+ userAgent: req.get('user-agent'),
823
+ reason: 'invalid_auth_format',
824
+ headerPrefix: authHeader.substring(0, Math.min(authHeader.length, 10)) + '...'
825
+ });
826
+ res.status(401).json({
827
+ jsonrpc: '2.0',
828
+ error: {
829
+ code: -32001,
830
+ message: 'Unauthorized'
831
+ },
832
+ id: null
833
+ });
834
+ return;
835
+ }
836
+ const token = authHeader.slice(7).trim();
837
+ const isValidToken = this.authToken &&
838
+ auth_1.AuthManager.timingSafeCompare(token, this.authToken);
839
+ if (!isValidToken) {
840
+ logger_1.logger.warn('Authentication failed: Invalid token', {
841
+ ip: req.ip,
842
+ userAgent: req.get('user-agent'),
843
+ reason: 'invalid_token'
844
+ });
845
+ res.status(401).json({
846
+ jsonrpc: '2.0',
847
+ error: {
848
+ code: -32001,
849
+ message: 'Unauthorized'
850
+ },
851
+ id: null
852
+ });
853
+ return;
854
+ }
855
+ logger_1.logger.info('Authentication successful - proceeding to handleRequest', {
856
+ hasSession: !!this.session,
857
+ sessionType: this.session?.isSSE ? 'SSE' : 'StreamableHTTP',
858
+ sessionInitialized: this.session?.initialized
859
+ });
860
+ const instanceContext = (() => {
861
+ const headers = extractMultiTenantHeaders(req);
862
+ const hasUrl = headers['x-n8n-url'];
863
+ const hasKey = headers['x-n8n-key'];
864
+ if (!hasUrl && !hasKey)
865
+ return undefined;
866
+ const context = {
867
+ n8nApiUrl: hasUrl || undefined,
868
+ n8nApiKey: hasKey || undefined,
869
+ instanceId: headers['x-instance-id'] || undefined,
870
+ sessionId: headers['x-session-id'] || undefined
871
+ };
872
+ if (req.headers['user-agent'] || req.ip) {
873
+ context.metadata = {
874
+ userAgent: req.headers['user-agent'],
875
+ ip: req.ip
876
+ };
877
+ }
878
+ const validation = (0, instance_context_1.validateInstanceContext)(context);
879
+ if (!validation.valid) {
880
+ logger_1.logger.warn('Invalid instance context from headers', {
881
+ errors: validation.errors,
882
+ hasUrl: !!hasUrl,
883
+ hasKey: !!hasKey
884
+ });
885
+ return undefined;
886
+ }
887
+ return context;
888
+ })();
889
+ if (instanceContext) {
890
+ logger_1.logger.debug('Instance context extracted from headers', {
891
+ hasUrl: !!instanceContext.n8nApiUrl,
892
+ hasKey: !!instanceContext.n8nApiKey,
893
+ instanceId: instanceContext.instanceId ? instanceContext.instanceId.substring(0, 8) + '...' : undefined,
894
+ sessionId: instanceContext.sessionId ? instanceContext.sessionId.substring(0, 8) + '...' : undefined,
895
+ urlDomain: instanceContext.n8nApiUrl ? new URL(instanceContext.n8nApiUrl).hostname : undefined
896
+ });
897
+ }
898
+ await this.handleRequest(req, res, instanceContext);
899
+ logger_1.logger.info('POST /mcp request completed - checking response status', {
900
+ responseHeadersSent: res.headersSent,
901
+ responseStatusCode: res.statusCode,
902
+ responseFinished: res.finished
903
+ });
904
+ });
905
+ app.use((req, res) => {
906
+ res.status(404).json({
907
+ error: 'Not found',
908
+ message: `Cannot ${req.method} ${req.path}`
909
+ });
910
+ });
911
+ app.use((err, req, res, next) => {
912
+ logger_1.logger.error('Express error handler:', err);
913
+ if (!res.headersSent) {
914
+ res.status(500).json({
915
+ jsonrpc: '2.0',
916
+ error: {
917
+ code: -32603,
918
+ message: 'Internal server error',
919
+ data: process.env.NODE_ENV === 'development' ? err.message : undefined
920
+ },
921
+ id: null
922
+ });
923
+ }
924
+ });
925
+ const port = parseInt(process.env.PORT || '3000');
926
+ const host = process.env.HOST || '0.0.0.0';
927
+ this.expressServer = app.listen(port, host, () => {
928
+ const isProduction = process.env.NODE_ENV === 'production';
929
+ const isDefaultToken = this.authToken === 'REPLACE_THIS_AUTH_TOKEN_32_CHARS_MIN_abcdefgh';
930
+ logger_1.logger.info(`n8n MCP Single-Session HTTP Server started`, {
931
+ port,
932
+ host,
933
+ environment: process.env.NODE_ENV || 'development',
934
+ maxSessions: MAX_SESSIONS,
935
+ sessionTimeout: this.sessionTimeout / 1000 / 60,
936
+ production: isProduction,
937
+ defaultToken: isDefaultToken
938
+ });
939
+ const baseUrl = (0, url_detector_1.getStartupBaseUrl)(host, port);
940
+ const endpoints = (0, url_detector_1.formatEndpointUrls)(baseUrl);
941
+ console.log(`n8n MCP Single-Session HTTP Server running on ${host}:${port}`);
942
+ console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
943
+ console.log(`Session Limits: ${MAX_SESSIONS} max sessions, ${this.sessionTimeout / 1000 / 60}min timeout`);
944
+ console.log(`Health check: ${endpoints.health}`);
945
+ console.log(`MCP endpoint: ${endpoints.mcp}`);
946
+ if (isProduction) {
947
+ console.log('🔒 Running in PRODUCTION mode - enhanced security enabled');
948
+ }
949
+ else {
950
+ console.log('🛠️ Running in DEVELOPMENT mode');
951
+ }
952
+ console.log('\nPress Ctrl+C to stop the server');
953
+ if (isDefaultToken && !isProduction) {
954
+ setInterval(() => {
955
+ logger_1.logger.warn('⚠️ Still using default AUTH_TOKEN - security risk!');
956
+ if (process.env.MCP_MODE === 'http') {
957
+ console.warn('⚠️ REMINDER: Still using default AUTH_TOKEN - please change it!');
958
+ }
959
+ }, 300000);
960
+ }
961
+ if (process.env.BASE_URL || process.env.PUBLIC_URL) {
962
+ console.log(`\nPublic URL configured: ${baseUrl}`);
963
+ }
964
+ else if (process.env.TRUST_PROXY && Number(process.env.TRUST_PROXY) > 0) {
965
+ console.log(`\nNote: TRUST_PROXY is enabled. URLs will be auto-detected from proxy headers.`);
966
+ }
967
+ });
968
+ this.expressServer.on('error', (error) => {
969
+ if (error.code === 'EADDRINUSE') {
970
+ logger_1.logger.error(`Port ${port} is already in use`);
971
+ console.error(`ERROR: Port ${port} is already in use`);
972
+ process.exit(1);
973
+ }
974
+ else {
975
+ logger_1.logger.error('Server error:', error);
976
+ console.error('Server error:', error);
977
+ process.exit(1);
978
+ }
979
+ });
980
+ }
981
+ async shutdown() {
982
+ logger_1.logger.info('Shutting down Single-Session HTTP server...');
983
+ if (this.cleanupTimer) {
984
+ clearInterval(this.cleanupTimer);
985
+ this.cleanupTimer = null;
986
+ logger_1.logger.info('Session cleanup timer stopped');
987
+ }
988
+ const sessionIds = Object.keys(this.transports);
989
+ logger_1.logger.info(`Closing ${sessionIds.length} active sessions`);
990
+ for (const sessionId of sessionIds) {
991
+ try {
992
+ logger_1.logger.info(`Closing transport for session ${sessionId}`);
993
+ await this.removeSession(sessionId, 'server_shutdown');
994
+ }
995
+ catch (error) {
996
+ logger_1.logger.warn(`Error closing transport for session ${sessionId}:`, error);
997
+ }
998
+ }
999
+ if (this.session) {
1000
+ try {
1001
+ await this.session.transport.close();
1002
+ logger_1.logger.info('Legacy session closed');
1003
+ }
1004
+ catch (error) {
1005
+ logger_1.logger.warn('Error closing legacy session:', error);
1006
+ }
1007
+ this.session = null;
1008
+ }
1009
+ if (this.expressServer) {
1010
+ await new Promise((resolve) => {
1011
+ this.expressServer.close(() => {
1012
+ logger_1.logger.info('HTTP server closed');
1013
+ resolve();
1014
+ });
1015
+ });
1016
+ }
1017
+ logger_1.logger.info('Single-Session HTTP server shutdown completed');
1018
+ }
1019
+ getSessionInfo() {
1020
+ const metrics = this.getSessionMetrics();
1021
+ if (!this.session) {
1022
+ return {
1023
+ active: false,
1024
+ sessions: {
1025
+ total: metrics.totalSessions,
1026
+ active: metrics.activeSessions,
1027
+ expired: metrics.expiredSessions,
1028
+ max: MAX_SESSIONS,
1029
+ sessionIds: Object.keys(this.transports)
1030
+ }
1031
+ };
1032
+ }
1033
+ return {
1034
+ active: true,
1035
+ sessionId: this.session.sessionId,
1036
+ age: Date.now() - this.session.lastAccess.getTime(),
1037
+ sessions: {
1038
+ total: metrics.totalSessions,
1039
+ active: metrics.activeSessions,
1040
+ expired: metrics.expiredSessions,
1041
+ max: MAX_SESSIONS,
1042
+ sessionIds: Object.keys(this.transports)
1043
+ }
1044
+ };
1045
+ }
1046
+ exportSessionState() {
1047
+ const sessions = [];
1048
+ const seenSessionIds = new Set();
1049
+ for (const sessionId of Object.keys(this.sessionMetadata)) {
1050
+ if (seenSessionIds.has(sessionId)) {
1051
+ logger_1.logger.warn(`Duplicate sessionId detected during export: ${sessionId}`);
1052
+ continue;
1053
+ }
1054
+ if (this.isSessionExpired(sessionId)) {
1055
+ continue;
1056
+ }
1057
+ const metadata = this.sessionMetadata[sessionId];
1058
+ const context = this.sessionContexts[sessionId];
1059
+ if (!context || !context.n8nApiUrl || !context.n8nApiKey) {
1060
+ logger_1.logger.debug(`Skipping session ${sessionId} - missing required context`);
1061
+ continue;
1062
+ }
1063
+ seenSessionIds.add(sessionId);
1064
+ sessions.push({
1065
+ sessionId,
1066
+ metadata: {
1067
+ createdAt: metadata.createdAt.toISOString(),
1068
+ lastAccess: metadata.lastAccess.toISOString()
1069
+ },
1070
+ context: {
1071
+ n8nApiUrl: context.n8nApiUrl,
1072
+ n8nApiKey: context.n8nApiKey,
1073
+ instanceId: context.instanceId || sessionId,
1074
+ sessionId: context.sessionId,
1075
+ metadata: context.metadata
1076
+ }
1077
+ });
1078
+ }
1079
+ logger_1.logger.info(`Exported ${sessions.length} session(s) for persistence`);
1080
+ logSecurityEvent('session_export', { count: sessions.length });
1081
+ return sessions;
1082
+ }
1083
+ restoreSessionState(sessions) {
1084
+ let restoredCount = 0;
1085
+ for (const sessionState of sessions) {
1086
+ try {
1087
+ if (!sessionState || typeof sessionState !== 'object' || !sessionState.sessionId) {
1088
+ logger_1.logger.warn('Skipping invalid session state object');
1089
+ continue;
1090
+ }
1091
+ if (Object.keys(this.sessionMetadata).length >= MAX_SESSIONS) {
1092
+ logger_1.logger.warn(`Reached MAX_SESSIONS limit (${MAX_SESSIONS}), skipping remaining sessions`);
1093
+ logSecurityEvent('max_sessions_reached', { count: MAX_SESSIONS });
1094
+ break;
1095
+ }
1096
+ if (this.sessionMetadata[sessionState.sessionId]) {
1097
+ logger_1.logger.debug(`Skipping session ${sessionState.sessionId} - already exists`);
1098
+ continue;
1099
+ }
1100
+ const createdAt = new Date(sessionState.metadata.createdAt);
1101
+ const lastAccess = new Date(sessionState.metadata.lastAccess);
1102
+ if (isNaN(createdAt.getTime()) || isNaN(lastAccess.getTime())) {
1103
+ logger_1.logger.warn(`Skipping session ${sessionState.sessionId} - invalid date format`);
1104
+ continue;
1105
+ }
1106
+ const age = Date.now() - lastAccess.getTime();
1107
+ if (age > this.sessionTimeout) {
1108
+ logger_1.logger.debug(`Skipping session ${sessionState.sessionId} - expired (age: ${Math.round(age / 1000)}s)`);
1109
+ continue;
1110
+ }
1111
+ if (!sessionState.context) {
1112
+ logger_1.logger.warn(`Skipping session ${sessionState.sessionId} - missing context`);
1113
+ continue;
1114
+ }
1115
+ const validation = (0, instance_context_1.validateInstanceContext)(sessionState.context);
1116
+ if (!validation.valid) {
1117
+ const reason = validation.errors?.join(', ') || 'invalid context';
1118
+ logger_1.logger.warn(`Skipping session ${sessionState.sessionId} - invalid context: ${reason}`);
1119
+ logSecurityEvent('session_restore_failed', {
1120
+ sessionId: sessionState.sessionId,
1121
+ reason
1122
+ });
1123
+ continue;
1124
+ }
1125
+ this.sessionMetadata[sessionState.sessionId] = {
1126
+ createdAt,
1127
+ lastAccess
1128
+ };
1129
+ this.sessionContexts[sessionState.sessionId] = {
1130
+ n8nApiUrl: sessionState.context.n8nApiUrl,
1131
+ n8nApiKey: sessionState.context.n8nApiKey,
1132
+ instanceId: sessionState.context.instanceId,
1133
+ sessionId: sessionState.context.sessionId,
1134
+ metadata: sessionState.context.metadata
1135
+ };
1136
+ logger_1.logger.debug(`Restored session ${sessionState.sessionId}`);
1137
+ logSecurityEvent('session_restore', {
1138
+ sessionId: sessionState.sessionId,
1139
+ instanceId: sessionState.context.instanceId
1140
+ });
1141
+ restoredCount++;
1142
+ }
1143
+ catch (error) {
1144
+ logger_1.logger.error(`Failed to restore session ${sessionState.sessionId}:`, error);
1145
+ logSecurityEvent('session_restore_failed', {
1146
+ sessionId: sessionState.sessionId,
1147
+ reason: error instanceof Error ? error.message : 'unknown error'
1148
+ });
1149
+ }
1150
+ }
1151
+ logger_1.logger.info(`Restored ${restoredCount}/${sessions.length} session(s) from persistence`);
1152
+ return restoredCount;
1153
+ }
1154
+ }
1155
+ exports.SingleSessionHTTPServer = SingleSessionHTTPServer;
1156
+ if (require.main === module) {
1157
+ const server = new SingleSessionHTTPServer();
1158
+ const shutdown = async () => {
1159
+ await server.shutdown();
1160
+ process.exit(0);
1161
+ };
1162
+ process.on('SIGTERM', shutdown);
1163
+ process.on('SIGINT', shutdown);
1164
+ process.on('uncaughtException', (error) => {
1165
+ logger_1.logger.error('Uncaught exception:', error);
1166
+ console.error('Uncaught exception:', error);
1167
+ shutdown();
1168
+ });
1169
+ process.on('unhandledRejection', (reason, promise) => {
1170
+ logger_1.logger.error('Unhandled rejection:', reason);
1171
+ console.error('Unhandled rejection at:', promise, 'reason:', reason);
1172
+ shutdown();
1173
+ });
1174
+ server.start().catch(error => {
1175
+ logger_1.logger.error('Failed to start Single-Session HTTP server:', error);
1176
+ console.error('Failed to start Single-Session HTTP server:', error);
1177
+ process.exit(1);
1178
+ });
1179
+ }
1180
+ //# sourceMappingURL=http-server-single-session.js.map