flowengine-mcp-app 2.0.1 → 3.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 +19 -270
- package/bin.js +12 -0
- package/package.json +8 -29
- package/LICENSE +0 -21
- package/build/client.d.ts +0 -56
- package/build/client.d.ts.map +0 -1
- package/build/client.js +0 -188
- package/build/client.js.map +0 -1
- package/build/index.d.ts +0 -12
- package/build/index.d.ts.map +0 -1
- package/build/index.js +0 -339
- package/build/index.js.map +0 -1
- package/build/ui/base.d.ts +0 -8
- package/build/ui/base.d.ts.map +0 -1
- package/build/ui/base.js +0 -425
- package/build/ui/base.js.map +0 -1
- package/build/ui/component-viewer.d.ts +0 -14
- package/build/ui/component-viewer.d.ts.map +0 -1
- package/build/ui/component-viewer.js +0 -678
- package/build/ui/component-viewer.js.map +0 -1
- package/build/ui/dashboard.d.ts +0 -21
- package/build/ui/dashboard.d.ts.map +0 -1
- package/build/ui/dashboard.js +0 -252
- package/build/ui/dashboard.js.map +0 -1
- package/build/ui/demo.d.ts +0 -14
- package/build/ui/demo.d.ts.map +0 -1
- package/build/ui/demo.js +0 -222
- package/build/ui/demo.js.map +0 -1
- package/build/ui/instances.d.ts +0 -17
- package/build/ui/instances.d.ts.map +0 -1
- package/build/ui/instances.js +0 -233
- package/build/ui/instances.js.map +0 -1
- package/build/ui/n8n-viewer.d.ts +0 -12
- package/build/ui/n8n-viewer.d.ts.map +0 -1
- package/build/ui/n8n-viewer.js +0 -371
- package/build/ui/n8n-viewer.js.map +0 -1
- package/build/ui/portals.d.ts +0 -14
- package/build/ui/portals.d.ts.map +0 -1
- package/build/ui/portals.js +0 -184
- package/build/ui/portals.js.map +0 -1
- package/build/ui/widgets.d.ts +0 -17
- package/build/ui/widgets.d.ts.map +0 -1
- package/build/ui/widgets.js +0 -200
- package/build/ui/widgets.js.map +0 -1
- package/build/ui/workflows.d.ts +0 -17
- package/build/ui/workflows.d.ts.map +0 -1
- package/build/ui/workflows.js +0 -217
- package/build/ui/workflows.js.map +0 -1
package/build/ui/instances.js
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Instance / Hosting Management UI
|
|
3
|
-
*/
|
|
4
|
-
import { baseLayout, renderEmptyState } from './base.js';
|
|
5
|
-
export function renderInstancesManager(instances) {
|
|
6
|
-
if (!instances || instances.length === 0) {
|
|
7
|
-
return baseLayout('Hosting', `
|
|
8
|
-
<div class="header">
|
|
9
|
-
<h1>🚀 Hosting Management</h1>
|
|
10
|
-
<p>Manage your FlowEngine instances</p>
|
|
11
|
-
</div>
|
|
12
|
-
${renderEmptyState('No Instances Found', 'You don\'t have any instances yet. Provision your first instance to get started.')}
|
|
13
|
-
<div class="card">
|
|
14
|
-
<h3 style="margin-bottom: 12px;">Get Started</h3>
|
|
15
|
-
<p style="color: #999; margin-bottom: 16px;">FlowEngine instances are fully-managed n8n automation servers. Each instance includes:</p>
|
|
16
|
-
<ul style="color: #999; margin-left: 20px; margin-bottom: 16px;">
|
|
17
|
-
<li>Dedicated n8n automation server</li>
|
|
18
|
-
<li>Custom domain support</li>
|
|
19
|
-
<li>Automated backups</li>
|
|
20
|
-
<li>Scalable storage</li>
|
|
21
|
-
</ul>
|
|
22
|
-
<button class="btn btn-primary">+ Provision New Instance</button>
|
|
23
|
-
</div>
|
|
24
|
-
`);
|
|
25
|
-
}
|
|
26
|
-
const activeInstances = instances.filter((i) => i.status === 'active' || i.status === 'running');
|
|
27
|
-
const totalStorage = instances.reduce((sum, i) => sum + i.storage_limit_gb, 0);
|
|
28
|
-
const usedStorage = instances.reduce((sum, i) => sum + (i.storage_used_gb || 0), 0);
|
|
29
|
-
const instanceCards = instances
|
|
30
|
-
.map((instance) => {
|
|
31
|
-
const statusBadge = getInstanceStatusBadge(instance.status);
|
|
32
|
-
const storagePercent = instance.storage_used_gb ? Math.round((instance.storage_used_gb / instance.storage_limit_gb) * 100) : 0;
|
|
33
|
-
const storageBarColor = storagePercent > 80 ? '#f87171' : storagePercent > 60 ? '#facc15' : '#4ade80';
|
|
34
|
-
return `
|
|
35
|
-
<div class="card">
|
|
36
|
-
<div class="card-header">
|
|
37
|
-
<div>
|
|
38
|
-
<div class="card-title">${instance.instance_url}</div>
|
|
39
|
-
<div class="card-subtitle">ID: ${instance.id.slice(0, 8)}...</div>
|
|
40
|
-
</div>
|
|
41
|
-
${statusBadge}
|
|
42
|
-
</div>
|
|
43
|
-
|
|
44
|
-
<div>
|
|
45
|
-
<div class="stat">
|
|
46
|
-
<span class="stat-label">Storage</span>
|
|
47
|
-
<span class="stat-value">${instance.storage_used_gb || 0} GB / ${instance.storage_limit_gb} GB</span>
|
|
48
|
-
</div>
|
|
49
|
-
<div style="width: 100%; height: 6px; background: #262626; border-radius: 3px; overflow: hidden; margin-top: 8px;">
|
|
50
|
-
<div style="width: ${storagePercent}%; height: 100%; background: ${storageBarColor}; transition: width 0.3s;"></div>
|
|
51
|
-
</div>
|
|
52
|
-
|
|
53
|
-
<div class="stat" style="margin-top: 12px;">
|
|
54
|
-
<span class="stat-label">Subscription</span>
|
|
55
|
-
<span class="stat-value">${instance.subscription_status || 'Active'}</span>
|
|
56
|
-
</div>
|
|
57
|
-
${instance.tier
|
|
58
|
-
? `
|
|
59
|
-
<div class="stat">
|
|
60
|
-
<span class="stat-label">Tier</span>
|
|
61
|
-
<span class="stat-value"><span class="badge badge-neutral">${instance.tier}</span></span>
|
|
62
|
-
</div>`
|
|
63
|
-
: ''}
|
|
64
|
-
<div class="stat">
|
|
65
|
-
<span class="stat-label">Created</span>
|
|
66
|
-
<span class="stat-value">${new Date(instance.created_at).toLocaleDateString()}</span>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<div class="actions">
|
|
71
|
-
<a href="https://${instance.instance_url}" target="_blank" class="btn btn-primary">
|
|
72
|
-
Open Instance →
|
|
73
|
-
</a>
|
|
74
|
-
<button class="btn btn-secondary">Settings</button>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
`;
|
|
78
|
-
})
|
|
79
|
-
.join('');
|
|
80
|
-
return baseLayout('Hosting', `
|
|
81
|
-
<div class="header">
|
|
82
|
-
<h1>🚀 Hosting Management</h1>
|
|
83
|
-
<p>${instances.length} instances • ${activeInstances.length} active • ${usedStorage.toFixed(1)} / ${totalStorage} GB used</p>
|
|
84
|
-
</div>
|
|
85
|
-
|
|
86
|
-
<div class="grid">
|
|
87
|
-
${instanceCards}
|
|
88
|
-
</div>
|
|
89
|
-
|
|
90
|
-
<div class="card">
|
|
91
|
-
<h3 style="margin-bottom: 12px;">Quick Actions</h3>
|
|
92
|
-
<div style="display: flex; gap: 12px;">
|
|
93
|
-
<button class="btn btn-primary">+ New Instance</button>
|
|
94
|
-
<button class="btn btn-secondary">View All Backups</button>
|
|
95
|
-
<button class="btn btn-secondary">Billing Settings</button>
|
|
96
|
-
</div>
|
|
97
|
-
</div>
|
|
98
|
-
`);
|
|
99
|
-
}
|
|
100
|
-
export function renderInstanceDetails(instance, healthData) {
|
|
101
|
-
const statusBadge = getInstanceStatusBadge(instance.status);
|
|
102
|
-
const storagePercent = instance.storage_used_gb ? Math.round((instance.storage_used_gb / instance.storage_limit_gb) * 100) : 0;
|
|
103
|
-
return baseLayout(`Instance: ${instance.instance_url}`, `
|
|
104
|
-
<div class="header">
|
|
105
|
-
<h1>🚀 ${instance.instance_url}</h1>
|
|
106
|
-
<p>Instance ID: <span class="code">${instance.id}</span> • ${statusBadge}</p>
|
|
107
|
-
</div>
|
|
108
|
-
|
|
109
|
-
<div class="grid" style="grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); margin-bottom: 24px;">
|
|
110
|
-
<div class="card">
|
|
111
|
-
<div class="stat">
|
|
112
|
-
<span class="stat-label">Status</span>
|
|
113
|
-
<span class="stat-value">${statusBadge}</span>
|
|
114
|
-
</div>
|
|
115
|
-
</div>
|
|
116
|
-
<div class="card">
|
|
117
|
-
<div class="stat">
|
|
118
|
-
<span class="stat-label">Storage</span>
|
|
119
|
-
<span class="stat-value">${instance.storage_used_gb || 0} / ${instance.storage_limit_gb} GB</span>
|
|
120
|
-
</div>
|
|
121
|
-
</div>
|
|
122
|
-
<div class="card">
|
|
123
|
-
<div class="stat">
|
|
124
|
-
<span class="stat-label">Subscription</span>
|
|
125
|
-
<span class="stat-value">${instance.subscription_status || 'Active'}</span>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
<div class="card">
|
|
129
|
-
<div class="stat">
|
|
130
|
-
<span class="stat-label">Uptime</span>
|
|
131
|
-
<span class="stat-value">${healthData?.uptime || '99.9%'}</span>
|
|
132
|
-
</div>
|
|
133
|
-
</div>
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div class="card" style="margin-bottom: 24px;">
|
|
137
|
-
<h3 style="margin-bottom: 16px;">Storage Usage</h3>
|
|
138
|
-
<div style="margin-bottom: 12px;">
|
|
139
|
-
<div style="display: flex; justify-content: space-between; margin-bottom: 8px;">
|
|
140
|
-
<span style="color: #999; font-size: 14px;">Used: ${instance.storage_used_gb || 0} GB</span>
|
|
141
|
-
<span style="color: #999; font-size: 14px;">${storagePercent}%</span>
|
|
142
|
-
</div>
|
|
143
|
-
<div style="width: 100%; height: 12px; background: #262626; border-radius: 6px; overflow: hidden;">
|
|
144
|
-
<div style="width: ${storagePercent}%; height: 100%; background: linear-gradient(90deg, #4ade80, #22c55e); transition: width 0.3s;"></div>
|
|
145
|
-
</div>
|
|
146
|
-
</div>
|
|
147
|
-
${storagePercent > 80
|
|
148
|
-
? '<div style="color: #f87171; font-size: 13px; margin-top: 12px;">⚠️ Storage is running low. Consider upgrading your plan.</div>'
|
|
149
|
-
: ''}
|
|
150
|
-
</div>
|
|
151
|
-
|
|
152
|
-
<div class="card" style="margin-bottom: 24px;">
|
|
153
|
-
<h3 style="margin-bottom: 16px;">Instance Information</h3>
|
|
154
|
-
<div class="stat">
|
|
155
|
-
<span class="stat-label">URL</span>
|
|
156
|
-
<span class="stat-value"><a href="https://${instance.instance_url}" target="_blank">${instance.instance_url}</a></span>
|
|
157
|
-
</div>
|
|
158
|
-
${instance.tier
|
|
159
|
-
? `
|
|
160
|
-
<div class="stat">
|
|
161
|
-
<span class="stat-label">Tier</span>
|
|
162
|
-
<span class="stat-value"><span class="badge badge-neutral">${instance.tier}</span></span>
|
|
163
|
-
</div>`
|
|
164
|
-
: ''}
|
|
165
|
-
<div class="stat">
|
|
166
|
-
<span class="stat-label">Created</span>
|
|
167
|
-
<span class="stat-value">${new Date(instance.created_at).toLocaleDateString()}</span>
|
|
168
|
-
</div>
|
|
169
|
-
<div class="stat">
|
|
170
|
-
<span class="stat-label">Last Updated</span>
|
|
171
|
-
<span class="stat-value">${new Date(instance.updated_at).toLocaleDateString()}</span>
|
|
172
|
-
</div>
|
|
173
|
-
</div>
|
|
174
|
-
|
|
175
|
-
${healthData ? renderHealthMetrics(healthData) : ''}
|
|
176
|
-
|
|
177
|
-
<div class="actions">
|
|
178
|
-
<a href="https://${instance.instance_url}" target="_blank" class="btn btn-primary">
|
|
179
|
-
Open Instance →
|
|
180
|
-
</a>
|
|
181
|
-
<button class="btn btn-secondary">Change Domain</button>
|
|
182
|
-
<button class="btn btn-secondary">Upgrade Storage</button>
|
|
183
|
-
<button class="btn btn-secondary">Create Backup</button>
|
|
184
|
-
<button class="btn btn-danger">Delete Instance</button>
|
|
185
|
-
</div>
|
|
186
|
-
`);
|
|
187
|
-
}
|
|
188
|
-
function getInstanceStatusBadge(status) {
|
|
189
|
-
// Default to active since we removed status field from API
|
|
190
|
-
if (!status) {
|
|
191
|
-
return '<span class="badge badge-success"><span class="dot dot-success"></span>Active</span>';
|
|
192
|
-
}
|
|
193
|
-
const statusLower = status.toLowerCase();
|
|
194
|
-
if (statusLower === 'active' || statusLower === 'running') {
|
|
195
|
-
return '<span class="badge badge-success"><span class="dot dot-success"></span>Active</span>';
|
|
196
|
-
}
|
|
197
|
-
else if (statusLower === 'paused' || statusLower === 'suspended') {
|
|
198
|
-
return '<span class="badge badge-warning"><span class="dot dot-warning"></span>Paused</span>';
|
|
199
|
-
}
|
|
200
|
-
else if (statusLower === 'error' || statusLower === 'failed') {
|
|
201
|
-
return '<span class="badge badge-error"><span class="dot dot-error"></span>Error</span>';
|
|
202
|
-
}
|
|
203
|
-
else if (statusLower === 'provisioning' || statusLower === 'starting') {
|
|
204
|
-
return '<span class="badge badge-warning"><span class="dot dot-warning"></span>Starting</span>';
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
return '<span class="badge badge-neutral"><span class="dot dot-neutral"></span>Inactive</span>';
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
function renderHealthMetrics(healthData) {
|
|
211
|
-
return `
|
|
212
|
-
<div class="card" style="margin-bottom: 24px;">
|
|
213
|
-
<h3 style="margin-bottom: 16px;">Health Metrics</h3>
|
|
214
|
-
<div class="stat">
|
|
215
|
-
<span class="stat-label">Response Time</span>
|
|
216
|
-
<span class="stat-value">${healthData.response_time || '120ms'}</span>
|
|
217
|
-
</div>
|
|
218
|
-
<div class="stat">
|
|
219
|
-
<span class="stat-label">CPU Usage</span>
|
|
220
|
-
<span class="stat-value">${healthData.cpu_usage || '23%'}</span>
|
|
221
|
-
</div>
|
|
222
|
-
<div class="stat">
|
|
223
|
-
<span class="stat-label">Memory Usage</span>
|
|
224
|
-
<span class="stat-value">${healthData.memory_usage || '512 MB'}</span>
|
|
225
|
-
</div>
|
|
226
|
-
<div class="stat">
|
|
227
|
-
<span class="stat-label">Last Health Check</span>
|
|
228
|
-
<span class="stat-value">${healthData.last_check ? new Date(healthData.last_check).toLocaleString() : 'Just now'}</span>
|
|
229
|
-
</div>
|
|
230
|
-
</div>
|
|
231
|
-
`;
|
|
232
|
-
}
|
|
233
|
-
//# sourceMappingURL=instances.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instances.js","sourceRoot":"","sources":["../../src/ui/instances.ts"],"names":[],"mappings":"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"}
|
package/build/ui/n8n-viewer.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* n8n Workflow Viewer - Direct workflow display via MCP
|
|
3
|
-
* No chat interface - just displays workflows returned by MCP
|
|
4
|
-
*/
|
|
5
|
-
export interface WorkflowData {
|
|
6
|
-
name: string;
|
|
7
|
-
nodes: any[];
|
|
8
|
-
connections: any;
|
|
9
|
-
[key: string]: any;
|
|
10
|
-
}
|
|
11
|
-
export declare function renderN8nViewer(workflow?: WorkflowData): string;
|
|
12
|
-
//# sourceMappingURL=n8n-viewer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"n8n-viewer.d.ts","sourceRoot":"","sources":["../../src/ui/n8n-viewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,WAAW,EAAE,GAAG,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CA+W/D"}
|
package/build/ui/n8n-viewer.js
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* n8n Workflow Viewer - Direct workflow display via MCP
|
|
3
|
-
* No chat interface - just displays workflows returned by MCP
|
|
4
|
-
*/
|
|
5
|
-
export function renderN8nViewer(workflow) {
|
|
6
|
-
const workflowJson = workflow ? JSON.stringify(workflow) : JSON.stringify({
|
|
7
|
-
"name": "Empty Workflow",
|
|
8
|
-
"nodes": [
|
|
9
|
-
{
|
|
10
|
-
"parameters": {},
|
|
11
|
-
"id": "1",
|
|
12
|
-
"name": "Start",
|
|
13
|
-
"type": "n8n-nodes-base.start",
|
|
14
|
-
"typeVersion": 1,
|
|
15
|
-
"position": [250, 300]
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"connections": {}
|
|
19
|
-
});
|
|
20
|
-
// Escape JSON for safe embedding in HTML/JavaScript
|
|
21
|
-
const escapedWorkflowJson = workflowJson
|
|
22
|
-
.replace(/\\/g, '\\\\')
|
|
23
|
-
.replace(/`/g, '\\`')
|
|
24
|
-
.replace(/\$/g, '\\$');
|
|
25
|
-
return `<!DOCTYPE html>
|
|
26
|
-
<html lang="en">
|
|
27
|
-
<head>
|
|
28
|
-
<meta charset="UTF-8">
|
|
29
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
30
|
-
<title>FlowEngine - n8n Workflow Viewer</title>
|
|
31
|
-
<style>
|
|
32
|
-
* {
|
|
33
|
-
margin: 0;
|
|
34
|
-
padding: 0;
|
|
35
|
-
box-sizing: border-box;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
body {
|
|
39
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
40
|
-
background: #000000;
|
|
41
|
-
color: #ffffff;
|
|
42
|
-
height: 100vh;
|
|
43
|
-
overflow: hidden;
|
|
44
|
-
display: flex;
|
|
45
|
-
flex-direction: column;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Header */
|
|
49
|
-
.viewer-header {
|
|
50
|
-
padding: 12px 16px;
|
|
51
|
-
border-bottom: 1px solid rgba(31, 41, 55, 1);
|
|
52
|
-
display: flex;
|
|
53
|
-
justify-content: space-between;
|
|
54
|
-
align-items: center;
|
|
55
|
-
gap: 12px;
|
|
56
|
-
background: #000000;
|
|
57
|
-
flex-shrink: 0;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.logo {
|
|
61
|
-
display: flex;
|
|
62
|
-
align-items: center;
|
|
63
|
-
gap: 8px;
|
|
64
|
-
font-size: 16px;
|
|
65
|
-
font-weight: 700;
|
|
66
|
-
background: linear-gradient(135deg, #3b82f6, #8b5cf6, #10b981);
|
|
67
|
-
-webkit-background-clip: text;
|
|
68
|
-
-webkit-text-fill-color: transparent;
|
|
69
|
-
background-clip: text;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
.workflow-title {
|
|
73
|
-
flex: 1;
|
|
74
|
-
font-size: 14px;
|
|
75
|
-
font-weight: 500;
|
|
76
|
-
color: rgba(209, 213, 219, 1);
|
|
77
|
-
padding: 0 16px;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
.header-actions {
|
|
81
|
-
display: flex;
|
|
82
|
-
gap: 8px;
|
|
83
|
-
align-items: center;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.action-btn {
|
|
87
|
-
display: flex;
|
|
88
|
-
align-items: center;
|
|
89
|
-
justify-content: center;
|
|
90
|
-
gap: 6px;
|
|
91
|
-
padding: 6px 12px;
|
|
92
|
-
background: rgba(31, 41, 55, 0.5);
|
|
93
|
-
border: 1px solid rgba(75, 85, 99, 1);
|
|
94
|
-
border-radius: 6px;
|
|
95
|
-
color: rgba(209, 213, 219, 1);
|
|
96
|
-
font-size: 12px;
|
|
97
|
-
font-weight: 500;
|
|
98
|
-
cursor: pointer;
|
|
99
|
-
transition: all 0.2s;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
.action-btn:hover {
|
|
103
|
-
background: rgba(31, 41, 55, 0.8);
|
|
104
|
-
border-color: rgba(107, 114, 128, 1);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.action-btn.primary {
|
|
108
|
-
background: #ffffff;
|
|
109
|
-
color: #000000;
|
|
110
|
-
border-color: #ffffff;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
.action-btn.primary:hover {
|
|
114
|
-
background: rgba(229, 231, 235, 1);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/* n8n Viewer Container */
|
|
118
|
-
.viewer-container {
|
|
119
|
-
flex: 1;
|
|
120
|
-
position: relative;
|
|
121
|
-
overflow: hidden;
|
|
122
|
-
background: #000000;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
#n8nDemoElement {
|
|
126
|
-
width: 100%;
|
|
127
|
-
height: 100%;
|
|
128
|
-
border: none;
|
|
129
|
-
background: #000000;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/* Loading State */
|
|
133
|
-
.loading-overlay {
|
|
134
|
-
position: absolute;
|
|
135
|
-
inset: 0;
|
|
136
|
-
background: #000000;
|
|
137
|
-
display: flex;
|
|
138
|
-
flex-direction: column;
|
|
139
|
-
align-items: center;
|
|
140
|
-
justify-content: center;
|
|
141
|
-
gap: 16px;
|
|
142
|
-
z-index: 10;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
.loading-overlay.hide {
|
|
146
|
-
display: none;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
.spinner {
|
|
150
|
-
width: 40px;
|
|
151
|
-
height: 40px;
|
|
152
|
-
border: 3px solid rgba(75, 85, 99, 0.3);
|
|
153
|
-
border-top-color: #3b82f6;
|
|
154
|
-
border-radius: 50%;
|
|
155
|
-
animation: spin 0.8s linear infinite;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
@keyframes spin {
|
|
159
|
-
to { transform: rotate(360deg); }
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.loading-text {
|
|
163
|
-
font-size: 14px;
|
|
164
|
-
color: rgba(156, 163, 175, 1);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/* Empty State */
|
|
168
|
-
.empty-state {
|
|
169
|
-
display: flex;
|
|
170
|
-
flex-direction: column;
|
|
171
|
-
align-items: center;
|
|
172
|
-
justify-content: center;
|
|
173
|
-
height: 100%;
|
|
174
|
-
padding: 32px;
|
|
175
|
-
text-align: center;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
.empty-state svg {
|
|
179
|
-
margin-bottom: 16px;
|
|
180
|
-
opacity: 0.3;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
.empty-state h3 {
|
|
184
|
-
font-size: 18px;
|
|
185
|
-
font-weight: 600;
|
|
186
|
-
color: #ffffff;
|
|
187
|
-
margin-bottom: 8px;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
.empty-state p {
|
|
191
|
-
font-size: 14px;
|
|
192
|
-
color: rgba(156, 163, 175, 1);
|
|
193
|
-
max-width: 400px;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
::-webkit-scrollbar {
|
|
197
|
-
width: 8px;
|
|
198
|
-
height: 8px;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
::-webkit-scrollbar-track {
|
|
202
|
-
background: transparent;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
::-webkit-scrollbar-thumb {
|
|
206
|
-
background: rgba(75, 85, 99, 0.5);
|
|
207
|
-
border-radius: 4px;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
::-webkit-scrollbar-thumb:hover {
|
|
211
|
-
background: rgba(75, 85, 99, 0.7);
|
|
212
|
-
}
|
|
213
|
-
</style>
|
|
214
|
-
</head>
|
|
215
|
-
<body>
|
|
216
|
-
<!-- Header -->
|
|
217
|
-
<div class="viewer-header">
|
|
218
|
-
<div class="logo">
|
|
219
|
-
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
220
|
-
<path d="M12 2L2 7L12 12L22 7L12 2Z" fill="url(#gradient)" stroke="currentColor" stroke-width="2"/>
|
|
221
|
-
<path d="M2 17L12 22L22 17" stroke="currentColor" stroke-width="2"/>
|
|
222
|
-
<path d="M2 12L12 17L22 12" stroke="currentColor" stroke-width="2"/>
|
|
223
|
-
<defs>
|
|
224
|
-
<linearGradient id="gradient" x1="2" y1="2" x2="22" y2="22">
|
|
225
|
-
<stop offset="0%" stop-color="#3b82f6"/>
|
|
226
|
-
<stop offset="50%" stop-color="#8b5cf6"/>
|
|
227
|
-
<stop offset="100%" stop-color="#10b981"/>
|
|
228
|
-
</linearGradient>
|
|
229
|
-
</defs>
|
|
230
|
-
</svg>
|
|
231
|
-
FlowEngine
|
|
232
|
-
</div>
|
|
233
|
-
<div class="workflow-title" id="workflowTitle">Workflow Viewer</div>
|
|
234
|
-
<div class="header-actions">
|
|
235
|
-
<button class="action-btn" id="shareBtn" title="Share workflow">
|
|
236
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
237
|
-
<circle cx="18" cy="5" r="3"></circle>
|
|
238
|
-
<circle cx="6" cy="12" r="3"></circle>
|
|
239
|
-
<circle cx="18" cy="19" r="3"></circle>
|
|
240
|
-
<line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line>
|
|
241
|
-
<line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>
|
|
242
|
-
</svg>
|
|
243
|
-
<span>Share</span>
|
|
244
|
-
</button>
|
|
245
|
-
<button class="action-btn" id="exportBtn" title="Export workflow">
|
|
246
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
247
|
-
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
|
|
248
|
-
<polyline points="7 10 12 15 17 10"></polyline>
|
|
249
|
-
<line x1="12" y1="15" x2="12" y2="3"></line>
|
|
250
|
-
</svg>
|
|
251
|
-
<span>Export</span>
|
|
252
|
-
</button>
|
|
253
|
-
<button class="action-btn primary" id="openN8nBtn" title="Open in n8n">
|
|
254
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
255
|
-
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
|
|
256
|
-
<polyline points="15 3 21 3 21 9"></polyline>
|
|
257
|
-
<line x1="10" y1="14" x2="21" y2="3"></line>
|
|
258
|
-
</svg>
|
|
259
|
-
<span>Open in n8n</span>
|
|
260
|
-
</button>
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
|
-
|
|
264
|
-
<!-- n8n Viewer Container -->
|
|
265
|
-
<div class="viewer-container">
|
|
266
|
-
<!-- Loading Overlay -->
|
|
267
|
-
<div class="loading-overlay" id="loadingOverlay">
|
|
268
|
-
<div class="spinner"></div>
|
|
269
|
-
<div class="loading-text">Loading workflow viewer...</div>
|
|
270
|
-
</div>
|
|
271
|
-
|
|
272
|
-
<!-- n8n Demo Element -->
|
|
273
|
-
<n8n-demo id="n8nDemoElement"></n8n-demo>
|
|
274
|
-
</div>
|
|
275
|
-
|
|
276
|
-
<!-- Load n8n Web Components -->
|
|
277
|
-
<script src="https://n8n-io.github.io/n8n-demo-webcomponent/webcomponents-loader.js"></script>
|
|
278
|
-
<script type="module" src="https://n8n-io.github.io/n8n-demo-webcomponent/n8n-demo.bundled.js"></script>
|
|
279
|
-
|
|
280
|
-
<script>
|
|
281
|
-
// Workflow data from MCP
|
|
282
|
-
const workflowData = JSON.parse(\`${escapedWorkflowJson}\`);
|
|
283
|
-
const demoElement = document.getElementById('n8nDemoElement');
|
|
284
|
-
const loadingOverlay = document.getElementById('loadingOverlay');
|
|
285
|
-
const workflowTitle = document.getElementById('workflowTitle');
|
|
286
|
-
const shareBtn = document.getElementById('shareBtn');
|
|
287
|
-
const exportBtn = document.getElementById('exportBtn');
|
|
288
|
-
const openN8nBtn = document.getElementById('openN8nBtn');
|
|
289
|
-
|
|
290
|
-
// Initialize n8n demo
|
|
291
|
-
function initDemo() {
|
|
292
|
-
if (customElements.get('n8n-demo')) {
|
|
293
|
-
try {
|
|
294
|
-
demoElement.setAttribute('workflow', JSON.stringify(workflowData));
|
|
295
|
-
demoElement.setAttribute('theme', 'dark');
|
|
296
|
-
demoElement.setAttribute('collapseformobile', 'false');
|
|
297
|
-
|
|
298
|
-
// Update title
|
|
299
|
-
workflowTitle.textContent = workflowData.name || 'Workflow Viewer';
|
|
300
|
-
|
|
301
|
-
// Hide loading overlay
|
|
302
|
-
setTimeout(() => {
|
|
303
|
-
loadingOverlay.classList.add('hide');
|
|
304
|
-
}, 500);
|
|
305
|
-
} catch (error) {
|
|
306
|
-
console.error('Failed to initialize n8n demo:', error);
|
|
307
|
-
loadingOverlay.innerHTML = \`
|
|
308
|
-
<div class="empty-state">
|
|
309
|
-
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
|
|
310
|
-
<circle cx="12" cy="12" r="10"></circle>
|
|
311
|
-
<line x1="12" y1="8" x2="12" y2="12"></line>
|
|
312
|
-
<line x1="12" y1="16" x2="12.01" y2="16"></line>
|
|
313
|
-
</svg>
|
|
314
|
-
<h3>Failed to Load Workflow</h3>
|
|
315
|
-
<p>Unable to initialize the workflow viewer. Please try again.</p>
|
|
316
|
-
</div>
|
|
317
|
-
\`;
|
|
318
|
-
}
|
|
319
|
-
} else {
|
|
320
|
-
setTimeout(initDemo, 100);
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Start initialization
|
|
325
|
-
setTimeout(initDemo, 500);
|
|
326
|
-
|
|
327
|
-
// Share button - Copy workflow JSON to clipboard
|
|
328
|
-
shareBtn.addEventListener('click', () => {
|
|
329
|
-
const workflow = JSON.stringify(workflowData, null, 2);
|
|
330
|
-
navigator.clipboard.writeText(workflow).then(() => {
|
|
331
|
-
const originalText = shareBtn.innerHTML;
|
|
332
|
-
shareBtn.innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"></polyline></svg><span>Copied!</span>';
|
|
333
|
-
setTimeout(() => {
|
|
334
|
-
shareBtn.innerHTML = originalText;
|
|
335
|
-
}, 2000);
|
|
336
|
-
}).catch(err => {
|
|
337
|
-
console.error('Failed to copy:', err);
|
|
338
|
-
alert('Failed to copy workflow to clipboard');
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
// Export button - Download workflow as JSON file
|
|
343
|
-
exportBtn.addEventListener('click', () => {
|
|
344
|
-
const workflow = JSON.stringify(workflowData, null, 2);
|
|
345
|
-
const blob = new Blob([workflow], { type: 'application/json' });
|
|
346
|
-
const url = URL.createObjectURL(blob);
|
|
347
|
-
const a = document.createElement('a');
|
|
348
|
-
a.href = url;
|
|
349
|
-
a.download = (workflowData.name || 'workflow').replace(/[^a-z0-9]/gi, '-').toLowerCase() + '.json';
|
|
350
|
-
a.click();
|
|
351
|
-
URL.revokeObjectURL(url);
|
|
352
|
-
|
|
353
|
-
const originalText = exportBtn.innerHTML;
|
|
354
|
-
exportBtn.innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"></polyline></svg><span>Exported!</span>';
|
|
355
|
-
setTimeout(() => {
|
|
356
|
-
exportBtn.innerHTML = originalText;
|
|
357
|
-
}, 2000);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
// Open in n8n button
|
|
361
|
-
openN8nBtn.addEventListener('click', () => {
|
|
362
|
-
// This would open the workflow in the actual n8n instance
|
|
363
|
-
// You can customize this based on your n8n instance URL
|
|
364
|
-
const n8nUrl = 'https://n8n.flowengine.cloud';
|
|
365
|
-
window.open(n8nUrl, '_blank');
|
|
366
|
-
});
|
|
367
|
-
</script>
|
|
368
|
-
</body>
|
|
369
|
-
</html>`;
|
|
370
|
-
}
|
|
371
|
-
//# sourceMappingURL=n8n-viewer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"n8n-viewer.js","sourceRoot":"","sources":["../../src/ui/n8n-viewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QACxE,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE;YACP;gBACE,YAAY,EAAE,EAAE;gBAChB,IAAI,EAAE,GAAG;gBACT,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,sBAAsB;gBAC9B,aAAa,EAAE,CAAC;gBAChB,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;aACvB;SACF;QACD,aAAa,EAAE,EAAE;KAClB,CAAC,CAAC;IAEH,oDAAoD;IACpD,MAAM,mBAAmB,GAAG,YAAY;SACrC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAiQ+B,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAuFnD,CAAC;AACT,CAAC"}
|
package/build/ui/portals.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client Portals UI
|
|
3
|
-
*/
|
|
4
|
-
export interface PortalInstance {
|
|
5
|
-
id: string;
|
|
6
|
-
instance_url: string;
|
|
7
|
-
storage_limit_gb: number;
|
|
8
|
-
status: string;
|
|
9
|
-
created_at: string;
|
|
10
|
-
subscription_status?: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function renderPortalsDashboard(instances: PortalInstance[]): string;
|
|
13
|
-
export declare function renderPortalDetails(instanceId: string, workflows: any[], widgets: any[]): string;
|
|
14
|
-
//# sourceMappingURL=portals.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"portals.d.ts","sourceRoot":"","sources":["../../src/ui/portals.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CA6E1E;AAkBD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAqChG"}
|