@elizaos/plugin-n8n-workflow 1.0.1
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/README.md +199 -0
- package/dist/actions/activateWorkflow.d.ts +4 -0
- package/dist/actions/activateWorkflow.d.ts.map +1 -0
- package/dist/actions/activateWorkflow.js +116 -0
- package/dist/actions/activateWorkflow.js.map +1 -0
- package/dist/actions/createWorkflow.d.ts +4 -0
- package/dist/actions/createWorkflow.d.ts.map +1 -0
- package/dist/actions/createWorkflow.js +141 -0
- package/dist/actions/createWorkflow.js.map +1 -0
- package/dist/actions/deactivateWorkflow.d.ts +4 -0
- package/dist/actions/deactivateWorkflow.d.ts.map +1 -0
- package/dist/actions/deactivateWorkflow.js +121 -0
- package/dist/actions/deactivateWorkflow.js.map +1 -0
- package/dist/actions/deleteWorkflow.d.ts +4 -0
- package/dist/actions/deleteWorkflow.d.ts.map +1 -0
- package/dist/actions/deleteWorkflow.js +115 -0
- package/dist/actions/deleteWorkflow.js.map +1 -0
- package/dist/actions/executeWorkflow.d.ts +4 -0
- package/dist/actions/executeWorkflow.d.ts.map +1 -0
- package/dist/actions/executeWorkflow.js +74 -0
- package/dist/actions/executeWorkflow.js.map +1 -0
- package/dist/actions/getExecutions.d.ts +4 -0
- package/dist/actions/getExecutions.d.ts.map +1 -0
- package/dist/actions/getExecutions.js +108 -0
- package/dist/actions/getExecutions.js.map +1 -0
- package/dist/actions/index.d.ts +9 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +9 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/listCredentials.d.ts +4 -0
- package/dist/actions/listCredentials.d.ts.map +1 -0
- package/dist/actions/listCredentials.js +102 -0
- package/dist/actions/listCredentials.js.map +1 -0
- package/dist/actions/listWorkflows.d.ts +4 -0
- package/dist/actions/listWorkflows.d.ts.map +1 -0
- package/dist/actions/listWorkflows.js +97 -0
- package/dist/actions/listWorkflows.js.map +1 -0
- package/dist/data/defaultNodes.json +427888 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +3 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/keywordExtraction.d.ts +6 -0
- package/dist/prompts/keywordExtraction.d.ts.map +1 -0
- package/dist/prompts/keywordExtraction.js +19 -0
- package/dist/prompts/keywordExtraction.js.map +1 -0
- package/dist/prompts/workflowGeneration.d.ts +7 -0
- package/dist/prompts/workflowGeneration.d.ts.map +1 -0
- package/dist/prompts/workflowGeneration.js +330 -0
- package/dist/prompts/workflowGeneration.js.map +1 -0
- package/dist/prompts/workflowMatching.d.ts +7 -0
- package/dist/prompts/workflowMatching.d.ts.map +1 -0
- package/dist/prompts/workflowMatching.js +25 -0
- package/dist/prompts/workflowMatching.js.map +1 -0
- package/dist/providers/activeWorkflows.d.ts +12 -0
- package/dist/providers/activeWorkflows.d.ts.map +1 -0
- package/dist/providers/activeWorkflows.js +69 -0
- package/dist/providers/activeWorkflows.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/workflowStatus.d.ts +4 -0
- package/dist/providers/workflowStatus.d.ts.map +1 -0
- package/dist/providers/workflowStatus.js +66 -0
- package/dist/providers/workflowStatus.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +3 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/keywordExtraction.d.ts +14 -0
- package/dist/schemas/keywordExtraction.d.ts.map +1 -0
- package/dist/schemas/keywordExtraction.js +12 -0
- package/dist/schemas/keywordExtraction.js.map +1 -0
- package/dist/schemas/workflowMatching.d.ts +36 -0
- package/dist/schemas/workflowMatching.d.ts.map +1 -0
- package/dist/schemas/workflowMatching.js +30 -0
- package/dist/schemas/workflowMatching.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/n8n-workflow-service.d.ts +83 -0
- package/dist/services/n8n-workflow-service.d.ts.map +1 -0
- package/dist/services/n8n-workflow-service.js +234 -0
- package/dist/services/n8n-workflow-service.js.map +1 -0
- package/dist/types/index.d.ts +313 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +43 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/api.d.ts +137 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +247 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/catalog.d.ts +22 -0
- package/dist/utils/catalog.d.ts.map +1 -0
- package/dist/utils/catalog.js +81 -0
- package/dist/utils/catalog.js.map +1 -0
- package/dist/utils/context.d.ts +8 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +17 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/credentialResolver.d.ts +13 -0
- package/dist/utils/credentialResolver.d.ts.map +1 -0
- package/dist/utils/credentialResolver.js +177 -0
- package/dist/utils/credentialResolver.js.map +1 -0
- package/dist/utils/generation.d.ts +46 -0
- package/dist/utils/generation.d.ts.map +1 -0
- package/dist/utils/generation.js +145 -0
- package/dist/utils/generation.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/workflow.d.ts +27 -0
- package/dist/utils/workflow.d.ts.map +1 -0
- package/dist/utils/workflow.js +289 -0
- package/dist/utils/workflow.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { ModelType, logger } from '@elizaos/core';
|
|
2
|
+
import { KEYWORD_EXTRACTION_SYSTEM_PROMPT, WORKFLOW_GENERATION_SYSTEM_PROMPT, } from '../prompts/index';
|
|
3
|
+
import { WORKFLOW_MATCHING_SYSTEM_PROMPT } from '../prompts/workflowMatching';
|
|
4
|
+
import { keywordExtractionSchema, workflowMatchingSchema } from '../schemas/index';
|
|
5
|
+
/**
|
|
6
|
+
* Extracts keywords from user prompt using LLM
|
|
7
|
+
* Adapted from n8n-intelligence to use ElizaOS runtime
|
|
8
|
+
*
|
|
9
|
+
* @param runtime - ElizaOS runtime for model access
|
|
10
|
+
* @param userPrompt - User's workflow description
|
|
11
|
+
* @returns Array of 1-5 keywords for node search
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const keywords = await extractKeywords(runtime, "Send Stripe summaries via Gmail");
|
|
16
|
+
* // Returns: ["stripe", "gmail", "send", "email"]
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export async function extractKeywords(runtime, userPrompt) {
|
|
20
|
+
const result = (await runtime.useModel(ModelType.OBJECT_SMALL, {
|
|
21
|
+
prompt: `${KEYWORD_EXTRACTION_SYSTEM_PROMPT}\n\nUser request: ${userPrompt}`,
|
|
22
|
+
schema: keywordExtractionSchema,
|
|
23
|
+
}));
|
|
24
|
+
// Validate structure
|
|
25
|
+
if (!result || !result.keywords || !Array.isArray(result.keywords)) {
|
|
26
|
+
throw new Error('Invalid keyword extraction response: missing or invalid keywords array');
|
|
27
|
+
}
|
|
28
|
+
// Validate all items are strings
|
|
29
|
+
if (!result.keywords.every((kw) => typeof kw === 'string')) {
|
|
30
|
+
throw new Error('Keywords array contains non-string elements');
|
|
31
|
+
}
|
|
32
|
+
// Limit to 5 keywords max, filter empty strings
|
|
33
|
+
return result.keywords
|
|
34
|
+
.slice(0, 5)
|
|
35
|
+
.map((kw) => kw.trim())
|
|
36
|
+
.filter((kw) => kw.length > 0);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Match user request to available workflows using LLM semantic matching with conversation context
|
|
40
|
+
*
|
|
41
|
+
* @param runtime - Agent runtime with LLM access
|
|
42
|
+
* @param userRequest - User's current message (for context-aware matching, include conversation history)
|
|
43
|
+
* @param workflows - List of available workflows
|
|
44
|
+
* @returns Match result with workflow ID and confidence
|
|
45
|
+
*/
|
|
46
|
+
export async function matchWorkflow(runtime, userRequest, workflows) {
|
|
47
|
+
if (workflows.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
matchedWorkflowId: null,
|
|
50
|
+
confidence: 'none',
|
|
51
|
+
matches: [],
|
|
52
|
+
reason: 'No workflows available',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
// Build workflow list for LLM
|
|
57
|
+
const workflowList = workflows
|
|
58
|
+
.map((wf, index) => `${index + 1}. "${wf.name}" (ID: ${wf.id}, Status: ${wf.active ? 'ACTIVE' : 'INACTIVE'})`)
|
|
59
|
+
.join('\n');
|
|
60
|
+
const userPrompt = `${userRequest}
|
|
61
|
+
|
|
62
|
+
Available workflows:
|
|
63
|
+
${workflowList}`;
|
|
64
|
+
const response = await runtime.useModel(ModelType.OBJECT_SMALL, {
|
|
65
|
+
prompt: `${WORKFLOW_MATCHING_SYSTEM_PROMPT}\n\n${userPrompt}`,
|
|
66
|
+
schema: workflowMatchingSchema,
|
|
67
|
+
});
|
|
68
|
+
const result = response;
|
|
69
|
+
logger.debug({ src: 'plugin:n8n-workflow:generation:matcher' }, `Workflow match: ${result.matchedWorkflowId || 'none'} (confidence: ${result.confidence})`);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
74
|
+
logger.error({ src: 'plugin:n8n-workflow:generation:matcher' }, `Workflow matching failed: ${errorMessage}`);
|
|
75
|
+
return {
|
|
76
|
+
matchedWorkflowId: null,
|
|
77
|
+
confidence: 'none',
|
|
78
|
+
matches: [],
|
|
79
|
+
reason: `Workflow matching service unavailable: ${errorMessage}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Generate n8n workflow from natural language using LLM
|
|
85
|
+
* Adapted from n8n-intelligence to use ElizaOS runtime
|
|
86
|
+
*
|
|
87
|
+
* @param runtime - ElizaOS runtime for model access
|
|
88
|
+
* @param userPrompt - User's workflow description
|
|
89
|
+
* @param relevantNodes - Nodes found by keyword search
|
|
90
|
+
* @returns Generated workflow JSON
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const workflow = await generateWorkflow(
|
|
95
|
+
* runtime,
|
|
96
|
+
* "Send me Stripe summaries via Gmail",
|
|
97
|
+
* [gmailNode, stripeNode, scheduleNode]
|
|
98
|
+
* );
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export async function generateWorkflow(runtime, userPrompt, relevantNodes) {
|
|
102
|
+
// Build full prompt with system instructions + relevant nodes + user request
|
|
103
|
+
const fullPrompt = `${WORKFLOW_GENERATION_SYSTEM_PROMPT}
|
|
104
|
+
|
|
105
|
+
## Relevant Nodes Available
|
|
106
|
+
|
|
107
|
+
${JSON.stringify(relevantNodes, null, 2)}
|
|
108
|
+
|
|
109
|
+
Use these node definitions to generate the workflow. Each node's "properties" field defines the available parameters.
|
|
110
|
+
|
|
111
|
+
## User Request
|
|
112
|
+
|
|
113
|
+
${userPrompt}
|
|
114
|
+
|
|
115
|
+
Generate a valid n8n workflow JSON that fulfills this request.`;
|
|
116
|
+
// Use TEXT_LARGE with JSON response format
|
|
117
|
+
const response = await runtime.useModel(ModelType.TEXT_LARGE, {
|
|
118
|
+
prompt: fullPrompt,
|
|
119
|
+
temperature: 0,
|
|
120
|
+
responseFormat: { type: 'json_object' },
|
|
121
|
+
});
|
|
122
|
+
// Parse workflow JSON
|
|
123
|
+
let workflow;
|
|
124
|
+
try {
|
|
125
|
+
// Remove markdown code fences if present
|
|
126
|
+
const cleanedResponse = response
|
|
127
|
+
.replace(/^```json\s*/i, '')
|
|
128
|
+
.replace(/^```\s*/i, '')
|
|
129
|
+
.replace(/```\s*$/, '')
|
|
130
|
+
.trim();
|
|
131
|
+
workflow = JSON.parse(cleanedResponse);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`Failed to parse workflow JSON: ${error instanceof Error ? error.message : String(error)}\n\nRaw response: ${response}`);
|
|
135
|
+
}
|
|
136
|
+
// Basic validation
|
|
137
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
138
|
+
throw new Error('Invalid workflow: missing or invalid nodes array');
|
|
139
|
+
}
|
|
140
|
+
if (!workflow.connections || typeof workflow.connections !== 'object') {
|
|
141
|
+
throw new Error('Invalid workflow: missing or invalid connections object');
|
|
142
|
+
}
|
|
143
|
+
return workflow;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/utils/generation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { N8nApiClient } from './api';
|
|
2
|
+
export { searchNodes } from './catalog';
|
|
3
|
+
export { resolveCredentials } from './credentialResolver';
|
|
4
|
+
export { extractKeywords, matchWorkflow, generateWorkflow } from './generation';
|
|
5
|
+
export { validateWorkflow, validateWorkflowOrThrow, positionNodes } from './workflow';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// API client
|
|
2
|
+
export { N8nApiClient } from './api';
|
|
3
|
+
// Node catalog search
|
|
4
|
+
export { searchNodes } from './catalog';
|
|
5
|
+
// Credential resolution
|
|
6
|
+
export { resolveCredentials } from './credentialResolver';
|
|
7
|
+
// Workflow generation pipeline
|
|
8
|
+
export { extractKeywords, matchWorkflow, generateWorkflow } from './generation';
|
|
9
|
+
// Workflow validation & positioning
|
|
10
|
+
export { validateWorkflow, validateWorkflowOrThrow, positionNodes } from './workflow';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAwB;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhF,oCAAoC;AACpC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { N8nWorkflow, WorkflowValidationResult } from '../types/index';
|
|
2
|
+
/**
|
|
3
|
+
* Validate workflow structure and auto-fix common issues
|
|
4
|
+
*
|
|
5
|
+
* @param workflow - Generated workflow to validate
|
|
6
|
+
* @returns Validation result with errors, warnings, and optionally fixed workflow
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateWorkflow(workflow: N8nWorkflow): WorkflowValidationResult;
|
|
9
|
+
/**
|
|
10
|
+
* Validate and throw if workflow is invalid
|
|
11
|
+
* Convenience function for when you want to fail fast
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateWorkflowOrThrow(workflow: N8nWorkflow): N8nWorkflow;
|
|
14
|
+
/**
|
|
15
|
+
* Auto-position nodes on workflow canvas
|
|
16
|
+
* Adapted from n8n-workflow-builder positioning logic
|
|
17
|
+
*
|
|
18
|
+
* Creates a left-to-right flow layout:
|
|
19
|
+
* - Start at [250, 300]
|
|
20
|
+
* - Advance X by 250px per node
|
|
21
|
+
* - Branch nodes offset Y by 200px
|
|
22
|
+
*
|
|
23
|
+
* @param workflow - Workflow with potentially missing node positions
|
|
24
|
+
* @returns Workflow with all nodes positioned
|
|
25
|
+
*/
|
|
26
|
+
export declare function positionNodes(workflow: N8nWorkflow): N8nWorkflow;
|
|
27
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,wBAAwB,EAA2B,MAAM,gBAAgB,CAAC;AAEhG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,wBAAwB,CAkJhF;AA8BD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,CAY1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,CA2BhE"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { WorkflowValidationError } from '../types/index';
|
|
2
|
+
/**
|
|
3
|
+
* Validate workflow structure and auto-fix common issues
|
|
4
|
+
*
|
|
5
|
+
* @param workflow - Generated workflow to validate
|
|
6
|
+
* @returns Validation result with errors, warnings, and optionally fixed workflow
|
|
7
|
+
*/
|
|
8
|
+
export function validateWorkflow(workflow) {
|
|
9
|
+
const errors = [];
|
|
10
|
+
const warnings = [];
|
|
11
|
+
let needsFix = false;
|
|
12
|
+
// 1. Check nodes array exists and is non-empty
|
|
13
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
14
|
+
errors.push('Missing or invalid nodes array');
|
|
15
|
+
return { valid: false, errors, warnings };
|
|
16
|
+
}
|
|
17
|
+
if (workflow.nodes.length === 0) {
|
|
18
|
+
errors.push('Workflow must have at least one node');
|
|
19
|
+
return { valid: false, errors, warnings };
|
|
20
|
+
}
|
|
21
|
+
// 2. Check connections structure
|
|
22
|
+
if (!workflow.connections || typeof workflow.connections !== 'object') {
|
|
23
|
+
errors.push('Missing or invalid connections object');
|
|
24
|
+
return { valid: false, errors, warnings };
|
|
25
|
+
}
|
|
26
|
+
// 3. Validate each node
|
|
27
|
+
const nodeNames = new Set();
|
|
28
|
+
const nodeMap = new Map();
|
|
29
|
+
for (const node of workflow.nodes) {
|
|
30
|
+
// Check required fields
|
|
31
|
+
if (!node.name || typeof node.name !== 'string') {
|
|
32
|
+
errors.push('Node missing name');
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!node.type || typeof node.type !== 'string') {
|
|
36
|
+
errors.push(`Node "${node.name}" missing type`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Check for duplicate names
|
|
40
|
+
if (nodeNames.has(node.name)) {
|
|
41
|
+
errors.push(`Duplicate node name: "${node.name}"`);
|
|
42
|
+
}
|
|
43
|
+
nodeNames.add(node.name);
|
|
44
|
+
nodeMap.set(node.name, node);
|
|
45
|
+
// Check position
|
|
46
|
+
if (!node.position || !Array.isArray(node.position) || node.position.length !== 2) {
|
|
47
|
+
warnings.push(`Node "${node.name}" has invalid position, will auto-fix`);
|
|
48
|
+
needsFix = true;
|
|
49
|
+
}
|
|
50
|
+
// Check parameters
|
|
51
|
+
if (!node.parameters || typeof node.parameters !== 'object') {
|
|
52
|
+
warnings.push(`Node "${node.name}" missing parameters object`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 4. Validate connections reference existing nodes
|
|
56
|
+
for (const [sourceName, outputs] of Object.entries(workflow.connections)) {
|
|
57
|
+
if (!nodeNames.has(sourceName)) {
|
|
58
|
+
errors.push(`Connection references non-existent source node: "${sourceName}"`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
for (const [_outputType, connections] of Object.entries(outputs)) {
|
|
62
|
+
if (!Array.isArray(connections)) {
|
|
63
|
+
errors.push(`Invalid connection structure for node "${sourceName}"`);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
for (const connectionGroup of connections) {
|
|
67
|
+
if (!Array.isArray(connectionGroup)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
for (const connection of connectionGroup) {
|
|
71
|
+
if (!connection.node || typeof connection.node !== 'string') {
|
|
72
|
+
errors.push(`Invalid connection from "${sourceName}"`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!nodeNames.has(connection.node)) {
|
|
76
|
+
errors.push(`Connection references non-existent target node: "${connection.node}" (from "${sourceName}")`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// 5. Check for at least one trigger node
|
|
83
|
+
const hasTrigger = workflow.nodes.some((node) => node.type.toLowerCase().includes('trigger') ||
|
|
84
|
+
node.type.toLowerCase().includes('webhook') ||
|
|
85
|
+
node.name.toLowerCase().includes('start'));
|
|
86
|
+
if (!hasTrigger) {
|
|
87
|
+
warnings.push('Workflow has no trigger node - it can only be executed manually');
|
|
88
|
+
}
|
|
89
|
+
// 6. Check for orphan nodes (nodes with no incoming connections, except triggers)
|
|
90
|
+
const nodesWithIncoming = new Set();
|
|
91
|
+
for (const outputs of Object.values(workflow.connections)) {
|
|
92
|
+
for (const connectionGroup of Object.values(outputs)) {
|
|
93
|
+
for (const connections of connectionGroup) {
|
|
94
|
+
for (const conn of connections) {
|
|
95
|
+
nodesWithIncoming.add(conn.node);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const node of workflow.nodes) {
|
|
101
|
+
const isTrigger = node.type.toLowerCase().includes('trigger') ||
|
|
102
|
+
node.type.toLowerCase().includes('webhook') ||
|
|
103
|
+
node.name.toLowerCase().includes('start');
|
|
104
|
+
if (!isTrigger && !nodesWithIncoming.has(node.name)) {
|
|
105
|
+
warnings.push(`Node "${node.name}" has no incoming connections - it will never execute`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 7. Auto-fix if needed
|
|
109
|
+
let fixedWorkflow;
|
|
110
|
+
if (needsFix && errors.length === 0) {
|
|
111
|
+
fixedWorkflow = autoFixWorkflow(workflow);
|
|
112
|
+
}
|
|
113
|
+
// Return result
|
|
114
|
+
const valid = errors.length === 0;
|
|
115
|
+
if (!valid && errors.length > 0) {
|
|
116
|
+
// Validation failed with errors
|
|
117
|
+
return { valid: false, errors, warnings };
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
valid: true,
|
|
121
|
+
errors: [],
|
|
122
|
+
warnings,
|
|
123
|
+
fixedWorkflow,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Auto-fix common workflow issues
|
|
128
|
+
* - Add missing node positions
|
|
129
|
+
* - Fix duplicate node names
|
|
130
|
+
*/
|
|
131
|
+
function autoFixWorkflow(workflow) {
|
|
132
|
+
const fixed = { ...workflow };
|
|
133
|
+
fixed.nodes = [...workflow.nodes];
|
|
134
|
+
let x = 250;
|
|
135
|
+
const y = 300;
|
|
136
|
+
const xSpacing = 250;
|
|
137
|
+
for (let i = 0; i < fixed.nodes.length; i++) {
|
|
138
|
+
const node = { ...fixed.nodes[i] };
|
|
139
|
+
// Fix missing or invalid position
|
|
140
|
+
if (!node.position || !Array.isArray(node.position) || node.position.length !== 2) {
|
|
141
|
+
node.position = [x, y];
|
|
142
|
+
x += xSpacing;
|
|
143
|
+
}
|
|
144
|
+
fixed.nodes[i] = node;
|
|
145
|
+
}
|
|
146
|
+
return fixed;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Validate and throw if workflow is invalid
|
|
150
|
+
* Convenience function for when you want to fail fast
|
|
151
|
+
*/
|
|
152
|
+
export function validateWorkflowOrThrow(workflow) {
|
|
153
|
+
const result = validateWorkflow(workflow);
|
|
154
|
+
if (!result.valid) {
|
|
155
|
+
throw new WorkflowValidationError(`Workflow validation failed: ${result.errors.join(', ')}`, result.errors);
|
|
156
|
+
}
|
|
157
|
+
// Return fixed workflow if available, otherwise original
|
|
158
|
+
return result.fixedWorkflow || workflow;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Auto-position nodes on workflow canvas
|
|
162
|
+
* Adapted from n8n-workflow-builder positioning logic
|
|
163
|
+
*
|
|
164
|
+
* Creates a left-to-right flow layout:
|
|
165
|
+
* - Start at [250, 300]
|
|
166
|
+
* - Advance X by 250px per node
|
|
167
|
+
* - Branch nodes offset Y by 200px
|
|
168
|
+
*
|
|
169
|
+
* @param workflow - Workflow with potentially missing node positions
|
|
170
|
+
* @returns Workflow with all nodes positioned
|
|
171
|
+
*/
|
|
172
|
+
export function positionNodes(workflow) {
|
|
173
|
+
// Clone workflow
|
|
174
|
+
const positioned = { ...workflow };
|
|
175
|
+
positioned.nodes = [...workflow.nodes];
|
|
176
|
+
// Check if all nodes already have valid positions
|
|
177
|
+
const allHavePositions = positioned.nodes.every((node) => node.position &&
|
|
178
|
+
Array.isArray(node.position) &&
|
|
179
|
+
node.position.length === 2 &&
|
|
180
|
+
typeof node.position[0] === 'number' &&
|
|
181
|
+
typeof node.position[1] === 'number');
|
|
182
|
+
if (allHavePositions) {
|
|
183
|
+
return positioned; // No changes needed
|
|
184
|
+
}
|
|
185
|
+
// Build node graph to understand flow structure
|
|
186
|
+
const nodeGraph = buildNodeGraph(positioned);
|
|
187
|
+
// Position nodes level by level (breadth-first from triggers)
|
|
188
|
+
const positionedNodes = positionByLevels(positioned.nodes, nodeGraph);
|
|
189
|
+
positioned.nodes = positionedNodes;
|
|
190
|
+
return positioned;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Build adjacency graph from connections
|
|
194
|
+
*/
|
|
195
|
+
function buildNodeGraph(workflow) {
|
|
196
|
+
const graph = new Map();
|
|
197
|
+
// Initialize all nodes
|
|
198
|
+
for (const node of workflow.nodes) {
|
|
199
|
+
graph.set(node.name, []);
|
|
200
|
+
}
|
|
201
|
+
// Build edges from connections
|
|
202
|
+
for (const [sourceName, outputs] of Object.entries(workflow.connections)) {
|
|
203
|
+
const targets = [];
|
|
204
|
+
for (const connectionGroups of Object.values(outputs)) {
|
|
205
|
+
for (const connections of connectionGroups) {
|
|
206
|
+
for (const conn of connections) {
|
|
207
|
+
if (conn.node) {
|
|
208
|
+
targets.push(conn.node);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
graph.set(sourceName, targets);
|
|
214
|
+
}
|
|
215
|
+
return graph;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Position nodes by levels (breadth-first layout)
|
|
219
|
+
*/
|
|
220
|
+
function positionByLevels(nodes, graph) {
|
|
221
|
+
// Find trigger/start nodes (nodes with no incoming connections)
|
|
222
|
+
const incomingCount = new Map();
|
|
223
|
+
for (const node of nodes) {
|
|
224
|
+
incomingCount.set(node.name, 0);
|
|
225
|
+
}
|
|
226
|
+
for (const targets of graph.values()) {
|
|
227
|
+
for (const target of targets) {
|
|
228
|
+
incomingCount.set(target, (incomingCount.get(target) || 0) + 1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const triggerNodes = nodes.filter((node) => incomingCount.get(node.name) === 0);
|
|
232
|
+
// Organize into levels
|
|
233
|
+
const levels = [];
|
|
234
|
+
const visited = new Set();
|
|
235
|
+
const queue = [];
|
|
236
|
+
// Start with triggers at level 0
|
|
237
|
+
for (const trigger of triggerNodes) {
|
|
238
|
+
queue.push({ name: trigger.name, level: 0 });
|
|
239
|
+
}
|
|
240
|
+
while (queue.length > 0) {
|
|
241
|
+
const { name, level } = queue.shift();
|
|
242
|
+
if (visited.has(name)) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
visited.add(name);
|
|
246
|
+
// Add to level
|
|
247
|
+
if (!levels[level]) {
|
|
248
|
+
levels[level] = [];
|
|
249
|
+
}
|
|
250
|
+
levels[level].push(name);
|
|
251
|
+
// Add children to next level
|
|
252
|
+
const children = graph.get(name) || [];
|
|
253
|
+
for (const child of children) {
|
|
254
|
+
if (!visited.has(child)) {
|
|
255
|
+
queue.push({ name: child, level: level + 1 });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Position nodes based on levels
|
|
260
|
+
const positioned = [...nodes];
|
|
261
|
+
const nodeMap = new Map(nodes.map((node) => [node.name, node]));
|
|
262
|
+
const startX = 250;
|
|
263
|
+
const startY = 300;
|
|
264
|
+
const xSpacing = 250;
|
|
265
|
+
const ySpacing = 100;
|
|
266
|
+
for (let levelIndex = 0; levelIndex < levels.length; levelIndex++) {
|
|
267
|
+
const levelNodes = levels[levelIndex];
|
|
268
|
+
const x = startX + levelIndex * xSpacing;
|
|
269
|
+
// Center nodes vertically if multiple in same level
|
|
270
|
+
const totalHeight = levelNodes.length * ySpacing;
|
|
271
|
+
const startYForLevel = startY - totalHeight / 2;
|
|
272
|
+
for (let i = 0; i < levelNodes.length; i++) {
|
|
273
|
+
const nodeName = levelNodes[i];
|
|
274
|
+
const node = nodeMap.get(nodeName);
|
|
275
|
+
if (node) {
|
|
276
|
+
const y = startYForLevel + i * ySpacing;
|
|
277
|
+
const nodeIndex = positioned.findIndex((n) => n.name === nodeName);
|
|
278
|
+
if (nodeIndex !== -1) {
|
|
279
|
+
positioned[nodeIndex] = {
|
|
280
|
+
...positioned[nodeIndex],
|
|
281
|
+
position: [x, y],
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return positioned;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/utils/workflow.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elizaos/plugin-n8n-workflow",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "ElizaOS plugin for generating and managing n8n workflows from natural language",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"test": "bun test",
|
|
15
|
+
"test:unit": "bun test __tests__/unit/",
|
|
16
|
+
"test:integration": "bun test __tests__/integration/",
|
|
17
|
+
"test:e2e": "bun test __tests__/e2e/",
|
|
18
|
+
"lint": "eslint src/**/*.ts",
|
|
19
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.ts\""
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"elizaos",
|
|
24
|
+
"plugin",
|
|
25
|
+
"n8n",
|
|
26
|
+
"workflow",
|
|
27
|
+
"automation",
|
|
28
|
+
"ai",
|
|
29
|
+
"natural-language"
|
|
30
|
+
],
|
|
31
|
+
"author": "Eliza Cloud Team",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/elizaos-plugins/plugin-n8n-workflow.git"
|
|
36
|
+
},
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/elizaos-plugins/plugin-n8n-workflow/issues"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/elizaos-plugins/plugin-n8n-workflow#readme",
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@elizaos/core": "1.7.2"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@elizaos/config": "^1.7.2",
|
|
46
|
+
"@eslint/js": "^9",
|
|
47
|
+
"@types/bun": "^1.3.7",
|
|
48
|
+
"@types/node": "^25.1.0",
|
|
49
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
50
|
+
"@typescript-eslint/parser": "^8",
|
|
51
|
+
"bun-types": "^1.3.8",
|
|
52
|
+
"eslint": "^9",
|
|
53
|
+
"prettier": "^3.8.1",
|
|
54
|
+
"typescript": "^5.9.3"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=20.0.0"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@n8n/rest-api-client": "^2.6.0"
|
|
64
|
+
}
|
|
65
|
+
}
|