UNPKG

n8n

Version:

n8n Workflow Automation Tool

152 lines • 7.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reconcileNodeToolGatewayCredentials = reconcileNodeToolGatewayCredentials; exports.listAiGatewayManagedCredentialTypes = listAiGatewayManagedCredentialTypes; const node_catalog_1 = require("@n8n/ai-utilities/node-catalog"); const n8n_workflow_1 = require("n8n-workflow"); const ai_gateway_eligibility_1 = require("../../../services/ai-gateway-eligibility"); const N8N_CONNECT_CREDENTIAL_NAME = 'n8n credits'; const AI_GATEWAY_MANAGED_CREDENTIAL_FLAG = '__aiGatewayManaged'; function aiGatewayManagedCredential() { return { id: null, name: N8N_CONNECT_CREDENTIAL_NAME, [AI_GATEWAY_MANAGED_CREDENTIAL_FLAG]: true, }; } function setAiGatewayManagedCredential(node, credentialType, activationParameters) { node.credentials = node.credentials ?? {}; node.credentials[credentialType] = aiGatewayManagedCredential(); if (activationParameters && Object.keys(activationParameters).length > 0) { node.nodeParameters = { ...(node.nodeParameters ?? {}), ...activationParameters }; } } function resolveNodeParameters(node, description) { const rawParameters = (node.nodeParameters ?? {}); return (n8n_workflow_1.NodeHelpers.getNodeParameters(description.properties, rawParameters, true, false, { typeVersion: node.nodeTypeVersion }, description) ?? rawParameters); } function isCredentialDisplayed(node, description, credentialType, resolvedParameters) { const credentialDefinition = description.credentials?.find((c) => c.name === credentialType); if (!credentialDefinition) return true; return n8n_workflow_1.NodeHelpers.displayParameter(resolvedParameters, credentialDefinition, { typeVersion: node.nodeTypeVersion }, description); } function reconcileAiGatewayManagedMarkers(node, description, isEligible) { if (!node.credentials) return false; let parametersChanged = false; for (const [slot, ref] of Object.entries(node.credentials)) { if (!(AI_GATEWAY_MANAGED_CREDENTIAL_FLAG in ref)) continue; if (!isEligible(slot)) { delete node.credentials[slot]; continue; } const activation = (0, n8n_workflow_1.resolveSupportedCredentialActivation)(description, { typeVersion: node.nodeTypeVersion, parameters: resolveNodeParameters(node, description) }, (candidateType) => candidateType === slot); setAiGatewayManagedCredential(node, slot, activation?.parameters); if (activation && Object.keys(activation.parameters).length > 0) parametersChanged = true; } return parametersChanged; } function reconcileNodeToolGatewayCredentials(tools, nodeTypes, aiGatewayConfig, ownedCredentialTypes) { for (const tool of tools ?? []) { if (tool.type === 'node') { reconcileNode(tool.node, nodeTypes, aiGatewayConfig, ownedCredentialTypes); } } } function listAiGatewayManagedCredentialTypes(tools, nodeTypes) { const managed = new Set(); const unsatisfied = new Set(); for (const tool of tools ?? []) { if (tool.type !== 'node') continue; const node = tool.node; let description; try { description = nodeTypes.getByNameAndVersion(node.nodeType, node.nodeTypeVersion).description; } catch { continue; } for (const [credentialType, ref] of Object.entries(node.credentials ?? {})) { if (AI_GATEWAY_MANAGED_CREDENTIAL_FLAG in ref) managed.add(credentialType); } const resolvedParameters = resolveNodeParameters(node, description); for (const slot of (0, node_catalog_1.getRequiredNodeCredentialSlots)(description)) { const credentialType = slot.credentialType; const ref = node.credentials?.[credentialType]; if (ref && (ref.id || AI_GATEWAY_MANAGED_CREDENTIAL_FLAG in ref)) continue; if (isCredentialDisplayed(node, description, credentialType, resolvedParameters)) { unsatisfied.add(credentialType); } } } return [...managed].filter((credentialType) => !unsatisfied.has(credentialType)); } function reconcileNode(node, nodeTypes, aiGatewayConfig, ownedCredentialTypes) { let description; try { description = nodeTypes.getByNameAndVersion(node.nodeType, node.nodeTypeVersion).description; } catch { dropAiGatewayMarkers(node); return; } let resolvedParameters = resolveNodeParameters(node, description); const eligibility = (credentialType) => aiGatewayConfig === undefined ? { eligible: false, reason: 'nodeNotCovered' } : (0, ai_gateway_eligibility_1.checkAiGatewayEligibility)({ type: node.nodeType, typeVersion: node.nodeTypeVersion, parameters: (node.nodeParameters ?? {}), }, credentialType, aiGatewayConfig, resolvedParameters); const isEligible = (credentialType) => eligibility(credentialType).eligible; const assignSupportedSiblingCredential = (credentialType) => { if (aiGatewayConfig === undefined) return; const activation = (0, n8n_workflow_1.resolveSupportedCredentialActivation)(description, { typeVersion: node.nodeTypeVersion, parameters: resolvedParameters }, (candidateType) => candidateType !== credentialType && !node.credentials?.[candidateType]?.id && !ownedCredentialTypes.has(candidateType) && isEligible(candidateType)); if (!activation) return; setAiGatewayManagedCredential(node, activation.credentialType, activation.parameters); resolvedParameters = resolveNodeParameters(node, description); }; if (reconcileAiGatewayManagedMarkers(node, description, isEligible)) { resolvedParameters = resolveNodeParameters(node, description); } if (aiGatewayConfig === undefined) return; if (ai_gateway_eligibility_1.HTTP_NODE_TYPES.has(node.nodeType)) return; for (const slot of (0, node_catalog_1.getRequiredNodeCredentialSlots)(description)) { const credentialType = slot.credentialType; const existing = node.credentials?.[credentialType]; if (existing && (existing.id || AI_GATEWAY_MANAGED_CREDENTIAL_FLAG in existing)) continue; if (ownedCredentialTypes.has(credentialType)) continue; if (!isCredentialDisplayed(node, description, credentialType, resolvedParameters)) continue; const slotEligibility = eligibility(credentialType); if (slotEligibility.eligible) { setAiGatewayManagedCredential(node, credentialType); continue; } assignSupportedSiblingCredential(credentialType); } } function dropAiGatewayMarkers(node) { if (!node.credentials) return; for (const [slot, ref] of Object.entries(node.credentials)) { if (AI_GATEWAY_MANAGED_CREDENTIAL_FLAG in ref) delete node.credentials[slot]; } } //# sourceMappingURL=reconcile-node-tool-gateway-credentials.js.map