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