n8n
Version:
n8n Workflow Automation Tool
136 lines • 6.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getIntegrationToolConnectionDescriptors = getIntegrationToolConnectionDescriptors;
exports.buildIntegrationConnectionId = buildIntegrationConnectionId;
exports.createIntegrationContextTool = createIntegrationContextTool;
exports.createIntegrationActionTool = createIntegrationActionTool;
const agents_1 = require("@n8n/agents");
const zod_1 = require("zod");
const integration_tool_definitions_1 = require("./integration-tool-definitions");
const integration_tool_descriptions_1 = require("./integration-tool-descriptions");
const integration_tool_execution_1 = require("./integration-tool-execution");
const integration_tool_schema_1 = require("./integration-tool-schema");
const actionSuspendSchema = zod_1.z.object({
type: zod_1.z.literal('integration_action'),
action: zod_1.z.string(),
integrationConnectionId: zod_1.z.string(),
messageContext: zod_1.z.unknown(),
});
const actionResumeSchema = zod_1.z.record(zod_1.z.string(), zod_1.z.unknown());
function getIntegrationToolConnectionDescriptors(integrations, agentId, capabilitiesFor) {
const sorted = [...integrations].sort((a, b) => {
const byType = a.type.localeCompare(b.type);
if (byType !== 0)
return byType;
return a.credentialId.localeCompare(b.credentialId);
});
const seenByType = new Map();
return sorted.map((integration) => {
const seenCount = seenByType.get(integration.type) ?? 0;
const nextCount = seenCount + 1;
seenByType.set(integration.type, nextCount);
const suffix = nextCount === 1 ? '' : `_${nextCount}`;
const baseName = `${integration.type}${suffix}`;
const capabilities = capabilitiesFor?.(integration);
const contextToolDefinitions = getContextToolDefinitions(capabilities);
const actionToolDefinitions = getActionToolDefinitions(capabilities);
return {
agentId,
integration,
integrationConnectionId: buildIntegrationConnectionId(integration),
contextToolName: `${baseName}_context`,
actionToolName: `${baseName}_action`,
contextQueries: contextToolDefinitions.map((definition) => definition.name),
actions: actionToolDefinitions.map((definition) => definition.name),
contextToolDefinitions,
actionToolDefinitions,
contextToolGuidance: capabilities?.contextToolGuidance,
actionToolGuidance: capabilities?.actionToolGuidance,
};
});
}
function buildIntegrationConnectionId(integration) {
return integration.credentialId === undefined
? integration.type
: `${integration.type}:${integration.credentialId}`;
}
function createIntegrationContextTool(params) {
const { descriptor, messageContextStore, queryExecutor } = params;
return new agents_1.Tool(descriptor.contextToolName)
.description((0, integration_tool_descriptions_1.buildContextToolDescription)(descriptor))
.input((0, integration_tool_schema_1.buildContextInputSchema)(descriptor.contextToolDefinitions))
.handler(async (input, ctx) => {
const toolInput = input;
if (toolInput.queries !== undefined) {
const results = await Promise.all(toolInput.queries.map(async (rawOperation) => {
const operation = (0, integration_tool_schema_1.toSingleContextOperation)(rawOperation);
return {
query: operation.query,
result: await (0, integration_tool_execution_1.executeContextToolOperation)({
operation,
descriptor,
messageContextStore,
queryExecutor,
persistence: ctx.persistence,
}),
};
}));
return { ok: true, results };
}
return await (0, integration_tool_execution_1.executeContextToolOperation)({
operation: (0, integration_tool_schema_1.toSingleContextOperation)(toolInput),
descriptor,
messageContextStore,
queryExecutor,
persistence: ctx.persistence,
});
});
}
function createIntegrationActionTool(params) {
const { descriptor, messageContextStore, actionExecutor } = params;
return new agents_1.Tool(descriptor.actionToolName)
.description((0, integration_tool_descriptions_1.buildActionToolDescription)(descriptor))
.input((0, integration_tool_schema_1.buildActionInputSchema)(descriptor.actionToolDefinitions))
.suspend(actionSuspendSchema)
.resume(actionResumeSchema)
.handler(async (input, ctx) => {
if (ctx.resumeData) {
return ctx.resumeData;
}
const interruptCtx = ctx;
const toolInput = input;
if (toolInput.actions !== undefined) {
return await (0, integration_tool_execution_1.executeActionToolBatch)({
operations: toolInput.actions,
descriptor,
messageContextStore,
actionExecutor,
ctx,
});
}
return await (0, integration_tool_execution_1.executeActionToolOperation)({
operation: (0, integration_tool_schema_1.toSingleActionOperation)(toolInput),
descriptor,
messageContextStore,
actionExecutor,
ctx,
interruptCtx,
allowSuspend: true,
});
});
}
function getContextToolDefinitions(capabilities) {
if (capabilities?.contextToolDefinitions)
return [...capabilities.contextToolDefinitions];
if (capabilities?.contextQueries)
return (0, integration_tool_definitions_1.resolveIntegrationContextQueryDefinitions)(capabilities.contextQueries);
return [...integration_tool_definitions_1.DEFAULT_INTEGRATION_CONTEXT_TOOL_DEFINITIONS];
}
function getActionToolDefinitions(capabilities) {
if (capabilities?.actionToolDefinitions)
return [...capabilities.actionToolDefinitions];
if (capabilities?.actions)
return (0, integration_tool_definitions_1.resolveIntegrationActionDefinitions)(capabilities.actions);
return [...integration_tool_definitions_1.DEFAULT_INTEGRATION_ACTION_TOOL_DEFINITIONS];
}
//# sourceMappingURL=integration-tool-factory.js.map