n8n-management-mcp 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Node2Flow
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,179 @@
1
+ # n8n Management MCP Server
2
+
3
+ MCP (Model Context Protocol) server สำหรับเชื่อมต่อ AI assistant กับ n8n instance ของคุณ จัดการ workflows, executions, credentials, tags, variables และ users ผ่าน 31 tools
4
+
5
+ ใช้ได้กับ Claude Desktop, Cursor, VS Code และ MCP client อื่นๆ
6
+
7
+ ---
8
+
9
+ ## เริ่มต้นใช้งาน
10
+
11
+ ### Claude Desktop
12
+
13
+ เพิ่มใน `claude_desktop_config.json`:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "n8n": {
19
+ "command": "npx",
20
+ "args": ["-y", "@node2flow/n8n-management-mcp"],
21
+ "env": {
22
+ "N8N_URL": "https://your-n8n-instance.com",
23
+ "N8N_API_KEY": "your-n8n-api-key"
24
+ }
25
+ }
26
+ }
27
+ }
28
+ ```
29
+
30
+ ### Cursor / VS Code
31
+
32
+ เพิ่มใน MCP settings:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "n8n": {
38
+ "command": "npx",
39
+ "args": ["-y", "@node2flow/n8n-management-mcp"],
40
+ "env": {
41
+ "N8N_URL": "https://your-n8n-instance.com",
42
+ "N8N_API_KEY": "your-n8n-api-key"
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ```
48
+
49
+ ### HTTP Mode (Streamable HTTP)
50
+
51
+ สำหรับ deploy แบบ remote หรือใช้ร่วมกันหลายคน:
52
+
53
+ ```bash
54
+ N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp --http
55
+ ```
56
+
57
+ Server จะเริ่มที่ port 3000 (เปลี่ยนได้ผ่าน `PORT` env var) MCP endpoint: `http://localhost:3000/mcp`
58
+
59
+ ---
60
+
61
+ ## การตั้งค่า
62
+
63
+ | Environment Variable | จำเป็น | คำอธิบาย |
64
+ |---|---|---|
65
+ | `N8N_URL` | ใช่ | URL ของ n8n instance (เช่น `https://n8n.example.com`) |
66
+ | `N8N_API_KEY` | ใช่ | n8n API key ([วิธีสร้าง](https://docs.n8n.io/api/authentication/)) |
67
+ | `PORT` | ไม่ | Port สำหรับ HTTP server (ค่าเริ่มต้น: `3000`, ใช้กับ `--http` เท่านั้น) |
68
+
69
+ ---
70
+
71
+ ## Tools ทั้งหมด (31 tools)
72
+
73
+ ### จัดการ Workflow (10 tools)
74
+
75
+ | Tool | คำอธิบาย |
76
+ |---|---|
77
+ | `n8n_list_workflows` | แสดง workflow ทั้งหมดพร้อมสถานะและ tags |
78
+ | `n8n_get_workflow` | ดูรายละเอียด workflow (nodes, connections) |
79
+ | `n8n_create_workflow` | สร้าง workflow ใหม่ |
80
+ | `n8n_update_workflow` | แก้ไขโครงสร้าง workflow |
81
+ | `n8n_delete_workflow` | ลบ workflow ถาวร |
82
+ | `n8n_activate_workflow` | เปิด triggers ของ workflow |
83
+ | `n8n_deactivate_workflow` | ปิด triggers ของ workflow |
84
+ | `n8n_execute_workflow` | รัน workflow ด้วยข้อมูล input |
85
+ | `n8n_get_workflow_tags` | ดู tags ที่กำหนดให้ workflow |
86
+ | `n8n_update_workflow_tags` | เปลี่ยน tags ของ workflow |
87
+
88
+ ### ประวัติการรัน (4 tools)
89
+
90
+ | Tool | คำอธิบาย |
91
+ |---|---|
92
+ | `n8n_list_executions` | ดูประวัติการรัน (กรองตาม workflow ได้) |
93
+ | `n8n_get_execution` | ดูรายละเอียดการรัน พร้อม output ของแต่ละ node |
94
+ | `n8n_delete_execution` | ลบประวัติการรัน |
95
+ | `n8n_retry_execution` | รัน execution ที่ล้มเหลวอีกครั้ง |
96
+
97
+ ### Credentials (4 tools)
98
+
99
+ | Tool | คำอธิบาย |
100
+ |---|---|
101
+ | `n8n_create_credential` | เก็บ API credentials |
102
+ | `n8n_update_credential` | อัพเดทข้อมูล credential |
103
+ | `n8n_delete_credential` | ลบ credential |
104
+ | `n8n_get_credential_schema` | ดู fields ที่จำเป็นสำหรับ credential แต่ละประเภท |
105
+
106
+ ### Tags (5 tools)
107
+
108
+ | Tool | คำอธิบาย |
109
+ |---|---|
110
+ | `n8n_list_tags` | แสดง tags ทั้งหมด |
111
+ | `n8n_get_tag` | ดูรายละเอียด tag |
112
+ | `n8n_create_tag` | สร้าง tag ใหม่ |
113
+ | `n8n_update_tag` | เปลี่ยนชื่อ tag |
114
+ | `n8n_delete_tag` | ลบ tag |
115
+
116
+ ### Variables (4 tools)
117
+
118
+ | Tool | คำอธิบาย |
119
+ |---|---|
120
+ | `n8n_list_variables` | แสดง environment variables ทั้งหมด |
121
+ | `n8n_create_variable` | สร้าง global variable |
122
+ | `n8n_update_variable` | แก้ไขค่า variable |
123
+ | `n8n_delete_variable` | ลบ variable |
124
+
125
+ ### จัดการ Users (4 tools)
126
+
127
+ | Tool | คำอธิบาย |
128
+ |---|---|
129
+ | `n8n_list_users` | แสดงผู้ใช้ทั้งหมด (เฉพาะ owner) |
130
+ | `n8n_get_user` | ดูรายละเอียดผู้ใช้ |
131
+ | `n8n_delete_user` | ลบผู้ใช้ |
132
+ | `n8n_update_user_role` | เปลี่ยน role ผู้ใช้ |
133
+
134
+ ---
135
+
136
+ ## ความต้องการ
137
+
138
+ - **Node.js** 18 ขึ้นไป
139
+ - **n8n instance** ที่เปิด API
140
+ - **n8n API key**
141
+
142
+ ### วิธีสร้าง n8n API Key
143
+
144
+ 1. ไปที่ Settings ของ n8n instance
145
+ 2. เลือก API > API Keys
146
+ 3. กด Create API key
147
+ 4. คัดลอก key มาใช้เป็น `N8N_API_KEY`
148
+
149
+ ---
150
+
151
+ ## สำหรับนักพัฒนา
152
+
153
+ ```bash
154
+ git clone https://github.com/node2flow-th/n8n-management-mcp-community.git
155
+ cd n8n-management-mcp-community
156
+ npm install
157
+ npm run build
158
+
159
+ # รันแบบ stdio
160
+ N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npm start
161
+
162
+ # รันแบบ dev (hot reload)
163
+ N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npm run dev
164
+
165
+ # รันแบบ HTTP
166
+ N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npm start -- --http
167
+ ```
168
+
169
+ ---
170
+
171
+ ## License
172
+
173
+ MIT - ดู [LICENSE](LICENSE)
174
+
175
+ ## Links
176
+
177
+ - [n8n Documentation](https://docs.n8n.io/)
178
+ - [MCP Protocol](https://modelcontextprotocol.io/)
179
+ - [Node2Flow](https://node2flow.net)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * n8n Management MCP Server
4
+ *
5
+ * Community edition — connects directly to your n8n instance.
6
+ *
7
+ * Usage (stdio - for Claude Desktop / Cursor / VS Code):
8
+ * N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp
9
+ *
10
+ * Usage (HTTP - Streamable HTTP transport):
11
+ * N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp --http
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
package/dist/index.js ADDED
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * n8n Management MCP Server
4
+ *
5
+ * Community edition — connects directly to your n8n instance.
6
+ *
7
+ * Usage (stdio - for Claude Desktop / Cursor / VS Code):
8
+ * N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp
9
+ *
10
+ * Usage (HTTP - Streamable HTTP transport):
11
+ * N8N_URL=https://your-n8n.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp --http
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
+ import { StreamableHTTPServerTransport, } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
17
+ import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
18
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
19
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
20
+ import { N8nClient } from './n8n-client.js';
21
+ import { TOOLS } from './tools.js';
22
+ /**
23
+ * Read config from environment variables
24
+ */
25
+ function getConfig() {
26
+ const apiUrl = process.env.N8N_URL;
27
+ const apiKey = process.env.N8N_API_KEY;
28
+ if (!apiUrl || !apiKey) {
29
+ console.error('Error: Missing required environment variables');
30
+ console.error('');
31
+ console.error('Required:');
32
+ console.error(' N8N_URL Your n8n instance URL (e.g., https://n8n.example.com)');
33
+ console.error(' N8N_API_KEY Your n8n API key');
34
+ console.error('');
35
+ console.error('Usage (stdio):');
36
+ console.error(' N8N_URL=https://n8n.example.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp');
37
+ console.error('');
38
+ console.error('Usage (HTTP):');
39
+ console.error(' N8N_URL=https://n8n.example.com N8N_API_KEY=your_key npx @node2flow/n8n-management-mcp --http');
40
+ process.exit(1);
41
+ }
42
+ return { apiUrl, apiKey };
43
+ }
44
+ /**
45
+ * Handle MCP tool calls by routing to N8nClient methods
46
+ */
47
+ async function handleToolCall(toolName, args, client) {
48
+ switch (toolName) {
49
+ // Workflow operations
50
+ case 'n8n_list_workflows':
51
+ return client.listWorkflows();
52
+ case 'n8n_get_workflow':
53
+ return client.getWorkflow(args.id);
54
+ case 'n8n_create_workflow':
55
+ return client.createWorkflow(args);
56
+ case 'n8n_update_workflow':
57
+ return client.updateWorkflow(args.id, args);
58
+ case 'n8n_delete_workflow':
59
+ return client.deleteWorkflow(args.id);
60
+ case 'n8n_activate_workflow':
61
+ return client.activateWorkflow(args.id);
62
+ case 'n8n_deactivate_workflow':
63
+ return client.deactivateWorkflow(args.id);
64
+ case 'n8n_execute_workflow':
65
+ return client.executeWorkflow(args.id, args.data);
66
+ case 'n8n_get_workflow_tags':
67
+ return client.getWorkflowTags(args.id);
68
+ case 'n8n_update_workflow_tags':
69
+ return client.updateWorkflowTags(args.id, args.tags);
70
+ // Execution operations
71
+ case 'n8n_list_executions':
72
+ return client.listExecutions(args.workflowId);
73
+ case 'n8n_get_execution':
74
+ return client.getExecution(args.id);
75
+ case 'n8n_delete_execution':
76
+ return client.deleteExecution(args.id);
77
+ case 'n8n_retry_execution':
78
+ return client.retryExecution(args.id);
79
+ // Credential operations
80
+ case 'n8n_create_credential':
81
+ return client.createCredential(args);
82
+ case 'n8n_update_credential':
83
+ return client.updateCredential(args.id, args);
84
+ case 'n8n_delete_credential':
85
+ return client.deleteCredential(args.id);
86
+ case 'n8n_get_credential_schema':
87
+ return client.getCredentialSchema(args.credentialType);
88
+ // Tag operations
89
+ case 'n8n_list_tags':
90
+ return client.listTags();
91
+ case 'n8n_get_tag':
92
+ return client.getTag(args.id);
93
+ case 'n8n_create_tag':
94
+ return client.createTag(args.name);
95
+ case 'n8n_update_tag':
96
+ return client.updateTag(args.id, args.name);
97
+ case 'n8n_delete_tag':
98
+ return client.deleteTag(args.id);
99
+ // Variable operations
100
+ case 'n8n_list_variables':
101
+ return client.listVariables();
102
+ case 'n8n_create_variable':
103
+ return client.createVariable(args.key, args.value);
104
+ case 'n8n_update_variable':
105
+ return client.updateVariable(args.id, args.key, args.value);
106
+ case 'n8n_delete_variable':
107
+ return client.deleteVariable(args.id);
108
+ // User operations
109
+ case 'n8n_list_users':
110
+ return client.listUsers();
111
+ case 'n8n_get_user':
112
+ return client.getUser(args.identifier);
113
+ case 'n8n_delete_user':
114
+ return client.deleteUser(args.id);
115
+ case 'n8n_update_user_role':
116
+ return client.updateUserRole(args.id, args.role);
117
+ default:
118
+ throw new Error(`Unknown tool: ${toolName}`);
119
+ }
120
+ }
121
+ /**
122
+ * Create a configured MCP Server instance
123
+ */
124
+ function createServer(client) {
125
+ const server = new Server({
126
+ name: 'n8n-management-mcp',
127
+ version: '1.0.0',
128
+ }, {
129
+ capabilities: {
130
+ tools: {},
131
+ },
132
+ });
133
+ // List available tools
134
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
135
+ return { tools: TOOLS };
136
+ });
137
+ // Handle tool calls
138
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
139
+ const { name, arguments: args } = request.params;
140
+ try {
141
+ const result = await handleToolCall(name, args || {}, client);
142
+ return {
143
+ content: [
144
+ {
145
+ type: 'text',
146
+ text: JSON.stringify(result, null, 2),
147
+ },
148
+ ],
149
+ };
150
+ }
151
+ catch (error) {
152
+ return {
153
+ content: [
154
+ {
155
+ type: 'text',
156
+ text: `Error: ${error.message}`,
157
+ },
158
+ ],
159
+ isError: true,
160
+ };
161
+ }
162
+ });
163
+ return server;
164
+ }
165
+ /**
166
+ * Start in stdio mode (for Claude Desktop, Cursor, VS Code)
167
+ */
168
+ async function startStdio(client) {
169
+ const server = createServer(client);
170
+ const transport = new StdioServerTransport();
171
+ await server.connect(transport);
172
+ console.error('n8n Management MCP Server running on stdio');
173
+ console.error(`Connected to: ${client['config'].apiUrl}`);
174
+ console.error(`Tools available: ${TOOLS.length}`);
175
+ console.error('Ready for MCP client\n');
176
+ }
177
+ /**
178
+ * Start in HTTP mode (Streamable HTTP transport)
179
+ */
180
+ async function startHttp(client) {
181
+ const port = parseInt(process.env.PORT || '3000', 10);
182
+ const app = createMcpExpressApp();
183
+ // Map of active transports by session ID
184
+ const transports = {};
185
+ // POST /mcp — handle MCP requests
186
+ app.post('/mcp', async (req, res) => {
187
+ const sessionId = req.headers['mcp-session-id'];
188
+ try {
189
+ let transport;
190
+ if (sessionId && transports[sessionId]) {
191
+ // Reuse existing transport
192
+ transport = transports[sessionId];
193
+ }
194
+ else if (!sessionId && isInitializeRequest(req.body)) {
195
+ // New initialization request
196
+ transport = new StreamableHTTPServerTransport({
197
+ sessionIdGenerator: () => randomUUID(),
198
+ onsessioninitialized: (sid) => {
199
+ transports[sid] = transport;
200
+ },
201
+ });
202
+ transport.onclose = () => {
203
+ const sid = transport.sessionId;
204
+ if (sid && transports[sid]) {
205
+ delete transports[sid];
206
+ }
207
+ };
208
+ const server = createServer(client);
209
+ await server.connect(transport);
210
+ await transport.handleRequest(req, res, req.body);
211
+ return;
212
+ }
213
+ else {
214
+ res.status(400).json({
215
+ jsonrpc: '2.0',
216
+ error: {
217
+ code: -32000,
218
+ message: 'Bad Request: No valid session ID provided',
219
+ },
220
+ id: null,
221
+ });
222
+ return;
223
+ }
224
+ await transport.handleRequest(req, res, req.body);
225
+ }
226
+ catch (error) {
227
+ console.error('Error handling MCP request:', error);
228
+ if (!res.headersSent) {
229
+ res.status(500).json({
230
+ jsonrpc: '2.0',
231
+ error: {
232
+ code: -32603,
233
+ message: 'Internal server error',
234
+ },
235
+ id: null,
236
+ });
237
+ }
238
+ }
239
+ });
240
+ // GET /mcp — SSE stream for existing sessions
241
+ app.get('/mcp', async (req, res) => {
242
+ const sessionId = req.headers['mcp-session-id'];
243
+ if (!sessionId || !transports[sessionId]) {
244
+ res.status(400).send('Invalid or missing session ID');
245
+ return;
246
+ }
247
+ await transports[sessionId].handleRequest(req, res);
248
+ });
249
+ // DELETE /mcp — session termination
250
+ app.delete('/mcp', async (req, res) => {
251
+ const sessionId = req.headers['mcp-session-id'];
252
+ if (!sessionId || !transports[sessionId]) {
253
+ res.status(400).send('Invalid or missing session ID');
254
+ return;
255
+ }
256
+ await transports[sessionId].handleRequest(req, res);
257
+ });
258
+ // Health check
259
+ app.get('/', (_req, res) => {
260
+ res.json({
261
+ name: 'n8n-management-mcp',
262
+ version: '1.0.0',
263
+ status: 'ok',
264
+ tools: TOOLS.length,
265
+ transport: 'streamable-http',
266
+ endpoints: {
267
+ mcp: '/mcp',
268
+ },
269
+ });
270
+ });
271
+ app.listen(port, () => {
272
+ console.log(`n8n Management MCP Server (HTTP) listening on port ${port}`);
273
+ console.log(`Connected to: ${client['config'].apiUrl}`);
274
+ console.log(`Tools available: ${TOOLS.length}`);
275
+ console.log(`MCP endpoint: http://localhost:${port}/mcp`);
276
+ });
277
+ process.on('SIGINT', async () => {
278
+ console.log('\nShutting down...');
279
+ for (const sessionId in transports) {
280
+ try {
281
+ await transports[sessionId].close();
282
+ delete transports[sessionId];
283
+ }
284
+ catch {
285
+ // Ignore cleanup errors
286
+ }
287
+ }
288
+ process.exit(0);
289
+ });
290
+ }
291
+ /**
292
+ * Main entry point
293
+ */
294
+ async function main() {
295
+ const config = getConfig();
296
+ const client = new N8nClient(config);
297
+ const useHttp = process.argv.includes('--http');
298
+ if (useHttp) {
299
+ await startHttp(client);
300
+ }
301
+ else {
302
+ await startStdio(client);
303
+ }
304
+ }
305
+ main().catch((error) => {
306
+ console.error('Fatal error:', error);
307
+ process.exit(1);
308
+ });
309
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,6BAA6B,GAC9B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;GAEG;AACH,SAAS,SAAS;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAEvC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC;QAC1G,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACjH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAS,EAAE,MAAiB;IAC1E,QAAQ,QAAQ,EAAE,CAAC;QACjB,sBAAsB;QACtB,KAAK,oBAAoB;YACvB,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC;QAChC,KAAK,kBAAkB;YACrB,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,KAAK,yBAAyB;YAC5B,OAAO,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,sBAAsB;YACzB,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,KAAK,0BAA0B;YAC7B,OAAO,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,uBAAuB;QACvB,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,KAAK,mBAAmB;YACtB,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,sBAAsB;YACzB,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExC,wBAAwB;QACxB,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvC,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAChD,KAAK,uBAAuB;YAC1B,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,KAAK,2BAA2B;YAC9B,OAAO,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEzD,iBAAiB;QACjB,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3B,KAAK,aAAa;YAChB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEnC,sBAAsB;QACtB,KAAK,oBAAoB;YACvB,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC;QAChC,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,KAAK,qBAAqB;YACxB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAExC,kBAAkB;QAClB,KAAK,gBAAgB;YACnB,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5B,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,KAAK,iBAAiB;YACpB,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,sBAAsB;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnD;YACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,MAAiB;IACrC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;YAE9D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;qBAChC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,MAAiB;IACzC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,MAAiB;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,mBAAmB,EAAE,CAAC;IAElC,yCAAyC;IACzC,MAAM,UAAU,GAAkD,EAAE,CAAC;IAErE,kCAAkC;IAClC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QAEtE,IAAI,CAAC;YACH,IAAI,SAAwC,CAAC;YAE7C,IAAI,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvC,2BAA2B;gBAC3B,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,6BAA6B;gBAC7B,SAAS,GAAG,IAAI,6BAA6B,CAAC;oBAC5C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;oBACtC,oBAAoB,EAAE,CAAC,GAAW,EAAE,EAAE;wBACpC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;oBAC9B,CAAC;iBACF,CAAC,CAAC;gBAEH,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;oBACvB,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;oBAChC,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC3B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,2CAA2C;qBACrD;oBACD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,uBAAuB;qBACjC;oBACD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;QAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,oCAAoC;IACpC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAQ,EAAE,GAAQ,EAAE,EAAE;QAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QACD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAS,EAAE,GAAQ,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,SAAS,EAAE,iBAAiB;YAC5B,SAAS,EAAE;gBACT,GAAG,EAAE,MAAM;aACZ;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;gBACpC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * n8n API Client
3
+ * Wrapper for n8n REST API v1 calls with error handling
4
+ */
5
+ import { N8nConfig } from './types.js';
6
+ export declare class N8nClient {
7
+ private config;
8
+ constructor(config: N8nConfig);
9
+ /**
10
+ * Make authenticated request to n8n API
11
+ */
12
+ private request;
13
+ listWorkflows(): Promise<unknown>;
14
+ getWorkflow(id: string): Promise<unknown>;
15
+ createWorkflow(workflow: any): Promise<unknown>;
16
+ updateWorkflow(id: string, workflow: any): Promise<unknown>;
17
+ deleteWorkflow(id: string): Promise<unknown>;
18
+ activateWorkflow(id: string): Promise<unknown>;
19
+ deactivateWorkflow(id: string): Promise<unknown>;
20
+ executeWorkflow(id: string, data?: any): Promise<unknown>;
21
+ getWorkflowTags(id: string): Promise<unknown>;
22
+ updateWorkflowTags(id: string, tags: string[]): Promise<unknown>;
23
+ listExecutions(workflowId?: string): Promise<unknown>;
24
+ getExecution(id: string): Promise<unknown>;
25
+ deleteExecution(id: string): Promise<unknown>;
26
+ retryExecution(id: string): Promise<unknown>;
27
+ createCredential(credential: any): Promise<unknown>;
28
+ updateCredential(id: string, credential: any): Promise<unknown>;
29
+ deleteCredential(id: string): Promise<unknown>;
30
+ getCredentialSchema(credentialType: string): Promise<unknown>;
31
+ listTags(): Promise<unknown>;
32
+ getTag(id: string): Promise<unknown>;
33
+ createTag(name: string): Promise<unknown>;
34
+ updateTag(id: string, name: string): Promise<unknown>;
35
+ deleteTag(id: string): Promise<unknown>;
36
+ listVariables(): Promise<unknown>;
37
+ createVariable(key: string, value: string): Promise<unknown>;
38
+ updateVariable(id: string, key: string, value: string): Promise<unknown>;
39
+ deleteVariable(id: string): Promise<unknown>;
40
+ listUsers(): Promise<unknown>;
41
+ getUser(identifier: string): Promise<unknown>;
42
+ deleteUser(id: string): Promise<unknown>;
43
+ updateUserRole(id: string, role: 'admin' | 'member'): Promise<unknown>;
44
+ }
45
+ //# sourceMappingURL=n8n-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-client.d.ts","sourceRoot":"","sources":["../src/n8n-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAI7B;;OAEG;YACW,OAAO;IAwBf,aAAa;IAIb,WAAW,CAAC,EAAE,EAAE,MAAM;IAItB,cAAc,CAAC,QAAQ,EAAE,GAAG;IAO5B,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;IAOxC,cAAc,CAAC,EAAE,EAAE,MAAM;IAIzB,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAM3B,kBAAkB,CAAC,EAAE,EAAE,MAAM;IAM7B,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAOtC,eAAe,CAAC,EAAE,EAAE,MAAM;IAI1B,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAQ7C,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM;IAKlC,YAAY,CAAC,EAAE,EAAE,MAAM;IAIvB,eAAe,CAAC,EAAE,EAAE,MAAM;IAI1B,cAAc,CAAC,EAAE,EAAE,MAAM;IAQzB,gBAAgB,CAAC,UAAU,EAAE,GAAG;IAOhC,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG;IAO5C,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAI3B,mBAAmB,CAAC,cAAc,EAAE,MAAM;IAO1C,QAAQ;IAIR,MAAM,CAAC,EAAE,EAAE,MAAM;IAIjB,SAAS,CAAC,IAAI,EAAE,MAAM;IAOtB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAOlC,SAAS,CAAC,EAAE,EAAE,MAAM;IAKpB,aAAa;IAIb,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAOzC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAOrD,cAAc,CAAC,EAAE,EAAE,MAAM;IAKzB,SAAS;IAIT,OAAO,CAAC,UAAU,EAAE,MAAM;IAI1B,UAAU,CAAC,EAAE,EAAE,MAAM;IAIrB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ;CAM1D"}