n8n 2.14.2 → 2.16.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 (548) hide show
  1. package/dist/abstract-server.js +1 -1
  2. package/dist/abstract-server.js.map +1 -1
  3. package/dist/active-workflow-manager.js +25 -12
  4. package/dist/active-workflow-manager.js.map +1 -1
  5. package/dist/auth/auth.service.js +1 -0
  6. package/dist/auth/auth.service.js.map +1 -1
  7. package/dist/build.tsbuildinfo +1 -1
  8. package/dist/commands/base-command.d.ts +1 -0
  9. package/dist/commands/base-command.js +15 -7
  10. package/dist/commands/base-command.js.map +1 -1
  11. package/dist/commands/execute-batch.js +2 -0
  12. package/dist/commands/execute-batch.js.map +1 -1
  13. package/dist/commands/execute.js +2 -0
  14. package/dist/commands/execute.js.map +1 -1
  15. package/dist/commands/start.js +1 -0
  16. package/dist/commands/start.js.map +1 -1
  17. package/dist/commands/webhook.js +1 -0
  18. package/dist/commands/webhook.js.map +1 -1
  19. package/dist/commands/worker.js +1 -0
  20. package/dist/commands/worker.js.map +1 -1
  21. package/dist/constants.js +1 -0
  22. package/dist/constants.js.map +1 -1
  23. package/dist/controllers/ai.controller.js +2 -2
  24. package/dist/controllers/ai.controller.js.map +1 -1
  25. package/dist/controllers/binary-data.controller.js +1 -1
  26. package/dist/controllers/binary-data.controller.js.map +1 -1
  27. package/dist/controllers/e2e.controller.js +2 -0
  28. package/dist/controllers/e2e.controller.js.map +1 -1
  29. package/dist/controllers/me.controller.d.ts +3 -1
  30. package/dist/controllers/me.controller.js +6 -3
  31. package/dist/controllers/me.controller.js.map +1 -1
  32. package/dist/controllers/project.controller.d.ts +2 -0
  33. package/dist/credentials/credentials.controller.js +1 -1
  34. package/dist/credentials/credentials.controller.js.map +1 -1
  35. package/dist/credentials/credentials.service.d.ts +7 -4
  36. package/dist/credentials/credentials.service.js +78 -17
  37. package/dist/credentials/credentials.service.js.map +1 -1
  38. package/dist/credentials-helper.js +7 -1
  39. package/dist/credentials-helper.js.map +1 -1
  40. package/dist/errors/http-error-classifier.d.ts +31 -0
  41. package/dist/errors/http-error-classifier.js +60 -0
  42. package/dist/errors/http-error-classifier.js.map +1 -0
  43. package/dist/errors/http-error-serializers.d.ts +18 -0
  44. package/dist/errors/http-error-serializers.js +64 -0
  45. package/dist/errors/http-error-serializers.js.map +1 -0
  46. package/dist/eventbus/event-message-classes/index.d.ts +2 -2
  47. package/dist/eventbus/event-message-classes/index.js +3 -0
  48. package/dist/eventbus/event-message-classes/index.js.map +1 -1
  49. package/dist/events/maps/relay.event-map.d.ts +22 -0
  50. package/dist/events/relays/log-streaming.event-relay.d.ts +3 -0
  51. package/dist/events/relays/log-streaming.event-relay.js +21 -0
  52. package/dist/events/relays/log-streaming.event-relay.js.map +1 -1
  53. package/dist/execution-lifecycle/execution-lifecycle-hooks.js +11 -8
  54. package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
  55. package/dist/executions/execution-persistence.d.ts +4 -1
  56. package/dist/executions/execution-persistence.js +16 -2
  57. package/dist/executions/execution-persistence.js.map +1 -1
  58. package/dist/executions/execution.service.js +2 -1
  59. package/dist/executions/execution.service.js.map +1 -1
  60. package/dist/executions/executions.controller.d.ts +3 -5
  61. package/dist/executions/executions.controller.js +17 -9
  62. package/dist/executions/executions.controller.js.map +1 -1
  63. package/dist/modules/chat-hub/chat-hub-workflow.service.d.ts +1 -0
  64. package/dist/modules/chat-hub/chat-hub-workflow.service.js +18 -2
  65. package/dist/modules/chat-hub/chat-hub-workflow.service.js.map +1 -1
  66. package/dist/modules/chat-hub/chat-hub.types.d.ts +5 -0
  67. package/dist/modules/chat-hub/chat-hub.types.js +1 -0
  68. package/dist/modules/chat-hub/chat-hub.types.js.map +1 -1
  69. package/dist/modules/chat-hub/context-limits.js +10 -0
  70. package/dist/modules/chat-hub/context-limits.js.map +1 -1
  71. package/dist/modules/community-packages/community-node-types-utils.d.ts +2 -2
  72. package/dist/modules/community-packages/community-node-types-utils.js +4 -4
  73. package/dist/modules/community-packages/community-node-types-utils.js.map +1 -1
  74. package/dist/modules/community-packages/community-packages.controller.d.ts +6 -19
  75. package/dist/modules/community-packages/community-packages.controller.js +8 -231
  76. package/dist/modules/community-packages/community-packages.controller.js.map +1 -1
  77. package/dist/modules/community-packages/community-packages.lifecycle.service.d.ts +32 -0
  78. package/dist/modules/community-packages/community-packages.lifecycle.service.js +282 -0
  79. package/dist/modules/community-packages/community-packages.lifecycle.service.js.map +1 -0
  80. package/dist/modules/community-packages/community-packages.service.js +8 -8
  81. package/dist/modules/community-packages/community-packages.service.js.map +1 -1
  82. package/dist/modules/community-packages/npm-utils.d.ts +4 -0
  83. package/dist/modules/community-packages/npm-utils.js +4 -0
  84. package/dist/modules/community-packages/npm-utils.js.map +1 -1
  85. package/dist/modules/community-packages/strapi-utils.d.ts +1 -1
  86. package/dist/modules/data-table/data-table-proxy.service.d.ts +44 -2
  87. package/dist/modules/data-table/data-table-proxy.service.js +86 -2
  88. package/dist/modules/data-table/data-table-proxy.service.js.map +1 -1
  89. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.d.ts +1 -0
  90. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.js +1 -0
  91. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/index.js.map +1 -1
  92. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.d.ts +11 -0
  93. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.js +88 -0
  94. package/dist/modules/dynamic-credentials.ee/context-establishment-hooks/slack-signature-extractor.js.map +1 -0
  95. package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.d.ts +28 -0
  96. package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.js +158 -0
  97. package/dist/modules/dynamic-credentials.ee/credential-resolvers/identifiers/slack-signature-identifier.js.map +1 -0
  98. package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.d.ts +1 -0
  99. package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.js +1 -0
  100. package/dist/modules/dynamic-credentials.ee/credential-resolvers/index.js.map +1 -1
  101. package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.d.ts +50 -0
  102. package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js +118 -0
  103. package/dist/modules/dynamic-credentials.ee/credential-resolvers/slack-credential-resolver.js.map +1 -0
  104. package/dist/modules/dynamic-credentials.ee/services/resolver-config-expression.service.js +10 -4
  105. package/dist/modules/dynamic-credentials.ee/services/resolver-config-expression.service.js.map +1 -1
  106. package/dist/modules/instance-ai/compaction.service.d.ts +19 -0
  107. package/dist/modules/instance-ai/compaction.service.js +213 -0
  108. package/dist/modules/instance-ai/compaction.service.js.map +1 -0
  109. package/dist/modules/instance-ai/entities/index.d.ts +7 -0
  110. package/dist/modules/instance-ai/entities/index.js +18 -0
  111. package/dist/modules/instance-ai/entities/index.js.map +1 -0
  112. package/dist/modules/instance-ai/entities/instance-ai-iteration-log.entity.d.ts +7 -0
  113. package/dist/modules/instance-ai/entities/instance-ai-iteration-log.entity.js +38 -0
  114. package/dist/modules/instance-ai/entities/instance-ai-iteration-log.entity.js.map +1 -0
  115. package/dist/modules/instance-ai/entities/instance-ai-message.entity.d.ts +9 -0
  116. package/dist/modules/instance-ai/entities/instance-ai-message.entity.js +47 -0
  117. package/dist/modules/instance-ai/entities/instance-ai-message.entity.js.map +1 -0
  118. package/dist/modules/instance-ai/entities/instance-ai-observational-memory.entity.d.ts +33 -0
  119. package/dist/modules/instance-ai/entities/instance-ai-observational-memory.entity.js +145 -0
  120. package/dist/modules/instance-ai/entities/instance-ai-observational-memory.entity.js.map +1 -0
  121. package/dist/modules/instance-ai/entities/instance-ai-resource.entity.d.ts +6 -0
  122. package/dist/modules/instance-ai/entities/instance-ai-resource.entity.js +33 -0
  123. package/dist/modules/instance-ai/entities/instance-ai-resource.entity.js.map +1 -0
  124. package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.d.ts +8 -0
  125. package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.js +43 -0
  126. package/dist/modules/instance-ai/entities/instance-ai-run-snapshot.entity.js.map +1 -0
  127. package/dist/modules/instance-ai/entities/instance-ai-thread.entity.d.ts +7 -0
  128. package/dist/modules/instance-ai/entities/instance-ai-thread.entity.js +38 -0
  129. package/dist/modules/instance-ai/entities/instance-ai-thread.entity.js.map +1 -0
  130. package/dist/modules/instance-ai/entities/instance-ai-workflow-snapshot.entity.d.ts +8 -0
  131. package/dist/modules/instance-ai/entities/instance-ai-workflow-snapshot.entity.js +41 -0
  132. package/dist/modules/instance-ai/entities/instance-ai-workflow-snapshot.entity.js.map +1 -0
  133. package/dist/modules/instance-ai/event-bus/in-process-event-bus.d.ts +19 -0
  134. package/dist/modules/instance-ai/event-bus/in-process-event-bus.js +98 -0
  135. package/dist/modules/instance-ai/event-bus/in-process-event-bus.js.map +1 -0
  136. package/dist/modules/instance-ai/filesystem/index.d.ts +4 -0
  137. package/dist/modules/instance-ai/filesystem/index.js +10 -0
  138. package/dist/modules/instance-ai/filesystem/index.js.map +1 -0
  139. package/dist/modules/instance-ai/filesystem/local-fs-provider.d.ts +26 -0
  140. package/dist/modules/instance-ai/filesystem/local-fs-provider.js +321 -0
  141. package/dist/modules/instance-ai/filesystem/local-fs-provider.js.map +1 -0
  142. package/dist/modules/instance-ai/filesystem/local-gateway-registry.d.ts +29 -0
  143. package/dist/modules/instance-ai/filesystem/local-gateway-registry.js +137 -0
  144. package/dist/modules/instance-ai/filesystem/local-gateway-registry.js.map +1 -0
  145. package/dist/modules/instance-ai/filesystem/local-gateway.d.ts +35 -0
  146. package/dist/modules/instance-ai/filesystem/local-gateway.js +99 -0
  147. package/dist/modules/instance-ai/filesystem/local-gateway.js.map +1 -0
  148. package/dist/modules/instance-ai/instance-ai-memory.service.d.ts +36 -0
  149. package/dist/modules/instance-ai/instance-ai-memory.service.js +265 -0
  150. package/dist/modules/instance-ai/instance-ai-memory.service.js.map +1 -0
  151. package/dist/modules/instance-ai/instance-ai-settings.service.d.ts +55 -0
  152. package/dist/modules/instance-ai/instance-ai-settings.service.js +430 -0
  153. package/dist/modules/instance-ai/instance-ai-settings.service.js.map +1 -0
  154. package/dist/modules/instance-ai/instance-ai.adapter.service.d.ts +86 -0
  155. package/dist/modules/instance-ai/instance-ai.adapter.service.js +1731 -0
  156. package/dist/modules/instance-ai/instance-ai.adapter.service.js.map +1 -0
  157. package/dist/modules/instance-ai/instance-ai.controller.d.ts +102 -0
  158. package/dist/modules/instance-ai/instance-ai.controller.js +613 -0
  159. package/dist/modules/instance-ai/instance-ai.controller.js.map +1 -0
  160. package/dist/modules/instance-ai/instance-ai.module.d.ts +13 -0
  161. package/dist/modules/instance-ai/instance-ai.module.js +119 -0
  162. package/dist/modules/instance-ai/instance-ai.module.js.map +1 -0
  163. package/dist/modules/instance-ai/instance-ai.service.d.ts +132 -0
  164. package/dist/modules/instance-ai/instance-ai.service.js +1674 -0
  165. package/dist/modules/instance-ai/instance-ai.service.js.map +1 -0
  166. package/dist/modules/instance-ai/internal-messages.d.ts +2 -0
  167. package/dist/modules/instance-ai/internal-messages.js +11 -0
  168. package/dist/modules/instance-ai/internal-messages.js.map +1 -0
  169. package/dist/modules/instance-ai/message-parser.d.ts +12 -0
  170. package/dist/modules/instance-ai/message-parser.js +171 -0
  171. package/dist/modules/instance-ai/message-parser.js.map +1 -0
  172. package/dist/modules/instance-ai/node-definition-resolver.d.ts +19 -0
  173. package/dist/modules/instance-ai/node-definition-resolver.js +290 -0
  174. package/dist/modules/instance-ai/node-definition-resolver.js.map +1 -0
  175. package/dist/modules/instance-ai/repositories/index.d.ts +7 -0
  176. package/dist/modules/instance-ai/repositories/index.js +18 -0
  177. package/dist/modules/instance-ai/repositories/index.js.map +1 -0
  178. package/dist/modules/instance-ai/repositories/instance-ai-iteration-log.repository.d.ts +5 -0
  179. package/dist/modules/instance-ai/repositories/instance-ai-iteration-log.repository.js +26 -0
  180. package/dist/modules/instance-ai/repositories/instance-ai-iteration-log.repository.js.map +1 -0
  181. package/dist/modules/instance-ai/repositories/instance-ai-message.repository.d.ts +5 -0
  182. package/dist/modules/instance-ai/repositories/instance-ai-message.repository.js +26 -0
  183. package/dist/modules/instance-ai/repositories/instance-ai-message.repository.js.map +1 -0
  184. package/dist/modules/instance-ai/repositories/instance-ai-observational-memory.repository.d.ts +5 -0
  185. package/dist/modules/instance-ai/repositories/instance-ai-observational-memory.repository.js +26 -0
  186. package/dist/modules/instance-ai/repositories/instance-ai-observational-memory.repository.js.map +1 -0
  187. package/dist/modules/instance-ai/repositories/instance-ai-resource.repository.d.ts +5 -0
  188. package/dist/modules/instance-ai/repositories/instance-ai-resource.repository.js +26 -0
  189. package/dist/modules/instance-ai/repositories/instance-ai-resource.repository.js.map +1 -0
  190. package/dist/modules/instance-ai/repositories/instance-ai-run-snapshot.repository.d.ts +5 -0
  191. package/dist/modules/instance-ai/repositories/instance-ai-run-snapshot.repository.js +26 -0
  192. package/dist/modules/instance-ai/repositories/instance-ai-run-snapshot.repository.js.map +1 -0
  193. package/dist/modules/instance-ai/repositories/instance-ai-thread.repository.d.ts +5 -0
  194. package/dist/modules/instance-ai/repositories/instance-ai-thread.repository.js +26 -0
  195. package/dist/modules/instance-ai/repositories/instance-ai-thread.repository.js.map +1 -0
  196. package/dist/modules/instance-ai/repositories/instance-ai-workflow-snapshot.repository.d.ts +5 -0
  197. package/dist/modules/instance-ai/repositories/instance-ai-workflow-snapshot.repository.js +26 -0
  198. package/dist/modules/instance-ai/repositories/instance-ai-workflow-snapshot.repository.js.map +1 -0
  199. package/dist/modules/instance-ai/snapshot-pruning.service.d.ts +14 -0
  200. package/dist/modules/instance-ai/snapshot-pruning.service.js +77 -0
  201. package/dist/modules/instance-ai/snapshot-pruning.service.js.map +1 -0
  202. package/dist/modules/instance-ai/storage/db-iteration-log-storage.d.ts +9 -0
  203. package/dist/modules/instance-ai/storage/db-iteration-log-storage.js +45 -0
  204. package/dist/modules/instance-ai/storage/db-iteration-log-storage.js.map +1 -0
  205. package/dist/modules/instance-ai/storage/db-snapshot-storage.d.ts +10 -0
  206. package/dist/modules/instance-ai/storage/db-snapshot-storage.js +74 -0
  207. package/dist/modules/instance-ai/storage/db-snapshot-storage.js.map +1 -0
  208. package/dist/modules/instance-ai/storage/index.d.ts +5 -0
  209. package/dist/modules/instance-ai/storage/index.js +14 -0
  210. package/dist/modules/instance-ai/storage/index.js.map +1 -0
  211. package/dist/modules/instance-ai/storage/typeorm-composite-store.d.ts +9 -0
  212. package/dist/modules/instance-ai/storage/typeorm-composite-store.js +33 -0
  213. package/dist/modules/instance-ai/storage/typeorm-composite-store.js.map +1 -0
  214. package/dist/modules/instance-ai/storage/typeorm-memory-storage.d.ts +96 -0
  215. package/dist/modules/instance-ai/storage/typeorm-memory-storage.js +853 -0
  216. package/dist/modules/instance-ai/storage/typeorm-memory-storage.js.map +1 -0
  217. package/dist/modules/instance-ai/storage/typeorm-workflows-storage.d.ts +44 -0
  218. package/dist/modules/instance-ai/storage/typeorm-workflows-storage.js +156 -0
  219. package/dist/modules/instance-ai/storage/typeorm-workflows-storage.js.map +1 -0
  220. package/dist/modules/instance-ai/web-research/brave-search.d.ts +10 -0
  221. package/dist/modules/instance-ai/web-research/brave-search.js +43 -0
  222. package/dist/modules/instance-ai/web-research/brave-search.js.map +1 -0
  223. package/dist/modules/instance-ai/web-research/cache.d.ts +13 -0
  224. package/dist/modules/instance-ai/web-research/cache.js +43 -0
  225. package/dist/modules/instance-ai/web-research/cache.js.map +1 -0
  226. package/dist/modules/instance-ai/web-research/fetch-and-extract.d.ts +8 -0
  227. package/dist/modules/instance-ai/web-research/fetch-and-extract.js +231 -0
  228. package/dist/modules/instance-ai/web-research/fetch-and-extract.js.map +1 -0
  229. package/dist/modules/instance-ai/web-research/index.d.ts +7 -0
  230. package/dist/modules/instance-ai/web-research/index.js +16 -0
  231. package/dist/modules/instance-ai/web-research/index.js.map +1 -0
  232. package/dist/modules/instance-ai/web-research/searxng-search.d.ts +6 -0
  233. package/dist/modules/instance-ai/web-research/searxng-search.js +39 -0
  234. package/dist/modules/instance-ai/web-research/searxng-search.js.map +1 -0
  235. package/dist/modules/instance-ai/web-research/ssrf-guard.d.ts +1 -0
  236. package/dist/modules/instance-ai/web-research/ssrf-guard.js +85 -0
  237. package/dist/modules/instance-ai/web-research/ssrf-guard.js.map +1 -0
  238. package/dist/modules/instance-ai/web-research/summarize-content.d.ts +4 -0
  239. package/dist/modules/instance-ai/web-research/summarize-content.js +34 -0
  240. package/dist/modules/instance-ai/web-research/summarize-content.js.map +1 -0
  241. package/dist/modules/instance-registry/instance-registry.types.d.ts +1 -0
  242. package/dist/modules/instance-registry/instance-registry.types.js +2 -1
  243. package/dist/modules/instance-registry/instance-registry.types.js.map +1 -1
  244. package/dist/modules/instance-registry/storage/instance-storage.interface.d.ts +1 -0
  245. package/dist/modules/instance-registry/storage/lua-scripts.d.ts +4 -0
  246. package/dist/modules/instance-registry/storage/lua-scripts.js +39 -0
  247. package/dist/modules/instance-registry/storage/lua-scripts.js.map +1 -0
  248. package/dist/modules/instance-registry/storage/memory-storage.d.ts +16 -0
  249. package/dist/modules/instance-registry/storage/memory-storage.js +42 -0
  250. package/dist/modules/instance-registry/storage/memory-storage.js.map +1 -0
  251. package/dist/modules/instance-registry/storage/redis-instance-storage.d.ts +25 -0
  252. package/dist/modules/instance-registry/storage/redis-instance-storage.js +185 -0
  253. package/dist/modules/instance-registry/storage/redis-instance-storage.js.map +1 -0
  254. package/dist/modules/log-streaming.ee/log-streaming.controller.js.map +1 -1
  255. package/dist/modules/mcp/mcp-oauth-service.d.ts +1 -1
  256. package/dist/modules/mcp/mcp-oauth-service.js +5 -1
  257. package/dist/modules/mcp/mcp-oauth-service.js.map +1 -1
  258. package/dist/modules/mcp/mcp.errors.js +1 -1
  259. package/dist/modules/mcp/mcp.oauth-clients.controller.js +1 -1
  260. package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -1
  261. package/dist/modules/mcp/mcp.service.d.ts +5 -1
  262. package/dist/modules/mcp/mcp.service.js +33 -5
  263. package/dist/modules/mcp/mcp.service.js.map +1 -1
  264. package/dist/modules/mcp/mcp.types.d.ts +1 -1
  265. package/dist/modules/mcp/tools/data-table/add-data-table-column.tool.d.ts +13 -0
  266. package/dist/modules/mcp/tools/data-table/add-data-table-column.tool.js +69 -0
  267. package/dist/modules/mcp/tools/data-table/add-data-table-column.tool.js.map +1 -0
  268. package/dist/modules/mcp/tools/data-table/add-data-table-rows.tool.d.ts +12 -0
  269. package/dist/modules/mcp/tools/data-table/add-data-table-rows.tool.js +77 -0
  270. package/dist/modules/mcp/tools/data-table/add-data-table-rows.tool.js.map +1 -0
  271. package/dist/modules/mcp/tools/data-table/create-data-table.tool.d.ts +21 -0
  272. package/dist/modules/mcp/tools/data-table/create-data-table.tool.js +92 -0
  273. package/dist/modules/mcp/tools/data-table/create-data-table.tool.js.map +1 -0
  274. package/dist/modules/mcp/tools/data-table/delete-data-table-column.tool.d.ts +12 -0
  275. package/dist/modules/mcp/tools/data-table/delete-data-table-column.tool.js +60 -0
  276. package/dist/modules/mcp/tools/data-table/delete-data-table-column.tool.js.map +1 -0
  277. package/dist/modules/mcp/tools/data-table/index.d.ts +7 -0
  278. package/dist/modules/mcp/tools/data-table/index.js +18 -0
  279. package/dist/modules/mcp/tools/data-table/index.js.map +1 -0
  280. package/dist/modules/mcp/tools/data-table/rename-data-table-column.tool.d.ts +13 -0
  281. package/dist/modules/mcp/tools/data-table/rename-data-table-column.tool.js +70 -0
  282. package/dist/modules/mcp/tools/data-table/rename-data-table-column.tool.js.map +1 -0
  283. package/dist/modules/mcp/tools/data-table/rename-data-table.tool.d.ts +12 -0
  284. package/dist/modules/mcp/tools/data-table/rename-data-table.tool.js +60 -0
  285. package/dist/modules/mcp/tools/data-table/rename-data-table.tool.js.map +1 -0
  286. package/dist/modules/mcp/tools/data-table/search-data-tables.tool.d.ts +12 -0
  287. package/dist/modules/mcp/tools/data-table/search-data-tables.tool.js +93 -0
  288. package/dist/modules/mcp/tools/data-table/search-data-tables.tool.js.map +1 -0
  289. package/dist/modules/mcp/tools/execute-workflow.tool.d.ts +3 -4
  290. package/dist/modules/mcp/tools/execute-workflow.tool.js +15 -66
  291. package/dist/modules/mcp/tools/execute-workflow.tool.js.map +1 -1
  292. package/dist/modules/mcp/tools/execution-utils.d.ts +5 -0
  293. package/dist/modules/mcp/tools/execution-utils.js +45 -0
  294. package/dist/modules/mcp/tools/execution-utils.js.map +1 -0
  295. package/dist/modules/mcp/tools/get-execution.tool.js +4 -8
  296. package/dist/modules/mcp/tools/get-execution.tool.js.map +1 -1
  297. package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.d.ts +31 -0
  298. package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.js +165 -0
  299. package/dist/modules/mcp/tools/prepare-workflow-pin-data.tool.js.map +1 -0
  300. package/dist/modules/mcp/tools/schemas.d.ts +73 -2
  301. package/dist/modules/mcp/tools/schemas.js +41 -1
  302. package/dist/modules/mcp/tools/schemas.js.map +1 -1
  303. package/dist/modules/mcp/tools/search-folders.tool.js +2 -7
  304. package/dist/modules/mcp/tools/search-folders.tool.js.map +1 -1
  305. package/dist/modules/mcp/tools/search-projects.tool.js +2 -7
  306. package/dist/modules/mcp/tools/search-projects.tool.js.map +1 -1
  307. package/dist/modules/mcp/tools/search-workflows.tool.js +2 -7
  308. package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
  309. package/dist/modules/mcp/tools/test-workflow.tool.d.ts +31 -0
  310. package/dist/modules/mcp/tools/test-workflow.tool.js +178 -0
  311. package/dist/modules/mcp/tools/test-workflow.tool.js.map +1 -0
  312. package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js +1 -0
  313. package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js.map +1 -1
  314. package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.d.ts +2 -1
  315. package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.js +15 -0
  316. package/dist/modules/mcp/tools/workflow-builder/credentials-auto-assign.js.map +1 -1
  317. package/dist/modules/mcp/tools/workflow-builder/get-suggested-workflow-nodes.tool.js +1 -37
  318. package/dist/modules/mcp/tools/workflow-builder/get-suggested-workflow-nodes.tool.js.map +1 -1
  319. package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.js +1 -37
  320. package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.js.map +1 -1
  321. package/dist/modules/mcp/tools/workflow-builder/search-workflow-nodes.tool.js +1 -37
  322. package/dist/modules/mcp/tools/workflow-builder/search-workflow-nodes.tool.js.map +1 -1
  323. package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js +1 -0
  324. package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js.map +1 -1
  325. package/dist/modules/mcp/tools/workflow-builder/workflow-builder-tools.service.d.ts +17 -0
  326. package/dist/modules/mcp/tools/workflow-builder/workflow-builder-tools.service.js +48 -0
  327. package/dist/modules/mcp/tools/workflow-builder/workflow-builder-tools.service.js.map +1 -1
  328. package/dist/modules/otel/handlers/interfaces.d.ts +5 -0
  329. package/dist/modules/otel/handlers/interfaces.js +3 -0
  330. package/dist/modules/otel/handlers/interfaces.js.map +1 -0
  331. package/dist/modules/otel/handlers/node-end.handler.d.ts +8 -0
  332. package/dist/modules/otel/handlers/node-end.handler.js +71 -0
  333. package/dist/modules/otel/handlers/node-end.handler.js.map +1 -0
  334. package/dist/modules/otel/handlers/node-start.handler.d.ts +7 -0
  335. package/dist/modules/otel/handlers/node-start.handler.js +37 -0
  336. package/dist/modules/otel/handlers/node-start.handler.js.map +1 -0
  337. package/dist/modules/otel/handlers/workflow-end.handler.d.ts +8 -0
  338. package/dist/modules/otel/handlers/workflow-end.handler.js +73 -0
  339. package/dist/modules/otel/handlers/workflow-end.handler.js.map +1 -0
  340. package/dist/modules/otel/handlers/workflow-start.handler.d.ts +7 -0
  341. package/dist/modules/otel/handlers/workflow-start.handler.js +29 -0
  342. package/dist/modules/otel/handlers/workflow-start.handler.js.map +1 -0
  343. package/dist/modules/otel/n8n-instrumentation.d.ts +21 -0
  344. package/dist/modules/otel/n8n-instrumentation.js +103 -0
  345. package/dist/modules/otel/n8n-instrumentation.js.map +1 -0
  346. package/dist/modules/otel/otel.config.d.ts +10 -0
  347. package/dist/modules/otel/otel.config.js +62 -0
  348. package/dist/modules/otel/otel.config.js.map +1 -0
  349. package/dist/modules/otel/otel.constants.d.ts +22 -0
  350. package/dist/modules/otel/otel.constants.js +27 -0
  351. package/dist/modules/otel/otel.constants.js.map +1 -0
  352. package/dist/modules/otel/otel.module.d.ts +5 -0
  353. package/dist/modules/otel/otel.module.js +80 -0
  354. package/dist/modules/otel/otel.module.js.map +1 -0
  355. package/dist/modules/otel/otel.service.d.ts +18 -0
  356. package/dist/modules/otel/otel.service.js +120 -0
  357. package/dist/modules/otel/otel.service.js.map +1 -0
  358. package/dist/modules/otel/span-registry.d.ts +14 -0
  359. package/dist/modules/otel/span-registry.js +58 -0
  360. package/dist/modules/otel/span-registry.js.map +1 -0
  361. package/dist/modules/provisioning.ee/provisioning.module.js +1 -0
  362. package/dist/modules/provisioning.ee/provisioning.module.js.map +1 -1
  363. package/dist/modules/provisioning.ee/provisioning.service.ee.d.ts +13 -2
  364. package/dist/modules/provisioning.ee/provisioning.service.ee.js +145 -2
  365. package/dist/modules/provisioning.ee/provisioning.service.ee.js.map +1 -1
  366. package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.d.ts +18 -0
  367. package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.js +105 -0
  368. package/dist/modules/provisioning.ee/role-mapping-rule.controller.ee.js.map +1 -0
  369. package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.d.ts +34 -0
  370. package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js +221 -0
  371. package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js.map +1 -0
  372. package/dist/modules/provisioning.ee/role-mapping-rule.validation.d.ts +3 -0
  373. package/dist/modules/provisioning.ee/role-mapping-rule.validation.js +29 -0
  374. package/dist/modules/provisioning.ee/role-mapping-rule.validation.js.map +1 -0
  375. package/dist/modules/redaction/executions/execution-redaction.service.d.ts +3 -2
  376. package/dist/modules/redaction/executions/execution-redaction.service.js +5 -1
  377. package/dist/modules/redaction/executions/execution-redaction.service.js.map +1 -1
  378. package/dist/modules/redaction/redaction.module.js +0 -6
  379. package/dist/modules/redaction/redaction.module.js.map +1 -1
  380. package/dist/modules/source-control.ee/source-control-import.service.ee.js +6 -0
  381. package/dist/modules/source-control.ee/source-control-import.service.ee.js.map +1 -1
  382. package/dist/modules/source-control.ee/types/source-control-preferences.js +3 -0
  383. package/dist/modules/source-control.ee/types/source-control-preferences.js.map +1 -1
  384. package/dist/modules/sso-oidc/oidc.controller.ee.d.ts +4 -1
  385. package/dist/modules/sso-oidc/oidc.controller.ee.js +39 -3
  386. package/dist/modules/sso-oidc/oidc.controller.ee.js.map +1 -1
  387. package/dist/modules/sso-oidc/oidc.service.ee.d.ts +14 -2
  388. package/dist/modules/sso-oidc/oidc.service.ee.js +86 -8
  389. package/dist/modules/sso-oidc/oidc.service.ee.js.map +1 -1
  390. package/dist/modules/sso-oidc/views/oidc-test-result.d.ts +5 -0
  391. package/dist/modules/sso-oidc/views/oidc-test-result.js +58 -0
  392. package/dist/modules/sso-oidc/views/oidc-test-result.js.map +1 -0
  393. package/dist/modules/sso-saml/saml-helpers.d.ts +1 -0
  394. package/dist/modules/sso-saml/saml-helpers.js +2 -0
  395. package/dist/modules/sso-saml/saml-helpers.js.map +1 -1
  396. package/dist/modules/sso-saml/saml.service.ee.d.ts +4 -1
  397. package/dist/modules/sso-saml/saml.service.ee.js +13 -7
  398. package/dist/modules/sso-saml/saml.service.ee.js.map +1 -1
  399. package/dist/modules/token-exchange/controllers/embed-auth.controller.d.ts +15 -0
  400. package/dist/modules/token-exchange/controllers/embed-auth.controller.js +67 -0
  401. package/dist/modules/token-exchange/controllers/embed-auth.controller.js.map +1 -0
  402. package/dist/modules/token-exchange/database/entities/token-exchange-jti.entity.d.ts +5 -0
  403. package/dist/modules/token-exchange/database/entities/token-exchange-jti.entity.js +33 -0
  404. package/dist/modules/token-exchange/database/entities/token-exchange-jti.entity.js.map +1 -0
  405. package/dist/modules/token-exchange/database/repositories/token-exchange-jti.repository.d.ts +10 -0
  406. package/dist/modules/token-exchange/database/repositories/token-exchange-jti.repository.js +106 -0
  407. package/dist/modules/token-exchange/database/repositories/token-exchange-jti.repository.js.map +1 -0
  408. package/dist/modules/token-exchange/services/identity-resolution.service.d.ts +5 -0
  409. package/dist/modules/token-exchange/services/identity-resolution.service.js +21 -0
  410. package/dist/modules/token-exchange/services/identity-resolution.service.js.map +1 -0
  411. package/dist/modules/token-exchange/services/jti-cleanup.service.d.ts +18 -0
  412. package/dist/modules/token-exchange/services/jti-cleanup.service.js +90 -0
  413. package/dist/modules/token-exchange/services/jti-cleanup.service.js.map +1 -0
  414. package/dist/modules/token-exchange/services/jti-store.service.d.ts +6 -0
  415. package/dist/modules/token-exchange/services/jti-store.service.js +30 -0
  416. package/dist/modules/token-exchange/services/jti-store.service.js.map +1 -0
  417. package/dist/modules/token-exchange/services/token-exchange.service.d.ts +17 -0
  418. package/dist/modules/token-exchange/services/token-exchange.service.js +93 -0
  419. package/dist/modules/token-exchange/services/token-exchange.service.js.map +1 -0
  420. package/dist/modules/token-exchange/services/trusted-key.service.d.ts +13 -0
  421. package/dist/modules/token-exchange/services/trusted-key.service.js +123 -0
  422. package/dist/modules/token-exchange/services/trusted-key.service.js.map +1 -0
  423. package/dist/modules/token-exchange/token-exchange.config.d.ts +7 -0
  424. package/dist/modules/token-exchange/token-exchange.config.js +47 -0
  425. package/dist/modules/token-exchange/token-exchange.config.js.map +1 -0
  426. package/dist/modules/token-exchange/token-exchange.controller.d.ts +9 -0
  427. package/dist/modules/token-exchange/token-exchange.controller.js +103 -0
  428. package/dist/modules/token-exchange/token-exchange.controller.js.map +1 -0
  429. package/dist/modules/token-exchange/token-exchange.module.d.ts +5 -0
  430. package/dist/modules/token-exchange/token-exchange.module.js +74 -0
  431. package/dist/modules/token-exchange/token-exchange.module.js.map +1 -0
  432. package/dist/modules/token-exchange/token-exchange.schemas.d.ts +131 -0
  433. package/dist/modules/token-exchange/token-exchange.schemas.js +60 -0
  434. package/dist/modules/token-exchange/token-exchange.schemas.js.map +1 -0
  435. package/dist/modules/token-exchange/token-exchange.service.d.ts +9 -0
  436. package/dist/modules/token-exchange/token-exchange.service.js +66 -0
  437. package/dist/modules/token-exchange/token-exchange.service.js.map +1 -0
  438. package/dist/modules/token-exchange/token-exchange.types.d.ts +50 -0
  439. package/dist/modules/token-exchange/token-exchange.types.js +3 -0
  440. package/dist/modules/token-exchange/token-exchange.types.js.map +1 -0
  441. package/dist/modules/workflow-builder/workflow-builder-session.entity.d.ts +4 -0
  442. package/dist/modules/workflow-builder/workflow-builder-session.entity.js +8 -0
  443. package/dist/modules/workflow-builder/workflow-builder-session.entity.js.map +1 -1
  444. package/dist/modules/workflow-builder/workflow-builder-session.repository.js +14 -2
  445. package/dist/modules/workflow-builder/workflow-builder-session.repository.js.map +1 -1
  446. package/dist/modules/workflow-index/workflow-dependency-query.service.js +26 -3
  447. package/dist/modules/workflow-index/workflow-dependency-query.service.js.map +1 -1
  448. package/dist/modules/workflow-index/workflow-index.service.d.ts +1 -0
  449. package/dist/modules/workflow-index/workflow-index.service.js +15 -3
  450. package/dist/modules/workflow-index/workflow-index.service.js.map +1 -1
  451. package/dist/posthog/index.d.ts +1 -0
  452. package/dist/posthog/index.js +32 -8
  453. package/dist/posthog/index.js.map +1 -1
  454. package/dist/public-api/index.js +5 -5
  455. package/dist/public-api/index.js.map +1 -1
  456. package/dist/public-api/types.d.ts +17 -0
  457. package/dist/public-api/v1/handlers/community-packages/community-packages.handler.d.ts +18 -0
  458. package/dist/public-api/v1/handlers/community-packages/community-packages.handler.js +71 -0
  459. package/dist/public-api/v1/handlers/community-packages/community-packages.handler.js.map +1 -0
  460. package/dist/public-api/v1/handlers/community-packages/community-packages.mapper.d.ts +27 -0
  461. package/dist/public-api/v1/handlers/community-packages/community-packages.mapper.js +35 -0
  462. package/dist/public-api/v1/handlers/community-packages/community-packages.mapper.js.map +1 -0
  463. package/dist/public-api/v1/handlers/credentials/credentials.handler.js +6 -5
  464. package/dist/public-api/v1/handlers/credentials/credentials.handler.js.map +1 -1
  465. package/dist/public-api/v1/handlers/credentials/credentials.service.d.ts +2 -2
  466. package/dist/public-api/v1/handlers/credentials/credentials.service.js +3 -6
  467. package/dist/public-api/v1/handlers/credentials/credentials.service.js.map +1 -1
  468. package/dist/public-api/v1/handlers/executions/executions.handler.js +48 -4
  469. package/dist/public-api/v1/handlers/executions/executions.handler.js.map +1 -1
  470. package/dist/public-api/v1/handlers/workflows/workflows.handler.d.ts +8 -0
  471. package/dist/public-api/v1/handlers/workflows/workflows.handler.js +44 -0
  472. package/dist/public-api/v1/handlers/workflows/workflows.handler.js.map +1 -1
  473. package/dist/public-api/v1/openapi.yml +262 -3
  474. package/dist/public-api/v1/public-api-error-response.d.ts +2 -0
  475. package/dist/public-api/v1/public-api-error-response.js +11 -0
  476. package/dist/public-api/v1/public-api-error-response.js.map +1 -0
  477. package/dist/push/abstract.push.d.ts +1 -0
  478. package/dist/push/abstract.push.js +3 -0
  479. package/dist/push/abstract.push.js.map +1 -1
  480. package/dist/push/sse.push.js +5 -1
  481. package/dist/push/sse.push.js.map +1 -1
  482. package/dist/push/websocket.push.js +3 -1
  483. package/dist/push/websocket.push.js.map +1 -1
  484. package/dist/response-helper.js +6 -29
  485. package/dist/response-helper.js.map +1 -1
  486. package/dist/scaling/job-processor.js +3 -0
  487. package/dist/scaling/job-processor.js.map +1 -1
  488. package/dist/scaling/pubsub/subscriber.service.d.ts +2 -0
  489. package/dist/scaling/pubsub/subscriber.service.js +17 -8
  490. package/dist/scaling/pubsub/subscriber.service.js.map +1 -1
  491. package/dist/scaling/redis/redis.types.d.ts +1 -1
  492. package/dist/scaling/scaling.service.js +1 -2
  493. package/dist/scaling/scaling.service.js.map +1 -1
  494. package/dist/scaling/worker-server.js +1 -1
  495. package/dist/scaling/worker-server.js.map +1 -1
  496. package/dist/services/ai-workflow-builder.service.d.ts +2 -2
  497. package/dist/services/ai-workflow-builder.service.js +5 -8
  498. package/dist/services/ai-workflow-builder.service.js.map +1 -1
  499. package/dist/services/ai.service.d.ts +4 -0
  500. package/dist/services/ai.service.js +20 -18
  501. package/dist/services/ai.service.js.map +1 -1
  502. package/dist/services/auth-strategy.registry.d.ts +7 -0
  503. package/dist/services/auth-strategy.registry.js +32 -0
  504. package/dist/services/auth-strategy.registry.js.map +1 -0
  505. package/dist/services/auth-strategy.types.d.ts +4 -0
  506. package/dist/services/auth-strategy.types.js +3 -0
  507. package/dist/services/auth-strategy.types.js.map +1 -0
  508. package/dist/services/credentials-tester.service.js +2 -0
  509. package/dist/services/credentials-tester.service.js.map +1 -1
  510. package/dist/services/db-clock.service.d.ts +10 -0
  511. package/dist/services/db-clock.service.js +48 -0
  512. package/dist/services/db-clock.service.js.map +1 -0
  513. package/dist/services/frontend.service.js +4 -1
  514. package/dist/services/frontend.service.js.map +1 -1
  515. package/dist/utils/health-endpoint.util.d.ts +2 -1
  516. package/dist/utils/health-endpoint.util.js +11 -3
  517. package/dist/utils/health-endpoint.util.js.map +1 -1
  518. package/dist/wait-tracker.d.ts +6 -2
  519. package/dist/wait-tracker.js +94 -63
  520. package/dist/wait-tracker.js.map +1 -1
  521. package/dist/webhooks/live-webhooks.js +24 -18
  522. package/dist/webhooks/live-webhooks.js.map +1 -1
  523. package/dist/webhooks/test-webhooks.js +96 -78
  524. package/dist/webhooks/test-webhooks.js.map +1 -1
  525. package/dist/webhooks/waiting-forms.js +3 -1
  526. package/dist/webhooks/waiting-forms.js.map +1 -1
  527. package/dist/webhooks/waiting-webhooks.js +27 -21
  528. package/dist/webhooks/waiting-webhooks.js.map +1 -1
  529. package/dist/webhooks/webhook-helpers.js +21 -6
  530. package/dist/webhooks/webhook-helpers.js.map +1 -1
  531. package/dist/webhooks/webhook-last-node-response-extractor.d.ts +5 -2
  532. package/dist/webhooks/webhook-last-node-response-extractor.js +5 -8
  533. package/dist/webhooks/webhook-last-node-response-extractor.js.map +1 -1
  534. package/dist/webhooks/webhook-request-handler.js +1 -1
  535. package/dist/webhooks/webhook-request-handler.js.map +1 -1
  536. package/dist/workflows/workflow-creation.service.js +4 -0
  537. package/dist/workflows/workflow-creation.service.js.map +1 -1
  538. package/dist/workflows/workflow-execution.service.js +1 -1
  539. package/dist/workflows/workflow-execution.service.js.map +1 -1
  540. package/dist/workflows/workflow-history/workflow-history.service.js +1 -0
  541. package/dist/workflows/workflow-history/workflow-history.service.js.map +1 -1
  542. package/dist/workflows/workflow-validation.service.js +3 -3
  543. package/dist/workflows/workflow-validation.service.js.map +1 -1
  544. package/dist/workflows/workflow.service.d.ts +6 -1
  545. package/dist/workflows/workflow.service.js +34 -7
  546. package/dist/workflows/workflow.service.js.map +1 -1
  547. package/dist/workflows/workflows.controller.d.ts +2 -2
  548. package/package.json +39 -29
@@ -0,0 +1,1731 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.InstanceAiAdapterService = void 0;
13
+ exports.truncateResultData = truncateResultData;
14
+ exports.extractExecutionResult = extractExecutionResult;
15
+ exports.truncateNodeOutput = truncateNodeOutput;
16
+ exports.extractNodeOutput = extractNodeOutput;
17
+ exports.extractExecutionDebugInfo = extractExecutionDebugInfo;
18
+ const node_crypto_1 = require("node:crypto");
19
+ const instance_ai_1 = require("@n8n/instance-ai");
20
+ const config_1 = require("@n8n/config");
21
+ const constants_1 = require("@n8n/constants");
22
+ const instance_ai_settings_service_1 = require("./instance-ai-settings.service");
23
+ const node_definition_resolver_1 = require("./node-definition-resolver");
24
+ const web_research_1 = require("./web-research");
25
+ const db_1 = require("@n8n/db");
26
+ const backend_common_1 = require("@n8n/backend-common");
27
+ const di_1 = require("@n8n/di");
28
+ const permissions_1 = require("@n8n/permissions");
29
+ const typeorm_1 = require("@n8n/typeorm");
30
+ const n8n_workflow_1 = require("n8n-workflow");
31
+ const active_executions_1 = require("../../active-executions");
32
+ const credentials_finder_service_1 = require("../../credentials/credentials-finder.service");
33
+ const credentials_service_1 = require("../../credentials/credentials.service");
34
+ const event_service_1 = require("../../events/event.service");
35
+ const execution_persistence_1 = require("../../executions/execution-persistence");
36
+ const license_1 = require("../../license");
37
+ const load_nodes_and_credentials_1 = require("../../load-nodes-and-credentials");
38
+ const data_table_repository_1 = require("../../modules/data-table/data-table.repository");
39
+ const data_table_service_1 = require("../../modules/data-table/data-table.service");
40
+ const source_control_preferences_service_ee_1 = require("../../modules/source-control.ee/source-control-preferences.service.ee");
41
+ const check_access_1 = require("../../permissions.ee/check-access");
42
+ const dynamic_node_parameters_service_1 = require("../../services/dynamic-node-parameters.service");
43
+ const folder_service_1 = require("../../services/folder.service");
44
+ const project_service_ee_1 = require("../../services/project.service.ee");
45
+ const role_service_1 = require("../../services/role.service");
46
+ const tag_service_1 = require("../../services/tag.service");
47
+ const workflow_finder_service_1 = require("../../workflows/workflow-finder.service");
48
+ const workflow_history_service_1 = require("../../workflows/workflow-history/workflow-history.service");
49
+ const workflow_service_1 = require("../../workflows/workflow.service");
50
+ const workflow_service_ee_1 = require("../../workflows/workflow.service.ee");
51
+ const workflow_runner_1 = require("../../workflow-runner");
52
+ const workflow_execute_additional_data_1 = require("../../workflow-execute-additional-data");
53
+ let InstanceAiAdapterService = class InstanceAiAdapterService {
54
+ async getNodesFromCache() {
55
+ if (this.nodesCache && Date.now() < this.nodesCache.expiresAt) {
56
+ return await this.nodesCache.promise;
57
+ }
58
+ const promise = this.loadNodesAndCredentials.collectTypes().then((result) => result.nodes);
59
+ this.nodesCache = { promise, expiresAt: Date.now() + this.NODES_CACHE_TTL_MS };
60
+ promise.catch(() => {
61
+ this.nodesCache = null;
62
+ });
63
+ return await promise;
64
+ }
65
+ constructor(logger, globalConfig, workflowService, workflowFinderService, workflowRepository, sharedWorkflowRepository, projectRepository, executionRepository, credentialsService, credentialsFinderService, activeExecutions, workflowRunner, loadNodesAndCredentials, dataTableService, dataTableRepository, dynamicNodeParametersService, folderService, projectService, tagService, sourceControlPreferencesService, settingsService, workflowHistoryService, enterpriseWorkflowService, license, executionPersistence, eventService, roleService) {
66
+ this.workflowService = workflowService;
67
+ this.workflowFinderService = workflowFinderService;
68
+ this.workflowRepository = workflowRepository;
69
+ this.sharedWorkflowRepository = sharedWorkflowRepository;
70
+ this.projectRepository = projectRepository;
71
+ this.executionRepository = executionRepository;
72
+ this.credentialsService = credentialsService;
73
+ this.credentialsFinderService = credentialsFinderService;
74
+ this.activeExecutions = activeExecutions;
75
+ this.workflowRunner = workflowRunner;
76
+ this.loadNodesAndCredentials = loadNodesAndCredentials;
77
+ this.dataTableService = dataTableService;
78
+ this.dataTableRepository = dataTableRepository;
79
+ this.dynamicNodeParametersService = dynamicNodeParametersService;
80
+ this.folderService = folderService;
81
+ this.projectService = projectService;
82
+ this.tagService = tagService;
83
+ this.sourceControlPreferencesService = sourceControlPreferencesService;
84
+ this.settingsService = settingsService;
85
+ this.workflowHistoryService = workflowHistoryService;
86
+ this.enterpriseWorkflowService = enterpriseWorkflowService;
87
+ this.license = license;
88
+ this.executionPersistence = executionPersistence;
89
+ this.eventService = eventService;
90
+ this.roleService = roleService;
91
+ this.nodesCache = null;
92
+ this.NODES_CACHE_TTL_MS = 5 * 60 * 1000;
93
+ this.webResearchCache = new web_research_1.LRUCache({
94
+ maxEntries: 100,
95
+ ttlMs: 15 * 60 * 1000,
96
+ });
97
+ this.searchCache = new web_research_1.LRUCache({
98
+ maxEntries: 100,
99
+ ttlMs: 15 * 60 * 1000,
100
+ });
101
+ this.logger = logger.scoped('instance-ai');
102
+ this.allowSendingParameterValues = globalConfig.ai.allowSendingParameterValues;
103
+ }
104
+ createContext(user, options) {
105
+ const { filesystemService, searchProxyConfig, pushRef } = options ?? {};
106
+ return {
107
+ userId: user.id,
108
+ workflowService: this.createWorkflowAdapter(user),
109
+ executionService: this.createExecutionAdapter(user, pushRef),
110
+ credentialService: this.createCredentialAdapter(user),
111
+ nodeService: this.createNodeAdapter(user),
112
+ dataTableService: this.createDataTableAdapter(user),
113
+ webResearchService: this.createWebResearchAdapter(user, searchProxyConfig),
114
+ workspaceService: this.createWorkspaceAdapter(user),
115
+ licenseHints: this.buildLicenseHints(),
116
+ ...(filesystemService ? { filesystemService } : {}),
117
+ };
118
+ }
119
+ buildLicenseHints() {
120
+ const hints = [];
121
+ if (!this.license.isLicensed('feat:namedVersions')) {
122
+ hints.push('**Named workflow versions** — naming and describing workflow versions (update-workflow-version) is available on the Pro plan and above.');
123
+ }
124
+ if (!this.license.isLicensed('feat:folders')) {
125
+ hints.push('**Folders** — organizing workflows into folders (list-folders, create-folder, delete-folder, move-workflow-to-folder) is available on registered Community Edition or paid plans.');
126
+ }
127
+ return hints;
128
+ }
129
+ createProjectScopeHelpers(user) {
130
+ const { projectRepository } = this;
131
+ let personalProjectIdPromise = null;
132
+ const getPersonalProjectId = async () => {
133
+ personalProjectIdPromise ??= projectRepository
134
+ .getPersonalProjectForUserOrFail(user.id)
135
+ .then((p) => p.id);
136
+ return await personalProjectIdPromise;
137
+ };
138
+ const assertProjectScope = async (scopes, projectId) => {
139
+ const allowed = await (0, check_access_1.userHasScopes)(user, scopes, false, { projectId });
140
+ if (!allowed) {
141
+ throw new Error('User does not have the required permissions in this project');
142
+ }
143
+ };
144
+ const resolveProjectId = async (scopes, providedProjectId) => {
145
+ const projectId = providedProjectId ?? (await getPersonalProjectId());
146
+ await assertProjectScope(scopes, projectId);
147
+ return projectId;
148
+ };
149
+ return { getPersonalProjectId, assertProjectScope, resolveProjectId };
150
+ }
151
+ createWorkflowAdapter(user) {
152
+ const { workflowService, workflowFinderService, workflowRepository, sharedWorkflowRepository, workflowHistoryService, enterpriseWorkflowService, license, allowSendingParameterValues, } = this;
153
+ const { resolveProjectId } = this.createProjectScopeHelpers(user);
154
+ const redactParameters = !allowSendingParameterValues;
155
+ return {
156
+ async list(options) {
157
+ const { workflows } = await workflowService.getMany(user, {
158
+ take: options?.limit ?? 50,
159
+ filter: {
160
+ isArchived: false,
161
+ ...(options?.query ? { query: options.query } : {}),
162
+ },
163
+ });
164
+ return workflows
165
+ .filter((wf) => 'versionId' in wf)
166
+ .map((wf) => ({
167
+ id: wf.id,
168
+ name: wf.name,
169
+ versionId: wf.versionId,
170
+ activeVersionId: wf.activeVersionId ?? null,
171
+ createdAt: wf.createdAt.toISOString(),
172
+ updatedAt: wf.updatedAt.toISOString(),
173
+ }));
174
+ },
175
+ async get(workflowId) {
176
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
177
+ 'workflow:read',
178
+ ]);
179
+ if (!workflow) {
180
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
181
+ }
182
+ return toWorkflowDetail(workflow, { redactParameters });
183
+ },
184
+ async archive(workflowId) {
185
+ await workflowService.archive(user, workflowId, { skipArchived: true });
186
+ },
187
+ async delete(workflowId) {
188
+ await workflowService.delete(user, workflowId);
189
+ },
190
+ async publish(workflowId, options) {
191
+ const wf = await workflowService.activateWorkflow(user, workflowId, {
192
+ versionId: options?.versionId,
193
+ name: options?.name,
194
+ description: options?.description,
195
+ });
196
+ if (!wf.activeVersionId) {
197
+ throw new Error(`Workflow ${workflowId} was not activated — no active version set`);
198
+ }
199
+ return { activeVersionId: wf.activeVersionId };
200
+ },
201
+ async unpublish(workflowId) {
202
+ await workflowService.deactivateWorkflow(user, workflowId);
203
+ },
204
+ async getAsWorkflowJSON(workflowId) {
205
+ const wf = await workflowFinderService.findWorkflowForUser(workflowId, user, [
206
+ 'workflow:read',
207
+ ]);
208
+ if (!wf)
209
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
210
+ return toWorkflowJSON(wf, { redactParameters });
211
+ },
212
+ async createFromWorkflowJSON(json, options) {
213
+ const projectId = await resolveProjectId(['workflow:create'], options?.projectId);
214
+ const settings = (json.settings ?? {});
215
+ if (settings.redactionPolicy !== undefined) {
216
+ const canUpdateRedaction = await (0, check_access_1.userHasScopes)(user, ['workflow:updateRedactionSetting'], false, { projectId });
217
+ if (!canUpdateRedaction) {
218
+ delete settings.redactionPolicy;
219
+ }
220
+ }
221
+ const newWorkflow = workflowRepository.create({
222
+ name: json.name,
223
+ nodes: [],
224
+ connections: {},
225
+ settings,
226
+ active: false,
227
+ versionId: (0, node_crypto_1.randomUUID)(),
228
+ });
229
+ const saved = await workflowRepository.save(newWorkflow);
230
+ await sharedWorkflowRepository.save(sharedWorkflowRepository.create({
231
+ role: 'workflow:owner',
232
+ projectId,
233
+ workflow: saved,
234
+ }));
235
+ let updateData = workflowRepository.create({
236
+ name: json.name,
237
+ nodes: json.nodes,
238
+ connections: json.connections,
239
+ settings,
240
+ pinData: sdkPinDataToRuntime(json.pinData),
241
+ });
242
+ if (license.isSharingEnabled()) {
243
+ updateData = await enterpriseWorkflowService.preventTampering(updateData, saved.id, user);
244
+ }
245
+ const updated = await workflowService.update(user, updateData, saved.id);
246
+ return toWorkflowDetail(updated, { redactParameters });
247
+ },
248
+ async updateFromWorkflowJSON(workflowId, json, _options) {
249
+ const settings = (json.settings ?? {});
250
+ if (settings.redactionPolicy !== undefined) {
251
+ const canUpdateRedaction = await (0, check_access_1.userHasScopes)(user, ['workflow:updateRedactionSetting'], false, { workflowId });
252
+ if (!canUpdateRedaction) {
253
+ delete settings.redactionPolicy;
254
+ }
255
+ }
256
+ let updateData = workflowRepository.create({
257
+ name: json.name,
258
+ nodes: json.nodes,
259
+ connections: json.connections,
260
+ settings,
261
+ pinData: sdkPinDataToRuntime(json.pinData),
262
+ });
263
+ if (license.isSharingEnabled()) {
264
+ updateData = await enterpriseWorkflowService.preventTampering(updateData, workflowId, user);
265
+ }
266
+ const updated = await workflowService.update(user, updateData, workflowId);
267
+ return toWorkflowDetail(updated, { redactParameters });
268
+ },
269
+ async listVersions(workflowId, options) {
270
+ const take = options?.limit ?? 20;
271
+ const skip = options?.skip ?? 0;
272
+ const versions = await workflowHistoryService.getList(user, workflowId, take, skip);
273
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
274
+ 'workflow:read',
275
+ ]);
276
+ const activeVersionId = workflow?.activeVersionId ?? null;
277
+ const currentDraftVersionId = workflow?.versionId ?? null;
278
+ return versions.map((v) => ({
279
+ versionId: v.versionId,
280
+ name: v.name ?? null,
281
+ description: v.description ?? null,
282
+ authors: v.authors,
283
+ createdAt: v.createdAt.toISOString(),
284
+ autosaved: v.autosaved ?? false,
285
+ isActive: v.versionId === activeVersionId,
286
+ isCurrentDraft: v.versionId === currentDraftVersionId,
287
+ }));
288
+ },
289
+ async getVersion(workflowId, versionId) {
290
+ const version = await workflowHistoryService.getVersion(user, workflowId, versionId);
291
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
292
+ 'workflow:read',
293
+ ]);
294
+ const activeVersionId = workflow?.activeVersionId ?? null;
295
+ const currentDraftVersionId = workflow?.versionId ?? null;
296
+ return {
297
+ versionId: version.versionId,
298
+ name: version.name ?? null,
299
+ description: version.description ?? null,
300
+ authors: version.authors,
301
+ createdAt: version.createdAt.toISOString(),
302
+ autosaved: version.autosaved ?? false,
303
+ isActive: version.versionId === activeVersionId,
304
+ isCurrentDraft: version.versionId === currentDraftVersionId,
305
+ nodes: (version.nodes ?? []).map((n) => ({
306
+ name: n.name,
307
+ type: n.type,
308
+ parameters: redactParameters ? undefined : n.parameters,
309
+ position: n.position,
310
+ })),
311
+ connections: version.connections,
312
+ };
313
+ },
314
+ async restoreVersion(workflowId, versionId) {
315
+ const version = await workflowHistoryService.getVersion(user, workflowId, versionId);
316
+ const updateData = workflowRepository.create({
317
+ nodes: version.nodes,
318
+ connections: version.connections,
319
+ });
320
+ await workflowService.update(user, updateData, workflowId);
321
+ },
322
+ ...(this.license.isLicensed('feat:namedVersions')
323
+ ? {
324
+ async updateVersion(workflowId, versionId, data) {
325
+ await workflowHistoryService.updateVersionForUser(user, workflowId, versionId, data);
326
+ },
327
+ }
328
+ : {}),
329
+ };
330
+ }
331
+ createExecutionAdapter(user, pushRef) {
332
+ const { workflowFinderService, workflowRunner, activeExecutions, executionRepository, allowSendingParameterValues, license, roleService, } = this;
333
+ const DEFAULT_TIMEOUT_MS = 5 * constants_1.Time.minutes.toMilliseconds;
334
+ const MAX_TIMEOUT_MS = 10 * constants_1.Time.minutes.toMilliseconds;
335
+ const assertExecutionAccess = async (executionId, scopes = ['workflow:read']) => {
336
+ const execution = await executionRepository.findSingleExecution(executionId, {
337
+ includeData: false,
338
+ });
339
+ if (!execution) {
340
+ throw new Error(`Execution ${executionId} not found`);
341
+ }
342
+ const workflow = await workflowFinderService.findWorkflowForUser(execution.workflowId, user, scopes);
343
+ if (!workflow) {
344
+ throw new Error(`Execution ${executionId} not found`);
345
+ }
346
+ return execution;
347
+ };
348
+ return {
349
+ async list(options) {
350
+ const scope = 'workflow:read';
351
+ let sharingOptions;
352
+ if (license.isSharingEnabled()) {
353
+ const projectRoles = await roleService.rolesWithScope('project', [scope]);
354
+ const workflowRoles = await roleService.rolesWithScope('workflow', [scope]);
355
+ sharingOptions = { scopes: [scope], projectRoles, workflowRoles };
356
+ }
357
+ else {
358
+ sharingOptions = {
359
+ workflowRoles: ['workflow:owner'],
360
+ projectRoles: [permissions_1.PROJECT_OWNER_ROLE_SLUG],
361
+ };
362
+ }
363
+ const query = {
364
+ kind: 'range',
365
+ range: { limit: options?.limit ?? 20, lastId: undefined, firstId: undefined },
366
+ order: { startedAt: 'DESC' },
367
+ user,
368
+ sharingOptions,
369
+ ...(options?.workflowId ? { workflowId: options.workflowId } : {}),
370
+ ...(options?.status
371
+ ? {
372
+ status: [options.status],
373
+ }
374
+ : {}),
375
+ };
376
+ const executions = await executionRepository.findManyByRangeQuery(query);
377
+ return executions.map((e) => ({
378
+ id: e.id,
379
+ workflowId: e.workflowId,
380
+ workflowName: e.workflowName ?? '',
381
+ status: e.status,
382
+ startedAt: String(e.startedAt ?? ''),
383
+ finishedAt: e.stoppedAt ? String(e.stoppedAt) : undefined,
384
+ mode: e.mode,
385
+ }));
386
+ },
387
+ async run(workflowId, inputData, options) {
388
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
389
+ 'workflow:execute',
390
+ ]);
391
+ if (!workflow) {
392
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
393
+ }
394
+ const nodes = workflow.nodes ?? [];
395
+ const triggerNode = options?.triggerNodeName
396
+ ? (nodes.find((n) => n.name === options.triggerNodeName) ?? findTriggerNode(nodes))
397
+ : findTriggerNode(nodes);
398
+ const runData = {
399
+ executionMode: triggerNode
400
+ ? getExecutionModeForTrigger(triggerNode)
401
+ : 'manual',
402
+ workflowData: workflow,
403
+ userId: user.id,
404
+ pushRef,
405
+ };
406
+ const workflowPinData = workflow.pinData ?? {};
407
+ const overridePinData = options?.pinData
408
+ ? (sdkPinDataToRuntime(options.pinData) ?? {})
409
+ : {};
410
+ const basePinData = { ...workflowPinData, ...overridePinData };
411
+ if (inputData && triggerNode) {
412
+ const triggerPinData = getPinDataForTrigger(triggerNode, inputData);
413
+ const mergedPinData = { ...basePinData, ...triggerPinData };
414
+ runData.startNodes = [{ name: triggerNode.name, sourceData: null }];
415
+ runData.pinData = mergedPinData;
416
+ runData.executionData = (0, n8n_workflow_1.createRunExecutionData)({
417
+ startData: {},
418
+ resultData: { pinData: mergedPinData, runData: {} },
419
+ executionData: {
420
+ contextData: {},
421
+ metadata: {},
422
+ nodeExecutionStack: [
423
+ {
424
+ node: triggerNode,
425
+ data: { main: [triggerPinData[triggerNode.name]] },
426
+ source: null,
427
+ },
428
+ ],
429
+ waitingExecution: {},
430
+ waitingExecutionSource: {},
431
+ },
432
+ });
433
+ }
434
+ else if (triggerNode) {
435
+ runData.triggerToStartFrom = { name: triggerNode.name };
436
+ if (Object.keys(basePinData).length > 0) {
437
+ runData.pinData = basePinData;
438
+ }
439
+ }
440
+ else if (Object.keys(basePinData).length > 0) {
441
+ runData.pinData = basePinData;
442
+ }
443
+ const executionId = await workflowRunner.run(runData);
444
+ const timeoutMs = Math.min(options?.timeout ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
445
+ if (activeExecutions.has(executionId)) {
446
+ let timeoutId;
447
+ const timeoutPromise = new Promise((_, reject) => {
448
+ timeoutId = setTimeout(() => {
449
+ reject(new Error(`Execution timed out after ${timeoutMs}ms`));
450
+ }, timeoutMs);
451
+ });
452
+ try {
453
+ await Promise.race([
454
+ activeExecutions.getPostExecutePromise(executionId),
455
+ timeoutPromise,
456
+ ]);
457
+ clearTimeout(timeoutId);
458
+ }
459
+ catch (error) {
460
+ clearTimeout(timeoutId);
461
+ if (error instanceof Error && error.message.includes('timed out')) {
462
+ try {
463
+ activeExecutions.stopExecution(executionId, new n8n_workflow_1.TimeoutExecutionCancelledError(executionId));
464
+ }
465
+ catch {
466
+ }
467
+ return {
468
+ executionId,
469
+ status: 'error',
470
+ error: `Execution timed out after ${timeoutMs}ms and was cancelled`,
471
+ };
472
+ }
473
+ throw error;
474
+ }
475
+ }
476
+ return await extractExecutionResult(executionRepository, executionId, allowSendingParameterValues);
477
+ },
478
+ async getStatus(executionId) {
479
+ await assertExecutionAccess(executionId);
480
+ const isRunning = activeExecutions.has(executionId);
481
+ if (isRunning) {
482
+ return { executionId, status: 'running' };
483
+ }
484
+ return await extractExecutionResult(executionRepository, executionId, allowSendingParameterValues);
485
+ },
486
+ async getResult(executionId) {
487
+ await assertExecutionAccess(executionId);
488
+ if (activeExecutions.has(executionId)) {
489
+ await activeExecutions.getPostExecutePromise(executionId);
490
+ }
491
+ return await extractExecutionResult(executionRepository, executionId, allowSendingParameterValues);
492
+ },
493
+ async stop(executionId) {
494
+ await assertExecutionAccess(executionId, ['workflow:execute']);
495
+ if (!activeExecutions.has(executionId)) {
496
+ return {
497
+ success: false,
498
+ message: `Execution ${executionId} is not currently running`,
499
+ };
500
+ }
501
+ try {
502
+ activeExecutions.stopExecution(executionId, new n8n_workflow_1.TimeoutExecutionCancelledError(executionId));
503
+ return { success: true, message: `Execution ${executionId} cancelled` };
504
+ }
505
+ catch {
506
+ return {
507
+ success: false,
508
+ message: `Failed to cancel execution ${executionId}`,
509
+ };
510
+ }
511
+ },
512
+ async getDebugInfo(executionId) {
513
+ await assertExecutionAccess(executionId);
514
+ return await extractExecutionDebugInfo(executionRepository, executionId, allowSendingParameterValues);
515
+ },
516
+ async getNodeOutput(executionId, nodeName, options) {
517
+ await assertExecutionAccess(executionId);
518
+ if (!allowSendingParameterValues) {
519
+ return {
520
+ nodeName,
521
+ items: [],
522
+ totalItems: 0,
523
+ returned: { from: 0, to: 0 },
524
+ };
525
+ }
526
+ return await extractNodeOutput(executionRepository, executionId, nodeName, options);
527
+ },
528
+ };
529
+ }
530
+ createCredentialAdapter(user) {
531
+ const { credentialsService, credentialsFinderService, loadNodesAndCredentials } = this;
532
+ return {
533
+ async list(options) {
534
+ const credentials = await credentialsService.getMany(user, {
535
+ listQueryOptions: {
536
+ filter: options?.type ? { type: options.type } : undefined,
537
+ },
538
+ includeGlobal: true,
539
+ });
540
+ return credentials.map((c) => ({
541
+ id: c.id,
542
+ name: c.name,
543
+ type: c.type,
544
+ createdAt: c.createdAt.toISOString(),
545
+ updatedAt: c.updatedAt.toISOString(),
546
+ }));
547
+ },
548
+ async get(credentialId) {
549
+ const credential = await credentialsService.getOne(user, credentialId, false);
550
+ return {
551
+ id: credential.id,
552
+ name: credential.name,
553
+ type: credential.type,
554
+ createdAt: credential.createdAt.toISOString(),
555
+ updatedAt: credential.updatedAt.toISOString(),
556
+ };
557
+ },
558
+ async delete(credentialId) {
559
+ await credentialsService.delete(user, credentialId);
560
+ },
561
+ async test(credentialId) {
562
+ const credential = await credentialsFinderService.findCredentialForUser(credentialId, user, ['credential:read']);
563
+ if (!credential) {
564
+ throw new Error(`Credential ${credentialId} not found or not accessible`);
565
+ }
566
+ const credentialsToTest = {
567
+ id: credential.id,
568
+ name: credential.name,
569
+ type: credential.type,
570
+ data: credentialsService.decrypt(credential, true),
571
+ };
572
+ const result = await credentialsService.test(user.id, credentialsToTest);
573
+ return {
574
+ success: result.status === 'OK',
575
+ message: result.message,
576
+ };
577
+ },
578
+ async isTestable(credentialType) {
579
+ try {
580
+ const credClass = loadNodesAndCredentials.getCredential(credentialType);
581
+ if (credClass.type.test)
582
+ return true;
583
+ const known = loadNodesAndCredentials.knownCredentials;
584
+ const supportedNodes = known[credentialType]?.supportedNodes ?? [];
585
+ for (const nodeName of supportedNodes) {
586
+ try {
587
+ const loaded = loadNodesAndCredentials.getNode(nodeName);
588
+ const nodeInstance = loaded.type;
589
+ const nodeDesc = 'nodeVersions' in nodeInstance
590
+ ? Object.values(nodeInstance.nodeVersions).pop()?.description
591
+ : nodeInstance.description;
592
+ const hasTestedBy = nodeDesc?.credentials?.some((cred) => cred.name === credentialType && cred.testedBy);
593
+ if (hasTestedBy)
594
+ return true;
595
+ }
596
+ catch {
597
+ continue;
598
+ }
599
+ }
600
+ return false;
601
+ }
602
+ catch {
603
+ return false;
604
+ }
605
+ },
606
+ async getDocumentationUrl(credentialType) {
607
+ try {
608
+ const credClass = loadNodesAndCredentials.getCredential(credentialType);
609
+ const slug = credClass.type.documentationUrl;
610
+ if (!slug)
611
+ return null;
612
+ if (slug.startsWith('http'))
613
+ return slug;
614
+ return `https://docs.n8n.io/integrations/builtin/credentials/${slug}/`;
615
+ }
616
+ catch {
617
+ return null;
618
+ }
619
+ },
620
+ getCredentialFields(credentialType) {
621
+ try {
622
+ const allTypes = [credentialType];
623
+ const known = loadNodesAndCredentials.knownCredentials;
624
+ for (const typeName of allTypes) {
625
+ const extendsArr = known[typeName]?.extends ?? [];
626
+ allTypes.push(...extendsArr);
627
+ }
628
+ const fields = [];
629
+ const seen = new Set();
630
+ for (const typeName of allTypes) {
631
+ try {
632
+ const credClass = loadNodesAndCredentials.getCredential(typeName);
633
+ for (const prop of credClass.type.properties) {
634
+ if (prop.type === 'hidden' || seen.has(prop.name))
635
+ continue;
636
+ seen.add(prop.name);
637
+ fields.push({
638
+ name: prop.name,
639
+ displayName: prop.displayName,
640
+ type: prop.type,
641
+ required: prop.required ?? false,
642
+ description: prop.description,
643
+ });
644
+ }
645
+ }
646
+ catch {
647
+ }
648
+ }
649
+ return fields;
650
+ }
651
+ catch {
652
+ return [];
653
+ }
654
+ },
655
+ async searchCredentialTypes(query) {
656
+ const q = query.toLowerCase().trim();
657
+ if (!q)
658
+ return [];
659
+ const known = loadNodesAndCredentials.knownCredentials;
660
+ const results = [];
661
+ for (const typeName of Object.keys(known)) {
662
+ if (typeName.toLowerCase().includes(q)) {
663
+ try {
664
+ const credClass = loadNodesAndCredentials.getCredential(typeName);
665
+ results.push({
666
+ type: typeName,
667
+ displayName: credClass.type.displayName,
668
+ });
669
+ }
670
+ catch {
671
+ results.push({ type: typeName, displayName: typeName });
672
+ }
673
+ continue;
674
+ }
675
+ try {
676
+ const credClass = loadNodesAndCredentials.getCredential(typeName);
677
+ if (credClass.type.displayName.toLowerCase().includes(q)) {
678
+ results.push({
679
+ type: typeName,
680
+ displayName: credClass.type.displayName,
681
+ });
682
+ }
683
+ }
684
+ catch {
685
+ }
686
+ }
687
+ return results;
688
+ },
689
+ };
690
+ }
691
+ createDataTableAdapter(user) {
692
+ const { dataTableService, dataTableRepository, sourceControlPreferencesService } = this;
693
+ const assertInstanceNotReadOnly = () => {
694
+ if (sourceControlPreferencesService.getPreferences().branchReadOnly) {
695
+ throw new Error('Cannot modify data tables on a protected instance. This instance is in read-only mode.');
696
+ }
697
+ };
698
+ const { resolveProjectId } = this.createProjectScopeHelpers(user);
699
+ const resolveProjectIdForTable = async (scopes, dataTableId) => {
700
+ const allowed = await (0, check_access_1.userHasScopes)(user, scopes, false, { dataTableId });
701
+ if (!allowed) {
702
+ throw new Error(`Data table "${dataTableId}" not found`);
703
+ }
704
+ const table = await dataTableRepository.findOneByOrFail({ id: dataTableId });
705
+ return table.projectId;
706
+ };
707
+ return {
708
+ async list(options) {
709
+ const projectId = await resolveProjectId(['dataTable:listProject'], options?.projectId);
710
+ const { data: tables } = await dataTableService.getManyAndCount({
711
+ filter: { projectId },
712
+ });
713
+ return tables.map((t) => ({
714
+ id: t.id,
715
+ name: t.name,
716
+ projectId,
717
+ columns: t.columns.map((c) => ({ id: c.id, name: c.name, type: c.type })),
718
+ createdAt: t.createdAt.toISOString(),
719
+ updatedAt: t.updatedAt.toISOString(),
720
+ }));
721
+ },
722
+ async create(name, columns, options) {
723
+ assertInstanceNotReadOnly();
724
+ const projectId = await resolveProjectId(['dataTable:create'], options?.projectId);
725
+ const result = await dataTableService.createDataTable(projectId, { name, columns });
726
+ return {
727
+ id: result.id,
728
+ name: result.name,
729
+ projectId,
730
+ columns: result.columns.map((c) => ({ id: c.id, name: c.name, type: c.type })),
731
+ createdAt: result.createdAt.toISOString(),
732
+ updatedAt: result.updatedAt.toISOString(),
733
+ };
734
+ },
735
+ async delete(dataTableId) {
736
+ assertInstanceNotReadOnly();
737
+ const projectId = await resolveProjectIdForTable(['dataTable:delete'], dataTableId);
738
+ await dataTableService.deleteDataTable(dataTableId, projectId);
739
+ },
740
+ async getSchema(dataTableId) {
741
+ const projectId = await resolveProjectIdForTable(['dataTable:read'], dataTableId);
742
+ const columns = await dataTableService.getColumns(dataTableId, projectId);
743
+ return columns.map((c, index) => ({
744
+ id: c.id,
745
+ name: c.name,
746
+ type: c.type,
747
+ index,
748
+ }));
749
+ },
750
+ async addColumn(dataTableId, column) {
751
+ assertInstanceNotReadOnly();
752
+ const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
753
+ const result = await dataTableService.addColumn(dataTableId, projectId, column);
754
+ return {
755
+ id: result.id,
756
+ name: result.name,
757
+ type: result.type,
758
+ index: result.index,
759
+ };
760
+ },
761
+ async deleteColumn(dataTableId, columnId) {
762
+ assertInstanceNotReadOnly();
763
+ const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
764
+ await dataTableService.deleteColumn(dataTableId, projectId, columnId);
765
+ },
766
+ async renameColumn(dataTableId, columnId, newName) {
767
+ assertInstanceNotReadOnly();
768
+ const projectId = await resolveProjectIdForTable(['dataTable:update'], dataTableId);
769
+ await dataTableService.renameColumn(dataTableId, projectId, columnId, {
770
+ name: newName,
771
+ });
772
+ },
773
+ async queryRows(dataTableId, options) {
774
+ const projectId = await resolveProjectIdForTable(['dataTable:readRow'], dataTableId);
775
+ return await dataTableService.getManyRowsAndCount(dataTableId, projectId, {
776
+ take: options?.limit ?? 50,
777
+ skip: options?.offset ?? 0,
778
+ filter: options?.filter,
779
+ });
780
+ },
781
+ async insertRows(dataTableId, rows) {
782
+ assertInstanceNotReadOnly();
783
+ const projectId = await resolveProjectIdForTable(['dataTable:writeRow'], dataTableId);
784
+ const result = await dataTableService.insertRows(dataTableId, projectId, rows, 'count');
785
+ return { insertedCount: typeof result === 'number' ? result : rows.length };
786
+ },
787
+ async updateRows(dataTableId, filter, data) {
788
+ assertInstanceNotReadOnly();
789
+ const projectId = await resolveProjectIdForTable(['dataTable:writeRow'], dataTableId);
790
+ const result = await dataTableService.updateRows(dataTableId, projectId, { filter: filter, data: data }, true);
791
+ return { updatedCount: Array.isArray(result) ? result.length : 0 };
792
+ },
793
+ async deleteRows(dataTableId, filter) {
794
+ assertInstanceNotReadOnly();
795
+ const projectId = await resolveProjectIdForTable(['dataTable:writeRow'], dataTableId);
796
+ const result = await dataTableService.deleteRows(dataTableId, projectId, { filter: filter }, true);
797
+ return { deletedCount: Array.isArray(result) ? result.length : 0 };
798
+ },
799
+ };
800
+ }
801
+ createWebResearchAdapter(user, searchProxyConfig) {
802
+ const fetchCache = this.webResearchCache;
803
+ const searchCacheRef = this.searchCache;
804
+ const settingsService = this.settingsService;
805
+ const userId = user.id;
806
+ let resolvedSearchMethod;
807
+ let searchResolved = false;
808
+ const lazySearch = async (query, options) => {
809
+ if (!searchResolved) {
810
+ const config = await settingsService.resolveSearchConfig(user);
811
+ resolvedSearchMethod = this.buildSearchMethod(config.braveApiKey ?? '', config.searxngUrl ?? '', searchCacheRef, searchProxyConfig, userId);
812
+ searchResolved = true;
813
+ }
814
+ if (!resolvedSearchMethod)
815
+ return { query, results: [] };
816
+ return await resolvedSearchMethod(query, options);
817
+ };
818
+ return {
819
+ search: lazySearch,
820
+ async fetchUrl(url, options) {
821
+ const cacheKey = `${userId}:${url}`;
822
+ const cached = fetchCache.get(cacheKey);
823
+ if (cached) {
824
+ if (options?.authorizeUrl && cached.finalUrl) {
825
+ const origHost = new URL(url).hostname;
826
+ const finalHost = new URL(cached.finalUrl).hostname;
827
+ if (origHost !== finalHost) {
828
+ await options.authorizeUrl(cached.finalUrl);
829
+ }
830
+ }
831
+ return cached;
832
+ }
833
+ const page = await (0, web_research_1.fetchAndExtract)(url, {
834
+ maxContentLength: options?.maxContentLength,
835
+ maxResponseBytes: options?.maxResponseBytes,
836
+ timeoutMs: options?.timeoutMs,
837
+ authorizeUrl: options?.authorizeUrl,
838
+ });
839
+ const result = await (0, web_research_1.maybeSummarize)(page);
840
+ fetchCache.set(cacheKey, result);
841
+ return result;
842
+ },
843
+ };
844
+ }
845
+ buildSearchMethod(apiKey, searxngUrl, cache, searchProxyConfig, userId) {
846
+ const keyPrefix = userId ? `${userId}:` : '';
847
+ if (searchProxyConfig) {
848
+ return async (query, options) => {
849
+ const cacheKey = `${keyPrefix}${JSON.stringify([query, options ?? {}])}`;
850
+ const cached = cache.get(cacheKey);
851
+ if (cached)
852
+ return cached;
853
+ const result = await (0, web_research_1.braveSearch)('', query, {
854
+ ...options,
855
+ proxyConfig: searchProxyConfig,
856
+ });
857
+ cache.set(cacheKey, result);
858
+ return result;
859
+ };
860
+ }
861
+ if (apiKey) {
862
+ return async (query, options) => {
863
+ const cacheKey = `${keyPrefix}${JSON.stringify([query, options ?? {}])}`;
864
+ const cached = cache.get(cacheKey);
865
+ if (cached)
866
+ return cached;
867
+ const result = await (0, web_research_1.braveSearch)(apiKey, query, options ?? {});
868
+ cache.set(cacheKey, result);
869
+ return result;
870
+ };
871
+ }
872
+ if (searxngUrl) {
873
+ return async (query, options) => {
874
+ const cacheKey = `${keyPrefix}${JSON.stringify([query, options ?? {}])}`;
875
+ const cached = cache.get(cacheKey);
876
+ if (cached)
877
+ return cached;
878
+ const result = await (0, web_research_1.searxngSearch)(searxngUrl, query, options ?? {});
879
+ cache.set(cacheKey, result);
880
+ return result;
881
+ };
882
+ }
883
+ return undefined;
884
+ }
885
+ getNodeDefinitionDirs() {
886
+ if (!this._nodeDefinitionDirs) {
887
+ this._nodeDefinitionDirs = (0, node_definition_resolver_1.resolveBuiltinNodeDefinitionDirs)();
888
+ }
889
+ return this._nodeDefinitionDirs;
890
+ }
891
+ createNodeAdapter(user) {
892
+ const { dynamicNodeParametersService, projectRepository, credentialsFinderService } = this;
893
+ const getNodes = async () => await this.getNodesFromCache();
894
+ const findNodeByVersion = (nodes, nodeType, version) => {
895
+ if (version !== undefined) {
896
+ const exact = nodes.find((n) => {
897
+ if (n.name !== nodeType)
898
+ return false;
899
+ if (Array.isArray(n.version))
900
+ return n.version.includes(version);
901
+ return n.version === version;
902
+ });
903
+ if (exact)
904
+ return exact;
905
+ }
906
+ return nodes.find((n) => n.name === nodeType);
907
+ };
908
+ return {
909
+ async listAvailable(options) {
910
+ const nodes = await getNodes();
911
+ let filtered = nodes;
912
+ if (options?.query) {
913
+ const q = options.query.toLowerCase();
914
+ filtered = nodes.filter((n) => n.displayName.toLowerCase().includes(q) ||
915
+ n.name.toLowerCase().includes(q) ||
916
+ n.description?.toLowerCase().includes(q));
917
+ }
918
+ return filtered.map((n) => ({
919
+ name: n.name,
920
+ displayName: n.displayName,
921
+ description: n.description ?? '',
922
+ group: n.group ?? [],
923
+ version: Array.isArray(n.version) ? n.version[n.version.length - 1] : n.version,
924
+ }));
925
+ },
926
+ async listSearchable() {
927
+ const nodes = await getNodes();
928
+ const toStringArray = (value) => {
929
+ if (typeof value === 'string')
930
+ return value;
931
+ return value.map((v) => (typeof v === 'string' ? v : v.type));
932
+ };
933
+ return nodes.map((n) => {
934
+ const result = {
935
+ name: n.name,
936
+ displayName: n.displayName,
937
+ description: n.description ?? '',
938
+ version: n.version,
939
+ inputs: toStringArray(n.inputs),
940
+ outputs: toStringArray(n.outputs),
941
+ };
942
+ if (n.codex?.alias) {
943
+ result.codex = { alias: n.codex.alias };
944
+ }
945
+ if (n.builderHint) {
946
+ result.builderHint = {};
947
+ if (n.builderHint.message) {
948
+ result.builderHint.message = n.builderHint.message;
949
+ }
950
+ if (n.builderHint.inputs) {
951
+ const inputs = {};
952
+ for (const [key, config] of Object.entries(n.builderHint.inputs)) {
953
+ inputs[key] = {
954
+ required: config.required,
955
+ ...(config.displayOptions
956
+ ? { displayOptions: config.displayOptions }
957
+ : {}),
958
+ };
959
+ }
960
+ result.builderHint.inputs = inputs;
961
+ }
962
+ }
963
+ return result;
964
+ });
965
+ },
966
+ async getDescription(nodeType, version) {
967
+ const nodes = await getNodes();
968
+ let desc = version !== undefined
969
+ ? nodes.find((n) => {
970
+ if (n.name !== nodeType)
971
+ return false;
972
+ if (Array.isArray(n.version))
973
+ return n.version.includes(version);
974
+ return n.version === version;
975
+ })
976
+ : undefined;
977
+ if (!desc) {
978
+ desc = nodes.find((n) => n.name === nodeType);
979
+ }
980
+ if (!desc) {
981
+ throw new Error(`Node type ${nodeType} not found`);
982
+ }
983
+ return {
984
+ name: desc.name,
985
+ displayName: desc.displayName,
986
+ description: desc.description ?? '',
987
+ group: desc.group ?? [],
988
+ version: Array.isArray(desc.version)
989
+ ? desc.version[desc.version.length - 1]
990
+ : desc.version,
991
+ properties: desc.properties.map((p) => ({
992
+ displayName: p.displayName,
993
+ name: p.name,
994
+ type: p.type,
995
+ required: p.required,
996
+ description: p.description,
997
+ default: p.default,
998
+ options: p.options
999
+ ?.filter((o) => typeof o === 'object' && o !== null && 'name' in o && 'value' in o)
1000
+ .map((o) => ({
1001
+ name: String(o.name),
1002
+ value: o.value,
1003
+ })),
1004
+ })),
1005
+ credentials: desc.credentials?.map((c) => ({
1006
+ name: c.name,
1007
+ required: c.required,
1008
+ })),
1009
+ inputs: Array.isArray(desc.inputs) ? desc.inputs.map(String) : [],
1010
+ outputs: Array.isArray(desc.outputs) ? desc.outputs.map(String) : [],
1011
+ ...(desc.webhooks ? { webhooks: desc.webhooks } : {}),
1012
+ ...(desc.polling ? { polling: desc.polling } : {}),
1013
+ ...(desc.triggerPanel !== undefined ? { triggerPanel: desc.triggerPanel } : {}),
1014
+ };
1015
+ },
1016
+ getNodeTypeDefinition: async (nodeType, options) => {
1017
+ const result = (0, node_definition_resolver_1.resolveNodeTypeDefinition)(nodeType, this.getNodeDefinitionDirs(), options);
1018
+ if (result.error) {
1019
+ return { content: '', error: result.error };
1020
+ }
1021
+ return { content: result.content, version: result.version };
1022
+ },
1023
+ listDiscriminators: async (nodeType) => {
1024
+ return (0, node_definition_resolver_1.listNodeDiscriminators)(nodeType, this.getNodeDefinitionDirs());
1025
+ },
1026
+ getParameterIssues: async (nodeType, typeVersion, parameters) => {
1027
+ const nodes = await getNodes();
1028
+ const desc = findNodeByVersion(nodes, nodeType, typeVersion);
1029
+ if (!desc)
1030
+ return {};
1031
+ const nodeProperties = desc.properties;
1032
+ const paramsWithDefaults = { ...parameters };
1033
+ for (const prop of nodeProperties) {
1034
+ if (!(prop.name in paramsWithDefaults) && prop.default !== undefined) {
1035
+ paramsWithDefaults[prop.name] = prop.default;
1036
+ }
1037
+ }
1038
+ const minimalNode = {
1039
+ id: '',
1040
+ name: '',
1041
+ type: nodeType,
1042
+ typeVersion,
1043
+ parameters: paramsWithDefaults,
1044
+ position: [0, 0],
1045
+ };
1046
+ const issues = n8n_workflow_1.NodeHelpers.getNodeParametersIssues(nodeProperties, minimalNode, desc);
1047
+ const allIssues = issues?.parameters ?? {};
1048
+ const topLevelPropsByName = new Map();
1049
+ for (const prop of nodeProperties) {
1050
+ const existing = topLevelPropsByName.get(prop.name);
1051
+ if (existing) {
1052
+ existing.push(prop);
1053
+ }
1054
+ else {
1055
+ topLevelPropsByName.set(prop.name, [prop]);
1056
+ }
1057
+ }
1058
+ const filteredIssues = {};
1059
+ for (const [key, value] of Object.entries(allIssues)) {
1060
+ const props = topLevelPropsByName.get(key);
1061
+ if (!props)
1062
+ continue;
1063
+ const isDisplayed = props.some((prop) => {
1064
+ if (prop.type === 'hidden')
1065
+ return false;
1066
+ if (prop.displayOptions &&
1067
+ !n8n_workflow_1.NodeHelpers.displayParameter(paramsWithDefaults, prop, minimalNode, desc)) {
1068
+ return false;
1069
+ }
1070
+ return true;
1071
+ });
1072
+ if (!isDisplayed)
1073
+ continue;
1074
+ filteredIssues[key] = value;
1075
+ }
1076
+ return filteredIssues;
1077
+ },
1078
+ getNodeCredentialTypes: async (nodeType, typeVersion, parameters, existingCredentials) => {
1079
+ const nodes = await getNodes();
1080
+ const desc = findNodeByVersion(nodes, nodeType, typeVersion);
1081
+ if (!desc)
1082
+ return [];
1083
+ const credentialTypes = new Set();
1084
+ const nodeCredentials = desc.credentials ?? [];
1085
+ const paramsWithDefaultsForCreds = { ...parameters };
1086
+ for (const prop of desc.properties) {
1087
+ if (!(prop.name in paramsWithDefaultsForCreds) && prop.default !== undefined) {
1088
+ paramsWithDefaultsForCreds[prop.name] = prop.default;
1089
+ }
1090
+ }
1091
+ const credCheckNode = {
1092
+ id: '',
1093
+ name: '',
1094
+ type: nodeType,
1095
+ typeVersion,
1096
+ parameters: paramsWithDefaultsForCreds,
1097
+ position: [0, 0],
1098
+ };
1099
+ for (const cred of nodeCredentials) {
1100
+ if (cred.displayOptions) {
1101
+ if (!n8n_workflow_1.NodeHelpers.displayParameter(paramsWithDefaultsForCreds, cred, credCheckNode, desc)) {
1102
+ continue;
1103
+ }
1104
+ }
1105
+ credentialTypes.add(cred.name);
1106
+ }
1107
+ const paramsWithDefaults = { ...parameters };
1108
+ for (const prop of desc.properties) {
1109
+ if (!(prop.name in paramsWithDefaults) && prop.default !== undefined) {
1110
+ paramsWithDefaults[prop.name] = prop.default;
1111
+ }
1112
+ }
1113
+ const minimalNode = {
1114
+ id: '',
1115
+ name: '',
1116
+ type: nodeType,
1117
+ typeVersion,
1118
+ parameters: paramsWithDefaults,
1119
+ position: [0, 0],
1120
+ };
1121
+ const issues = n8n_workflow_1.NodeHelpers.getNodeParametersIssues(desc.properties, minimalNode, desc);
1122
+ const credentialIssues = issues?.credentials ?? {};
1123
+ for (const credType of Object.keys(credentialIssues)) {
1124
+ credentialTypes.add(credType);
1125
+ }
1126
+ if (existingCredentials) {
1127
+ for (const credType of Object.keys(existingCredentials)) {
1128
+ credentialTypes.add(credType);
1129
+ }
1130
+ }
1131
+ return Array.from(credentialTypes);
1132
+ },
1133
+ exploreResources: async (params) => {
1134
+ const credential = await credentialsFinderService.findCredentialForUser(params.credentialId, user, ['credential:read']);
1135
+ if (!credential || credential.type !== params.credentialType) {
1136
+ throw new Error(`Credential ${params.credentialId} not found or not accessible`);
1137
+ }
1138
+ const nodeTypeAndVersion = {
1139
+ name: params.nodeType,
1140
+ version: params.version,
1141
+ };
1142
+ const currentNodeParameters = (params.currentNodeParameters ?? {});
1143
+ const credentials = {
1144
+ [credential.type]: { id: credential.id, name: credential.name },
1145
+ };
1146
+ if (!currentNodeParameters.authentication) {
1147
+ const nodes = await getNodes();
1148
+ const nodeDesc = nodes.find((n) => n.name === params.nodeType);
1149
+ if (nodeDesc) {
1150
+ const authProp = nodeDesc.properties.find((p) => p.name === 'authentication');
1151
+ if (authProp?.options) {
1152
+ for (const opt of authProp.options) {
1153
+ if (typeof opt === 'object' && 'value' in opt && typeof opt.value === 'string') {
1154
+ const credTypes = nodeDesc.credentials
1155
+ ?.filter((c) => {
1156
+ const show = c.displayOptions?.show?.authentication;
1157
+ return Array.isArray(show) && show.includes(opt.value);
1158
+ })
1159
+ .map((c) => c.name);
1160
+ if (credTypes?.includes(params.credentialType)) {
1161
+ currentNodeParameters.authentication = opt.value;
1162
+ break;
1163
+ }
1164
+ }
1165
+ }
1166
+ }
1167
+ }
1168
+ }
1169
+ const personalProject = await projectRepository.getPersonalProjectForUserOrFail(user.id);
1170
+ const additionalData = await (0, workflow_execute_additional_data_1.getBase)({
1171
+ userId: user.id,
1172
+ projectId: personalProject.id,
1173
+ currentNodeParameters,
1174
+ });
1175
+ try {
1176
+ if (params.methodType === 'listSearch') {
1177
+ const result = await dynamicNodeParametersService.getResourceLocatorResults(params.methodName, '', additionalData, nodeTypeAndVersion, currentNodeParameters, credentials, params.filter, params.paginationToken);
1178
+ return {
1179
+ results: (result.results ?? []).map((r) => ({
1180
+ name: String(r.name),
1181
+ value: r.value,
1182
+ url: r.url,
1183
+ })),
1184
+ paginationToken: result.paginationToken,
1185
+ };
1186
+ }
1187
+ const options = await dynamicNodeParametersService.getOptionsViaMethodName(params.methodName, '', additionalData, nodeTypeAndVersion, currentNodeParameters, credentials);
1188
+ return {
1189
+ results: options.map((o) => ({
1190
+ name: String(o.name),
1191
+ value: o.value,
1192
+ description: o.description,
1193
+ })),
1194
+ };
1195
+ }
1196
+ catch (error) {
1197
+ this.logger.error('Failed to load options for explore-resources', {
1198
+ error: error instanceof Error ? error.message : String(error),
1199
+ });
1200
+ throw error;
1201
+ }
1202
+ },
1203
+ };
1204
+ }
1205
+ createWorkspaceAdapter(user) {
1206
+ const { projectService, folderService, tagService, workflowFinderService, workflowService, executionRepository, executionPersistence, eventService, } = this;
1207
+ const { assertProjectScope } = this.createProjectScopeHelpers(user);
1208
+ const adapter = {
1209
+ async getProject(projectId) {
1210
+ const project = await projectService.getProjectWithScope(user, projectId, ['project:read']);
1211
+ if (!project)
1212
+ return null;
1213
+ return { id: project.id, name: project.name, type: project.type };
1214
+ },
1215
+ async listProjects() {
1216
+ const projects = await projectService.getAccessibleProjects(user);
1217
+ return projects.map((p) => ({
1218
+ id: p.id,
1219
+ name: p.name,
1220
+ type: p.type,
1221
+ }));
1222
+ },
1223
+ ...(this.license.isLicensed('feat:folders')
1224
+ ? {
1225
+ async listFolders(projectId) {
1226
+ await assertProjectScope(['folder:list'], projectId);
1227
+ const [folders] = await folderService.getManyAndCount(projectId, { take: 100 });
1228
+ return folders.map((f) => ({
1229
+ id: f.id,
1230
+ name: f.name,
1231
+ parentFolderId: f.parentFolderId,
1232
+ }));
1233
+ },
1234
+ async createFolder(name, projectId, parentFolderId) {
1235
+ await assertProjectScope(['folder:create'], projectId);
1236
+ const folder = await folderService.createFolder({ name, parentFolderId: parentFolderId ?? undefined }, projectId);
1237
+ return {
1238
+ id: folder.id,
1239
+ name: folder.name,
1240
+ parentFolderId: folder.parentFolderId ?? null,
1241
+ };
1242
+ },
1243
+ async deleteFolder(folderId, projectId, transferToFolderId) {
1244
+ await assertProjectScope(['folder:delete'], projectId);
1245
+ await folderService.deleteFolder(user, folderId, projectId, {
1246
+ transferToFolderId: transferToFolderId ?? undefined,
1247
+ });
1248
+ },
1249
+ async moveWorkflowToFolder(workflowId, folderId) {
1250
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
1251
+ 'workflow:update',
1252
+ ]);
1253
+ if (!workflow) {
1254
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
1255
+ }
1256
+ await workflowService.update(user, workflow, workflowId, {
1257
+ parentFolderId: folderId,
1258
+ });
1259
+ },
1260
+ }
1261
+ : {}),
1262
+ async tagWorkflow(workflowId, tagNames) {
1263
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
1264
+ 'workflow:update',
1265
+ ]);
1266
+ if (!workflow) {
1267
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
1268
+ }
1269
+ if (!(0, permissions_1.hasGlobalScope)(user, 'tag:list')) {
1270
+ throw new Error('User does not have permission to list tags');
1271
+ }
1272
+ const existingTags = await tagService.getAll();
1273
+ const tagMap = new Map(existingTags.map((t) => [t.name.toLowerCase(), t]));
1274
+ const tagIds = [];
1275
+ for (const tagName of tagNames) {
1276
+ const existing = tagMap.get(tagName.toLowerCase());
1277
+ if (existing) {
1278
+ tagIds.push(existing.id);
1279
+ }
1280
+ else {
1281
+ if (!(0, permissions_1.hasGlobalScope)(user, 'tag:create')) {
1282
+ throw new Error('User does not have permission to create tags');
1283
+ }
1284
+ const entity = tagService.toEntity({ name: tagName });
1285
+ const saved = await tagService.save(entity, 'create');
1286
+ tagIds.push(saved.id);
1287
+ }
1288
+ }
1289
+ await workflowService.update(user, workflow, workflowId, { tagIds });
1290
+ return tagNames;
1291
+ },
1292
+ async listTags() {
1293
+ if (!(0, permissions_1.hasGlobalScope)(user, 'tag:list')) {
1294
+ throw new Error('User does not have permission to list tags');
1295
+ }
1296
+ const tags = await tagService.getAll();
1297
+ return tags.map((t) => ({ id: t.id, name: t.name }));
1298
+ },
1299
+ async createTag(name) {
1300
+ if (!(0, permissions_1.hasGlobalScope)(user, 'tag:create')) {
1301
+ throw new Error('User does not have permission to create tags');
1302
+ }
1303
+ const entity = tagService.toEntity({ name });
1304
+ const saved = await tagService.save(entity, 'create');
1305
+ return { id: saved.id, name: saved.name };
1306
+ },
1307
+ async cleanupTestExecutions(workflowId, options) {
1308
+ const workflow = await workflowFinderService.findWorkflowForUser(workflowId, user, [
1309
+ 'workflow:execute',
1310
+ ]);
1311
+ if (!workflow) {
1312
+ throw new Error(`Workflow ${workflowId} not found or not accessible`);
1313
+ }
1314
+ const olderThanHours = options?.olderThanHours ?? 1;
1315
+ const cutoff = new Date(Date.now() - olderThanHours * 60 * 60 * 1000);
1316
+ const executions = await executionRepository.find({
1317
+ select: ['id'],
1318
+ where: {
1319
+ workflowId,
1320
+ mode: 'manual',
1321
+ startedAt: (0, typeorm_1.LessThan)(cutoff),
1322
+ },
1323
+ });
1324
+ if (executions.length === 0) {
1325
+ return { deletedCount: 0 };
1326
+ }
1327
+ const ids = executions.map((e) => e.id);
1328
+ await executionPersistence.hardDeleteBy({
1329
+ filters: { workflowId, mode: 'manual' },
1330
+ accessibleWorkflowIds: [workflowId],
1331
+ deleteConditions: { deleteBefore: cutoff },
1332
+ });
1333
+ eventService.emit('execution-deleted', {
1334
+ user: {
1335
+ id: user.id,
1336
+ email: user.email,
1337
+ firstName: user.firstName,
1338
+ lastName: user.lastName,
1339
+ role: user.role,
1340
+ },
1341
+ executionIds: ids,
1342
+ deleteBefore: cutoff,
1343
+ });
1344
+ return { deletedCount: ids.length };
1345
+ },
1346
+ };
1347
+ return adapter;
1348
+ }
1349
+ };
1350
+ exports.InstanceAiAdapterService = InstanceAiAdapterService;
1351
+ exports.InstanceAiAdapterService = InstanceAiAdapterService = __decorate([
1352
+ (0, di_1.Service)(),
1353
+ __metadata("design:paramtypes", [backend_common_1.Logger,
1354
+ config_1.GlobalConfig,
1355
+ workflow_service_1.WorkflowService,
1356
+ workflow_finder_service_1.WorkflowFinderService,
1357
+ db_1.WorkflowRepository,
1358
+ db_1.SharedWorkflowRepository,
1359
+ db_1.ProjectRepository,
1360
+ db_1.ExecutionRepository,
1361
+ credentials_service_1.CredentialsService,
1362
+ credentials_finder_service_1.CredentialsFinderService,
1363
+ active_executions_1.ActiveExecutions,
1364
+ workflow_runner_1.WorkflowRunner,
1365
+ load_nodes_and_credentials_1.LoadNodesAndCredentials,
1366
+ data_table_service_1.DataTableService,
1367
+ data_table_repository_1.DataTableRepository,
1368
+ dynamic_node_parameters_service_1.DynamicNodeParametersService,
1369
+ folder_service_1.FolderService,
1370
+ project_service_ee_1.ProjectService,
1371
+ tag_service_1.TagService,
1372
+ source_control_preferences_service_ee_1.SourceControlPreferencesService,
1373
+ instance_ai_settings_service_1.InstanceAiSettingsService,
1374
+ workflow_history_service_1.WorkflowHistoryService,
1375
+ workflow_service_ee_1.EnterpriseWorkflowService,
1376
+ license_1.License,
1377
+ execution_persistence_1.ExecutionPersistence,
1378
+ event_service_1.EventService,
1379
+ role_service_1.RoleService])
1380
+ ], InstanceAiAdapterService);
1381
+ const MAX_RESULT_CHARS = 20_000;
1382
+ const MAX_NODE_OUTPUT_CHARS = 1_000;
1383
+ function truncateResultData(resultData) {
1384
+ const serialized = JSON.stringify(resultData);
1385
+ if (serialized.length <= MAX_RESULT_CHARS)
1386
+ return resultData;
1387
+ const truncated = {};
1388
+ for (const [nodeName, items] of Object.entries(resultData)) {
1389
+ if (!Array.isArray(items) || items.length === 0) {
1390
+ truncated[nodeName] = items;
1391
+ continue;
1392
+ }
1393
+ const itemStr = JSON.stringify(items[0]);
1394
+ const preview = itemStr.length > MAX_NODE_OUTPUT_CHARS
1395
+ ? `${itemStr.slice(0, MAX_NODE_OUTPUT_CHARS)}…`
1396
+ : items[0];
1397
+ truncated[nodeName] = {
1398
+ _itemCount: items.length,
1399
+ _truncated: true,
1400
+ _firstItemPreview: preview,
1401
+ };
1402
+ }
1403
+ return truncated;
1404
+ }
1405
+ function wrapResultDataEntries(data) {
1406
+ const wrapped = {};
1407
+ for (const [nodeName, value] of Object.entries(data)) {
1408
+ wrapped[nodeName] = (0, instance_ai_1.wrapUntrustedData)(JSON.stringify(value, null, 2), 'execution-output', `node:${nodeName}`);
1409
+ }
1410
+ return wrapped;
1411
+ }
1412
+ async function extractExecutionResult(executionRepository, executionId, includeOutputData = true) {
1413
+ const execution = await executionRepository.findSingleExecution(executionId, {
1414
+ includeData: true,
1415
+ unflattenData: true,
1416
+ });
1417
+ if (!execution) {
1418
+ return { executionId, status: 'unknown' };
1419
+ }
1420
+ const status = execution.status === 'error' || execution.status === 'crashed'
1421
+ ? 'error'
1422
+ : execution.status === 'running' || execution.status === 'new'
1423
+ ? 'running'
1424
+ : execution.status === 'waiting'
1425
+ ? 'waiting'
1426
+ : 'success';
1427
+ const resultData = {};
1428
+ if (includeOutputData) {
1429
+ const runData = execution.data?.resultData?.runData;
1430
+ if (runData) {
1431
+ for (const [nodeName, nodeRuns] of Object.entries(runData)) {
1432
+ const lastRun = nodeRuns[nodeRuns.length - 1];
1433
+ if (lastRun?.data?.main) {
1434
+ const outputItems = lastRun.data.main
1435
+ .flat()
1436
+ .filter((item) => item !== null && item !== undefined)
1437
+ .map((item) => item.json);
1438
+ if (outputItems.length > 0) {
1439
+ resultData[nodeName] = truncateNodeOutput(outputItems);
1440
+ }
1441
+ }
1442
+ }
1443
+ }
1444
+ }
1445
+ const errorMessage = execution.data?.resultData?.error?.message;
1446
+ return {
1447
+ executionId,
1448
+ status,
1449
+ data: Object.keys(resultData).length > 0
1450
+ ? wrapResultDataEntries(truncateResultData(resultData))
1451
+ : undefined,
1452
+ error: errorMessage,
1453
+ startedAt: execution.startedAt?.toISOString(),
1454
+ finishedAt: execution.stoppedAt?.toISOString(),
1455
+ };
1456
+ }
1457
+ const MAX_NODE_OUTPUT_BYTES = 5_000;
1458
+ function truncateNodeOutput(items) {
1459
+ const serialized = JSON.stringify(items);
1460
+ if (serialized.length <= MAX_NODE_OUTPUT_BYTES)
1461
+ return items;
1462
+ const truncated = [];
1463
+ let size = 2;
1464
+ for (const item of items) {
1465
+ const itemStr = JSON.stringify(item);
1466
+ if (size + itemStr.length + 2 > MAX_NODE_OUTPUT_BYTES)
1467
+ break;
1468
+ truncated.push(item);
1469
+ size += itemStr.length + 1;
1470
+ }
1471
+ return {
1472
+ items: truncated,
1473
+ truncated: true,
1474
+ totalItems: items.length,
1475
+ shownItems: truncated.length,
1476
+ message: `Output truncated: showing ${truncated.length} of ${items.length} items. Use get-node-output to retrieve full data for this node.`,
1477
+ };
1478
+ }
1479
+ const MAX_ITEM_CHARS = 50_000;
1480
+ async function extractNodeOutput(executionRepository, executionId, nodeName, options) {
1481
+ const execution = await executionRepository.findSingleExecution(executionId, {
1482
+ includeData: true,
1483
+ unflattenData: true,
1484
+ });
1485
+ if (!execution) {
1486
+ throw new Error(`Execution ${executionId} not found`);
1487
+ }
1488
+ const runData = execution.data?.resultData?.runData;
1489
+ if (!runData?.[nodeName]) {
1490
+ throw new Error(`Node "${nodeName}" not found in execution ${executionId}`);
1491
+ }
1492
+ const nodeRuns = runData[nodeName];
1493
+ const lastRun = nodeRuns[nodeRuns.length - 1];
1494
+ const startIndex = options?.startIndex ?? 0;
1495
+ const maxItems = Math.min(options?.maxItems ?? 10, 50);
1496
+ let index = 0;
1497
+ let totalItems = 0;
1498
+ const collected = [];
1499
+ for (const output of lastRun?.data?.main ?? []) {
1500
+ for (const item of output ?? []) {
1501
+ totalItems++;
1502
+ if (index >= startIndex && collected.length < maxItems) {
1503
+ collected.push(item.json);
1504
+ }
1505
+ index++;
1506
+ }
1507
+ }
1508
+ const capped = collected.map((item) => {
1509
+ const str = JSON.stringify(item);
1510
+ if (str.length > MAX_ITEM_CHARS) {
1511
+ return {
1512
+ _truncatedItem: true,
1513
+ preview: str.slice(0, MAX_ITEM_CHARS),
1514
+ originalLength: str.length,
1515
+ };
1516
+ }
1517
+ return item;
1518
+ });
1519
+ return {
1520
+ nodeName,
1521
+ items: capped.map((item, i) => (0, instance_ai_1.wrapUntrustedData)(JSON.stringify(item, null, 2), 'execution-output', `node:${nodeName}[${startIndex + i}]`)),
1522
+ totalItems,
1523
+ returned: { from: startIndex, to: startIndex + capped.length },
1524
+ };
1525
+ }
1526
+ const KNOWN_TRIGGER_TYPES = new Set([
1527
+ n8n_workflow_1.CHAT_TRIGGER_NODE_TYPE,
1528
+ n8n_workflow_1.FORM_TRIGGER_NODE_TYPE,
1529
+ n8n_workflow_1.WEBHOOK_NODE_TYPE,
1530
+ n8n_workflow_1.SCHEDULE_TRIGGER_NODE_TYPE,
1531
+ ]);
1532
+ function findTriggerNode(nodes) {
1533
+ const known = nodes.find((n) => KNOWN_TRIGGER_TYPES.has(n.type));
1534
+ if (known)
1535
+ return known;
1536
+ return nodes.find((n) => n.type.includes('Trigger') || n.type.includes('trigger') || n.type.includes('webhook'));
1537
+ }
1538
+ function getExecutionModeForTrigger(node) {
1539
+ switch (node.type) {
1540
+ case n8n_workflow_1.WEBHOOK_NODE_TYPE:
1541
+ return 'webhook';
1542
+ case n8n_workflow_1.CHAT_TRIGGER_NODE_TYPE:
1543
+ return 'chat';
1544
+ case n8n_workflow_1.FORM_TRIGGER_NODE_TYPE:
1545
+ case n8n_workflow_1.SCHEDULE_TRIGGER_NODE_TYPE:
1546
+ return 'trigger';
1547
+ default:
1548
+ return 'manual';
1549
+ }
1550
+ }
1551
+ function getPinDataForTrigger(node, inputData) {
1552
+ switch (node.type) {
1553
+ case n8n_workflow_1.CHAT_TRIGGER_NODE_TYPE:
1554
+ return {
1555
+ [node.name]: [
1556
+ {
1557
+ json: {
1558
+ sessionId: `instance-ai-${Date.now()}`,
1559
+ action: 'sendMessage',
1560
+ chatInput: typeof inputData.chatInput === 'string'
1561
+ ? inputData.chatInput
1562
+ : JSON.stringify(inputData),
1563
+ },
1564
+ },
1565
+ ],
1566
+ };
1567
+ case n8n_workflow_1.FORM_TRIGGER_NODE_TYPE:
1568
+ return {
1569
+ [node.name]: [
1570
+ {
1571
+ json: {
1572
+ submittedAt: new Date().toISOString(),
1573
+ formMode: 'instanceAi',
1574
+ ...inputData,
1575
+ },
1576
+ },
1577
+ ],
1578
+ };
1579
+ case n8n_workflow_1.WEBHOOK_NODE_TYPE:
1580
+ return {
1581
+ [node.name]: [
1582
+ {
1583
+ json: {
1584
+ headers: {},
1585
+ query: {},
1586
+ body: inputData,
1587
+ },
1588
+ },
1589
+ ],
1590
+ };
1591
+ case n8n_workflow_1.SCHEDULE_TRIGGER_NODE_TYPE: {
1592
+ const now = new Date();
1593
+ return {
1594
+ [node.name]: [
1595
+ {
1596
+ json: {
1597
+ timestamp: now.toISOString(),
1598
+ 'Readable date': now.toLocaleString(),
1599
+ 'Day of week': now.toLocaleDateString('en-US', { weekday: 'long' }),
1600
+ Year: String(now.getFullYear()),
1601
+ Month: now.toLocaleDateString('en-US', { month: 'long' }),
1602
+ 'Day of month': String(now.getDate()).padStart(2, '0'),
1603
+ Hour: String(now.getHours()).padStart(2, '0'),
1604
+ Minute: String(now.getMinutes()).padStart(2, '0'),
1605
+ Second: String(now.getSeconds()).padStart(2, '0'),
1606
+ },
1607
+ },
1608
+ ],
1609
+ };
1610
+ }
1611
+ default:
1612
+ return {
1613
+ [node.name]: [{ json: inputData }],
1614
+ };
1615
+ }
1616
+ }
1617
+ async function extractExecutionDebugInfo(executionRepository, executionId, includeOutputData = true) {
1618
+ const execution = await executionRepository.findSingleExecution(executionId, {
1619
+ includeData: true,
1620
+ unflattenData: true,
1621
+ });
1622
+ if (!execution) {
1623
+ return {
1624
+ executionId,
1625
+ status: 'unknown',
1626
+ nodeTrace: [],
1627
+ };
1628
+ }
1629
+ const baseResult = await extractExecutionResult(executionRepository, executionId, includeOutputData);
1630
+ const runData = execution.data?.resultData?.runData;
1631
+ const nodeTrace = [];
1632
+ let failedNode;
1633
+ if (runData) {
1634
+ const workflowNodes = execution.workflowData?.nodes ?? [];
1635
+ const nodeTypeMap = new Map(workflowNodes.map((n) => [n.name, n.type]));
1636
+ for (const [nodeName, nodeRuns] of Object.entries(runData)) {
1637
+ const lastRun = nodeRuns[nodeRuns.length - 1];
1638
+ if (!lastRun)
1639
+ continue;
1640
+ const hasError = lastRun.error !== undefined;
1641
+ const nodeType = nodeTypeMap.get(nodeName) ?? 'unknown';
1642
+ nodeTrace.push({
1643
+ name: nodeName,
1644
+ type: nodeType,
1645
+ status: hasError ? 'error' : 'success',
1646
+ startedAt: lastRun.startTime !== undefined ? new Date(lastRun.startTime).toISOString() : undefined,
1647
+ finishedAt: lastRun.startTime !== undefined && lastRun.executionTime !== undefined
1648
+ ? new Date(lastRun.startTime + lastRun.executionTime).toISOString()
1649
+ : undefined,
1650
+ });
1651
+ if (hasError && !failedNode) {
1652
+ failedNode = {
1653
+ name: nodeName,
1654
+ type: nodeType,
1655
+ error: lastRun.error instanceof Error
1656
+ ? lastRun.error.message
1657
+ : String(lastRun.error ?? 'Unknown error'),
1658
+ inputData: includeOutputData
1659
+ ? (() => {
1660
+ const inputItems = lastRun.data?.main
1661
+ ?.flat()
1662
+ .filter((item) => item !== null && item !== undefined)
1663
+ .map((item) => item.json);
1664
+ if (inputItems && inputItems.length > 0) {
1665
+ const raw = inputItems[0];
1666
+ return (0, instance_ai_1.wrapUntrustedData)(JSON.stringify(raw, null, 2), 'execution-output', `failed-node-input:${nodeName}`);
1667
+ }
1668
+ return undefined;
1669
+ })()
1670
+ : undefined,
1671
+ };
1672
+ }
1673
+ }
1674
+ }
1675
+ return {
1676
+ ...baseResult,
1677
+ failedNode,
1678
+ nodeTrace,
1679
+ };
1680
+ }
1681
+ function sdkPinDataToRuntime(pinData) {
1682
+ if (!pinData || Object.keys(pinData).length === 0)
1683
+ return undefined;
1684
+ const result = {};
1685
+ for (const [nodeName, items] of Object.entries(pinData)) {
1686
+ result[nodeName] = items.map((item) => ({ json: (item ?? {}) }));
1687
+ }
1688
+ return result;
1689
+ }
1690
+ function toWorkflowJSON(workflow, options) {
1691
+ const redact = options?.redactParameters ?? false;
1692
+ return {
1693
+ id: workflow.id,
1694
+ name: workflow.name,
1695
+ nodes: (workflow.nodes ?? []).map((n) => ({
1696
+ id: n.id ?? '',
1697
+ name: n.name,
1698
+ type: n.type,
1699
+ typeVersion: n.typeVersion,
1700
+ position: n.position,
1701
+ parameters: redact ? {} : n.parameters,
1702
+ credentials: n.credentials,
1703
+ webhookId: n.webhookId,
1704
+ disabled: n.disabled,
1705
+ notes: n.notes,
1706
+ })),
1707
+ connections: workflow.connections,
1708
+ settings: workflow.settings,
1709
+ };
1710
+ }
1711
+ function toWorkflowDetail(workflow, options) {
1712
+ const redact = options?.redactParameters ?? false;
1713
+ return {
1714
+ id: workflow.id,
1715
+ name: workflow.name,
1716
+ versionId: workflow.versionId,
1717
+ activeVersionId: workflow.activeVersionId ?? null,
1718
+ createdAt: workflow.createdAt.toISOString(),
1719
+ updatedAt: workflow.updatedAt.toISOString(),
1720
+ nodes: (workflow.nodes ?? []).map((n) => ({
1721
+ name: n.name,
1722
+ type: n.type,
1723
+ parameters: redact ? undefined : n.parameters,
1724
+ position: n.position,
1725
+ webhookId: n.webhookId,
1726
+ })),
1727
+ connections: workflow.connections,
1728
+ settings: workflow.settings,
1729
+ };
1730
+ }
1731
+ //# sourceMappingURL=instance-ai.adapter.service.js.map