flowengine-mcp-app 3.0.0 → 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.
Files changed (119) hide show
  1. package/README.md +19 -270
  2. package/bin.js +12 -0
  3. package/package.json +8 -41
  4. package/LICENSE +0 -21
  5. package/build/cli/api.d.ts +0 -19
  6. package/build/cli/api.d.ts.map +0 -1
  7. package/build/cli/api.js +0 -62
  8. package/build/cli/api.js.map +0 -1
  9. package/build/cli/commands/delete.d.ts +0 -4
  10. package/build/cli/commands/delete.d.ts.map +0 -1
  11. package/build/cli/commands/delete.js +0 -16
  12. package/build/cli/commands/delete.js.map +0 -1
  13. package/build/cli/commands/deploy.d.ts +0 -24
  14. package/build/cli/commands/deploy.d.ts.map +0 -1
  15. package/build/cli/commands/deploy.js +0 -103
  16. package/build/cli/commands/deploy.js.map +0 -1
  17. package/build/cli/commands/domain.d.ts +0 -9
  18. package/build/cli/commands/domain.d.ts.map +0 -1
  19. package/build/cli/commands/domain.js +0 -27
  20. package/build/cli/commands/domain.js.map +0 -1
  21. package/build/cli/commands/env.d.ts +0 -13
  22. package/build/cli/commands/env.d.ts.map +0 -1
  23. package/build/cli/commands/env.js +0 -53
  24. package/build/cli/commands/env.js.map +0 -1
  25. package/build/cli/commands/list.d.ts +0 -4
  26. package/build/cli/commands/list.d.ts.map +0 -1
  27. package/build/cli/commands/list.js +0 -25
  28. package/build/cli/commands/list.js.map +0 -1
  29. package/build/cli/commands/login.d.ts +0 -4
  30. package/build/cli/commands/login.d.ts.map +0 -1
  31. package/build/cli/commands/login.js +0 -37
  32. package/build/cli/commands/login.js.map +0 -1
  33. package/build/cli/commands/logout.d.ts +0 -2
  34. package/build/cli/commands/logout.d.ts.map +0 -1
  35. package/build/cli/commands/logout.js +0 -8
  36. package/build/cli/commands/logout.js.map +0 -1
  37. package/build/cli/commands/logs.d.ts +0 -4
  38. package/build/cli/commands/logs.d.ts.map +0 -1
  39. package/build/cli/commands/logs.js +0 -40
  40. package/build/cli/commands/logs.js.map +0 -1
  41. package/build/cli/commands/show.d.ts +0 -4
  42. package/build/cli/commands/show.d.ts.map +0 -1
  43. package/build/cli/commands/show.js +0 -13
  44. package/build/cli/commands/show.js.map +0 -1
  45. package/build/cli/commands/usage.d.ts +0 -7
  46. package/build/cli/commands/usage.d.ts.map +0 -1
  47. package/build/cli/commands/usage.js +0 -16
  48. package/build/cli/commands/usage.js.map +0 -1
  49. package/build/cli/config.d.ts +0 -17
  50. package/build/cli/config.d.ts.map +0 -1
  51. package/build/cli/config.js +0 -42
  52. package/build/cli/config.js.map +0 -1
  53. package/build/cli/pack.d.ts +0 -25
  54. package/build/cli/pack.d.ts.map +0 -1
  55. package/build/cli/pack.js +0 -111
  56. package/build/cli/pack.js.map +0 -1
  57. package/build/cli/ui.d.ts +0 -23
  58. package/build/cli/ui.d.ts.map +0 -1
  59. package/build/cli/ui.js +0 -105
  60. package/build/cli/ui.js.map +0 -1
  61. package/build/cli.d.ts +0 -10
  62. package/build/cli.d.ts.map +0 -1
  63. package/build/cli.js +0 -251
  64. package/build/cli.js.map +0 -1
  65. package/build/client.d.ts +0 -94
  66. package/build/client.d.ts.map +0 -1
  67. package/build/client.js +0 -311
  68. package/build/client.js.map +0 -1
  69. package/build/index.d.ts +0 -12
  70. package/build/index.d.ts.map +0 -1
  71. package/build/index.js +0 -970
  72. package/build/index.js.map +0 -1
  73. package/build/tools/functions.d.ts +0 -14
  74. package/build/tools/functions.d.ts.map +0 -1
  75. package/build/tools/functions.js +0 -241
  76. package/build/tools/functions.js.map +0 -1
  77. package/build/types.d.ts +0 -155
  78. package/build/types.d.ts.map +0 -1
  79. package/build/types.js +0 -5
  80. package/build/types.js.map +0 -1
  81. package/build/ui/base.d.ts +0 -8
  82. package/build/ui/base.d.ts.map +0 -1
  83. package/build/ui/base.js +0 -425
  84. package/build/ui/base.js.map +0 -1
  85. package/build/ui/component-viewer.d.ts +0 -14
  86. package/build/ui/component-viewer.d.ts.map +0 -1
  87. package/build/ui/component-viewer.js +0 -678
  88. package/build/ui/component-viewer.js.map +0 -1
  89. package/build/ui/dashboard.d.ts +0 -21
  90. package/build/ui/dashboard.d.ts.map +0 -1
  91. package/build/ui/dashboard.js +0 -252
  92. package/build/ui/dashboard.js.map +0 -1
  93. package/build/ui/demo.d.ts +0 -14
  94. package/build/ui/demo.d.ts.map +0 -1
  95. package/build/ui/demo.js +0 -222
  96. package/build/ui/demo.js.map +0 -1
  97. package/build/ui/instances.d.ts +0 -17
  98. package/build/ui/instances.d.ts.map +0 -1
  99. package/build/ui/instances.js +0 -233
  100. package/build/ui/instances.js.map +0 -1
  101. package/build/ui/n8n-viewer.d.ts +0 -12
  102. package/build/ui/n8n-viewer.d.ts.map +0 -1
  103. package/build/ui/n8n-viewer.js +0 -371
  104. package/build/ui/n8n-viewer.js.map +0 -1
  105. package/build/ui/portals.d.ts +0 -14
  106. package/build/ui/portals.d.ts.map +0 -1
  107. package/build/ui/portals.js +0 -184
  108. package/build/ui/portals.js.map +0 -1
  109. package/build/ui/ui/components.html +0 -312
  110. package/build/ui/ui/n8n.html +0 -124
  111. package/build/ui/ui/portals.html +0 -211
  112. package/build/ui/widgets.d.ts +0 -17
  113. package/build/ui/widgets.d.ts.map +0 -1
  114. package/build/ui/widgets.js +0 -200
  115. package/build/ui/widgets.js.map +0 -1
  116. package/build/ui/workflows.d.ts +0 -17
  117. package/build/ui/workflows.d.ts.map +0 -1
  118. package/build/ui/workflows.js +0 -217
  119. package/build/ui/workflows.js.map +0 -1
@@ -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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"}
@@ -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"}
@@ -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"}
@@ -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"}