@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
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { createHmac } from 'node:crypto';
|
|
2
|
+
// ─── Aggregator ───
|
|
3
|
+
export class DashboardAggregator {
|
|
4
|
+
config;
|
|
5
|
+
/** Postgres schema holding memory tables — validated, safe to interpolate. */
|
|
6
|
+
schema;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
const schema = config.memorySchema ?? 'public';
|
|
10
|
+
if (!/^[a-z_][a-z0-9_]*$/i.test(schema)) {
|
|
11
|
+
throw new Error(`Invalid memory schema name "${schema}" — must be a plain identifier`);
|
|
12
|
+
}
|
|
13
|
+
this.schema = schema;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get all agents — from registry if available, or by direct polling.
|
|
17
|
+
*/
|
|
18
|
+
async getAgents() {
|
|
19
|
+
// Direct-agents mode: poll each agent URL for /health + /dashboard/metrics
|
|
20
|
+
if (this.config.agentUrls?.length) {
|
|
21
|
+
return this.getAgentsDirect(this.config.agentUrls);
|
|
22
|
+
}
|
|
23
|
+
// Registry mode: discover from registry API
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`${this.config.registryUrl}/api/agents`, {
|
|
26
|
+
headers: this.registryHeaders(),
|
|
27
|
+
signal: AbortSignal.timeout(5000),
|
|
28
|
+
});
|
|
29
|
+
if (!res.ok)
|
|
30
|
+
return [];
|
|
31
|
+
const agents = (await res.json());
|
|
32
|
+
// Enrich with health data in parallel
|
|
33
|
+
const enriched = await Promise.all(agents.map(async (agent) => {
|
|
34
|
+
try {
|
|
35
|
+
const healthRes = await fetch(`${agent.baseUrl}/health`, {
|
|
36
|
+
signal: AbortSignal.timeout(3000),
|
|
37
|
+
});
|
|
38
|
+
if (healthRes.ok) {
|
|
39
|
+
agent.health = (await healthRes.json());
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch { /* agent may be unreachable */ }
|
|
43
|
+
return agent;
|
|
44
|
+
}));
|
|
45
|
+
return enriched;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Direct-agents mode: build agent info from /health and /dashboard/metrics endpoints.
|
|
53
|
+
*/
|
|
54
|
+
async getAgentsDirect(urls) {
|
|
55
|
+
const agents = await Promise.all(urls.map(async (baseUrl) => {
|
|
56
|
+
try {
|
|
57
|
+
// Get health for basic info
|
|
58
|
+
const healthRes = await fetch(`${baseUrl}/health`, {
|
|
59
|
+
signal: AbortSignal.timeout(3000),
|
|
60
|
+
});
|
|
61
|
+
if (!healthRes.ok)
|
|
62
|
+
return null;
|
|
63
|
+
const health = (await healthRes.json());
|
|
64
|
+
// Get dashboard metrics for detailed info
|
|
65
|
+
let metrics = null;
|
|
66
|
+
try {
|
|
67
|
+
const metricsRes = await fetch(`${baseUrl}/dashboard/metrics`, {
|
|
68
|
+
headers: this.agentHeaders(),
|
|
69
|
+
signal: AbortSignal.timeout(3000),
|
|
70
|
+
});
|
|
71
|
+
if (metricsRes.ok) {
|
|
72
|
+
metrics = (await metricsRes.json());
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch { /* metrics endpoint may not exist */ }
|
|
76
|
+
const agent = {
|
|
77
|
+
id: health.agentId ?? (metrics?.agent?.id ?? baseUrl),
|
|
78
|
+
name: health.name ?? (metrics?.agent?.name ?? baseUrl),
|
|
79
|
+
domain: health.domain ?? (metrics?.agent?.domain ?? ''),
|
|
80
|
+
version: health.version ?? (metrics?.agent?.version ?? ''),
|
|
81
|
+
description: '',
|
|
82
|
+
baseUrl,
|
|
83
|
+
status: 'online',
|
|
84
|
+
lastHeartbeat: new Date().toISOString(),
|
|
85
|
+
registeredAt: new Date().toISOString(),
|
|
86
|
+
endpoints: [],
|
|
87
|
+
events: { subscriptions: [], publications: [] },
|
|
88
|
+
tasks: [],
|
|
89
|
+
skills: [],
|
|
90
|
+
tools: metrics?.tools ?? [],
|
|
91
|
+
health: { uptime: health.uptime ?? 0 },
|
|
92
|
+
};
|
|
93
|
+
return agent;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Agent unreachable — still include as offline
|
|
97
|
+
return {
|
|
98
|
+
id: baseUrl,
|
|
99
|
+
name: baseUrl,
|
|
100
|
+
domain: '',
|
|
101
|
+
version: '',
|
|
102
|
+
description: '',
|
|
103
|
+
baseUrl,
|
|
104
|
+
status: 'offline',
|
|
105
|
+
lastHeartbeat: '',
|
|
106
|
+
registeredAt: '',
|
|
107
|
+
endpoints: [],
|
|
108
|
+
events: { subscriptions: [], publications: [] },
|
|
109
|
+
tasks: [],
|
|
110
|
+
skills: [],
|
|
111
|
+
tools: [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
return agents.filter((a) => a !== null);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get detailed metrics from a specific agent.
|
|
119
|
+
*/
|
|
120
|
+
async getAgentMetrics(baseUrl) {
|
|
121
|
+
try {
|
|
122
|
+
const res = await fetch(`${baseUrl}/dashboard/metrics`, {
|
|
123
|
+
headers: this.agentHeaders(),
|
|
124
|
+
signal: AbortSignal.timeout(5000),
|
|
125
|
+
});
|
|
126
|
+
if (!res.ok)
|
|
127
|
+
return null;
|
|
128
|
+
return (await res.json());
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get full session log from a specific agent.
|
|
136
|
+
*/
|
|
137
|
+
async getSessionDetail(baseUrl, sessionId) {
|
|
138
|
+
try {
|
|
139
|
+
const res = await fetch(`${baseUrl}/dashboard/sessions/${encodeURIComponent(sessionId)}`, {
|
|
140
|
+
headers: this.agentHeaders(),
|
|
141
|
+
signal: AbortSignal.timeout(5000),
|
|
142
|
+
});
|
|
143
|
+
if (!res.ok)
|
|
144
|
+
return null;
|
|
145
|
+
return (await res.json());
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get recent log entries from a specific agent.
|
|
153
|
+
*/
|
|
154
|
+
async getAgentLogs(baseUrl, limit = 100) {
|
|
155
|
+
try {
|
|
156
|
+
const res = await fetch(`${baseUrl}/dashboard/logs?limit=${limit}`, {
|
|
157
|
+
headers: this.agentHeaders(),
|
|
158
|
+
signal: AbortSignal.timeout(5000),
|
|
159
|
+
});
|
|
160
|
+
if (!res.ok)
|
|
161
|
+
return null;
|
|
162
|
+
return (await res.json());
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get logs from all online agents, merged and sorted by time.
|
|
170
|
+
*/
|
|
171
|
+
async getAllAgentLogs(agents, limit = 200) {
|
|
172
|
+
const results = await Promise.all(agents
|
|
173
|
+
.filter((a) => a.status === 'online')
|
|
174
|
+
.map(async (agent) => {
|
|
175
|
+
const data = await this.getAgentLogs(agent.baseUrl, limit);
|
|
176
|
+
if (!data)
|
|
177
|
+
return [];
|
|
178
|
+
return data.logs.map((log) => ({
|
|
179
|
+
...log,
|
|
180
|
+
agentId: data.agentId,
|
|
181
|
+
agentName: data.agentName,
|
|
182
|
+
}));
|
|
183
|
+
}));
|
|
184
|
+
return results
|
|
185
|
+
.flat()
|
|
186
|
+
.sort((a, b) => b.time - a.time)
|
|
187
|
+
.slice(0, limit);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get RabbitMQ queue stats from management API.
|
|
191
|
+
*/
|
|
192
|
+
async getRabbitMQStats() {
|
|
193
|
+
const baseUrl = this.config.rabbitMgmtUrl ?? 'http://localhost:15672';
|
|
194
|
+
const auth = Buffer.from(`${this.config.rabbitUser ?? 'guest'}:${this.config.rabbitPass ?? 'guest'}`).toString('base64');
|
|
195
|
+
const result = { queues: [] };
|
|
196
|
+
try {
|
|
197
|
+
// Get queues
|
|
198
|
+
const qRes = await fetch(`${baseUrl}/api/queues`, {
|
|
199
|
+
headers: { Authorization: `Basic ${auth}` },
|
|
200
|
+
signal: AbortSignal.timeout(5000),
|
|
201
|
+
});
|
|
202
|
+
if (qRes.ok) {
|
|
203
|
+
const queues = (await qRes.json());
|
|
204
|
+
result.queues = queues.map((q) => ({
|
|
205
|
+
name: q.name,
|
|
206
|
+
messages: q.messages ?? 0,
|
|
207
|
+
messagesReady: q.messages_ready ?? 0,
|
|
208
|
+
messagesUnacked: q.messages_unacknowledged ?? 0,
|
|
209
|
+
consumers: q.consumers ?? 0,
|
|
210
|
+
state: q.state ?? 'unknown',
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
// Get overview
|
|
214
|
+
const oRes = await fetch(`${baseUrl}/api/overview`, {
|
|
215
|
+
headers: { Authorization: `Basic ${auth}` },
|
|
216
|
+
signal: AbortSignal.timeout(5000),
|
|
217
|
+
});
|
|
218
|
+
if (oRes.ok) {
|
|
219
|
+
const overview = (await oRes.json());
|
|
220
|
+
result.clusterName = overview.cluster_name;
|
|
221
|
+
result.rabbitmqVersion = overview.rabbitmq_version;
|
|
222
|
+
const stats = overview.message_stats;
|
|
223
|
+
if (stats) {
|
|
224
|
+
const rateOf = (details) => details?.rate ?? 0;
|
|
225
|
+
result.messageStats = {
|
|
226
|
+
publishRate: rateOf(stats.publish_details),
|
|
227
|
+
deliverRate: rateOf(stats.deliver_get_details),
|
|
228
|
+
ackRate: rateOf(stats.ack_details),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch { /* RabbitMQ may not be available */ }
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get memory stats directly from PostgreSQL.
|
|
238
|
+
*/
|
|
239
|
+
async getMemoryStats() {
|
|
240
|
+
if (!this.config.postgresUrl) {
|
|
241
|
+
return { episodes: 0, knowledge: 0, notes: 0, contacts: 0, tasks: 0 };
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
const pg = await import('pg');
|
|
245
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
246
|
+
try {
|
|
247
|
+
const counts = await Promise.all([
|
|
248
|
+
pool.query(`SELECT COUNT(*)::int as count FROM ${this.schema}.mtm_episodes`).catch(() => ({ rows: [{ count: 0 }] })),
|
|
249
|
+
pool.query(`SELECT COUNT(*)::int as count FROM ${this.schema}.ltm_knowledge`).catch(() => ({ rows: [{ count: 0 }] })),
|
|
250
|
+
pool.query(`SELECT COUNT(*)::int as count FROM ${this.schema}.notes`).catch(() => ({ rows: [{ count: 0 }] })),
|
|
251
|
+
pool.query(`SELECT COUNT(*)::int as count FROM ${this.schema}.contacts`).catch(() => ({ rows: [{ count: 0 }] })),
|
|
252
|
+
pool.query(`SELECT COUNT(*)::int as count FROM ${this.schema}.tasks`).catch(() => ({ rows: [{ count: 0 }] })),
|
|
253
|
+
]);
|
|
254
|
+
return {
|
|
255
|
+
episodes: counts[0].rows[0]?.count ?? 0,
|
|
256
|
+
knowledge: counts[1].rows[0]?.count ?? 0,
|
|
257
|
+
notes: counts[2].rows[0]?.count ?? 0,
|
|
258
|
+
contacts: counts[3].rows[0]?.count ?? 0,
|
|
259
|
+
tasks: counts[4].rows[0]?.count ?? 0,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
finally {
|
|
263
|
+
await pool.end();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return { episodes: 0, knowledge: 0, notes: 0, contacts: 0, tasks: 0 };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get memory entries from PostgreSQL (knowledge + episodes).
|
|
272
|
+
*/
|
|
273
|
+
async getMemoryEntries(table, limit = 50) {
|
|
274
|
+
if (!this.config.postgresUrl)
|
|
275
|
+
return [];
|
|
276
|
+
try {
|
|
277
|
+
const pg = await import('pg');
|
|
278
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
279
|
+
try {
|
|
280
|
+
const res = await pool.query(`SELECT * FROM ${this.schema}.${table} ORDER BY created_at DESC LIMIT $1`, [limit]);
|
|
281
|
+
return res.rows;
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
await pool.end();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Search memory via text matching.
|
|
293
|
+
*/
|
|
294
|
+
async searchMemory(query, limit = 20) {
|
|
295
|
+
if (!this.config.postgresUrl || !query)
|
|
296
|
+
return { knowledge: [], episodes: [] };
|
|
297
|
+
try {
|
|
298
|
+
const pg = await import('pg');
|
|
299
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
300
|
+
try {
|
|
301
|
+
const pattern = `%${query}%`;
|
|
302
|
+
const [k, e] = await Promise.all([
|
|
303
|
+
pool.query(`SELECT * FROM ${this.schema}.ltm_knowledge WHERE content ILIKE $1 ORDER BY created_at DESC LIMIT $2`, [pattern, limit]).catch(() => ({ rows: [] })),
|
|
304
|
+
pool.query(`SELECT * FROM ${this.schema}.mtm_episodes WHERE summary ILIKE $1 OR content ILIKE $1 ORDER BY created_at DESC LIMIT $2`, [pattern, limit]).catch(() => ({ rows: [] })),
|
|
305
|
+
]);
|
|
306
|
+
return { knowledge: k.rows, episodes: e.rows };
|
|
307
|
+
}
|
|
308
|
+
finally {
|
|
309
|
+
await pool.end();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return { knowledge: [], episodes: [] };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get notes entries from PostgreSQL.
|
|
318
|
+
*/
|
|
319
|
+
async getNotesEntries(limit = 50) {
|
|
320
|
+
if (!this.config.postgresUrl)
|
|
321
|
+
return [];
|
|
322
|
+
try {
|
|
323
|
+
const pg = await import('pg');
|
|
324
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
325
|
+
try {
|
|
326
|
+
const res = await pool.query(`SELECT * FROM ${this.schema}.notes ORDER BY created_at DESC LIMIT $1`, [limit]);
|
|
327
|
+
return res.rows;
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
await pool.end();
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get contacts from PostgreSQL.
|
|
339
|
+
*/
|
|
340
|
+
async getContactsEntries(limit = 50) {
|
|
341
|
+
if (!this.config.postgresUrl)
|
|
342
|
+
return [];
|
|
343
|
+
try {
|
|
344
|
+
const pg = await import('pg');
|
|
345
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
346
|
+
try {
|
|
347
|
+
const res = await pool.query(`SELECT id, display_name, first_name, last_name, relationship_type, importance, tags, interaction_count, last_interaction_at, source_account, created_at FROM ${this.schema}.contacts ORDER BY importance DESC, last_interaction_at DESC NULLS LAST LIMIT $1`, [limit]);
|
|
348
|
+
return res.rows;
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await pool.end();
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return [];
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get tasks from PostgreSQL.
|
|
360
|
+
*/
|
|
361
|
+
async getTasksEntries(limit = 50) {
|
|
362
|
+
if (!this.config.postgresUrl)
|
|
363
|
+
return [];
|
|
364
|
+
try {
|
|
365
|
+
const pg = await import('pg');
|
|
366
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
367
|
+
try {
|
|
368
|
+
const res = await pool.query(`SELECT id, title, status, quadrant, priority, due_date, project, tags, assigned_to, created_at, completed_at FROM ${this.schema}.tasks ORDER BY CASE status WHEN 'todo' THEN 0 WHEN 'in-progress' THEN 1 ELSE 2 END, priority DESC, created_at DESC LIMIT $1`, [limit]);
|
|
369
|
+
return res.rows;
|
|
370
|
+
}
|
|
371
|
+
finally {
|
|
372
|
+
await pool.end();
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return [];
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get all scheduler stats across agents.
|
|
381
|
+
*/
|
|
382
|
+
async getAllSchedulerStats(agents) {
|
|
383
|
+
const results = await Promise.all(agents
|
|
384
|
+
.filter((a) => a.status === 'online')
|
|
385
|
+
.map(async (agent) => {
|
|
386
|
+
try {
|
|
387
|
+
const res = await fetch(`${agent.baseUrl}/scheduler`, {
|
|
388
|
+
headers: this.agentHeaders(),
|
|
389
|
+
signal: AbortSignal.timeout(3000),
|
|
390
|
+
});
|
|
391
|
+
if (!res.ok)
|
|
392
|
+
return null;
|
|
393
|
+
const scheduler = await res.json();
|
|
394
|
+
return {
|
|
395
|
+
agentId: agent.id,
|
|
396
|
+
agentName: agent.name,
|
|
397
|
+
scheduler,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
}));
|
|
404
|
+
return results.filter((r) => r !== null);
|
|
405
|
+
}
|
|
406
|
+
/** The registry authenticates with the plain shared secret, not HMAC. */
|
|
407
|
+
registryHeaders() {
|
|
408
|
+
return {
|
|
409
|
+
'Content-Type': 'application/json',
|
|
410
|
+
'x-shared-secret': this.config.sharedSecret,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Auth headers for GET requests to agent endpoints (/dashboard/*,
|
|
415
|
+
* /scheduler). Agents sign JSON.stringify(body ?? '') — for a body-less
|
|
416
|
+
* GET that is the literal two-character string '""'.
|
|
417
|
+
*/
|
|
418
|
+
agentHeaders() {
|
|
419
|
+
const timestamp = Date.now().toString();
|
|
420
|
+
return {
|
|
421
|
+
'x-agent-id': 'dashboard',
|
|
422
|
+
'x-timestamp': timestamp,
|
|
423
|
+
'x-signature': this.computeSignature('""', timestamp),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
computeSignature(body, timestamp) {
|
|
427
|
+
const payload = `${timestamp}.${body}`;
|
|
428
|
+
return createHmac('sha256', this.config.sharedSecret).update(payload).digest('hex');
|
|
429
|
+
}
|
|
430
|
+
// ─── Browser Sessions ───
|
|
431
|
+
async getBrowserSessions(limit = 50) {
|
|
432
|
+
if (!this.config.postgresUrl)
|
|
433
|
+
return [];
|
|
434
|
+
try {
|
|
435
|
+
const pg = await import('pg');
|
|
436
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
437
|
+
try {
|
|
438
|
+
const res = await pool.query(`SELECT id, agent_id, platform, goal, status, started_at, ended_at, step_count, metadata
|
|
439
|
+
FROM public.browser_sessions ORDER BY started_at DESC LIMIT $1`, [limit]);
|
|
440
|
+
return res.rows;
|
|
441
|
+
}
|
|
442
|
+
finally {
|
|
443
|
+
await pool.end();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
return [];
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async getBrowserSessionDetail(sessionId) {
|
|
451
|
+
if (!this.config.postgresUrl)
|
|
452
|
+
return { session: null, steps: [] };
|
|
453
|
+
try {
|
|
454
|
+
const pg = await import('pg');
|
|
455
|
+
const pool = new pg.Pool({ connectionString: this.config.postgresUrl });
|
|
456
|
+
try {
|
|
457
|
+
const [sessionRes, stepsRes] = await Promise.all([
|
|
458
|
+
pool.query(`SELECT id, agent_id, platform, goal, status, started_at, ended_at, step_count, metadata
|
|
459
|
+
FROM public.browser_sessions WHERE id = $1`, [sessionId]),
|
|
460
|
+
pool.query(`SELECT step_index, action_type, instruction, result, screenshot_path, duration_ms, created_at
|
|
461
|
+
FROM public.browser_session_steps WHERE session_id = $1 ORDER BY step_index`, [sessionId]),
|
|
462
|
+
]);
|
|
463
|
+
return {
|
|
464
|
+
session: sessionRes.rows[0] || null,
|
|
465
|
+
steps: stepsRes.rows,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
finally {
|
|
469
|
+
await pool.end();
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
return { session: null, steps: [] };
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregator.js","sourceRoot":"","sources":["../src/aggregator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgHzC,qBAAqB;AAErB,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAkB;IAChC,8EAA8E;IAC7D,MAAM,CAAS;IAEhC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC;QAC/C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,gCAAgC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,2EAA2E;QAC3E,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,4CAA4C;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,aAAa,EAAE;gBAC/D,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE;gBAC/B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;YAEjD,sCAAsC;YACtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACzB,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,SAAS,EAAE;wBACvD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;qBAClC,CAAC,CAAC;oBACH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;wBACjB,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAwB,CAAC;oBACjE,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;gBAC1C,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CACH,CAAC;YAEF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,IAAc;QAC1C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACzB,IAAI,CAAC;gBACH,4BAA4B;gBAC5B,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;oBACjD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC;gBAC/B,MAAM,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAA4B,CAAC;gBAEnE,0CAA0C;gBAC1C,IAAI,OAAO,GAAwB,IAAI,CAAC;gBACxC,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,oBAAoB,EAAE;wBAC7D,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;wBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;qBAClC,CAAC,CAAC;oBACH,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;wBAClB,OAAO,GAAG,CAAC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAiB,CAAC;oBACtD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,oCAAoC,CAAC,CAAC;gBAEhD,MAAM,KAAK,GAAc;oBACvB,EAAE,EAAG,MAAM,CAAC,OAAkB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,OAAO,CAAC;oBACjE,IAAI,EAAG,MAAM,CAAC,IAAe,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;oBAClE,MAAM,EAAG,MAAM,CAAC,MAAiB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;oBACnE,OAAO,EAAG,MAAM,CAAC,OAAkB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;oBACtE,WAAW,EAAE,EAAE;oBACf,OAAO;oBACP,MAAM,EAAE,QAAQ;oBAChB,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACvC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;oBAC/C,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;oBAC3B,MAAM,EAAE,EAAE,MAAM,EAAG,MAAM,CAAC,MAAiB,IAAI,CAAC,EAAE;iBACnD,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;gBAC/C,OAAO;oBACL,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,EAAE;oBACV,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,EAAE;oBACf,OAAO;oBACP,MAAM,EAAE,SAAkB;oBAC1B,aAAa,EAAE,EAAE;oBACjB,YAAY,EAAE,EAAE;oBAChB,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;oBAC/C,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,KAAK,EAAE,EAAE;iBACV,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,oBAAoB,EAAE;gBACtD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;gBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiB,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,SAAiB;QACvD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,uBAAuB,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAAE;gBACxF,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;gBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkB,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,KAAK,GAAG,GAAG;QAK7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,yBAAyB,KAAK,EAAE,EAAE;gBAClE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;gBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAIvB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,MAAmB,EAAE,KAAK,GAAG,GAAG;QAGpD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM;aACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;aACpC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,GAAG;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CACL,CAAC;QAEF,OAAO,OAAO;aACX,IAAI,EAAE;aACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;aAC/B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,wBAAwB,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CACtB,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,EAAE,CAC5E,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAErB,MAAM,MAAM,GAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,aAAa;YACb,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,aAAa,EAAE;gBAChD,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE;gBAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAmC,CAAC;gBACrE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACjC,IAAI,EAAE,CAAC,CAAC,IAAc;oBACtB,QAAQ,EAAG,CAAC,CAAC,QAAmB,IAAI,CAAC;oBACrC,aAAa,EAAG,CAAC,CAAC,cAAyB,IAAI,CAAC;oBAChD,eAAe,EAAG,CAAC,CAAC,uBAAkC,IAAI,CAAC;oBAC3D,SAAS,EAAG,CAAC,CAAC,SAAoB,IAAI,CAAC;oBACvC,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,SAAS;iBACxC,CAAC,CAAC,CAAC;YACN,CAAC;YAED,eAAe;YACf,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,EAAE;gBAClD,OAAO,EAAE,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE;gBAC3C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;gBAChE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,YAAsB,CAAC;gBACrD,MAAM,CAAC,eAAe,GAAG,QAAQ,CAAC,gBAA0B,CAAC;gBAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAoD,CAAC;gBAC5E,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,MAAM,GAAG,CAAC,OAAgB,EAAE,EAAE,CAChC,OAA+C,EAAE,IAAe,IAAI,CAAC,CAAC;oBAC1E,MAAM,CAAC,YAAY,GAAG;wBACpB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;wBAC1C,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC;wBAC9C,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;qBACnC,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,mCAAmC,CAAC,CAAC;QAE/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAOlB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC7B,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC/B,IAAI,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpH,IAAI,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACrH,IAAI,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC7G,IAAI,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChH,IAAI,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;iBAC9G,CAAC,CAAC;gBACH,OAAO;oBACL,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;oBACvC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;oBACxC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;oBACpC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;oBACvC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;iBACrC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAuC,EAAE,KAAK,GAAG,EAAE;QACxE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,MAAM,IAAI,KAAK,oCAAoC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjH,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC/E,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,KAAK,GAAG,CAAC;gBAC7B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC/B,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,MAAM,yEAAyE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC/J,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,MAAM,4FAA4F,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;iBACnL,CAAC,CAAC;gBACH,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,MAAM,0CAA0C,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9G,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAK,GAAG,EAAE;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAC1B,gKAAgK,IAAI,CAAC,MAAM,kFAAkF,EAC7P,CAAC,KAAK,CAAC,CACR,CAAC;gBACF,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAC1B,qHAAqH,IAAI,CAAC,MAAM,8HAA8H,EAC9P,CAAC,KAAK,CAAC,CACR,CAAC;gBACF,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,MAAmB;QAK5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,MAAM;aACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC;aACpC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,YAAY,EAAE;oBACpD,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;oBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC;gBACzB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,SAAS,EAAE,KAAK,CAAC,IAAI;oBACrB,SAAS;iBACV,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CACL,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,yEAAyE;IACjE,eAAe;QACrB,OAAO;YACL,cAAc,EAAE,kBAAkB;YAClC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SAC5C,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,YAAY;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,aAAa,EAAE,SAAS;YACxB,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC;SACtD,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,IAAY,EAAE,SAAiB;QACtD,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtF,CAAC;IAED,2BAA2B;IAE3B,KAAK,CAAC,kBAAkB,CAAC,KAAK,GAAG,EAAE;QAWjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAC1B;0EACgE,EAChE,CAAC,KAAK,CAAC,CACR,CAAC;gBACF,OAAO,GAAG,CAAC,IAAI,CAAC;YAClB,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,SAAiB;QAsB7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBAC/C,IAAI,CAAC,KAAK,CACR;wDAC4C,EAC5C,CAAC,SAAS,CAAC,CACZ;oBACD,IAAI,CAAC,KAAK,CACR;yFAC6E,EAC7E,CAAC,SAAS,CAAC,CACZ;iBACF,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;oBACnC,KAAK,EAAE,QAAQ,CAAC,IAAI;iBACrB,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface DashboardConfig {
|
|
2
|
+
/** Port for the dashboard server (default: 4001) */
|
|
3
|
+
port: number;
|
|
4
|
+
/** Host to bind (default: 0.0.0.0) */
|
|
5
|
+
host: string;
|
|
6
|
+
/** Registry URL for agent discovery */
|
|
7
|
+
registryUrl: string;
|
|
8
|
+
/** Shared secret for agent API calls */
|
|
9
|
+
sharedSecret: string;
|
|
10
|
+
/** RabbitMQ management API URL (default: http://localhost:15672) */
|
|
11
|
+
rabbitMgmtUrl?: string;
|
|
12
|
+
/** RabbitMQ management credentials */
|
|
13
|
+
rabbitUser?: string;
|
|
14
|
+
rabbitPass?: string;
|
|
15
|
+
/** PostgreSQL connection for direct memory queries */
|
|
16
|
+
postgresUrl?: string;
|
|
17
|
+
/** Postgres schema holding memory tables (default: public) */
|
|
18
|
+
memorySchema?: string;
|
|
19
|
+
/** Auto-refresh interval in seconds for the UI (default: 10) */
|
|
20
|
+
refreshIntervalS?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Direct agent URLs — bypass registry and poll agents directly.
|
|
23
|
+
* Comma-separated list: http://localhost:3010,http://localhost:3011,http://localhost:3012
|
|
24
|
+
*/
|
|
25
|
+
agentUrls?: string[];
|
|
26
|
+
/** Base directory for resolving browser recording screenshot paths */
|
|
27
|
+
browserRecordingsDir?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Access token required for all dashboard requests (DASHBOARD_TOKEN).
|
|
30
|
+
* Sent as `Authorization: Bearer <token>` or `?token=<token>` (the latter
|
|
31
|
+
* sets a session cookie for browser use). When unset, the dashboard is
|
|
32
|
+
* open — only acceptable on trusted networks.
|
|
33
|
+
*/
|
|
34
|
+
accessToken?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function loadConfig(): DashboardConfig;
|
|
37
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,IAAI,eAAe,CAkB5C"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function loadConfig() {
|
|
2
|
+
return {
|
|
3
|
+
port: parseInt(process.env.DASHBOARD_PORT ?? '4001', 10),
|
|
4
|
+
host: process.env.DASHBOARD_HOST ?? '0.0.0.0',
|
|
5
|
+
registryUrl: process.env.REGISTRY_URL ?? 'http://localhost:4000',
|
|
6
|
+
sharedSecret: process.env.SHARED_SECRET ?? 'dev-secret',
|
|
7
|
+
rabbitMgmtUrl: process.env.RABBITMQ_MGMT_URL ?? 'http://localhost:15672',
|
|
8
|
+
rabbitUser: process.env.RABBITMQ_USER ?? 'guest',
|
|
9
|
+
rabbitPass: process.env.RABBITMQ_PASS ?? 'guest',
|
|
10
|
+
postgresUrl: process.env.POSTGRES_URL ?? process.env.DATABASE_URL,
|
|
11
|
+
memorySchema: process.env.MEMORY_SCHEMA,
|
|
12
|
+
refreshIntervalS: parseInt(process.env.DASHBOARD_REFRESH_INTERVAL ?? '10', 10),
|
|
13
|
+
agentUrls: process.env.DASHBOARD_AGENT_URLS
|
|
14
|
+
? process.env.DASHBOARD_AGENT_URLS.split(',').map((u) => u.trim()).filter(Boolean)
|
|
15
|
+
: undefined,
|
|
16
|
+
browserRecordingsDir: process.env.BROWSER_RECORDINGS_DIR,
|
|
17
|
+
accessToken: process.env.DASHBOARD_TOKEN,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,EAAE,EAAE,CAAC;QACxD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS;QAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uBAAuB;QAChE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,YAAY;QACvD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,wBAAwB;QACxE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO;QAChD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO;QAChD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QACjE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QACvC,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,IAAI,EAAE,EAAE,CAAC;QAC9E,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACzC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAClF,CAAC,CAAC,SAAS;QACb,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;QACxD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;KACzC,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|