convex-mcp-visual 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/README.md +844 -0
- package/dist/apps/apps/realtime-dashboard/index.html +15 -0
- package/dist/apps/apps/schema-browser/index.html +15 -0
- package/dist/apps/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
- package/dist/apps/assets/realtime-dashboard-BPA99DZn.js +140 -0
- package/dist/apps/assets/schema-browser-BEcF8hRP.js +499 -0
- package/dist/apps/assets/style-BTxSpbLq.css +1 -0
- package/dist/convex-client.d.ts +56 -0
- package/dist/convex-client.d.ts.map +1 -0
- package/dist/convex-client.js +206 -0
- package/dist/convex-client.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/dashboard.d.ts +7 -0
- package/dist/resources/dashboard.d.ts.map +1 -0
- package/dist/resources/dashboard.js +255 -0
- package/dist/resources/dashboard.js.map +1 -0
- package/dist/resources/schema-browser.d.ts +7 -0
- package/dist/resources/schema-browser.d.ts.map +1 -0
- package/dist/resources/schema-browser.js +654 -0
- package/dist/resources/schema-browser.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/dashboard.d.ts +19 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +309 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/schema-browser.d.ts +19 -0
- package/dist/tools/schema-browser.d.ts.map +1 -0
- package/dist/tools/schema-browser.js +260 -0
- package/dist/tools/schema-browser.js.map +1 -0
- package/dist/ui-server.d.ts +26 -0
- package/dist/ui-server.d.ts.map +1 -0
- package/dist/ui-server.js +202 -0
- package/dist/ui-server.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard Resource Handler
|
|
3
|
+
*
|
|
4
|
+
* Serves the bundled Realtime Dashboard HTML UI.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
export async function getDashboardResourceContent() {
|
|
11
|
+
// Try to load the bundled HTML file
|
|
12
|
+
const bundledPath = join(__dirname, '..', 'apps', 'realtime-dashboard.html');
|
|
13
|
+
if (existsSync(bundledPath)) {
|
|
14
|
+
return readFileSync(bundledPath, 'utf-8');
|
|
15
|
+
}
|
|
16
|
+
// Fallback: return inline HTML for development/testing
|
|
17
|
+
return getInlineDashboardUI();
|
|
18
|
+
}
|
|
19
|
+
function getInlineDashboardUI() {
|
|
20
|
+
return `<!DOCTYPE html>
|
|
21
|
+
<html lang="en">
|
|
22
|
+
<head>
|
|
23
|
+
<meta charset="UTF-8">
|
|
24
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
25
|
+
<title>Realtime Dashboard - Convex MCP Apps</title>
|
|
26
|
+
<style>
|
|
27
|
+
* {
|
|
28
|
+
box-sizing: border-box;
|
|
29
|
+
margin: 0;
|
|
30
|
+
padding: 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:root {
|
|
34
|
+
--bg-primary: #1a1a2e;
|
|
35
|
+
--bg-secondary: #16213e;
|
|
36
|
+
--bg-tertiary: #0f3460;
|
|
37
|
+
--text-primary: #eee;
|
|
38
|
+
--text-secondary: #aaa;
|
|
39
|
+
--accent: #e94560;
|
|
40
|
+
--border: #333;
|
|
41
|
+
--success: #4caf50;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
body {
|
|
45
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
46
|
+
background: var(--bg-primary);
|
|
47
|
+
color: var(--text-primary);
|
|
48
|
+
min-height: 100vh;
|
|
49
|
+
padding: 20px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.header {
|
|
53
|
+
display: flex;
|
|
54
|
+
justify-content: space-between;
|
|
55
|
+
align-items: center;
|
|
56
|
+
margin-bottom: 24px;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.header h1 {
|
|
60
|
+
font-size: 20px;
|
|
61
|
+
display: flex;
|
|
62
|
+
align-items: center;
|
|
63
|
+
gap: 8px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.status-dot {
|
|
67
|
+
width: 8px;
|
|
68
|
+
height: 8px;
|
|
69
|
+
border-radius: 50%;
|
|
70
|
+
background: var(--success);
|
|
71
|
+
animation: pulse 2s infinite;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@keyframes pulse {
|
|
75
|
+
0%, 100% { opacity: 1; }
|
|
76
|
+
50% { opacity: 0.5; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.metrics-grid {
|
|
80
|
+
display: grid;
|
|
81
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
82
|
+
gap: 16px;
|
|
83
|
+
margin-bottom: 24px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.metric-card {
|
|
87
|
+
background: var(--bg-secondary);
|
|
88
|
+
border: 1px solid var(--border);
|
|
89
|
+
border-radius: 8px;
|
|
90
|
+
padding: 20px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.metric-label {
|
|
94
|
+
font-size: 12px;
|
|
95
|
+
color: var(--text-secondary);
|
|
96
|
+
text-transform: uppercase;
|
|
97
|
+
margin-bottom: 8px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.metric-value {
|
|
101
|
+
font-size: 32px;
|
|
102
|
+
font-weight: 700;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.metric-change {
|
|
106
|
+
font-size: 12px;
|
|
107
|
+
margin-top: 4px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.metric-change.positive { color: var(--success); }
|
|
111
|
+
.metric-change.negative { color: var(--accent); }
|
|
112
|
+
|
|
113
|
+
.charts-grid {
|
|
114
|
+
display: grid;
|
|
115
|
+
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
|
|
116
|
+
gap: 16px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.chart-card {
|
|
120
|
+
background: var(--bg-secondary);
|
|
121
|
+
border: 1px solid var(--border);
|
|
122
|
+
border-radius: 8px;
|
|
123
|
+
padding: 20px;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.chart-title {
|
|
127
|
+
font-size: 14px;
|
|
128
|
+
font-weight: 600;
|
|
129
|
+
margin-bottom: 16px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.chart-placeholder {
|
|
133
|
+
height: 200px;
|
|
134
|
+
background: var(--bg-tertiary);
|
|
135
|
+
border-radius: 4px;
|
|
136
|
+
display: flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
justify-content: center;
|
|
139
|
+
color: var(--text-secondary);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.empty-state {
|
|
143
|
+
text-align: center;
|
|
144
|
+
padding: 60px;
|
|
145
|
+
color: var(--text-secondary);
|
|
146
|
+
}
|
|
147
|
+
</style>
|
|
148
|
+
</head>
|
|
149
|
+
<body>
|
|
150
|
+
<div class="header">
|
|
151
|
+
<h1>
|
|
152
|
+
<span class="status-dot"></span>
|
|
153
|
+
Realtime Dashboard
|
|
154
|
+
</h1>
|
|
155
|
+
<span id="lastUpdate" style="color: var(--text-secondary); font-size: 12px;"></span>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div class="metrics-grid" id="metricsGrid"></div>
|
|
159
|
+
<div class="charts-grid" id="chartsGrid"></div>
|
|
160
|
+
|
|
161
|
+
<script>
|
|
162
|
+
const app = {
|
|
163
|
+
config: null,
|
|
164
|
+
|
|
165
|
+
init() {
|
|
166
|
+
const params = new URLSearchParams(window.location.search);
|
|
167
|
+
const configParam = params.get('config');
|
|
168
|
+
if (configParam) {
|
|
169
|
+
try {
|
|
170
|
+
this.config = JSON.parse(decodeURIComponent(configParam));
|
|
171
|
+
} catch (e) {
|
|
172
|
+
console.error('Failed to parse config:', e);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
this.render();
|
|
177
|
+
this.startAutoRefresh();
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
render() {
|
|
181
|
+
this.renderMetrics();
|
|
182
|
+
this.renderCharts();
|
|
183
|
+
this.updateTimestamp();
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
renderMetrics() {
|
|
187
|
+
const grid = document.getElementById('metricsGrid');
|
|
188
|
+
const metrics = this.config?.metrics || [];
|
|
189
|
+
|
|
190
|
+
if (metrics.length === 0) {
|
|
191
|
+
grid.innerHTML = \`
|
|
192
|
+
<div class="metric-card">
|
|
193
|
+
<div class="metric-label">Total Documents</div>
|
|
194
|
+
<div class="metric-value">--</div>
|
|
195
|
+
<div class="metric-change">Configure metrics to display data</div>
|
|
196
|
+
</div>
|
|
197
|
+
\`;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
grid.innerHTML = metrics.map(m => \`
|
|
202
|
+
<div class="metric-card">
|
|
203
|
+
<div class="metric-label">\${m.name}</div>
|
|
204
|
+
<div class="metric-value">--</div>
|
|
205
|
+
<div class="metric-change">\${m.table} / \${m.aggregation}</div>
|
|
206
|
+
</div>
|
|
207
|
+
\`).join('');
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
renderCharts() {
|
|
211
|
+
const grid = document.getElementById('chartsGrid');
|
|
212
|
+
const charts = this.config?.charts || [];
|
|
213
|
+
|
|
214
|
+
if (charts.length === 0) {
|
|
215
|
+
grid.innerHTML = \`
|
|
216
|
+
<div class="chart-card">
|
|
217
|
+
<div class="chart-title">Sample Chart</div>
|
|
218
|
+
<div class="chart-placeholder">
|
|
219
|
+
Configure charts to display visualizations
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
\`;
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
grid.innerHTML = charts.map(c => \`
|
|
227
|
+
<div class="chart-card">
|
|
228
|
+
<div class="chart-title">\${c.title}</div>
|
|
229
|
+
<div class="chart-placeholder">
|
|
230
|
+
\${c.type} chart - \${c.table}
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
\`).join('');
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
updateTimestamp() {
|
|
237
|
+
document.getElementById('lastUpdate').textContent =
|
|
238
|
+
'Last updated: ' + new Date().toLocaleTimeString();
|
|
239
|
+
},
|
|
240
|
+
|
|
241
|
+
startAutoRefresh() {
|
|
242
|
+
const interval = (this.config?.refreshInterval || 5) * 1000;
|
|
243
|
+
setInterval(() => {
|
|
244
|
+
this.updateTimestamp();
|
|
245
|
+
// In real implementation, fetch new data here
|
|
246
|
+
}, interval);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
document.addEventListener('DOMContentLoaded', () => app.init());
|
|
251
|
+
</script>
|
|
252
|
+
</body>
|
|
253
|
+
</html>`;
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/resources/dashboard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,oCAAoC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAE7E,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,uDAAuD;IACvD,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAyOD,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-browser.d.ts","sourceRoot":"","sources":["../../src/resources/schema-browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAUhE"}
|