n8n 2.26.3 → 2.27.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.
- package/dist/active-workflow-manager.d.ts +9 -17
- package/dist/active-workflow-manager.js +48 -159
- package/dist/active-workflow-manager.js.map +1 -1
- package/dist/binary-data/database.manager.js +2 -1
- package/dist/binary-data/database.manager.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/commands/audit.d.ts +1 -0
- package/dist/commands/audit.js +9 -0
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/base-command.d.ts +1 -0
- package/dist/commands/base-command.js +31 -10
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/export/workflow.js +9 -0
- package/dist/commands/export/workflow.js.map +1 -1
- package/dist/commands/import/workflow.js +6 -0
- package/dist/commands/import/workflow.js.map +1 -1
- package/dist/commands/start.js +7 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/worker.js +6 -3
- package/dist/commands/worker.js.map +1 -1
- package/dist/concurrency/concurrency-queue.d.ts +1 -1
- package/dist/concurrency/concurrency-queue.js +2 -2
- package/dist/concurrency/concurrency-queue.js.map +1 -1
- package/dist/controllers/api-keys.controller.js +6 -2
- package/dist/controllers/api-keys.controller.js.map +1 -1
- package/dist/controllers/e2e.controller.js +1 -1
- package/dist/controllers/e2e.controller.js.map +1 -1
- package/dist/controllers/oauth/oauth2-credential.controller.js +7 -0
- package/dist/controllers/oauth/oauth2-credential.controller.js.map +1 -1
- package/dist/controllers/security-settings.controller.d.ts +3 -3
- package/dist/controllers/security-settings.controller.js +3 -8
- package/dist/controllers/security-settings.controller.js.map +1 -1
- package/dist/credentials-helper.js +3 -0
- package/dist/credentials-helper.js.map +1 -1
- package/dist/errors/http-error-serializers.js +2 -15
- package/dist/errors/http-error-serializers.js.map +1 -1
- package/dist/errors/response-errors/bad-request.error.d.ts +1 -1
- package/dist/errors/response-errors/bad-request.error.js +2 -2
- package/dist/errors/response-errors/bad-request.error.js.map +1 -1
- package/dist/errors/response-errors/unprocessable.error.d.ts +2 -1
- package/dist/errors/response-errors/unprocessable.error.js +2 -1
- package/dist/errors/response-errors/unprocessable.error.js.map +1 -1
- package/dist/events/event.service.d.ts +1 -1
- package/dist/events/event.service.js +2 -2
- package/dist/events/event.service.js.map +1 -1
- package/dist/events/maps/execution-data.event-map.d.ts +1 -0
- package/dist/events/maps/relay.event-map.d.ts +13 -0
- package/dist/events/relays/log-streaming.event-relay.js +2 -2
- package/dist/events/relays/log-streaming.event-relay.js.map +1 -1
- package/dist/events/relays/telemetry.event-relay.d.ts +2 -0
- package/dist/events/relays/telemetry.event-relay.js +21 -2
- package/dist/events/relays/telemetry.event-relay.js.map +1 -1
- package/dist/executions/execution-data/db-store.d.ts +3 -1
- package/dist/executions/execution-data/db-store.js +14 -0
- package/dist/executions/execution-data/db-store.js.map +1 -1
- package/dist/executions/execution-data/fs-store.d.ts +1 -1
- package/dist/executions/execution-data/fs-store.js +3 -1
- package/dist/executions/execution-data/fs-store.js.map +1 -1
- package/dist/executions/execution-data/s3-store.ee.d.ts +15 -0
- package/dist/executions/execution-data/s3-store.ee.js +115 -0
- package/dist/executions/execution-data/s3-store.ee.js.map +1 -0
- package/dist/executions/execution-data/types.d.ts +1 -1
- package/dist/executions/execution-persistence.d.ts +16 -2
- package/dist/executions/execution-persistence.js +80 -22
- package/dist/executions/execution-persistence.js.map +1 -1
- package/dist/metrics/prometheus/active-workflow-metrics.service.d.ts +12 -0
- package/dist/metrics/prometheus/active-workflow-metrics.service.js +61 -0
- package/dist/metrics/prometheus/active-workflow-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/base.d.ts +5 -0
- package/dist/metrics/{types.js → prometheus/base.js} +1 -1
- package/dist/metrics/prometheus/base.js.map +1 -0
- package/dist/metrics/prometheus/cache-metrics.service.d.ts +11 -0
- package/dist/metrics/prometheus/cache-metrics.service.js +48 -0
- package/dist/metrics/prometheus/cache-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/constant.d.ts +2 -0
- package/dist/metrics/prometheus/constant.js +18 -0
- package/dist/metrics/prometheus/constant.js.map +1 -0
- package/dist/metrics/prometheus/default-metrics.service.d.ts +8 -0
- package/dist/metrics/prometheus/default-metrics.service.js +35 -0
- package/dist/metrics/prometheus/default-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/dns-cache-metrics.service.d.ts +12 -0
- package/dist/metrics/prometheus/dns-cache-metrics.service.js +58 -0
- package/dist/metrics/prometheus/dns-cache-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/event-bus-metrics.service.d.ts +15 -0
- package/dist/metrics/prometheus/event-bus-metrics.service.js +106 -0
- package/dist/metrics/prometheus/event-bus-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/execution-data-metrics.service.d.ts +12 -0
- package/dist/metrics/prometheus/execution-data-metrics.service.js +106 -0
- package/dist/metrics/prometheus/execution-data-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/index.d.ts +1 -0
- package/dist/metrics/prometheus/index.js +6 -0
- package/dist/metrics/prometheus/index.js.map +1 -0
- package/dist/metrics/prometheus/instance-role-metrics.service.d.ts +13 -0
- package/dist/metrics/prometheus/instance-role-metrics.service.js +61 -0
- package/dist/metrics/prometheus/instance-role-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/prometheus.service.d.ts +26 -0
- package/dist/metrics/prometheus/prometheus.service.js +105 -0
- package/dist/metrics/prometheus/prometheus.service.js.map +1 -0
- package/dist/metrics/prometheus/pss-metrics.service.d.ts +9 -0
- package/dist/metrics/prometheus/pss-metrics.service.js +59 -0
- package/dist/metrics/prometheus/pss-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/queue-metrics.service.d.ts +13 -0
- package/dist/metrics/prometheus/queue-metrics.service.js +71 -0
- package/dist/metrics/prometheus/queue-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/route-metrics.service.d.ts +11 -0
- package/dist/metrics/prometheus/route-metrics.service.js +69 -0
- package/dist/metrics/prometheus/route-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/ssrf-metrics.service.d.ts +11 -0
- package/dist/metrics/prometheus/ssrf-metrics.service.js +65 -0
- package/dist/metrics/prometheus/ssrf-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/token-exchange-metrics.service.d.ts +10 -0
- package/dist/metrics/prometheus/token-exchange-metrics.service.js +91 -0
- package/dist/metrics/prometheus/token-exchange-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/version-metrics.service.d.ts +8 -0
- package/dist/metrics/prometheus/version-metrics.service.js +46 -0
- package/dist/metrics/prometheus/version-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/workflow-execution-duration-metrics.service.d.ts +10 -0
- package/dist/metrics/prometheus/workflow-execution-duration-metrics.service.js +61 -0
- package/dist/metrics/prometheus/workflow-execution-duration-metrics.service.js.map +1 -0
- package/dist/metrics/prometheus/workflow-statistics-metrics.service.d.ts +17 -0
- package/dist/metrics/prometheus/workflow-statistics-metrics.service.js +130 -0
- package/dist/metrics/prometheus/workflow-statistics-metrics.service.js.map +1 -0
- package/dist/modules/agents/agent-knowledge.service.d.ts +3 -32
- package/dist/modules/agents/agent-knowledge.service.js +7 -248
- package/dist/modules/agents/agent-knowledge.service.js.map +1 -1
- package/dist/modules/agents/agent-runtime-reconstruction.service.d.ts +1 -6
- package/dist/modules/agents/agent-runtime-reconstruction.service.js +2 -28
- package/dist/modules/agents/agent-runtime-reconstruction.service.js.map +1 -1
- package/dist/modules/agents/agents-list.controller.d.ts +9 -0
- package/dist/modules/agents/agents-list.controller.js +39 -0
- package/dist/modules/agents/agents-list.controller.js.map +1 -0
- package/dist/modules/agents/agents.controller.d.ts +6 -6
- package/dist/modules/agents/agents.controller.js +12 -19
- package/dist/modules/agents/agents.controller.js.map +1 -1
- package/dist/modules/agents/agents.module.d.ts +3 -2
- package/dist/modules/agents/agents.module.js +4 -2
- package/dist/modules/agents/agents.module.js.map +1 -1
- package/dist/modules/agents/agents.service.d.ts +10 -2
- package/dist/modules/agents/agents.service.js +119 -82
- package/dist/modules/agents/agents.service.js.map +1 -1
- package/dist/modules/agents/entities/agent-chat-subscription.entity.d.ts +10 -0
- package/dist/modules/agents/entities/{agent-file.entity.js → agent-chat-subscription.entity.js} +34 -23
- package/dist/modules/agents/entities/agent-chat-subscription.entity.js.map +1 -0
- package/dist/modules/agents/execution-recorder.js +15 -2
- package/dist/modules/agents/execution-recorder.js.map +1 -1
- package/dist/modules/agents/integrations/agent-chat-subscription-state.adapter.d.ts +43 -0
- package/dist/modules/agents/integrations/agent-chat-subscription-state.adapter.js +139 -0
- package/dist/modules/agents/integrations/agent-chat-subscription-state.adapter.js.map +1 -0
- package/dist/modules/agents/integrations/agent-chat-subscription-state.service.d.ts +26 -0
- package/dist/modules/agents/integrations/agent-chat-subscription-state.service.js +88 -0
- package/dist/modules/agents/integrations/agent-chat-subscription-state.service.js.map +1 -0
- package/dist/modules/agents/integrations/chat-integration.service.d.ts +3 -1
- package/dist/modules/agents/integrations/chat-integration.service.js +47 -18
- package/dist/modules/agents/integrations/chat-integration.service.js.map +1 -1
- package/dist/modules/agents/integrations/component-mapper.js.map +1 -1
- package/dist/modules/agents/integrations/slack-app-setup.service.js +8 -8
- package/dist/modules/agents/integrations/slack-app-setup.service.js.map +1 -1
- package/dist/modules/agents/repositories/agent-chat-subscription.repository.d.ts +15 -0
- package/dist/modules/agents/repositories/agent-chat-subscription.repository.js +51 -0
- package/dist/modules/agents/repositories/agent-chat-subscription.repository.js.map +1 -0
- package/dist/modules/agents/repositories/agent.repository.d.ts +7 -0
- package/dist/modules/agents/repositories/agent.repository.js +28 -0
- package/dist/modules/agents/repositories/agent.repository.js.map +1 -1
- package/dist/modules/data-table/data-table.repository.js +1 -1
- package/dist/modules/data-table/data-table.repository.js.map +1 -1
- package/dist/modules/data-table/utils/sql-utils.js +16 -1
- package/dist/modules/data-table/utils/sql-utils.js.map +1 -1
- package/dist/modules/dynamic-credentials.ee/dynamic-credentials.module.js +15 -7
- package/dist/modules/dynamic-credentials.ee/dynamic-credentials.module.js.map +1 -1
- package/dist/modules/instance-ai/eval/execution.service.js +51 -32
- package/dist/modules/instance-ai/eval/execution.service.js.map +1 -1
- package/dist/modules/instance-ai/eval/mock-handler.js +77 -13
- package/dist/modules/instance-ai/eval/mock-handler.js.map +1 -1
- package/dist/modules/instance-ai/eval/mock-quirks.js +8 -1
- package/dist/modules/instance-ai/eval/mock-quirks.js.map +1 -1
- package/dist/modules/instance-ai/eval/workflow-analysis.js +2 -0
- package/dist/modules/instance-ai/eval/workflow-analysis.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.adapter.service.d.ts +5 -4
- package/dist/modules/instance-ai/instance-ai.adapter.service.js +7 -121
- package/dist/modules/instance-ai/instance-ai.adapter.service.js.map +1 -1
- package/dist/modules/instance-ai/instance-ai.controller.js +1 -1
- package/dist/modules/instance-ai/instance-ai.service.d.ts +5 -28
- package/dist/modules/instance-ai/instance-ai.service.js +58 -471
- package/dist/modules/instance-ai/instance-ai.service.js.map +1 -1
- package/dist/modules/instance-ai/output-redaction-config.d.ts +3 -0
- package/dist/modules/instance-ai/output-redaction-config.js +19 -0
- package/dist/modules/instance-ai/output-redaction-config.js.map +1 -0
- package/dist/modules/instance-ai/sandbox/index.d.ts +1 -0
- package/dist/modules/instance-ai/sandbox/index.js +6 -0
- package/dist/modules/instance-ai/sandbox/index.js.map +1 -0
- package/dist/modules/instance-ai/sandbox/instance-ai-sandbox.service.d.ts +77 -0
- package/dist/modules/instance-ai/sandbox/instance-ai-sandbox.service.js +297 -0
- package/dist/modules/instance-ai/sandbox/instance-ai-sandbox.service.js.map +1 -0
- package/dist/modules/instance-ai/suspended-run-restorer.service.d.ts +62 -0
- package/dist/modules/instance-ai/suspended-run-restorer.service.js +116 -0
- package/dist/modules/instance-ai/suspended-run-restorer.service.js.map +1 -0
- package/dist/modules/instance-ai/suspended-thread-persistence.service.d.ts +51 -0
- package/dist/modules/instance-ai/suspended-thread-persistence.service.js +106 -0
- package/dist/modules/instance-ai/suspended-thread-persistence.service.js.map +1 -0
- package/dist/modules/instance-ai/web-research/fetch-and-extract.d.ts +1 -1
- package/dist/modules/mcp/mcp-api-key.service.d.ts +3 -7
- package/dist/modules/mcp/mcp-api-key.service.js +1 -22
- package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
- package/dist/modules/mcp/mcp-protected-resource.d.ts +13 -0
- package/dist/modules/mcp/mcp-protected-resource.js +39 -0
- package/dist/modules/mcp/mcp-protected-resource.js.map +1 -0
- package/dist/modules/mcp/mcp-server-middleware.service.d.ts +5 -4
- package/dist/modules/mcp/mcp-server-middleware.service.js +9 -6
- package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -1
- package/dist/modules/mcp/mcp.errors.d.ts +0 -13
- package/dist/modules/mcp/mcp.errors.js +1 -27
- package/dist/modules/mcp/mcp.errors.js.map +1 -1
- package/dist/modules/mcp/mcp.module.d.ts +0 -1
- package/dist/modules/mcp/mcp.module.js +3 -11
- package/dist/modules/mcp/mcp.module.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +5 -1
- package/dist/modules/mcp/mcp.service.js +16 -2
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/mcp.types.d.ts +6 -14
- package/dist/modules/mcp/mcp.types.js.map +1 -1
- package/dist/modules/mcp/tools/get-workflow-details.tool.js +1 -1
- package/dist/modules/mcp/tools/get-workflow-details.tool.js.map +1 -1
- package/dist/modules/mcp/tools/list-tags.tool.d.ts +26 -0
- package/dist/modules/mcp/tools/list-tags.tool.js +91 -0
- package/dist/modules/mcp/tools/list-tags.tool.js.map +1 -0
- package/dist/modules/mcp/tools/schemas.d.ts +7 -0
- package/dist/modules/mcp/tools/schemas.js +3 -1
- package/dist/modules/mcp/tools/schemas.js.map +1 -1
- package/dist/modules/mcp/tools/search-workflows.tool.d.ts +2 -1
- package/dist/modules/mcp/tools/search-workflows.tool.js +14 -4
- package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/constants.d.ts +1 -1
- package/dist/modules/mcp/tools/workflow-builder/constants.js +2 -1
- package/dist/modules/mcp/tools/workflow-builder/constants.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js +24 -6
- package/dist/modules/mcp/tools/workflow-builder/create-workflow-from-code.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/explore-node-resources.tool.d.ts +18 -0
- package/dist/modules/mcp/tools/workflow-builder/explore-node-resources.tool.js +119 -0
- package/dist/modules/mcp/tools/workflow-builder/explore-node-resources.tool.js.map +1 -0
- package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.d.ts +2 -2
- package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.js +4 -4
- package/dist/modules/mcp/tools/workflow-builder/get-workflow-node-types.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/mcp-instructions.js +8 -6
- package/dist/modules/mcp/tools/workflow-builder/mcp-instructions.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/search-workflow-nodes.tool.js +1 -1
- package/dist/modules/mcp/tools/workflow-builder/search-workflow-nodes.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.d.ts +4 -294
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js +137 -16
- package/dist/modules/mcp/tools/workflow-builder/update-workflow.tool.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-builder/workflow-operations.d.ts +23 -1
- package/dist/modules/mcp/tools/workflow-builder/workflow-operations.js +54 -2
- package/dist/modules/mcp/tools/workflow-builder/workflow-operations.js.map +1 -1
- package/dist/modules/mcp/tools/workflow-validation.utils.d.ts +1 -0
- package/dist/modules/mcp/tools/workflow-validation.utils.js +1 -0
- package/dist/modules/mcp/tools/workflow-validation.utils.js.map +1 -1
- package/dist/modules/mcp-registry/node-description-transform.js +6 -0
- package/dist/modules/mcp-registry/node-description-transform.js.map +1 -1
- package/dist/modules/n8n-packages/engine/import-blocked.error.d.ts +4 -0
- package/dist/modules/n8n-packages/engine/import-blocked.error.js +14 -0
- package/dist/modules/n8n-packages/engine/import-blocked.error.js.map +1 -0
- package/dist/modules/n8n-packages/engine/import-pipeline.d.ts +9 -7
- package/dist/modules/n8n-packages/engine/import-pipeline.js +57 -113
- package/dist/modules/n8n-packages/engine/import-pipeline.js.map +1 -1
- package/dist/modules/n8n-packages/engine/n8n-package-parser.d.ts +11 -0
- package/dist/modules/n8n-packages/engine/n8n-package-parser.js +114 -0
- package/dist/modules/n8n-packages/engine/n8n-package-parser.js.map +1 -0
- package/dist/modules/n8n-packages/entities/credential/credential-importer.d.ts +4 -5
- package/dist/modules/n8n-packages/entities/credential/credential-importer.js +9 -12
- package/dist/modules/n8n-packages/entities/credential/credential-importer.js.map +1 -1
- package/dist/modules/n8n-packages/entities/credential/credential-matcher.d.ts +1 -0
- package/dist/modules/n8n-packages/entities/credential/credential-matcher.js +27 -2
- package/dist/modules/n8n-packages/entities/credential/credential-matcher.js.map +1 -1
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode.d.ts +3 -7
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode.js +6 -13
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode.js.map +1 -1
- package/dist/modules/n8n-packages/entities/credential/credential.types.d.ts +3 -10
- package/dist/modules/n8n-packages/entities/credential/credential.types.js +0 -4
- package/dist/modules/n8n-packages/entities/credential/credential.types.js.map +1 -1
- package/dist/modules/n8n-packages/entities/credential/id-based-credential-matcher.js +11 -6
- package/dist/modules/n8n-packages/entities/credential/id-based-credential-matcher.js.map +1 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.d.ts +4 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.js +12 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-id-policy.d.ts +2 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-id-policy.js +12 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-id-policy.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-import-match.service.d.ts +15 -2
- package/dist/modules/n8n-packages/entities/workflow/workflow-import-match.service.js +18 -2
- package/dist/modules/n8n-packages/entities/workflow/workflow-import-match.service.js.map +1 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-import.types.d.ts +47 -0
- package/dist/modules/n8n-packages/entities/workflow/{workflow-conflict-policy.types.js → workflow-import.types.js} +1 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-import.types.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-importer.d.ts +14 -6
- package/dist/modules/n8n-packages/entities/workflow/workflow-importer.js +136 -19
- package/dist/modules/n8n-packages/entities/workflow/workflow-importer.js.map +1 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-publisher.d.ts +16 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publisher.js +87 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publisher.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.d.ts +2 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.js +28 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.types.d.ts +14 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.types.js +10 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow-publishing-policy.types.js.map +1 -0
- package/dist/modules/n8n-packages/entities/workflow/workflow.serializer.js +1 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow.serializer.js.map +1 -1
- package/dist/modules/n8n-packages/io/tar/tar-package-reader.d.ts +10 -3
- package/dist/modules/n8n-packages/io/tar/tar-package-reader.js +103 -20
- package/dist/modules/n8n-packages/io/tar/tar-package-reader.js.map +1 -1
- package/dist/modules/n8n-packages/n8n-packages.config.d.ts +6 -0
- package/dist/modules/n8n-packages/n8n-packages.config.js +43 -0
- package/dist/modules/n8n-packages/n8n-packages.config.js.map +1 -0
- package/dist/modules/n8n-packages/n8n-packages.controller.js +0 -1
- package/dist/modules/n8n-packages/n8n-packages.controller.js.map +1 -1
- package/dist/modules/n8n-packages/n8n-packages.module.js +0 -2
- package/dist/modules/n8n-packages/n8n-packages.module.js.map +1 -1
- package/dist/modules/n8n-packages/n8n-packages.types.d.ts +41 -7
- package/dist/modules/n8n-packages/n8n-packages.types.js +7 -1
- package/dist/modules/n8n-packages/n8n-packages.types.js.map +1 -1
- package/dist/modules/n8n-packages/spec/serialized/workflow.schema.d.ts +3 -3
- package/dist/modules/n8n-packages/spec/serialized/workflow.schema.js +1 -1
- package/dist/modules/n8n-packages/spec/serialized/workflow.schema.js.map +1 -1
- package/dist/modules/n8n-packages/utils/import-package-upload.js +2 -2
- package/dist/modules/n8n-packages/utils/import-package-upload.js.map +1 -1
- package/dist/modules/oauth-server/database/entities/oauth-access-token.entity.js.map +1 -0
- package/dist/modules/oauth-server/database/entities/oauth-authorization-code.entity.js.map +1 -0
- package/dist/modules/oauth-server/database/entities/oauth-client.entity.js.map +1 -0
- package/dist/modules/oauth-server/database/entities/oauth-refresh-token.entity.js.map +1 -0
- package/dist/modules/oauth-server/database/entities/oauth-user-consent.entity.js.map +1 -0
- package/dist/modules/oauth-server/database/repositories/oauth-access-token.repository.js.map +1 -0
- package/dist/modules/oauth-server/database/repositories/oauth-authorization-code.repository.js.map +1 -0
- package/dist/modules/oauth-server/database/repositories/oauth-client.repository.js.map +1 -0
- package/dist/modules/oauth-server/database/repositories/oauth-refresh-token.repository.js.map +1 -0
- package/dist/modules/oauth-server/database/repositories/oauth-user-consent.repository.js.map +1 -0
- package/dist/modules/oauth-server/dto/approve-consent-request.dto.js.map +1 -0
- package/dist/modules/{mcp/mcp-oauth-authorization-code.service.d.ts → oauth-server/oauth-authorization-code.service.d.ts} +1 -1
- package/dist/modules/{mcp/mcp-oauth-authorization-code.service.js → oauth-server/oauth-authorization-code.service.js} +12 -12
- package/dist/modules/oauth-server/oauth-authorization-code.service.js.map +1 -0
- package/dist/modules/{mcp/mcp.oauth-clients.controller.d.ts → oauth-server/oauth-clients.controller.d.ts} +4 -4
- package/dist/modules/{mcp/mcp.oauth-clients.controller.js → oauth-server/oauth-clients.controller.js} +16 -16
- package/dist/modules/oauth-server/oauth-clients.controller.js.map +1 -0
- package/dist/modules/{mcp/mcp.auth.consent.controller.d.ts → oauth-server/oauth-consent.controller.d.ts} +3 -3
- package/dist/modules/{mcp/mcp.auth.consent.controller.js → oauth-server/oauth-consent.controller.js} +16 -10
- package/dist/modules/oauth-server/oauth-consent.controller.js.map +1 -0
- package/dist/modules/{mcp/mcp-oauth-consent.service.d.ts → oauth-server/oauth-consent.service.d.ts} +16 -7
- package/dist/modules/{mcp/mcp-oauth-consent.service.js → oauth-server/oauth-consent.service.js} +28 -12
- package/dist/modules/oauth-server/oauth-consent.service.js.map +1 -0
- package/dist/modules/oauth-server/oauth-server.module.d.ts +5 -0
- package/dist/modules/oauth-server/oauth-server.module.js +75 -0
- package/dist/modules/oauth-server/oauth-server.module.js.map +1 -0
- package/dist/modules/{mcp/mcp-oauth-service.d.ts → oauth-server/oauth-server.service.d.ts} +6 -6
- package/dist/modules/{mcp/mcp-oauth-service.js → oauth-server/oauth-server.service.js} +33 -30
- package/dist/modules/oauth-server/oauth-server.service.js.map +1 -0
- package/dist/modules/oauth-server/oauth-session.service.js.map +1 -0
- package/dist/modules/{mcp/mcp-oauth-token.service.d.ts → oauth-server/oauth-token.service.d.ts} +5 -8
- package/dist/modules/{mcp/mcp-oauth-token.service.js → oauth-server/oauth-token.service.js} +29 -30
- package/dist/modules/oauth-server/oauth-token.service.js.map +1 -0
- package/dist/modules/{mcp/mcp.oauth.controller.d.ts → oauth-server/oauth.controller.d.ts} +5 -3
- package/dist/modules/{mcp/mcp.oauth.controller.js → oauth-server/oauth.controller.js} +79 -68
- package/dist/modules/oauth-server/oauth.controller.js.map +1 -0
- package/dist/modules/oauth-server/oauth.errors.d.ts +13 -0
- package/dist/modules/oauth-server/oauth.errors.js +30 -0
- package/dist/modules/oauth-server/oauth.errors.js.map +1 -0
- package/dist/modules/{mcp/mcp-oauth.helpers.d.ts → oauth-server/oauth.helpers.d.ts} +1 -1
- package/dist/modules/{mcp/mcp-oauth.helpers.js → oauth-server/oauth.helpers.js} +4 -4
- package/dist/modules/oauth-server/oauth.helpers.js.map +1 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/utils.d.ts +4 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/utils.js +41 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/utils.js.map +1 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-test-trigger-resource.resolver.d.ts +28 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-test-trigger-resource.resolver.js +78 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-test-trigger-resource.resolver.js.map +1 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-trigger-resource.resolver.d.ts +30 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-trigger-resource.resolver.js +95 -0
- package/dist/modules/oauth-server/protected-resource-resolvers/workflow-mcp-trigger-resource.resolver.js.map +1 -0
- package/dist/modules/otel/execution-level-tracer.d.ts +5 -4
- package/dist/modules/otel/execution-level-tracer.js +8 -5
- package/dist/modules/otel/execution-level-tracer.js.map +1 -1
- package/dist/modules/otel/otel-lifecycle-handler.d.ts +8 -4
- package/dist/modules/otel/otel-lifecycle-handler.js +32 -15
- package/dist/modules/otel/otel-lifecycle-handler.js.map +1 -1
- package/dist/modules/otel/otel-settings.controller.d.ts +18 -0
- package/dist/modules/otel/otel-settings.controller.js +79 -0
- package/dist/modules/otel/otel-settings.controller.js.map +1 -0
- package/dist/modules/otel/otel-settings.service.d.ts +21 -0
- package/dist/modules/otel/otel-settings.service.js +89 -0
- package/dist/modules/otel/otel-settings.service.js.map +1 -0
- package/dist/modules/otel/otel.config.js +11 -10
- package/dist/modules/otel/otel.config.js.map +1 -1
- package/dist/modules/otel/otel.constants.d.ts +14 -0
- package/dist/modules/otel/otel.constants.js +15 -1
- package/dist/modules/otel/otel.constants.js.map +1 -1
- package/dist/modules/otel/otel.module.js +9 -17
- package/dist/modules/otel/otel.module.js.map +1 -1
- package/dist/modules/otel/otel.service.d.ts +15 -4
- package/dist/modules/otel/otel.service.js +73 -17
- package/dist/modules/otel/otel.service.js.map +1 -1
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.d.ts +1 -0
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js +46 -19
- package/dist/modules/provisioning.ee/role-mapping-rule.service.ee.js.map +1 -1
- package/dist/modules/redaction/instance-redaction-enforcement.service.js +0 -6
- package/dist/modules/redaction/instance-redaction-enforcement.service.js.map +1 -1
- package/dist/modules/source-control.ee/source-control-git.service.ee.js +2 -5
- package/dist/modules/source-control.ee/source-control-git.service.ee.js.map +1 -1
- package/dist/modules/sso-saml/saml.service.ee.js +3 -2
- package/dist/modules/sso-saml/saml.service.ee.js.map +1 -1
- package/dist/modules/workflow-index/workflow-dependency-query.service.js +39 -20
- package/dist/modules/workflow-index/workflow-dependency-query.service.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +14 -0
- package/dist/oauth/oauth.service.js +220 -102
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/types.d.ts +1 -0
- package/dist/oauth/types.js.map +1 -1
- package/dist/public-api/index.js +8 -8
- package/dist/public-api/index.js.map +1 -1
- package/dist/public-api/types.d.ts +1 -6
- package/dist/public-api/v1/handlers/credentials/credentials.service.js +7 -8
- package/dist/public-api/v1/handlers/credentials/credentials.service.js.map +1 -1
- package/dist/public-api/v1/handlers/executions/executions.handler.js +1 -1
- package/dist/public-api/v1/handlers/executions/executions.handler.js.map +1 -1
- package/dist/public-api/v1/handlers/n8n-packages/n8n-packages.handler.js +3 -3
- package/dist/public-api/v1/handlers/n8n-packages/n8n-packages.handler.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +208 -51
- package/dist/push/abstract.push.d.ts +1 -2
- package/dist/push/abstract.push.js +1 -2
- package/dist/push/abstract.push.js.map +1 -1
- package/dist/push/index.d.ts +1 -2
- package/dist/push/index.js +3 -4
- package/dist/push/index.js.map +1 -1
- package/dist/scaling/constants.d.ts +2 -2
- package/dist/scaling/constants.js +1 -0
- package/dist/scaling/constants.js.map +1 -1
- package/dist/scaling/job-processor.d.ts +0 -1
- package/dist/scaling/job-processor.js +1 -23
- package/dist/scaling/job-processor.js.map +1 -1
- package/dist/scaling/multi-main-setup.ee.d.ts +1 -2
- package/dist/scaling/multi-main-setup.ee.js +1 -2
- package/dist/scaling/multi-main-setup.ee.js.map +1 -1
- package/dist/scaling/pubsub/pubsub.event-map.d.ts +7 -0
- package/dist/scaling/pubsub/pubsub.eventbus.d.ts +1 -1
- package/dist/scaling/pubsub/pubsub.eventbus.js +2 -2
- package/dist/scaling/pubsub/pubsub.eventbus.js.map +1 -1
- package/dist/scaling/pubsub/pubsub.types.d.ts +3 -1
- package/dist/scaling/worker-server.d.ts +1 -1
- package/dist/scaling/worker-server.js +5 -5
- package/dist/scaling/worker-server.js.map +1 -1
- package/dist/server.js +4 -3
- package/dist/server.js.map +1 -1
- package/dist/services/ai-workflow-builder.service.d.ts +2 -1
- package/dist/services/ai-workflow-builder.service.js +2 -1
- package/dist/services/ai-workflow-builder.service.js.map +1 -1
- package/dist/services/cache/cache.service.d.ts +1 -1
- package/dist/services/cache/cache.service.js +2 -2
- package/dist/services/cache/cache.service.js.map +1 -1
- package/dist/services/node-resource-explorer.service.d.ts +16 -0
- package/dist/services/node-resource-explorer.service.js +154 -0
- package/dist/services/node-resource-explorer.service.js.map +1 -0
- package/dist/services/oauth-token-verifier-proxy.service.d.ts +22 -0
- package/dist/services/oauth-token-verifier-proxy.service.js +36 -0
- package/dist/services/oauth-token-verifier-proxy.service.js.map +1 -0
- package/dist/services/protected-resource.registry.d.ts +31 -0
- package/dist/services/protected-resource.registry.js +115 -0
- package/dist/services/protected-resource.registry.js.map +1 -0
- package/dist/services/public-api-key.service.d.ts +8 -2
- package/dist/services/public-api-key.service.js +29 -6
- package/dist/services/public-api-key.service.js.map +1 -1
- package/dist/services/redis-client.service.d.ts +2 -2
- package/dist/services/redis-client.service.js +6 -4
- package/dist/services/redis-client.service.js.map +1 -1
- package/dist/services/tag.service.d.ts +10 -0
- package/dist/services/tag.service.js +84 -4
- package/dist/services/tag.service.js.map +1 -1
- package/dist/services/workflow-statistics.service.d.ts +1 -2
- package/dist/services/workflow-statistics.service.js +1 -2
- package/dist/services/workflow-statistics.service.js.map +1 -1
- package/dist/task-runners/sliding-window-signal.d.ts +1 -1
- package/dist/task-runners/task-runner-lifecycle-events.d.ts +1 -1
- package/dist/task-runners/task-runner-lifecycle-events.js +2 -2
- package/dist/task-runners/task-runner-lifecycle-events.js.map +1 -1
- package/dist/task-runners/task-runner-process-base.d.ts +1 -2
- package/dist/task-runners/task-runner-process-base.js +1 -2
- package/dist/task-runners/task-runner-process-base.js.map +1 -1
- package/dist/task-runners/task-runner-process-restart-loop-detector.d.ts +1 -1
- package/dist/task-runners/task-runner-process-restart-loop-detector.js +2 -2
- package/dist/task-runners/task-runner-process-restart-loop-detector.js.map +1 -1
- package/dist/user-management/email/templates/api-key-revoked.handlebars +196 -0
- package/dist/user-management/email/user-management-mailer.d.ts +6 -2
- package/dist/user-management/email/user-management-mailer.js +32 -0
- package/dist/user-management/email/user-management-mailer.js.map +1 -1
- package/dist/wait-tracker.d.ts +1 -1
- package/dist/wait-tracker.js +3 -3
- package/dist/wait-tracker.js.map +1 -1
- package/dist/webhooks/webhook-helpers.js +30 -1
- package/dist/webhooks/webhook-helpers.js.map +1 -1
- package/dist/webhooks/webhook-server.js +2 -2
- package/dist/webhooks/webhook-server.js.map +1 -1
- package/dist/webhooks/webhook.service.d.ts +4 -1
- package/dist/webhooks/webhook.service.js +20 -5
- package/dist/webhooks/webhook.service.js.map +1 -1
- package/dist/workflow-execute-additional-data.d.ts +1 -1
- package/dist/workflow-execute-additional-data.js +4 -1
- package/dist/workflow-execute-additional-data.js.map +1 -1
- package/dist/workflow-helpers.d.ts +1 -1
- package/dist/workflow-helpers.js +13 -3
- package/dist/workflow-helpers.js.map +1 -1
- package/dist/workflow-runner.js +0 -2
- package/dist/workflow-runner.js.map +1 -1
- package/dist/workflows/publication/publication-result.d.ts +17 -0
- package/dist/workflows/publication/publication-result.js +3 -0
- package/dist/workflows/publication/publication-result.js.map +1 -0
- package/dist/workflows/publication/publication-status-reporter.d.ts +19 -0
- package/dist/workflows/publication/publication-status-reporter.js +110 -0
- package/dist/workflows/publication/publication-status-reporter.js.map +1 -0
- package/dist/workflows/publication/trigger-diff.d.ts +6 -0
- package/dist/workflows/publication/trigger-diff.js +27 -0
- package/dist/workflows/publication/trigger-diff.js.map +1 -0
- package/dist/workflows/publication/workflow-publication-applier.d.ts +14 -0
- package/dist/workflows/publication/workflow-publication-applier.js +96 -0
- package/dist/workflows/publication/workflow-publication-applier.js.map +1 -0
- package/dist/workflows/{workflow-publication-outbox-consumer.d.ts → publication/workflow-publication-outbox-consumer.d.ts} +9 -13
- package/dist/workflows/{workflow-publication-outbox-consumer.js → publication/workflow-publication-outbox-consumer.js} +25 -93
- package/dist/workflows/publication/workflow-publication-outbox-consumer.js.map +1 -0
- package/dist/workflows/triggers/non-webhook-trigger-registrar.d.ts +39 -0
- package/dist/workflows/triggers/non-webhook-trigger-registrar.js +58 -0
- package/dist/workflows/triggers/non-webhook-trigger-registrar.js.map +1 -0
- package/dist/workflows/triggers/trigger-count.service.d.ts +5 -0
- package/dist/workflows/triggers/trigger-count.service.js +65 -0
- package/dist/workflows/triggers/trigger-count.service.js.map +1 -0
- package/dist/workflows/triggers/trigger-execution-context.factory.d.ts +33 -0
- package/dist/workflows/triggers/trigger-execution-context.factory.js +171 -0
- package/dist/workflows/triggers/trigger-execution-context.factory.js.map +1 -0
- package/dist/workflows/triggers/webhook-trigger-registrar.d.ts +29 -0
- package/dist/workflows/triggers/webhook-trigger-registrar.js +143 -0
- package/dist/workflows/triggers/webhook-trigger-registrar.js.map +1 -0
- package/dist/workflows/triggers/workflow-trigger-activator.d.ts +56 -0
- package/dist/workflows/triggers/workflow-trigger-activator.js +313 -0
- package/dist/workflows/triggers/workflow-trigger-activator.js.map +1 -0
- package/dist/workflows/workflow-validation.service.d.ts +3 -0
- package/dist/workflows/workflow-validation.service.js +63 -37
- package/dist/workflows/workflow-validation.service.js.map +1 -1
- package/dist/workflows/workflow.service.d.ts +5 -3
- package/dist/workflows/workflow.service.js +91 -28
- package/dist/workflows/workflow.service.js.map +1 -1
- package/dist/workflows/workflows.controller.d.ts +3 -3
- package/dist/workflows/workflows.controller.js +3 -3
- package/dist/workflows/workflows.controller.js.map +1 -1
- package/package.json +36 -35
- package/templates/oauth-callback.handlebars +3 -0
- package/templates/oauth-error-callback.handlebars +3 -0
- package/dist/metrics/prometheus-metrics.service.d.ts +0 -54
- package/dist/metrics/prometheus-metrics.service.js +0 -607
- package/dist/metrics/prometheus-metrics.service.js.map +0 -1
- package/dist/metrics/types.d.ts +0 -6
- package/dist/metrics/types.js.map +0 -1
- package/dist/modules/agents/agent-knowledge-command.service.d.ts +0 -40
- package/dist/modules/agents/agent-knowledge-command.service.js +0 -221
- package/dist/modules/agents/agent-knowledge-command.service.js.map +0 -1
- package/dist/modules/agents/entities/agent-file.entity.d.ts +0 -11
- package/dist/modules/agents/entities/agent-file.entity.js.map +0 -1
- package/dist/modules/agents/repositories/agent-file.repository.d.ts +0 -7
- package/dist/modules/agents/repositories/agent-file.repository.js +0 -35
- package/dist/modules/agents/repositories/agent-file.repository.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/csv-helpers.d.ts +0 -73
- package/dist/modules/agents/tools/knowledge/csv-helpers.js +0 -341
- package/dist/modules/agents/tools/knowledge/csv-helpers.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/csv.operation.d.ts +0 -61
- package/dist/modules/agents/tools/knowledge/csv.operation.js +0 -207
- package/dist/modules/agents/tools/knowledge/csv.operation.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/file-references.d.ts +0 -16
- package/dist/modules/agents/tools/knowledge/file-references.js +0 -35
- package/dist/modules/agents/tools/knowledge/file-references.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/read.operation.d.ts +0 -8
- package/dist/modules/agents/tools/knowledge/read.operation.js +0 -38
- package/dist/modules/agents/tools/knowledge/read.operation.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/schemas.d.ts +0 -1505
- package/dist/modules/agents/tools/knowledge/schemas.js +0 -441
- package/dist/modules/agents/tools/knowledge/schemas.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/search.operation.d.ts +0 -9
- package/dist/modules/agents/tools/knowledge/search.operation.js +0 -332
- package/dist/modules/agents/tools/knowledge/search.operation.js.map +0 -1
- package/dist/modules/agents/tools/knowledge/tool.d.ts +0 -8
- package/dist/modules/agents/tools/knowledge/tool.js +0 -121
- package/dist/modules/agents/tools/knowledge/tool.js.map +0 -1
- package/dist/modules/mcp/database/entities/oauth-access-token.entity.js.map +0 -1
- package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js.map +0 -1
- package/dist/modules/mcp/database/entities/oauth-client.entity.js.map +0 -1
- package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js.map +0 -1
- package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js.map +0 -1
- package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js.map +0 -1
- package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js.map +0 -1
- package/dist/modules/mcp/database/repositories/oauth-client.repository.js.map +0 -1
- package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js.map +0 -1
- package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js.map +0 -1
- package/dist/modules/mcp/dto/approve-consent-request.dto.js.map +0 -1
- package/dist/modules/mcp/mcp-oauth-authorization-code.service.js.map +0 -1
- package/dist/modules/mcp/mcp-oauth-consent.service.js.map +0 -1
- package/dist/modules/mcp/mcp-oauth-service.js.map +0 -1
- package/dist/modules/mcp/mcp-oauth-token.service.js.map +0 -1
- package/dist/modules/mcp/mcp-oauth.helpers.js.map +0 -1
- package/dist/modules/mcp/mcp.auth.consent.controller.js.map +0 -1
- package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +0 -1
- package/dist/modules/mcp/mcp.oauth.controller.js.map +0 -1
- package/dist/modules/mcp/oauth-session.service.js.map +0 -1
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode-factory.d.ts +0 -7
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode-factory.js +0 -35
- package/dist/modules/n8n-packages/entities/credential/credential-missing-mode-factory.js.map +0 -1
- package/dist/modules/n8n-packages/entities/credential/credential-resolution-error.d.ts +0 -3
- package/dist/modules/n8n-packages/entities/credential/credential-resolution-error.js +0 -14
- package/dist/modules/n8n-packages/entities/credential/credential-resolution-error.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-fail.handler.d.ts +0 -9
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-fail.handler.js +0 -41
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-fail.handler.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-handler.d.ts +0 -10
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-handler.js +0 -20
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-handler.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-new-version.handler.d.ts +0 -11
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-new-version.handler.js +0 -42
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-new-version.handler.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-skip.handler.d.ts +0 -9
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-skip.handler.js +0 -33
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy-skip.handler.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.factory.d.ts +0 -10
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.factory.js +0 -37
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.factory.js.map +0 -1
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.types.d.ts +0 -20
- package/dist/modules/n8n-packages/entities/workflow/workflow-conflict-policy.types.js.map +0 -1
- package/dist/modules/redaction/redaction-enforcement.feature-flag.d.ts +0 -2
- package/dist/modules/redaction/redaction-enforcement.feature-flag.js +0 -9
- package/dist/modules/redaction/redaction-enforcement.feature-flag.js.map +0 -1
- package/dist/typed-emitter.d.ts +0 -14
- package/dist/typed-emitter.js +0 -29
- package/dist/typed-emitter.js.map +0 -1
- package/dist/workflows/workflow-publication-outbox-consumer.js.map +0 -1
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-access-token.entity.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-access-token.entity.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-authorization-code.entity.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-authorization-code.entity.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-client.entity.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-client.entity.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-refresh-token.entity.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-refresh-token.entity.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-user-consent.entity.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/entities/oauth-user-consent.entity.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-access-token.repository.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-access-token.repository.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-authorization-code.repository.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-authorization-code.repository.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-client.repository.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-client.repository.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-refresh-token.repository.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-refresh-token.repository.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-user-consent.repository.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/database/repositories/oauth-user-consent.repository.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/dto/approve-consent-request.dto.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/dto/approve-consent-request.dto.js +0 -0
- /package/dist/modules/{mcp → oauth-server}/oauth-session.service.d.ts +0 -0
- /package/dist/modules/{mcp → oauth-server}/oauth-session.service.js +0 -0
|
@@ -10,38 +10,155 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.WorkflowImporter = void 0;
|
|
13
|
+
const db_1 = require("@n8n/db");
|
|
13
14
|
const di_1 = require("@n8n/di");
|
|
15
|
+
const workflow_creation_service_1 = require("../../../../workflows/workflow-creation.service");
|
|
16
|
+
const workflow_service_1 = require("../../../../workflows/workflow.service");
|
|
17
|
+
const workflow_conflict_policy_1 = require("./workflow-conflict-policy");
|
|
18
|
+
const workflow_id_policy_1 = require("./workflow-id-policy");
|
|
14
19
|
const workflow_import_match_service_1 = require("./workflow-import-match.service");
|
|
15
|
-
const
|
|
20
|
+
const workflow_publisher_1 = require("./workflow-publisher");
|
|
16
21
|
let WorkflowImporter = class WorkflowImporter {
|
|
17
|
-
constructor(
|
|
18
|
-
this.workflowConflictPolicyFactory = workflowConflictPolicyFactory;
|
|
22
|
+
constructor(workflowImportMatchService, workflowCreationService, workflowService, workflowPublisher) {
|
|
19
23
|
this.workflowImportMatchService = workflowImportMatchService;
|
|
24
|
+
this.workflowCreationService = workflowCreationService;
|
|
25
|
+
this.workflowService = workflowService;
|
|
26
|
+
this.workflowPublisher = workflowPublisher;
|
|
20
27
|
}
|
|
21
|
-
async
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const conflicts =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
async plan(context, prepared, options) {
|
|
29
|
+
const existingBySourceWorkflowId = await this.workflowImportMatchService.findBySourceWorkflowIds(context.projectId, prepared.map(({ sourceWorkflowId }) => sourceWorkflowId));
|
|
30
|
+
const items = [];
|
|
31
|
+
const conflicts = [];
|
|
32
|
+
const sourceCreateIds = [];
|
|
33
|
+
for (const workflow of prepared) {
|
|
34
|
+
const existing = existingBySourceWorkflowId.get(workflow.sourceWorkflowId) ?? null;
|
|
35
|
+
const { action, blocked } = (0, workflow_conflict_policy_1.decideWorkflowConflictAction)(options.workflowConflictPolicy, existing);
|
|
36
|
+
const item = toPlanItem(workflow, existing, action, options.workflowIdPolicy);
|
|
37
|
+
items.push(item);
|
|
38
|
+
if (item.action === 'create' && options.workflowIdPolicy === 'source' && !blocked) {
|
|
39
|
+
sourceCreateIds.push(item.decidedId);
|
|
40
|
+
}
|
|
41
|
+
if (blocked && existing) {
|
|
42
|
+
conflicts.push({
|
|
43
|
+
sourceWorkflowId: workflow.sourceWorkflowId,
|
|
44
|
+
existingWorkflowId: existing.id,
|
|
45
|
+
name: existing.name,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const idConflicts = await this.collectIdConflicts(sourceCreateIds);
|
|
50
|
+
return { items, conflicts, idConflicts };
|
|
51
|
+
}
|
|
52
|
+
async collectIdConflicts(candidateIds) {
|
|
53
|
+
const existing = await this.workflowImportMatchService.findOwningProjectsByWorkflowId(candidateIds);
|
|
54
|
+
return candidateIds.flatMap((id) => {
|
|
55
|
+
const location = existing.get(id);
|
|
56
|
+
if (!location)
|
|
57
|
+
return [];
|
|
58
|
+
return [
|
|
59
|
+
{
|
|
60
|
+
sourceWorkflowId: id,
|
|
61
|
+
existingWorkflowId: id,
|
|
62
|
+
existingProjectId: location.projectId,
|
|
63
|
+
isArchived: location.isArchived,
|
|
64
|
+
name: location.name,
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async apply(plan, context, bindings) {
|
|
31
70
|
const workflowBindings = new Map(bindings.workflows);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const outcome = await
|
|
71
|
+
const outcomes = [];
|
|
72
|
+
for (const item of plan.items) {
|
|
73
|
+
const outcome = await this.applyItem(item, context, bindings);
|
|
35
74
|
outcomes.push(outcome);
|
|
36
|
-
workflowBindings.set(sourceWorkflowId, outcome.workflow.id);
|
|
75
|
+
workflowBindings.set(outcome.sourceWorkflowId, outcome.workflow.id);
|
|
37
76
|
}
|
|
38
77
|
return { outcomes, bindings: { ...bindings, workflows: workflowBindings } };
|
|
39
78
|
}
|
|
79
|
+
async applyItem(item, context, bindings) {
|
|
80
|
+
if (item.action === 'skip') {
|
|
81
|
+
return {
|
|
82
|
+
status: 'skipped',
|
|
83
|
+
workflow: item.existing,
|
|
84
|
+
sourceWorkflowId: item.sourceWorkflowId,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const savedWorkflow = await this.persistWorkflow(context, item, bindings.credentials);
|
|
88
|
+
const workflow = await this.workflowPublisher.apply(context.user, item, savedWorkflow, context.publishingPolicy);
|
|
89
|
+
return {
|
|
90
|
+
status: item.action === 'create' ? 'created' : 'updated',
|
|
91
|
+
workflow,
|
|
92
|
+
sourceWorkflowId: item.sourceWorkflowId,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async persistWorkflow(context, item, credentialBindings) {
|
|
96
|
+
if (item.action === 'create') {
|
|
97
|
+
const entity = prepareEntityForPersist(item.entity, credentialBindings, item.decidedId);
|
|
98
|
+
return await this.workflowCreationService.createWorkflow(context.user, entity, {
|
|
99
|
+
projectId: context.projectId,
|
|
100
|
+
parentFolderId: context.folderId ?? undefined,
|
|
101
|
+
publicApi: true,
|
|
102
|
+
source: 'import',
|
|
103
|
+
sourceWorkflowId: item.sourceWorkflowId,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const entity = prepareEntityForPersist(item.entity, credentialBindings);
|
|
107
|
+
const workflow = await this.workflowService.update(context.user, entity, item.existing.id, {
|
|
108
|
+
publicApi: true,
|
|
109
|
+
source: 'import',
|
|
110
|
+
});
|
|
111
|
+
workflow.parentFolder = item.existing.parentFolder;
|
|
112
|
+
return workflow;
|
|
113
|
+
}
|
|
40
114
|
};
|
|
41
115
|
exports.WorkflowImporter = WorkflowImporter;
|
|
42
116
|
exports.WorkflowImporter = WorkflowImporter = __decorate([
|
|
43
117
|
(0, di_1.Service)(),
|
|
44
|
-
__metadata("design:paramtypes", [
|
|
45
|
-
|
|
118
|
+
__metadata("design:paramtypes", [workflow_import_match_service_1.WorkflowImportMatchService,
|
|
119
|
+
workflow_creation_service_1.WorkflowCreationService,
|
|
120
|
+
workflow_service_1.WorkflowService,
|
|
121
|
+
workflow_publisher_1.WorkflowPublisher])
|
|
46
122
|
], WorkflowImporter);
|
|
123
|
+
function prepareEntityForPersist(source, credentialBindings, decidedId) {
|
|
124
|
+
const entity = Object.assign(new db_1.WorkflowEntity(), source, {
|
|
125
|
+
nodes: structuredClone(source.nodes),
|
|
126
|
+
...(decidedId !== undefined ? { id: decidedId } : {}),
|
|
127
|
+
});
|
|
128
|
+
applyCredentialBindingsInPlace(entity, credentialBindings);
|
|
129
|
+
return entity;
|
|
130
|
+
}
|
|
131
|
+
function applyCredentialBindingsInPlace(entity, credentialBindings) {
|
|
132
|
+
for (const node of entity.nodes) {
|
|
133
|
+
for (const details of Object.values(node.credentials ?? {})) {
|
|
134
|
+
if (!details.id)
|
|
135
|
+
continue;
|
|
136
|
+
const targetId = credentialBindings.get(details.id);
|
|
137
|
+
if (targetId) {
|
|
138
|
+
details.id = targetId;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function toPlanItem(prepared, existing, action, idPolicy) {
|
|
144
|
+
if (existing === null) {
|
|
145
|
+
return {
|
|
146
|
+
action: 'create',
|
|
147
|
+
decidedId: (0, workflow_id_policy_1.decideWorkflowId)(idPolicy, prepared.sourceWorkflowId),
|
|
148
|
+
...prepared,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
switch (action) {
|
|
152
|
+
case 'update':
|
|
153
|
+
return { action, ...prepared, existing };
|
|
154
|
+
case 'skip':
|
|
155
|
+
return { action, ...prepared, existing };
|
|
156
|
+
case 'create':
|
|
157
|
+
return {
|
|
158
|
+
action,
|
|
159
|
+
decidedId: (0, workflow_id_policy_1.decideWorkflowId)(idPolicy, prepared.sourceWorkflowId),
|
|
160
|
+
...prepared,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
47
164
|
//# sourceMappingURL=workflow-importer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-importer.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow-importer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;
|
|
1
|
+
{"version":3,"file":"workflow-importer.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow-importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Logger } from '@n8n/backend-common';
|
|
2
|
+
import type { User, WorkflowEntity } from '@n8n/db';
|
|
3
|
+
import { ProjectRepository } from '@n8n/db';
|
|
4
|
+
import { ProjectService } from '../../../../services/project.service.ee';
|
|
5
|
+
import { WorkflowService } from '../../../../workflows/workflow.service';
|
|
6
|
+
import type { PersistedWorkflowPlanItem } from './workflow-import.types';
|
|
7
|
+
import { WorkflowPublishingPolicy } from './workflow-publishing-policy.types';
|
|
8
|
+
export declare class WorkflowPublisher {
|
|
9
|
+
private readonly logger;
|
|
10
|
+
private readonly projectRepository;
|
|
11
|
+
private readonly projectService;
|
|
12
|
+
private readonly workflowService;
|
|
13
|
+
constructor(logger: Logger, projectRepository: ProjectRepository, projectService: ProjectService, workflowService: WorkflowService);
|
|
14
|
+
assertCanPublish(user: User, projectId: string, policy: WorkflowPublishingPolicy): Promise<void>;
|
|
15
|
+
apply(user: User, item: PersistedWorkflowPlanItem, workflow: WorkflowEntity, policy: WorkflowPublishingPolicy): Promise<WorkflowEntity>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
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.WorkflowPublisher = void 0;
|
|
13
|
+
const backend_common_1 = require("@n8n/backend-common");
|
|
14
|
+
const db_1 = require("@n8n/db");
|
|
15
|
+
const di_1 = require("@n8n/di");
|
|
16
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
17
|
+
const forbidden_error_1 = require("../../../../errors/response-errors/forbidden.error");
|
|
18
|
+
const not_found_error_1 = require("../../../../errors/response-errors/not-found.error");
|
|
19
|
+
const project_service_ee_1 = require("../../../../services/project.service.ee");
|
|
20
|
+
const workflow_service_1 = require("../../../../workflows/workflow.service");
|
|
21
|
+
const workflow_publishing_policy_1 = require("./workflow-publishing-policy");
|
|
22
|
+
const workflow_publishing_policy_types_1 = require("./workflow-publishing-policy.types");
|
|
23
|
+
let WorkflowPublisher = class WorkflowPublisher {
|
|
24
|
+
constructor(logger, projectRepository, projectService, workflowService) {
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
this.projectRepository = projectRepository;
|
|
27
|
+
this.projectService = projectService;
|
|
28
|
+
this.workflowService = workflowService;
|
|
29
|
+
}
|
|
30
|
+
async assertCanPublish(user, projectId, policy) {
|
|
31
|
+
if (policy !== workflow_publishing_policy_types_1.WorkflowPublishingPolicy.PublishAll) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const project = await this.projectService.getProjectWithScope(user, projectId, [
|
|
35
|
+
'workflow:publish',
|
|
36
|
+
]);
|
|
37
|
+
if (project) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!(await this.projectRepository.existsBy({ id: projectId }))) {
|
|
41
|
+
throw new not_found_error_1.NotFoundError(`Project not found: ${projectId}`);
|
|
42
|
+
}
|
|
43
|
+
throw new forbidden_error_1.ForbiddenError('You do not have permission to publish workflows in this project.');
|
|
44
|
+
}
|
|
45
|
+
async apply(user, item, workflow, policy) {
|
|
46
|
+
const action = (0, workflow_publishing_policy_1.decideWorkflowPublishingAction)(policy, toPublishingContext(item, workflow));
|
|
47
|
+
if (action === 'noop') {
|
|
48
|
+
return workflow;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
if (action === 'publish') {
|
|
52
|
+
return await this.workflowService.activateWorkflow(user, workflow.id, {
|
|
53
|
+
versionId: workflow.versionId,
|
|
54
|
+
source: 'import',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return await this.workflowService.deactivateWorkflow(user, workflow.id, {
|
|
58
|
+
source: 'import',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.logger.warn('Failed to apply publishing policy to imported workflow', {
|
|
63
|
+
workflowId: workflow.id,
|
|
64
|
+
action,
|
|
65
|
+
error: (0, n8n_workflow_1.ensureError)(error).message,
|
|
66
|
+
});
|
|
67
|
+
return workflow;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.WorkflowPublisher = WorkflowPublisher;
|
|
72
|
+
exports.WorkflowPublisher = WorkflowPublisher = __decorate([
|
|
73
|
+
(0, di_1.Service)(),
|
|
74
|
+
__metadata("design:paramtypes", [backend_common_1.Logger,
|
|
75
|
+
db_1.ProjectRepository,
|
|
76
|
+
project_service_ee_1.ProjectService,
|
|
77
|
+
workflow_service_1.WorkflowService])
|
|
78
|
+
], WorkflowPublisher);
|
|
79
|
+
function toPublishingContext(item, workflow) {
|
|
80
|
+
return {
|
|
81
|
+
status: item.action === 'create' ? 'created' : 'updated',
|
|
82
|
+
sourcePublished: item.sourcePublished,
|
|
83
|
+
currentlyPublished: !!workflow.activeVersionId,
|
|
84
|
+
isArchived: workflow.isArchived,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=workflow-publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-publisher.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { WorkflowPublishingPolicy, type PublishingAction, type WorkflowPublishingContext } from './workflow-publishing-policy.types';
|
|
2
|
+
export declare function decideWorkflowPublishingAction(policy: WorkflowPublishingPolicy, context: WorkflowPublishingContext): PublishingAction;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decideWorkflowPublishingAction = decideWorkflowPublishingAction;
|
|
4
|
+
const workflow_publishing_policy_types_1 = require("./workflow-publishing-policy.types");
|
|
5
|
+
const WORKFLOW_PUBLISHING_POLICIES = {
|
|
6
|
+
[workflow_publishing_policy_types_1.WorkflowPublishingPolicy.PreservePublishedState]: ({ status, currentlyPublished, sourcePublished, }) => (status === 'updated' && currentlyPublished && sourcePublished ? 'publish' : 'noop'),
|
|
7
|
+
[workflow_publishing_policy_types_1.WorkflowPublishingPolicy.MatchSource]: ({ status, sourcePublished, currentlyPublished }) => {
|
|
8
|
+
if (sourcePublished && (status === 'created' || status === 'updated')) {
|
|
9
|
+
return 'publish';
|
|
10
|
+
}
|
|
11
|
+
if (status === 'updated' && !sourcePublished && currentlyPublished) {
|
|
12
|
+
return 'unpublish';
|
|
13
|
+
}
|
|
14
|
+
return 'noop';
|
|
15
|
+
},
|
|
16
|
+
[workflow_publishing_policy_types_1.WorkflowPublishingPolicy.PublishAll]: () => 'publish',
|
|
17
|
+
[workflow_publishing_policy_types_1.WorkflowPublishingPolicy.UnpublishAll]: ({ status, currentlyPublished }) => status === 'updated' && currentlyPublished ? 'unpublish' : 'noop',
|
|
18
|
+
};
|
|
19
|
+
function decideWorkflowPublishingAction(policy, context) {
|
|
20
|
+
if (context.status === 'skipped') {
|
|
21
|
+
return 'noop';
|
|
22
|
+
}
|
|
23
|
+
if (context.isArchived) {
|
|
24
|
+
return context.currentlyPublished ? 'unpublish' : 'noop';
|
|
25
|
+
}
|
|
26
|
+
return WORKFLOW_PUBLISHING_POLICIES[policy](context);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=workflow-publishing-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-publishing-policy.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow-publishing-policy.ts"],"names":[],"mappings":";;AAiCA,wEAaC;AA9CD,yFAI4C;AAM5C,MAAM,4BAA4B,GAG9B;IACH,CAAC,2DAAwB,CAAC,sBAAsB,CAAC,EAAE,CAAC,EACnD,MAAM,EACN,kBAAkB,EAClB,eAAe,GACf,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,kBAAkB,IAAI,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1F,CAAC,2DAAwB,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAAE,EAAE;QAC3F,IAAI,eAAe,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;YACvE,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,eAAe,IAAI,kBAAkB,EAAE,CAAC;YACpE,OAAO,WAAW,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IACD,CAAC,2DAAwB,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS;IACtD,CAAC,2DAAwB,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAC3E,MAAM,KAAK,SAAS,IAAI,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;CAClE,CAAC;AAEF,SAAgB,8BAA8B,CAC7C,MAAgC,EAChC,OAAkC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,CAAC;IAED,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const WorkflowPublishingPolicy: {
|
|
2
|
+
readonly PreservePublishedState: "preserve-published-state";
|
|
3
|
+
readonly MatchSource: "match-source";
|
|
4
|
+
readonly PublishAll: "publish-all";
|
|
5
|
+
readonly UnpublishAll: "unpublish-all";
|
|
6
|
+
};
|
|
7
|
+
export type WorkflowPublishingPolicy = (typeof WorkflowPublishingPolicy)[keyof typeof WorkflowPublishingPolicy];
|
|
8
|
+
export type PublishingAction = 'publish' | 'unpublish' | 'noop';
|
|
9
|
+
export interface WorkflowPublishingContext {
|
|
10
|
+
status: 'created' | 'updated' | 'skipped';
|
|
11
|
+
sourcePublished: boolean;
|
|
12
|
+
currentlyPublished: boolean;
|
|
13
|
+
isArchived: boolean;
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowPublishingPolicy = void 0;
|
|
4
|
+
exports.WorkflowPublishingPolicy = {
|
|
5
|
+
PreservePublishedState: 'preserve-published-state',
|
|
6
|
+
MatchSource: 'match-source',
|
|
7
|
+
PublishAll: 'publish-all',
|
|
8
|
+
UnpublishAll: 'unpublish-all',
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=workflow-publishing-policy.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-publishing-policy.types.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow-publishing-policy.types.ts"],"names":[],"mappings":";;;AACa,QAAA,wBAAwB,GAAG;IAEvC,sBAAsB,EAAE,0BAA0B;IAElD,WAAW,EAAE,cAAc;IAE3B,UAAU,EAAE,aAAa;IAEzB,YAAY,EAAE,eAAe;CACpB,CAAC"}
|
|
@@ -19,7 +19,7 @@ let WorkflowSerializer = class WorkflowSerializer {
|
|
|
19
19
|
settings: workflow.settings,
|
|
20
20
|
versionId: workflow.versionId,
|
|
21
21
|
parentFolderId: workflow.parentFolder?.id ?? null,
|
|
22
|
-
|
|
22
|
+
isPublished: workflow.activeVersionId === workflow.versionId,
|
|
23
23
|
isArchived: workflow.isArchived,
|
|
24
24
|
});
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.serializer.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow.serializer.ts"],"names":[],"mappings":";;;;;;;;;AACA,gCAAkC;AAGlC,2EAG+C;AASxC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC9B,SAAS,CAAC,QAAwB;QACjC,OAAO,0CAAwB,CAAC,KAAK,CAAC;YACrC,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,cAAc,EAAE,QAAQ,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI;YACjD,
|
|
1
|
+
{"version":3,"file":"workflow.serializer.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/entities/workflow/workflow.serializer.ts"],"names":[],"mappings":";;;;;;;;;AACA,gCAAkC;AAGlC,2EAG+C;AASxC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC9B,SAAS,CAAC,QAAwB;QACjC,OAAO,0CAAwB,CAAC,KAAK,CAAC;YACrC,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,cAAc,EAAE,QAAQ,CAAC,YAAY,EAAE,EAAE,IAAI,IAAI;YACjD,WAAW,EAAE,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC,SAAS;YAC5D,UAAU,EAAE,QAAQ,CAAC,UAAU;SAC/B,CAAC,CAAC;IACJ,CAAC;IAWD,WAAW,CAAC,IAAwB;QACnC,MAAM,MAAM,GAAG,0CAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO;YACN,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAgB;YAC9B,WAAW,EAAE,MAAM,CAAC,WAA2B;YAC/C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;IACH,CAAC;CACD,CAAA;AAnCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,YAAO,GAAE;GACG,kBAAkB,CAmC9B"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import type { PackageManifest } from '../../spec/manifest.schema';
|
|
2
2
|
import type { PackageReader } from '../package-reader';
|
|
3
|
+
export interface TarReaderLimits {
|
|
4
|
+
maxUncompressedBytes: number;
|
|
5
|
+
maxEntryBytes: number;
|
|
6
|
+
maxEntries: number;
|
|
7
|
+
maxPathLength: number;
|
|
8
|
+
}
|
|
3
9
|
export declare class TarPackageReader implements PackageReader {
|
|
4
10
|
private readonly buffer;
|
|
5
|
-
private readonly
|
|
11
|
+
private readonly limits;
|
|
6
12
|
private entries;
|
|
7
|
-
constructor(buffer: Buffer,
|
|
13
|
+
constructor(buffer: Buffer, limits: TarReaderLimits);
|
|
8
14
|
readManifest(): Promise<PackageManifest>;
|
|
9
|
-
readFile(
|
|
15
|
+
readFile(entryPath: string): Promise<Buffer>;
|
|
10
16
|
listEntries(): Promise<string[]>;
|
|
11
17
|
private load;
|
|
18
|
+
private validateEntryPath;
|
|
12
19
|
private parse;
|
|
13
20
|
}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.TarPackageReader = void 0;
|
|
7
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
4
9
|
const tar_1 = require("tar");
|
|
5
10
|
const bad_request_error_1 = require("../../../../errors/response-errors/bad-request.error");
|
|
6
11
|
const MANIFEST_PATH = 'manifest.json';
|
|
12
|
+
const ALLOWED_PATH_CHARS = /^[a-zA-Z0-9._/-]+$/;
|
|
7
13
|
class TarPackageReader {
|
|
8
|
-
constructor(buffer,
|
|
14
|
+
constructor(buffer, limits) {
|
|
9
15
|
this.buffer = buffer;
|
|
10
|
-
this.
|
|
16
|
+
this.limits = limits;
|
|
11
17
|
this.entries = null;
|
|
12
18
|
}
|
|
13
19
|
async readManifest() {
|
|
@@ -17,17 +23,17 @@ class TarPackageReader {
|
|
|
17
23
|
throw new bad_request_error_1.BadRequestError('Package is missing manifest.json');
|
|
18
24
|
}
|
|
19
25
|
try {
|
|
20
|
-
return
|
|
26
|
+
return (0, n8n_workflow_1.jsonParse)(manifest.toString('utf-8'));
|
|
21
27
|
}
|
|
22
28
|
catch {
|
|
23
29
|
throw new bad_request_error_1.BadRequestError('Package manifest is not valid JSON');
|
|
24
30
|
}
|
|
25
31
|
}
|
|
26
|
-
async readFile(
|
|
32
|
+
async readFile(entryPath) {
|
|
27
33
|
const entries = await this.load();
|
|
28
|
-
const content = entries.get(
|
|
34
|
+
const content = entries.get(entryPath);
|
|
29
35
|
if (!content) {
|
|
30
|
-
throw new bad_request_error_1.BadRequestError(`Package does not contain entry: ${
|
|
36
|
+
throw new bad_request_error_1.BadRequestError(`Package does not contain entry: ${entryPath}`);
|
|
31
37
|
}
|
|
32
38
|
return content;
|
|
33
39
|
}
|
|
@@ -41,41 +47,118 @@ class TarPackageReader {
|
|
|
41
47
|
this.entries = await this.parse();
|
|
42
48
|
return this.entries;
|
|
43
49
|
}
|
|
50
|
+
validateEntryPath(rawPath) {
|
|
51
|
+
const trimmed = rawPath.endsWith('/') ? rawPath.slice(0, -1) : rawPath;
|
|
52
|
+
if (trimmed.length === 0) {
|
|
53
|
+
throw new bad_request_error_1.BadRequestError('Package contains an entry with an empty path');
|
|
54
|
+
}
|
|
55
|
+
if (trimmed.length > this.limits.maxPathLength) {
|
|
56
|
+
throw new bad_request_error_1.BadRequestError('Package entry path exceeds the maximum allowed length');
|
|
57
|
+
}
|
|
58
|
+
if (trimmed.startsWith('/')) {
|
|
59
|
+
throw new bad_request_error_1.BadRequestError(`Package entry path "${trimmed}" must be relative`);
|
|
60
|
+
}
|
|
61
|
+
if (!ALLOWED_PATH_CHARS.test(trimmed)) {
|
|
62
|
+
throw new bad_request_error_1.BadRequestError(`Package entry path "${trimmed}" contains disallowed characters`);
|
|
63
|
+
}
|
|
64
|
+
const normalized = node_path_1.default.posix.normalize(trimmed);
|
|
65
|
+
if (normalized === '..' ||
|
|
66
|
+
normalized.startsWith('../') ||
|
|
67
|
+
normalized.includes('/../') ||
|
|
68
|
+
normalized.endsWith('/..')) {
|
|
69
|
+
throw new bad_request_error_1.BadRequestError(`Package entry path "${trimmed}" attempts to escape the package root`);
|
|
70
|
+
}
|
|
71
|
+
return normalized;
|
|
72
|
+
}
|
|
44
73
|
async parse() {
|
|
74
|
+
const { maxEntries, maxEntryBytes, maxUncompressedBytes } = this.limits;
|
|
45
75
|
const entries = new Map();
|
|
46
76
|
let totalUncompressedBytes = 0;
|
|
77
|
+
let entryCount = 0;
|
|
78
|
+
let firstFileSeen = false;
|
|
47
79
|
return await new Promise((resolve, reject) => {
|
|
48
|
-
const parser = new tar_1.Parser();
|
|
80
|
+
const parser = new tar_1.Parser({ strict: true });
|
|
81
|
+
let aborted = false;
|
|
82
|
+
const fail = (message) => {
|
|
83
|
+
if (aborted)
|
|
84
|
+
return;
|
|
85
|
+
aborted = true;
|
|
86
|
+
try {
|
|
87
|
+
parser.abort(new Error(message));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
}
|
|
91
|
+
reject(new bad_request_error_1.BadRequestError(message));
|
|
92
|
+
};
|
|
93
|
+
const accept = (entry) => {
|
|
94
|
+
if (++entryCount > maxEntries) {
|
|
95
|
+
throw new bad_request_error_1.BadRequestError('Package contains too many entries');
|
|
96
|
+
}
|
|
97
|
+
if (entry.type !== 'File' && entry.type !== 'Directory') {
|
|
98
|
+
throw new bad_request_error_1.BadRequestError(`Package contains a disallowed entry type for "${entry.path}"`);
|
|
99
|
+
}
|
|
100
|
+
const safePath = this.validateEntryPath(entry.path);
|
|
101
|
+
if (entries.has(safePath)) {
|
|
102
|
+
throw new bad_request_error_1.BadRequestError(`Package contains a duplicate entry for "${safePath}"`);
|
|
103
|
+
}
|
|
104
|
+
if (entry.type === 'Directory')
|
|
105
|
+
return null;
|
|
106
|
+
if (!firstFileSeen) {
|
|
107
|
+
firstFileSeen = true;
|
|
108
|
+
if (safePath !== MANIFEST_PATH) {
|
|
109
|
+
throw new bad_request_error_1.BadRequestError(`Package must begin with ${MANIFEST_PATH} but found "${safePath}"`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return safePath;
|
|
113
|
+
};
|
|
49
114
|
parser.on('entry', (entry) => {
|
|
50
|
-
|
|
115
|
+
let validated = null;
|
|
116
|
+
if (!aborted) {
|
|
117
|
+
try {
|
|
118
|
+
validated = accept(entry);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
fail(error instanceof bad_request_error_1.BadRequestError ? error.message : 'Invalid package entry path');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (validated === null) {
|
|
51
125
|
entry.resume();
|
|
52
126
|
return;
|
|
53
127
|
}
|
|
128
|
+
const safePath = validated;
|
|
54
129
|
const chunks = [];
|
|
55
130
|
let entryBytes = 0;
|
|
56
131
|
entry.on('data', (chunk) => {
|
|
132
|
+
if (aborted)
|
|
133
|
+
return;
|
|
57
134
|
entryBytes += chunk.length;
|
|
58
|
-
if (entryBytes >
|
|
59
|
-
|
|
135
|
+
if (entryBytes > maxEntryBytes) {
|
|
136
|
+
fail(`Package entry "${safePath}" exceeds the maximum allowed uncompressed size per entry`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
totalUncompressedBytes += chunk.length;
|
|
140
|
+
if (totalUncompressedBytes > maxUncompressedBytes) {
|
|
141
|
+
fail('Package exceeds the maximum allowed uncompressed size');
|
|
60
142
|
return;
|
|
61
143
|
}
|
|
62
144
|
chunks.push(chunk);
|
|
63
145
|
});
|
|
64
146
|
entry.on('end', () => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (totalUncompressedBytes > this.maxUncompressedBytes) {
|
|
68
|
-
reject(new bad_request_error_1.BadRequestError('Package exceeds the maximum allowed uncompressed size'));
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
entries.set(entry.path, content);
|
|
147
|
+
if (!aborted)
|
|
148
|
+
entries.set(safePath, Buffer.concat(chunks));
|
|
72
149
|
});
|
|
73
150
|
entry.resume();
|
|
74
151
|
});
|
|
75
|
-
parser.on('error', (
|
|
76
|
-
|
|
152
|
+
parser.on('error', () => {
|
|
153
|
+
if (aborted)
|
|
154
|
+
return;
|
|
155
|
+
aborted = true;
|
|
156
|
+
reject(new bad_request_error_1.BadRequestError('Failed to read package archive'));
|
|
157
|
+
});
|
|
158
|
+
parser.on('end', () => {
|
|
159
|
+
if (!aborted)
|
|
160
|
+
resolve(entries);
|
|
77
161
|
});
|
|
78
|
-
parser.on('end', () => resolve(entries));
|
|
79
162
|
parser.end(this.buffer);
|
|
80
163
|
});
|
|
81
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tar-package-reader.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/io/tar/tar-package-reader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tar-package-reader.js","sourceRoot":"","sources":["../../../../../src/modules/n8n-packages/io/tar/tar-package-reader.ts"],"names":[],"mappings":"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"}
|