@j0hanz/fetch-url-mcp 1.12.7 → 1.12.8

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.
Files changed (145) hide show
  1. package/dist/http/auth.d.ts +2 -2
  2. package/dist/http/auth.d.ts.map +1 -1
  3. package/dist/http/auth.js +4 -5
  4. package/dist/http/index.d.ts +6 -0
  5. package/dist/http/index.d.ts.map +1 -0
  6. package/dist/http/index.js +5 -0
  7. package/dist/http/native.d.ts +73 -0
  8. package/dist/http/native.d.ts.map +1 -1
  9. package/dist/http/native.js +554 -10
  10. package/dist/http/rate-limit.d.ts +1 -1
  11. package/dist/http/rate-limit.d.ts.map +1 -1
  12. package/dist/http/rate-limit.js +3 -4
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +67 -6
  16. package/dist/lib/config.js +2 -2
  17. package/dist/lib/core.d.ts +56 -4
  18. package/dist/lib/core.d.ts.map +1 -1
  19. package/dist/lib/core.js +155 -4
  20. package/dist/lib/error/classes.d.ts +19 -0
  21. package/dist/lib/error/classes.d.ts.map +1 -0
  22. package/dist/lib/error/classes.js +107 -0
  23. package/dist/lib/error/classify.d.ts +4 -0
  24. package/dist/lib/error/classify.d.ts.map +1 -0
  25. package/dist/lib/error/classify.js +154 -0
  26. package/dist/lib/error/codes.d.ts +23 -0
  27. package/dist/lib/error/codes.d.ts.map +1 -0
  28. package/dist/lib/error/codes.js +22 -0
  29. package/dist/lib/error/index.d.ts +6 -0
  30. package/dist/lib/error/index.d.ts.map +1 -0
  31. package/dist/lib/error/index.js +5 -0
  32. package/dist/lib/{error-messages.d.ts → error/messages.d.ts} +2 -2
  33. package/dist/lib/error/messages.d.ts.map +1 -0
  34. package/dist/lib/{error-messages.js → error/messages.js} +2 -2
  35. package/dist/lib/{tool-errors.d.ts → error/payload.d.ts} +7 -13
  36. package/dist/lib/error/payload.d.ts.map +1 -0
  37. package/dist/lib/error/payload.js +108 -0
  38. package/dist/lib/mcp-interop.d.ts.map +1 -1
  39. package/dist/lib/mcp-interop.js +4 -6
  40. package/dist/lib/net/http.d.ts.map +1 -0
  41. package/dist/lib/{http.js → net/http.js} +4 -7
  42. package/dist/lib/net/index.d.ts +4 -0
  43. package/dist/lib/net/index.d.ts.map +1 -0
  44. package/dist/lib/net/index.js +3 -0
  45. package/dist/lib/{fetch-pipeline.d.ts → net/pipeline.d.ts} +3 -3
  46. package/dist/lib/net/pipeline.d.ts.map +1 -0
  47. package/dist/lib/{fetch-pipeline.js → net/pipeline.js} +3 -5
  48. package/dist/lib/{url.d.ts → net/url.d.ts} +1 -1
  49. package/dist/lib/net/url.d.ts.map +1 -0
  50. package/dist/lib/{url.js → net/url.js} +3 -5
  51. package/dist/lib/utils.d.ts +2 -18
  52. package/dist/lib/utils.d.ts.map +1 -1
  53. package/dist/lib/utils.js +29 -104
  54. package/dist/resources/index.d.ts.map +1 -1
  55. package/dist/resources/index.js +8 -5
  56. package/dist/schemas.d.ts +1 -1
  57. package/dist/server.d.ts.map +1 -1
  58. package/dist/server.js +7 -9
  59. package/dist/tasks/index.d.ts +2 -0
  60. package/dist/tasks/index.d.ts.map +1 -0
  61. package/dist/tasks/index.js +1 -0
  62. package/dist/tasks/manager.d.ts +123 -1
  63. package/dist/tasks/manager.d.ts.map +1 -1
  64. package/dist/tasks/manager.js +745 -10
  65. package/dist/tools/{fetch-url.d.ts → index.d.ts} +4 -5
  66. package/dist/tools/index.d.ts.map +1 -0
  67. package/dist/tools/{fetch-url.js → index.js} +6 -8
  68. package/dist/transform/index.d.ts +279 -0
  69. package/dist/transform/index.d.ts.map +1 -0
  70. package/dist/transform/index.js +5234 -0
  71. package/package.json +2 -2
  72. package/dist/cli.d.ts +0 -19
  73. package/dist/cli.d.ts.map +0 -1
  74. package/dist/cli.js +0 -65
  75. package/dist/http/health.d.ts +0 -8
  76. package/dist/http/health.d.ts.map +0 -1
  77. package/dist/http/health.js +0 -152
  78. package/dist/http/helpers.d.ts +0 -68
  79. package/dist/http/helpers.d.ts.map +0 -1
  80. package/dist/http/helpers.js +0 -402
  81. package/dist/lib/error-codes.d.ts +0 -13
  82. package/dist/lib/error-codes.d.ts.map +0 -1
  83. package/dist/lib/error-codes.js +0 -12
  84. package/dist/lib/error-messages.d.ts.map +0 -1
  85. package/dist/lib/fetch-pipeline.d.ts.map +0 -1
  86. package/dist/lib/http.d.ts.map +0 -1
  87. package/dist/lib/logger-names.d.ts +0 -16
  88. package/dist/lib/logger-names.d.ts.map +0 -1
  89. package/dist/lib/logger-names.js +0 -15
  90. package/dist/lib/session.d.ts +0 -44
  91. package/dist/lib/session.d.ts.map +0 -1
  92. package/dist/lib/session.js +0 -137
  93. package/dist/lib/tool-errors.d.ts.map +0 -1
  94. package/dist/lib/tool-errors.js +0 -253
  95. package/dist/lib/url.d.ts.map +0 -1
  96. package/dist/lib/zod.d.ts +0 -3
  97. package/dist/lib/zod.d.ts.map +0 -1
  98. package/dist/lib/zod.js +0 -27
  99. package/dist/tasks/call-contract.d.ts +0 -25
  100. package/dist/tasks/call-contract.d.ts.map +0 -1
  101. package/dist/tasks/call-contract.js +0 -59
  102. package/dist/tasks/execution.d.ts +0 -16
  103. package/dist/tasks/execution.d.ts.map +0 -1
  104. package/dist/tasks/execution.js +0 -241
  105. package/dist/tasks/handlers.d.ts +0 -11
  106. package/dist/tasks/handlers.d.ts.map +0 -1
  107. package/dist/tasks/handlers.js +0 -157
  108. package/dist/tasks/owner.d.ts +0 -43
  109. package/dist/tasks/owner.d.ts.map +0 -1
  110. package/dist/tasks/owner.js +0 -144
  111. package/dist/tasks/registry.d.ts +0 -20
  112. package/dist/tasks/registry.d.ts.map +0 -1
  113. package/dist/tasks/registry.js +0 -40
  114. package/dist/tasks/waiters.d.ts +0 -27
  115. package/dist/tasks/waiters.d.ts.map +0 -1
  116. package/dist/tasks/waiters.js +0 -114
  117. package/dist/tools/fetch-url.d.ts.map +0 -1
  118. package/dist/transform/dom-prep.d.ts +0 -16
  119. package/dist/transform/dom-prep.d.ts.map +0 -1
  120. package/dist/transform/dom-prep.js +0 -1287
  121. package/dist/transform/html-translators.d.ts +0 -5
  122. package/dist/transform/html-translators.d.ts.map +0 -1
  123. package/dist/transform/html-translators.js +0 -697
  124. package/dist/transform/markdown-cleanup.d.ts +0 -10
  125. package/dist/transform/markdown-cleanup.d.ts.map +0 -1
  126. package/dist/transform/markdown-cleanup.js +0 -542
  127. package/dist/transform/metadata.d.ts +0 -18
  128. package/dist/transform/metadata.d.ts.map +0 -1
  129. package/dist/transform/metadata.js +0 -462
  130. package/dist/transform/next-flight.d.ts +0 -2
  131. package/dist/transform/next-flight.d.ts.map +0 -1
  132. package/dist/transform/next-flight.js +0 -374
  133. package/dist/transform/shared.d.ts +0 -8
  134. package/dist/transform/shared.d.ts.map +0 -1
  135. package/dist/transform/shared.js +0 -137
  136. package/dist/transform/transform.d.ts +0 -38
  137. package/dist/transform/transform.d.ts.map +0 -1
  138. package/dist/transform/transform.js +0 -1042
  139. package/dist/transform/types.d.ts +0 -124
  140. package/dist/transform/types.d.ts.map +0 -1
  141. package/dist/transform/types.js +0 -5
  142. package/dist/transform/worker-pool.d.ts +0 -76
  143. package/dist/transform/worker-pool.d.ts.map +0 -1
  144. package/dist/transform/worker-pool.js +0 -725
  145. /package/dist/lib/{http.d.ts → net/http.d.ts} +0 -0
@@ -1,402 +0,0 @@
1
- import { Writable } from 'node:stream';
2
- import { pipeline } from 'node:stream/promises';
3
- import { composeCloseHandlers, config, logWarn } from '../lib/core.js';
4
- import { resolveMcpSessionIdByServer, unregisterMcpSessionServer, unregisterMcpSessionServerByServer, } from '../lib/core.js';
5
- import { Loggers } from '../lib/logger-names.js';
6
- import { createDefaultBlockList, normalizeIpForBlockList } from '../lib/url.js';
7
- import { getErrorMessage, toError } from '../lib/utils.js';
8
- function abortControllerBestEffort(controller) {
9
- if (!controller.signal.aborted)
10
- controller.abort();
11
- }
12
- function destroyRequestBestEffort(req) {
13
- try {
14
- req.destroy();
15
- }
16
- catch {
17
- // Best-effort only.
18
- }
19
- }
20
- // ---------------------------------------------------------------------------
21
- // Response helpers
22
- // ---------------------------------------------------------------------------
23
- function setNoStoreHeaders(res) {
24
- res.setHeader('X-Content-Type-Options', 'nosniff');
25
- res.setHeader('Cache-Control', 'no-store');
26
- }
27
- export function sendJson(res, status, body) {
28
- res.statusCode = status;
29
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
30
- setNoStoreHeaders(res);
31
- res.end(JSON.stringify(body));
32
- }
33
- export function sendEmpty(res, status) {
34
- res.statusCode = status;
35
- res.setHeader('Content-Length', '0');
36
- res.end();
37
- }
38
- export function sendError(res, _code, message, status = 400,
39
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
- _id = null) {
41
- sendJson(res, status, { error: message });
42
- }
43
- // ---------------------------------------------------------------------------
44
- // Request helpers
45
- // ---------------------------------------------------------------------------
46
- export function getHeaderValue(req, name) {
47
- const val = req.headers[name];
48
- if (!val)
49
- return null;
50
- return Array.isArray(val) ? (val[0] ?? null) : val;
51
- }
52
- export function getMcpSessionId(req) {
53
- return (getHeaderValue(req, 'mcp-session-id') ??
54
- getHeaderValue(req, 'x-mcp-session-id'));
55
- }
56
- const SINGLE_VALUE_HEADER_NAMES = [
57
- 'authorization',
58
- 'x-api-key',
59
- 'host',
60
- 'origin',
61
- 'content-length',
62
- 'mcp-protocol-version',
63
- 'mcp-session-id',
64
- 'x-mcp-session-id',
65
- ];
66
- function hasDuplicateHeader(req, name) {
67
- const values = req.headersDistinct[name];
68
- return Array.isArray(values) && values.length > 1;
69
- }
70
- export function findDuplicateSingleValueHeader(req) {
71
- for (const name of SINGLE_VALUE_HEADER_NAMES) {
72
- if (hasDuplicateHeader(req, name))
73
- return name;
74
- }
75
- return null;
76
- }
77
- export function drainRequest(req) {
78
- if (req.readableEnded)
79
- return;
80
- try {
81
- req.resume();
82
- }
83
- catch {
84
- // Best-effort only.
85
- }
86
- }
87
- // ---------------------------------------------------------------------------
88
- // Request abort signal
89
- // ---------------------------------------------------------------------------
90
- export function createRequestAbortSignal(req) {
91
- const controller = new AbortController();
92
- let cleanedUp = false;
93
- const abortRequest = () => {
94
- if (cleanedUp)
95
- return;
96
- abortControllerBestEffort(controller);
97
- };
98
- if (req.destroyed) {
99
- abortRequest();
100
- return {
101
- signal: controller.signal,
102
- cleanup: () => {
103
- cleanedUp = true;
104
- },
105
- };
106
- }
107
- const onClose = () => {
108
- // A normal close after a complete body should not be treated as cancellation.
109
- if (req.complete)
110
- return;
111
- abortRequest();
112
- };
113
- const onError = () => {
114
- abortRequest();
115
- };
116
- req.once('close', onClose);
117
- req.once('error', onError);
118
- return {
119
- signal: controller.signal,
120
- cleanup: () => {
121
- cleanedUp = true;
122
- req.removeListener('close', onClose);
123
- req.removeListener('error', onError);
124
- },
125
- };
126
- }
127
- // ---------------------------------------------------------------------------
128
- // IP & connection helpers
129
- // ---------------------------------------------------------------------------
130
- function normalizeRemoteAddress(address) {
131
- if (!address)
132
- return null;
133
- const trimmed = address.trim();
134
- if (!trimmed)
135
- return null;
136
- const normalized = normalizeIpForBlockList(trimmed);
137
- if (normalized)
138
- return normalized.ip;
139
- return trimmed;
140
- }
141
- export function registerInboundBlockList(server) {
142
- if (!config.server.http.blockPrivateConnections)
143
- return;
144
- const blockList = createDefaultBlockList();
145
- server.on('connection', (socket) => {
146
- const raw = socket.remoteAddress?.trim();
147
- if (!raw)
148
- return;
149
- const normalized = normalizeIpForBlockList(raw);
150
- if (!normalized)
151
- return;
152
- if (blockList.check(normalized.ip, normalized.family)) {
153
- logWarn('Blocked inbound connection', {
154
- remoteAddress: normalized.ip,
155
- family: normalized.family,
156
- }, Loggers.LOG_HTTP);
157
- socket.destroy();
158
- }
159
- });
160
- }
161
- // ---------------------------------------------------------------------------
162
- // Request context builder
163
- // ---------------------------------------------------------------------------
164
- export function buildRequestContext(req, res, signal) {
165
- const url = URL.parse(req.url ?? '', 'http://localhost');
166
- if (!url) {
167
- sendJson(res, 400, { error: 'Invalid request URL' });
168
- return null;
169
- }
170
- return {
171
- req,
172
- res,
173
- url,
174
- method: req.method,
175
- ip: normalizeRemoteAddress(req.socket.remoteAddress),
176
- body: undefined,
177
- ...(signal ? { signal } : {}),
178
- };
179
- }
180
- // ---------------------------------------------------------------------------
181
- // Transport / MCP helpers
182
- // ---------------------------------------------------------------------------
183
- export async function closeTransportBestEffort(transport, context) {
184
- try {
185
- await transport.close();
186
- }
187
- catch (error) {
188
- logWarn('Transport close failed', { context, error }, Loggers.LOG_HTTP);
189
- }
190
- }
191
- export async function closeMcpServerBestEffort(server, context) {
192
- try {
193
- await server.close();
194
- }
195
- catch (error) {
196
- logWarn('MCP server close failed', { context, error }, Loggers.LOG_HTTP);
197
- }
198
- }
199
- export function createTransportAdapter(transportImpl) {
200
- const noopOnClose = () => { };
201
- const noopOnError = () => { };
202
- const noopOnMessage = () => { };
203
- const baseOnClose = transportImpl.onclose;
204
- let oncloseHandler = noopOnClose;
205
- let onerrorHandler = noopOnError;
206
- let onmessageHandler = noopOnMessage;
207
- return {
208
- start: () => transportImpl.start(),
209
- send: (message, options) => transportImpl.send(message, options),
210
- close: () => transportImpl.close(),
211
- get onclose() {
212
- return oncloseHandler;
213
- },
214
- set onclose(handler) {
215
- oncloseHandler = handler;
216
- transportImpl.onclose = composeCloseHandlers(baseOnClose, handler);
217
- },
218
- get onerror() {
219
- return onerrorHandler;
220
- },
221
- set onerror(handler) {
222
- onerrorHandler = handler;
223
- transportImpl.onerror = handler;
224
- },
225
- get onmessage() {
226
- return onmessageHandler;
227
- },
228
- set onmessage(handler) {
229
- onmessageHandler = handler;
230
- transportImpl.onmessage = handler;
231
- },
232
- };
233
- }
234
- export class JsonBodyError extends Error {
235
- kind;
236
- constructor(kind, message) {
237
- super(message);
238
- this.name = 'JsonBodyError';
239
- this.kind = kind;
240
- }
241
- }
242
- export function isJsonBodyError(error) {
243
- return error instanceof JsonBodyError;
244
- }
245
- export const DEFAULT_BODY_LIMIT_BYTES = 1024 * 1024;
246
- function isRequestReadAborted(req) {
247
- return req.destroyed && !req.complete;
248
- }
249
- class JsonBodyReader {
250
- async read(req, limit = DEFAULT_BODY_LIMIT_BYTES, signal) {
251
- const contentType = getHeaderValue(req, 'content-type');
252
- if (!contentType?.includes('application/json'))
253
- return undefined;
254
- const contentLengthHeader = getHeaderValue(req, 'content-length');
255
- if (contentLengthHeader) {
256
- const contentLength = Number.parseInt(contentLengthHeader, 10);
257
- if (Number.isFinite(contentLength) && contentLength > limit) {
258
- const error = new JsonBodyError('payload-too-large', 'Payload too large');
259
- throw error;
260
- }
261
- }
262
- if (signal?.aborted || isRequestReadAborted(req)) {
263
- const error = new JsonBodyError('read-failed', 'Request aborted');
264
- throw error;
265
- }
266
- const body = await this.readBody(req, limit, signal);
267
- if (!body)
268
- return undefined;
269
- try {
270
- return JSON.parse(body);
271
- }
272
- catch (err) {
273
- const error = new JsonBodyError('invalid-json', getErrorMessage(err));
274
- throw error;
275
- }
276
- }
277
- async readBody(req, limit, signal) {
278
- const abortListener = signal != null
279
- ? () => {
280
- destroyRequestBestEffort(req);
281
- }
282
- : null;
283
- if (signal != null && abortListener) {
284
- if (signal.aborted) {
285
- abortListener();
286
- }
287
- else {
288
- signal.addEventListener('abort', abortListener, { once: true });
289
- }
290
- }
291
- try {
292
- const { chunks, size } = await this.collectChunks(req, limit, signal);
293
- if (chunks.length === 0)
294
- return undefined;
295
- const combined = new Uint8Array(size);
296
- let offset = 0;
297
- for (const chunk of chunks) {
298
- combined.set(chunk, offset);
299
- offset += chunk.byteLength;
300
- }
301
- const text = new TextDecoder().decode(combined);
302
- return text;
303
- }
304
- finally {
305
- if (signal && abortListener) {
306
- try {
307
- signal.removeEventListener('abort', abortListener);
308
- }
309
- catch {
310
- // Best-effort cleanup.
311
- }
312
- }
313
- }
314
- }
315
- async collectChunks(req, limit, signal) {
316
- let size = 0;
317
- const chunks = [];
318
- const sink = new Writable({
319
- write: (chunk, _encoding, callback) => {
320
- try {
321
- if (signal?.aborted || isRequestReadAborted(req)) {
322
- callback(new JsonBodyError('read-failed', 'Request aborted'));
323
- return;
324
- }
325
- const buf = this.normalizeChunk(chunk);
326
- size += buf.byteLength;
327
- if (size > limit) {
328
- callback(new JsonBodyError('payload-too-large', 'Payload too large'));
329
- return;
330
- }
331
- chunks.push(buf);
332
- callback();
333
- }
334
- catch (err) {
335
- callback(toError(err));
336
- }
337
- },
338
- });
339
- try {
340
- if (signal?.aborted || isRequestReadAborted(req)) {
341
- const error = new JsonBodyError('read-failed', 'Request aborted');
342
- throw error;
343
- }
344
- await pipeline(req, sink, signal ? { signal } : undefined);
345
- return { chunks, size };
346
- }
347
- catch (err) {
348
- if (err instanceof JsonBodyError)
349
- throw err;
350
- if (signal?.aborted || isRequestReadAborted(req)) {
351
- const error = new JsonBodyError('read-failed', 'Request aborted');
352
- throw error;
353
- }
354
- const error = new JsonBodyError('read-failed', getErrorMessage(err));
355
- throw error;
356
- }
357
- }
358
- normalizeChunk(chunk) {
359
- if (typeof chunk === 'string') {
360
- const encoded = new TextEncoder().encode(chunk);
361
- return encoded;
362
- }
363
- return chunk;
364
- }
365
- }
366
- export const jsonBodyReader = new JsonBodyReader();
367
- function unregisterSessionTaskScope(server) {
368
- const sessionId = resolveMcpSessionIdByServer(server);
369
- if (!sessionId)
370
- return null;
371
- unregisterMcpSessionServer(sessionId);
372
- return sessionId;
373
- }
374
- async function closeSessionResources(session, options) {
375
- const closeTasks = [];
376
- if (options.closeTransportReason) {
377
- closeTasks.push(closeTransportBestEffort(session.transport, options.closeTransportReason));
378
- }
379
- if (options.closeServerReason) {
380
- closeTasks.push(closeMcpServerBestEffort(session.server, options.closeServerReason));
381
- }
382
- if (options.awaitClose && closeTasks.length > 0) {
383
- await Promise.all(closeTasks);
384
- }
385
- }
386
- export async function teardownSessionResources(session, options) {
387
- unregisterSessionTaskScope(session.server);
388
- if (options.unregisterByServer) {
389
- unregisterMcpSessionServerByServer(session.server);
390
- }
391
- await closeSessionResources(session, options);
392
- }
393
- export async function teardownUnregisteredSessionResources(session, context) {
394
- await closeSessionResources(session, {
395
- closeTransportReason: context,
396
- closeServerReason: context,
397
- awaitClose: true,
398
- });
399
- }
400
- export function teardownSessionRegistration(server) {
401
- unregisterSessionTaskScope(server);
402
- }
@@ -1,13 +0,0 @@
1
- export declare const SystemErrors: {
2
- readonly EBLOCKED: "EBLOCKED";
3
- readonly ETIMEOUT: "ETIMEOUT";
4
- readonly EINVAL: "EINVAL";
5
- readonly ENODATA: "ENODATA";
6
- readonly EBADREDIRECT: "EBADREDIRECT";
7
- readonly EUNSUPPORTEDPROTOCOL: "EUNSUPPORTEDPROTOCOL";
8
- readonly FETCH_ERROR: "FETCH_ERROR";
9
- readonly ABORTED: "ABORTED";
10
- readonly QUEUE_FULL: "queue_full";
11
- readonly VALIDATION_ERROR: "VALIDATION_ERROR";
12
- };
13
- //# sourceMappingURL=error-codes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/lib/error-codes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY;;;;;;;;;;;CAWf,CAAC"}
@@ -1,12 +0,0 @@
1
- export const SystemErrors = {
2
- EBLOCKED: 'EBLOCKED',
3
- ETIMEOUT: 'ETIMEOUT',
4
- EINVAL: 'EINVAL',
5
- ENODATA: 'ENODATA',
6
- EBADREDIRECT: 'EBADREDIRECT',
7
- EUNSUPPORTEDPROTOCOL: 'EUNSUPPORTEDPROTOCOL',
8
- FETCH_ERROR: 'FETCH_ERROR',
9
- ABORTED: 'ABORTED',
10
- QUEUE_FULL: 'queue_full',
11
- VALIDATION_ERROR: 'VALIDATION_ERROR',
12
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-messages.d.ts","sourceRoot":"","sources":["../../src/lib/error-messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIxC,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,UAAU,CAUZ;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM7D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAM7E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM5D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAM9D;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMtE;AAED,wBAAgB,oBAAoB,IAAI,UAAU,CAMjD;AAED,wBAAgB,eAAe,IAAI,UAAU,CAG5C;AAID,wBAAgB,oBAAoB,IAAI,UAAU,CAMjD;AAED,wBAAgB,wBAAwB,IAAI,UAAU,CAMrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMrE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-pipeline.d.ts","sourceRoot":"","sources":["../../src/lib/fetch-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAQrE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,CAAC;AAGtB,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAmGD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,MAAM,GAAG,SAAS,CAQpB;AAyBD,UAAU,oBAAoB,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACxE;AACD,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAC;AAmBtB,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAqD5B;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG;IAC7D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAwBF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,mBAAmB,EAC1B,KAAK,MAAM,EACX,SAAS,WAAW,KACnB,OAAO,CAAC,sBAAsB,CAchC,CAAC;AAEF,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,MAAM,KAClB,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC/D;AACD,UAAU,eAAe;IACvB,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,oBAAoB,CAAC;CAC7D;AAMD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC;IACT,QAAQ,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACjD,YAAY,EAAE,mBAAmB,CAAC;CACnC,CAAC,CAyBD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AAmBhD,OAAO,EAOL,KAAK,eAAe,EAErB,MAAM,UAAU,CAAC;AAkxClB,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoKD,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA6ND,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE/C;AACD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAEA;AACD,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AACD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAE9D;AACD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AACD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,qBAAqB,CAEvB;AACD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI,CAEN;AACD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,qBAAqB,EAC9B,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAEN;AACD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAE7D;AACD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CASzC;AACD,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AACD,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAED"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Logger names for different components of the application.
3
- */
4
- export declare const Loggers: {
5
- readonly LOG_AUTH: "auth";
6
- readonly LOG_HTTP: "http";
7
- readonly LOG_SESSION: "session";
8
- readonly LOG_SERVER: "server";
9
- readonly LOG_FETCH: "fetch";
10
- readonly LOG_TRANSFORM: "transform";
11
- readonly LOG_TASKS: "tasks";
12
- readonly LOG_RATE_LIMIT: "rate-limit";
13
- readonly LOG_MCP: "mcp";
14
- readonly LOG_FETCH_URL: "fetch-url";
15
- };
16
- //# sourceMappingURL=logger-names.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger-names.d.ts","sourceRoot":"","sources":["../../src/lib/logger-names.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;CAWV,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Logger names for different components of the application.
3
- */
4
- export const Loggers = {
5
- LOG_AUTH: 'auth',
6
- LOG_HTTP: 'http',
7
- LOG_SESSION: 'session',
8
- LOG_SERVER: 'server',
9
- LOG_FETCH: 'fetch',
10
- LOG_TRANSFORM: 'transform',
11
- LOG_TASKS: 'tasks',
12
- LOG_RATE_LIMIT: 'rate-limit',
13
- LOG_MCP: 'mcp',
14
- LOG_FETCH_URL: 'fetch-url',
15
- };
@@ -1,44 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
- export interface SessionEntry {
4
- readonly server: McpServer;
5
- readonly transport: StreamableHTTPServerTransport;
6
- createdAt: number;
7
- lastSeen: number;
8
- protocolInitialized: boolean;
9
- negotiatedProtocolVersion: string;
10
- authFingerprint: string;
11
- }
12
- export interface SessionStore {
13
- get: (sessionId: string) => SessionEntry | undefined;
14
- touch: (sessionId: string) => void;
15
- set: (sessionId: string, entry: SessionEntry) => void;
16
- remove: (sessionId: string) => SessionEntry | undefined;
17
- size: () => number;
18
- inFlight: () => number;
19
- incrementInFlight: () => void;
20
- decrementInFlight: () => void;
21
- clear: () => SessionEntry[];
22
- evictExpired: () => {
23
- id: string;
24
- entry: SessionEntry;
25
- }[];
26
- evictOldest: () => SessionEntry | undefined;
27
- }
28
- interface SlotTracker {
29
- readonly releaseSlot: () => void;
30
- readonly markInitialized: () => void;
31
- readonly isInitialized: () => boolean;
32
- }
33
- type CloseHandler = (() => void) | undefined;
34
- export declare function composeCloseHandlers(first: CloseHandler, second: CloseHandler): CloseHandler;
35
- export declare function createSessionStore(sessionTtlMs: number): SessionStore;
36
- export declare function createSlotTracker(store: SessionStore): SlotTracker;
37
- export declare function reserveSessionSlot(store: SessionStore, maxSessions: number): boolean;
38
- export declare function ensureSessionCapacity({ store, maxSessions, evictOldest, }: {
39
- store: SessionStore;
40
- maxSessions: number;
41
- evictOldest: (store: SessionStore) => boolean;
42
- }): boolean;
43
- export {};
44
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/lib/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAMxG,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;IACrD,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC;IACxD,IAAI,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,KAAK,EAAE,MAAM,YAAY,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,EAAE,CAAC;IAC1D,WAAW,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;CAC7C;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC;CACvC;AAMD,KAAK,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;AAE7C,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,GACnB,YAAY,CAWd;AA0FD,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAGrE;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,CAiBlE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAMT;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,WAAW,EACX,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC/C,GAAG,OAAO,CAUV"}
@@ -1,137 +0,0 @@
1
- export function composeCloseHandlers(first, second) {
2
- if (!first)
3
- return second;
4
- if (!second)
5
- return first;
6
- return () => {
7
- try {
8
- first();
9
- }
10
- finally {
11
- second();
12
- }
13
- };
14
- }
15
- /* -------------------------------------------------------------------------------------------------
16
- * In-memory session store
17
- * ------------------------------------------------------------------------------------------------- */
18
- class InMemorySessionStore {
19
- sessionTtlMs;
20
- sessions = new Map();
21
- inflight = 0;
22
- constructor(sessionTtlMs) {
23
- this.sessionTtlMs = sessionTtlMs;
24
- }
25
- get(sessionId) {
26
- if (sessionId.length === 0)
27
- return undefined;
28
- return this.sessions.get(sessionId);
29
- }
30
- touch(sessionId) {
31
- if (sessionId.length === 0)
32
- return;
33
- const session = this.sessions.get(sessionId);
34
- if (!session)
35
- return;
36
- session.lastSeen = Date.now();
37
- this.sessions.delete(sessionId);
38
- this.sessions.set(sessionId, session);
39
- }
40
- set(sessionId, entry) {
41
- if (sessionId.length === 0)
42
- return;
43
- this.sessions.delete(sessionId);
44
- this.sessions.set(sessionId, entry);
45
- }
46
- remove(sessionId) {
47
- if (sessionId.length === 0)
48
- return undefined;
49
- const session = this.sessions.get(sessionId);
50
- this.sessions.delete(sessionId);
51
- return session;
52
- }
53
- size() {
54
- return this.sessions.size;
55
- }
56
- inFlight() {
57
- return this.inflight;
58
- }
59
- incrementInFlight() {
60
- this.inflight += 1;
61
- }
62
- decrementInFlight() {
63
- if (this.inflight === 0)
64
- return;
65
- this.inflight -= 1;
66
- }
67
- clear() {
68
- const entries = [...this.sessions.values()];
69
- this.sessions.clear();
70
- return entries;
71
- }
72
- evictExpired() {
73
- const now = Date.now();
74
- const evicted = [];
75
- for (const [id, session] of this.sessions.entries()) {
76
- if (this.sessionTtlMs > 0 && now - session.lastSeen > this.sessionTtlMs) {
77
- this.sessions.delete(id);
78
- evicted.push({ id, entry: session });
79
- }
80
- else {
81
- break;
82
- }
83
- }
84
- return evicted;
85
- }
86
- evictOldest() {
87
- const oldest = this.sessions.keys().next();
88
- if (oldest.done)
89
- return undefined;
90
- const session = this.sessions.get(oldest.value);
91
- this.sessions.delete(oldest.value);
92
- return session;
93
- }
94
- }
95
- export function createSessionStore(sessionTtlMs) {
96
- const store = new InMemorySessionStore(sessionTtlMs);
97
- return store;
98
- }
99
- /* -------------------------------------------------------------------------------------------------
100
- * Slot tracking and capacity
101
- * ------------------------------------------------------------------------------------------------- */
102
- export function createSlotTracker(store) {
103
- let slotReleased = false;
104
- let initialized = false;
105
- return {
106
- releaseSlot() {
107
- if (slotReleased)
108
- return;
109
- slotReleased = true;
110
- store.decrementInFlight();
111
- },
112
- markInitialized() {
113
- initialized = true;
114
- },
115
- isInitialized() {
116
- return initialized;
117
- },
118
- };
119
- }
120
- export function reserveSessionSlot(store, maxSessions) {
121
- if (maxSessions <= 0)
122
- return false;
123
- if (store.size() + store.inFlight() >= maxSessions)
124
- return false;
125
- store.incrementInFlight();
126
- return true;
127
- }
128
- export function ensureSessionCapacity({ store, maxSessions, evictOldest, }) {
129
- if (maxSessions <= 0)
130
- return false;
131
- if (store.size() + store.inFlight() < maxSessions)
132
- return true;
133
- if (store.size() > 0 && evictOldest(store)) {
134
- return store.size() + store.inFlight() < maxSessions;
135
- }
136
- return false;
137
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-errors.d.ts","sourceRoot":"","sources":["../../src/lib/tool-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,oCAAoC,CAAC;AAO5C,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG;IAC/C,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAuDD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,iBAAiB,CAOnB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,gBAAgB,CAgBlB;AAiBD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CA2B9B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE1E;AA0JD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,MAAM,EACX,eAAe,SAAqB,GACnC,iBAAiB,CAInB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,iBAAiB,CA0CnB"}