@n8n/ai-workflow-builder 0.27.1 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build.tsbuildinfo +1 -1
- package/dist/chains/prompt-categorization.d.ts +3 -0
- package/dist/chains/prompt-categorization.js +109 -0
- package/dist/chains/prompt-categorization.js.map +1 -0
- package/dist/chains/prompts/parameter-types/system-message.d.ts +1 -0
- package/dist/chains/prompts/parameter-types/system-message.js +75 -0
- package/dist/chains/prompts/parameter-types/system-message.js.map +1 -0
- package/dist/chains/prompts/prompt-builder.d.ts +1 -0
- package/dist/chains/prompts/prompt-builder.js +23 -1
- package/dist/chains/prompts/prompt-builder.js.map +1 -1
- package/dist/chains/test/integration/test-helpers.d.ts +3 -0
- package/dist/chains/test/integration/test-helpers.js +16 -0
- package/dist/chains/test/integration/test-helpers.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/best-practices/chatbot.d.ts +7 -0
- package/dist/tools/best-practices/chatbot.js +118 -0
- package/dist/tools/best-practices/chatbot.js.map +1 -0
- package/dist/tools/best-practices/content-generation.d.ts +7 -0
- package/dist/tools/best-practices/content-generation.js +79 -0
- package/dist/tools/best-practices/content-generation.js.map +1 -0
- package/dist/tools/best-practices/data-extraction.d.ts +7 -0
- package/dist/tools/best-practices/data-extraction.js +105 -0
- package/dist/tools/best-practices/data-extraction.js.map +1 -0
- package/dist/tools/best-practices/form-input.d.ts +7 -0
- package/dist/tools/best-practices/form-input.js +173 -0
- package/dist/tools/best-practices/form-input.js.map +1 -0
- package/dist/tools/best-practices/index.d.ts +3 -0
- package/dist/tools/best-practices/index.js +27 -0
- package/dist/tools/best-practices/index.js.map +1 -0
- package/dist/tools/best-practices/scraping-and-research.d.ts +7 -0
- package/dist/tools/best-practices/scraping-and-research.js +147 -0
- package/dist/tools/best-practices/scraping-and-research.js.map +1 -0
- package/dist/tools/builder-tools.js +9 -0
- package/dist/tools/builder-tools.js.map +1 -1
- package/dist/tools/categorize-prompt.tool.d.ts +5 -0
- package/dist/tools/categorize-prompt.tool.js +84 -0
- package/dist/tools/categorize-prompt.tool.js.map +1 -0
- package/dist/tools/engines/node-search-engine.d.ts +0 -9
- package/dist/tools/engines/node-search-engine.js +52 -72
- package/dist/tools/engines/node-search-engine.js.map +1 -1
- package/dist/tools/get-best-practices.tool.d.ts +33 -0
- package/dist/tools/get-best-practices.tool.js +94 -0
- package/dist/tools/get-best-practices.tool.js.map +1 -0
- package/dist/tools/prompts/main-agent.prompt.js +116 -5
- package/dist/tools/prompts/main-agent.prompt.js.map +1 -1
- package/dist/tools/validate-workflow.tool.d.ts +5 -0
- package/dist/tools/validate-workflow.tool.js +61 -0
- package/dist/tools/validate-workflow.tool.js.map +1 -0
- package/dist/types/best-practices.d.ts +6 -0
- package/dist/types/best-practices.js +3 -0
- package/dist/types/best-practices.js.map +1 -0
- package/dist/types/categorization.d.ts +23 -0
- package/dist/types/categorization.js +38 -0
- package/dist/types/categorization.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/tools.d.ts +4 -0
- package/dist/utils/operations-processor.d.ts +2 -0
- package/dist/utils/operations-processor.js +1 -0
- package/dist/utils/operations-processor.js.map +1 -1
- package/dist/utils/stream-processor.d.ts +1 -0
- package/dist/utils/stream-processor.js +99 -59
- package/dist/utils/stream-processor.js.map +1 -1
- package/dist/utils/workflow-validation.d.ts +2 -0
- package/dist/utils/workflow-validation.js +36 -0
- package/dist/utils/workflow-validation.js.map +1 -0
- package/dist/validation/checks/agent-prompt.d.ts +3 -0
- package/dist/validation/checks/agent-prompt.js +45 -0
- package/dist/validation/checks/agent-prompt.js.map +1 -0
- package/dist/validation/checks/connections.d.ts +4 -0
- package/dist/validation/checks/connections.js +162 -0
- package/dist/validation/checks/connections.js.map +1 -0
- package/dist/validation/checks/from-ai.d.ts +4 -0
- package/dist/validation/checks/from-ai.js +59 -0
- package/dist/validation/checks/from-ai.js.map +1 -0
- package/dist/validation/checks/index.d.ts +5 -0
- package/dist/validation/checks/index.js +14 -0
- package/dist/validation/checks/index.js.map +1 -0
- package/dist/validation/checks/tools.d.ts +4 -0
- package/dist/validation/checks/tools.js +44 -0
- package/dist/validation/checks/tools.js.map +1 -0
- package/dist/validation/checks/trigger.d.ts +8 -0
- package/dist/validation/checks/trigger.js +35 -0
- package/dist/validation/checks/trigger.js.map +1 -0
- package/dist/validation/programmatic.d.ts +3 -0
- package/dist/validation/programmatic.js +20 -0
- package/dist/validation/programmatic.js.map +1 -0
- package/dist/validation/types.d.ts +41 -0
- package/dist/validation/types.js +3 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/utils/expressions.d.ts +3 -0
- package/dist/validation/utils/expressions.js +37 -0
- package/dist/validation/utils/expressions.js.map +1 -0
- package/dist/validation/utils/is-tool.d.ts +2 -0
- package/dist/validation/utils/is-tool.js +7 -0
- package/dist/validation/utils/is-tool.js.map +1 -0
- package/dist/validation/utils/resolve-connections.d.ts +8 -0
- package/dist/validation/utils/resolve-connections.js +64 -0
- package/dist/validation/utils/resolve-connections.js.map +1 -0
- package/dist/workflow-builder-agent.d.ts +2 -0
- package/dist/workflow-builder-agent.js +28 -25
- package/dist/workflow-builder-agent.js.map +1 -1
- package/dist/workflow-state.d.ts +3 -1
- package/dist/workflow-state.js +4 -0
- package/dist/workflow-state.js.map +1 -1
- package/package.json +12 -7
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const WorkflowTechnique: {
|
|
2
|
+
readonly SCHEDULING: "scheduling";
|
|
3
|
+
readonly CHATBOT: "chatbot";
|
|
4
|
+
readonly FORM_INPUT: "form_input";
|
|
5
|
+
readonly SCRAPING_AND_RESEARCH: "scraping_and_research";
|
|
6
|
+
readonly MONITORING: "monitoring";
|
|
7
|
+
readonly ENRICHMENT: "enrichment";
|
|
8
|
+
readonly TRIAGE: "triage";
|
|
9
|
+
readonly CONTENT_GENERATION: "content_generation";
|
|
10
|
+
readonly DOCUMENT_PROCESSING: "document_processing";
|
|
11
|
+
readonly DATA_EXTRACTION: "data_extraction";
|
|
12
|
+
readonly DATA_ANALYSIS: "data_analysis";
|
|
13
|
+
readonly DATA_TRANSFORMATION: "data_transformation";
|
|
14
|
+
readonly NOTIFICATION: "notification";
|
|
15
|
+
readonly KNOWLEDGE_BASE: "knowledge_base";
|
|
16
|
+
readonly HUMAN_IN_THE_LOOP: "human_in_the_loop";
|
|
17
|
+
};
|
|
18
|
+
export type WorkflowTechniqueType = (typeof WorkflowTechnique)[keyof typeof WorkflowTechnique];
|
|
19
|
+
export declare const TechniqueDescription: Record<WorkflowTechniqueType, string>;
|
|
20
|
+
export interface PromptCategorization {
|
|
21
|
+
techniques: WorkflowTechniqueType[];
|
|
22
|
+
confidence?: number;
|
|
23
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TechniqueDescription = exports.WorkflowTechnique = void 0;
|
|
4
|
+
exports.WorkflowTechnique = {
|
|
5
|
+
SCHEDULING: 'scheduling',
|
|
6
|
+
CHATBOT: 'chatbot',
|
|
7
|
+
FORM_INPUT: 'form_input',
|
|
8
|
+
SCRAPING_AND_RESEARCH: 'scraping_and_research',
|
|
9
|
+
MONITORING: 'monitoring',
|
|
10
|
+
ENRICHMENT: 'enrichment',
|
|
11
|
+
TRIAGE: 'triage',
|
|
12
|
+
CONTENT_GENERATION: 'content_generation',
|
|
13
|
+
DOCUMENT_PROCESSING: 'document_processing',
|
|
14
|
+
DATA_EXTRACTION: 'data_extraction',
|
|
15
|
+
DATA_ANALYSIS: 'data_analysis',
|
|
16
|
+
DATA_TRANSFORMATION: 'data_transformation',
|
|
17
|
+
NOTIFICATION: 'notification',
|
|
18
|
+
KNOWLEDGE_BASE: 'knowledge_base',
|
|
19
|
+
HUMAN_IN_THE_LOOP: 'human_in_the_loop',
|
|
20
|
+
};
|
|
21
|
+
exports.TechniqueDescription = {
|
|
22
|
+
[exports.WorkflowTechnique.SCHEDULING]: 'Running an action at a specific time or interval',
|
|
23
|
+
[exports.WorkflowTechnique.CHATBOT]: 'Receiving chat messages and replying (built-in chat, Telegram, Slack, MS Teams, etc.)',
|
|
24
|
+
[exports.WorkflowTechnique.FORM_INPUT]: 'Gathering data from users via forms',
|
|
25
|
+
[exports.WorkflowTechnique.SCRAPING_AND_RESEARCH]: 'Methodically collecting information from websites or APIs to compile structured data',
|
|
26
|
+
[exports.WorkflowTechnique.MONITORING]: 'Repeatedly checking service/website status and taking action when conditions are met',
|
|
27
|
+
[exports.WorkflowTechnique.ENRICHMENT]: 'Adding extra details to existing data by merging information from other sources',
|
|
28
|
+
[exports.WorkflowTechnique.TRIAGE]: 'Classifying data for routing or prioritization',
|
|
29
|
+
[exports.WorkflowTechnique.CONTENT_GENERATION]: 'Creating text, images, audio, video, etc.',
|
|
30
|
+
[exports.WorkflowTechnique.DOCUMENT_PROCESSING]: 'Taking action on content within files (PDFs, Word docs, images)',
|
|
31
|
+
[exports.WorkflowTechnique.DATA_EXTRACTION]: 'Pulling specific information from structured or unstructured inputs',
|
|
32
|
+
[exports.WorkflowTechnique.DATA_ANALYSIS]: 'Examining data to find patterns, trends, anomalies, or insights',
|
|
33
|
+
[exports.WorkflowTechnique.DATA_TRANSFORMATION]: 'Cleaning, formatting, or restructuring data (including summarization)',
|
|
34
|
+
[exports.WorkflowTechnique.NOTIFICATION]: 'Sending alerts or updates via email, chat, SMS when events occur',
|
|
35
|
+
[exports.WorkflowTechnique.KNOWLEDGE_BASE]: 'Building or using a centralized information collection (usually vector database for LLM use)',
|
|
36
|
+
[exports.WorkflowTechnique.HUMAN_IN_THE_LOOP]: 'Pausing for human decision/input before resuming',
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=categorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorization.js","sourceRoot":"","sources":["../../src/types/categorization.ts"],"names":[],"mappings":";;;AAGa,QAAA,iBAAiB,GAAG;IAEhC,UAAU,EAAE,YAAY;IAExB,OAAO,EAAE,SAAS;IAElB,UAAU,EAAE,YAAY;IAExB,qBAAqB,EAAE,uBAAuB;IAE9C,UAAU,EAAE,YAAY;IAExB,UAAU,EAAE,YAAY;IAExB,MAAM,EAAE,QAAQ;IAEhB,kBAAkB,EAAE,oBAAoB;IAExC,mBAAmB,EAAE,qBAAqB;IAE1C,eAAe,EAAE,iBAAiB;IAElC,aAAa,EAAE,eAAe;IAE9B,mBAAmB,EAAE,qBAAqB;IAE1C,YAAY,EAAE,cAAc;IAE5B,cAAc,EAAE,gBAAgB;IAEhC,iBAAiB,EAAE,mBAAmB;CAC7B,CAAC;AAOE,QAAA,oBAAoB,GAA0C;IAC1E,CAAC,yBAAiB,CAAC,UAAU,CAAC,EAAE,kDAAkD;IAClF,CAAC,yBAAiB,CAAC,OAAO,CAAC,EAC1B,uFAAuF;IACxF,CAAC,yBAAiB,CAAC,UAAU,CAAC,EAAE,qCAAqC;IACrE,CAAC,yBAAiB,CAAC,qBAAqB,CAAC,EACxC,sFAAsF;IACvF,CAAC,yBAAiB,CAAC,UAAU,CAAC,EAC7B,sFAAsF;IACvF,CAAC,yBAAiB,CAAC,UAAU,CAAC,EAC7B,iFAAiF;IAClF,CAAC,yBAAiB,CAAC,MAAM,CAAC,EAAE,gDAAgD;IAC5E,CAAC,yBAAiB,CAAC,kBAAkB,CAAC,EAAE,2CAA2C;IACnF,CAAC,yBAAiB,CAAC,mBAAmB,CAAC,EACtC,iEAAiE;IAClE,CAAC,yBAAiB,CAAC,eAAe,CAAC,EAClC,qEAAqE;IACtE,CAAC,yBAAiB,CAAC,aAAa,CAAC,EAChC,iEAAiE;IAClE,CAAC,yBAAiB,CAAC,mBAAmB,CAAC,EACtC,uEAAuE;IACxE,CAAC,yBAAiB,CAAC,YAAY,CAAC,EAC/B,kEAAkE;IACnE,CAAC,yBAAiB,CAAC,cAAc,CAAC,EACjC,8FAA8F;IAC/F,CAAC,yBAAiB,CAAC,iBAAiB,CAAC,EAAE,kDAAkD;CACzF,CAAC"}
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/tools.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { INodeParameters } from 'n8n-workflow';
|
|
2
2
|
import type { ZodIssue } from 'zod';
|
|
3
|
+
import type { PromptCategorization } from './categorization';
|
|
3
4
|
import type { AddedNode, NodeDetails, NodeSearchResult } from './nodes';
|
|
4
5
|
export type ProgressUpdateType = 'input' | 'output' | 'progress' | 'error';
|
|
5
6
|
export interface ProgressUpdate<T = Record<string, unknown>> {
|
|
@@ -89,3 +90,6 @@ export interface RemoveConnectionOutput {
|
|
|
89
90
|
targetInputIndex: number;
|
|
90
91
|
message: string;
|
|
91
92
|
}
|
|
93
|
+
export interface CategorizePromptOutput {
|
|
94
|
+
categorization: PromptCategorization;
|
|
95
|
+
}
|
|
@@ -4,7 +4,9 @@ export declare function applyOperations(workflow: SimpleWorkflow, operations: Wo
|
|
|
4
4
|
export declare function processOperations(state: typeof WorkflowState.State): {
|
|
5
5
|
workflowJSON?: undefined;
|
|
6
6
|
workflowOperations?: undefined;
|
|
7
|
+
workflowValidation?: undefined;
|
|
7
8
|
} | {
|
|
8
9
|
workflowJSON: SimpleWorkflow;
|
|
9
10
|
workflowOperations: null;
|
|
11
|
+
workflowValidation: null;
|
|
10
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations-processor.js","sourceRoot":"","sources":["../../src/utils/operations-processor.ts"],"names":[],"mappings":";;AAmSA,0CAkBC;AAMD,
|
|
1
|
+
{"version":3,"file":"operations-processor.js","sourceRoot":"","sources":["../../src/utils/operations-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,4 +12,5 @@ export interface BuilderTool extends BuilderToolBase {
|
|
|
12
12
|
export declare const DEFAULT_WORKFLOW_UPDATE_TOOLS: string[];
|
|
13
13
|
export declare function processStreamChunk(streamMode: string, chunk: unknown): StreamOutput | null;
|
|
14
14
|
export declare function createStreamProcessor(stream: AsyncGenerator<[string, unknown], void, unknown>): AsyncGenerator<StreamOutput>;
|
|
15
|
+
export declare function cleanContextTags(text: string): string;
|
|
15
16
|
export declare function formatMessages(messages: Array<AIMessage | HumanMessage | ToolMessage>, builderTools?: BuilderToolBase[]): Array<Record<string, unknown>>;
|
|
@@ -3,76 +3,104 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DEFAULT_WORKFLOW_UPDATE_TOOLS = void 0;
|
|
4
4
|
exports.processStreamChunk = processStreamChunk;
|
|
5
5
|
exports.createStreamProcessor = createStreamProcessor;
|
|
6
|
+
exports.cleanContextTags = cleanContextTags;
|
|
6
7
|
exports.formatMessages = formatMessages;
|
|
7
8
|
const messages_1 = require("@langchain/core/messages");
|
|
9
|
+
function isAgentUpdateChunk(chunk) {
|
|
10
|
+
return (typeof chunk === 'object' &&
|
|
11
|
+
chunk !== null &&
|
|
12
|
+
('agent' in chunk ||
|
|
13
|
+
'compact_messages' in chunk ||
|
|
14
|
+
'delete_messages' in chunk ||
|
|
15
|
+
'process_operations' in chunk));
|
|
16
|
+
}
|
|
17
|
+
function isToolProgressChunk(chunk) {
|
|
18
|
+
return typeof chunk === 'object' && chunk !== null && 'type' in chunk && chunk.type === 'tool';
|
|
19
|
+
}
|
|
8
20
|
exports.DEFAULT_WORKFLOW_UPDATE_TOOLS = [
|
|
9
21
|
'add_nodes',
|
|
10
22
|
'connect_nodes',
|
|
11
23
|
'update_node_parameters',
|
|
12
24
|
'remove_node',
|
|
13
25
|
];
|
|
26
|
+
function getLastMessage(messages) {
|
|
27
|
+
if (!messages || messages.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return messages[messages.length - 1];
|
|
31
|
+
}
|
|
32
|
+
function extractTextFromContent(content) {
|
|
33
|
+
if (Array.isArray(content)) {
|
|
34
|
+
return content
|
|
35
|
+
.filter((part) => part.type === 'text')
|
|
36
|
+
.map((part) => part.text)
|
|
37
|
+
.join('\n');
|
|
38
|
+
}
|
|
39
|
+
return content;
|
|
40
|
+
}
|
|
41
|
+
function createMessageChunk(text) {
|
|
42
|
+
return {
|
|
43
|
+
role: 'assistant',
|
|
44
|
+
type: 'message',
|
|
45
|
+
text,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function processDeleteMessages(chunk) {
|
|
49
|
+
const messages = chunk.delete_messages?.messages;
|
|
50
|
+
if (!messages || messages.length === 0) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return { messages: [createMessageChunk('Deleted, refresh?')] };
|
|
54
|
+
}
|
|
55
|
+
function processCompactMessages(chunk) {
|
|
56
|
+
const lastMessage = getLastMessage(chunk.compact_messages?.messages);
|
|
57
|
+
if (!lastMessage) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const text = extractTextFromContent(lastMessage.content);
|
|
61
|
+
return { messages: [createMessageChunk(text)] };
|
|
62
|
+
}
|
|
63
|
+
function processAgentMessages(chunk) {
|
|
64
|
+
const lastMessage = getLastMessage(chunk.agent?.messages);
|
|
65
|
+
if (!lastMessage?.content) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const text = extractTextFromContent(lastMessage.content);
|
|
69
|
+
if (!text) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return { messages: [createMessageChunk(text)] };
|
|
73
|
+
}
|
|
74
|
+
function processOperations(chunk) {
|
|
75
|
+
const update = chunk.process_operations;
|
|
76
|
+
if (!update?.workflowJSON || update.workflowOperations === undefined) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const workflowUpdateChunk = {
|
|
80
|
+
role: 'assistant',
|
|
81
|
+
type: 'workflow-updated',
|
|
82
|
+
codeSnippet: JSON.stringify(update.workflowJSON, null, 2),
|
|
83
|
+
};
|
|
84
|
+
return { messages: [workflowUpdateChunk] };
|
|
85
|
+
}
|
|
86
|
+
function processCustomToolChunk(chunk) {
|
|
87
|
+
if (!isToolProgressChunk(chunk)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return { messages: [chunk] };
|
|
91
|
+
}
|
|
14
92
|
function processStreamChunk(streamMode, chunk) {
|
|
15
93
|
if (streamMode === 'updates') {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const messageChunk = {
|
|
19
|
-
role: 'assistant',
|
|
20
|
-
type: 'message',
|
|
21
|
-
text: 'Deleted, refresh?',
|
|
22
|
-
};
|
|
23
|
-
return { messages: [messageChunk] };
|
|
24
|
-
}
|
|
25
|
-
if ((agentChunk?.compact_messages?.messages ?? []).length > 0) {
|
|
26
|
-
const lastMessage = agentChunk.compact_messages.messages[agentChunk.compact_messages.messages.length - 1];
|
|
27
|
-
const messageChunk = {
|
|
28
|
-
role: 'assistant',
|
|
29
|
-
type: 'message',
|
|
30
|
-
text: lastMessage.content,
|
|
31
|
-
};
|
|
32
|
-
return { messages: [messageChunk] };
|
|
33
|
-
}
|
|
34
|
-
if ((agentChunk?.agent?.messages ?? []).length > 0) {
|
|
35
|
-
const lastMessage = agentChunk.agent.messages[agentChunk.agent.messages.length - 1];
|
|
36
|
-
if (lastMessage.content) {
|
|
37
|
-
let content;
|
|
38
|
-
if (Array.isArray(lastMessage.content)) {
|
|
39
|
-
content = lastMessage.content
|
|
40
|
-
.filter((c) => c.type === 'text')
|
|
41
|
-
.map((b) => b.text)
|
|
42
|
-
.join('\n');
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
content = lastMessage.content;
|
|
46
|
-
}
|
|
47
|
-
if (content) {
|
|
48
|
-
const messageChunk = {
|
|
49
|
-
role: 'assistant',
|
|
50
|
-
type: 'message',
|
|
51
|
-
text: content,
|
|
52
|
-
};
|
|
53
|
-
return { messages: [messageChunk] };
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (agentChunk?.process_operations) {
|
|
59
|
-
const update = agentChunk.process_operations;
|
|
60
|
-
if (update.workflowJSON && update.workflowOperations !== undefined) {
|
|
61
|
-
const workflowUpdateChunk = {
|
|
62
|
-
role: 'assistant',
|
|
63
|
-
type: 'workflow-updated',
|
|
64
|
-
codeSnippet: JSON.stringify(update.workflowJSON, null, 2),
|
|
65
|
-
};
|
|
66
|
-
return { messages: [workflowUpdateChunk] };
|
|
67
|
-
}
|
|
94
|
+
if (!isAgentUpdateChunk(chunk)) {
|
|
95
|
+
return null;
|
|
68
96
|
}
|
|
97
|
+
return (processDeleteMessages(chunk) ??
|
|
98
|
+
processCompactMessages(chunk) ??
|
|
99
|
+
processAgentMessages(chunk) ??
|
|
100
|
+
processOperations(chunk));
|
|
69
101
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (toolChunk?.type === 'tool') {
|
|
73
|
-
const output = { messages: [toolChunk] };
|
|
74
|
-
return output;
|
|
75
|
-
}
|
|
102
|
+
if (streamMode === 'custom') {
|
|
103
|
+
return processCustomToolChunk(chunk);
|
|
76
104
|
}
|
|
77
105
|
return null;
|
|
78
106
|
}
|
|
@@ -84,11 +112,23 @@ async function* createStreamProcessor(stream) {
|
|
|
84
112
|
}
|
|
85
113
|
}
|
|
86
114
|
}
|
|
115
|
+
function cleanContextTags(text) {
|
|
116
|
+
return text.replace(/\n*<current_workflow_json>[\s\S]*?<\/current_execution_nodes_schemas>/, '');
|
|
117
|
+
}
|
|
87
118
|
function formatHumanMessage(msg) {
|
|
119
|
+
if (Array.isArray(msg.content)) {
|
|
120
|
+
const textParts = msg.content.filter((c) => typeof c === 'object' && c !== null && 'type' in c && c.type === 'text' && 'text' in c);
|
|
121
|
+
const text = textParts.map((part) => cleanContextTags(part.text)).join('\n');
|
|
122
|
+
return {
|
|
123
|
+
role: 'user',
|
|
124
|
+
type: 'message',
|
|
125
|
+
text,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
88
128
|
return {
|
|
89
129
|
role: 'user',
|
|
90
130
|
type: 'message',
|
|
91
|
-
text: msg.content,
|
|
131
|
+
text: cleanContextTags(msg.content),
|
|
92
132
|
};
|
|
93
133
|
}
|
|
94
134
|
function processArrayContent(content) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-processor.js","sourceRoot":"","sources":["../../src/utils/stream-processor.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"stream-processor.js","sourceRoot":"","sources":["../../src/utils/stream-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatWorkflowValidation = formatWorkflowValidation;
|
|
4
|
+
function formatViolationsByCategory(categories) {
|
|
5
|
+
const lines = [];
|
|
6
|
+
for (const [name, violations] of categories) {
|
|
7
|
+
if (!violations.length)
|
|
8
|
+
continue;
|
|
9
|
+
lines.push(`${name}:`);
|
|
10
|
+
for (const violation of violations) {
|
|
11
|
+
lines.push(`- (${violation.type}) ${violation.description}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return lines;
|
|
15
|
+
}
|
|
16
|
+
function formatWorkflowValidation(validation) {
|
|
17
|
+
if (!validation) {
|
|
18
|
+
return 'Workflow validation not yet run. Call the validate_workflow tool to analyze the current workflow.';
|
|
19
|
+
}
|
|
20
|
+
const lines = ['Workflow Validation Summary:'];
|
|
21
|
+
const violationLines = formatViolationsByCategory([
|
|
22
|
+
['Connections', validation.connections],
|
|
23
|
+
['Trigger', validation.trigger],
|
|
24
|
+
['Agent Prompt', validation.agentPrompt],
|
|
25
|
+
['Tools', validation.tools],
|
|
26
|
+
['From AI', validation.fromAi],
|
|
27
|
+
]);
|
|
28
|
+
if (violationLines.length === 0) {
|
|
29
|
+
lines.push('No validation violations detected.');
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
lines.push(...violationLines);
|
|
33
|
+
}
|
|
34
|
+
return lines.join('\n');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=workflow-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-validation.js","sourceRoot":"","sources":["../../src/utils/workflow-validation.ts"],"names":[],"mappings":";;AAmBA,4DAsBC;AAvCD,SAAS,0BAA0B,CAClC,UAAoD;IAEpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,SAAS;QAEjC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAgB,wBAAwB,CAAC,UAA2C;IACnF,IAAI,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,mGAAmG,CAAC;IAC5G,CAAC;IAED,MAAM,KAAK,GAAa,CAAC,8BAA8B,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,0BAA0B,CAAC;QACjD,CAAC,aAAa,EAAE,UAAU,CAAC,WAAW,CAAC;QACvC,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC;QAC/B,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;QACxC,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;QAC3B,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAgentPrompt = validateAgentPrompt;
|
|
4
|
+
const expressions_1 = require("../utils/expressions");
|
|
5
|
+
function isOptionsWithSystemMessage(value) {
|
|
6
|
+
return (typeof value === 'object' &&
|
|
7
|
+
value !== null &&
|
|
8
|
+
!Array.isArray(value) &&
|
|
9
|
+
('systemMessage' in value || Object.keys(value).length === 0));
|
|
10
|
+
}
|
|
11
|
+
function validateAgentPrompt(workflow) {
|
|
12
|
+
const violations = [];
|
|
13
|
+
if (!workflow.nodes || workflow.nodes.length === 0) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
for (const node of workflow.nodes) {
|
|
17
|
+
if (node.type === '@n8n/n8n-nodes-langchain.agent') {
|
|
18
|
+
const textParam = node.parameters?.text;
|
|
19
|
+
const promptType = node.parameters?.promptType;
|
|
20
|
+
const options = node.parameters?.options;
|
|
21
|
+
let systemMessage;
|
|
22
|
+
if (isOptionsWithSystemMessage(options)) {
|
|
23
|
+
systemMessage = options.systemMessage;
|
|
24
|
+
}
|
|
25
|
+
if (promptType !== 'auto' && promptType !== 'guardrails') {
|
|
26
|
+
if (!textParam || !(0, expressions_1.containsExpression)(textParam)) {
|
|
27
|
+
violations.push({
|
|
28
|
+
type: 'major',
|
|
29
|
+
description: `Agent node "${node.name}" has no expression in its prompt field. This likely means it failed to use chatInput or dynamic context`,
|
|
30
|
+
pointsDeducted: 20,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (!systemMessage || systemMessage.trim().length === 0) {
|
|
34
|
+
violations.push({
|
|
35
|
+
type: 'major',
|
|
36
|
+
description: `Agent node "${node.name}" has no system message. System-level instructions (role, tasks, behavior) should be in the system message field, not the text field`,
|
|
37
|
+
pointsDeducted: 25,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return violations;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=agent-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-prompt.js","sourceRoot":"","sources":["../../../src/validation/checks/agent-prompt.ts"],"names":[],"mappings":";;AA4BA,kDAiDC;AAxED,sDAA0D;AAK1D,SAAS,0BAA0B,CAClC,KAAc;IAEd,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,CAAC,eAAe,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAC7D,CAAC;AACH,CAAC;AASD,SAAgB,mBAAmB,CAAC,QAAwB;IAC3D,MAAM,UAAU,GAA4B,EAAE,CAAC;IAG/C,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACX,CAAC;IAGD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,IAAI,KAAK,gCAAgC,EAAE,CAAC;YAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;YAGzC,IAAI,aAAiC,CAAC;YACtC,IAAI,0BAA0B,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YACvC,CAAC;YAID,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAE1D,IAAI,CAAC,SAAS,IAAI,CAAC,IAAA,gCAAkB,EAAC,SAAS,CAAC,EAAE,CAAC;oBAClD,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE,eAAe,IAAI,CAAC,IAAI,0GAA0G;wBAC/I,cAAc,EAAE,EAAE;qBAClB,CAAC,CAAC;gBACJ,CAAC;gBAID,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzD,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE,eAAe,IAAI,CAAC,IAAI,sIAAsI;wBAC3K,cAAc,EAAE,EAAE;qBAClB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,UAAU,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
import type { SimpleWorkflow } from '../../types';
|
|
3
|
+
import type { ProgrammaticViolation } from '../types';
|
|
4
|
+
export declare function validateConnections(workflow: SimpleWorkflow, nodeTypes: INodeTypeDescription[]): ProgrammaticViolation[];
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateConnections = validateConnections;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const node_helpers_1 = require("../../utils/node-helpers");
|
|
6
|
+
const resolve_connections_1 = require("../../validation/utils/resolve-connections");
|
|
7
|
+
function getProvidedInputTypes(nodeConnections) {
|
|
8
|
+
const providedInputTypes = new Map();
|
|
9
|
+
if (!nodeConnections)
|
|
10
|
+
return providedInputTypes;
|
|
11
|
+
for (const [connectionType, connections] of Object.entries(nodeConnections)) {
|
|
12
|
+
let totalConnections = 0;
|
|
13
|
+
for (const connectionSet of connections) {
|
|
14
|
+
if (!connectionSet)
|
|
15
|
+
continue;
|
|
16
|
+
totalConnections += connectionSet.length;
|
|
17
|
+
}
|
|
18
|
+
if (totalConnections > 0) {
|
|
19
|
+
providedInputTypes.set(connectionType, totalConnections);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return providedInputTypes;
|
|
23
|
+
}
|
|
24
|
+
function checkMissingRequiredInputs(nodeInfo, providedInputTypes) {
|
|
25
|
+
const issues = [];
|
|
26
|
+
if (!nodeInfo.resolvedInputs)
|
|
27
|
+
return issues;
|
|
28
|
+
for (const input of nodeInfo.resolvedInputs) {
|
|
29
|
+
const providedCount = providedInputTypes.get(input.type) ?? 0;
|
|
30
|
+
if (input.required && providedCount === 0) {
|
|
31
|
+
issues.push({
|
|
32
|
+
type: 'critical',
|
|
33
|
+
description: `Node ${nodeInfo.node.name} (${nodeInfo.node.type}) is missing required input of type ${input.type}`,
|
|
34
|
+
pointsDeducted: 50,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return issues;
|
|
39
|
+
}
|
|
40
|
+
function checkUnsupportedConnections(nodeInfo, providedInputTypes) {
|
|
41
|
+
const issues = [];
|
|
42
|
+
if (!nodeInfo.resolvedInputs)
|
|
43
|
+
return issues;
|
|
44
|
+
const supportedTypes = new Set(nodeInfo.resolvedInputs.map((input) => input.type));
|
|
45
|
+
for (const [type] of providedInputTypes) {
|
|
46
|
+
if (!supportedTypes.has(type)) {
|
|
47
|
+
issues.push({
|
|
48
|
+
type: 'critical',
|
|
49
|
+
description: `Node ${nodeInfo.node.name} (${nodeInfo.node.type}) received unsupported connection type ${type}`,
|
|
50
|
+
pointsDeducted: 50,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return issues;
|
|
55
|
+
}
|
|
56
|
+
function checkMergeNodeConnections(nodeInfo, nodeConnections) {
|
|
57
|
+
const issues = [];
|
|
58
|
+
if (/\.merge$/.test(nodeInfo.node.type)) {
|
|
59
|
+
const providedInputTypes = getProvidedInputTypes(nodeConnections);
|
|
60
|
+
const totalInputConnections = providedInputTypes.get('main') ?? 0;
|
|
61
|
+
if (totalInputConnections < 2) {
|
|
62
|
+
issues.push({
|
|
63
|
+
type: 'major',
|
|
64
|
+
description: `Merge node ${nodeInfo.node.name} has only ${totalInputConnections} input connection(s). Merge nodes require at least 2 inputs to function properly.`,
|
|
65
|
+
pointsDeducted: 20,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const expectedInputs = nodeInfo.resolvedInputs?.filter((input) => input.type === 'main').length ?? 1;
|
|
69
|
+
if (totalInputConnections !== expectedInputs) {
|
|
70
|
+
issues.push({
|
|
71
|
+
type: 'minor',
|
|
72
|
+
description: `Merge node ${nodeInfo.node.name} has ${totalInputConnections} input connections but is configured to accept ${expectedInputs}.`,
|
|
73
|
+
pointsDeducted: 10,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const mainConnections = nodeConnections?.main ?? [];
|
|
77
|
+
const missingIndexes = [];
|
|
78
|
+
for (let inputIndex = 0; inputIndex < expectedInputs; inputIndex++) {
|
|
79
|
+
const connectionsForIndex = mainConnections[inputIndex];
|
|
80
|
+
const hasConnections = Array.isArray(connectionsForIndex) && connectionsForIndex.length > 0;
|
|
81
|
+
if (!hasConnections) {
|
|
82
|
+
missingIndexes.push(inputIndex + 1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (missingIndexes.length > 0) {
|
|
86
|
+
issues.push({
|
|
87
|
+
type: 'major',
|
|
88
|
+
description: `Merge node ${nodeInfo.node.name} is missing connections for input(s) ${missingIndexes.join(', ')}.`,
|
|
89
|
+
pointsDeducted: 20,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return issues;
|
|
94
|
+
}
|
|
95
|
+
function checkSubNodeRootConnections(workflow, nodeInfo, nodesByName) {
|
|
96
|
+
const issues = [];
|
|
97
|
+
const { node, nodeType, resolvedOutputs } = nodeInfo;
|
|
98
|
+
if (!resolvedOutputs || resolvedOutputs.size === 0) {
|
|
99
|
+
return issues;
|
|
100
|
+
}
|
|
101
|
+
if (!(0, node_helpers_1.isSubNode)(nodeType, node)) {
|
|
102
|
+
return issues;
|
|
103
|
+
}
|
|
104
|
+
const aiOutputs = Array.from(resolvedOutputs).filter((output) => output.startsWith('ai_'));
|
|
105
|
+
if (aiOutputs.length === 0) {
|
|
106
|
+
return issues;
|
|
107
|
+
}
|
|
108
|
+
const nodeConnections = workflow.connections?.[node.name];
|
|
109
|
+
for (const outputType of aiOutputs) {
|
|
110
|
+
const connectionsForType = nodeConnections?.[outputType];
|
|
111
|
+
const hasRootConnection = connectionsForType?.some((connectionGroup) => connectionGroup?.some((connection) => connection?.node && nodesByName.has(connection.node)));
|
|
112
|
+
if (!hasRootConnection) {
|
|
113
|
+
issues.push({
|
|
114
|
+
type: 'critical',
|
|
115
|
+
description: `Sub-node ${node.name} (${node.type}) provides ${outputType} but is not connected to a root node.`,
|
|
116
|
+
pointsDeducted: 50,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return issues;
|
|
121
|
+
}
|
|
122
|
+
function validateConnections(workflow, nodeTypes) {
|
|
123
|
+
const violations = [];
|
|
124
|
+
if (!workflow.connections) {
|
|
125
|
+
workflow.connections = {};
|
|
126
|
+
}
|
|
127
|
+
const connectionsByDestination = (0, n8n_workflow_1.mapConnectionsByDestination)(workflow.connections);
|
|
128
|
+
const nodesByName = new Map(workflow.nodes.map((node) => [node.name, node]));
|
|
129
|
+
const nodeTypeMap = new Map(nodeTypes.map((type) => [type.name, type]));
|
|
130
|
+
for (const node of workflow.nodes) {
|
|
131
|
+
const nodeType = nodeTypeMap.get(node.type);
|
|
132
|
+
if (!nodeType) {
|
|
133
|
+
violations.push({
|
|
134
|
+
type: 'critical',
|
|
135
|
+
description: `Node type ${node.type} not found for node ${node.name}`,
|
|
136
|
+
pointsDeducted: 50,
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const nodeInfo = { node, nodeType };
|
|
141
|
+
try {
|
|
142
|
+
nodeInfo.resolvedInputs = (0, resolve_connections_1.resolveNodeInputs)(nodeInfo);
|
|
143
|
+
nodeInfo.resolvedOutputs = (0, resolve_connections_1.resolveNodeOutputs)(nodeInfo);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
violations.push({
|
|
147
|
+
type: 'critical',
|
|
148
|
+
description: `Failed to resolve connections for node ${node.name} (${node.type}): ${error instanceof Error ? error.message : String(error)}`,
|
|
149
|
+
pointsDeducted: 50,
|
|
150
|
+
});
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const nodeConnections = connectionsByDestination[node.name];
|
|
154
|
+
const providedInputTypes = getProvidedInputTypes(nodeConnections);
|
|
155
|
+
violations.push(...checkMissingRequiredInputs(nodeInfo, providedInputTypes));
|
|
156
|
+
violations.push(...checkUnsupportedConnections(nodeInfo, providedInputTypes));
|
|
157
|
+
violations.push(...checkMergeNodeConnections(nodeInfo, nodeConnections));
|
|
158
|
+
violations.push(...checkSubNodeRootConnections(workflow, nodeInfo, nodesByName));
|
|
159
|
+
}
|
|
160
|
+
return violations;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=connections.js.map
|