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