@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.
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}