n8n 2.21.4 → 2.22.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 (336) hide show
  1. package/dist/active-workflow-manager.js +4 -0
  2. package/dist/active-workflow-manager.js.map +1 -1
  3. package/dist/build.tsbuildinfo +1 -1
  4. package/dist/commands/base-command.js +2 -1
  5. package/dist/commands/base-command.js.map +1 -1
  6. package/dist/commands/export/entities.d.ts +3 -0
  7. package/dist/commands/export/entities.js +8 -1
  8. package/dist/commands/export/entities.js.map +1 -1
  9. package/dist/concurrency/concurrency-control.service.d.ts +7 -2
  10. package/dist/concurrency/concurrency-control.service.js +72 -47
  11. package/dist/concurrency/concurrency-control.service.js.map +1 -1
  12. package/dist/constants.js +3 -0
  13. package/dist/constants.js.map +1 -1
  14. package/dist/controllers/e2e.controller.js +2 -0
  15. package/dist/controllers/e2e.controller.js.map +1 -1
  16. package/dist/controllers/users.controller.d.ts +1 -1
  17. package/dist/credentials/credentials.service.js.map +1 -1
  18. package/dist/evaluation.ee/evaluation-collection.service.d.ts +38 -0
  19. package/dist/evaluation.ee/evaluation-collection.service.js +327 -0
  20. package/dist/evaluation.ee/evaluation-collection.service.js.map +1 -0
  21. package/dist/evaluation.ee/evaluation-collections.controller.ee.d.ts +50 -0
  22. package/dist/evaluation.ee/evaluation-collections.controller.ee.js +148 -0
  23. package/dist/evaluation.ee/evaluation-collections.controller.ee.js.map +1 -0
  24. package/dist/evaluation.ee/evaluation-concurrency.helper.d.ts +11 -0
  25. package/dist/evaluation.ee/evaluation-concurrency.helper.js +40 -0
  26. package/dist/evaluation.ee/evaluation-concurrency.helper.js.map +1 -0
  27. package/dist/evaluation.ee/test-runner/test-runner.service.ee.d.ts +22 -6
  28. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +105 -15
  29. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
  30. package/dist/evaluation.ee/test-runs.controller.ee.d.ts +5 -6
  31. package/dist/evaluation.ee/test-runs.controller.ee.js +4 -24
  32. package/dist/evaluation.ee/test-runs.controller.ee.js.map +1 -1
  33. package/dist/interfaces.d.ts +6 -0
  34. package/dist/modules/agents/adapters/agents-credential-provider.d.ts +2 -1
  35. package/dist/modules/agents/adapters/agents-credential-provider.js +25 -24
  36. package/dist/modules/agents/adapters/agents-credential-provider.js.map +1 -1
  37. package/dist/modules/agents/agent-execution.service.js +0 -1
  38. package/dist/modules/agents/agent-execution.service.js.map +1 -1
  39. package/dist/modules/agents/agent-skills.service.d.ts +1 -2
  40. package/dist/modules/agents/agent-skills.service.js.map +1 -1
  41. package/dist/modules/agents/agent-sse-stream.d.ts +1 -1
  42. package/dist/modules/agents/agent-sse-stream.js +0 -31
  43. package/dist/modules/agents/agent-sse-stream.js.map +1 -1
  44. package/dist/modules/agents/agents.controller.d.ts +64 -37
  45. package/dist/modules/agents/agents.controller.js +54 -40
  46. package/dist/modules/agents/agents.controller.js.map +1 -1
  47. package/dist/modules/agents/agents.service.d.ts +15 -5
  48. package/dist/modules/agents/agents.service.js +79 -71
  49. package/dist/modules/agents/agents.service.js.map +1 -1
  50. package/dist/modules/agents/builder/agent-builder-preview-path.d.ts +1 -0
  51. package/dist/modules/agents/builder/agent-builder-preview-path.js +9 -0
  52. package/dist/modules/agents/builder/agent-builder-preview-path.js.map +1 -0
  53. package/dist/modules/agents/builder/agents-builder-model-recommendations.d.ts +3 -0
  54. package/dist/modules/agents/builder/agents-builder-model-recommendations.js +106 -0
  55. package/dist/modules/agents/builder/agents-builder-model-recommendations.js.map +1 -0
  56. package/dist/modules/agents/builder/agents-builder-prompts.d.ts +12 -11
  57. package/dist/modules/agents/builder/agents-builder-prompts.js +61 -32
  58. package/dist/modules/agents/builder/agents-builder-prompts.js.map +1 -1
  59. package/dist/modules/agents/builder/agents-builder-tools.service.d.ts +1 -1
  60. package/dist/modules/agents/builder/agents-builder-tools.service.js +7 -8
  61. package/dist/modules/agents/builder/agents-builder-tools.service.js.map +1 -1
  62. package/dist/modules/agents/builder/agents-builder.service.js +6 -3
  63. package/dist/modules/agents/builder/agents-builder.service.js.map +1 -1
  64. package/dist/modules/agents/builder/interactive/ask-llm.tool.js +1 -1
  65. package/dist/modules/agents/builder/interactive/ask-llm.tool.js.map +1 -1
  66. package/dist/modules/agents/builder/interactive/resolve-llm.tool.js +1 -1
  67. package/dist/modules/agents/builder/interactive/resolve-llm.tool.js.map +1 -1
  68. package/dist/modules/agents/entities/agent-execution.entity.d.ts +0 -1
  69. package/dist/modules/agents/entities/agent-execution.entity.js +0 -4
  70. package/dist/modules/agents/entities/agent-execution.entity.js.map +1 -1
  71. package/dist/modules/agents/entities/agent-observation-lock.entity.d.ts +2 -0
  72. package/dist/modules/agents/entities/agent-observation-lock.entity.js +4 -0
  73. package/dist/modules/agents/entities/agent-observation-lock.entity.js.map +1 -1
  74. package/dist/modules/agents/entities/agent-observation.entity.d.ts +9 -5
  75. package/dist/modules/agents/entities/agent-observation.entity.js +21 -11
  76. package/dist/modules/agents/entities/agent-observation.entity.js.map +1 -1
  77. package/dist/modules/agents/entities/agent-published-version.entity.d.ts +1 -2
  78. package/dist/modules/agents/entities/agent-published-version.entity.js.map +1 -1
  79. package/dist/modules/agents/entities/agent.entity.d.ts +2 -3
  80. package/dist/modules/agents/entities/agent.entity.js.map +1 -1
  81. package/dist/modules/agents/execution-recorder.d.ts +1 -8
  82. package/dist/modules/agents/execution-recorder.js +67 -42
  83. package/dist/modules/agents/execution-recorder.js.map +1 -1
  84. package/dist/modules/agents/integrations/agent-chat-bridge.d.ts +6 -4
  85. package/dist/modules/agents/integrations/agent-chat-bridge.js +22 -13
  86. package/dist/modules/agents/integrations/agent-chat-bridge.js.map +1 -1
  87. package/dist/modules/agents/integrations/agent-chat-integration.d.ts +4 -1
  88. package/dist/modules/agents/integrations/agent-chat-integration.js.map +1 -1
  89. package/dist/modules/agents/integrations/chat-integration.service.d.ts +17 -8
  90. package/dist/modules/agents/integrations/chat-integration.service.js +53 -37
  91. package/dist/modules/agents/integrations/chat-integration.service.js.map +1 -1
  92. package/dist/modules/agents/integrations/integrations-sync.d.ts +2 -2
  93. package/dist/modules/agents/integrations/integrations-sync.js +1 -1
  94. package/dist/modules/agents/integrations/integrations-sync.js.map +1 -1
  95. package/dist/modules/agents/integrations/n8n-memory.d.ts +31 -35
  96. package/dist/modules/agents/integrations/n8n-memory.js +121 -127
  97. package/dist/modules/agents/integrations/n8n-memory.js.map +1 -1
  98. package/dist/modules/agents/integrations/platforms/telegram-integration.d.ts +9 -2
  99. package/dist/modules/agents/integrations/platforms/telegram-integration.js +51 -6
  100. package/dist/modules/agents/integrations/platforms/telegram-integration.js.map +1 -1
  101. package/dist/modules/agents/json-config/agent-config-composition.d.ts +2 -3
  102. package/dist/modules/agents/json-config/agent-config-composition.js.map +1 -1
  103. package/dist/modules/agents/json-config/from-json-config.d.ts +1 -2
  104. package/dist/modules/agents/json-config/from-json-config.js +31 -34
  105. package/dist/modules/agents/json-config/from-json-config.js.map +1 -1
  106. package/dist/modules/agents/observation-log-observer.d.ts +2 -0
  107. package/dist/modules/agents/observation-log-observer.js +10 -0
  108. package/dist/modules/agents/observation-log-observer.js.map +1 -0
  109. package/dist/modules/agents/observation-log-reflector.d.ts +2 -0
  110. package/dist/modules/agents/observation-log-reflector.js +9 -0
  111. package/dist/modules/agents/observation-log-reflector.js.map +1 -0
  112. package/dist/modules/agents/repositories/agent-published-version.repository.d.ts +1 -1
  113. package/dist/modules/agents/repositories/agent.repository.js +1 -1
  114. package/dist/modules/agents/repositories/agent.repository.js.map +1 -1
  115. package/dist/modules/agents/tools/node-tool-factory.d.ts +1 -1
  116. package/dist/modules/agents/tools/workflow-tool-factory.d.ts +1 -1
  117. package/dist/modules/agents/tools/workflow-tool-factory.js +40 -2
  118. package/dist/modules/agents/tools/workflow-tool-factory.js.map +1 -1
  119. package/dist/modules/agents/utils/execution-to-message-mapper.d.ts +6 -0
  120. package/dist/modules/agents/utils/execution-to-message-mapper.js +133 -0
  121. package/dist/modules/agents/utils/execution-to-message-mapper.js.map +1 -0
  122. package/dist/modules/chat-hub/chat-hub-workflow.service.js +9 -0
  123. package/dist/modules/chat-hub/chat-hub-workflow.service.js.map +1 -1
  124. package/dist/modules/chat-hub/chat-hub.constants.js +4 -0
  125. package/dist/modules/chat-hub/chat-hub.constants.js.map +1 -1
  126. package/dist/modules/chat-hub/chat-hub.models.service.d.ts +1 -0
  127. package/dist/modules/chat-hub/chat-hub.models.service.js +43 -0
  128. package/dist/modules/chat-hub/chat-hub.models.service.js.map +1 -1
  129. package/dist/modules/chat-hub/chat-hub.module.d.ts +3 -3
  130. package/dist/modules/chat-hub/chat-hub.settings.controller.d.ts +7 -7
  131. package/dist/modules/chat-hub/context-limits.js +1 -0
  132. package/dist/modules/chat-hub/context-limits.js.map +1 -1
  133. package/dist/modules/chat-hub/dto/chat-models-request.dto.d.ts +2 -2
  134. package/dist/modules/community-packages/community-node-types-utils.d.ts +1 -1
  135. package/dist/modules/community-packages/community-node-types-utils.js +1 -1
  136. package/dist/modules/community-packages/community-node-types-utils.js.map +1 -1
  137. package/dist/modules/community-packages/community-node-types.service.js +1 -1
  138. package/dist/modules/community-packages/community-node-types.service.js.map +1 -1
  139. package/dist/modules/data-table/utils/sql-utils.d.ts +2 -0
  140. package/dist/modules/data-table/utils/sql-utils.js +26 -9
  141. package/dist/modules/data-table/utils/sql-utils.js.map +1 -1
  142. package/dist/modules/inbound-secrets/inbound-secrets-context-hook.d.ts +10 -0
  143. package/dist/modules/inbound-secrets/inbound-secrets-context-hook.js +55 -0
  144. package/dist/modules/inbound-secrets/inbound-secrets-context-hook.js.map +1 -0
  145. package/dist/modules/inbound-secrets/inbound-secrets.config.d.ts +3 -0
  146. package/dist/modules/inbound-secrets/inbound-secrets.config.js +27 -0
  147. package/dist/modules/inbound-secrets/inbound-secrets.config.js.map +1 -0
  148. package/dist/modules/inbound-secrets/inbound-secrets.module.d.ts +4 -0
  149. package/dist/modules/inbound-secrets/inbound-secrets.module.js +61 -0
  150. package/dist/modules/inbound-secrets/inbound-secrets.module.js.map +1 -0
  151. package/dist/modules/inbound-secrets/inbound-secrets.schemas.d.ts +3 -0
  152. package/dist/modules/inbound-secrets/inbound-secrets.schemas.js +6 -0
  153. package/dist/modules/inbound-secrets/inbound-secrets.schemas.js.map +1 -0
  154. package/dist/modules/inbound-secrets/inbound-secrets.service.d.ts +17 -0
  155. package/dist/modules/inbound-secrets/inbound-secrets.service.js +76 -0
  156. package/dist/modules/inbound-secrets/inbound-secrets.service.js.map +1 -0
  157. package/dist/modules/inbound-secrets/path-traversal.d.ts +4 -0
  158. package/dist/modules/inbound-secrets/path-traversal.js +51 -0
  159. package/dist/modules/inbound-secrets/path-traversal.js.map +1 -0
  160. package/dist/modules/insights/database/repositories/insights-by-period.repository.d.ts +1 -0
  161. package/dist/modules/insights/database/repositories/insights-by-period.repository.js +19 -4
  162. package/dist/modules/insights/database/repositories/insights-by-period.repository.js.map +1 -1
  163. package/dist/modules/insights/database/repositories/insights-raw.repository.js +1 -0
  164. package/dist/modules/insights/database/repositories/insights-raw.repository.js.map +1 -1
  165. package/dist/modules/insights/insights-compaction.service.d.ts +5 -0
  166. package/dist/modules/insights/insights-compaction.service.js +93 -18
  167. package/dist/modules/insights/insights-compaction.service.js.map +1 -1
  168. package/dist/modules/insights/insights.config.d.ts +3 -0
  169. package/dist/modules/insights/insights.config.js +15 -0
  170. package/dist/modules/insights/insights.config.js.map +1 -1
  171. package/dist/modules/instance-ai/eval/eval-mocked-credentials-helper.d.ts +17 -0
  172. package/dist/modules/instance-ai/eval/eval-mocked-credentials-helper.js +61 -0
  173. package/dist/modules/instance-ai/eval/eval-mocked-credentials-helper.js.map +1 -0
  174. package/dist/modules/instance-ai/eval/execution.service.js +8 -2
  175. package/dist/modules/instance-ai/eval/execution.service.js.map +1 -1
  176. package/dist/modules/instance-ai/eval/mock-handler.d.ts +1 -0
  177. package/dist/modules/instance-ai/eval/mock-handler.js +116 -72
  178. package/dist/modules/instance-ai/eval/mock-handler.js.map +1 -1
  179. package/dist/modules/instance-ai/eval/mock-quirks.d.ts +10 -0
  180. package/dist/modules/instance-ai/eval/mock-quirks.js +25 -0
  181. package/dist/modules/instance-ai/eval/mock-quirks.js.map +1 -0
  182. package/dist/modules/instance-ai/instance-ai-settings.service.js +14 -0
  183. package/dist/modules/instance-ai/instance-ai-settings.service.js.map +1 -1
  184. package/dist/modules/instance-ai/instance-ai.adapter.service.js +25 -5
  185. package/dist/modules/instance-ai/instance-ai.adapter.service.js.map +1 -1
  186. package/dist/modules/instance-ai/instance-ai.controller.d.ts +10 -3
  187. package/dist/modules/instance-ai/instance-ai.controller.js +34 -2
  188. package/dist/modules/instance-ai/instance-ai.controller.js.map +1 -1
  189. package/dist/modules/instance-ai/instance-ai.service.d.ts +2 -1
  190. package/dist/modules/instance-ai/instance-ai.service.js +75 -29
  191. package/dist/modules/instance-ai/instance-ai.service.js.map +1 -1
  192. package/dist/modules/instance-ai/liveness/index.d.ts +1 -1
  193. package/dist/modules/instance-ai/liveness/index.js.map +1 -1
  194. package/dist/modules/instance-ai/liveness/instance-ai-liveness.service.d.ts +12 -3
  195. package/dist/modules/instance-ai/liveness/instance-ai-liveness.service.js +21 -11
  196. package/dist/modules/instance-ai/liveness/instance-ai-liveness.service.js.map +1 -1
  197. package/dist/modules/instance-ai/run-timeout-details.d.ts +8 -0
  198. package/dist/modules/instance-ai/run-timeout-details.js +3 -0
  199. package/dist/modules/instance-ai/run-timeout-details.js.map +1 -0
  200. package/dist/modules/instance-ai/run-trace-metadata.d.ts +15 -0
  201. package/dist/modules/instance-ai/run-trace-metadata.js +63 -0
  202. package/dist/modules/instance-ai/run-trace-metadata.js.map +1 -0
  203. package/dist/modules/instance-version-history/instance-version-history.controller.d.ts +5 -3
  204. package/dist/modules/instance-version-history/instance-version-history.controller.js +9 -9
  205. package/dist/modules/instance-version-history/instance-version-history.controller.js.map +1 -1
  206. package/dist/modules/mcp/mcp-api-key.service.js +1 -0
  207. package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
  208. package/dist/modules/mcp/mcp-oauth-token.service.d.ts +7 -2
  209. package/dist/modules/mcp/mcp-oauth-token.service.js +16 -6
  210. package/dist/modules/mcp/mcp-oauth-token.service.js.map +1 -1
  211. package/dist/modules/mcp/mcp-server-middleware.service.js +2 -0
  212. package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -1
  213. package/dist/modules/mcp/mcp.controller.js +1 -0
  214. package/dist/modules/mcp/mcp.controller.js.map +1 -1
  215. package/dist/modules/mcp/mcp.types.d.ts +2 -0
  216. package/dist/modules/mcp/tools/workflow-builder/credential-validation.d.ts +15 -0
  217. package/dist/modules/mcp/tools/workflow-builder/credential-validation.js +91 -0
  218. package/dist/modules/mcp/tools/workflow-builder/credential-validation.js.map +1 -0
  219. package/dist/modules/mcp/tools/workflow-builder/mcp-instructions.js +1 -1
  220. package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.d.ts +228 -3
  221. package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js +74 -60
  222. package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js.map +1 -1
  223. package/dist/modules/mcp/tools/workflow-builder/workflow-operations.d.ts +251 -0
  224. package/dist/modules/mcp/tools/workflow-builder/workflow-operations.js +447 -0
  225. package/dist/modules/mcp/tools/workflow-builder/workflow-operations.js.map +1 -0
  226. package/dist/modules/mcp-registry/mcp-registry-node-loader.d.ts +4 -3
  227. package/dist/modules/mcp-registry/mcp-registry-node-loader.js +6 -3
  228. package/dist/modules/mcp-registry/mcp-registry-node-loader.js.map +1 -1
  229. package/dist/modules/mcp-registry/mcp-registry-test.controller.d.ts +12 -0
  230. package/dist/modules/mcp-registry/mcp-registry-test.controller.js +49 -0
  231. package/dist/modules/mcp-registry/mcp-registry-test.controller.js.map +1 -0
  232. package/dist/modules/mcp-registry/mcp-registry.module.d.ts +2 -0
  233. package/dist/modules/mcp-registry/mcp-registry.module.js +12 -2
  234. package/dist/modules/mcp-registry/mcp-registry.module.js.map +1 -1
  235. package/dist/modules/mcp-registry/node-description-transform.js +16 -2
  236. package/dist/modules/mcp-registry/node-description-transform.js.map +1 -1
  237. package/dist/modules/mcp-registry/registry/mcp-registry-api.client.d.ts +8 -0
  238. package/dist/modules/mcp-registry/registry/mcp-registry-api.client.js +58 -0
  239. package/dist/modules/mcp-registry/registry/mcp-registry-api.client.js.map +1 -0
  240. package/dist/modules/mcp-registry/registry/mcp-registry-server.entity.d.ts +36 -0
  241. package/dist/modules/mcp-registry/registry/mcp-registry-server.entity.js +46 -0
  242. package/dist/modules/mcp-registry/registry/mcp-registry-server.entity.js.map +1 -0
  243. package/dist/modules/mcp-registry/registry/mcp-registry-server.repository.d.ts +5 -0
  244. package/dist/modules/mcp-registry/registry/mcp-registry-server.repository.js +26 -0
  245. package/dist/modules/mcp-registry/registry/mcp-registry-server.repository.js.map +1 -0
  246. package/dist/modules/mcp-registry/registry/mcp-registry.service.d.ts +37 -4
  247. package/dist/modules/mcp-registry/registry/mcp-registry.service.js +196 -12
  248. package/dist/modules/mcp-registry/registry/mcp-registry.service.js.map +1 -1
  249. package/dist/modules/mcp-registry/registry/mcp-registry.types.d.ts +9 -1
  250. package/dist/modules/mcp-registry/registry/mcp-registry.types.js +29 -0
  251. package/dist/modules/mcp-registry/registry/mcp-registry.types.js.map +1 -1
  252. package/dist/modules/mcp-registry/registry/mock-servers.js +2 -0
  253. package/dist/modules/mcp-registry/registry/mock-servers.js.map +1 -1
  254. package/dist/modules/otel/execution-level-tracer.js +4 -2
  255. package/dist/modules/otel/execution-level-tracer.js.map +1 -1
  256. package/dist/modules/otel/otel.constants.d.ts +1 -0
  257. package/dist/modules/otel/otel.constants.js +1 -0
  258. package/dist/modules/otel/otel.constants.js.map +1 -1
  259. package/dist/modules/otel/otel.module.d.ts +3 -0
  260. package/dist/modules/otel/otel.module.js +5 -0
  261. package/dist/modules/otel/otel.module.js.map +1 -1
  262. package/dist/modules/redaction/executions/execution-redaction.service.js +8 -3
  263. package/dist/modules/redaction/executions/execution-redaction.service.js.map +1 -1
  264. package/dist/modules/redaction/instance-redaction-enforcement.service.d.ts +14 -0
  265. package/dist/modules/redaction/instance-redaction-enforcement.service.js +91 -0
  266. package/dist/modules/redaction/instance-redaction-enforcement.service.js.map +1 -0
  267. package/dist/modules/redaction/redaction-enforcement.feature-flag.d.ts +2 -0
  268. package/dist/modules/redaction/redaction-enforcement.feature-flag.js +9 -0
  269. package/dist/modules/redaction/redaction-enforcement.feature-flag.js.map +1 -0
  270. package/dist/modules/redaction/redaction-enforcement.service.d.ts +8 -0
  271. package/dist/modules/redaction/redaction-enforcement.service.js +38 -0
  272. package/dist/modules/redaction/redaction-enforcement.service.js.map +1 -0
  273. package/dist/modules/redaction/redaction.config.d.ts +3 -0
  274. package/dist/modules/redaction/redaction.config.js +27 -0
  275. package/dist/modules/redaction/redaction.config.js.map +1 -0
  276. package/dist/modules/source-control.ee/source-control-import.service.ee.d.ts +3 -1
  277. package/dist/modules/source-control.ee/source-control-import.service.ee.js +14 -6
  278. package/dist/modules/source-control.ee/source-control-import.service.ee.js.map +1 -1
  279. package/dist/modules/source-control.ee/source-control.controller.ee.d.ts +2 -2
  280. package/dist/modules/source-control.ee/source-control.service.ee.d.ts +1 -1
  281. package/dist/modules/workflow-index/workflow-index.service.js.map +1 -1
  282. package/dist/oauth/oauth.service.js +1 -0
  283. package/dist/oauth/oauth.service.js.map +1 -1
  284. package/dist/posthog/index.d.ts +0 -1
  285. package/dist/posthog/index.js +2 -10
  286. package/dist/posthog/index.js.map +1 -1
  287. package/dist/public-api/v1/handlers/workflows/workflows.handler.js +2 -1
  288. package/dist/public-api/v1/handlers/workflows/workflows.handler.js.map +1 -1
  289. package/dist/scaling/constants.d.ts +2 -2
  290. package/dist/scaling/pubsub/pubsub.event-map.d.ts +6 -3
  291. package/dist/scaling/pubsub/pubsub.types.d.ts +3 -1
  292. package/dist/scaling/scaling.service.js +3 -2
  293. package/dist/scaling/scaling.service.js.map +1 -1
  294. package/dist/server.d.ts +1 -0
  295. package/dist/server.js +1 -0
  296. package/dist/server.js.map +1 -1
  297. package/dist/services/export.service.d.ts +6 -1
  298. package/dist/services/export.service.js +97 -1
  299. package/dist/services/export.service.js.map +1 -1
  300. package/dist/services/frontend.service.js +3 -1
  301. package/dist/services/frontend.service.js.map +1 -1
  302. package/dist/services/import.service.d.ts +2 -1
  303. package/dist/services/import.service.js +70 -22
  304. package/dist/services/import.service.js.map +1 -1
  305. package/dist/telemetry/index.d.ts +13 -1
  306. package/dist/telemetry/index.js +54 -18
  307. package/dist/telemetry/index.js.map +1 -1
  308. package/dist/{modules/community-packages → utils}/strapi-utils.js +2 -2
  309. package/dist/utils/strapi-utils.js.map +1 -0
  310. package/dist/workflows/workflow-history/workflow-history.controller.d.ts +9 -0
  311. package/dist/workflows/workflow-history/workflow-history.controller.js +17 -0
  312. package/dist/workflows/workflow-history/workflow-history.controller.js.map +1 -1
  313. package/dist/workflows/workflow-history/workflow-history.service.d.ts +16 -2
  314. package/dist/workflows/workflow-history/workflow-history.service.js +55 -1
  315. package/dist/workflows/workflow-history/workflow-history.service.js.map +1 -1
  316. package/dist/workflows/workflow.service.d.ts +3 -1
  317. package/dist/workflows/workflow.service.js +6 -2
  318. package/dist/workflows/workflow.service.js.map +1 -1
  319. package/package.json +37 -37
  320. package/dist/modules/agents/json-config/agent-json-config.d.ts +0 -1022
  321. package/dist/modules/agents/json-config/agent-json-config.js +0 -128
  322. package/dist/modules/agents/json-config/agent-json-config.js.map +0 -1
  323. package/dist/modules/agents/json-config/integration-config.d.ts +0 -61
  324. package/dist/modules/agents/json-config/integration-config.js +0 -33
  325. package/dist/modules/agents/json-config/integration-config.js.map +0 -1
  326. package/dist/modules/community-packages/strapi-utils.js.map +0 -1
  327. package/dist/modules/mcp-registry/mcp-registry-node-loader.test.d.ts +0 -1
  328. package/dist/modules/mcp-registry/mcp-registry-node-loader.test.js +0 -244
  329. package/dist/modules/mcp-registry/mcp-registry-node-loader.test.js.map +0 -1
  330. package/dist/modules/mcp-registry/node-description-transform.test.d.ts +0 -1
  331. package/dist/modules/mcp-registry/node-description-transform.test.js +0 -286
  332. package/dist/modules/mcp-registry/node-description-transform.test.js.map +0 -1
  333. package/dist/modules/mcp-registry/registry/mcp-registry.service.test.d.ts +0 -1
  334. package/dist/modules/mcp-registry/registry/mcp-registry.service.test.js +0 -41
  335. package/dist/modules/mcp-registry/registry/mcp-registry.service.test.js.map +0 -1
  336. /package/dist/{modules/community-packages → utils}/strapi-utils.d.ts +0 -0
@@ -0,0 +1,251 @@
1
+ import type { IConnections, INode, IWorkflowBase } from 'n8n-workflow';
2
+ import { z } from 'zod';
3
+ export declare const partialUpdateOperationSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
4
+ type: z.ZodLiteral<"updateNodeParameters">;
5
+ nodeName: z.ZodString;
6
+ parameters: z.ZodRecord<z.ZodString, z.ZodUnknown>;
7
+ replace: z.ZodOptional<z.ZodBoolean>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ type: "updateNodeParameters";
10
+ nodeName: string;
11
+ parameters: Record<string, unknown>;
12
+ replace?: boolean | undefined;
13
+ }, {
14
+ type: "updateNodeParameters";
15
+ nodeName: string;
16
+ parameters: Record<string, unknown>;
17
+ replace?: boolean | undefined;
18
+ }>, z.ZodObject<{
19
+ type: z.ZodLiteral<"setNodeParameter">;
20
+ nodeName: z.ZodString;
21
+ path: z.ZodString;
22
+ value: z.ZodEffects<z.ZodUnknown, {} | null, unknown>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ value: {} | null;
25
+ path: string;
26
+ type: "setNodeParameter";
27
+ nodeName: string;
28
+ }, {
29
+ path: string;
30
+ type: "setNodeParameter";
31
+ nodeName: string;
32
+ value?: unknown;
33
+ }>, z.ZodObject<{
34
+ type: z.ZodLiteral<"addNode">;
35
+ node: z.ZodObject<{
36
+ name: z.ZodString;
37
+ type: z.ZodString;
38
+ typeVersion: z.ZodNumber;
39
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
40
+ position: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodNumber, "many">, [number, number], number[]>>;
41
+ credentials: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
42
+ id: z.ZodOptional<z.ZodString>;
43
+ name: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ name: string;
46
+ id?: string | undefined;
47
+ }, {
48
+ name: string;
49
+ id?: string | undefined;
50
+ }>>>;
51
+ disabled: z.ZodOptional<z.ZodBoolean>;
52
+ notes: z.ZodOptional<z.ZodString>;
53
+ id: z.ZodOptional<z.ZodString>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ name: string;
56
+ type: string;
57
+ typeVersion: number;
58
+ id?: string | undefined;
59
+ credentials?: Record<string, {
60
+ name: string;
61
+ id?: string | undefined;
62
+ }> | undefined;
63
+ disabled?: boolean | undefined;
64
+ position?: [number, number] | undefined;
65
+ notes?: string | undefined;
66
+ parameters?: Record<string, unknown> | undefined;
67
+ }, {
68
+ name: string;
69
+ type: string;
70
+ typeVersion: number;
71
+ id?: string | undefined;
72
+ credentials?: Record<string, {
73
+ name: string;
74
+ id?: string | undefined;
75
+ }> | undefined;
76
+ disabled?: boolean | undefined;
77
+ position?: number[] | undefined;
78
+ notes?: string | undefined;
79
+ parameters?: Record<string, unknown> | undefined;
80
+ }>;
81
+ }, "strip", z.ZodTypeAny, {
82
+ type: "addNode";
83
+ node: {
84
+ name: string;
85
+ type: string;
86
+ typeVersion: number;
87
+ id?: string | undefined;
88
+ credentials?: Record<string, {
89
+ name: string;
90
+ id?: string | undefined;
91
+ }> | undefined;
92
+ disabled?: boolean | undefined;
93
+ position?: [number, number] | undefined;
94
+ notes?: string | undefined;
95
+ parameters?: Record<string, unknown> | undefined;
96
+ };
97
+ }, {
98
+ type: "addNode";
99
+ node: {
100
+ name: string;
101
+ type: string;
102
+ typeVersion: number;
103
+ id?: string | undefined;
104
+ credentials?: Record<string, {
105
+ name: string;
106
+ id?: string | undefined;
107
+ }> | undefined;
108
+ disabled?: boolean | undefined;
109
+ position?: number[] | undefined;
110
+ notes?: string | undefined;
111
+ parameters?: Record<string, unknown> | undefined;
112
+ };
113
+ }>, z.ZodObject<{
114
+ type: z.ZodLiteral<"removeNode">;
115
+ nodeName: z.ZodString;
116
+ }, "strip", z.ZodTypeAny, {
117
+ type: "removeNode";
118
+ nodeName: string;
119
+ }, {
120
+ type: "removeNode";
121
+ nodeName: string;
122
+ }>, z.ZodObject<{
123
+ type: z.ZodLiteral<"renameNode">;
124
+ oldName: z.ZodString;
125
+ newName: z.ZodString;
126
+ }, "strip", z.ZodTypeAny, {
127
+ type: "renameNode";
128
+ oldName: string;
129
+ newName: string;
130
+ }, {
131
+ type: "renameNode";
132
+ oldName: string;
133
+ newName: string;
134
+ }>, z.ZodObject<{
135
+ type: z.ZodLiteral<"addConnection">;
136
+ source: z.ZodString;
137
+ target: z.ZodString;
138
+ sourceIndex: z.ZodOptional<z.ZodNumber>;
139
+ targetIndex: z.ZodOptional<z.ZodNumber>;
140
+ connectionType: z.ZodOptional<z.ZodString>;
141
+ }, "strip", z.ZodTypeAny, {
142
+ type: "addConnection";
143
+ source: string;
144
+ target: string;
145
+ connectionType?: string | undefined;
146
+ sourceIndex?: number | undefined;
147
+ targetIndex?: number | undefined;
148
+ }, {
149
+ type: "addConnection";
150
+ source: string;
151
+ target: string;
152
+ connectionType?: string | undefined;
153
+ sourceIndex?: number | undefined;
154
+ targetIndex?: number | undefined;
155
+ }>, z.ZodObject<{
156
+ type: z.ZodLiteral<"removeConnection">;
157
+ source: z.ZodString;
158
+ target: z.ZodString;
159
+ sourceIndex: z.ZodOptional<z.ZodNumber>;
160
+ targetIndex: z.ZodOptional<z.ZodNumber>;
161
+ connectionType: z.ZodOptional<z.ZodString>;
162
+ }, "strip", z.ZodTypeAny, {
163
+ type: "removeConnection";
164
+ source: string;
165
+ target: string;
166
+ connectionType?: string | undefined;
167
+ sourceIndex?: number | undefined;
168
+ targetIndex?: number | undefined;
169
+ }, {
170
+ type: "removeConnection";
171
+ source: string;
172
+ target: string;
173
+ connectionType?: string | undefined;
174
+ sourceIndex?: number | undefined;
175
+ targetIndex?: number | undefined;
176
+ }>, z.ZodObject<{
177
+ type: z.ZodLiteral<"setNodeCredential">;
178
+ nodeName: z.ZodString;
179
+ credentialKey: z.ZodString;
180
+ credentialId: z.ZodString;
181
+ credentialName: z.ZodString;
182
+ }, "strip", z.ZodTypeAny, {
183
+ type: "setNodeCredential";
184
+ credentialName: string;
185
+ nodeName: string;
186
+ credentialId: string;
187
+ credentialKey: string;
188
+ }, {
189
+ type: "setNodeCredential";
190
+ credentialName: string;
191
+ nodeName: string;
192
+ credentialId: string;
193
+ credentialKey: string;
194
+ }>, z.ZodObject<{
195
+ type: z.ZodLiteral<"setNodePosition">;
196
+ nodeName: z.ZodString;
197
+ position: z.ZodEffects<z.ZodArray<z.ZodNumber, "many">, [number, number], number[]>;
198
+ }, "strip", z.ZodTypeAny, {
199
+ type: "setNodePosition";
200
+ nodeName: string;
201
+ position: [number, number];
202
+ }, {
203
+ type: "setNodePosition";
204
+ nodeName: string;
205
+ position: number[];
206
+ }>, z.ZodObject<{
207
+ type: z.ZodLiteral<"setNodeDisabled">;
208
+ nodeName: z.ZodString;
209
+ disabled: z.ZodBoolean;
210
+ }, "strip", z.ZodTypeAny, {
211
+ type: "setNodeDisabled";
212
+ disabled: boolean;
213
+ nodeName: string;
214
+ }, {
215
+ type: "setNodeDisabled";
216
+ disabled: boolean;
217
+ nodeName: string;
218
+ }>, z.ZodObject<{
219
+ type: z.ZodLiteral<"setWorkflowMetadata">;
220
+ name: z.ZodOptional<z.ZodString>;
221
+ description: z.ZodOptional<z.ZodString>;
222
+ }, "strip", z.ZodTypeAny, {
223
+ type: "setWorkflowMetadata";
224
+ description?: string | undefined;
225
+ name?: string | undefined;
226
+ }, {
227
+ type: "setWorkflowMetadata";
228
+ description?: string | undefined;
229
+ name?: string | undefined;
230
+ }>]>;
231
+ export type PartialUpdateOperation = z.infer<typeof partialUpdateOperationSchema>;
232
+ interface WorkflowSlice {
233
+ name: string;
234
+ description?: string;
235
+ nodes: INode[];
236
+ connections: IConnections;
237
+ }
238
+ export interface ApplyOperationsSuccess {
239
+ success: true;
240
+ workflow: WorkflowSlice;
241
+ addedNodeNames: string[];
242
+ }
243
+ export interface ApplyOperationsFailure {
244
+ success: false;
245
+ error: string;
246
+ opIndex: number;
247
+ }
248
+ export type ApplyOperationsResult = ApplyOperationsSuccess | ApplyOperationsFailure;
249
+ export declare function applyOperations(input: WorkflowSlice, operations: PartialUpdateOperation[]): ApplyOperationsResult;
250
+ export declare function toWorkflowSlice(workflow: IWorkflowBase): WorkflowSlice;
251
+ export {};
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.partialUpdateOperationSchema = void 0;
4
+ exports.applyOperations = applyOperations;
5
+ exports.toWorkflowSlice = toWorkflowSlice;
6
+ const n8n_workflow_1 = require("n8n-workflow");
7
+ const uuid_1 = require("uuid");
8
+ const zod_1 = require("zod");
9
+ const positionSchema = () => zod_1.z
10
+ .array(zod_1.z.number())
11
+ .length(2)
12
+ .transform((v) => [v[0], v[1]])
13
+ .describe('Canvas position as [x, y]');
14
+ const credentialsSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.object({ id: zod_1.z.string().optional(), name: zod_1.z.string() }));
15
+ exports.partialUpdateOperationSchema = zod_1.z.discriminatedUnion('type', [
16
+ zod_1.z.object({
17
+ type: zod_1.z.literal('updateNodeParameters'),
18
+ nodeName: zod_1.z.string().describe('Name of the existing node to update.'),
19
+ parameters: zod_1.z
20
+ .record(zod_1.z.string(), zod_1.z.unknown())
21
+ .describe('Parameter object to merge into (or replace) the node parameters.'),
22
+ replace: zod_1.z
23
+ .boolean()
24
+ .optional()
25
+ .describe('If true, replace the node parameters entirely with `parameters`. If false or omitted, deep-merge `parameters` into the existing parameters.'),
26
+ }),
27
+ zod_1.z.object({
28
+ type: zod_1.z.literal('setNodeParameter'),
29
+ nodeName: zod_1.z.string().describe('Name of the existing node to update.'),
30
+ path: zod_1.z
31
+ .string()
32
+ .min(2)
33
+ .describe('JSON Pointer (RFC 6901) path to the parameter to set, e.g. "/jsonSchema" or "/options/systemMessage". Must start with "/". Intermediate objects are created on demand. Array indices are NOT supported — to change a value inside an array, set the whole array. Use this instead of `updateNodeParameters` when you only need to set one nested key — the payload stays small regardless of the rest of the parameters object.'),
34
+ value: zod_1.z
35
+ .unknown()
36
+ .refine((v) => v !== undefined, { message: 'value is required' })
37
+ .describe('Value to set at the path. Any defined JSON value.'),
38
+ }),
39
+ zod_1.z.object({
40
+ type: zod_1.z.literal('addNode'),
41
+ node: zod_1.z
42
+ .object({
43
+ name: zod_1.z.string().describe('Unique node name. Must not collide with an existing node.'),
44
+ type: zod_1.z.string().describe('Fully qualified node type, e.g. "n8n-nodes-base.set".'),
45
+ typeVersion: zod_1.z.number(),
46
+ parameters: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
47
+ position: positionSchema().optional(),
48
+ credentials: credentialsSchema.optional(),
49
+ disabled: zod_1.z.boolean().optional(),
50
+ notes: zod_1.z.string().optional(),
51
+ id: zod_1.z.string().optional().describe('Optional node id. Generated if omitted.'),
52
+ })
53
+ .describe('The node to add to the workflow.'),
54
+ }),
55
+ zod_1.z.object({
56
+ type: zod_1.z.literal('removeNode'),
57
+ nodeName: zod_1.z
58
+ .string()
59
+ .describe('Name of the node to remove. All inbound and outbound connections are removed, including any sub-node attachments (LLM models, memory, tools) — the sub-nodes themselves remain in the workflow but become disconnected and will not be re-attached automatically. To modify a node, use updateNodeParameters or setNodeParameter instead.'),
60
+ }),
61
+ zod_1.z.object({
62
+ type: zod_1.z.literal('renameNode'),
63
+ oldName: zod_1.z.string(),
64
+ newName: zod_1.z.string().describe('New unique node name.'),
65
+ }),
66
+ zod_1.z.object({
67
+ type: zod_1.z.literal('addConnection'),
68
+ source: zod_1.z.string().describe('Name of the source node.'),
69
+ target: zod_1.z.string().describe('Name of the target node.'),
70
+ sourceIndex: zod_1.z
71
+ .number()
72
+ .int()
73
+ .nonnegative()
74
+ .optional()
75
+ .describe('Source output index. Default 0.'),
76
+ targetIndex: zod_1.z
77
+ .number()
78
+ .int()
79
+ .nonnegative()
80
+ .optional()
81
+ .describe('Target input index. Default 0.'),
82
+ connectionType: zod_1.z
83
+ .string()
84
+ .optional()
85
+ .describe('Connection type, e.g. "main" or "ai_languageModel". Default "main".'),
86
+ }),
87
+ zod_1.z.object({
88
+ type: zod_1.z.literal('removeConnection'),
89
+ source: zod_1.z.string(),
90
+ target: zod_1.z.string(),
91
+ sourceIndex: zod_1.z.number().int().nonnegative().optional(),
92
+ targetIndex: zod_1.z.number().int().nonnegative().optional(),
93
+ connectionType: zod_1.z.string().optional(),
94
+ }),
95
+ zod_1.z.object({
96
+ type: zod_1.z.literal('setNodeCredential'),
97
+ nodeName: zod_1.z.string(),
98
+ credentialKey: zod_1.z
99
+ .string()
100
+ .describe('Credential key on the node, e.g. "slackApi" or "httpHeaderAuth".'),
101
+ credentialId: zod_1.z.string(),
102
+ credentialName: zod_1.z.string(),
103
+ }),
104
+ zod_1.z.object({
105
+ type: zod_1.z.literal('setNodePosition'),
106
+ nodeName: zod_1.z.string(),
107
+ position: positionSchema(),
108
+ }),
109
+ zod_1.z.object({
110
+ type: zod_1.z.literal('setNodeDisabled'),
111
+ nodeName: zod_1.z.string(),
112
+ disabled: zod_1.z.boolean(),
113
+ }),
114
+ zod_1.z.object({
115
+ type: zod_1.z.literal('setWorkflowMetadata'),
116
+ name: zod_1.z.string().max(128).optional(),
117
+ description: zod_1.z.string().max(255).optional(),
118
+ }),
119
+ ]);
120
+ const cloneWorkflow = (workflow) => ({
121
+ name: workflow.name,
122
+ description: workflow.description,
123
+ nodes: workflow.nodes.map((node) => structuredClone(node)),
124
+ connections: structuredClone(workflow.connections),
125
+ });
126
+ const isPlainObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
127
+ const sanitizeUnsafeKeys = (value) => {
128
+ if (Array.isArray(value))
129
+ return value.map(sanitizeUnsafeKeys);
130
+ if (!isPlainObject(value))
131
+ return value;
132
+ const out = {};
133
+ for (const [key, v] of Object.entries(value)) {
134
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(key))
135
+ continue;
136
+ out[key] = sanitizeUnsafeKeys(v);
137
+ }
138
+ return out;
139
+ };
140
+ const parseJsonPointer = (path) => {
141
+ if (!path.startsWith('/'))
142
+ return null;
143
+ const tail = path.slice(1);
144
+ if (tail.length === 0)
145
+ return null;
146
+ const rawSegments = tail.split('/');
147
+ const segments = [];
148
+ for (const raw of rawSegments) {
149
+ if (/~(?:[^01]|$)/.test(raw))
150
+ return null;
151
+ const seg = raw.replace(/~1/g, '/').replace(/~0/g, '~');
152
+ if (seg.length === 0 || !(0, n8n_workflow_1.isSafeObjectProperty)(seg))
153
+ return null;
154
+ segments.push(seg);
155
+ }
156
+ return segments;
157
+ };
158
+ const setAtPointer = (root, segments, value) => {
159
+ let cursor = root;
160
+ for (let i = 0; i < segments.length - 1; i++) {
161
+ const key = segments[i];
162
+ const next = cursor[key];
163
+ if (next === undefined) {
164
+ const child = {};
165
+ cursor[key] = child;
166
+ cursor = child;
167
+ }
168
+ else if (isPlainObject(next)) {
169
+ cursor = next;
170
+ }
171
+ else {
172
+ return `cannot descend into non-object at '/${segments.slice(0, i + 1).join('/')}'`;
173
+ }
174
+ }
175
+ cursor[segments[segments.length - 1]] = sanitizeUnsafeKeys(value);
176
+ return null;
177
+ };
178
+ const deepMerge = (target, source) => {
179
+ const result = { ...target };
180
+ for (const [key, value] of Object.entries(source)) {
181
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(key))
182
+ continue;
183
+ const existing = Object.prototype.hasOwnProperty.call(result, key) ? result[key] : undefined;
184
+ if (isPlainObject(existing) && isPlainObject(value)) {
185
+ result[key] = deepMerge(existing, value);
186
+ }
187
+ else {
188
+ result[key] = sanitizeUnsafeKeys(value);
189
+ }
190
+ }
191
+ return result;
192
+ };
193
+ const removeConnectionsFor = (connections, nodeName) => {
194
+ delete connections[nodeName];
195
+ for (const sourceName of Object.keys(connections)) {
196
+ const byType = connections[sourceName];
197
+ for (const connectionType of Object.keys(byType)) {
198
+ const outputs = byType[connectionType];
199
+ for (let i = 0; i < outputs.length; i++) {
200
+ const targets = outputs[i];
201
+ if (!targets)
202
+ continue;
203
+ outputs[i] = targets.filter((c) => c.node !== nodeName);
204
+ }
205
+ if (outputs.every((o) => !o || o.length === 0)) {
206
+ delete byType[connectionType];
207
+ }
208
+ }
209
+ if (Object.keys(byType).length === 0) {
210
+ delete connections[sourceName];
211
+ }
212
+ }
213
+ };
214
+ const renameInConnections = (connections, oldName, newName) => {
215
+ if (connections[oldName]) {
216
+ connections[newName] = connections[oldName];
217
+ delete connections[oldName];
218
+ }
219
+ for (const sourceName of Object.keys(connections)) {
220
+ const byType = connections[sourceName];
221
+ for (const connectionType of Object.keys(byType)) {
222
+ const outputs = byType[connectionType];
223
+ for (const targets of outputs) {
224
+ if (!targets)
225
+ continue;
226
+ for (const conn of targets) {
227
+ if (conn.node === oldName)
228
+ conn.node = newName;
229
+ }
230
+ }
231
+ }
232
+ }
233
+ };
234
+ const ensureOutputSlot = (connections, source, connectionType, sourceIndex) => {
235
+ const byType = (connections[source] ??= {});
236
+ const outputs = (byType[connectionType] ??= []);
237
+ while (outputs.length <= sourceIndex)
238
+ outputs.push(null);
239
+ const slot = outputs[sourceIndex] ?? [];
240
+ outputs[sourceIndex] = slot;
241
+ return slot;
242
+ };
243
+ const pruneConnectionShape = (connections, source, connectionType) => {
244
+ const byType = connections[source];
245
+ if (!byType)
246
+ return;
247
+ const outputs = byType[connectionType];
248
+ if (outputs && outputs.every((o) => !o || o.length === 0)) {
249
+ delete byType[connectionType];
250
+ }
251
+ if (Object.keys(byType).length === 0) {
252
+ delete connections[source];
253
+ }
254
+ };
255
+ const fail = (opIndex, message) => ({
256
+ success: false,
257
+ error: `Operation ${opIndex} failed: ${message}`,
258
+ opIndex,
259
+ });
260
+ function applyOperations(input, operations) {
261
+ const workflow = cloneWorkflow(input);
262
+ const nodeByName = new Map(workflow.nodes.map((n) => [n.name, n]));
263
+ const addedNodeNames = new Set();
264
+ for (let i = 0; i < operations.length; i++) {
265
+ const op = operations[i];
266
+ switch (op.type) {
267
+ case 'updateNodeParameters': {
268
+ const node = nodeByName.get(op.nodeName);
269
+ if (!node)
270
+ return fail(i, `node '${op.nodeName}' not found`);
271
+ const sanitized = sanitizeUnsafeKeys(op.parameters);
272
+ const merged = op.replace
273
+ ? sanitized
274
+ : deepMerge((node.parameters ?? {}), sanitized);
275
+ node.parameters = merged;
276
+ break;
277
+ }
278
+ case 'setNodeParameter': {
279
+ const node = nodeByName.get(op.nodeName);
280
+ if (!node)
281
+ return fail(i, `node '${op.nodeName}' not found`);
282
+ const segments = parseJsonPointer(op.path);
283
+ if (!segments) {
284
+ return fail(i, `path '${op.path}' is invalid or contains unsafe segments`);
285
+ }
286
+ const params = (node.parameters ?? {});
287
+ const setError = setAtPointer(params, segments, op.value);
288
+ if (setError)
289
+ return fail(i, setError);
290
+ node.parameters = params;
291
+ break;
292
+ }
293
+ case 'addNode': {
294
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(op.node.name)) {
295
+ return fail(i, `node name '${op.node.name}' is not allowed`);
296
+ }
297
+ if (nodeByName.has(op.node.name)) {
298
+ return fail(i, `a node named '${op.node.name}' already exists`);
299
+ }
300
+ const node = {
301
+ id: op.node.id ?? (0, uuid_1.v4)(),
302
+ name: op.node.name,
303
+ type: op.node.type,
304
+ typeVersion: op.node.typeVersion,
305
+ position: op.node.position ?? [0, 0],
306
+ parameters: (sanitizeUnsafeKeys(op.node.parameters ?? {}) ?? {}),
307
+ };
308
+ if (op.node.credentials) {
309
+ const credentialEntries = [];
310
+ for (const [key, cred] of Object.entries(op.node.credentials)) {
311
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(key)) {
312
+ return fail(i, `credential key '${key}' is not allowed`);
313
+ }
314
+ credentialEntries.push([key, { id: cred.id ?? null, name: cred.name }]);
315
+ }
316
+ node.credentials = Object.fromEntries(credentialEntries);
317
+ }
318
+ if (op.node.disabled !== undefined)
319
+ node.disabled = op.node.disabled;
320
+ if (op.node.notes !== undefined)
321
+ node.notes = op.node.notes;
322
+ workflow.nodes.push(node);
323
+ nodeByName.set(node.name, node);
324
+ addedNodeNames.add(node.name);
325
+ break;
326
+ }
327
+ case 'removeNode': {
328
+ const node = nodeByName.get(op.nodeName);
329
+ if (!node)
330
+ return fail(i, `node '${op.nodeName}' not found`);
331
+ workflow.nodes.splice(workflow.nodes.indexOf(node), 1);
332
+ nodeByName.delete(op.nodeName);
333
+ removeConnectionsFor(workflow.connections, op.nodeName);
334
+ addedNodeNames.delete(op.nodeName);
335
+ break;
336
+ }
337
+ case 'renameNode': {
338
+ if (op.oldName === op.newName)
339
+ break;
340
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(op.newName)) {
341
+ return fail(i, `node name '${op.newName}' is not allowed`);
342
+ }
343
+ const node = nodeByName.get(op.oldName);
344
+ if (!node)
345
+ return fail(i, `node '${op.oldName}' not found`);
346
+ if (nodeByName.has(op.newName)) {
347
+ return fail(i, `a node named '${op.newName}' already exists`);
348
+ }
349
+ node.name = op.newName;
350
+ nodeByName.delete(op.oldName);
351
+ nodeByName.set(op.newName, node);
352
+ renameInConnections(workflow.connections, op.oldName, op.newName);
353
+ if (addedNodeNames.delete(op.oldName))
354
+ addedNodeNames.add(op.newName);
355
+ break;
356
+ }
357
+ case 'addConnection': {
358
+ if (!nodeByName.has(op.source)) {
359
+ return fail(i, `source node '${op.source}' not found`);
360
+ }
361
+ if (!nodeByName.has(op.target)) {
362
+ return fail(i, `target node '${op.target}' not found`);
363
+ }
364
+ const connectionType = (op.connectionType ??
365
+ n8n_workflow_1.NodeConnectionTypes.Main);
366
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(op.source) || !(0, n8n_workflow_1.isSafeObjectProperty)(connectionType)) {
367
+ return fail(i, 'connection name is not allowed');
368
+ }
369
+ const sourceIndex = op.sourceIndex ?? 0;
370
+ const targetIndex = op.targetIndex ?? 0;
371
+ const slot = ensureOutputSlot(workflow.connections, op.source, connectionType, sourceIndex);
372
+ const exists = slot.some((c) => c.node === op.target && c.type === connectionType && c.index === targetIndex);
373
+ if (!exists) {
374
+ slot.push({ node: op.target, type: connectionType, index: targetIndex });
375
+ }
376
+ break;
377
+ }
378
+ case 'removeConnection': {
379
+ const connectionType = (op.connectionType ??
380
+ n8n_workflow_1.NodeConnectionTypes.Main);
381
+ const sourceIndex = op.sourceIndex ?? 0;
382
+ const targetIndex = op.targetIndex ?? 0;
383
+ const byType = workflow.connections[op.source];
384
+ const outputs = byType?.[connectionType];
385
+ const slot = outputs?.[sourceIndex];
386
+ if (!slot) {
387
+ return fail(i, `no '${connectionType}' connection from '${op.source}'`);
388
+ }
389
+ const filtered = slot.filter((c) => !(c.node === op.target && c.type === connectionType && c.index === targetIndex));
390
+ if (filtered.length === slot.length) {
391
+ return fail(i, `connection from '${op.source}'[${sourceIndex}] to '${op.target}'[${targetIndex}] does not exist`);
392
+ }
393
+ outputs[sourceIndex] = filtered;
394
+ pruneConnectionShape(workflow.connections, op.source, connectionType);
395
+ break;
396
+ }
397
+ case 'setNodeCredential': {
398
+ const node = nodeByName.get(op.nodeName);
399
+ if (!node)
400
+ return fail(i, `node '${op.nodeName}' not found`);
401
+ if (!(0, n8n_workflow_1.isSafeObjectProperty)(op.credentialKey)) {
402
+ return fail(i, `credential key '${op.credentialKey}' is not allowed`);
403
+ }
404
+ node.credentials = {
405
+ ...(node.credentials ?? {}),
406
+ [op.credentialKey]: { id: op.credentialId, name: op.credentialName },
407
+ };
408
+ break;
409
+ }
410
+ case 'setNodePosition': {
411
+ const node = nodeByName.get(op.nodeName);
412
+ if (!node)
413
+ return fail(i, `node '${op.nodeName}' not found`);
414
+ node.position = op.position;
415
+ break;
416
+ }
417
+ case 'setNodeDisabled': {
418
+ const node = nodeByName.get(op.nodeName);
419
+ if (!node)
420
+ return fail(i, `node '${op.nodeName}' not found`);
421
+ node.disabled = op.disabled;
422
+ break;
423
+ }
424
+ case 'setWorkflowMetadata': {
425
+ if (op.name !== undefined)
426
+ workflow.name = op.name;
427
+ if (op.description !== undefined)
428
+ workflow.description = op.description;
429
+ break;
430
+ }
431
+ default: {
432
+ op;
433
+ return fail(i, 'unknown operation type');
434
+ }
435
+ }
436
+ }
437
+ return { success: true, workflow, addedNodeNames: [...addedNodeNames] };
438
+ }
439
+ function toWorkflowSlice(workflow) {
440
+ return {
441
+ name: workflow.name ?? '',
442
+ description: workflow.description,
443
+ nodes: workflow.nodes,
444
+ connections: workflow.connections,
445
+ };
446
+ }
447
+ //# sourceMappingURL=workflow-operations.js.map