n8n 2.19.2 → 2.20.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 (306) hide show
  1. package/dist/build.tsbuildinfo +1 -1
  2. package/dist/chat/chat-execution-manager.js +7 -1
  3. package/dist/chat/chat-execution-manager.js.map +1 -1
  4. package/dist/collaboration/collaboration.service.d.ts +1 -0
  5. package/dist/collaboration/collaboration.service.js +31 -0
  6. package/dist/collaboration/collaboration.service.js.map +1 -1
  7. package/dist/commands/execute.d.ts +2 -2
  8. package/dist/commands/export/credentials.d.ts +2 -2
  9. package/dist/commands/export/credentials.js +1 -1
  10. package/dist/commands/export/credentials.js.map +1 -1
  11. package/dist/commands/export/workflow.d.ts +4 -4
  12. package/dist/commands/import/credentials.d.ts +12 -2
  13. package/dist/commands/import/credentials.js +89 -11
  14. package/dist/commands/import/credentials.js.map +1 -1
  15. package/dist/commands/import/workflow.d.ts +2 -2
  16. package/dist/commands/ttwf/generate.d.ts +3 -3
  17. package/dist/controllers/e2e.controller.js +1 -1
  18. package/dist/controllers/e2e.controller.js.map +1 -1
  19. package/dist/controllers/oauth/oauth2-credential.controller.d.ts +6 -4
  20. package/dist/controllers/oauth/oauth2-credential.controller.js +12 -5
  21. package/dist/controllers/oauth/oauth2-credential.controller.js.map +1 -1
  22. package/dist/credentials/credentials.controller.js +1 -1
  23. package/dist/credentials/credentials.controller.js.map +1 -1
  24. package/dist/credentials/credentials.service.d.ts +2 -2
  25. package/dist/credentials/credentials.service.ee.js +2 -2
  26. package/dist/credentials/credentials.service.ee.js.map +1 -1
  27. package/dist/credentials/credentials.service.js +13 -16
  28. package/dist/credentials/credentials.service.js.map +1 -1
  29. package/dist/credentials/dynamic-credentials-proxy.js +1 -1
  30. package/dist/credentials/dynamic-credentials-proxy.js.map +1 -1
  31. package/dist/credentials-helper.d.ts +1 -0
  32. package/dist/credentials-helper.js +12 -4
  33. package/dist/credentials-helper.js.map +1 -1
  34. package/dist/credentials-overwrites.js +2 -2
  35. package/dist/credentials-overwrites.js.map +1 -1
  36. package/dist/evaluation.ee/test-runner/evaluation-metrics.ee.d.ts +5 -0
  37. package/dist/evaluation.ee/test-runner/evaluation-metrics.ee.js +22 -12
  38. package/dist/evaluation.ee/test-runner/evaluation-metrics.ee.js.map +1 -1
  39. package/dist/evaluation.ee/test-runner/test-runner.service.ee.d.ts +4 -2
  40. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +152 -89
  41. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
  42. package/dist/evaluation.ee/test-runs.controller.ee.d.ts +8 -2
  43. package/dist/evaluation.ee/test-runs.controller.ee.js +31 -5
  44. package/dist/evaluation.ee/test-runs.controller.ee.js.map +1 -1
  45. package/dist/eventbus/event-message-classes/index.d.ts +3 -2
  46. package/dist/eventbus/event-message-classes/index.js +11 -1
  47. package/dist/eventbus/event-message-classes/index.js.map +1 -1
  48. package/dist/eventbus/message-event-bus/message-event-bus.d.ts +5 -2
  49. package/dist/eventbus/message-event-bus/message-event-bus.js +101 -73
  50. package/dist/eventbus/message-event-bus/message-event-bus.js.map +1 -1
  51. package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.d.ts +3 -0
  52. package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js +3 -1
  53. package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js.map +1 -1
  54. package/dist/eventbus/message-event-bus-writer/resolve-event-log-path.d.ts +12 -0
  55. package/dist/eventbus/message-event-bus-writer/resolve-event-log-path.js +34 -0
  56. package/dist/eventbus/message-event-bus-writer/resolve-event-log-path.js.map +1 -0
  57. package/dist/execution-lifecycle/execute-error-workflow.js +1 -1
  58. package/dist/execution-lifecycle/execute-error-workflow.js.map +1 -1
  59. package/dist/executions/execution-recovery.service.d.ts +1 -1
  60. package/dist/executions/execution-recovery.service.js +11 -6
  61. package/dist/executions/execution-recovery.service.js.map +1 -1
  62. package/dist/executions/execution.service.d.ts +7 -2
  63. package/dist/executions/execution.service.js +18 -1
  64. package/dist/executions/execution.service.js.map +1 -1
  65. package/dist/executions/executions.controller.d.ts +1 -3
  66. package/dist/executions/executions.controller.js +3 -17
  67. package/dist/executions/executions.controller.js.map +1 -1
  68. package/dist/instance-settings-loader/instance-settings-loader.service.d.ts +3 -1
  69. package/dist/instance-settings-loader/instance-settings-loader.service.js +6 -2
  70. package/dist/instance-settings-loader/instance-settings-loader.service.js.map +1 -1
  71. package/dist/instance-settings-loader/loaders/mcp-settings.loader.d.ts +10 -0
  72. package/dist/instance-settings-loader/loaders/mcp-settings.loader.js +42 -0
  73. package/dist/instance-settings-loader/loaders/mcp-settings.loader.js.map +1 -0
  74. package/dist/instance-settings-loader/loaders/sso.instance-settings-loader.js +9 -4
  75. package/dist/instance-settings-loader/loaders/sso.instance-settings-loader.js.map +1 -1
  76. package/dist/mfa/mfa.service.d.ts +2 -2
  77. package/dist/mfa/mfa.service.js +11 -10
  78. package/dist/mfa/mfa.service.js.map +1 -1
  79. package/dist/modules/chat-hub/chat-hub-extractor.js +1 -1
  80. package/dist/modules/chat-hub/chat-hub-extractor.js.map +1 -1
  81. package/dist/modules/chat-hub/chat-hub-workflow.service.d.ts +1 -1
  82. package/dist/modules/chat-hub/chat-hub-workflow.service.js +4 -4
  83. package/dist/modules/chat-hub/chat-hub-workflow.service.js.map +1 -1
  84. package/dist/modules/community-packages/community-node-types.service.js +3 -1
  85. package/dist/modules/community-packages/community-node-types.service.js.map +1 -1
  86. package/dist/modules/dynamic-credentials.ee/credential-resolvers/n8n-credential-resolver.js +2 -2
  87. package/dist/modules/dynamic-credentials.ee/credential-resolvers/n8n-credential-resolver.js.map +1 -1
  88. package/dist/modules/dynamic-credentials.ee/credential-resolvers/oauth-credential-resolver.js +2 -2
  89. package/dist/modules/dynamic-credentials.ee/credential-resolvers/oauth-credential-resolver.js.map +1 -1
  90. package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js +2 -2
  91. package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js.map +1 -1
  92. package/dist/modules/dynamic-credentials.ee/dynamic-credentials.controller.js +2 -2
  93. package/dist/modules/dynamic-credentials.ee/dynamic-credentials.controller.js.map +1 -1
  94. package/dist/modules/dynamic-credentials.ee/services/credential-check-proxy.service.js +1 -1
  95. package/dist/modules/dynamic-credentials.ee/services/credential-check-proxy.service.js.map +1 -1
  96. package/dist/modules/dynamic-credentials.ee/services/credential-resolver-workflow.service.js +1 -1
  97. package/dist/modules/dynamic-credentials.ee/services/credential-resolver-workflow.service.js.map +1 -1
  98. package/dist/modules/dynamic-credentials.ee/services/credential-resolver.service.js +14 -14
  99. package/dist/modules/dynamic-credentials.ee/services/credential-resolver.service.js.map +1 -1
  100. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential-storage.service.js +1 -1
  101. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential-storage.service.js.map +1 -1
  102. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential.service.js +4 -4
  103. package/dist/modules/dynamic-credentials.ee/services/dynamic-credential.service.js.map +1 -1
  104. package/dist/modules/encryption-key-manager/encryption-bootstrap.service.d.ts +6 -1
  105. package/dist/modules/encryption-key-manager/encryption-bootstrap.service.js +14 -2
  106. package/dist/modules/encryption-key-manager/encryption-bootstrap.service.js.map +1 -1
  107. package/dist/modules/encryption-key-manager/encryption-key.controller.js +1 -0
  108. package/dist/modules/encryption-key-manager/encryption-key.controller.js.map +1 -1
  109. package/dist/modules/encryption-key-manager/key-manager.service.d.ts +2 -1
  110. package/dist/modules/encryption-key-manager/key-manager.service.js +24 -5
  111. package/dist/modules/encryption-key-manager/key-manager.service.js.map +1 -1
  112. package/dist/modules/external-secrets.ee/constants.d.ts +1 -0
  113. package/dist/modules/external-secrets.ee/constants.js +2 -1
  114. package/dist/modules/external-secrets.ee/constants.js.map +1 -1
  115. package/dist/modules/external-secrets.ee/external-secrets-manager.ee.js +4 -4
  116. package/dist/modules/external-secrets.ee/external-secrets-manager.ee.js.map +1 -1
  117. package/dist/modules/external-secrets.ee/secrets-cache.service.d.ts +1 -0
  118. package/dist/modules/external-secrets.ee/secrets-cache.service.js +18 -1
  119. package/dist/modules/external-secrets.ee/secrets-cache.service.js.map +1 -1
  120. package/dist/modules/external-secrets.ee/secrets-providers-connections.controller.ee.js +3 -3
  121. package/dist/modules/external-secrets.ee/secrets-providers-connections.controller.ee.js.map +1 -1
  122. package/dist/modules/external-secrets.ee/secrets-providers-connections.service.ee.d.ts +1 -1
  123. package/dist/modules/external-secrets.ee/secrets-providers-connections.service.ee.js +15 -13
  124. package/dist/modules/external-secrets.ee/secrets-providers-connections.service.ee.js.map +1 -1
  125. package/dist/modules/external-secrets.ee/secrets-providers-project.controller.ee.js +3 -3
  126. package/dist/modules/external-secrets.ee/secrets-providers-project.controller.ee.js.map +1 -1
  127. package/dist/modules/external-secrets.ee/settings-store.service.js +6 -6
  128. package/dist/modules/external-secrets.ee/settings-store.service.js.map +1 -1
  129. package/dist/modules/insights/insights-collection.service.js +7 -1
  130. package/dist/modules/insights/insights-collection.service.js.map +1 -1
  131. package/dist/modules/insights/insights-pruning.service.d.ts +2 -4
  132. package/dist/modules/insights/insights-pruning.service.js +13 -10
  133. package/dist/modules/insights/insights-pruning.service.js.map +1 -1
  134. package/dist/modules/insights/insights.config.js +2 -1
  135. package/dist/modules/insights/insights.config.js.map +1 -1
  136. package/dist/modules/insights/insights.constants.d.ts +2 -0
  137. package/dist/modules/insights/insights.constants.js +3 -1
  138. package/dist/modules/insights/insights.constants.js.map +1 -1
  139. package/dist/modules/insights/insights.service.js +1 -3
  140. package/dist/modules/insights/insights.service.js.map +1 -1
  141. package/dist/modules/instance-ai/compaction.service.d.ts +7 -2
  142. package/dist/modules/instance-ai/compaction.service.js +17 -17
  143. package/dist/modules/instance-ai/compaction.service.js.map +1 -1
  144. package/dist/modules/instance-ai/instance-ai-settings.service.js +4 -4
  145. package/dist/modules/instance-ai/instance-ai-settings.service.js.map +1 -1
  146. package/dist/modules/instance-ai/instance-ai.adapter.service.d.ts +38 -1
  147. package/dist/modules/instance-ai/instance-ai.adapter.service.js +179 -60
  148. package/dist/modules/instance-ai/instance-ai.adapter.service.js.map +1 -1
  149. package/dist/modules/instance-ai/instance-ai.controller.d.ts +2 -2
  150. package/dist/modules/instance-ai/instance-ai.controller.js +7 -17
  151. package/dist/modules/instance-ai/instance-ai.controller.js.map +1 -1
  152. package/dist/modules/instance-ai/instance-ai.service.d.ts +15 -4
  153. package/dist/modules/instance-ai/instance-ai.service.js +489 -76
  154. package/dist/modules/instance-ai/instance-ai.service.js.map +1 -1
  155. package/dist/modules/instance-ai/storage/typeorm-memory-storage.js +11 -1
  156. package/dist/modules/instance-ai/storage/typeorm-memory-storage.js.map +1 -1
  157. package/dist/modules/instance-ai/web-research/fetch-and-extract.d.ts +3 -1
  158. package/dist/modules/instance-ai/web-research/fetch-and-extract.js +13 -11
  159. package/dist/modules/instance-ai/web-research/fetch-and-extract.js.map +1 -1
  160. package/dist/modules/instance-ai/web-research/index.d.ts +0 -1
  161. package/dist/modules/instance-ai/web-research/index.js +1 -3
  162. package/dist/modules/instance-ai/web-research/index.js.map +1 -1
  163. package/dist/modules/instance-registry/checks/check.service.d.ts +43 -0
  164. package/dist/modules/instance-registry/checks/check.service.js +248 -0
  165. package/dist/modules/instance-registry/checks/check.service.js.map +1 -0
  166. package/dist/modules/instance-registry/checks/hostid-clash.check.d.ts +8 -0
  167. package/dist/modules/instance-registry/checks/hostid-clash.check.js +68 -0
  168. package/dist/modules/instance-registry/checks/hostid-clash.check.js.map +1 -0
  169. package/dist/modules/instance-registry/checks/index.d.ts +4 -0
  170. package/dist/modules/instance-registry/checks/index.js +7 -0
  171. package/dist/modules/instance-registry/checks/index.js.map +1 -0
  172. package/dist/modules/instance-registry/checks/lifecycle.check.d.ts +8 -0
  173. package/dist/modules/instance-registry/checks/lifecycle.check.js +52 -0
  174. package/dist/modules/instance-registry/checks/lifecycle.check.js.map +1 -0
  175. package/dist/modules/instance-registry/checks/split-brain.check.d.ts +8 -0
  176. package/dist/modules/instance-registry/checks/split-brain.check.js +67 -0
  177. package/dist/modules/instance-registry/checks/split-brain.check.js.map +1 -0
  178. package/dist/modules/instance-registry/checks/version-mismatch.check.d.ts +8 -0
  179. package/dist/modules/instance-registry/checks/version-mismatch.check.js +55 -0
  180. package/dist/modules/instance-registry/checks/version-mismatch.check.js.map +1 -0
  181. package/dist/modules/instance-registry/instance-registry.controller.d.ts +3 -1
  182. package/dist/modules/instance-registry/instance-registry.controller.js +41 -5
  183. package/dist/modules/instance-registry/instance-registry.controller.js.map +1 -1
  184. package/dist/modules/instance-registry/instance-registry.module.js +3 -9
  185. package/dist/modules/instance-registry/instance-registry.module.js.map +1 -1
  186. package/dist/modules/ldap.ee/helpers.ee.js +1 -1
  187. package/dist/modules/ldap.ee/helpers.ee.js.map +1 -1
  188. package/dist/modules/ldap.ee/ldap.service.ee.js +2 -2
  189. package/dist/modules/ldap.ee/ldap.service.ee.js.map +1 -1
  190. package/dist/modules/mcp/dto/update-workflows-availability.dto.d.ts +15 -0
  191. package/dist/modules/mcp/dto/update-workflows-availability.dto.js +14 -0
  192. package/dist/modules/mcp/dto/update-workflows-availability.dto.js.map +1 -0
  193. package/dist/modules/mcp/mcp-oauth-service.d.ts +6 -0
  194. package/dist/modules/mcp/mcp-oauth-service.js +15 -3
  195. package/dist/modules/mcp/mcp-oauth-service.js.map +1 -1
  196. package/dist/modules/mcp/mcp-oauth-token.service.d.ts +1 -0
  197. package/dist/modules/mcp/mcp-oauth-token.service.js +3 -0
  198. package/dist/modules/mcp/mcp-oauth-token.service.js.map +1 -1
  199. package/dist/modules/mcp/mcp.controller.d.ts +2 -0
  200. package/dist/modules/mcp/mcp.controller.js +49 -11
  201. package/dist/modules/mcp/mcp.controller.js.map +1 -1
  202. package/dist/modules/mcp/mcp.errors.d.ts +6 -0
  203. package/dist/modules/mcp/mcp.errors.js +12 -1
  204. package/dist/modules/mcp/mcp.errors.js.map +1 -1
  205. package/dist/modules/mcp/mcp.module.d.ts +1 -0
  206. package/dist/modules/mcp/mcp.module.js +3 -1
  207. package/dist/modules/mcp/mcp.module.js.map +1 -1
  208. package/dist/modules/mcp/mcp.oauth-clients.controller.d.ts +2 -1
  209. package/dist/modules/mcp/mcp.oauth-clients.controller.js +10 -0
  210. package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -1
  211. package/dist/modules/mcp/mcp.oauth.controller.js +20 -1
  212. package/dist/modules/mcp/mcp.oauth.controller.js.map +1 -1
  213. package/dist/modules/mcp/mcp.service.js +3 -0
  214. package/dist/modules/mcp/mcp.service.js.map +1 -1
  215. package/dist/modules/mcp/mcp.settings.controller.d.ts +11 -12
  216. package/dist/modules/mcp/mcp.settings.controller.js +19 -50
  217. package/dist/modules/mcp/mcp.settings.controller.js.map +1 -1
  218. package/dist/modules/mcp/mcp.settings.service.d.ts +30 -2
  219. package/dist/modules/mcp/mcp.settings.service.js +165 -2
  220. package/dist/modules/mcp/mcp.settings.service.js.map +1 -1
  221. package/dist/modules/mcp/tools/search-executions.tool.d.ts +16 -0
  222. package/dist/modules/mcp/tools/search-executions.tool.js +140 -0
  223. package/dist/modules/mcp/tools/search-executions.tool.js.map +1 -0
  224. package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.d.ts +2 -2
  225. package/dist/modules/oauth-jwe/oauth-jwe-decrypt.service.d.ts +7 -0
  226. package/dist/modules/oauth-jwe/oauth-jwe-decrypt.service.js +48 -0
  227. package/dist/modules/oauth-jwe/oauth-jwe-decrypt.service.js.map +1 -0
  228. package/dist/modules/oauth-jwe/oauth-jwe-key.service.d.ts +31 -0
  229. package/dist/modules/oauth-jwe/oauth-jwe-key.service.js +174 -0
  230. package/dist/modules/oauth-jwe/oauth-jwe-key.service.js.map +1 -0
  231. package/dist/modules/oauth-jwe/oauth-jwe.config.d.ts +3 -0
  232. package/dist/modules/oauth-jwe/oauth-jwe.config.js +27 -0
  233. package/dist/modules/oauth-jwe/oauth-jwe.config.js.map +1 -0
  234. package/dist/modules/oauth-jwe/oauth-jwe.constants.d.ts +9 -0
  235. package/dist/modules/oauth-jwe/oauth-jwe.constants.js +15 -0
  236. package/dist/modules/oauth-jwe/oauth-jwe.constants.js.map +1 -0
  237. package/dist/modules/oauth-jwe/oauth-jwe.controller.d.ts +10 -0
  238. package/dist/modules/oauth-jwe/oauth-jwe.controller.js +60 -0
  239. package/dist/modules/oauth-jwe/oauth-jwe.controller.js.map +1 -0
  240. package/dist/modules/oauth-jwe/oauth-jwe.module.d.ts +8 -0
  241. package/dist/modules/oauth-jwe/oauth-jwe.module.js +70 -0
  242. package/dist/modules/oauth-jwe/oauth-jwe.module.js.map +1 -0
  243. package/dist/modules/oauth-jwe/oauth-jwe.schemas.d.ts +131 -0
  244. package/dist/modules/oauth-jwe/oauth-jwe.schemas.js +34 -0
  245. package/dist/modules/oauth-jwe/oauth-jwe.schemas.js.map +1 -0
  246. package/dist/modules/oauth-jwe/oauth-jwe.utils.d.ts +4 -0
  247. package/dist/modules/oauth-jwe/oauth-jwe.utils.js +27 -0
  248. package/dist/modules/oauth-jwe/oauth-jwe.utils.js.map +1 -0
  249. package/dist/modules/source-control.ee/source-control-export.service.ee.js +1 -1
  250. package/dist/modules/source-control.ee/source-control-export.service.ee.js.map +1 -1
  251. package/dist/modules/source-control.ee/source-control-import.service.ee.js +6 -6
  252. package/dist/modules/source-control.ee/source-control-import.service.ee.js.map +1 -1
  253. package/dist/modules/source-control.ee/source-control-preferences.service.ee.js +6 -6
  254. package/dist/modules/source-control.ee/source-control-preferences.service.ee.js.map +1 -1
  255. package/dist/modules/sso-oidc/oidc.service.ee.js +2 -2
  256. package/dist/modules/sso-oidc/oidc.service.ee.js.map +1 -1
  257. package/dist/modules/sso-saml/saml.service.ee.js +6 -6
  258. package/dist/modules/sso-saml/saml.service.ee.js.map +1 -1
  259. package/dist/oauth/oauth-jwe-service.proxy.d.ts +9 -0
  260. package/dist/oauth/oauth-jwe-service.proxy.js +27 -0
  261. package/dist/oauth/oauth-jwe-service.proxy.js.map +1 -0
  262. package/dist/oauth/oauth.service.d.ts +2 -2
  263. package/dist/oauth/oauth.service.js +13 -12
  264. package/dist/oauth/oauth.service.js.map +1 -1
  265. package/dist/posthog/index.d.ts +2 -0
  266. package/dist/posthog/index.js +16 -0
  267. package/dist/posthog/index.js.map +1 -1
  268. package/dist/public-api/v1/handlers/credentials/credentials.service.js +2 -2
  269. package/dist/public-api/v1/handlers/credentials/credentials.service.js.map +1 -1
  270. package/dist/services/dynamic-node-parameters.service.d.ts +1 -0
  271. package/dist/services/dynamic-node-parameters.service.js +29 -12
  272. package/dist/services/dynamic-node-parameters.service.js.map +1 -1
  273. package/dist/services/export.service.js +2 -2
  274. package/dist/services/export.service.js.map +1 -1
  275. package/dist/services/frontend.service.js +18 -0
  276. package/dist/services/frontend.service.js.map +1 -1
  277. package/dist/services/import.service.d.ts +5 -1
  278. package/dist/services/import.service.js +62 -5
  279. package/dist/services/import.service.js.map +1 -1
  280. package/dist/services/redis-client.service.d.ts +6 -5
  281. package/dist/services/redis-client.service.js +19 -12
  282. package/dist/services/redis-client.service.js.map +1 -1
  283. package/dist/services/user.service.js +0 -9
  284. package/dist/services/user.service.js.map +1 -1
  285. package/dist/task-runners/task-broker/auth/task-broker-auth.service.d.ts +4 -4
  286. package/dist/task-runners/task-broker/auth/task-broker-auth.service.js +9 -8
  287. package/dist/task-runners/task-broker/auth/task-broker-auth.service.js.map +1 -1
  288. package/dist/task-runners/task-broker/task-broker-server.js +1 -1
  289. package/dist/task-runners/task-broker/task-broker-server.js.map +1 -1
  290. package/dist/webhooks/test-webhooks.js +16 -2
  291. package/dist/webhooks/test-webhooks.js.map +1 -1
  292. package/dist/workflow-execute-additional-data.js +4 -2
  293. package/dist/workflow-execute-additional-data.js.map +1 -1
  294. package/dist/workflows/workflow-finder.service.d.ts +2 -0
  295. package/dist/workflows/workflow-finder.service.js +12 -1
  296. package/dist/workflows/workflow-finder.service.js.map +1 -1
  297. package/dist/workflows/workflows.controller.d.ts +7 -2
  298. package/dist/workflows/workflows.controller.js +43 -10
  299. package/dist/workflows/workflows.controller.js.map +1 -1
  300. package/package.json +30 -28
  301. package/dist/modules/instance-ai/web-research/ssrf-guard.d.ts +0 -1
  302. package/dist/modules/instance-ai/web-research/ssrf-guard.js +0 -85
  303. package/dist/modules/instance-ai/web-research/ssrf-guard.js.map +0 -1
  304. package/dist/modules/mcp/dto/update-workflow-availability.dto.d.ts +0 -9
  305. package/dist/modules/mcp/dto/update-workflow-availability.dto.js +0 -11
  306. package/dist/modules/mcp/dto/update-workflow-availability.dto.js.map +0 -1
@@ -46,8 +46,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.InstanceAiAdapterService = void 0;
49
+ exports.resolveDataTableByIdOrName = resolveDataTableByIdOrName;
49
50
  exports.truncateResultData = truncateResultData;
50
51
  exports.extractExecutionResult = extractExecutionResult;
52
+ exports.formatExecutionError = formatExecutionError;
51
53
  exports.truncateNodeOutput = truncateNodeOutput;
52
54
  exports.extractNodeOutput = extractNodeOutput;
53
55
  exports.extractExecutionDebugInfo = extractExecutionDebugInfo;
@@ -74,6 +76,7 @@ const event_service_1 = require("../../events/event.service");
74
76
  const execution_persistence_1 = require("../../executions/execution-persistence");
75
77
  const license_1 = require("../../license");
76
78
  const load_nodes_and_credentials_1 = require("../../load-nodes-and-credentials");
79
+ const node_types_1 = require("../../node-types");
77
80
  const data_table_repository_1 = require("../../modules/data-table/data-table.repository");
78
81
  const data_table_service_1 = require("../../modules/data-table/data-table.service");
79
82
  const source_control_preferences_service_ee_1 = require("../../modules/source-control.ee/source-control-preferences.service.ee");
@@ -82,6 +85,7 @@ const dynamic_node_parameters_service_1 = require("../../services/dynamic-node-p
82
85
  const folder_service_1 = require("../../services/folder.service");
83
86
  const project_service_ee_1 = require("../../services/project.service.ee");
84
87
  const role_service_1 = require("../../services/role.service");
88
+ const ssrf_protection_service_1 = require("../../services/ssrf/ssrf-protection.service");
85
89
  const tag_service_1 = require("../../services/tag.service");
86
90
  const workflow_finder_service_1 = require("../../workflows/workflow-finder.service");
87
91
  const workflow_history_service_1 = require("../../workflows/workflow-history/workflow-history.service");
@@ -103,7 +107,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
103
107
  });
104
108
  return await promise;
105
109
  }
106
- constructor(logger, globalConfig, workflowService, workflowFinderService, workflowRepository, sharedWorkflowRepository, projectRepository, executionRepository, credentialsService, credentialsFinderService, activeExecutions, workflowRunner, loadNodesAndCredentials, instanceSettings, dataTableService, dataTableRepository, dynamicNodeParametersService, folderService, projectService, tagService, sourceControlPreferencesService, settingsService, workflowHistoryService, enterpriseWorkflowService, license, executionPersistence, eventService, roleService, telemetry, aiBuilderTemporaryWorkflowRepository) {
110
+ constructor(logger, globalConfig, workflowService, workflowFinderService, workflowRepository, sharedWorkflowRepository, projectRepository, executionRepository, credentialsService, credentialsFinderService, activeExecutions, workflowRunner, loadNodesAndCredentials, nodeTypes, instanceSettings, dataTableService, dataTableRepository, dynamicNodeParametersService, folderService, projectService, tagService, sourceControlPreferencesService, settingsService, workflowHistoryService, enterpriseWorkflowService, license, executionPersistence, eventService, roleService, telemetry, aiBuilderTemporaryWorkflowRepository, ssrfProtectionService) {
107
111
  this.workflowService = workflowService;
108
112
  this.workflowFinderService = workflowFinderService;
109
113
  this.workflowRepository = workflowRepository;
@@ -115,6 +119,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
115
119
  this.activeExecutions = activeExecutions;
116
120
  this.workflowRunner = workflowRunner;
117
121
  this.loadNodesAndCredentials = loadNodesAndCredentials;
122
+ this.nodeTypes = nodeTypes;
118
123
  this.instanceSettings = instanceSettings;
119
124
  this.dataTableService = dataTableService;
120
125
  this.dataTableRepository = dataTableRepository;
@@ -132,6 +137,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
132
137
  this.roleService = roleService;
133
138
  this.telemetry = telemetry;
134
139
  this.aiBuilderTemporaryWorkflowRepository = aiBuilderTemporaryWorkflowRepository;
140
+ this.ssrfProtectionService = ssrfProtectionService;
135
141
  this.nodesCache = null;
136
142
  this.NODES_CACHE_TTL_MS = 5 * 60 * 1000;
137
143
  this.webResearchCache = new web_research_1.LRUCache({
@@ -158,6 +164,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
158
164
  workspaceService: this.createWorkspaceAdapter(user),
159
165
  licenseHints: this.buildLicenseHints(),
160
166
  logger: this.logger,
167
+ nodeTypesProvider: this.nodeTypes,
161
168
  };
162
169
  }
163
170
  buildLicenseHints() {
@@ -516,7 +523,15 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
516
523
  executionMode: triggerNode
517
524
  ? getExecutionModeForTrigger(triggerNode)
518
525
  : 'manual',
519
- workflowData: workflow,
526
+ workflowData: {
527
+ ...workflow,
528
+ settings: {
529
+ ...workflow.settings,
530
+ saveManualExecutions: true,
531
+ saveDataSuccessExecution: 'all',
532
+ saveDataErrorExecution: 'all',
533
+ },
534
+ },
520
535
  userId: user.id,
521
536
  pushRef,
522
537
  };
@@ -689,7 +704,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
689
704
  id: credential.id,
690
705
  name: credential.name,
691
706
  type: credential.type,
692
- data: credentialsService.decrypt(credential, true),
707
+ data: await credentialsService.decrypt(credential, true),
693
708
  };
694
709
  const result = await credentialsService.test(user.id, credentialsToTest);
695
710
  return {
@@ -826,7 +841,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
826
841
  return id.slice(0, 2) + '***' + id.slice(-1);
827
842
  };
828
843
  try {
829
- const redacted = credentialsService.decrypt(credential, false);
844
+ const redacted = await credentialsService.decrypt(credential, false);
830
845
  if (typeof redacted.accountIdentifier === 'string' && redacted.accountIdentifier) {
831
846
  return { accountIdentifier: mask(redacted.accountIdentifier) };
832
847
  }
@@ -836,7 +851,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
836
851
  return { accountIdentifier: mask(value) };
837
852
  }
838
853
  }
839
- const raw = credentialsService.decrypt(credential, true);
854
+ const raw = await credentialsService.decrypt(credential, true);
840
855
  const tokenData = raw.oauthTokenData;
841
856
  if (tokenData && typeof tokenData === 'object') {
842
857
  const { OauthService } = await Promise.resolve().then(() => __importStar(require('../../oauth/oauth.service')));
@@ -857,21 +872,33 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
857
872
  const { dataTableService, dataTableRepository } = this;
858
873
  const assertNotReadOnly = () => this.assertInstanceNotReadOnly('data tables');
859
874
  const { resolveProjectId } = this.createProjectScopeHelpers(user);
860
- const resolveProjectIdForTable = async (scopes, dataTableId) => {
861
- const allowed = await (0, check_access_1.userHasScopes)(user, scopes, false, { dataTableId });
862
- if (!allowed) {
875
+ const logger = this.logger;
876
+ const resolveAccessibleTable = async (scopes, dataTableId, disambiguator) => {
877
+ const projectIdFilter = disambiguator?.projectId;
878
+ const result = await resolveDataTableByIdOrName(dataTableRepository, logger, dataTableId, {
879
+ projectIdFilter,
880
+ accessFilter: async (id) => await (0, check_access_1.userHasScopes)(user, scopes, false, { dataTableId: id }),
881
+ });
882
+ if (result.kind === 'miss') {
863
883
  throw new Error(`Data table "${dataTableId}" not found`);
864
884
  }
865
- const table = await dataTableRepository.findOneByOrFail({ id: dataTableId });
866
- return table.projectId;
867
- };
868
- const resolveTableMeta = async (scopes, dataTableId) => {
869
- const allowed = await (0, check_access_1.userHasScopes)(user, scopes, false, { dataTableId });
870
- if (!allowed) {
871
- throw new Error(`Data table "${dataTableId}" not found`);
885
+ if (result.kind === 'ambiguous') {
886
+ const projectIds = result.candidates.map((c) => c.projectId).join(', ');
887
+ throw new Error(`Data table name "${dataTableId}" is ambiguous across accessible projects ` +
888
+ `(${projectIds}); pass the UUID or include a \`projectId\` to disambiguate.`);
872
889
  }
873
- const table = await dataTableRepository.findOneByOrFail({ id: dataTableId });
874
- return { projectId: table.projectId, tableName: table.name };
890
+ if (projectIdFilter && result.table.projectId !== projectIdFilter) {
891
+ throw new Error(`Data table "${dataTableId}" does not belong to project "${projectIdFilter}".`);
892
+ }
893
+ return result.table;
894
+ };
895
+ const resolveProjectIdForTable = async (scopes, dataTableId, disambiguator) => {
896
+ const table = await resolveAccessibleTable(scopes, dataTableId, disambiguator);
897
+ return { projectId: table.projectId, resolvedId: table.id };
898
+ };
899
+ const resolveTableMeta = async (scopes, dataTableId, disambiguator) => {
900
+ const table = await resolveAccessibleTable(scopes, dataTableId, disambiguator);
901
+ return { projectId: table.projectId, tableName: table.name, resolvedId: table.id };
875
902
  };
876
903
  return {
877
904
  async list(options) {
@@ -901,14 +928,14 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
901
928
  updatedAt: result.updatedAt.toISOString(),
902
929
  };
903
930
  },
904
- async delete(dataTableId) {
931
+ async delete(dataTableId, options) {
905
932
  assertNotReadOnly();
906
- const projectId = await resolveProjectIdForTable(['dataTable:delete'], dataTableId);
907
- await dataTableService.deleteDataTable(dataTableId, projectId);
933
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:delete'], dataTableId, options);
934
+ await dataTableService.deleteDataTable(resolvedId, projectId);
908
935
  },
909
- async getSchema(dataTableId) {
910
- const projectId = await resolveProjectIdForTable(['dataTable:read'], dataTableId);
911
- const columns = await dataTableService.getColumns(dataTableId, projectId);
936
+ async getSchema(dataTableId, options) {
937
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:read'], dataTableId, options);
938
+ const columns = await dataTableService.getColumns(resolvedId, projectId);
912
939
  return columns.map((c, index) => ({
913
940
  id: c.id,
914
941
  name: c.name,
@@ -916,10 +943,10 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
916
943
  index,
917
944
  }));
918
945
  },
919
- async addColumn(dataTableId, column) {
946
+ async addColumn(dataTableId, column, options) {
920
947
  assertNotReadOnly();
921
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
922
- const result = await dataTableService.addColumn(dataTableId, projectId, column);
948
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
949
+ const result = await dataTableService.addColumn(resolvedId, projectId, column);
923
950
  return {
924
951
  id: result.id,
925
952
  name: result.name,
@@ -927,55 +954,55 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
927
954
  index: result.index,
928
955
  };
929
956
  },
930
- async deleteColumn(dataTableId, columnId) {
957
+ async deleteColumn(dataTableId, columnId, options) {
931
958
  assertNotReadOnly();
932
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
933
- await dataTableService.deleteColumn(dataTableId, projectId, columnId);
959
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
960
+ await dataTableService.deleteColumn(resolvedId, projectId, columnId);
934
961
  },
935
- async renameColumn(dataTableId, columnId, newName) {
962
+ async renameColumn(dataTableId, columnId, newName, options) {
936
963
  assertNotReadOnly();
937
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
938
- await dataTableService.renameColumn(dataTableId, projectId, columnId, {
964
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
965
+ await dataTableService.renameColumn(resolvedId, projectId, columnId, {
939
966
  name: newName,
940
967
  });
941
968
  },
942
969
  async queryRows(dataTableId, options) {
943
- const projectId = await resolveProjectIdForTable(['dataTable:readRow'], dataTableId);
944
- return await dataTableService.getManyRowsAndCount(dataTableId, projectId, {
970
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:readRow'], dataTableId, options);
971
+ return await dataTableService.getManyRowsAndCount(resolvedId, projectId, {
945
972
  take: options?.limit ?? 50,
946
973
  skip: options?.offset ?? 0,
947
974
  filter: options?.filter,
948
975
  });
949
976
  },
950
- async insertRows(dataTableId, rows) {
977
+ async insertRows(dataTableId, rows, options) {
951
978
  assertNotReadOnly();
952
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
953
- const result = await dataTableService.insertRows(dataTableId, projectId, rows, 'count');
979
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
980
+ const result = await dataTableService.insertRows(resolvedId, projectId, rows, 'count');
954
981
  return {
955
982
  insertedCount: typeof result === 'number' ? result : rows.length,
956
- dataTableId,
983
+ dataTableId: resolvedId,
957
984
  tableName,
958
985
  projectId,
959
986
  };
960
987
  },
961
- async updateRows(dataTableId, filter, data) {
988
+ async updateRows(dataTableId, filter, data, options) {
962
989
  assertNotReadOnly();
963
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
964
- const result = await dataTableService.updateRows(dataTableId, projectId, { filter: filter, data: data }, true);
990
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
991
+ const result = await dataTableService.updateRows(resolvedId, projectId, { filter: filter, data: data }, true);
965
992
  return {
966
993
  updatedCount: Array.isArray(result) ? result.length : 0,
967
- dataTableId,
994
+ dataTableId: resolvedId,
968
995
  tableName,
969
996
  projectId,
970
997
  };
971
998
  },
972
- async deleteRows(dataTableId, filter) {
999
+ async deleteRows(dataTableId, filter, options) {
973
1000
  assertNotReadOnly();
974
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
975
- const result = await dataTableService.deleteRows(dataTableId, projectId, { filter: filter }, true);
1001
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
1002
+ const result = await dataTableService.deleteRows(resolvedId, projectId, { filter: filter }, true);
976
1003
  return {
977
1004
  deletedCount: Array.isArray(result) ? result.length : 0,
978
- dataTableId,
1005
+ dataTableId: resolvedId,
979
1006
  tableName,
980
1007
  projectId,
981
1008
  };
@@ -986,6 +1013,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
986
1013
  const fetchCache = this.webResearchCache;
987
1014
  const searchCacheRef = this.searchCache;
988
1015
  const settingsService = this.settingsService;
1016
+ const ssrf = this.ssrfProtectionService;
989
1017
  const userId = user.id;
990
1018
  let resolvedSearchMethod;
991
1019
  let searchResolved = false;
@@ -1019,6 +1047,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
1019
1047
  maxResponseBytes: options?.maxResponseBytes,
1020
1048
  timeoutMs: options?.timeoutMs,
1021
1049
  authorizeUrl: options?.authorizeUrl,
1050
+ ssrf,
1022
1051
  });
1023
1052
  const result = await (0, web_research_1.maybeSummarize)(page);
1024
1053
  fetchCache.set(cacheKey, result);
@@ -1143,6 +1172,18 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
1143
1172
  }
1144
1173
  result.builderHint.inputs = inputs;
1145
1174
  }
1175
+ if (n.builderHint.outputs) {
1176
+ const outputs = {};
1177
+ for (const [key, config] of Object.entries(n.builderHint.outputs)) {
1178
+ outputs[key] = {
1179
+ ...(config.required !== undefined ? { required: config.required } : {}),
1180
+ ...(config.displayOptions
1181
+ ? { displayOptions: config.displayOptions }
1182
+ : {}),
1183
+ };
1184
+ }
1185
+ result.builderHint.outputs = outputs;
1186
+ }
1146
1187
  }
1147
1188
  return result;
1148
1189
  });
@@ -1569,6 +1610,7 @@ exports.InstanceAiAdapterService = InstanceAiAdapterService = __decorate([
1569
1610
  active_executions_1.ActiveExecutions,
1570
1611
  workflow_runner_1.WorkflowRunner,
1571
1612
  load_nodes_and_credentials_1.LoadNodesAndCredentials,
1613
+ node_types_1.NodeTypes,
1572
1614
  n8n_core_1.InstanceSettings,
1573
1615
  data_table_service_1.DataTableService,
1574
1616
  data_table_repository_1.DataTableRepository,
@@ -1585,10 +1627,43 @@ exports.InstanceAiAdapterService = InstanceAiAdapterService = __decorate([
1585
1627
  event_service_1.EventService,
1586
1628
  role_service_1.RoleService,
1587
1629
  telemetry_1.Telemetry,
1588
- db_1.AiBuilderTemporaryWorkflowRepository])
1630
+ db_1.AiBuilderTemporaryWorkflowRepository,
1631
+ ssrf_protection_service_1.SsrfProtectionService])
1589
1632
  ], InstanceAiAdapterService);
1590
1633
  const MAX_RESULT_CHARS = 20_000;
1591
1634
  const MAX_NODE_OUTPUT_CHARS = 1_000;
1635
+ async function resolveDataTableByIdOrName(repository, logger, idOrName, options) {
1636
+ const byId = await repository.findOneBy({ id: idOrName });
1637
+ if (byId) {
1638
+ if (options?.accessFilter && !(await options.accessFilter(byId.id))) {
1639
+ return { kind: 'miss' };
1640
+ }
1641
+ return { kind: 'hit', table: byId };
1642
+ }
1643
+ const candidates = await repository.findBy({
1644
+ name: idOrName,
1645
+ ...(options?.projectIdFilter ? { projectId: options.projectIdFilter } : {}),
1646
+ });
1647
+ let filtered = candidates;
1648
+ if (options?.accessFilter) {
1649
+ filtered = [];
1650
+ for (const c of candidates) {
1651
+ if (await options.accessFilter(c.id))
1652
+ filtered.push(c);
1653
+ }
1654
+ }
1655
+ if (filtered.length === 0)
1656
+ return { kind: 'miss' };
1657
+ if (filtered.length > 1)
1658
+ return { kind: 'ambiguous', candidates: filtered };
1659
+ const hit = filtered[0];
1660
+ logger.warn('data-tables tool called with table name instead of id — resolved by name fallback', {
1661
+ passedValue: idOrName,
1662
+ resolvedId: hit.id,
1663
+ projectId: hit.projectId,
1664
+ });
1665
+ return { kind: 'hit', table: hit };
1666
+ }
1592
1667
  function findBuilderHintForMethod(nodeDesc, methodName, methodType) {
1593
1668
  const referencesMethod = (prop) => {
1594
1669
  switch (methodType) {
@@ -1685,7 +1760,8 @@ async function extractExecutionResult(executionRepository, executionId, includeO
1685
1760
  }
1686
1761
  }
1687
1762
  }
1688
- const errorMessage = execution.data?.resultData?.error?.message;
1763
+ const error = execution.data?.resultData?.error;
1764
+ const errorMessage = error ? formatExecutionError(error, includeOutputData) : undefined;
1689
1765
  return {
1690
1766
  executionId,
1691
1767
  status,
@@ -1697,6 +1773,29 @@ async function extractExecutionResult(executionRepository, executionId, includeO
1697
1773
  finishedAt: execution.stoppedAt?.toISOString(),
1698
1774
  };
1699
1775
  }
1776
+ const MAX_ERROR_CHARS = 4_000;
1777
+ function formatExecutionError(error, includeUpstreamDetails) {
1778
+ const parts = [];
1779
+ if (error.message)
1780
+ parts.push(error.message);
1781
+ if (includeUpstreamDetails) {
1782
+ if (error.description && error.description !== error.message) {
1783
+ parts.push(error.description);
1784
+ }
1785
+ if ('messages' in error && error.messages.length > 0) {
1786
+ parts.push(`Details: ${error.messages.join(' | ')}`);
1787
+ }
1788
+ }
1789
+ else {
1790
+ const hasDescription = !!error.description && error.description !== error.message;
1791
+ const hasMessages = 'messages' in error && error.messages.length > 0;
1792
+ if (hasDescription || hasMessages) {
1793
+ parts.push('(upstream error details suppressed by the instance AI privacy setting; ask the user to share the node error from the UI)');
1794
+ }
1795
+ }
1796
+ const combined = parts.join(' — ') || 'Unknown error';
1797
+ return combined.length > MAX_ERROR_CHARS ? `${combined.slice(0, MAX_ERROR_CHARS)}…` : combined;
1798
+ }
1700
1799
  const MAX_NODE_OUTPUT_BYTES = 5_000;
1701
1800
  function truncateNodeOutput(items) {
1702
1801
  const serialized = JSON.stringify(items);
@@ -1791,7 +1890,20 @@ function getExecutionModeForTrigger(node) {
1791
1890
  return 'manual';
1792
1891
  }
1793
1892
  }
1893
+ function validateInputDataShape(node, inputData) {
1894
+ if (node.type === n8n_workflow_1.FORM_TRIGGER_NODE_TYPE) {
1895
+ const formFieldsValue = inputData.formFields;
1896
+ const looksWrapped = typeof formFieldsValue === 'object' && formFieldsValue !== null;
1897
+ if (looksWrapped) {
1898
+ throw new Error('verify-built-workflow: inputData for a Form Trigger must be a flat field map ' +
1899
+ '(e.g. {name: "Alice", email: "a@b.c"}), NOT wrapped in `formFields`. ' +
1900
+ 'The production Form Trigger emits fields directly on $json, so downstream ' +
1901
+ 'expressions like $json.name are correct. Re-run with the flat shape.');
1902
+ }
1903
+ }
1904
+ }
1794
1905
  function getPinDataForTrigger(node, inputData) {
1906
+ validateInputDataShape(node, inputData);
1795
1907
  switch (node.type) {
1796
1908
  case n8n_workflow_1.CHAT_TRIGGER_NODE_TYPE:
1797
1909
  return {
@@ -1819,18 +1931,28 @@ function getPinDataForTrigger(node, inputData) {
1819
1931
  },
1820
1932
  ],
1821
1933
  };
1822
- case n8n_workflow_1.WEBHOOK_NODE_TYPE:
1934
+ case n8n_workflow_1.WEBHOOK_NODE_TYPE: {
1935
+ const envelopeKeys = new Set(['body', 'headers', 'query']);
1936
+ const inputKeys = Object.keys(inputData);
1937
+ const looksLikeEnvelope = inputKeys.length > 0 &&
1938
+ inputKeys.every((k) => envelopeKeys.has(k)) &&
1939
+ typeof inputData.body === 'object' &&
1940
+ inputData.body !== null;
1941
+ const body = looksLikeEnvelope ? inputData.body : inputData;
1942
+ const headers = looksLikeEnvelope && typeof inputData.headers === 'object' && inputData.headers !== null
1943
+ ? inputData.headers
1944
+ : {};
1945
+ const query = looksLikeEnvelope && typeof inputData.query === 'object' && inputData.query !== null
1946
+ ? inputData.query
1947
+ : {};
1823
1948
  return {
1824
1949
  [node.name]: [
1825
1950
  {
1826
- json: {
1827
- headers: {},
1828
- query: {},
1829
- body: inputData,
1830
- },
1951
+ json: { headers, query, body },
1831
1952
  },
1832
1953
  ],
1833
1954
  };
1955
+ }
1834
1956
  case n8n_workflow_1.SCHEDULE_TRIGGER_NODE_TYPE: {
1835
1957
  const now = new Date();
1836
1958
  return {
@@ -1880,24 +2002,21 @@ async function extractExecutionDebugInfo(executionRepository, executionId, inclu
1880
2002
  const lastRun = nodeRuns[nodeRuns.length - 1];
1881
2003
  if (!lastRun)
1882
2004
  continue;
1883
- const hasError = lastRun.error !== undefined;
1884
2005
  const nodeType = nodeTypeMap.get(nodeName) ?? 'unknown';
1885
2006
  nodeTrace.push({
1886
2007
  name: nodeName,
1887
2008
  type: nodeType,
1888
- status: hasError ? 'error' : 'success',
2009
+ status: lastRun.error !== undefined ? 'error' : 'success',
1889
2010
  startedAt: lastRun.startTime !== undefined ? new Date(lastRun.startTime).toISOString() : undefined,
1890
2011
  finishedAt: lastRun.startTime !== undefined && lastRun.executionTime !== undefined
1891
2012
  ? new Date(lastRun.startTime + lastRun.executionTime).toISOString()
1892
2013
  : undefined,
1893
2014
  });
1894
- if (hasError && !failedNode) {
2015
+ if (lastRun.error !== undefined && !failedNode) {
1895
2016
  failedNode = {
1896
2017
  name: nodeName,
1897
2018
  type: nodeType,
1898
- error: lastRun.error instanceof Error
1899
- ? lastRun.error.message
1900
- : String(lastRun.error ?? 'Unknown error'),
2019
+ error: formatExecutionError(lastRun.error, includeOutputData),
1901
2020
  inputData: includeOutputData
1902
2021
  ? (() => {
1903
2022
  const inputItems = lastRun.data?.main