@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/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
+ }