@mce-bt/microagents-dashboard 0.1.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/dist/aggregator.d.ts +278 -0
- package/dist/aggregator.d.ts.map +1 -0
- package/dist/aggregator.js +477 -0
- package/dist/aggregator.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +260 -0
- package/dist/server.js.map +1 -0
- package/package.json +51 -0
- package/public/chart.umd.min.js +20 -0
- package/public/htmx.min.js +1 -0
- package/public/styles.css +1192 -0
- package/views/404.ejs +10 -0
- package/views/agent-detail.ejs +8 -0
- package/views/agents.ejs +181 -0
- package/views/browser-detail.ejs +373 -0
- package/views/browser.ejs +57 -0
- package/views/layout.ejs +47 -0
- package/views/logs.ejs +65 -0
- package/views/memory.ejs +144 -0
- package/views/partials/agent-detail-content.ejs +193 -0
- package/views/partials/agents-table.ejs +57 -0
- package/views/partials/browser-table.ejs +71 -0
- package/views/partials/logs-content.ejs +43 -0
- package/views/partials/queues-table.ejs +39 -0
- package/views/queues.ejs +63 -0
- package/views/scheduler.ejs +95 -0
- package/views/session.ejs +74 -0
- package/views/tokens.ejs +381 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import Fastify from 'fastify';
|
|
2
|
+
import fastifyStatic from '@fastify/static';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
5
|
+
import * as ejs from 'ejs';
|
|
6
|
+
import { loadConfig } from './config.js';
|
|
7
|
+
import { DashboardAggregator } from './aggregator.js';
|
|
8
|
+
const config = loadConfig();
|
|
9
|
+
const aggregator = new DashboardAggregator(config);
|
|
10
|
+
const app = Fastify({ logger: true });
|
|
11
|
+
// ─── Access control + rate limiting ───
|
|
12
|
+
if (!config.accessToken) {
|
|
13
|
+
app.log.warn('DASHBOARD_TOKEN is not set — the dashboard is unauthenticated. Do not expose it beyond a trusted network.');
|
|
14
|
+
}
|
|
15
|
+
function tokenMatches(provided) {
|
|
16
|
+
const expected = Buffer.from(config.accessToken);
|
|
17
|
+
const actual = Buffer.from(provided);
|
|
18
|
+
return expected.length === actual.length && timingSafeEqual(expected, actual);
|
|
19
|
+
}
|
|
20
|
+
// Sliding-window rate limit per client IP (dashboard pages fan out to
|
|
21
|
+
// agents/DB, so an unthrottled crawler can amplify load substantially).
|
|
22
|
+
const RATE_LIMIT = 120; // requests
|
|
23
|
+
const RATE_WINDOW_MS = 60_000;
|
|
24
|
+
const hits = new Map();
|
|
25
|
+
app.addHook('onRequest', async (request, reply) => {
|
|
26
|
+
// rate limit
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
const stamps = (hits.get(request.ip) ?? []).filter((t) => now - t < RATE_WINDOW_MS);
|
|
29
|
+
stamps.push(now);
|
|
30
|
+
hits.set(request.ip, stamps);
|
|
31
|
+
if (hits.size > 10_000)
|
|
32
|
+
hits.clear(); // bound memory under IP churn
|
|
33
|
+
if (stamps.length > RATE_LIMIT) {
|
|
34
|
+
reply.code(429).send({ error: 'rate limit exceeded' });
|
|
35
|
+
return reply;
|
|
36
|
+
}
|
|
37
|
+
// auth
|
|
38
|
+
if (!config.accessToken)
|
|
39
|
+
return;
|
|
40
|
+
const header = request.headers.authorization;
|
|
41
|
+
const bearer = header?.startsWith('Bearer ') ? header.slice(7) : undefined;
|
|
42
|
+
const queryToken = request.query?.token;
|
|
43
|
+
const cookie = request.headers.cookie?.match(/(?:^|;\s*)dashboard_token=([^;]+)/)?.[1];
|
|
44
|
+
const provided = bearer ?? (typeof queryToken === 'string' ? queryToken : undefined) ?? cookie;
|
|
45
|
+
if (provided && tokenMatches(provided)) {
|
|
46
|
+
// ?token= login: persist as cookie so subsequent navigation works
|
|
47
|
+
if (typeof queryToken === 'string') {
|
|
48
|
+
reply.header('set-cookie', `dashboard_token=${queryToken}; HttpOnly; SameSite=Strict; Path=/`);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
reply.code(401).send({ error: 'unauthorized — provide DASHBOARD_TOKEN via Authorization: Bearer or ?token=' });
|
|
53
|
+
return reply;
|
|
54
|
+
});
|
|
55
|
+
// ─── View engine (EJS) ───
|
|
56
|
+
app.decorateReply('view', null);
|
|
57
|
+
const viewsDir = path.join(import.meta.dirname, '..', 'views');
|
|
58
|
+
async function renderView(template, data = {}) {
|
|
59
|
+
const filePath = path.join(viewsDir, `${template}.ejs`);
|
|
60
|
+
const body = await ejs.renderFile(filePath, { ...data, currentPage: template });
|
|
61
|
+
// Partials don't get wrapped in layout
|
|
62
|
+
if (template.startsWith('partials/'))
|
|
63
|
+
return body;
|
|
64
|
+
const layoutPath = path.join(viewsDir, 'layout.ejs');
|
|
65
|
+
return ejs.renderFile(layoutPath, { ...data, currentPage: template, body });
|
|
66
|
+
}
|
|
67
|
+
// ─── Static assets ───
|
|
68
|
+
app.register(fastifyStatic, {
|
|
69
|
+
root: path.join(import.meta.dirname, '..', 'public'),
|
|
70
|
+
prefix: '/public/',
|
|
71
|
+
});
|
|
72
|
+
// ─── Routes ───
|
|
73
|
+
// Home / Agents overview
|
|
74
|
+
app.get('/', async (_request, reply) => {
|
|
75
|
+
const agents = await aggregator.getAgents();
|
|
76
|
+
const onlineAgents = agents.filter((a) => a.status === 'online');
|
|
77
|
+
const [metricsAll, tasks] = await Promise.all([
|
|
78
|
+
Promise.all(onlineAgents.map(async (a) => {
|
|
79
|
+
const m = await aggregator.getAgentMetrics(a.baseUrl);
|
|
80
|
+
return { agent: a, metrics: m };
|
|
81
|
+
})),
|
|
82
|
+
aggregator.getTasksEntries(20),
|
|
83
|
+
]);
|
|
84
|
+
const html = await renderView('agents', { agents, agentMetrics: metricsAll, tasks });
|
|
85
|
+
reply.type('text/html').send(html);
|
|
86
|
+
});
|
|
87
|
+
// HTMX partial: agents table refresh
|
|
88
|
+
app.get('/partial/agents', async (_request, reply) => {
|
|
89
|
+
const agents = await aggregator.getAgents();
|
|
90
|
+
const html = await renderView('partials/agents-table', { agents });
|
|
91
|
+
reply.type('text/html').send(html);
|
|
92
|
+
});
|
|
93
|
+
// Agent detail page
|
|
94
|
+
app.get('/agents/:agentId', async (request, reply) => {
|
|
95
|
+
const { agentId } = request.params;
|
|
96
|
+
const agents = await aggregator.getAgents();
|
|
97
|
+
const agent = agents.find((a) => a.id === agentId);
|
|
98
|
+
if (!agent) {
|
|
99
|
+
reply.code(404).type('text/html').send(await renderView('404', { message: `Agent "${agentId}" not found` }));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const metrics = await aggregator.getAgentMetrics(agent.baseUrl);
|
|
103
|
+
const html = await renderView('agent-detail', { agent, metrics });
|
|
104
|
+
reply.type('text/html').send(html);
|
|
105
|
+
});
|
|
106
|
+
// HTMX partial: agent detail refresh
|
|
107
|
+
app.get('/partial/agents/:agentId', async (request, reply) => {
|
|
108
|
+
const { agentId } = request.params;
|
|
109
|
+
const agents = await aggregator.getAgents();
|
|
110
|
+
const agent = agents.find((a) => a.id === agentId);
|
|
111
|
+
if (!agent) {
|
|
112
|
+
reply.code(404).send('');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const metrics = await aggregator.getAgentMetrics(agent.baseUrl);
|
|
116
|
+
const html = await renderView('partials/agent-detail-content', { agent, metrics });
|
|
117
|
+
reply.type('text/html').send(html);
|
|
118
|
+
});
|
|
119
|
+
// Session detail page
|
|
120
|
+
app.get('/agents/:agentId/sessions/:sessionId', async (request, reply) => {
|
|
121
|
+
const { agentId, sessionId } = request.params;
|
|
122
|
+
const agents = await aggregator.getAgents();
|
|
123
|
+
const agent = agents.find((a) => a.id === agentId);
|
|
124
|
+
if (!agent) {
|
|
125
|
+
reply.code(404).type('text/html').send(await renderView('404', { message: 'Agent not found' }));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const detail = await aggregator.getSessionDetail(agent.baseUrl, sessionId);
|
|
129
|
+
const html = await renderView('session', { agent, sessionId, detail });
|
|
130
|
+
reply.type('text/html').send(html);
|
|
131
|
+
});
|
|
132
|
+
// Tokens page
|
|
133
|
+
app.get('/tokens', async (_request, reply) => {
|
|
134
|
+
const agents = await aggregator.getAgents();
|
|
135
|
+
const metricsAll = await Promise.all(agents.filter((a) => a.status === 'online').map(async (a) => {
|
|
136
|
+
const m = await aggregator.getAgentMetrics(a.baseUrl);
|
|
137
|
+
return { agent: a, metrics: m };
|
|
138
|
+
}));
|
|
139
|
+
const html = await renderView('tokens', { agentMetrics: metricsAll });
|
|
140
|
+
reply.type('text/html').send(html);
|
|
141
|
+
});
|
|
142
|
+
// Scheduler page
|
|
143
|
+
app.get('/scheduler', async (_request, reply) => {
|
|
144
|
+
const agents = await aggregator.getAgents();
|
|
145
|
+
const schedulerStats = await aggregator.getAllSchedulerStats(agents);
|
|
146
|
+
const html = await renderView('scheduler', { schedulerStats });
|
|
147
|
+
reply.type('text/html').send(html);
|
|
148
|
+
});
|
|
149
|
+
// Memory page
|
|
150
|
+
app.get('/memory', async (request, reply) => {
|
|
151
|
+
const stats = await aggregator.getMemoryStats();
|
|
152
|
+
const q = (request.query.q || '').trim();
|
|
153
|
+
let knowledge = [];
|
|
154
|
+
let episodes = [];
|
|
155
|
+
let notes = [];
|
|
156
|
+
if (q) {
|
|
157
|
+
const results = await aggregator.searchMemory(q);
|
|
158
|
+
knowledge = results.knowledge;
|
|
159
|
+
episodes = results.episodes;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
[knowledge, episodes, notes] = await Promise.all([
|
|
163
|
+
aggregator.getMemoryEntries('ltm_knowledge', 30),
|
|
164
|
+
aggregator.getMemoryEntries('mtm_episodes', 30),
|
|
165
|
+
aggregator.getNotesEntries(30),
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
const html = await renderView('memory', { stats, knowledge, episodes, notes, q });
|
|
169
|
+
reply.type('text/html').send(html);
|
|
170
|
+
});
|
|
171
|
+
// Queues page (RabbitMQ)
|
|
172
|
+
app.get('/queues', async (_request, reply) => {
|
|
173
|
+
const rabbit = await aggregator.getRabbitMQStats();
|
|
174
|
+
const html = await renderView('queues', { rabbit });
|
|
175
|
+
reply.type('text/html').send(html);
|
|
176
|
+
});
|
|
177
|
+
// HTMX partial: queues table refresh
|
|
178
|
+
app.get('/partial/queues', async (_request, reply) => {
|
|
179
|
+
const rabbit = await aggregator.getRabbitMQStats();
|
|
180
|
+
const html = await renderView('partials/queues-table', { rabbit });
|
|
181
|
+
reply.type('text/html').send(html);
|
|
182
|
+
});
|
|
183
|
+
// Logs page
|
|
184
|
+
app.get('/logs', async (_request, reply) => {
|
|
185
|
+
const agents = await aggregator.getAgents();
|
|
186
|
+
const logs = await aggregator.getAllAgentLogs(agents, 200);
|
|
187
|
+
const html = await renderView('logs', { agents, logs });
|
|
188
|
+
reply.type('text/html').send(html);
|
|
189
|
+
});
|
|
190
|
+
// HTMX partial: logs refresh
|
|
191
|
+
app.get('/partial/logs', async (_request, reply) => {
|
|
192
|
+
const agents = await aggregator.getAgents();
|
|
193
|
+
const logs = await aggregator.getAllAgentLogs(agents, 200);
|
|
194
|
+
const html = await renderView('partials/logs-content', { agents, logs });
|
|
195
|
+
reply.type('text/html').send(html);
|
|
196
|
+
});
|
|
197
|
+
// ─── Browser Sessions ───
|
|
198
|
+
app.get('/browser', async (_request, reply) => {
|
|
199
|
+
const sessions = await aggregator.getBrowserSessions(50);
|
|
200
|
+
const html = await renderView('browser', { sessions });
|
|
201
|
+
reply.type('text/html').send(html);
|
|
202
|
+
});
|
|
203
|
+
app.get('/partial/browser', async (_request, reply) => {
|
|
204
|
+
const sessions = await aggregator.getBrowserSessions(50);
|
|
205
|
+
const html = await renderView('partials/browser-table', { sessions });
|
|
206
|
+
reply.type('text/html').send(html);
|
|
207
|
+
});
|
|
208
|
+
app.get('/browser/:sessionId', async (request, reply) => {
|
|
209
|
+
const { sessionId } = request.params;
|
|
210
|
+
const detail = await aggregator.getBrowserSessionDetail(sessionId);
|
|
211
|
+
if (!detail.session) {
|
|
212
|
+
reply.code(404).type('text/html').send(await renderView('404', { message: 'Browser session not found' }));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const html = await renderView('browser-detail', { session: detail.session, steps: detail.steps });
|
|
216
|
+
reply.type('text/html').send(html);
|
|
217
|
+
});
|
|
218
|
+
app.get('/browser/:sessionId/screenshots/:stepIndex', async (request, reply) => {
|
|
219
|
+
const { sessionId, stepIndex } = request.params;
|
|
220
|
+
const detail = await aggregator.getBrowserSessionDetail(sessionId);
|
|
221
|
+
const step = detail.steps.find((s) => s.step_index === parseInt(stepIndex, 10));
|
|
222
|
+
if (!step?.screenshot_path) {
|
|
223
|
+
reply.code(404).send('Screenshot not found');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
// Resolve screenshot path — may be relative to the agent's working directory
|
|
227
|
+
let screenshotPath = step.screenshot_path;
|
|
228
|
+
if (!path.isAbsolute(screenshotPath) && config.browserRecordingsDir) {
|
|
229
|
+
// Strip the common prefix (e.g. "data/browser-recordings/") and resolve against configured dir
|
|
230
|
+
const parts = screenshotPath.split('/');
|
|
231
|
+
// Find the session UUID folder and filename within it
|
|
232
|
+
const sessionIdx = parts.findIndex((p) => p === sessionId);
|
|
233
|
+
if (sessionIdx >= 0) {
|
|
234
|
+
screenshotPath = path.join(config.browserRecordingsDir, ...parts.slice(sessionIdx));
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
screenshotPath = path.join(config.browserRecordingsDir, path.basename(screenshotPath));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
const fileBuffer = await import('node:fs/promises').then((fsp) => fsp.readFile(screenshotPath));
|
|
242
|
+
reply.type('image/png').send(fileBuffer);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
reply.code(404).send('Screenshot file not found');
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
// ─── Start ───
|
|
249
|
+
async function start() {
|
|
250
|
+
try {
|
|
251
|
+
await app.listen({ port: config.port, host: config.host });
|
|
252
|
+
console.log(`\n 🔭 MicroAgents Dashboard running at http://${config.host}:${config.port}\n`);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
app.log.error(err);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
start();
|
|
260
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mce-bt/microagents-dashboard",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Real-time observability dashboard for the MicroAgents framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/server.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"dev": "tsx src/server.ts",
|
|
9
|
+
"build": "tsc --build",
|
|
10
|
+
"start": "node dist/server.js",
|
|
11
|
+
"test": "vitest run --passWithNoTests"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"fastify": "^5.2.0",
|
|
15
|
+
"@fastify/static": "^8.0.0",
|
|
16
|
+
"ejs": "^3.1.10",
|
|
17
|
+
"pg": "^8.13.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"tsx": "^4.19.0",
|
|
21
|
+
"@types/ejs": "^3.1.5"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"views",
|
|
27
|
+
"public"
|
|
28
|
+
],
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/cavillo/microagents.git",
|
|
35
|
+
"directory": "packages/dashboard"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/cavillo/microagents#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/cavillo/microagents/issues"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20.0.0"
|
|
43
|
+
},
|
|
44
|
+
"types": "dist/server.d.ts",
|
|
45
|
+
"exports": {
|
|
46
|
+
".": {
|
|
47
|
+
"types": "./dist/server.d.ts",
|
|
48
|
+
"import": "./dist/server.js"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|