mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-03-16 23:43:07 +00:00
- Normalize name→nodeName and id→nodeId for node-targeting operations in the Zod schema transform, so LLMs using natural field names no longer get "Node not found" errors - Replace hardcoded ALL_CONNECTION_TYPES with dynamic iteration so AI sub-nodes (ai_outputParser, ai_document, ai_textSplitter, etc.) are not flagged as disconnected during save - Add .catchall() to workflowConnectionSchema and extend connection reference validation to cover all connection types, not just main - Fix filterOperationsByFixes ID-vs-name mismatch: typeversion-upgrade operations now include nodeName alongside nodeId, and the filter checks both fields Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
committed by
GitHub
parent
65ab94deb2
commit
f7a1cfe8bf
11
CHANGELOG.md
11
CHANGELOG.md
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.37.3] - 2026-03-15
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **updateNode `name`/`id` field normalization**: LLMs sending `{type: "updateNode", name: "Code", ...}` instead of `nodeName` no longer get "Node not found" errors. The Zod schema now normalizes `name` → `nodeName` and `id` → `nodeId` for node-targeting operations (updateNode, removeNode, moveNode, enableNode, disableNode)
|
||||||
|
- **AI connection types in disconnected-node detection** (Issue #581): Replaced hardcoded 7-type list with dynamic iteration over all connection types present in workflow data. Nodes connected via `ai_outputParser`, `ai_document`, `ai_textSplitter`, `ai_agent`, `ai_chain`, `ai_retriever` are no longer falsely flagged as disconnected during save
|
||||||
|
- **Connection schema and reference validation** (Issue #581): Added `.catchall()` to `workflowConnectionSchema` for unknown AI connection types, and extended connection reference validation to check all connection types (not just `main`)
|
||||||
|
- **autofix `filterOperationsByFixes` ID-vs-name mismatch**: Typeversion-upgrade operations now include `nodeName` alongside `nodeId`, and the filter checks both fields. Previously, `applyFixes=true` silently dropped all typeversion fixes because `fixedNodes` contained names but the filter only checked `nodeId` (UUID)
|
||||||
|
|
||||||
|
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
|
||||||
|
|
||||||
## [2.37.2] - 2026-03-15
|
## [2.37.2] - 2026-03-15
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
2
dist/mcp/handlers-n8n-manager.d.ts.map
vendored
2
dist/mcp/handlers-n8n-manager.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"handlers-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-n8n-manager.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"handlers-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-n8n-manager.ts"],"names":[],"mappings":"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"}
|
||||||
9
dist/mcp/handlers-n8n-manager.js
vendored
9
dist/mcp/handlers-n8n-manager.js
vendored
@@ -288,6 +288,15 @@ async function handleCreateWorkflow(args, context) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
const workflow = await client.createWorkflow(input);
|
const workflow = await client.createWorkflow(input);
|
||||||
|
if (!workflow || !workflow.id) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
error: 'Workflow creation failed: n8n API returned an empty or invalid response. Verify your N8N_API_URL points to the correct /api/v1 endpoint and that the n8n instance supports workflow creation.',
|
||||||
|
details: {
|
||||||
|
response: workflow ? { keys: Object.keys(workflow) } : null
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
telemetry_1.telemetry.trackWorkflowCreation(workflow, true);
|
telemetry_1.telemetry.trackWorkflowCreation(workflow, true);
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
|
|||||||
2
dist/mcp/handlers-n8n-manager.js.map
vendored
2
dist/mcp/handlers-n8n-manager.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/handlers-workflow-diff.d.ts.map
vendored
2
dist/mcp/handlers-workflow-diff.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"handlers-workflow-diff.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-workflow-diff.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AA0D7D,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,eAAe,CAAC,CA6V1B"}
|
{"version":3,"file":"handlers-workflow-diff.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-workflow-diff.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAgF7D,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,eAAe,CAAC,CA6Z1B"}
|
||||||
94
dist/mcp/handlers-workflow-diff.js
vendored
94
dist/mcp/handlers-workflow-diff.js
vendored
@@ -50,6 +50,9 @@ function getValidator(repository) {
|
|||||||
}
|
}
|
||||||
return cachedValidator;
|
return cachedValidator;
|
||||||
}
|
}
|
||||||
|
const NODE_TARGETING_OPERATIONS = new Set([
|
||||||
|
'updateNode', 'removeNode', 'moveNode', 'enableNode', 'disableNode'
|
||||||
|
]);
|
||||||
const workflowDiffSchema = zod_1.z.object({
|
const workflowDiffSchema = zod_1.z.object({
|
||||||
id: zod_1.z.string(),
|
id: zod_1.z.string(),
|
||||||
operations: zod_1.z.array(zod_1.z.object({
|
operations: zod_1.z.array(zod_1.z.object({
|
||||||
@@ -64,8 +67,8 @@ const workflowDiffSchema = zod_1.z.object({
|
|||||||
target: zod_1.z.string().optional(),
|
target: zod_1.z.string().optional(),
|
||||||
from: zod_1.z.string().optional(),
|
from: zod_1.z.string().optional(),
|
||||||
to: zod_1.z.string().optional(),
|
to: zod_1.z.string().optional(),
|
||||||
sourceOutput: zod_1.z.string().optional(),
|
sourceOutput: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).transform(String).optional(),
|
||||||
targetInput: zod_1.z.string().optional(),
|
targetInput: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).transform(String).optional(),
|
||||||
sourceIndex: zod_1.z.number().optional(),
|
sourceIndex: zod_1.z.number().optional(),
|
||||||
targetIndex: zod_1.z.number().optional(),
|
targetIndex: zod_1.z.number().optional(),
|
||||||
branch: zod_1.z.enum(['true', 'false']).optional(),
|
branch: zod_1.z.enum(['true', 'false']).optional(),
|
||||||
@@ -76,6 +79,19 @@ const workflowDiffSchema = zod_1.z.object({
|
|||||||
settings: zod_1.z.any().optional(),
|
settings: zod_1.z.any().optional(),
|
||||||
name: zod_1.z.string().optional(),
|
name: zod_1.z.string().optional(),
|
||||||
tag: zod_1.z.string().optional(),
|
tag: zod_1.z.string().optional(),
|
||||||
|
id: zod_1.z.string().optional(),
|
||||||
|
}).transform((op) => {
|
||||||
|
if (NODE_TARGETING_OPERATIONS.has(op.type)) {
|
||||||
|
if (!op.nodeName && !op.nodeId && op.name) {
|
||||||
|
op.nodeName = op.name;
|
||||||
|
op.name = undefined;
|
||||||
|
}
|
||||||
|
if (!op.nodeId && op.id) {
|
||||||
|
op.nodeId = op.id;
|
||||||
|
op.id = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return op;
|
||||||
})),
|
})),
|
||||||
validateOnly: zod_1.z.boolean().optional(),
|
validateOnly: zod_1.z.boolean().optional(),
|
||||||
continueOnError: zod_1.z.boolean().optional(),
|
continueOnError: zod_1.z.boolean().optional(),
|
||||||
@@ -167,11 +183,12 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
else {
|
else {
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
|
saved: false,
|
||||||
error: 'Failed to apply diff operations',
|
error: 'Failed to apply diff operations',
|
||||||
|
operationsApplied: diffResult.operationsApplied,
|
||||||
details: {
|
details: {
|
||||||
errors: diffResult.errors,
|
errors: diffResult.errors,
|
||||||
warnings: diffResult.warnings,
|
warnings: diffResult.warnings,
|
||||||
operationsApplied: diffResult.operationsApplied,
|
|
||||||
applied: diffResult.applied,
|
applied: diffResult.applied,
|
||||||
failed: diffResult.failed
|
failed: diffResult.failed
|
||||||
}
|
}
|
||||||
@@ -239,6 +256,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
if (!skipValidation) {
|
if (!skipValidation) {
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
|
saved: false,
|
||||||
error: errorMessage,
|
error: errorMessage,
|
||||||
details: {
|
details: {
|
||||||
errors: structureErrors,
|
errors: structureErrors,
|
||||||
@@ -247,7 +265,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
applied: diffResult.applied,
|
applied: diffResult.applied,
|
||||||
recoveryGuidance: recoverySteps,
|
recoveryGuidance: recoverySteps,
|
||||||
note: 'Operations were applied but created an invalid workflow structure. The workflow was NOT saved to n8n to prevent UI rendering errors.',
|
note: 'Operations were applied but created an invalid workflow structure. The workflow was NOT saved to n8n to prevent UI rendering errors.',
|
||||||
autoSanitizationNote: 'Auto-sanitization runs on all nodes during updates to fix operator structures and add missing metadata. However, it cannot fix all issues (e.g., broken connections, branch mismatches). Use the recovery guidance above to resolve remaining issues.'
|
autoSanitizationNote: 'Auto-sanitization runs on modified nodes during updates to fix operator structures and add missing metadata. However, it cannot fix all issues (e.g., broken connections, branch mismatches). Use the recovery guidance above to resolve remaining issues.'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -259,6 +277,58 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const updatedWorkflow = await client.updateWorkflow(input.id, diffResult.workflow);
|
const updatedWorkflow = await client.updateWorkflow(input.id, diffResult.workflow);
|
||||||
|
let tagWarnings = [];
|
||||||
|
if (diffResult.tagsToAdd?.length || diffResult.tagsToRemove?.length) {
|
||||||
|
try {
|
||||||
|
const existingTags = Array.isArray(updatedWorkflow.tags)
|
||||||
|
? updatedWorkflow.tags.map((t) => typeof t === 'object' ? { id: t.id, name: t.name } : { id: '', name: t })
|
||||||
|
: [];
|
||||||
|
const allTags = await client.listTags();
|
||||||
|
const tagMap = new Map();
|
||||||
|
for (const t of allTags.data) {
|
||||||
|
if (t.id)
|
||||||
|
tagMap.set(t.name.toLowerCase(), t.id);
|
||||||
|
}
|
||||||
|
for (const tagName of (diffResult.tagsToAdd || [])) {
|
||||||
|
if (!tagMap.has(tagName.toLowerCase())) {
|
||||||
|
try {
|
||||||
|
const newTag = await client.createTag({ name: tagName });
|
||||||
|
if (newTag.id)
|
||||||
|
tagMap.set(tagName.toLowerCase(), newTag.id);
|
||||||
|
}
|
||||||
|
catch (createErr) {
|
||||||
|
tagWarnings.push(`Failed to create tag "${tagName}": ${createErr instanceof Error ? createErr.message : 'Unknown error'}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const currentTagIds = new Set();
|
||||||
|
for (const et of existingTags) {
|
||||||
|
if (et.id) {
|
||||||
|
currentTagIds.add(et.id);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const resolved = tagMap.get(et.name.toLowerCase());
|
||||||
|
if (resolved)
|
||||||
|
currentTagIds.add(resolved);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (const tagName of (diffResult.tagsToAdd || [])) {
|
||||||
|
const tagId = tagMap.get(tagName.toLowerCase());
|
||||||
|
if (tagId)
|
||||||
|
currentTagIds.add(tagId);
|
||||||
|
}
|
||||||
|
for (const tagName of (diffResult.tagsToRemove || [])) {
|
||||||
|
const tagId = tagMap.get(tagName.toLowerCase());
|
||||||
|
if (tagId)
|
||||||
|
currentTagIds.delete(tagId);
|
||||||
|
}
|
||||||
|
await client.updateWorkflowTags(input.id, Array.from(currentTagIds));
|
||||||
|
}
|
||||||
|
catch (tagError) {
|
||||||
|
tagWarnings.push(`Tag update failed: ${tagError instanceof Error ? tagError.message : 'Unknown error'}`);
|
||||||
|
logger_1.logger.warn('Tag operations failed (non-blocking)', tagError);
|
||||||
|
}
|
||||||
|
}
|
||||||
let finalWorkflow = updatedWorkflow;
|
let finalWorkflow = updatedWorkflow;
|
||||||
let activationMessage = '';
|
let activationMessage = '';
|
||||||
try {
|
try {
|
||||||
@@ -286,6 +356,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
logger_1.logger.error('Failed to activate workflow after update', activationError);
|
logger_1.logger.error('Failed to activate workflow after update', activationError);
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
|
saved: true,
|
||||||
error: 'Workflow updated successfully but activation failed',
|
error: 'Workflow updated successfully but activation failed',
|
||||||
details: {
|
details: {
|
||||||
workflowUpdated: true,
|
workflowUpdated: true,
|
||||||
@@ -303,6 +374,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
logger_1.logger.error('Failed to deactivate workflow after update', deactivationError);
|
logger_1.logger.error('Failed to deactivate workflow after update', deactivationError);
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
|
saved: true,
|
||||||
error: 'Workflow updated successfully but deactivation failed',
|
error: 'Workflow updated successfully but deactivation failed',
|
||||||
details: {
|
details: {
|
||||||
workflowUpdated: true,
|
workflowUpdated: true,
|
||||||
@@ -329,6 +401,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
|
saved: true,
|
||||||
data: {
|
data: {
|
||||||
id: finalWorkflow.id,
|
id: finalWorkflow.id,
|
||||||
name: finalWorkflow.name,
|
name: finalWorkflow.name,
|
||||||
@@ -341,7 +414,7 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
applied: diffResult.applied,
|
applied: diffResult.applied,
|
||||||
failed: diffResult.failed,
|
failed: diffResult.failed,
|
||||||
errors: diffResult.errors,
|
errors: diffResult.errors,
|
||||||
warnings: diffResult.warnings
|
warnings: mergeWarnings(diffResult.warnings, tagWarnings)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -379,7 +452,9 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
error: 'Invalid input',
|
error: 'Invalid input',
|
||||||
details: { errors: error.errors }
|
details: {
|
||||||
|
errors: error.errors.map(e => `${e.path.join('.')}: ${e.message}`)
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
logger_1.logger.error('Failed to update partial workflow', error);
|
logger_1.logger.error('Failed to update partial workflow', error);
|
||||||
@@ -389,6 +464,13 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function mergeWarnings(diffWarnings, tagWarnings) {
|
||||||
|
const merged = [
|
||||||
|
...(diffWarnings || []),
|
||||||
|
...tagWarnings.map(w => ({ operation: -1, message: w }))
|
||||||
|
];
|
||||||
|
return merged.length > 0 ? merged : undefined;
|
||||||
|
}
|
||||||
function inferIntentFromOperations(operations) {
|
function inferIntentFromOperations(operations) {
|
||||||
if (!operations || operations.length === 0) {
|
if (!operations || operations.length === 0) {
|
||||||
return 'Partial workflow update';
|
return 'Partial workflow update';
|
||||||
|
|||||||
2
dist/mcp/handlers-workflow-diff.js.map
vendored
2
dist/mcp/handlers-workflow-diff.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/server.d.ts.map
vendored
2
dist/mcp/server.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAmGnE,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,UAAU,CAAkB;gBAExB,eAAe,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,gBAAgB;IAuGvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA+Cd,kBAAkB;YAiDlB,wBAAwB;IA0BtC,OAAO,CAAC,kBAAkB;YA6CZ,iBAAiB;IAa/B,OAAO,CAAC,eAAe,CAAkB;YAE3B,sBAAsB;IAgDpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IA0XrB,OAAO,CAAC,wBAAwB;IAoFhC,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,qBAAqB;IAiF7B,OAAO,CAAC,2BAA2B;YA0UrB,SAAS;YA2DT,WAAW;YAkFX,WAAW;YA0CX,cAAc;YA8Md,gBAAgB;IAqD9B,OAAO,CAAC,mBAAmB;IAwE3B,OAAO,CAAC,eAAe;YAsBT,eAAe;IA2L7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,iBAAiB;YAqFX,WAAW;YAgCX,oBAAoB;IAuFlC,OAAO,CAAC,aAAa;YAQP,qBAAqB;YAwDrB,iBAAiB;YAiKjB,OAAO;YAgDP,cAAc;YAwFd,iBAAiB;IAqC/B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,4BAA4B;YAKtB,oBAAoB;IAsDlC,OAAO,CAAC,gBAAgB;YAiBV,SAAS;YA6CT,kBAAkB;YAqElB,uBAAuB;YAsDvB,iBAAiB;IAqE/B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,uBAAuB;IA4D/B,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YAoEnB,qBAAqB;IAS7B,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,aAAa;YAcb,iBAAiB;YAoBjB,WAAW;YAwBX,eAAe;YAqBf,mBAAmB;YAwBnB,yBAAyB;IA4CvC,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;YA6HhB,2BAA2B;YAiE3B,2BAA2B;IAyEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgEhC"}
|
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAmGnE,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,UAAU,CAAkB;gBAExB,eAAe,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,gBAAgB;IA8GvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA+Cd,kBAAkB;YAiDlB,wBAAwB;IA0BtC,OAAO,CAAC,kBAAkB;YA6CZ,iBAAiB;IAa/B,OAAO,CAAC,eAAe,CAAkB;YAE3B,sBAAsB;IAgDpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IA0XrB,OAAO,CAAC,wBAAwB;IAoFhC,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,qBAAqB;IAiF7B,OAAO,CAAC,2BAA2B;YA0UrB,SAAS;YA2DT,WAAW;YAkFX,WAAW;YA0CX,cAAc;YA8Md,gBAAgB;IAqD9B,OAAO,CAAC,mBAAmB;IAwE3B,OAAO,CAAC,eAAe;YAsBT,eAAe;IA2L7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,iBAAiB;YAqFX,WAAW;YAgCX,oBAAoB;IAuFlC,OAAO,CAAC,aAAa;YAQP,qBAAqB;YAwDrB,iBAAiB;YAiKjB,OAAO;YAgDP,cAAc;YAwFd,iBAAiB;IAqC/B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,4BAA4B;YAKtB,oBAAoB;IAsDlC,OAAO,CAAC,gBAAgB;YAiBV,SAAS;YA6CT,kBAAkB;YAqElB,uBAAuB;YAsDvB,iBAAiB;IAqE/B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,uBAAuB;IA4D/B,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YAoEnB,qBAAqB;IAS7B,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,aAAa;YAcb,iBAAiB;YAoBjB,WAAW;YAwBX,eAAe;YAqBf,mBAAmB;YAwBnB,yBAAyB;IA4CvC,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;YA6HhB,2BAA2B;YAiE3B,2BAA2B;IAyEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgEhC"}
|
||||||
1
dist/mcp/server.js
vendored
1
dist/mcp/server.js
vendored
@@ -124,6 +124,7 @@ class N8NDocumentationMCPServer {
|
|||||||
this.earlyLogger.logCheckpoint(startup_checkpoints_1.STARTUP_CHECKPOINTS.N8N_API_READY);
|
this.earlyLogger.logCheckpoint(startup_checkpoints_1.STARTUP_CHECKPOINTS.N8N_API_READY);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
this.initialized.catch(() => { });
|
||||||
logger_1.logger.info('Initializing n8n Documentation MCP server');
|
logger_1.logger.info('Initializing n8n Documentation MCP server');
|
||||||
this.server = new index_js_1.Server({
|
this.server = new index_js_1.Server({
|
||||||
name: 'n8n-documentation-mcp',
|
name: 'n8n-documentation-mcp',
|
||||||
|
|||||||
2
dist/mcp/server.js.map
vendored
2
dist/mcp/server.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/services/ai-tool-validators.d.ts
vendored
4
dist/services/ai-tool-validators.d.ts
vendored
@@ -33,8 +33,8 @@ export declare function validateVectorStoreTool(node: WorkflowNode, reverseConne
|
|||||||
export declare function validateWorkflowTool(node: WorkflowNode, reverseConnections?: Map<string, ReverseConnection[]>): ValidationIssue[];
|
export declare function validateWorkflowTool(node: WorkflowNode, reverseConnections?: Map<string, ReverseConnection[]>): ValidationIssue[];
|
||||||
export declare function validateAIAgentTool(node: WorkflowNode, reverseConnections: Map<string, ReverseConnection[]>): ValidationIssue[];
|
export declare function validateAIAgentTool(node: WorkflowNode, reverseConnections: Map<string, ReverseConnection[]>): ValidationIssue[];
|
||||||
export declare function validateMCPClientTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateMCPClientTool(node: WorkflowNode): ValidationIssue[];
|
||||||
export declare function validateCalculatorTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateCalculatorTool(_node: WorkflowNode): ValidationIssue[];
|
||||||
export declare function validateThinkTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateThinkTool(_node: WorkflowNode): ValidationIssue[];
|
||||||
export declare function validateSerpApiTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateSerpApiTool(node: WorkflowNode): ValidationIssue[];
|
||||||
export declare function validateWikipediaTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateWikipediaTool(node: WorkflowNode): ValidationIssue[];
|
||||||
export declare function validateSearXngTool(node: WorkflowNode): ValidationIssue[];
|
export declare function validateSearXngTool(node: WorkflowNode): ValidationIssue[];
|
||||||
|
|||||||
2
dist/services/ai-tool-validators.d.ts.map
vendored
2
dist/services/ai-tool-validators.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"ai-tool-validators.d.ts","sourceRoot":"","sources":["../../src/services/ai-tool-validators.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC;IAChB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAuJ7E;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAoCtE;AAMD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,YAAY,EAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EACpD,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAmCnB;AAMD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,eAAe,EAAE,CA0BjI;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GACnD,eAAe,EAAE,CAmCnB;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA0B3E;AAMD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAM5E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAMvE;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAyBzE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA4B3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA0BzE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAyB9E;AAKD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAarB,CAAC;AAKX,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD;AAKD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EACpD,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAgCnB"}
|
{"version":3,"file":"ai-tool-validators.d.ts","sourceRoot":"","sources":["../../src/services/ai-tool-validators.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC;IAChB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAuJ7E;AAMD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAoCtE;AAMD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,YAAY,EAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EACpD,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAmCnB;AAMD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,eAAe,EAAE,CA0BjI;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GACnD,eAAe,EAAE,CAmCnB;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA0B3E;AAMD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,EAAE,CAG7E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,EAAE,CAGxE;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAyBzE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA4B3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CA0BzE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,EAAE,CAyB9E;AAKD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAarB,CAAC;AAKX,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGzD;AAKD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EACpD,QAAQ,EAAE,YAAY,GACrB,eAAe,EAAE,CAgCnB"}
|
||||||
37
dist/services/ai-tool-validators.js
vendored
37
dist/services/ai-tool-validators.js
vendored
@@ -21,9 +21,14 @@ const MIN_DESCRIPTION_LENGTH_MEDIUM = 15;
|
|||||||
const MIN_DESCRIPTION_LENGTH_LONG = 20;
|
const MIN_DESCRIPTION_LENGTH_LONG = 20;
|
||||||
const MAX_ITERATIONS_WARNING_THRESHOLD = 50;
|
const MAX_ITERATIONS_WARNING_THRESHOLD = 50;
|
||||||
const MAX_TOPK_WARNING_THRESHOLD = 20;
|
const MAX_TOPK_WARNING_THRESHOLD = 20;
|
||||||
|
function getToolDescription(node) {
|
||||||
|
return (node.parameters.toolDescription ||
|
||||||
|
node.parameters.description ||
|
||||||
|
node.parameters.options?.description);
|
||||||
|
}
|
||||||
function validateHTTPRequestTool(node) {
|
function validateHTTPRequestTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -32,7 +37,7 @@ function validateHTTPRequestTool(node) {
|
|||||||
code: 'MISSING_TOOL_DESCRIPTION'
|
code: 'MISSING_TOOL_DESCRIPTION'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (node.parameters.toolDescription.trim().length < MIN_DESCRIPTION_LENGTH_MEDIUM) {
|
else if (getToolDescription(node).trim().length < MIN_DESCRIPTION_LENGTH_MEDIUM) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'warning',
|
severity: 'warning',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -154,7 +159,7 @@ function validateHTTPRequestTool(node) {
|
|||||||
}
|
}
|
||||||
function validateCodeTool(node) {
|
function validateCodeTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -184,7 +189,7 @@ function validateCodeTool(node) {
|
|||||||
}
|
}
|
||||||
function validateVectorStoreTool(node, reverseConnections, workflow) {
|
function validateVectorStoreTool(node, reverseConnections, workflow) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -216,7 +221,7 @@ function validateVectorStoreTool(node, reverseConnections, workflow) {
|
|||||||
}
|
}
|
||||||
function validateWorkflowTool(node, reverseConnections) {
|
function validateWorkflowTool(node, reverseConnections) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -238,7 +243,7 @@ function validateWorkflowTool(node, reverseConnections) {
|
|||||||
}
|
}
|
||||||
function validateAIAgentTool(node, reverseConnections) {
|
function validateAIAgentTool(node, reverseConnections) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -270,7 +275,7 @@ function validateAIAgentTool(node, reverseConnections) {
|
|||||||
}
|
}
|
||||||
function validateMCPClientTool(node) {
|
function validateMCPClientTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -290,17 +295,15 @@ function validateMCPClientTool(node) {
|
|||||||
}
|
}
|
||||||
return issues;
|
return issues;
|
||||||
}
|
}
|
||||||
function validateCalculatorTool(node) {
|
function validateCalculatorTool(_node) {
|
||||||
const issues = [];
|
return [];
|
||||||
return issues;
|
|
||||||
}
|
}
|
||||||
function validateThinkTool(node) {
|
function validateThinkTool(_node) {
|
||||||
const issues = [];
|
return [];
|
||||||
return issues;
|
|
||||||
}
|
}
|
||||||
function validateSerpApiTool(node) {
|
function validateSerpApiTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -321,7 +324,7 @@ function validateSerpApiTool(node) {
|
|||||||
}
|
}
|
||||||
function validateWikipediaTool(node) {
|
function validateWikipediaTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -345,7 +348,7 @@ function validateWikipediaTool(node) {
|
|||||||
}
|
}
|
||||||
function validateSearXngTool(node) {
|
function validateSearXngTool(node) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
if (!node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
@@ -376,7 +379,7 @@ function validateWolframAlphaTool(node) {
|
|||||||
code: 'MISSING_CREDENTIALS'
|
code: 'MISSING_CREDENTIALS'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!node.parameters.description && !node.parameters.toolDescription) {
|
if (!getToolDescription(node)) {
|
||||||
issues.push({
|
issues.push({
|
||||||
severity: 'info',
|
severity: 'info',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
|
|||||||
2
dist/services/ai-tool-validators.js.map
vendored
2
dist/services/ai-tool-validators.js.map
vendored
File diff suppressed because one or more lines are too long
1
dist/services/n8n-api-client.d.ts
vendored
1
dist/services/n8n-api-client.d.ts
vendored
@@ -36,6 +36,7 @@ export declare class N8nApiClient {
|
|||||||
createTag(tag: Partial<Tag>): Promise<Tag>;
|
createTag(tag: Partial<Tag>): Promise<Tag>;
|
||||||
updateTag(id: string, tag: Partial<Tag>): Promise<Tag>;
|
updateTag(id: string, tag: Partial<Tag>): Promise<Tag>;
|
||||||
deleteTag(id: string): Promise<void>;
|
deleteTag(id: string): Promise<void>;
|
||||||
|
updateWorkflowTags(workflowId: string, tagIds: string[]): Promise<Tag[]>;
|
||||||
getSourceControlStatus(): Promise<SourceControlStatus>;
|
getSourceControlStatus(): Promise<SourceControlStatus>;
|
||||||
pullSourceControl(force?: boolean): Promise<SourceControlPullResult>;
|
pullSourceControl(force?: boolean): Promise<SourceControlPullResult>;
|
||||||
pushSourceControl(message: string, fileNames?: string[]): Promise<SourceControlPushResult>;
|
pushSourceControl(message: string, fileNames?: string[]): Promise<SourceControlPushResult>;
|
||||||
|
|||||||
2
dist/services/n8n-api-client.d.ts.map
vendored
2
dist/services/n8n-api-client.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-api-client.d.ts","sourceRoot":"","sources":["../../src/services/n8n-api-client.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"n8n-api-client.d.ts","sourceRoot":"","sources":["../../src/services/n8n-api-client.ts"],"names":[],"mappings":"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"}
|
||||||
13
dist/services/n8n-api-client.js
vendored
13
dist/services/n8n-api-client.js
vendored
@@ -196,7 +196,7 @@ class N8nApiClient {
|
|||||||
}
|
}
|
||||||
async activateWorkflow(id) {
|
async activateWorkflow(id) {
|
||||||
try {
|
try {
|
||||||
const response = await this.client.post(`/workflows/${id}/activate`);
|
const response = await this.client.post(`/workflows/${id}/activate`, {});
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -205,7 +205,7 @@ class N8nApiClient {
|
|||||||
}
|
}
|
||||||
async deactivateWorkflow(id) {
|
async deactivateWorkflow(id) {
|
||||||
try {
|
try {
|
||||||
const response = await this.client.post(`/workflows/${id}/deactivate`);
|
const response = await this.client.post(`/workflows/${id}/deactivate`, {});
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -365,6 +365,15 @@ class N8nApiClient {
|
|||||||
throw (0, n8n_errors_1.handleN8nApiError)(error);
|
throw (0, n8n_errors_1.handleN8nApiError)(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async updateWorkflowTags(workflowId, tagIds) {
|
||||||
|
try {
|
||||||
|
const response = await this.client.put(`/workflows/${workflowId}/tags`, tagIds.filter(id => id).map(id => ({ id })));
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
throw (0, n8n_errors_1.handleN8nApiError)(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
async getSourceControlStatus() {
|
async getSourceControlStatus() {
|
||||||
try {
|
try {
|
||||||
const response = await this.client.get('/source-control/status');
|
const response = await this.client.get('/source-control/status');
|
||||||
|
|||||||
2
dist/services/n8n-api-client.js.map
vendored
2
dist/services/n8n-api-client.js.map
vendored
File diff suppressed because one or more lines are too long
242
dist/services/n8n-validation.d.ts
vendored
242
dist/services/n8n-validation.d.ts
vendored
@@ -144,79 +144,227 @@ export declare const workflowConnectionSchema: z.ZodRecord<z.ZodString, z.ZodObj
|
|||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}>, "many">, "many">>;
|
}>, "many">, "many">>;
|
||||||
|
}, "strip", z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
}, "strip", z.ZodTypeAny, {
|
}, "strip", z.ZodTypeAny, {
|
||||||
error?: {
|
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
|
||||||
main?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
ai_tool?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
ai_languageModel?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
ai_memory?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
ai_embedding?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
ai_vectorStore?: {
|
|
||||||
type: string;
|
|
||||||
node: string;
|
|
||||||
index: number;
|
|
||||||
}[][] | undefined;
|
|
||||||
}, {
|
}, {
|
||||||
error?: {
|
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}>, "many">, "many">, z.objectOutputType<{
|
||||||
main?: {
|
main: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}, {
|
||||||
ai_tool?: {
|
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}>, "many">, "many">>;
|
||||||
ai_languageModel?: {
|
error: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}, {
|
||||||
ai_memory?: {
|
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}>, "many">, "many">>;
|
||||||
ai_embedding?: {
|
ai_tool: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}, {
|
||||||
ai_vectorStore?: {
|
|
||||||
type: string;
|
type: string;
|
||||||
node: string;
|
node: string;
|
||||||
index: number;
|
index: number;
|
||||||
}[][] | undefined;
|
}>, "many">, "many">>;
|
||||||
}>>;
|
ai_languageModel: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_memory: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_embedding: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_vectorStore: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
}, z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">, "strip">, z.objectInputType<{
|
||||||
|
main: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
error: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_tool: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_languageModel: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_memory: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_embedding: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
ai_vectorStore: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">>;
|
||||||
|
}, z.ZodArray<z.ZodArray<z.ZodObject<{
|
||||||
|
node: z.ZodString;
|
||||||
|
type: z.ZodString;
|
||||||
|
index: z.ZodNumber;
|
||||||
|
}, "strip", z.ZodTypeAny, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}, {
|
||||||
|
type: string;
|
||||||
|
node: string;
|
||||||
|
index: number;
|
||||||
|
}>, "many">, "many">, "strip">>>;
|
||||||
export declare const workflowSettingsSchema: z.ZodObject<{
|
export declare const workflowSettingsSchema: z.ZodObject<{
|
||||||
executionOrder: z.ZodDefault<z.ZodEnum<["v0", "v1"]>>;
|
executionOrder: z.ZodDefault<z.ZodEnum<["v0", "v1"]>>;
|
||||||
timezone: z.ZodOptional<z.ZodString>;
|
timezone: z.ZodOptional<z.ZodString>;
|
||||||
|
|||||||
2
dist/services/n8n-validation.d.ts.map
vendored
2
dist/services/n8n-validation.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-validation.d.ts","sourceRoot":"","sources":["../../src/services/n8n-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB7B,CAAC;AAkBH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAUpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAEhE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAElG;AAGD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAiBD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoE5E;AAGD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CA6P/E;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAK7D;AAMD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CA+F5E;AAMD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0D/E;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAmB/D;AAGD,wBAAgB,2BAA2B,IAAI,MAAM,CA6CpD;AAGD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmBpE"}
|
{"version":3,"file":"n8n-validation.d.ts","sourceRoot":"","sources":["../../src/services/n8n-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB7B,CAAC;AAkBH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAUpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAEhE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAElG;AAGD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAiBD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoE5E;AAGD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CAkQ/E;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAK7D;AAMD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CA+F5E;AAMD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0D/E;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAmB/D;AAGD,wBAAgB,2BAA2B,IAAI,MAAM,CA6CpD;AAGD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmBpE"}
|
||||||
16
dist/services/n8n-validation.js
vendored
16
dist/services/n8n-validation.js
vendored
@@ -47,7 +47,7 @@ exports.workflowConnectionSchema = zod_1.z.record(zod_1.z.object({
|
|||||||
ai_memory: connectionArraySchema.optional(),
|
ai_memory: connectionArraySchema.optional(),
|
||||||
ai_embedding: connectionArraySchema.optional(),
|
ai_embedding: connectionArraySchema.optional(),
|
||||||
ai_vectorStore: connectionArraySchema.optional(),
|
ai_vectorStore: connectionArraySchema.optional(),
|
||||||
}));
|
}).catchall(connectionArraySchema));
|
||||||
exports.workflowSettingsSchema = zod_1.z.object({
|
exports.workflowSettingsSchema = zod_1.z.object({
|
||||||
executionOrder: zod_1.z.enum(['v0', 'v1']).default('v1'),
|
executionOrder: zod_1.z.enum(['v0', 'v1']).default('v1'),
|
||||||
timezone: zod_1.z.string().optional(),
|
timezone: zod_1.z.string().optional(),
|
||||||
@@ -152,11 +152,10 @@ function validateWorkflowStructure(workflow) {
|
|||||||
}
|
}
|
||||||
else if (connectionCount > 0 || executableNodes.length > 1) {
|
else if (connectionCount > 0 || executableNodes.length > 1) {
|
||||||
const connectedNodes = new Set();
|
const connectedNodes = new Set();
|
||||||
const ALL_CONNECTION_TYPES = ['main', 'error', 'ai_tool', 'ai_languageModel', 'ai_memory', 'ai_embedding', 'ai_vectorStore'];
|
|
||||||
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
||||||
connectedNodes.add(sourceName);
|
connectedNodes.add(sourceName);
|
||||||
ALL_CONNECTION_TYPES.forEach(connType => {
|
const connectionRecord = connection;
|
||||||
const connData = connection[connType];
|
Object.values(connectionRecord).forEach((connData) => {
|
||||||
if (connData && Array.isArray(connData)) {
|
if (connData && Array.isArray(connData)) {
|
||||||
connData.forEach((outputs) => {
|
connData.forEach((outputs) => {
|
||||||
if (Array.isArray(outputs)) {
|
if (Array.isArray(outputs)) {
|
||||||
@@ -282,10 +281,14 @@ function validateWorkflowStructure(workflow) {
|
|||||||
errors.push(`Connection references non-existent node: ${sourceName}`);
|
errors.push(`Connection references non-existent node: ${sourceName}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (connection.main && Array.isArray(connection.main)) {
|
const connectionRecord = connection;
|
||||||
connection.main.forEach((outputs, outputIndex) => {
|
Object.values(connectionRecord).forEach((connData) => {
|
||||||
|
if (connData && Array.isArray(connData)) {
|
||||||
|
connData.forEach((outputs, outputIndex) => {
|
||||||
if (Array.isArray(outputs)) {
|
if (Array.isArray(outputs)) {
|
||||||
outputs.forEach((target, targetIndex) => {
|
outputs.forEach((target, targetIndex) => {
|
||||||
|
if (!target?.node)
|
||||||
|
return;
|
||||||
if (!nodeNames.has(target.node)) {
|
if (!nodeNames.has(target.node)) {
|
||||||
if (nodeIds.has(target.node)) {
|
if (nodeIds.has(target.node)) {
|
||||||
const correctName = nodeIdToName.get(target.node);
|
const correctName = nodeIdToName.get(target.node);
|
||||||
@@ -300,6 +303,7 @@ function validateWorkflowStructure(workflow) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/services/n8n-validation.js.map
vendored
2
dist/services/n8n-validation.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/services/node-sanitizer.d.ts.map
vendored
2
dist/services/node-sanitizer.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-sanitizer.d.ts","sourceRoot":"","sources":["../../src/services/node-sanitizer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAa7D;AAKD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CASxD;AAoND,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAgEjE"}
|
{"version":3,"file":"node-sanitizer.d.ts","sourceRoot":"","sources":["../../src/services/node-sanitizer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAa7D;AAKD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CASxD;AA6ND,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAgEjE"}
|
||||||
14
dist/services/node-sanitizer.js
vendored
14
dist/services/node-sanitizer.js
vendored
@@ -17,7 +17,7 @@ function sanitizeWorkflowNodes(workflow) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
...workflow,
|
...workflow,
|
||||||
nodes: workflow.nodes.map((node) => sanitizeNode(node))
|
nodes: workflow.nodes.map(sanitizeNode)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function isFilterBasedNode(nodeType, typeVersion) {
|
function isFilterBasedNode(nodeType, typeVersion) {
|
||||||
@@ -66,7 +66,7 @@ function sanitizeFilterConditions(conditions) {
|
|||||||
...sanitized.options
|
...sanitized.options
|
||||||
};
|
};
|
||||||
if (sanitized.conditions && Array.isArray(sanitized.conditions)) {
|
if (sanitized.conditions && Array.isArray(sanitized.conditions)) {
|
||||||
sanitized.conditions = sanitized.conditions.map((condition) => sanitizeCondition(condition));
|
sanitized.conditions = sanitized.conditions.map(sanitizeCondition);
|
||||||
}
|
}
|
||||||
return sanitized;
|
return sanitized;
|
||||||
}
|
}
|
||||||
@@ -124,6 +124,10 @@ function inferDataType(operation) {
|
|||||||
if (dateOps.some(op => operation.includes(op))) {
|
if (dateOps.some(op => operation.includes(op))) {
|
||||||
return 'dateTime';
|
return 'dateTime';
|
||||||
}
|
}
|
||||||
|
const objectOps = ['empty', 'notEmpty', 'exists', 'notExists'];
|
||||||
|
if (objectOps.includes(operation)) {
|
||||||
|
return 'object';
|
||||||
|
}
|
||||||
return 'string';
|
return 'string';
|
||||||
}
|
}
|
||||||
function isUnaryOperator(operation) {
|
function isUnaryOperator(operation) {
|
||||||
@@ -132,7 +136,11 @@ function isUnaryOperator(operation) {
|
|||||||
'isNotEmpty',
|
'isNotEmpty',
|
||||||
'true',
|
'true',
|
||||||
'false',
|
'false',
|
||||||
'isNumeric'
|
'isNumeric',
|
||||||
|
'empty',
|
||||||
|
'notEmpty',
|
||||||
|
'exists',
|
||||||
|
'notExists'
|
||||||
];
|
];
|
||||||
return unaryOps.includes(operation);
|
return unaryOps.includes(operation);
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/services/node-sanitizer.js.map
vendored
2
dist/services/node-sanitizer.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/services/workflow-auto-fixer.d.ts.map
vendored
2
dist/services/workflow-auto-fixer.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"workflow-auto-fixer.d.ts","sourceRoot":"","sources":["../../src/services/workflow-auto-fixer.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"workflow-auto-fixer.d.ts","sourceRoot":"","sources":["../../src/services/workflow-auto-fixer.ts"],"names":[],"mappings":"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"}
|
||||||
3
dist/services/workflow-auto-fixer.js
vendored
3
dist/services/workflow-auto-fixer.js
vendored
@@ -405,7 +405,7 @@ class WorkflowAutoFixer {
|
|||||||
const hasConnectionFixes = filteredFixes.some(f => exports.CONNECTION_FIX_TYPES.includes(f.type));
|
const hasConnectionFixes = filteredFixes.some(f => exports.CONNECTION_FIX_TYPES.includes(f.type));
|
||||||
return operations.filter(op => {
|
return operations.filter(op => {
|
||||||
if (op.type === 'updateNode') {
|
if (op.type === 'updateNode') {
|
||||||
return fixedNodes.has(op.nodeId || '');
|
return fixedNodes.has(op.nodeName || '') || fixedNodes.has(op.nodeId || '');
|
||||||
}
|
}
|
||||||
if (op.type === 'replaceConnections') {
|
if (op.type === 'replaceConnections') {
|
||||||
return hasConnectionFixes;
|
return hasConnectionFixes;
|
||||||
@@ -794,6 +794,7 @@ class WorkflowAutoFixer {
|
|||||||
const operation = {
|
const operation = {
|
||||||
type: 'updateNode',
|
type: 'updateNode',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
|
nodeName: node.name,
|
||||||
updates: {
|
updates: {
|
||||||
typeVersion: parseFloat(latestVersion),
|
typeVersion: parseFloat(latestVersion),
|
||||||
parameters: migrationResult.updatedNode.parameters,
|
parameters: migrationResult.updatedNode.parameters,
|
||||||
|
|||||||
2
dist/services/workflow-auto-fixer.js.map
vendored
2
dist/services/workflow-auto-fixer.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/types/n8n-api.d.ts
vendored
2
dist/types/n8n-api.d.ts
vendored
@@ -259,6 +259,7 @@ export interface WebhookRequest {
|
|||||||
}
|
}
|
||||||
export interface McpToolResponse {
|
export interface McpToolResponse {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
|
saved?: boolean;
|
||||||
data?: unknown;
|
data?: unknown;
|
||||||
error?: string;
|
error?: string;
|
||||||
message?: string;
|
message?: string;
|
||||||
@@ -266,6 +267,7 @@ export interface McpToolResponse {
|
|||||||
details?: Record<string, unknown>;
|
details?: Record<string, unknown>;
|
||||||
executionId?: string;
|
executionId?: string;
|
||||||
workflowId?: string;
|
workflowId?: string;
|
||||||
|
operationsApplied?: number;
|
||||||
}
|
}
|
||||||
export type ExecutionMode = 'preview' | 'summary' | 'filtered' | 'full' | 'error';
|
export type ExecutionMode = 'preview' | 'summary' | 'filtered' | 'full' | 'error';
|
||||||
export interface ExecutionPreview {
|
export interface ExecutionPreview {
|
||||||
|
|||||||
2
dist/types/n8n-api.d.ts.map
vendored
2
dist/types/n8n-api.d.ts.map
vendored
File diff suppressed because one or more lines are too long
2
dist/types/workflow-diff.d.ts
vendored
2
dist/types/workflow-diff.d.ts
vendored
@@ -137,6 +137,8 @@ export interface WorkflowDiffResult {
|
|||||||
}>;
|
}>;
|
||||||
shouldActivate?: boolean;
|
shouldActivate?: boolean;
|
||||||
shouldDeactivate?: boolean;
|
shouldDeactivate?: boolean;
|
||||||
|
tagsToAdd?: string[];
|
||||||
|
tagsToRemove?: string[];
|
||||||
}
|
}
|
||||||
export interface NodeReference {
|
export interface NodeReference {
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|||||||
2
dist/types/workflow-diff.d.ts.map
vendored
2
dist/types/workflow-diff.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"workflow-diff.d.ts","sourceRoot":"","sources":["../../src/types/workflow-diff.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"workflow-diff.d.ts","sourceRoot":"","sources":["../../src/types/workflow-diff.ts"],"names":[],"mappings":"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"}
|
||||||
2
dist/types/workflow-diff.js.map
vendored
2
dist/types/workflow-diff.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"workflow-diff.js","sourceRoot":"","sources":["../../src/types/workflow-diff.ts"],"names":[],"mappings":";;AAyMA,0CAIC;AAED,sDAGC;AAED,kDAGC;AAdD,SAAgB,eAAe,CAAC,EAAyB;IAGvD,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAC5G,CAAC;AAED,SAAgB,qBAAqB,CAAC,EAAyB;IAE7D,OAAO,CAAC,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACpI,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAyB;IAE3D,OAAO,CAAC,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC"}
|
{"version":3,"file":"workflow-diff.js","sourceRoot":"","sources":["../../src/types/workflow-diff.ts"],"names":[],"mappings":";;AA2MA,0CAIC;AAED,sDAGC;AAED,kDAGC;AAdD,SAAgB,eAAe,CAAC,EAAyB;IAGvD,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAC5G,CAAC;AAED,SAAgB,qBAAqB,CAAC,EAAyB;IAE7D,OAAO,CAAC,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACpI,CAAC;AAED,SAAgB,mBAAmB,CAAC,EAAyB;IAE3D,OAAO,CAAC,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC"}
|
||||||
10
dist/utils/node-type-utils.js
vendored
10
dist/utils/node-type-utils.js
vendored
@@ -87,12 +87,10 @@ function isTriggerNode(nodeType) {
|
|||||||
if (lowerType.includes('webhook') && !lowerType.includes('respond')) {
|
if (lowerType.includes('webhook') && !lowerType.includes('respond')) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const specificTriggers = [
|
if (lowerType.includes('emailread') || lowerType.includes('emailreadimap')) {
|
||||||
'nodes-base.start',
|
return true;
|
||||||
'nodes-base.manualTrigger',
|
}
|
||||||
'nodes-base.formTrigger'
|
return normalized === 'nodes-base.start';
|
||||||
];
|
|
||||||
return specificTriggers.includes(normalized);
|
|
||||||
}
|
}
|
||||||
function isActivatableTrigger(nodeType) {
|
function isActivatableTrigger(nodeType) {
|
||||||
return isTriggerNode(nodeType);
|
return isTriggerNode(nodeType);
|
||||||
|
|||||||
2
dist/utils/node-type-utils.js.map
vendored
2
dist/utils/node-type-utils.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-type-utils.js","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"node-type-utils.js","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"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"}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "n8n-mcp",
|
"name": "n8n-mcp",
|
||||||
"version": "2.37.2",
|
"version": "2.37.3",
|
||||||
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
|
|||||||
@@ -31,6 +31,11 @@ function getValidator(repository: NodeRepository): WorkflowValidator {
|
|||||||
return cachedValidator;
|
return cachedValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Operation types that identify nodes by nodeId/nodeName
|
||||||
|
const NODE_TARGETING_OPERATIONS = new Set([
|
||||||
|
'updateNode', 'removeNode', 'moveNode', 'enableNode', 'disableNode'
|
||||||
|
]);
|
||||||
|
|
||||||
// Zod schema for the diff request
|
// Zod schema for the diff request
|
||||||
const workflowDiffSchema = z.object({
|
const workflowDiffSchema = z.object({
|
||||||
id: z.string(),
|
id: z.string(),
|
||||||
@@ -63,6 +68,23 @@ const workflowDiffSchema = z.object({
|
|||||||
settings: z.any().optional(),
|
settings: z.any().optional(),
|
||||||
name: z.string().optional(),
|
name: z.string().optional(),
|
||||||
tag: z.string().optional(),
|
tag: z.string().optional(),
|
||||||
|
// Aliases: LLMs often use "id" instead of "nodeId" — accept both
|
||||||
|
id: z.string().optional(),
|
||||||
|
}).transform((op) => {
|
||||||
|
// Normalize common field aliases for node-targeting operations:
|
||||||
|
// - "name" → "nodeName" (LLMs confuse the updateName "name" field with node identification)
|
||||||
|
// - "id" → "nodeId" (natural alias)
|
||||||
|
if (NODE_TARGETING_OPERATIONS.has(op.type)) {
|
||||||
|
if (!op.nodeName && !op.nodeId && op.name) {
|
||||||
|
op.nodeName = op.name;
|
||||||
|
op.name = undefined;
|
||||||
|
}
|
||||||
|
if (!op.nodeId && op.id) {
|
||||||
|
op.nodeId = op.id;
|
||||||
|
op.id = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return op;
|
||||||
})),
|
})),
|
||||||
validateOnly: z.boolean().optional(),
|
validateOnly: z.boolean().optional(),
|
||||||
continueOnError: z.boolean().optional(),
|
continueOnError: z.boolean().optional(),
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ export const workflowConnectionSchema = z.record(
|
|||||||
ai_memory: connectionArraySchema.optional(),
|
ai_memory: connectionArraySchema.optional(),
|
||||||
ai_embedding: connectionArraySchema.optional(),
|
ai_embedding: connectionArraySchema.optional(),
|
||||||
ai_vectorStore: connectionArraySchema.optional(),
|
ai_vectorStore: connectionArraySchema.optional(),
|
||||||
})
|
}).catchall(connectionArraySchema) // Allow additional AI connection types (ai_outputParser, ai_document, ai_textSplitter, etc.)
|
||||||
);
|
);
|
||||||
|
|
||||||
export const workflowSettingsSchema = z.object({
|
export const workflowSettingsSchema = z.object({
|
||||||
@@ -248,15 +248,15 @@ export function validateWorkflowStructure(workflow: Partial<Workflow>): string[]
|
|||||||
const connectedNodes = new Set<string>();
|
const connectedNodes = new Set<string>();
|
||||||
|
|
||||||
// Collect all nodes that appear in connections (as source or target)
|
// Collect all nodes that appear in connections (as source or target)
|
||||||
// Check ALL connection types, not just 'main' - AI workflows use ai_tool, ai_languageModel, etc.
|
// Iterate over ALL connection types present in the data — not a hardcoded list —
|
||||||
const ALL_CONNECTION_TYPES = ['main', 'error', 'ai_tool', 'ai_languageModel', 'ai_memory', 'ai_embedding', 'ai_vectorStore'] as const;
|
// so that every AI connection type (ai_outputParser, ai_document, ai_textSplitter,
|
||||||
|
// ai_agent, ai_chain, ai_retriever, etc.) is covered automatically.
|
||||||
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
||||||
connectedNodes.add(sourceName); // Node has outgoing connection
|
connectedNodes.add(sourceName); // Node has outgoing connection
|
||||||
|
|
||||||
// Check all connection types for target nodes
|
// Check every connection type key present on this source node
|
||||||
ALL_CONNECTION_TYPES.forEach(connType => {
|
const connectionRecord = connection as Record<string, unknown>;
|
||||||
const connData = (connection as Record<string, unknown>)[connType];
|
Object.values(connectionRecord).forEach((connData) => {
|
||||||
if (connData && Array.isArray(connData)) {
|
if (connData && Array.isArray(connData)) {
|
||||||
connData.forEach((outputs) => {
|
connData.forEach((outputs) => {
|
||||||
if (Array.isArray(outputs)) {
|
if (Array.isArray(outputs)) {
|
||||||
@@ -429,10 +429,14 @@ export function validateWorkflowStructure(workflow: Partial<Workflow>): string[]
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connection.main && Array.isArray(connection.main)) {
|
// Check all connection types (main, error, ai_tool, ai_languageModel, etc.)
|
||||||
connection.main.forEach((outputs, outputIndex) => {
|
const connectionRecord = connection as Record<string, unknown>;
|
||||||
|
Object.values(connectionRecord).forEach((connData) => {
|
||||||
|
if (connData && Array.isArray(connData)) {
|
||||||
|
connData.forEach((outputs: any, outputIndex: number) => {
|
||||||
if (Array.isArray(outputs)) {
|
if (Array.isArray(outputs)) {
|
||||||
outputs.forEach((target, targetIndex) => {
|
outputs.forEach((target: any, targetIndex: number) => {
|
||||||
|
if (!target?.node) return;
|
||||||
// Check if target exists by name (correct)
|
// Check if target exists by name (correct)
|
||||||
if (!nodeNames.has(target.node)) {
|
if (!nodeNames.has(target.node)) {
|
||||||
// Check if they're using an ID instead of name
|
// Check if they're using an ID instead of name
|
||||||
@@ -448,6 +452,7 @@ export function validateWorkflowStructure(workflow: Partial<Workflow>): string[]
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return errors;
|
return errors;
|
||||||
|
|||||||
@@ -671,11 +671,13 @@ export class WorkflowAutoFixer {
|
|||||||
filteredFixes: FixOperation[],
|
filteredFixes: FixOperation[],
|
||||||
allFixes: FixOperation[]
|
allFixes: FixOperation[]
|
||||||
): WorkflowDiffOperation[] {
|
): WorkflowDiffOperation[] {
|
||||||
|
// fixedNodes contains node names (FixOperation.node = node.name)
|
||||||
const fixedNodes = new Set(filteredFixes.map(f => f.node));
|
const fixedNodes = new Set(filteredFixes.map(f => f.node));
|
||||||
const hasConnectionFixes = filteredFixes.some(f => CONNECTION_FIX_TYPES.includes(f.type));
|
const hasConnectionFixes = filteredFixes.some(f => CONNECTION_FIX_TYPES.includes(f.type));
|
||||||
return operations.filter(op => {
|
return operations.filter(op => {
|
||||||
if (op.type === 'updateNode') {
|
if (op.type === 'updateNode') {
|
||||||
return fixedNodes.has(op.nodeId || '');
|
// Check both nodeName and nodeId — operations may use either
|
||||||
|
return fixedNodes.has(op.nodeName || '') || fixedNodes.has(op.nodeId || '');
|
||||||
}
|
}
|
||||||
if (op.type === 'replaceConnections') {
|
if (op.type === 'replaceConnections') {
|
||||||
return hasConnectionFixes;
|
return hasConnectionFixes;
|
||||||
@@ -1186,10 +1188,11 @@ export class WorkflowAutoFixer {
|
|||||||
description: `Upgrade ${node.name} from v${currentVersion} to v${latestVersion}. ${analysis.reason}`
|
description: `Upgrade ${node.name} from v${currentVersion} to v${latestVersion}. ${analysis.reason}`
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create update operation
|
// Create update operation — both nodeId and nodeName needed for fix filtering
|
||||||
const operation: UpdateNodeOperation = {
|
const operation: UpdateNodeOperation = {
|
||||||
type: 'updateNode',
|
type: 'updateNode',
|
||||||
nodeId: node.id,
|
nodeId: node.id,
|
||||||
|
nodeName: node.name,
|
||||||
updates: {
|
updates: {
|
||||||
typeVersion: parseFloat(latestVersion),
|
typeVersion: parseFloat(latestVersion),
|
||||||
parameters: migrationResult.updatedNode.parameters,
|
parameters: migrationResult.updatedNode.parameters,
|
||||||
|
|||||||
@@ -1001,5 +1001,122 @@ describe('handlers-workflow-diff', () => {
|
|||||||
expect(mockApiClient.updateWorkflowTags).not.toHaveBeenCalled();
|
expect(mockApiClient.updateWorkflowTags).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('field name normalization', () => {
|
||||||
|
it('should normalize "name" to "nodeName" for updateNode operations', async () => {
|
||||||
|
const testWorkflow = createTestWorkflow();
|
||||||
|
const updatedWorkflow = { ...testWorkflow };
|
||||||
|
|
||||||
|
mockApiClient.getWorkflow.mockResolvedValue(testWorkflow);
|
||||||
|
mockDiffEngine.applyDiff.mockResolvedValue({
|
||||||
|
success: true,
|
||||||
|
workflow: updatedWorkflow,
|
||||||
|
operationsApplied: 1,
|
||||||
|
message: 'Success',
|
||||||
|
errors: [],
|
||||||
|
});
|
||||||
|
mockApiClient.updateWorkflow.mockResolvedValue(updatedWorkflow);
|
||||||
|
|
||||||
|
await handleUpdatePartialWorkflow({
|
||||||
|
id: 'test-workflow-id',
|
||||||
|
operations: [{
|
||||||
|
type: 'updateNode',
|
||||||
|
name: 'HTTP Request', // LLMs often use "name" instead of "nodeName"
|
||||||
|
updates: { 'parameters.url': 'https://new-url.com' },
|
||||||
|
}],
|
||||||
|
}, mockRepository);
|
||||||
|
|
||||||
|
// Verify the diff engine received nodeName (normalized from name)
|
||||||
|
expect(mockDiffEngine.applyDiff).toHaveBeenCalled();
|
||||||
|
const diffArgs = mockDiffEngine.applyDiff.mock.calls[0][1];
|
||||||
|
expect(diffArgs.operations[0].nodeName).toBe('HTTP Request');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should normalize "id" to "nodeId" for removeNode operations', async () => {
|
||||||
|
const testWorkflow = createTestWorkflow();
|
||||||
|
const updatedWorkflow = { ...testWorkflow };
|
||||||
|
|
||||||
|
mockApiClient.getWorkflow.mockResolvedValue(testWorkflow);
|
||||||
|
mockDiffEngine.applyDiff.mockResolvedValue({
|
||||||
|
success: true,
|
||||||
|
workflow: updatedWorkflow,
|
||||||
|
operationsApplied: 1,
|
||||||
|
message: 'Success',
|
||||||
|
errors: [],
|
||||||
|
});
|
||||||
|
mockApiClient.updateWorkflow.mockResolvedValue(updatedWorkflow);
|
||||||
|
|
||||||
|
await handleUpdatePartialWorkflow({
|
||||||
|
id: 'test-workflow-id',
|
||||||
|
operations: [{
|
||||||
|
type: 'removeNode',
|
||||||
|
id: 'node2', // LLMs may use "id" instead of "nodeId"
|
||||||
|
}],
|
||||||
|
}, mockRepository);
|
||||||
|
|
||||||
|
// Verify the diff engine received nodeId (normalized from id)
|
||||||
|
expect(mockDiffEngine.applyDiff).toHaveBeenCalled();
|
||||||
|
const diffArgs = mockDiffEngine.applyDiff.mock.calls[0][1];
|
||||||
|
expect(diffArgs.operations[0].nodeId).toBe('node2');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should NOT normalize "name" for updateName operations', async () => {
|
||||||
|
const testWorkflow = createTestWorkflow();
|
||||||
|
const updatedWorkflow = { ...testWorkflow };
|
||||||
|
|
||||||
|
mockApiClient.getWorkflow.mockResolvedValue(testWorkflow);
|
||||||
|
mockDiffEngine.applyDiff.mockResolvedValue({
|
||||||
|
success: true,
|
||||||
|
workflow: updatedWorkflow,
|
||||||
|
operationsApplied: 1,
|
||||||
|
message: 'Success',
|
||||||
|
errors: [],
|
||||||
|
});
|
||||||
|
mockApiClient.updateWorkflow.mockResolvedValue(updatedWorkflow);
|
||||||
|
|
||||||
|
await handleUpdatePartialWorkflow({
|
||||||
|
id: 'test-workflow-id',
|
||||||
|
operations: [{
|
||||||
|
type: 'updateName',
|
||||||
|
name: 'New Workflow Name', // This is the correct field for updateName
|
||||||
|
}],
|
||||||
|
}, mockRepository);
|
||||||
|
|
||||||
|
// Verify "name" stays as "name" (not moved to nodeName) for updateName
|
||||||
|
expect(mockDiffEngine.applyDiff).toHaveBeenCalled();
|
||||||
|
const diffArgs = mockDiffEngine.applyDiff.mock.calls[0][1];
|
||||||
|
expect(diffArgs.operations[0].name).toBe('New Workflow Name');
|
||||||
|
expect(diffArgs.operations[0].nodeName).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should prefer explicit "nodeName" over "name" alias', async () => {
|
||||||
|
const testWorkflow = createTestWorkflow();
|
||||||
|
const updatedWorkflow = { ...testWorkflow };
|
||||||
|
|
||||||
|
mockApiClient.getWorkflow.mockResolvedValue(testWorkflow);
|
||||||
|
mockDiffEngine.applyDiff.mockResolvedValue({
|
||||||
|
success: true,
|
||||||
|
workflow: updatedWorkflow,
|
||||||
|
operationsApplied: 1,
|
||||||
|
message: 'Success',
|
||||||
|
errors: [],
|
||||||
|
});
|
||||||
|
mockApiClient.updateWorkflow.mockResolvedValue(updatedWorkflow);
|
||||||
|
|
||||||
|
await handleUpdatePartialWorkflow({
|
||||||
|
id: 'test-workflow-id',
|
||||||
|
operations: [{
|
||||||
|
type: 'updateNode',
|
||||||
|
nodeName: 'HTTP Request', // Explicit nodeName provided
|
||||||
|
name: 'Should Be Ignored', // Should NOT override nodeName
|
||||||
|
updates: { 'parameters.url': 'https://new-url.com' },
|
||||||
|
}],
|
||||||
|
}, mockRepository);
|
||||||
|
|
||||||
|
expect(mockDiffEngine.applyDiff).toHaveBeenCalled();
|
||||||
|
const diffArgs = mockDiffEngine.applyDiff.mock.calls[0][1];
|
||||||
|
expect(diffArgs.operations[0].nodeName).toBe('HTTP Request');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -1096,6 +1096,83 @@ describe('n8n-validation', () => {
|
|||||||
expect(disconnectedErrors).toHaveLength(0);
|
expect(disconnectedErrors).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should NOT flag nodes as disconnected when connected via ai_outputParser', () => {
|
||||||
|
const workflow = {
|
||||||
|
name: 'AI Output Parser Workflow',
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'agent-1',
|
||||||
|
name: 'AI Agent',
|
||||||
|
type: '@n8n/n8n-nodes-langchain.agent',
|
||||||
|
typeVersion: 1.6,
|
||||||
|
position: [500, 300] as [number, number],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'parser-1',
|
||||||
|
name: 'Structured Output Parser',
|
||||||
|
type: '@n8n/n8n-nodes-langchain.outputParserStructured',
|
||||||
|
typeVersion: 1,
|
||||||
|
position: [300, 400] as [number, number],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
connections: {
|
||||||
|
'Structured Output Parser': {
|
||||||
|
ai_outputParser: [[{ node: 'AI Agent', type: 'ai_outputParser', index: 0 }]],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const errors = validateWorkflowStructure(workflow);
|
||||||
|
const disconnectedErrors = errors.filter(e => e.includes('Disconnected'));
|
||||||
|
expect(disconnectedErrors).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should NOT flag nodes as disconnected when connected via ai_document or ai_textSplitter', () => {
|
||||||
|
const workflow = {
|
||||||
|
name: 'Document Processing Workflow',
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
id: 'vs-1',
|
||||||
|
name: 'Pinecone Vector Store',
|
||||||
|
type: '@n8n/n8n-nodes-langchain.vectorStorePinecone',
|
||||||
|
typeVersion: 1,
|
||||||
|
position: [500, 300] as [number, number],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'doc-1',
|
||||||
|
name: 'Default Data Loader',
|
||||||
|
type: '@n8n/n8n-nodes-langchain.documentDefaultDataLoader',
|
||||||
|
typeVersion: 1,
|
||||||
|
position: [300, 400] as [number, number],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'splitter-1',
|
||||||
|
name: 'Text Splitter',
|
||||||
|
type: '@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter',
|
||||||
|
typeVersion: 1,
|
||||||
|
position: [100, 400] as [number, number],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
connections: {
|
||||||
|
'Default Data Loader': {
|
||||||
|
ai_document: [[{ node: 'Pinecone Vector Store', type: 'ai_document', index: 0 }]],
|
||||||
|
},
|
||||||
|
'Text Splitter': {
|
||||||
|
ai_textSplitter: [[{ node: 'Default Data Loader', type: 'ai_textSplitter', index: 0 }]],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const errors = validateWorkflowStructure(workflow);
|
||||||
|
const disconnectedErrors = errors.filter(e => e.includes('Disconnected'));
|
||||||
|
expect(disconnectedErrors).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
it('should still flag truly disconnected nodes in AI workflows', () => {
|
it('should still flag truly disconnected nodes in AI workflows', () => {
|
||||||
const workflow = {
|
const workflow = {
|
||||||
name: 'AI Workflow with Disconnected Node',
|
name: 'AI Workflow with Disconnected Node',
|
||||||
|
|||||||
Reference in New Issue
Block a user