flowengine-mcp-app 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.
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Base UI layout and shared components for MCP App
3
+ */
4
+ export function baseLayout(title, content) {
5
+ return `<!DOCTYPE html>
6
+ <html>
7
+ <head>
8
+ <meta charset="UTF-8">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
+ <title>${title} - FlowEngine</title>
11
+ <style>
12
+ * {
13
+ margin: 0;
14
+ padding: 0;
15
+ box-sizing: border-box;
16
+ }
17
+
18
+ body {
19
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
20
+ background: #0a0a0a;
21
+ color: #ffffff;
22
+ padding: 24px;
23
+ line-height: 1.6;
24
+ }
25
+
26
+ .header {
27
+ margin-bottom: 32px;
28
+ padding-bottom: 16px;
29
+ border-bottom: 1px solid #262626;
30
+ }
31
+
32
+ .header h1 {
33
+ font-size: 28px;
34
+ font-weight: 600;
35
+ margin-bottom: 8px;
36
+ }
37
+
38
+ .header p {
39
+ color: #999;
40
+ font-size: 14px;
41
+ }
42
+
43
+ .grid {
44
+ display: grid;
45
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
46
+ gap: 16px;
47
+ margin-bottom: 24px;
48
+ }
49
+
50
+ .card {
51
+ background: rgba(38, 38, 38, 0.5);
52
+ border: 1px solid #262626;
53
+ border-radius: 12px;
54
+ padding: 20px;
55
+ transition: all 0.2s;
56
+ }
57
+
58
+ .card:hover {
59
+ border-color: #404040;
60
+ background: rgba(38, 38, 38, 0.7);
61
+ }
62
+
63
+ .card-header {
64
+ display: flex;
65
+ justify-content: space-between;
66
+ align-items: flex-start;
67
+ margin-bottom: 16px;
68
+ }
69
+
70
+ .card-title {
71
+ font-size: 18px;
72
+ font-weight: 600;
73
+ margin-bottom: 4px;
74
+ }
75
+
76
+ .card-subtitle {
77
+ font-size: 13px;
78
+ color: #999;
79
+ }
80
+
81
+ .badge {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ gap: 6px;
85
+ padding: 4px 10px;
86
+ border-radius: 6px;
87
+ font-size: 12px;
88
+ font-weight: 500;
89
+ }
90
+
91
+ .badge-success {
92
+ background: rgba(34, 197, 94, 0.1);
93
+ border: 1px solid rgba(34, 197, 94, 0.3);
94
+ color: #4ade80;
95
+ }
96
+
97
+ .badge-error {
98
+ background: rgba(239, 68, 68, 0.1);
99
+ border: 1px solid rgba(239, 68, 68, 0.3);
100
+ color: #f87171;
101
+ }
102
+
103
+ .badge-warning {
104
+ background: rgba(234, 179, 8, 0.1);
105
+ border: 1px solid rgba(234, 179, 8, 0.3);
106
+ color: #facc15;
107
+ }
108
+
109
+ .badge-neutral {
110
+ background: rgba(115, 115, 115, 0.1);
111
+ border: 1px solid rgba(115, 115, 115, 0.3);
112
+ color: #a3a3a3;
113
+ }
114
+
115
+ .stat {
116
+ display: flex;
117
+ justify-content: space-between;
118
+ padding: 12px 0;
119
+ border-bottom: 1px solid #262626;
120
+ }
121
+
122
+ .stat:last-child {
123
+ border-bottom: none;
124
+ }
125
+
126
+ .stat-label {
127
+ color: #999;
128
+ font-size: 13px;
129
+ }
130
+
131
+ .stat-value {
132
+ font-weight: 600;
133
+ font-size: 14px;
134
+ }
135
+
136
+ .btn {
137
+ display: inline-flex;
138
+ align-items: center;
139
+ gap: 8px;
140
+ padding: 10px 16px;
141
+ border-radius: 8px;
142
+ font-size: 14px;
143
+ font-weight: 500;
144
+ text-decoration: none;
145
+ cursor: pointer;
146
+ transition: all 0.2s;
147
+ border: 1px solid transparent;
148
+ }
149
+
150
+ .btn-primary {
151
+ background: #ffffff;
152
+ color: #000000;
153
+ }
154
+
155
+ .btn-primary:hover {
156
+ background: #e5e5e5;
157
+ }
158
+
159
+ .btn-secondary {
160
+ background: rgba(38, 38, 38, 0.5);
161
+ border-color: #404040;
162
+ color: #d4d4d4;
163
+ }
164
+
165
+ .btn-secondary:hover {
166
+ background: #404040;
167
+ }
168
+
169
+ .btn-danger {
170
+ background: rgba(239, 68, 68, 0.1);
171
+ border-color: rgba(239, 68, 68, 0.3);
172
+ color: #f87171;
173
+ }
174
+
175
+ .btn-danger:hover {
176
+ background: rgba(239, 68, 68, 0.2);
177
+ }
178
+
179
+ .actions {
180
+ display: flex;
181
+ gap: 8px;
182
+ margin-top: 16px;
183
+ padding-top: 16px;
184
+ border-top: 1px solid #262626;
185
+ }
186
+
187
+ .empty-state {
188
+ text-align: center;
189
+ padding: 64px 24px;
190
+ color: #737373;
191
+ }
192
+
193
+ .empty-state svg {
194
+ width: 64px;
195
+ height: 64px;
196
+ margin: 0 auto 16px;
197
+ opacity: 0.5;
198
+ }
199
+
200
+ .empty-state h3 {
201
+ font-size: 18px;
202
+ margin-bottom: 8px;
203
+ color: #a3a3a3;
204
+ }
205
+
206
+ .empty-state p {
207
+ font-size: 14px;
208
+ }
209
+
210
+ .table {
211
+ width: 100%;
212
+ border-collapse: collapse;
213
+ margin: 16px 0;
214
+ }
215
+
216
+ .table th {
217
+ text-align: left;
218
+ padding: 12px;
219
+ background: rgba(38, 38, 38, 0.5);
220
+ border: 1px solid #262626;
221
+ font-size: 13px;
222
+ color: #999;
223
+ font-weight: 500;
224
+ }
225
+
226
+ .table td {
227
+ padding: 12px;
228
+ border: 1px solid #262626;
229
+ font-size: 14px;
230
+ }
231
+
232
+ .table tr:hover {
233
+ background: rgba(38, 38, 38, 0.3);
234
+ }
235
+
236
+ .icon {
237
+ width: 16px;
238
+ height: 16px;
239
+ display: inline-block;
240
+ }
241
+
242
+ .dot {
243
+ width: 8px;
244
+ height: 8px;
245
+ border-radius: 50%;
246
+ display: inline-block;
247
+ margin-right: 6px;
248
+ }
249
+
250
+ .dot-success { background: #4ade80; }
251
+ .dot-error { background: #f87171; }
252
+ .dot-warning { background: #facc15; }
253
+ .dot-neutral { background: #a3a3a3; }
254
+
255
+ .code {
256
+ font-family: 'Monaco', 'Courier New', monospace;
257
+ background: rgba(38, 38, 38, 0.5);
258
+ border: 1px solid #262626;
259
+ border-radius: 6px;
260
+ padding: 2px 6px;
261
+ font-size: 13px;
262
+ color: #22c55e;
263
+ }
264
+
265
+ a {
266
+ color: #60a5fa;
267
+ text-decoration: none;
268
+ }
269
+
270
+ a:hover {
271
+ text-decoration: underline;
272
+ }
273
+ </style>
274
+ </head>
275
+ <body>
276
+ ${content}
277
+ </body>
278
+ </html>`;
279
+ }
280
+ export function renderEmptyState(title, description, iconSvg) {
281
+ return `
282
+ <div class="empty-state">
283
+ ${iconSvg || '<svg fill="currentColor" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></svg>'}
284
+ <h3>${title}</h3>
285
+ <p>${description}</p>
286
+ </div>
287
+ `;
288
+ }
289
+ export function renderError(error) {
290
+ return baseLayout('Error', `
291
+ <div class="header">
292
+ <h1>⚠️ Error</h1>
293
+ </div>
294
+ <div class="card">
295
+ <div style="color: #f87171; padding: 16px; background: rgba(239, 68, 68, 0.1); border-radius: 8px;">
296
+ ${error}
297
+ </div>
298
+ </div>
299
+ `);
300
+ }
301
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/ui/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAe;IACvD,OAAO;;;;;WAKE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0QZ,OAAO;;QAEH,CAAC;AACT,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,WAAmB,EAAE,OAAgB;IACnF,OAAO;;QAED,OAAO,IAAI,6LAA6L;YACpM,KAAK;WACN,WAAW;;GAEnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,UAAU,CAAC,OAAO,EAAE;;;;;;UAMnB,KAAK;;;GAGZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * n8n Demo & Templates Showcase
3
+ */
4
+ export interface Template {
5
+ id: string;
6
+ name: string;
7
+ description: string;
8
+ category: string;
9
+ nodes_count?: number;
10
+ difficulty?: string;
11
+ tags?: string[];
12
+ }
13
+ export declare function renderDemoShowcase(templates?: Template[]): string;
14
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/ui/demo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,CAsCjE"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * n8n Demo & Templates Showcase
3
+ */
4
+ import { baseLayout } from './base.js';
5
+ export function renderDemoShowcase(templates) {
6
+ const demoTemplates = templates || getDemoTemplates();
7
+ return baseLayout('n8n Demo & Templates', `
8
+ <div class="header">
9
+ <h1>🎬 n8n Demo & Templates</h1>
10
+ <p>Explore pre-built workflows and automation templates</p>
11
+ </div>
12
+
13
+ <div class="card" style="margin-bottom: 24px; background: linear-gradient(135deg, rgba(147, 51, 234, 0.1), rgba(79, 70, 229, 0.1)); border-color: rgba(147, 51, 234, 0.3);">
14
+ <h2 style="margin-bottom: 12px; font-size: 24px;">🚀 Try FlowEngine Free</h2>
15
+ <p style="color: #d4d4d4; margin-bottom: 16px; font-size: 15px;">
16
+ Experience the power of n8n automation with FlowEngine's free trial. Get started with pre-built templates and build your first workflow in minutes.
17
+ </p>
18
+ <div style="display: flex; gap: 12px;">
19
+ <button class="btn btn-primary">Start Free Trial</button>
20
+ <button class="btn btn-secondary">Watch Demo Video</button>
21
+ </div>
22
+ </div>
23
+
24
+ <h3 style="margin: 24px 0 16px;">Featured Templates</h3>
25
+ ${renderTemplateGrid(demoTemplates.slice(0, 6))}
26
+
27
+ <h3 style="margin: 32px 0 16px;">Popular Use Cases</h3>
28
+ ${renderUseCases()}
29
+
30
+ <div class="card" style="margin-top: 32px;">
31
+ <h3 style="margin-bottom: 12px;">Ready to Get Started?</h3>
32
+ <p style="color: #999; margin-bottom: 16px;">Browse all templates or create your first workflow from scratch.</p>
33
+ <div style="display: flex; gap: 12px;">
34
+ <button class="btn btn-primary">Browse All Templates</button>
35
+ <button class="btn btn-secondary">Create Custom Workflow</button>
36
+ </div>
37
+ </div>
38
+ `);
39
+ }
40
+ function renderTemplateGrid(templates) {
41
+ const templateCards = templates
42
+ .map((template) => {
43
+ const difficultyBadge = getDifficultyBadge(template.difficulty || 'beginner');
44
+ const categoryIcon = getCategoryIcon(template.category);
45
+ return `
46
+ <div class="card">
47
+ <div class="card-header">
48
+ <div>
49
+ <div class="card-title">${categoryIcon} ${template.name}</div>
50
+ <div class="card-subtitle">${template.description}</div>
51
+ </div>
52
+ ${difficultyBadge}
53
+ </div>
54
+
55
+ <div>
56
+ <div class="stat">
57
+ <span class="stat-label">Category</span>
58
+ <span class="stat-value"><span class="code">${template.category}</span></span>
59
+ </div>
60
+ ${template.nodes_count
61
+ ? `
62
+ <div class="stat">
63
+ <span class="stat-label">Nodes</span>
64
+ <span class="stat-value">${template.nodes_count}</span>
65
+ </div>`
66
+ : ''}
67
+ </div>
68
+
69
+ ${template.tags && template.tags.length > 0
70
+ ? `
71
+ <div style="margin-top: 12px; display: flex; gap: 6px; flex-wrap: wrap;">
72
+ ${template.tags.map((tag) => `<span class="badge badge-neutral" style="font-size: 11px;">${tag}</span>`).join('')}
73
+ </div>`
74
+ : ''}
75
+
76
+ <div class="actions">
77
+ <button class="btn btn-primary">Import Template</button>
78
+ <button class="btn btn-secondary">Preview</button>
79
+ </div>
80
+ </div>
81
+ `;
82
+ })
83
+ .join('');
84
+ return `
85
+ <div class="grid">
86
+ ${templateCards}
87
+ </div>
88
+ `;
89
+ }
90
+ function renderUseCases() {
91
+ const useCases = [
92
+ {
93
+ icon: '💬',
94
+ title: 'Customer Support Automation',
95
+ description: 'Automate ticket routing, responses, and follow-ups',
96
+ examples: ['Slack notifications', 'Email autoresponder', 'CRM sync'],
97
+ },
98
+ {
99
+ icon: '📊',
100
+ title: 'Data Sync & Integration',
101
+ description: 'Keep your data synchronized across platforms',
102
+ examples: ['Google Sheets to Airtable', 'CRM to email marketing', 'Database backups'],
103
+ },
104
+ {
105
+ icon: '🔔',
106
+ title: 'Notifications & Alerts',
107
+ description: 'Get notified when important events happen',
108
+ examples: ['Sales alerts', 'System monitoring', 'Social media mentions'],
109
+ },
110
+ {
111
+ icon: '📝',
112
+ title: 'Content & Social Media',
113
+ description: 'Automate content publishing and social media',
114
+ examples: ['Auto-posting', 'Content scheduling', 'Analytics reporting'],
115
+ },
116
+ ];
117
+ const cards = useCases
118
+ .map((useCase) => `
119
+ <div class="card">
120
+ <div style="font-size: 32px; margin-bottom: 12px;">${useCase.icon}</div>
121
+ <h4 style="margin-bottom: 8px;">${useCase.title}</h4>
122
+ <p style="color: #999; font-size: 14px; margin-bottom: 12px;">${useCase.description}</p>
123
+ <div style="display: flex; gap: 6px; flex-wrap: wrap;">
124
+ ${useCase.examples.map((ex) => `<span class="badge badge-neutral" style="font-size: 11px;">${ex}</span>`).join('')}
125
+ </div>
126
+ </div>
127
+ `)
128
+ .join('');
129
+ return `
130
+ <div class="grid">
131
+ ${cards}
132
+ </div>
133
+ `;
134
+ }
135
+ function getDifficultyBadge(difficulty) {
136
+ const difficultyLower = difficulty.toLowerCase();
137
+ if (difficultyLower === 'beginner' || difficultyLower === 'easy') {
138
+ return '<span class="badge badge-success">Beginner</span>';
139
+ }
140
+ else if (difficultyLower === 'intermediate' || difficultyLower === 'medium') {
141
+ return '<span class="badge badge-warning">Intermediate</span>';
142
+ }
143
+ else if (difficultyLower === 'advanced' || difficultyLower === 'hard') {
144
+ return '<span class="badge badge-error">Advanced</span>';
145
+ }
146
+ else {
147
+ return `<span class="badge badge-neutral">${difficulty}</span>`;
148
+ }
149
+ }
150
+ function getCategoryIcon(category) {
151
+ const icons = {
152
+ 'customer-support': '💬',
153
+ 'data-sync': '🔄',
154
+ 'notifications': '🔔',
155
+ 'social-media': '📱',
156
+ 'productivity': '⚡',
157
+ 'marketing': '📈',
158
+ 'sales': '💰',
159
+ 'development': '💻',
160
+ 'analytics': '📊',
161
+ };
162
+ return icons[category.toLowerCase()] || '⚙️';
163
+ }
164
+ function getDemoTemplates() {
165
+ return [
166
+ {
167
+ id: 'demo-1',
168
+ name: 'Slack Lead Notification',
169
+ description: 'Send Slack notifications when new leads are submitted via your website form',
170
+ category: 'customer-support',
171
+ nodes_count: 4,
172
+ difficulty: 'beginner',
173
+ tags: ['Slack', 'Webhooks', 'Forms'],
174
+ },
175
+ {
176
+ id: 'demo-2',
177
+ name: 'Google Sheets to Airtable Sync',
178
+ description: 'Automatically sync new rows from Google Sheets to Airtable',
179
+ category: 'data-sync',
180
+ nodes_count: 5,
181
+ difficulty: 'beginner',
182
+ tags: ['Google Sheets', 'Airtable', 'Automation'],
183
+ },
184
+ {
185
+ id: 'demo-3',
186
+ name: 'Email Marketing Automation',
187
+ description: 'Send personalized email campaigns based on user actions',
188
+ category: 'marketing',
189
+ nodes_count: 8,
190
+ difficulty: 'intermediate',
191
+ tags: ['Email', 'Marketing', 'Personalization'],
192
+ },
193
+ {
194
+ id: 'demo-4',
195
+ name: 'Social Media Scheduler',
196
+ description: 'Schedule and auto-post content to multiple social media platforms',
197
+ category: 'social-media',
198
+ nodes_count: 6,
199
+ difficulty: 'intermediate',
200
+ tags: ['Twitter', 'LinkedIn', 'Instagram', 'Scheduling'],
201
+ },
202
+ {
203
+ id: 'demo-5',
204
+ name: 'Invoice Generation & Email',
205
+ description: 'Automatically generate invoices and email them to customers',
206
+ category: 'sales',
207
+ nodes_count: 7,
208
+ difficulty: 'intermediate',
209
+ tags: ['Invoices', 'PDF', 'Email', 'Stripe'],
210
+ },
211
+ {
212
+ id: 'demo-6',
213
+ name: 'Website Monitoring Alert',
214
+ description: 'Monitor your website uptime and get alerts when it goes down',
215
+ category: 'notifications',
216
+ nodes_count: 5,
217
+ difficulty: 'beginner',
218
+ tags: ['Monitoring', 'Alerts', 'Slack', 'Email'],
219
+ },
220
+ ];
221
+ }
222
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/ui/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Instance / Hosting Management UI
3
+ */
4
+ export interface Instance {
5
+ id: string;
6
+ instance_url: string;
7
+ status: string;
8
+ storage_limit_gb: number;
9
+ storage_used_gb?: number;
10
+ subscription_status?: string;
11
+ tier?: string;
12
+ created_at: string;
13
+ updated_at: string;
14
+ }
15
+ export declare function renderInstancesManager(instances: Instance[]): string;
16
+ export declare function renderInstanceDetails(instance: Instance, healthData?: any): string;
17
+ //# sourceMappingURL=instances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instances.d.ts","sourceRoot":"","sources":["../../src/ui/instances.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA0GpE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,GAAG,MAAM,CA+FlF"}