@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
package/README.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# @elizaos/plugin-n8n-workflow
|
|
2
|
+
|
|
3
|
+
ElizaOS plugin for generating and managing n8n workflows from natural language.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🤖 **Natural Language to Workflow**: Generate complete n8n workflows from conversational prompts
|
|
8
|
+
- 🔄 **RAG Pipeline**: Keyword extraction → Node catalog search → LLM generation → Validation
|
|
9
|
+
- 🔌 **Native n8n Nodes**: Uses official n8n nodes (Gmail, Slack, Stripe, etc.)
|
|
10
|
+
- 🔐 **Dual Mode**: Works standalone (local) or with cloud OAuth plugin
|
|
11
|
+
- 📊 **Full Lifecycle**: Create, list, activate, deactivate, delete, execute workflows
|
|
12
|
+
- 🎯 **Auto-positioning**: Intelligent node layout on canvas
|
|
13
|
+
- ✅ **Validation**: Structural validation + auto-fix of workflow JSON
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
bun add @elizaos/plugin-n8n-workflow
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Configuration
|
|
22
|
+
|
|
23
|
+
### Environment Variables
|
|
24
|
+
|
|
25
|
+
```env
|
|
26
|
+
N8N_API_KEY=your_n8n_api_key # Required
|
|
27
|
+
N8N_HOST=https://your.n8n.cloud # Required
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Character Configuration
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"name": "AI Workflow Builder",
|
|
35
|
+
"plugins": ["@elizaos/plugin-n8n-workflow"],
|
|
36
|
+
"settings": {
|
|
37
|
+
"n8n": {
|
|
38
|
+
"apiKey": "env:N8N_API_KEY",
|
|
39
|
+
"host": "env:N8N_HOST"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Basic Example
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { n8nWorkflowPlugin } from "@elizaos/plugin-n8n-workflow";
|
|
51
|
+
import { AgentRuntime } from "@elizaos/core";
|
|
52
|
+
|
|
53
|
+
const runtime = new AgentRuntime({
|
|
54
|
+
character: myCharacter,
|
|
55
|
+
plugins: [n8nWorkflowPlugin],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// User: "Create a workflow that sends me Stripe payment summaries every Monday via Gmail"
|
|
59
|
+
// Agent generates the workflow and deploys it to n8n Cloud
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Local Mode (Pre-configured Credentials)
|
|
63
|
+
|
|
64
|
+
For users who want to pre-configure n8n credentials:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"settings": {
|
|
69
|
+
"n8n": {
|
|
70
|
+
"credentials": {
|
|
71
|
+
"gmailOAuth2Api": "cred_gmail_123",
|
|
72
|
+
"stripeApi": "cred_stripe_456"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Use the `LIST_N8N_CREDENTIALS` action to view your credential IDs:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
User: "list my n8n credentials"
|
|
83
|
+
Agent: Shows all connected apps with their credential IDs
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Cloud Mode (with OAuth Plugin)
|
|
87
|
+
|
|
88
|
+
When used with `@eliza-cloud/plugin-oauth`, the plugin automatically handles OAuth flows:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"plugins": [
|
|
93
|
+
"@eliza-cloud/plugin-oauth",
|
|
94
|
+
"@elizaos/plugin-n8n-workflow"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Actions
|
|
100
|
+
|
|
101
|
+
| Action | Description | Example |
|
|
102
|
+
|--------|-------------|---------|
|
|
103
|
+
| `CREATE_N8N_WORKFLOW` | Generate and deploy workflow | "Create a workflow that..." |
|
|
104
|
+
| `LIST_N8N_WORKFLOWS` | List all workflows | "Show my workflows" |
|
|
105
|
+
| `GET_N8N_EXECUTIONS` | View execution history | "Show runs for workflow X" |
|
|
106
|
+
| `ACTIVATE_N8N_WORKFLOW` | Activate a workflow | "Enable the Gmail workflow" |
|
|
107
|
+
| `DEACTIVATE_N8N_WORKFLOW` | Deactivate a workflow | "Pause the Stripe workflow" |
|
|
108
|
+
| `DELETE_N8N_WORKFLOW` | Delete a workflow | "Delete workflow X" |
|
|
109
|
+
| `EXECUTE_N8N_WORKFLOW` | Manually trigger workflow | "Run the email workflow" |
|
|
110
|
+
| `LIST_N8N_CREDENTIALS` | List n8n credentials (local mode) | "Show my n8n credentials" |
|
|
111
|
+
|
|
112
|
+
## Architecture
|
|
113
|
+
|
|
114
|
+
### Code Organization
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
src/
|
|
118
|
+
├── utils/
|
|
119
|
+
│ ├── api.ts # n8n API client (REST)
|
|
120
|
+
│ ├── catalog.ts # Node catalog search
|
|
121
|
+
│ ├── generation.ts # LLM keyword extraction + workflow generation
|
|
122
|
+
│ ├── workflow.ts # Validation + auto-positioning
|
|
123
|
+
│ ├── credentialResolver.ts # Credential resolution (3 modes)
|
|
124
|
+
│ └── context.ts # Conversation context builder
|
|
125
|
+
├── services/
|
|
126
|
+
│ └── n8n-workflow-service.ts
|
|
127
|
+
├── actions/ # 8 actions (create, list, activate, etc.)
|
|
128
|
+
├── providers/ # 2 providers (status, active workflows)
|
|
129
|
+
├── schemas/ # JSON schemas for LLM structured output
|
|
130
|
+
├── prompts/ # System prompts
|
|
131
|
+
├── types/ # TypeScript types
|
|
132
|
+
└── data/
|
|
133
|
+
└── defaultNodes.json # 457 n8n node definitions
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### RAG Pipeline
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
User Prompt
|
|
140
|
+
↓
|
|
141
|
+
1. Keyword Extraction (LLM - OBJECT_SMALL)
|
|
142
|
+
↓
|
|
143
|
+
2. Node Catalog Search (Local - 457 nodes)
|
|
144
|
+
↓
|
|
145
|
+
3. Workflow Generation (LLM - TEXT_LARGE)
|
|
146
|
+
↓
|
|
147
|
+
4. Validation + Auto-fix
|
|
148
|
+
↓
|
|
149
|
+
5. Node Positioning (Breadth-first layout)
|
|
150
|
+
↓
|
|
151
|
+
6. Credential Resolution (3 modes)
|
|
152
|
+
↓
|
|
153
|
+
7. Deploy to n8n Cloud (REST API)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Dual Mode Operation
|
|
157
|
+
|
|
158
|
+
**Local Mode:**
|
|
159
|
+
- Works standalone
|
|
160
|
+
- User manually configures credentials OR pre-configures credential IDs
|
|
161
|
+
- Workflow deployed with placeholders or pre-configured IDs
|
|
162
|
+
|
|
163
|
+
**Cloud Mode:**
|
|
164
|
+
- Integrates with `@eliza-cloud/plugin-oauth` (duck typing)
|
|
165
|
+
- Automatic OAuth flow for app connections
|
|
166
|
+
- Seamless credential injection via n8n API
|
|
167
|
+
|
|
168
|
+
## Sources
|
|
169
|
+
|
|
170
|
+
This plugin combines patterns from:
|
|
171
|
+
- **n8n-intelligence**: RAG pipeline, keyword extraction, node catalog, workflow generation
|
|
172
|
+
- **n8n-workflow-builder**: n8n API client, validation, positioning, credential management
|
|
173
|
+
- **ElizaOS v2.0.0**: Plugin architecture, ModelType API, services pattern
|
|
174
|
+
|
|
175
|
+
## Development
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
# Install dependencies
|
|
179
|
+
bun install
|
|
180
|
+
|
|
181
|
+
# Build
|
|
182
|
+
bun run build
|
|
183
|
+
|
|
184
|
+
# Watch mode
|
|
185
|
+
bun run dev
|
|
186
|
+
|
|
187
|
+
# Run tests
|
|
188
|
+
bun test
|
|
189
|
+
|
|
190
|
+
# Lint
|
|
191
|
+
bun run lint
|
|
192
|
+
|
|
193
|
+
# Format
|
|
194
|
+
bun run format
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## License
|
|
198
|
+
|
|
199
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activateWorkflow.d.ts","sourceRoot":"","sources":["../../src/actions/activateWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAQZ,MAAM,eAAe,CAAC;AAsDvB,eAAO,MAAM,sBAAsB,EAAE,MA4FpC,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { logger, } from '@elizaos/core';
|
|
2
|
+
import { N8N_WORKFLOW_SERVICE_TYPE } from '../services/index';
|
|
3
|
+
import { matchWorkflow } from '../utils/generation';
|
|
4
|
+
import { buildConversationContext } from '../utils/context';
|
|
5
|
+
const examples = [
|
|
6
|
+
[
|
|
7
|
+
{
|
|
8
|
+
name: '{{user1}}',
|
|
9
|
+
content: {
|
|
10
|
+
text: 'Enable my payment workflow',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: '{{agent}}',
|
|
15
|
+
content: {
|
|
16
|
+
text: "I'll activate that workflow for you.",
|
|
17
|
+
actions: ['ACTIVATE_N8N_WORKFLOW'],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
name: '{{user1}}',
|
|
24
|
+
content: {
|
|
25
|
+
text: 'Turn on the Gmail automation',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: '{{agent}}',
|
|
30
|
+
content: {
|
|
31
|
+
text: 'Activating Gmail workflow now.',
|
|
32
|
+
actions: ['ACTIVATE_N8N_WORKFLOW'],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
name: '{{user1}}',
|
|
39
|
+
content: {
|
|
40
|
+
text: 'Start the Stripe workflow abc123',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: '{{agent}}',
|
|
45
|
+
content: {
|
|
46
|
+
text: 'Starting workflow abc123.',
|
|
47
|
+
actions: ['ACTIVATE_N8N_WORKFLOW'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
];
|
|
52
|
+
export const activateWorkflowAction = {
|
|
53
|
+
name: 'ACTIVATE_N8N_WORKFLOW',
|
|
54
|
+
similes: ['ACTIVATE_WORKFLOW', 'ENABLE_WORKFLOW', 'START_WORKFLOW', 'TURN_ON_WORKFLOW'],
|
|
55
|
+
description: 'Activate an n8n workflow to start processing triggers and running automatically. Identifies workflows by ID, name, or semantic description in any language.',
|
|
56
|
+
validate: async (runtime) => {
|
|
57
|
+
const service = runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
58
|
+
return !!service;
|
|
59
|
+
},
|
|
60
|
+
handler: async (runtime, message, state, _options, callback) => {
|
|
61
|
+
const service = runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
62
|
+
if (!service) {
|
|
63
|
+
logger.error({ src: 'plugin:n8n-workflow:action:activate' }, 'N8n Workflow service not available');
|
|
64
|
+
if (callback) {
|
|
65
|
+
await callback({
|
|
66
|
+
text: 'N8n Workflow service is not available.',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return { success: false };
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
// Get workflows from state (activeWorkflowsProvider)
|
|
73
|
+
const workflows = state?.data?.workflows || [];
|
|
74
|
+
if (workflows.length === 0) {
|
|
75
|
+
if (callback) {
|
|
76
|
+
await callback({
|
|
77
|
+
text: 'No workflows available to activate.',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return { success: false };
|
|
81
|
+
}
|
|
82
|
+
const context = buildConversationContext(runtime, message, state);
|
|
83
|
+
const matchResult = await matchWorkflow(runtime, context, workflows);
|
|
84
|
+
if (!matchResult.matchedWorkflowId || matchResult.confidence === 'none') {
|
|
85
|
+
const workflowList = matchResult.matches.map((m) => `- ${m.name} (ID: ${m.id})`).join('\n');
|
|
86
|
+
if (callback) {
|
|
87
|
+
await callback({
|
|
88
|
+
text: `Could not identify which workflow to activate. Available workflows:\n${workflowList}`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return { success: false };
|
|
92
|
+
}
|
|
93
|
+
await service.activateWorkflow(matchResult.matchedWorkflowId);
|
|
94
|
+
logger.info({ src: 'plugin:n8n-workflow:action:activate' }, `Activated workflow ${matchResult.matchedWorkflowId}`);
|
|
95
|
+
if (callback) {
|
|
96
|
+
await callback({
|
|
97
|
+
text: '✅ Workflow activated and is now running.',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
return { success: true };
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
104
|
+
logger.error({ src: 'plugin:n8n-workflow:action:activate' }, `Failed to activate workflow: ${errorMessage}`);
|
|
105
|
+
if (callback) {
|
|
106
|
+
await callback({
|
|
107
|
+
text: `Failed to activate workflow: ${errorMessage}`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return { success: false };
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
examples,
|
|
114
|
+
};
|
|
115
|
+
export default activateWorkflowAction;
|
|
116
|
+
//# sourceMappingURL=activateWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activateWorkflow.js","sourceRoot":"","sources":["../../src/actions/activateWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkflow.d.ts","sourceRoot":"","sources":["../../src/actions/createWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EASZ,MAAM,eAAe,CAAC;AAmDvB,eAAO,MAAM,oBAAoB,EAAE,MA6HlC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { logger, } from '@elizaos/core';
|
|
2
|
+
import { N8N_WORKFLOW_SERVICE_TYPE } from '../services/index';
|
|
3
|
+
const examples = [
|
|
4
|
+
[
|
|
5
|
+
{
|
|
6
|
+
name: '{{user1}}',
|
|
7
|
+
content: {
|
|
8
|
+
text: 'Create a workflow that sends me Stripe payment summaries every Monday via Gmail',
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: '{{agent}}',
|
|
13
|
+
content: {
|
|
14
|
+
text: "I'll create an n8n workflow that fetches Stripe payments weekly and emails you a summary via Gmail.",
|
|
15
|
+
actions: ['CREATE_N8N_WORKFLOW'],
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
[
|
|
20
|
+
{
|
|
21
|
+
name: '{{user1}}',
|
|
22
|
+
content: {
|
|
23
|
+
text: 'Build a workflow to notify me on Slack when a new GitHub issue is created',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: '{{agent}}',
|
|
28
|
+
content: {
|
|
29
|
+
text: 'Creating a workflow that monitors GitHub for new issues and sends Slack notifications.',
|
|
30
|
+
actions: ['CREATE_N8N_WORKFLOW'],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
[
|
|
35
|
+
{
|
|
36
|
+
name: '{{user1}}',
|
|
37
|
+
content: {
|
|
38
|
+
text: 'Set up automation to save Gmail attachments to Google Drive',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: '{{agent}}',
|
|
43
|
+
content: {
|
|
44
|
+
text: "I'll build an n8n workflow that watches for Gmail attachments and automatically saves them to Google Drive.",
|
|
45
|
+
actions: ['CREATE_N8N_WORKFLOW'],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
];
|
|
50
|
+
export const createWorkflowAction = {
|
|
51
|
+
name: 'CREATE_N8N_WORKFLOW',
|
|
52
|
+
similes: [
|
|
53
|
+
'CREATE_WORKFLOW',
|
|
54
|
+
'BUILD_WORKFLOW',
|
|
55
|
+
'GENERATE_WORKFLOW',
|
|
56
|
+
'MAKE_AUTOMATION',
|
|
57
|
+
'CREATE_AUTOMATION',
|
|
58
|
+
'BUILD_N8N_WORKFLOW',
|
|
59
|
+
'SETUP_WORKFLOW',
|
|
60
|
+
],
|
|
61
|
+
description: 'Generate and deploy an n8n workflow from a natural language description. ' +
|
|
62
|
+
'The workflow will be created using native n8n nodes (Gmail, Slack, Stripe, etc.) ' +
|
|
63
|
+
'and deployed to n8n Cloud. Use this action when the user wants to automate a task ' +
|
|
64
|
+
'or create an integration between different services.',
|
|
65
|
+
validate: async (runtime) => {
|
|
66
|
+
return !!runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
67
|
+
},
|
|
68
|
+
handler: async (runtime, message, _state, _options, callback) => {
|
|
69
|
+
const service = runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
70
|
+
if (!service) {
|
|
71
|
+
logger.error({ src: 'plugin:n8n-workflow:action:create' }, 'N8n Workflow service not available');
|
|
72
|
+
if (callback) {
|
|
73
|
+
await callback({
|
|
74
|
+
text: 'N8n Workflow service is not available. Please ensure the plugin is properly configured with N8N_API_KEY and N8N_HOST.',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return { success: false };
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const content = message.content;
|
|
81
|
+
const prompt = (content.text ?? '').trim();
|
|
82
|
+
if (!prompt) {
|
|
83
|
+
logger.error({ src: 'plugin:n8n-workflow:action:create' }, 'No prompt provided for workflow creation');
|
|
84
|
+
if (callback) {
|
|
85
|
+
await callback({
|
|
86
|
+
text: 'Please provide a description of the workflow you want to create.',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return { success: false };
|
|
90
|
+
}
|
|
91
|
+
logger.info({ src: 'plugin:n8n-workflow:action:create' }, `Creating workflow from prompt: ${prompt.slice(0, 100)}...`);
|
|
92
|
+
if (callback) {
|
|
93
|
+
await callback({
|
|
94
|
+
text: 'Analyzing your request and searching for relevant n8n nodes...',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Create workflow using the service's RAG pipeline
|
|
98
|
+
const result = await service.createWorkflowFromPrompt(prompt, message.entityId);
|
|
99
|
+
logger.info({ src: 'plugin:n8n-workflow:action:create' }, `Workflow created successfully: ${result.id} (${result.nodeCount} nodes)`);
|
|
100
|
+
// Build response message
|
|
101
|
+
let responseText = `✅ Workflow "${result.name}" created successfully!\n\n`;
|
|
102
|
+
responseText += `**Workflow ID:** ${result.id}\n`;
|
|
103
|
+
responseText += `**Nodes:** ${result.nodeCount}\n`;
|
|
104
|
+
responseText += `**Status:** ${result.active ? 'Active' : 'Inactive'}\n`;
|
|
105
|
+
if (result.missingCredentials.length > 0) {
|
|
106
|
+
responseText += '\n⚠️ **Action Required:**\n';
|
|
107
|
+
responseText += 'Please connect the following services in n8n Cloud:\n';
|
|
108
|
+
for (const credType of result.missingCredentials) {
|
|
109
|
+
responseText += `- ${credType}\n`;
|
|
110
|
+
}
|
|
111
|
+
responseText +=
|
|
112
|
+
'\nThe workflow will be ready to run once these connections are configured.';
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
responseText += '\n✅ All credentials configured - workflow is ready to run!';
|
|
116
|
+
}
|
|
117
|
+
if (callback) {
|
|
118
|
+
await callback({
|
|
119
|
+
text: responseText,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
success: true,
|
|
124
|
+
data: result,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
129
|
+
logger.error({ src: 'plugin:n8n-workflow:action:create' }, `Failed to create workflow: ${errorMessage}`);
|
|
130
|
+
if (callback) {
|
|
131
|
+
await callback({
|
|
132
|
+
text: `Failed to create workflow: ${errorMessage}\n\nPlease try rephrasing your request or being more specific about the integrations you want to use.`,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return { success: false };
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
examples,
|
|
139
|
+
};
|
|
140
|
+
export default createWorkflowAction;
|
|
141
|
+
//# sourceMappingURL=createWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWorkflow.js","sourceRoot":"","sources":["../../src/actions/createWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deactivateWorkflow.d.ts","sourceRoot":"","sources":["../../src/actions/deactivateWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAQZ,MAAM,eAAe,CAAC;AAsDvB,eAAO,MAAM,wBAAwB,EAAE,MAiGtC,CAAC;AAEF,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { logger, } from '@elizaos/core';
|
|
2
|
+
import { N8N_WORKFLOW_SERVICE_TYPE } from '../services/index';
|
|
3
|
+
import { matchWorkflow } from '../utils/generation';
|
|
4
|
+
import { buildConversationContext } from '../utils/context';
|
|
5
|
+
const examples = [
|
|
6
|
+
[
|
|
7
|
+
{
|
|
8
|
+
name: '{{user1}}',
|
|
9
|
+
content: {
|
|
10
|
+
text: 'Pause my Stripe workflow',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: '{{agent}}',
|
|
15
|
+
content: {
|
|
16
|
+
text: "I'll deactivate that workflow for you.",
|
|
17
|
+
actions: ['DEACTIVATE_N8N_WORKFLOW'],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
{
|
|
23
|
+
name: '{{user1}}',
|
|
24
|
+
content: {
|
|
25
|
+
text: 'Stop the email automation',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: '{{agent}}',
|
|
30
|
+
content: {
|
|
31
|
+
text: 'Stopping email workflow.',
|
|
32
|
+
actions: ['DEACTIVATE_N8N_WORKFLOW'],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
{
|
|
38
|
+
name: '{{user1}}',
|
|
39
|
+
content: {
|
|
40
|
+
text: 'Turn off workflow xyz789',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: '{{agent}}',
|
|
45
|
+
content: {
|
|
46
|
+
text: 'Deactivating workflow xyz789.',
|
|
47
|
+
actions: ['DEACTIVATE_N8N_WORKFLOW'],
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
];
|
|
52
|
+
export const deactivateWorkflowAction = {
|
|
53
|
+
name: 'DEACTIVATE_N8N_WORKFLOW',
|
|
54
|
+
similes: [
|
|
55
|
+
'DEACTIVATE_WORKFLOW',
|
|
56
|
+
'DISABLE_WORKFLOW',
|
|
57
|
+
'STOP_WORKFLOW',
|
|
58
|
+
'PAUSE_WORKFLOW',
|
|
59
|
+
'TURN_OFF_WORKFLOW',
|
|
60
|
+
],
|
|
61
|
+
description: 'Deactivate an n8n workflow to stop it from processing triggers and running automatically. Identifies workflows by ID, name, or semantic description in any language.',
|
|
62
|
+
validate: async (runtime) => {
|
|
63
|
+
const service = runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
64
|
+
return !!service;
|
|
65
|
+
},
|
|
66
|
+
handler: async (runtime, message, state, _options, callback) => {
|
|
67
|
+
const service = runtime.getService(N8N_WORKFLOW_SERVICE_TYPE);
|
|
68
|
+
if (!service) {
|
|
69
|
+
logger.error({ src: 'plugin:n8n-workflow:action:deactivate' }, 'N8n Workflow service not available');
|
|
70
|
+
if (callback) {
|
|
71
|
+
await callback({
|
|
72
|
+
text: 'N8n Workflow service is not available.',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { success: false };
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const workflows = state?.data?.workflows || [];
|
|
79
|
+
if (workflows.length === 0) {
|
|
80
|
+
if (callback) {
|
|
81
|
+
await callback({
|
|
82
|
+
text: 'No workflows available to deactivate.',
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return { success: false };
|
|
86
|
+
}
|
|
87
|
+
const context = buildConversationContext(runtime, message, state);
|
|
88
|
+
const matchResult = await matchWorkflow(runtime, context, workflows);
|
|
89
|
+
if (!matchResult.matchedWorkflowId || matchResult.confidence === 'none') {
|
|
90
|
+
const workflowList = matchResult.matches.map((m) => `- ${m.name} (ID: ${m.id})`).join('\n');
|
|
91
|
+
if (callback) {
|
|
92
|
+
await callback({
|
|
93
|
+
text: `Could not identify which workflow to deactivate. Available workflows:\n${workflowList}`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return { success: false };
|
|
97
|
+
}
|
|
98
|
+
await service.deactivateWorkflow(matchResult.matchedWorkflowId);
|
|
99
|
+
logger.info({ src: 'plugin:n8n-workflow:action:deactivate' }, `Deactivated workflow ${matchResult.matchedWorkflowId}`);
|
|
100
|
+
if (callback) {
|
|
101
|
+
await callback({
|
|
102
|
+
text: '⏸️ Workflow deactivated and will no longer run automatically.',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return { success: true };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
109
|
+
logger.error({ src: 'plugin:n8n-workflow:action:deactivate' }, `Failed to deactivate workflow: ${errorMessage}`);
|
|
110
|
+
if (callback) {
|
|
111
|
+
await callback({
|
|
112
|
+
text: `Failed to deactivate workflow: ${errorMessage}`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return { success: false };
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
examples,
|
|
119
|
+
};
|
|
120
|
+
export default deactivateWorkflowAction;
|
|
121
|
+
//# sourceMappingURL=deactivateWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deactivateWorkflow.js","sourceRoot":"","sources":["../../src/actions/deactivateWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteWorkflow.d.ts","sourceRoot":"","sources":["../../src/actions/deleteWorkflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAQZ,MAAM,eAAe,CAAC;AAsDvB,eAAO,MAAM,oBAAoB,EAAE,MA2FlC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|