@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.
Files changed (123) hide show
  1. package/README.md +199 -0
  2. package/dist/actions/activateWorkflow.d.ts +4 -0
  3. package/dist/actions/activateWorkflow.d.ts.map +1 -0
  4. package/dist/actions/activateWorkflow.js +116 -0
  5. package/dist/actions/activateWorkflow.js.map +1 -0
  6. package/dist/actions/createWorkflow.d.ts +4 -0
  7. package/dist/actions/createWorkflow.d.ts.map +1 -0
  8. package/dist/actions/createWorkflow.js +141 -0
  9. package/dist/actions/createWorkflow.js.map +1 -0
  10. package/dist/actions/deactivateWorkflow.d.ts +4 -0
  11. package/dist/actions/deactivateWorkflow.d.ts.map +1 -0
  12. package/dist/actions/deactivateWorkflow.js +121 -0
  13. package/dist/actions/deactivateWorkflow.js.map +1 -0
  14. package/dist/actions/deleteWorkflow.d.ts +4 -0
  15. package/dist/actions/deleteWorkflow.d.ts.map +1 -0
  16. package/dist/actions/deleteWorkflow.js +115 -0
  17. package/dist/actions/deleteWorkflow.js.map +1 -0
  18. package/dist/actions/executeWorkflow.d.ts +4 -0
  19. package/dist/actions/executeWorkflow.d.ts.map +1 -0
  20. package/dist/actions/executeWorkflow.js +74 -0
  21. package/dist/actions/executeWorkflow.js.map +1 -0
  22. package/dist/actions/getExecutions.d.ts +4 -0
  23. package/dist/actions/getExecutions.d.ts.map +1 -0
  24. package/dist/actions/getExecutions.js +108 -0
  25. package/dist/actions/getExecutions.js.map +1 -0
  26. package/dist/actions/index.d.ts +9 -0
  27. package/dist/actions/index.d.ts.map +1 -0
  28. package/dist/actions/index.js +9 -0
  29. package/dist/actions/index.js.map +1 -0
  30. package/dist/actions/listCredentials.d.ts +4 -0
  31. package/dist/actions/listCredentials.d.ts.map +1 -0
  32. package/dist/actions/listCredentials.js +102 -0
  33. package/dist/actions/listCredentials.js.map +1 -0
  34. package/dist/actions/listWorkflows.d.ts +4 -0
  35. package/dist/actions/listWorkflows.d.ts.map +1 -0
  36. package/dist/actions/listWorkflows.js +97 -0
  37. package/dist/actions/listWorkflows.js.map +1 -0
  38. package/dist/data/defaultNodes.json +427888 -0
  39. package/dist/index.d.ts +35 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +75 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/prompts/index.d.ts +3 -0
  44. package/dist/prompts/index.d.ts.map +1 -0
  45. package/dist/prompts/index.js +3 -0
  46. package/dist/prompts/index.js.map +1 -0
  47. package/dist/prompts/keywordExtraction.d.ts +6 -0
  48. package/dist/prompts/keywordExtraction.d.ts.map +1 -0
  49. package/dist/prompts/keywordExtraction.js +19 -0
  50. package/dist/prompts/keywordExtraction.js.map +1 -0
  51. package/dist/prompts/workflowGeneration.d.ts +7 -0
  52. package/dist/prompts/workflowGeneration.d.ts.map +1 -0
  53. package/dist/prompts/workflowGeneration.js +330 -0
  54. package/dist/prompts/workflowGeneration.js.map +1 -0
  55. package/dist/prompts/workflowMatching.d.ts +7 -0
  56. package/dist/prompts/workflowMatching.d.ts.map +1 -0
  57. package/dist/prompts/workflowMatching.js +25 -0
  58. package/dist/prompts/workflowMatching.js.map +1 -0
  59. package/dist/providers/activeWorkflows.d.ts +12 -0
  60. package/dist/providers/activeWorkflows.d.ts.map +1 -0
  61. package/dist/providers/activeWorkflows.js +69 -0
  62. package/dist/providers/activeWorkflows.js.map +1 -0
  63. package/dist/providers/index.d.ts +3 -0
  64. package/dist/providers/index.d.ts.map +1 -0
  65. package/dist/providers/index.js +3 -0
  66. package/dist/providers/index.js.map +1 -0
  67. package/dist/providers/workflowStatus.d.ts +4 -0
  68. package/dist/providers/workflowStatus.d.ts.map +1 -0
  69. package/dist/providers/workflowStatus.js +66 -0
  70. package/dist/providers/workflowStatus.js.map +1 -0
  71. package/dist/schemas/index.d.ts +3 -0
  72. package/dist/schemas/index.d.ts.map +1 -0
  73. package/dist/schemas/index.js +3 -0
  74. package/dist/schemas/index.js.map +1 -0
  75. package/dist/schemas/keywordExtraction.d.ts +14 -0
  76. package/dist/schemas/keywordExtraction.d.ts.map +1 -0
  77. package/dist/schemas/keywordExtraction.js +12 -0
  78. package/dist/schemas/keywordExtraction.js.map +1 -0
  79. package/dist/schemas/workflowMatching.d.ts +36 -0
  80. package/dist/schemas/workflowMatching.d.ts.map +1 -0
  81. package/dist/schemas/workflowMatching.js +30 -0
  82. package/dist/schemas/workflowMatching.js.map +1 -0
  83. package/dist/services/index.d.ts +2 -0
  84. package/dist/services/index.d.ts.map +1 -0
  85. package/dist/services/index.js +2 -0
  86. package/dist/services/index.js.map +1 -0
  87. package/dist/services/n8n-workflow-service.d.ts +83 -0
  88. package/dist/services/n8n-workflow-service.d.ts.map +1 -0
  89. package/dist/services/n8n-workflow-service.js +234 -0
  90. package/dist/services/n8n-workflow-service.js.map +1 -0
  91. package/dist/types/index.d.ts +313 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/index.js +43 -0
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/utils/api.d.ts +137 -0
  96. package/dist/utils/api.d.ts.map +1 -0
  97. package/dist/utils/api.js +247 -0
  98. package/dist/utils/api.js.map +1 -0
  99. package/dist/utils/catalog.d.ts +22 -0
  100. package/dist/utils/catalog.d.ts.map +1 -0
  101. package/dist/utils/catalog.js +81 -0
  102. package/dist/utils/catalog.js.map +1 -0
  103. package/dist/utils/context.d.ts +8 -0
  104. package/dist/utils/context.d.ts.map +1 -0
  105. package/dist/utils/context.js +17 -0
  106. package/dist/utils/context.js.map +1 -0
  107. package/dist/utils/credentialResolver.d.ts +13 -0
  108. package/dist/utils/credentialResolver.d.ts.map +1 -0
  109. package/dist/utils/credentialResolver.js +177 -0
  110. package/dist/utils/credentialResolver.js.map +1 -0
  111. package/dist/utils/generation.d.ts +46 -0
  112. package/dist/utils/generation.d.ts.map +1 -0
  113. package/dist/utils/generation.js +145 -0
  114. package/dist/utils/generation.js.map +1 -0
  115. package/dist/utils/index.d.ts +6 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +11 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/workflow.d.ts +27 -0
  120. package/dist/utils/workflow.d.ts.map +1 -0
  121. package/dist/utils/workflow.js +289 -0
  122. package/dist/utils/workflow.js.map +1 -0
  123. 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
+ }