n8n-mcp 2.16.1 → 2.17.2
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/.env.example +34 -0
- package/README.md +43 -6
- package/data/nodes.db +0 -0
- package/dist/http-server-single-session.d.ts.map +1 -1
- package/dist/http-server-single-session.js +35 -2
- package/dist/http-server-single-session.js.map +1 -1
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +4 -1
- package/dist/http-server.js.map +1 -1
- package/dist/mcp/handlers-n8n-manager.d.ts.map +1 -1
- package/dist/mcp/handlers-n8n-manager.js +2 -0
- package/dist/mcp/handlers-n8n-manager.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-docs/discovery/list-ai-tools.d.ts.map +1 -1
- package/dist/mcp/tool-docs/discovery/list-ai-tools.js +15 -11
- package/dist/mcp/tool-docs/discovery/list-ai-tools.js.map +1 -1
- package/dist/mcp/tool-docs/guides/ai-agents-guide.d.ts +3 -0
- package/dist/mcp/tool-docs/guides/ai-agents-guide.d.ts.map +1 -0
- package/dist/mcp/tool-docs/guides/ai-agents-guide.js +740 -0
- package/dist/mcp/tool-docs/guides/ai-agents-guide.js.map +1 -0
- package/dist/mcp/tool-docs/guides/index.d.ts +2 -0
- package/dist/mcp/tool-docs/guides/index.d.ts.map +1 -0
- package/dist/mcp/tool-docs/guides/index.js +6 -0
- package/dist/mcp/tool-docs/guides/index.js.map +1 -0
- package/dist/mcp/tool-docs/index.d.ts.map +1 -1
- package/dist/mcp/tool-docs/index.js +2 -0
- package/dist/mcp/tool-docs/index.js.map +1 -1
- package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.d.ts.map +1 -1
- package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js +55 -5
- package/dist/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.js.map +1 -1
- package/dist/scripts/fetch-templates.d.ts.map +1 -1
- package/dist/scripts/fetch-templates.js +15 -1
- package/dist/scripts/fetch-templates.js.map +1 -1
- package/dist/scripts/seed-canonical-ai-examples.d.ts +4 -0
- package/dist/scripts/seed-canonical-ai-examples.d.ts.map +1 -0
- package/dist/scripts/seed-canonical-ai-examples.js +121 -0
- package/dist/scripts/seed-canonical-ai-examples.js.map +1 -0
- package/dist/services/ai-node-validator.d.ts +12 -0
- package/dist/services/ai-node-validator.d.ts.map +1 -0
- package/dist/services/ai-node-validator.js +429 -0
- package/dist/services/ai-node-validator.js.map +1 -0
- package/dist/services/ai-tool-validators.d.ts +58 -0
- package/dist/services/ai-tool-validators.d.ts.map +1 -0
- package/dist/services/ai-tool-validators.js +438 -0
- package/dist/services/ai-tool-validators.js.map +1 -0
- package/dist/services/n8n-api-client.d.ts.map +1 -1
- package/dist/services/n8n-api-client.js +38 -0
- package/dist/services/n8n-api-client.js.map +1 -1
- package/dist/services/universal-expression-validator.d.ts.map +1 -1
- package/dist/services/universal-expression-validator.js.map +1 -1
- package/dist/services/workflow-validator.d.ts.map +1 -1
- package/dist/services/workflow-validator.js +32 -4
- package/dist/services/workflow-validator.js.map +1 -1
- package/dist/telemetry/config-manager.d.ts +4 -0
- package/dist/telemetry/config-manager.d.ts.map +1 -1
- package/dist/telemetry/config-manager.js +78 -0
- package/dist/telemetry/config-manager.js.map +1 -1
- package/dist/templates/template-fetcher.d.ts +1 -1
- package/dist/templates/template-fetcher.d.ts.map +1 -1
- package/dist/templates/template-fetcher.js +8 -5
- package/dist/templates/template-fetcher.js.map +1 -1
- package/dist/templates/template-repository.d.ts +1 -0
- package/dist/templates/template-repository.d.ts.map +1 -1
- package/dist/templates/template-repository.js +7 -0
- package/dist/templates/template-repository.js.map +1 -1
- package/dist/templates/template-service.d.ts.map +1 -1
- package/dist/templates/template-service.js +14 -2
- package/dist/templates/template-service.js.map +1 -1
- package/dist/utils/auth.d.ts +1 -0
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +17 -1
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/enhanced-documentation-fetcher.d.ts.map +1 -1
- package/dist/utils/enhanced-documentation-fetcher.js +66 -10
- package/dist/utils/enhanced-documentation-fetcher.js.map +1 -1
- package/dist/utils/ssrf-protection.d.ts +7 -0
- package/dist/utils/ssrf-protection.d.ts.map +1 -0
- package/dist/utils/ssrf-protection.js +118 -0
- package/dist/utils/ssrf-protection.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AI_CONNECTION_TYPES = void 0;
|
|
4
|
+
exports.buildReverseConnectionMap = buildReverseConnectionMap;
|
|
5
|
+
exports.getAIConnections = getAIConnections;
|
|
6
|
+
exports.validateAIAgent = validateAIAgent;
|
|
7
|
+
exports.validateChatTrigger = validateChatTrigger;
|
|
8
|
+
exports.validateBasicLLMChain = validateBasicLLMChain;
|
|
9
|
+
exports.validateAISpecificNodes = validateAISpecificNodes;
|
|
10
|
+
exports.hasAINodes = hasAINodes;
|
|
11
|
+
exports.getAINodeCategory = getAINodeCategory;
|
|
12
|
+
const node_type_normalizer_1 = require("../utils/node-type-normalizer");
|
|
13
|
+
const ai_tool_validators_1 = require("./ai-tool-validators");
|
|
14
|
+
const MIN_SYSTEM_MESSAGE_LENGTH = 20;
|
|
15
|
+
const MAX_ITERATIONS_WARNING_THRESHOLD = 50;
|
|
16
|
+
exports.AI_CONNECTION_TYPES = [
|
|
17
|
+
'ai_languageModel',
|
|
18
|
+
'ai_memory',
|
|
19
|
+
'ai_tool',
|
|
20
|
+
'ai_embedding',
|
|
21
|
+
'ai_vectorStore',
|
|
22
|
+
'ai_document',
|
|
23
|
+
'ai_textSplitter',
|
|
24
|
+
'ai_outputParser'
|
|
25
|
+
];
|
|
26
|
+
function buildReverseConnectionMap(workflow) {
|
|
27
|
+
const map = new Map();
|
|
28
|
+
for (const [sourceName, outputs] of Object.entries(workflow.connections)) {
|
|
29
|
+
if (!sourceName || typeof sourceName !== 'string' || sourceName.trim() === '') {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (!outputs || typeof outputs !== 'object')
|
|
33
|
+
continue;
|
|
34
|
+
for (const [outputType, connections] of Object.entries(outputs)) {
|
|
35
|
+
if (!Array.isArray(connections))
|
|
36
|
+
continue;
|
|
37
|
+
const connArray = connections.flat().filter(c => c);
|
|
38
|
+
for (const conn of connArray) {
|
|
39
|
+
if (!conn || !conn.node)
|
|
40
|
+
continue;
|
|
41
|
+
if (typeof conn.node !== 'string' || conn.node.trim() === '') {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!map.has(conn.node)) {
|
|
45
|
+
map.set(conn.node, []);
|
|
46
|
+
}
|
|
47
|
+
map.get(conn.node).push({
|
|
48
|
+
sourceName: sourceName,
|
|
49
|
+
sourceType: outputType,
|
|
50
|
+
type: outputType,
|
|
51
|
+
index: conn.index ?? 0
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return map;
|
|
57
|
+
}
|
|
58
|
+
function getAIConnections(nodeName, reverseConnections, connectionType) {
|
|
59
|
+
const incoming = reverseConnections.get(nodeName) || [];
|
|
60
|
+
if (connectionType) {
|
|
61
|
+
return incoming.filter(c => c.type === connectionType);
|
|
62
|
+
}
|
|
63
|
+
return incoming.filter(c => exports.AI_CONNECTION_TYPES.includes(c.type));
|
|
64
|
+
}
|
|
65
|
+
function validateAIAgent(node, reverseConnections, workflow) {
|
|
66
|
+
const issues = [];
|
|
67
|
+
const incoming = reverseConnections.get(node.name) || [];
|
|
68
|
+
const languageModelConnections = incoming.filter(c => c.type === 'ai_languageModel');
|
|
69
|
+
if (languageModelConnections.length === 0) {
|
|
70
|
+
issues.push({
|
|
71
|
+
severity: 'error',
|
|
72
|
+
nodeId: node.id,
|
|
73
|
+
nodeName: node.name,
|
|
74
|
+
message: `AI Agent "${node.name}" requires an ai_languageModel connection. Connect a language model node (e.g., OpenAI Chat Model, Anthropic Chat Model).`,
|
|
75
|
+
code: 'MISSING_LANGUAGE_MODEL'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (languageModelConnections.length > 2) {
|
|
79
|
+
issues.push({
|
|
80
|
+
severity: 'error',
|
|
81
|
+
nodeId: node.id,
|
|
82
|
+
nodeName: node.name,
|
|
83
|
+
message: `AI Agent "${node.name}" has ${languageModelConnections.length} ai_languageModel connections. Maximum is 2 (for fallback model support).`,
|
|
84
|
+
code: 'TOO_MANY_LANGUAGE_MODELS'
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
else if (languageModelConnections.length === 2) {
|
|
88
|
+
if (!node.parameters.needsFallback) {
|
|
89
|
+
issues.push({
|
|
90
|
+
severity: 'warning',
|
|
91
|
+
nodeId: node.id,
|
|
92
|
+
nodeName: node.name,
|
|
93
|
+
message: `AI Agent "${node.name}" has 2 language models but needsFallback is not enabled. Set needsFallback=true or remove the second model.`
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (languageModelConnections.length === 1 && node.parameters.needsFallback === true) {
|
|
98
|
+
issues.push({
|
|
99
|
+
severity: 'error',
|
|
100
|
+
nodeId: node.id,
|
|
101
|
+
nodeName: node.name,
|
|
102
|
+
message: `AI Agent "${node.name}" has needsFallback=true but only 1 language model connected. Connect a second model for fallback or disable needsFallback.`,
|
|
103
|
+
code: 'FALLBACK_MISSING_SECOND_MODEL'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const outputParserConnections = incoming.filter(c => c.type === 'ai_outputParser');
|
|
107
|
+
if (node.parameters.hasOutputParser === true) {
|
|
108
|
+
if (outputParserConnections.length === 0) {
|
|
109
|
+
issues.push({
|
|
110
|
+
severity: 'error',
|
|
111
|
+
nodeId: node.id,
|
|
112
|
+
nodeName: node.name,
|
|
113
|
+
message: `AI Agent "${node.name}" has hasOutputParser=true but no ai_outputParser connection. Connect an output parser or set hasOutputParser=false.`,
|
|
114
|
+
code: 'MISSING_OUTPUT_PARSER'
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (outputParserConnections.length > 0) {
|
|
119
|
+
issues.push({
|
|
120
|
+
severity: 'warning',
|
|
121
|
+
nodeId: node.id,
|
|
122
|
+
nodeName: node.name,
|
|
123
|
+
message: `AI Agent "${node.name}" has an output parser connected but hasOutputParser is not true. Set hasOutputParser=true to enable output parsing.`
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (outputParserConnections.length > 1) {
|
|
127
|
+
issues.push({
|
|
128
|
+
severity: 'error',
|
|
129
|
+
nodeId: node.id,
|
|
130
|
+
nodeName: node.name,
|
|
131
|
+
message: `AI Agent "${node.name}" has ${outputParserConnections.length} output parsers. Only 1 is allowed.`,
|
|
132
|
+
code: 'MULTIPLE_OUTPUT_PARSERS'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
if (node.parameters.promptType === 'define') {
|
|
136
|
+
if (!node.parameters.text || node.parameters.text.trim() === '') {
|
|
137
|
+
issues.push({
|
|
138
|
+
severity: 'error',
|
|
139
|
+
nodeId: node.id,
|
|
140
|
+
nodeName: node.name,
|
|
141
|
+
message: `AI Agent "${node.name}" has promptType="define" but the text field is empty. Provide a custom prompt or switch to promptType="auto".`,
|
|
142
|
+
code: 'MISSING_PROMPT_TEXT'
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (!node.parameters.systemMessage) {
|
|
147
|
+
issues.push({
|
|
148
|
+
severity: 'info',
|
|
149
|
+
nodeId: node.id,
|
|
150
|
+
nodeName: node.name,
|
|
151
|
+
message: `AI Agent "${node.name}" has no systemMessage. Consider adding one to define the agent's role, capabilities, and constraints.`
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else if (node.parameters.systemMessage.trim().length < MIN_SYSTEM_MESSAGE_LENGTH) {
|
|
155
|
+
issues.push({
|
|
156
|
+
severity: 'info',
|
|
157
|
+
nodeId: node.id,
|
|
158
|
+
nodeName: node.name,
|
|
159
|
+
message: `AI Agent "${node.name}" systemMessage is very short (minimum ${MIN_SYSTEM_MESSAGE_LENGTH} characters recommended). Provide more detail about the agent's role and capabilities.`
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const isStreamingTarget = checkIfStreamingTarget(node, workflow, reverseConnections);
|
|
163
|
+
const hasOwnStreamingEnabled = node.parameters?.options?.streamResponse === true;
|
|
164
|
+
if (isStreamingTarget || hasOwnStreamingEnabled) {
|
|
165
|
+
const agentMainOutput = workflow.connections[node.name]?.main;
|
|
166
|
+
if (agentMainOutput && agentMainOutput.flat().some((c) => c)) {
|
|
167
|
+
const streamSource = isStreamingTarget
|
|
168
|
+
? 'connected from Chat Trigger with responseMode="streaming"'
|
|
169
|
+
: 'has streamResponse=true in options';
|
|
170
|
+
issues.push({
|
|
171
|
+
severity: 'error',
|
|
172
|
+
nodeId: node.id,
|
|
173
|
+
nodeName: node.name,
|
|
174
|
+
message: `AI Agent "${node.name}" is in streaming mode (${streamSource}) but has outgoing main connections. Remove all main output connections - streaming responses flow back through the Chat Trigger.`,
|
|
175
|
+
code: 'STREAMING_WITH_MAIN_OUTPUT'
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const memoryConnections = incoming.filter(c => c.type === 'ai_memory');
|
|
180
|
+
if (memoryConnections.length > 1) {
|
|
181
|
+
issues.push({
|
|
182
|
+
severity: 'error',
|
|
183
|
+
nodeId: node.id,
|
|
184
|
+
nodeName: node.name,
|
|
185
|
+
message: `AI Agent "${node.name}" has ${memoryConnections.length} ai_memory connections. Only 1 memory is allowed.`,
|
|
186
|
+
code: 'MULTIPLE_MEMORY_CONNECTIONS'
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const toolConnections = incoming.filter(c => c.type === 'ai_tool');
|
|
190
|
+
if (toolConnections.length === 0) {
|
|
191
|
+
issues.push({
|
|
192
|
+
severity: 'info',
|
|
193
|
+
nodeId: node.id,
|
|
194
|
+
nodeName: node.name,
|
|
195
|
+
message: `AI Agent "${node.name}" has no ai_tool connections. Consider adding tools to enhance the agent's capabilities.`
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (node.parameters.maxIterations !== undefined) {
|
|
199
|
+
if (typeof node.parameters.maxIterations !== 'number') {
|
|
200
|
+
issues.push({
|
|
201
|
+
severity: 'error',
|
|
202
|
+
nodeId: node.id,
|
|
203
|
+
nodeName: node.name,
|
|
204
|
+
message: `AI Agent "${node.name}" has invalid maxIterations type. Must be a number.`,
|
|
205
|
+
code: 'INVALID_MAX_ITERATIONS_TYPE'
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
else if (node.parameters.maxIterations < 1) {
|
|
209
|
+
issues.push({
|
|
210
|
+
severity: 'error',
|
|
211
|
+
nodeId: node.id,
|
|
212
|
+
nodeName: node.name,
|
|
213
|
+
message: `AI Agent "${node.name}" has maxIterations=${node.parameters.maxIterations}. Must be at least 1.`,
|
|
214
|
+
code: 'MAX_ITERATIONS_TOO_LOW'
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
else if (node.parameters.maxIterations > MAX_ITERATIONS_WARNING_THRESHOLD) {
|
|
218
|
+
issues.push({
|
|
219
|
+
severity: 'warning',
|
|
220
|
+
nodeId: node.id,
|
|
221
|
+
nodeName: node.name,
|
|
222
|
+
message: `AI Agent "${node.name}" has maxIterations=${node.parameters.maxIterations}. Very high iteration counts (>${MAX_ITERATIONS_WARNING_THRESHOLD}) may cause long execution times and high costs.`
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return issues;
|
|
227
|
+
}
|
|
228
|
+
function checkIfStreamingTarget(node, workflow, reverseConnections) {
|
|
229
|
+
const incoming = reverseConnections.get(node.name) || [];
|
|
230
|
+
const mainConnections = incoming.filter(c => c.type === 'main');
|
|
231
|
+
for (const conn of mainConnections) {
|
|
232
|
+
const sourceNode = workflow.nodes.find(n => n.name === conn.sourceName);
|
|
233
|
+
if (!sourceNode)
|
|
234
|
+
continue;
|
|
235
|
+
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(sourceNode.type);
|
|
236
|
+
if (normalizedType === 'nodes-langchain.chatTrigger') {
|
|
237
|
+
const responseMode = sourceNode.parameters?.options?.responseMode || 'lastNode';
|
|
238
|
+
if (responseMode === 'streaming') {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
function validateChatTrigger(node, workflow, reverseConnections) {
|
|
246
|
+
const issues = [];
|
|
247
|
+
const responseMode = node.parameters?.options?.responseMode || 'lastNode';
|
|
248
|
+
const outgoingMain = workflow.connections[node.name]?.main;
|
|
249
|
+
if (!outgoingMain || outgoingMain.length === 0 || !outgoingMain[0] || outgoingMain[0].length === 0) {
|
|
250
|
+
issues.push({
|
|
251
|
+
severity: 'error',
|
|
252
|
+
nodeId: node.id,
|
|
253
|
+
nodeName: node.name,
|
|
254
|
+
message: `Chat Trigger "${node.name}" has no outgoing connections. Connect it to an AI Agent or workflow.`,
|
|
255
|
+
code: 'MISSING_CONNECTIONS'
|
|
256
|
+
});
|
|
257
|
+
return issues;
|
|
258
|
+
}
|
|
259
|
+
const firstConnection = outgoingMain[0][0];
|
|
260
|
+
if (!firstConnection) {
|
|
261
|
+
return issues;
|
|
262
|
+
}
|
|
263
|
+
const targetNode = workflow.nodes.find(n => n.name === firstConnection.node);
|
|
264
|
+
if (!targetNode) {
|
|
265
|
+
issues.push({
|
|
266
|
+
severity: 'error',
|
|
267
|
+
nodeId: node.id,
|
|
268
|
+
nodeName: node.name,
|
|
269
|
+
message: `Chat Trigger "${node.name}" connects to non-existent node "${firstConnection.node}".`,
|
|
270
|
+
code: 'INVALID_TARGET_NODE'
|
|
271
|
+
});
|
|
272
|
+
return issues;
|
|
273
|
+
}
|
|
274
|
+
const targetType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(targetNode.type);
|
|
275
|
+
if (responseMode === 'streaming') {
|
|
276
|
+
if (targetType !== 'nodes-langchain.agent') {
|
|
277
|
+
issues.push({
|
|
278
|
+
severity: 'error',
|
|
279
|
+
nodeId: node.id,
|
|
280
|
+
nodeName: node.name,
|
|
281
|
+
message: `Chat Trigger "${node.name}" has responseMode="streaming" but connects to "${targetNode.name}" (${targetType}). Streaming mode only works with AI Agent. Change responseMode to "lastNode" or connect to an AI Agent.`,
|
|
282
|
+
code: 'STREAMING_WRONG_TARGET'
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const agentMainOutput = workflow.connections[targetNode.name]?.main;
|
|
287
|
+
if (agentMainOutput && agentMainOutput.flat().some((c) => c)) {
|
|
288
|
+
issues.push({
|
|
289
|
+
severity: 'error',
|
|
290
|
+
nodeId: targetNode.id,
|
|
291
|
+
nodeName: targetNode.name,
|
|
292
|
+
message: `AI Agent "${targetNode.name}" is in streaming mode but has outgoing main connections. In streaming mode, the AI Agent must NOT have main output connections - responses stream back through the Chat Trigger.`,
|
|
293
|
+
code: 'STREAMING_AGENT_HAS_OUTPUT'
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (responseMode === 'lastNode') {
|
|
299
|
+
if (targetType === 'nodes-langchain.agent') {
|
|
300
|
+
issues.push({
|
|
301
|
+
severity: 'info',
|
|
302
|
+
nodeId: node.id,
|
|
303
|
+
nodeName: node.name,
|
|
304
|
+
message: `Chat Trigger "${node.name}" uses responseMode="lastNode" with AI Agent. Consider using responseMode="streaming" for better user experience with real-time responses.`
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return issues;
|
|
309
|
+
}
|
|
310
|
+
function validateBasicLLMChain(node, reverseConnections) {
|
|
311
|
+
const issues = [];
|
|
312
|
+
const incoming = reverseConnections.get(node.name) || [];
|
|
313
|
+
const languageModelConnections = incoming.filter(c => c.type === 'ai_languageModel');
|
|
314
|
+
if (languageModelConnections.length === 0) {
|
|
315
|
+
issues.push({
|
|
316
|
+
severity: 'error',
|
|
317
|
+
nodeId: node.id,
|
|
318
|
+
nodeName: node.name,
|
|
319
|
+
message: `Basic LLM Chain "${node.name}" requires an ai_languageModel connection. Connect a language model node.`,
|
|
320
|
+
code: 'MISSING_LANGUAGE_MODEL'
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
else if (languageModelConnections.length > 1) {
|
|
324
|
+
issues.push({
|
|
325
|
+
severity: 'error',
|
|
326
|
+
nodeId: node.id,
|
|
327
|
+
nodeName: node.name,
|
|
328
|
+
message: `Basic LLM Chain "${node.name}" has ${languageModelConnections.length} ai_languageModel connections. Basic LLM Chain only supports 1 language model (no fallback).`,
|
|
329
|
+
code: 'MULTIPLE_LANGUAGE_MODELS'
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
const memoryConnections = incoming.filter(c => c.type === 'ai_memory');
|
|
333
|
+
if (memoryConnections.length > 1) {
|
|
334
|
+
issues.push({
|
|
335
|
+
severity: 'error',
|
|
336
|
+
nodeId: node.id,
|
|
337
|
+
nodeName: node.name,
|
|
338
|
+
message: `Basic LLM Chain "${node.name}" has ${memoryConnections.length} ai_memory connections. Only 1 memory is allowed.`,
|
|
339
|
+
code: 'MULTIPLE_MEMORY_CONNECTIONS'
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
const toolConnections = incoming.filter(c => c.type === 'ai_tool');
|
|
343
|
+
if (toolConnections.length > 0) {
|
|
344
|
+
issues.push({
|
|
345
|
+
severity: 'error',
|
|
346
|
+
nodeId: node.id,
|
|
347
|
+
nodeName: node.name,
|
|
348
|
+
message: `Basic LLM Chain "${node.name}" has ai_tool connections. Basic LLM Chain does not support tools. Use AI Agent if you need tool support.`,
|
|
349
|
+
code: 'TOOLS_NOT_SUPPORTED'
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
if (node.parameters.promptType === 'define') {
|
|
353
|
+
if (!node.parameters.text || node.parameters.text.trim() === '') {
|
|
354
|
+
issues.push({
|
|
355
|
+
severity: 'error',
|
|
356
|
+
nodeId: node.id,
|
|
357
|
+
nodeName: node.name,
|
|
358
|
+
message: `Basic LLM Chain "${node.name}" has promptType="define" but the text field is empty.`,
|
|
359
|
+
code: 'MISSING_PROMPT_TEXT'
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return issues;
|
|
364
|
+
}
|
|
365
|
+
function validateAISpecificNodes(workflow) {
|
|
366
|
+
const issues = [];
|
|
367
|
+
const reverseConnectionMap = buildReverseConnectionMap(workflow);
|
|
368
|
+
for (const node of workflow.nodes) {
|
|
369
|
+
if (node.disabled)
|
|
370
|
+
continue;
|
|
371
|
+
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(node.type);
|
|
372
|
+
if (normalizedType === 'nodes-langchain.agent') {
|
|
373
|
+
const nodeIssues = validateAIAgent(node, reverseConnectionMap, workflow);
|
|
374
|
+
issues.push(...nodeIssues);
|
|
375
|
+
}
|
|
376
|
+
if (normalizedType === 'nodes-langchain.chatTrigger') {
|
|
377
|
+
const nodeIssues = validateChatTrigger(node, workflow, reverseConnectionMap);
|
|
378
|
+
issues.push(...nodeIssues);
|
|
379
|
+
}
|
|
380
|
+
if (normalizedType === 'nodes-langchain.chainLlm') {
|
|
381
|
+
const nodeIssues = validateBasicLLMChain(node, reverseConnectionMap);
|
|
382
|
+
issues.push(...nodeIssues);
|
|
383
|
+
}
|
|
384
|
+
if ((0, ai_tool_validators_1.isAIToolSubNode)(normalizedType)) {
|
|
385
|
+
const nodeIssues = (0, ai_tool_validators_1.validateAIToolSubNode)(node, normalizedType, reverseConnectionMap, workflow);
|
|
386
|
+
issues.push(...nodeIssues);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return issues;
|
|
390
|
+
}
|
|
391
|
+
function hasAINodes(workflow) {
|
|
392
|
+
const aiNodeTypes = [
|
|
393
|
+
'nodes-langchain.agent',
|
|
394
|
+
'nodes-langchain.chatTrigger',
|
|
395
|
+
'nodes-langchain.chainLlm',
|
|
396
|
+
];
|
|
397
|
+
return workflow.nodes.some(node => {
|
|
398
|
+
const normalized = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(node.type);
|
|
399
|
+
return aiNodeTypes.includes(normalized) || (0, ai_tool_validators_1.isAIToolSubNode)(normalized);
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
function getAINodeCategory(nodeType) {
|
|
403
|
+
const normalized = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(nodeType);
|
|
404
|
+
if (normalized === 'nodes-langchain.agent')
|
|
405
|
+
return 'AI Agent';
|
|
406
|
+
if (normalized === 'nodes-langchain.chatTrigger')
|
|
407
|
+
return 'Chat Trigger';
|
|
408
|
+
if (normalized === 'nodes-langchain.chainLlm')
|
|
409
|
+
return 'Basic LLM Chain';
|
|
410
|
+
if ((0, ai_tool_validators_1.isAIToolSubNode)(normalized))
|
|
411
|
+
return 'AI Tool';
|
|
412
|
+
if (normalized.startsWith('nodes-langchain.')) {
|
|
413
|
+
if (normalized.includes('openAi') || normalized.includes('anthropic') || normalized.includes('googleGemini')) {
|
|
414
|
+
return 'Language Model';
|
|
415
|
+
}
|
|
416
|
+
if (normalized.includes('memory') || normalized.includes('buffer')) {
|
|
417
|
+
return 'Memory';
|
|
418
|
+
}
|
|
419
|
+
if (normalized.includes('vectorStore') || normalized.includes('pinecone') || normalized.includes('qdrant')) {
|
|
420
|
+
return 'Vector Store';
|
|
421
|
+
}
|
|
422
|
+
if (normalized.includes('embedding')) {
|
|
423
|
+
return 'Embeddings';
|
|
424
|
+
}
|
|
425
|
+
return 'AI Component';
|
|
426
|
+
}
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=ai-node-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-node-validator.js","sourceRoot":"","sources":["../../src/services/ai-node-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface WorkflowNode {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
position: [number, number];
|
|
6
|
+
parameters: any;
|
|
7
|
+
credentials?: any;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
typeVersion?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkflowJson {
|
|
12
|
+
name?: string;
|
|
13
|
+
nodes: WorkflowNode[];
|
|
14
|
+
connections: Record<string, any>;
|
|
15
|
+
settings?: any;
|
|
16
|
+
}
|
|
17
|
+
export interface ReverseConnection {
|
|
18
|
+
sourceName: string;
|
|
19
|
+
sourceType: string;
|
|
20
|
+
type: string;
|
|
21
|
+
index: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ValidationIssue {
|
|
24
|
+
severity: 'error' | 'warning' | 'info';
|
|
25
|
+
nodeId?: string;
|
|
26
|
+
nodeName?: string;
|
|
27
|
+
message: string;
|
|
28
|
+
code?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function validateHTTPRequestTool(node: WorkflowNode): ValidationIssue[];
|
|
31
|
+
export declare function validateCodeTool(node: WorkflowNode): ValidationIssue[];
|
|
32
|
+
export declare function validateVectorStoreTool(node: WorkflowNode, reverseConnections: Map<string, ReverseConnection[]>, workflow: WorkflowJson): ValidationIssue[];
|
|
33
|
+
export declare function validateWorkflowTool(node: WorkflowNode, reverseConnections?: Map<string, ReverseConnection[]>): ValidationIssue[];
|
|
34
|
+
export declare function validateAIAgentTool(node: WorkflowNode, reverseConnections: Map<string, ReverseConnection[]>): ValidationIssue[];
|
|
35
|
+
export declare function validateMCPClientTool(node: WorkflowNode): ValidationIssue[];
|
|
36
|
+
export declare function validateCalculatorTool(node: WorkflowNode): ValidationIssue[];
|
|
37
|
+
export declare function validateThinkTool(node: WorkflowNode): ValidationIssue[];
|
|
38
|
+
export declare function validateSerpApiTool(node: WorkflowNode): ValidationIssue[];
|
|
39
|
+
export declare function validateWikipediaTool(node: WorkflowNode): ValidationIssue[];
|
|
40
|
+
export declare function validateSearXngTool(node: WorkflowNode): ValidationIssue[];
|
|
41
|
+
export declare function validateWolframAlphaTool(node: WorkflowNode): ValidationIssue[];
|
|
42
|
+
export declare const AI_TOOL_VALIDATORS: {
|
|
43
|
+
readonly 'nodes-langchain.toolHttpRequest': typeof validateHTTPRequestTool;
|
|
44
|
+
readonly 'nodes-langchain.toolCode': typeof validateCodeTool;
|
|
45
|
+
readonly 'nodes-langchain.toolVectorStore': typeof validateVectorStoreTool;
|
|
46
|
+
readonly 'nodes-langchain.toolWorkflow': typeof validateWorkflowTool;
|
|
47
|
+
readonly 'nodes-langchain.agentTool': typeof validateAIAgentTool;
|
|
48
|
+
readonly 'nodes-langchain.mcpClientTool': typeof validateMCPClientTool;
|
|
49
|
+
readonly 'nodes-langchain.toolCalculator': typeof validateCalculatorTool;
|
|
50
|
+
readonly 'nodes-langchain.toolThink': typeof validateThinkTool;
|
|
51
|
+
readonly 'nodes-langchain.toolSerpApi': typeof validateSerpApiTool;
|
|
52
|
+
readonly 'nodes-langchain.toolWikipedia': typeof validateWikipediaTool;
|
|
53
|
+
readonly 'nodes-langchain.toolSearXng': typeof validateSearXngTool;
|
|
54
|
+
readonly 'nodes-langchain.toolWolframAlpha': typeof validateWolframAlphaTool;
|
|
55
|
+
};
|
|
56
|
+
export declare function isAIToolSubNode(nodeType: string): boolean;
|
|
57
|
+
export declare function validateAIToolSubNode(node: WorkflowNode, nodeType: string, reverseConnections: Map<string, ReverseConnection[]>, workflow: WorkflowJson): ValidationIssue[];
|
|
58
|
+
//# sourceMappingURL=ai-tool-validators.d.ts.map
|
|
@@ -0,0 +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"}
|