mcp-dashboards 2.0.1 → 2.2.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,9 @@
1
+ export declare const TEMP_DIR: string;
2
+ export declare const CHART_FILENAME_RE: RegExp;
3
+ export declare function evictChartFromCache(id: string): boolean;
4
+ export interface PreviewUrls {
5
+ httpUrl: string;
6
+ fileUrl: string;
7
+ }
8
+ export declare function getPreviewUrls(data: any): Promise<PreviewUrls | null>;
9
+ //# sourceMappingURL=preview-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-server.d.ts","sourceRoot":"","sources":["../preview-server.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,QAAQ,QAA2C,CAAC;AACjE,eAAO,MAAM,iBAAiB,QAA+B,CAAC;AAkD9D,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvD;AA0GD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB3E"}
@@ -0,0 +1,174 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import http from "node:http";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { fileURLToPath, pathToFileURL } from "node:url";
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const DIST_DIR = __filename.endsWith(".ts") ? path.join(__dirname, "dist") : __dirname;
10
+ export const TEMP_DIR = path.join(os.tmpdir(), "mcp-dashboards");
11
+ export const CHART_FILENAME_RE = /^chart-[a-f0-9]{12}\.html$/;
12
+ const MAX_CHARTS_IN_MEMORY = 50;
13
+ const DEFAULT_RETAIN_DAYS = 7;
14
+ const chartStore = new Map();
15
+ let cachedHtml = null;
16
+ let httpServer = null;
17
+ let serverPort = null;
18
+ let cleanupDone = false;
19
+ async function loadHtml() {
20
+ if (cachedHtml)
21
+ return cachedHtml;
22
+ const htmlPath = path.join(DIST_DIR, "mcp-app.html");
23
+ cachedHtml = await fs.readFile(htmlPath, "utf-8");
24
+ return cachedHtml;
25
+ }
26
+ function injectChartData(html, data) {
27
+ // Escape </ in the JSON payload so chart data containing the literal string
28
+ // "</script>" cannot prematurely terminate the inline <script> block below.
29
+ const payload = JSON.stringify(data).replace(/<\//g, "<\\/");
30
+ return html.replace("</head>", `<script>window.__CHART_DATA__=${payload};</script></head>`);
31
+ }
32
+ function getRetainDays() {
33
+ const raw = process.env.MCP_DASHBOARDS_RETAIN_DAYS;
34
+ if (raw === undefined)
35
+ return DEFAULT_RETAIN_DAYS;
36
+ const n = Number.parseInt(raw, 10);
37
+ if (Number.isNaN(n) || n < 0)
38
+ return DEFAULT_RETAIN_DAYS;
39
+ return n;
40
+ }
41
+ function storeChart(data) {
42
+ const id = crypto.randomBytes(6).toString("hex");
43
+ chartStore.set(id, data);
44
+ // In-memory eviction only - does not touch on-disk chart files.
45
+ if (chartStore.size > MAX_CHARTS_IN_MEMORY) {
46
+ const firstKey = chartStore.keys().next().value;
47
+ if (firstKey)
48
+ chartStore.delete(firstKey);
49
+ }
50
+ return id;
51
+ }
52
+ // Remove a chart from the in-memory store so its localhost URL no longer
53
+ // resolves. Called by the delete_chart_files tool to ensure "delete" means
54
+ // "gone from both disk and memory" - otherwise the localhost URL would keep
55
+ // working from cache and confuse the user.
56
+ export function evictChartFromCache(id) {
57
+ return chartStore.delete(id);
58
+ }
59
+ // Lazy age-based cleanup. Runs once per server lifetime on first preview
60
+ // request. Only touches files in our own temp subfolder matching the strict
61
+ // chart-{hex}.html pattern. Anything else (including unrelated files a user
62
+ // might park in /tmp/mcp-dashboards) is left alone.
63
+ async function cleanStaleFiles() {
64
+ if (cleanupDone)
65
+ return;
66
+ cleanupDone = true;
67
+ const retainDays = getRetainDays();
68
+ if (retainDays === 0)
69
+ return;
70
+ try {
71
+ const entries = await fs.readdir(TEMP_DIR).catch(() => []);
72
+ const cutoff = Date.now() - retainDays * 24 * 60 * 60 * 1000;
73
+ await Promise.all(entries.map(async (name) => {
74
+ if (!CHART_FILENAME_RE.test(name))
75
+ return;
76
+ const full = path.join(TEMP_DIR, name);
77
+ try {
78
+ const stat = await fs.stat(full);
79
+ if (stat.mtimeMs < cutoff) {
80
+ await fs.unlink(full);
81
+ }
82
+ }
83
+ catch { /* locked file, permission error, etc - skip */ }
84
+ }));
85
+ }
86
+ catch (err) {
87
+ process.stderr.write(`[mcp-dashboards] Cleanup skipped: ${err instanceof Error ? err.message : String(err)}\n`);
88
+ }
89
+ }
90
+ // Lazy-init a tiny same-machine HTTP server on a random port. Its only job is
91
+ // to serve the in-memory chart HTML so Claude Code can render a clickable link
92
+ // (http:// is the only URL scheme that survives Claude Code's react-markdown
93
+ // link stripping - file://, vscode://, command:// are all stripped).
94
+ async function ensurePreviewServer() {
95
+ if (serverPort !== null)
96
+ return serverPort;
97
+ return new Promise((resolve, reject) => {
98
+ const server = http.createServer(async (req, res) => {
99
+ try {
100
+ if (!req.url) {
101
+ res.writeHead(404);
102
+ res.end("Not Found");
103
+ return;
104
+ }
105
+ const match = req.url.match(/^\/chart\/([a-f0-9]+)/);
106
+ if (!match) {
107
+ res.writeHead(404);
108
+ res.end("Not Found");
109
+ return;
110
+ }
111
+ const data = chartStore.get(match[1]);
112
+ if (!data) {
113
+ res.writeHead(404, { "Content-Type": "text/html" });
114
+ res.end("<h1>Chart not found</h1><p>It may have been evicted or never existed.</p>");
115
+ return;
116
+ }
117
+ const html = await loadHtml();
118
+ const injected = injectChartData(html, data);
119
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
120
+ res.end(injected);
121
+ }
122
+ catch (err) {
123
+ // Log full error server-side for debugging, return generic message to the
124
+ // client. Even though we bind to 127.0.0.1, err.message can leak absolute
125
+ // filesystem paths and other internal details to anything that can reach
126
+ // the loopback (e.g. browser JS in the same machine).
127
+ process.stderr.write(`[mcp-dashboards] preview-server error: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
128
+ res.writeHead(500);
129
+ res.end("Internal server error");
130
+ }
131
+ });
132
+ server.listen(0, "127.0.0.1", () => {
133
+ const addr = server.address();
134
+ if (typeof addr === "object" && addr) {
135
+ serverPort = addr.port;
136
+ httpServer = server;
137
+ process.stderr.write(`[mcp-dashboards] Preview server ready at http://localhost:${serverPort}\n`);
138
+ process.on("exit", () => server.close());
139
+ resolve(serverPort);
140
+ }
141
+ else {
142
+ reject(new Error("Failed to bind preview server"));
143
+ }
144
+ });
145
+ server.on("error", reject);
146
+ });
147
+ }
148
+ async function writeChartHtml(id, data) {
149
+ await fs.mkdir(TEMP_DIR, { recursive: true });
150
+ const filePath = path.join(TEMP_DIR, `chart-${id}.html`);
151
+ const html = await loadHtml();
152
+ const injected = injectChartData(html, data);
153
+ await fs.writeFile(filePath, injected, "utf-8");
154
+ return pathToFileURL(filePath).href;
155
+ }
156
+ export async function getPreviewUrls(data) {
157
+ if (process.env.MCP_DASHBOARDS_DISABLE_PREVIEW === "1")
158
+ return null;
159
+ cleanStaleFiles().catch(() => { });
160
+ try {
161
+ const id = storeChart(data);
162
+ const port = await ensurePreviewServer();
163
+ const fileUrl = await writeChartHtml(id, data);
164
+ return {
165
+ httpUrl: `http://localhost:${port}/chart/${id}`,
166
+ fileUrl,
167
+ };
168
+ }
169
+ catch (err) {
170
+ process.stderr.write(`[mcp-dashboards] Preview unavailable: ${err instanceof Error ? err.message : String(err)}\n`);
171
+ return null;
172
+ }
173
+ }
174
+ //# sourceMappingURL=preview-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-server.js","sourceRoot":"","sources":["../preview-server.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEvF,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAC9D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAe,CAAC;AAC1C,IAAI,UAAU,GAAkB,IAAI,CAAC;AACrC,IAAI,UAAU,GAAuB,IAAI,CAAC;AAC1C,IAAI,UAAU,GAAkB,IAAI,CAAC;AACrC,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,KAAK,UAAU,QAAQ;IACrB,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrD,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAAS;IAC9C,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,OAAO,CACjB,SAAS,EACT,iCAAiC,OAAO,mBAAmB,CAC5D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACnD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,mBAAmB,CAAC;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACzD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,IAAS;IAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzB,gEAAgE;IAChE,IAAI,UAAU,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,QAAQ;YAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,yEAAyE;AACzE,2EAA2E;AAC3E,4EAA4E;AAC5E,2CAA2C;AAC3C,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,yEAAyE;AACzE,4EAA4E;AAC5E,4EAA4E;AAC5E,oDAAoD;AACpD,KAAK,UAAU,eAAe;IAC5B,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC7D,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;oBAC1B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,+CAA+C,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,qEAAqE;AACrE,KAAK,UAAU,mBAAmB;IAChC,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAE3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClD,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;oBACrF,OAAO;gBACT,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,0EAA0E;gBAC1E,0EAA0E;gBAC1E,yEAAyE;gBACzE,sDAAsD;gBACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC5G,CAAC;gBACF,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,UAAU,GAAG,MAAM,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,UAAU,IAAI,CAAC,CAAC;gBAClG,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,IAAS;IACjD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAS;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEpE,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAA8B,CAAC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,OAAO;YACL,OAAO,EAAE,oBAAoB,IAAI,UAAU,EAAE,EAAE;YAC/C,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yCAAyC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC9F,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoNpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAm5CxC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyQpE;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAyqDxC"}