n8n 2.19.3 → 2.20.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 (301) 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 +198 -70
  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/export.service.js +2 -2
  271. package/dist/services/export.service.js.map +1 -1
  272. package/dist/services/frontend.service.js +18 -0
  273. package/dist/services/frontend.service.js.map +1 -1
  274. package/dist/services/import.service.d.ts +5 -1
  275. package/dist/services/import.service.js +62 -5
  276. package/dist/services/import.service.js.map +1 -1
  277. package/dist/services/redis-client.service.d.ts +6 -5
  278. package/dist/services/redis-client.service.js +19 -12
  279. package/dist/services/redis-client.service.js.map +1 -1
  280. package/dist/task-runners/task-broker/auth/task-broker-auth.service.d.ts +4 -4
  281. package/dist/task-runners/task-broker/auth/task-broker-auth.service.js +9 -8
  282. package/dist/task-runners/task-broker/auth/task-broker-auth.service.js.map +1 -1
  283. package/dist/task-runners/task-broker/task-broker-server.js +1 -1
  284. package/dist/task-runners/task-broker/task-broker-server.js.map +1 -1
  285. package/dist/webhooks/test-webhooks.js +16 -2
  286. package/dist/webhooks/test-webhooks.js.map +1 -1
  287. package/dist/workflow-execute-additional-data.js +4 -2
  288. package/dist/workflow-execute-additional-data.js.map +1 -1
  289. package/dist/workflows/workflow-finder.service.d.ts +2 -0
  290. package/dist/workflows/workflow-finder.service.js +12 -1
  291. package/dist/workflows/workflow-finder.service.js.map +1 -1
  292. package/dist/workflows/workflows.controller.d.ts +7 -2
  293. package/dist/workflows/workflows.controller.js +43 -10
  294. package/dist/workflows/workflows.controller.js.map +1 -1
  295. package/package.json +23 -21
  296. package/dist/modules/instance-ai/web-research/ssrf-guard.d.ts +0 -1
  297. package/dist/modules/instance-ai/web-research/ssrf-guard.js +0 -85
  298. package/dist/modules/instance-ai/web-research/ssrf-guard.js.map +0 -1
  299. package/dist/modules/mcp/dto/update-workflow-availability.dto.d.ts +0 -9
  300. package/dist/modules/mcp/dto/update-workflow-availability.dto.js +0 -11
  301. 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() {
@@ -281,6 +288,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
281
288
  if (threadId) {
282
289
  telemetry.track('Builder published workflow', {
283
290
  thread_id: threadId,
291
+ workflow_id: workflowId,
284
292
  executed_by: 'ai',
285
293
  });
286
294
  }
@@ -516,7 +524,15 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
516
524
  executionMode: triggerNode
517
525
  ? getExecutionModeForTrigger(triggerNode)
518
526
  : 'manual',
519
- workflowData: workflow,
527
+ workflowData: {
528
+ ...workflow,
529
+ settings: {
530
+ ...workflow.settings,
531
+ saveManualExecutions: true,
532
+ saveDataSuccessExecution: 'all',
533
+ saveDataErrorExecution: 'all',
534
+ },
535
+ },
520
536
  userId: user.id,
521
537
  pushRef,
522
538
  };
@@ -557,6 +573,18 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
557
573
  else if (Object.keys(basePinData).length > 0) {
558
574
  runData.pinData = basePinData;
559
575
  }
576
+ const trackBuilderExecutedWorkflow = (status) => {
577
+ if (!threadId)
578
+ return;
579
+ telemetry.track('Builder executed workflow', {
580
+ thread_id: threadId,
581
+ workflow_id: workflowId,
582
+ executed_by: 'ai',
583
+ pinned_node_count: Object.keys(runData.pinData ?? {}).length,
584
+ exec_type: runData.executionMode,
585
+ status,
586
+ });
587
+ };
560
588
  const executionId = await workflowRunner.run(runData);
561
589
  const timeoutMs = Math.min(options?.timeout ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
562
590
  if (activeExecutions.has(executionId)) {
@@ -581,24 +609,20 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
581
609
  }
582
610
  catch {
583
611
  }
584
- return {
612
+ const result = {
585
613
  executionId,
586
614
  status: 'error',
587
615
  error: `Execution timed out after ${timeoutMs}ms and was cancelled`,
588
616
  };
617
+ trackBuilderExecutedWorkflow(result.status);
618
+ return result;
589
619
  }
590
620
  throw error;
591
621
  }
592
622
  }
593
- if (threadId) {
594
- telemetry.track('Builder executed workflow', {
595
- thread_id: threadId,
596
- executed_by: 'ai',
597
- pinned_node_count: Object.keys(runData.pinData ?? {}).length,
598
- exec_type: runData.executionMode,
599
- });
600
- }
601
- return await extractExecutionResult(executionRepository, executionId, allowSendingParameterValues);
623
+ const result = await extractExecutionResult(executionRepository, executionId, allowSendingParameterValues);
624
+ trackBuilderExecutedWorkflow(result.status);
625
+ return result;
602
626
  },
603
627
  async getStatus(executionId) {
604
628
  await assertExecutionAccess(executionId);
@@ -689,7 +713,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
689
713
  id: credential.id,
690
714
  name: credential.name,
691
715
  type: credential.type,
692
- data: credentialsService.decrypt(credential, true),
716
+ data: await credentialsService.decrypt(credential, true),
693
717
  };
694
718
  const result = await credentialsService.test(user.id, credentialsToTest);
695
719
  return {
@@ -826,7 +850,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
826
850
  return id.slice(0, 2) + '***' + id.slice(-1);
827
851
  };
828
852
  try {
829
- const redacted = credentialsService.decrypt(credential, false);
853
+ const redacted = await credentialsService.decrypt(credential, false);
830
854
  if (typeof redacted.accountIdentifier === 'string' && redacted.accountIdentifier) {
831
855
  return { accountIdentifier: mask(redacted.accountIdentifier) };
832
856
  }
@@ -836,7 +860,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
836
860
  return { accountIdentifier: mask(value) };
837
861
  }
838
862
  }
839
- const raw = credentialsService.decrypt(credential, true);
863
+ const raw = await credentialsService.decrypt(credential, true);
840
864
  const tokenData = raw.oauthTokenData;
841
865
  if (tokenData && typeof tokenData === 'object') {
842
866
  const { OauthService } = await Promise.resolve().then(() => __importStar(require('../../oauth/oauth.service')));
@@ -857,21 +881,33 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
857
881
  const { dataTableService, dataTableRepository } = this;
858
882
  const assertNotReadOnly = () => this.assertInstanceNotReadOnly('data tables');
859
883
  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) {
884
+ const logger = this.logger;
885
+ const resolveAccessibleTable = async (scopes, dataTableId, disambiguator) => {
886
+ const projectIdFilter = disambiguator?.projectId;
887
+ const result = await resolveDataTableByIdOrName(dataTableRepository, logger, dataTableId, {
888
+ projectIdFilter,
889
+ accessFilter: async (id) => await (0, check_access_1.userHasScopes)(user, scopes, false, { dataTableId: id }),
890
+ });
891
+ if (result.kind === 'miss') {
863
892
  throw new Error(`Data table "${dataTableId}" not found`);
864
893
  }
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`);
894
+ if (result.kind === 'ambiguous') {
895
+ const projectIds = result.candidates.map((c) => c.projectId).join(', ');
896
+ throw new Error(`Data table name "${dataTableId}" is ambiguous across accessible projects ` +
897
+ `(${projectIds}); pass the UUID or include a \`projectId\` to disambiguate.`);
898
+ }
899
+ if (projectIdFilter && result.table.projectId !== projectIdFilter) {
900
+ throw new Error(`Data table "${dataTableId}" does not belong to project "${projectIdFilter}".`);
872
901
  }
873
- const table = await dataTableRepository.findOneByOrFail({ id: dataTableId });
874
- return { projectId: table.projectId, tableName: table.name };
902
+ return result.table;
903
+ };
904
+ const resolveProjectIdForTable = async (scopes, dataTableId, disambiguator) => {
905
+ const table = await resolveAccessibleTable(scopes, dataTableId, disambiguator);
906
+ return { projectId: table.projectId, resolvedId: table.id };
907
+ };
908
+ const resolveTableMeta = async (scopes, dataTableId, disambiguator) => {
909
+ const table = await resolveAccessibleTable(scopes, dataTableId, disambiguator);
910
+ return { projectId: table.projectId, tableName: table.name, resolvedId: table.id };
875
911
  };
876
912
  return {
877
913
  async list(options) {
@@ -901,14 +937,14 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
901
937
  updatedAt: result.updatedAt.toISOString(),
902
938
  };
903
939
  },
904
- async delete(dataTableId) {
940
+ async delete(dataTableId, options) {
905
941
  assertNotReadOnly();
906
- const projectId = await resolveProjectIdForTable(['dataTable:delete'], dataTableId);
907
- await dataTableService.deleteDataTable(dataTableId, projectId);
942
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:delete'], dataTableId, options);
943
+ await dataTableService.deleteDataTable(resolvedId, projectId);
908
944
  },
909
- async getSchema(dataTableId) {
910
- const projectId = await resolveProjectIdForTable(['dataTable:read'], dataTableId);
911
- const columns = await dataTableService.getColumns(dataTableId, projectId);
945
+ async getSchema(dataTableId, options) {
946
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:read'], dataTableId, options);
947
+ const columns = await dataTableService.getColumns(resolvedId, projectId);
912
948
  return columns.map((c, index) => ({
913
949
  id: c.id,
914
950
  name: c.name,
@@ -916,10 +952,10 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
916
952
  index,
917
953
  }));
918
954
  },
919
- async addColumn(dataTableId, column) {
955
+ async addColumn(dataTableId, column, options) {
920
956
  assertNotReadOnly();
921
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
922
- const result = await dataTableService.addColumn(dataTableId, projectId, column);
957
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
958
+ const result = await dataTableService.addColumn(resolvedId, projectId, column);
923
959
  return {
924
960
  id: result.id,
925
961
  name: result.name,
@@ -927,55 +963,55 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
927
963
  index: result.index,
928
964
  };
929
965
  },
930
- async deleteColumn(dataTableId, columnId) {
966
+ async deleteColumn(dataTableId, columnId, options) {
931
967
  assertNotReadOnly();
932
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
933
- await dataTableService.deleteColumn(dataTableId, projectId, columnId);
968
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
969
+ await dataTableService.deleteColumn(resolvedId, projectId, columnId);
934
970
  },
935
- async renameColumn(dataTableId, columnId, newName) {
971
+ async renameColumn(dataTableId, columnId, newName, options) {
936
972
  assertNotReadOnly();
937
- const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
938
- await dataTableService.renameColumn(dataTableId, projectId, columnId, {
973
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:update'], dataTableId, options);
974
+ await dataTableService.renameColumn(resolvedId, projectId, columnId, {
939
975
  name: newName,
940
976
  });
941
977
  },
942
978
  async queryRows(dataTableId, options) {
943
- const projectId = await resolveProjectIdForTable(['dataTable:readRow'], dataTableId);
944
- return await dataTableService.getManyRowsAndCount(dataTableId, projectId, {
979
+ const { projectId, resolvedId } = await resolveProjectIdForTable(['dataTable:readRow'], dataTableId, options);
980
+ return await dataTableService.getManyRowsAndCount(resolvedId, projectId, {
945
981
  take: options?.limit ?? 50,
946
982
  skip: options?.offset ?? 0,
947
983
  filter: options?.filter,
948
984
  });
949
985
  },
950
- async insertRows(dataTableId, rows) {
986
+ async insertRows(dataTableId, rows, options) {
951
987
  assertNotReadOnly();
952
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
953
- const result = await dataTableService.insertRows(dataTableId, projectId, rows, 'count');
988
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
989
+ const result = await dataTableService.insertRows(resolvedId, projectId, rows, 'count');
954
990
  return {
955
991
  insertedCount: typeof result === 'number' ? result : rows.length,
956
- dataTableId,
992
+ dataTableId: resolvedId,
957
993
  tableName,
958
994
  projectId,
959
995
  };
960
996
  },
961
- async updateRows(dataTableId, filter, data) {
997
+ async updateRows(dataTableId, filter, data, options) {
962
998
  assertNotReadOnly();
963
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
964
- const result = await dataTableService.updateRows(dataTableId, projectId, { filter: filter, data: data }, true);
999
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
1000
+ const result = await dataTableService.updateRows(resolvedId, projectId, { filter: filter, data: data }, true);
965
1001
  return {
966
1002
  updatedCount: Array.isArray(result) ? result.length : 0,
967
- dataTableId,
1003
+ dataTableId: resolvedId,
968
1004
  tableName,
969
1005
  projectId,
970
1006
  };
971
1007
  },
972
- async deleteRows(dataTableId, filter) {
1008
+ async deleteRows(dataTableId, filter, options) {
973
1009
  assertNotReadOnly();
974
- const { projectId, tableName } = await resolveTableMeta(['dataTable:writeRow'], dataTableId);
975
- const result = await dataTableService.deleteRows(dataTableId, projectId, { filter: filter }, true);
1010
+ const { projectId, tableName, resolvedId } = await resolveTableMeta(['dataTable:writeRow'], dataTableId, options);
1011
+ const result = await dataTableService.deleteRows(resolvedId, projectId, { filter: filter }, true);
976
1012
  return {
977
1013
  deletedCount: Array.isArray(result) ? result.length : 0,
978
- dataTableId,
1014
+ dataTableId: resolvedId,
979
1015
  tableName,
980
1016
  projectId,
981
1017
  };
@@ -986,6 +1022,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
986
1022
  const fetchCache = this.webResearchCache;
987
1023
  const searchCacheRef = this.searchCache;
988
1024
  const settingsService = this.settingsService;
1025
+ const ssrf = this.ssrfProtectionService;
989
1026
  const userId = user.id;
990
1027
  let resolvedSearchMethod;
991
1028
  let searchResolved = false;
@@ -1019,6 +1056,7 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
1019
1056
  maxResponseBytes: options?.maxResponseBytes,
1020
1057
  timeoutMs: options?.timeoutMs,
1021
1058
  authorizeUrl: options?.authorizeUrl,
1059
+ ssrf,
1022
1060
  });
1023
1061
  const result = await (0, web_research_1.maybeSummarize)(page);
1024
1062
  fetchCache.set(cacheKey, result);
@@ -1143,6 +1181,18 @@ let InstanceAiAdapterService = class InstanceAiAdapterService {
1143
1181
  }
1144
1182
  result.builderHint.inputs = inputs;
1145
1183
  }
1184
+ if (n.builderHint.outputs) {
1185
+ const outputs = {};
1186
+ for (const [key, config] of Object.entries(n.builderHint.outputs)) {
1187
+ outputs[key] = {
1188
+ ...(config.required !== undefined ? { required: config.required } : {}),
1189
+ ...(config.displayOptions
1190
+ ? { displayOptions: config.displayOptions }
1191
+ : {}),
1192
+ };
1193
+ }
1194
+ result.builderHint.outputs = outputs;
1195
+ }
1146
1196
  }
1147
1197
  return result;
1148
1198
  });
@@ -1569,6 +1619,7 @@ exports.InstanceAiAdapterService = InstanceAiAdapterService = __decorate([
1569
1619
  active_executions_1.ActiveExecutions,
1570
1620
  workflow_runner_1.WorkflowRunner,
1571
1621
  load_nodes_and_credentials_1.LoadNodesAndCredentials,
1622
+ node_types_1.NodeTypes,
1572
1623
  n8n_core_1.InstanceSettings,
1573
1624
  data_table_service_1.DataTableService,
1574
1625
  data_table_repository_1.DataTableRepository,
@@ -1585,10 +1636,43 @@ exports.InstanceAiAdapterService = InstanceAiAdapterService = __decorate([
1585
1636
  event_service_1.EventService,
1586
1637
  role_service_1.RoleService,
1587
1638
  telemetry_1.Telemetry,
1588
- db_1.AiBuilderTemporaryWorkflowRepository])
1639
+ db_1.AiBuilderTemporaryWorkflowRepository,
1640
+ ssrf_protection_service_1.SsrfProtectionService])
1589
1641
  ], InstanceAiAdapterService);
1590
1642
  const MAX_RESULT_CHARS = 20_000;
1591
1643
  const MAX_NODE_OUTPUT_CHARS = 1_000;
1644
+ async function resolveDataTableByIdOrName(repository, logger, idOrName, options) {
1645
+ const byId = await repository.findOneBy({ id: idOrName });
1646
+ if (byId) {
1647
+ if (options?.accessFilter && !(await options.accessFilter(byId.id))) {
1648
+ return { kind: 'miss' };
1649
+ }
1650
+ return { kind: 'hit', table: byId };
1651
+ }
1652
+ const candidates = await repository.findBy({
1653
+ name: idOrName,
1654
+ ...(options?.projectIdFilter ? { projectId: options.projectIdFilter } : {}),
1655
+ });
1656
+ let filtered = candidates;
1657
+ if (options?.accessFilter) {
1658
+ filtered = [];
1659
+ for (const c of candidates) {
1660
+ if (await options.accessFilter(c.id))
1661
+ filtered.push(c);
1662
+ }
1663
+ }
1664
+ if (filtered.length === 0)
1665
+ return { kind: 'miss' };
1666
+ if (filtered.length > 1)
1667
+ return { kind: 'ambiguous', candidates: filtered };
1668
+ const hit = filtered[0];
1669
+ logger.warn('data-tables tool called with table name instead of id — resolved by name fallback', {
1670
+ passedValue: idOrName,
1671
+ resolvedId: hit.id,
1672
+ projectId: hit.projectId,
1673
+ });
1674
+ return { kind: 'hit', table: hit };
1675
+ }
1592
1676
  function findBuilderHintForMethod(nodeDesc, methodName, methodType) {
1593
1677
  const referencesMethod = (prop) => {
1594
1678
  switch (methodType) {
@@ -1685,7 +1769,8 @@ async function extractExecutionResult(executionRepository, executionId, includeO
1685
1769
  }
1686
1770
  }
1687
1771
  }
1688
- const errorMessage = execution.data?.resultData?.error?.message;
1772
+ const error = execution.data?.resultData?.error;
1773
+ const errorMessage = error ? formatExecutionError(error, includeOutputData) : undefined;
1689
1774
  return {
1690
1775
  executionId,
1691
1776
  status,
@@ -1697,6 +1782,29 @@ async function extractExecutionResult(executionRepository, executionId, includeO
1697
1782
  finishedAt: execution.stoppedAt?.toISOString(),
1698
1783
  };
1699
1784
  }
1785
+ const MAX_ERROR_CHARS = 4_000;
1786
+ function formatExecutionError(error, includeUpstreamDetails) {
1787
+ const parts = [];
1788
+ if (error.message)
1789
+ parts.push(error.message);
1790
+ if (includeUpstreamDetails) {
1791
+ if (error.description && error.description !== error.message) {
1792
+ parts.push(error.description);
1793
+ }
1794
+ if ('messages' in error && error.messages.length > 0) {
1795
+ parts.push(`Details: ${error.messages.join(' | ')}`);
1796
+ }
1797
+ }
1798
+ else {
1799
+ const hasDescription = !!error.description && error.description !== error.message;
1800
+ const hasMessages = 'messages' in error && error.messages.length > 0;
1801
+ if (hasDescription || hasMessages) {
1802
+ parts.push('(upstream error details suppressed by the instance AI privacy setting; ask the user to share the node error from the UI)');
1803
+ }
1804
+ }
1805
+ const combined = parts.join(' — ') || 'Unknown error';
1806
+ return combined.length > MAX_ERROR_CHARS ? `${combined.slice(0, MAX_ERROR_CHARS)}…` : combined;
1807
+ }
1700
1808
  const MAX_NODE_OUTPUT_BYTES = 5_000;
1701
1809
  function truncateNodeOutput(items) {
1702
1810
  const serialized = JSON.stringify(items);
@@ -1791,7 +1899,20 @@ function getExecutionModeForTrigger(node) {
1791
1899
  return 'manual';
1792
1900
  }
1793
1901
  }
1902
+ function validateInputDataShape(node, inputData) {
1903
+ if (node.type === n8n_workflow_1.FORM_TRIGGER_NODE_TYPE) {
1904
+ const formFieldsValue = inputData.formFields;
1905
+ const looksWrapped = typeof formFieldsValue === 'object' && formFieldsValue !== null;
1906
+ if (looksWrapped) {
1907
+ throw new Error('verify-built-workflow: inputData for a Form Trigger must be a flat field map ' +
1908
+ '(e.g. {name: "Alice", email: "a@b.c"}), NOT wrapped in `formFields`. ' +
1909
+ 'The production Form Trigger emits fields directly on $json, so downstream ' +
1910
+ 'expressions like $json.name are correct. Re-run with the flat shape.');
1911
+ }
1912
+ }
1913
+ }
1794
1914
  function getPinDataForTrigger(node, inputData) {
1915
+ validateInputDataShape(node, inputData);
1795
1916
  switch (node.type) {
1796
1917
  case n8n_workflow_1.CHAT_TRIGGER_NODE_TYPE:
1797
1918
  return {
@@ -1819,18 +1940,28 @@ function getPinDataForTrigger(node, inputData) {
1819
1940
  },
1820
1941
  ],
1821
1942
  };
1822
- case n8n_workflow_1.WEBHOOK_NODE_TYPE:
1943
+ case n8n_workflow_1.WEBHOOK_NODE_TYPE: {
1944
+ const envelopeKeys = new Set(['body', 'headers', 'query']);
1945
+ const inputKeys = Object.keys(inputData);
1946
+ const looksLikeEnvelope = inputKeys.length > 0 &&
1947
+ inputKeys.every((k) => envelopeKeys.has(k)) &&
1948
+ typeof inputData.body === 'object' &&
1949
+ inputData.body !== null;
1950
+ const body = looksLikeEnvelope ? inputData.body : inputData;
1951
+ const headers = looksLikeEnvelope && typeof inputData.headers === 'object' && inputData.headers !== null
1952
+ ? inputData.headers
1953
+ : {};
1954
+ const query = looksLikeEnvelope && typeof inputData.query === 'object' && inputData.query !== null
1955
+ ? inputData.query
1956
+ : {};
1823
1957
  return {
1824
1958
  [node.name]: [
1825
1959
  {
1826
- json: {
1827
- headers: {},
1828
- query: {},
1829
- body: inputData,
1830
- },
1960
+ json: { headers, query, body },
1831
1961
  },
1832
1962
  ],
1833
1963
  };
1964
+ }
1834
1965
  case n8n_workflow_1.SCHEDULE_TRIGGER_NODE_TYPE: {
1835
1966
  const now = new Date();
1836
1967
  return {
@@ -1880,24 +2011,21 @@ async function extractExecutionDebugInfo(executionRepository, executionId, inclu
1880
2011
  const lastRun = nodeRuns[nodeRuns.length - 1];
1881
2012
  if (!lastRun)
1882
2013
  continue;
1883
- const hasError = lastRun.error !== undefined;
1884
2014
  const nodeType = nodeTypeMap.get(nodeName) ?? 'unknown';
1885
2015
  nodeTrace.push({
1886
2016
  name: nodeName,
1887
2017
  type: nodeType,
1888
- status: hasError ? 'error' : 'success',
2018
+ status: lastRun.error !== undefined ? 'error' : 'success',
1889
2019
  startedAt: lastRun.startTime !== undefined ? new Date(lastRun.startTime).toISOString() : undefined,
1890
2020
  finishedAt: lastRun.startTime !== undefined && lastRun.executionTime !== undefined
1891
2021
  ? new Date(lastRun.startTime + lastRun.executionTime).toISOString()
1892
2022
  : undefined,
1893
2023
  });
1894
- if (hasError && !failedNode) {
2024
+ if (lastRun.error !== undefined && !failedNode) {
1895
2025
  failedNode = {
1896
2026
  name: nodeName,
1897
2027
  type: nodeType,
1898
- error: lastRun.error instanceof Error
1899
- ? lastRun.error.message
1900
- : String(lastRun.error ?? 'Unknown error'),
2028
+ error: formatExecutionError(lastRun.error, includeOutputData),
1901
2029
  inputData: includeOutputData
1902
2030
  ? (() => {
1903
2031
  const inputItems = lastRun.data?.main