@j0hanz/fetch-url-mcp 1.11.6 → 1.11.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.
- package/README.md +25 -33
- package/dist/http/auth.d.ts.map +1 -1
- package/dist/http/auth.js +1 -1
- package/dist/http/health.d.ts.map +1 -1
- package/dist/http/health.js +0 -2
- package/dist/http/native.d.ts.map +1 -1
- package/dist/http/native.js +0 -25
- package/dist/lib/config.d.ts +0 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -11
- package/dist/lib/core.d.ts +0 -3
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +0 -7
- package/dist/lib/fetch-pipeline.d.ts +1 -14
- package/dist/lib/fetch-pipeline.d.ts.map +1 -1
- package/dist/lib/fetch-pipeline.js +4 -149
- package/dist/lib/http.d.ts +0 -3
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +4 -108
- package/dist/lib/mcp-interop.d.ts.map +1 -1
- package/dist/lib/mcp-interop.js +13 -11
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +5 -9
- package/dist/lib/url.d.ts +1 -1
- package/dist/lib/url.d.ts.map +1 -1
- package/dist/lib/url.js +67 -82
- package/dist/lib/utils.d.ts +2 -4
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +18 -44
- package/dist/lib/zod.d.ts.map +1 -1
- package/dist/lib/zod.js +11 -17
- package/dist/resources/index.d.ts +1 -23
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +3 -294
- package/dist/schemas.d.ts +0 -14
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -77
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -2
- package/dist/tasks/execution.js +1 -1
- package/dist/tasks/manager.d.ts.map +1 -1
- package/dist/tasks/manager.js +8 -5
- package/dist/tasks/owner.d.ts.map +1 -1
- package/dist/tasks/owner.js +4 -4
- package/dist/tools/fetch-url.d.ts +0 -2
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +12 -43
- package/dist/transform/html-translators.js +7 -7
- package/dist/transform/next-flight.d.ts.map +1 -1
- package/dist/transform/next-flight.js +8 -2
- package/dist/transform/shared.js +4 -4
- package/dist/transform/transform.d.ts +1 -1
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +14 -15
- package/dist/transform/types.d.ts +2 -2
- package/dist/transform/types.d.ts.map +1 -1
- package/dist/transform/worker-pool.d.ts +3 -3
- package/dist/transform/worker-pool.d.ts.map +1 -1
- package/dist/transform/worker-pool.js +2 -2
- package/package.json +1 -1
- package/dist/lib/cache.d.ts +0 -48
- package/dist/lib/cache.d.ts.map +0 -1
- package/dist/lib/cache.js +0 -273
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { cachedPayloadValueSchema, extractedMetadataSchema, normalizeExtractedMetadata, normalizePageTitle, parseCachedPayload, stringifyCachedPayload, } from '../schemas.js';
|
|
3
1
|
import { transformBufferToMarkdown } from '../transform/transform.js';
|
|
4
2
|
import {} from '../transform/types.js';
|
|
5
|
-
import {
|
|
6
|
-
import { toCacheScopeId } from './cache.js';
|
|
7
|
-
import { config, getSessionId, logDebug, logError, logWarn } from './core.js';
|
|
3
|
+
import { config, logDebug } from './core.js';
|
|
8
4
|
import { fetchNormalizedUrlBuffer, normalizeUrl, transformToRawUrl, } from './http.js';
|
|
9
|
-
import {
|
|
5
|
+
import { withSignal } from './utils.js';
|
|
10
6
|
export { withSignal };
|
|
11
7
|
const TRUNCATION_MARKER = '...[truncated]';
|
|
12
8
|
function getOpenCodeFence(content) {
|
|
@@ -114,101 +110,6 @@ function resolveNormalizedUrl(url) {
|
|
|
114
110
|
transformed: transformedResult.transformed,
|
|
115
111
|
};
|
|
116
112
|
}
|
|
117
|
-
function logCacheMiss(reason, cacheNamespace, normalizedUrl, error) {
|
|
118
|
-
// Deserialize exceptions indicate data corruption or schema drift —
|
|
119
|
-
// use logError so they surface in monitoring, not just debug logs.
|
|
120
|
-
const log = reason === 'deserialize exception'
|
|
121
|
-
? logError
|
|
122
|
-
: reason.startsWith('deserialize')
|
|
123
|
-
? logWarn
|
|
124
|
-
: logDebug;
|
|
125
|
-
log(`Cache miss due to ${reason}`, {
|
|
126
|
-
namespace: cacheNamespace,
|
|
127
|
-
url: normalizedUrl,
|
|
128
|
-
...(error ? { error: getErrorMessage(error) } : {}),
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function attemptCacheRetrieval(cacheKey, deserialize, cacheNamespace, normalizedUrl) {
|
|
132
|
-
if (!cacheKey)
|
|
133
|
-
return null;
|
|
134
|
-
const cached = get(cacheKey, { scopeId: toCacheScopeId(getSessionId()) });
|
|
135
|
-
if (!cached)
|
|
136
|
-
return null;
|
|
137
|
-
if (!deserialize) {
|
|
138
|
-
logCacheMiss('missing deserializer', cacheNamespace, normalizedUrl);
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
let data;
|
|
142
|
-
try {
|
|
143
|
-
data = deserialize(cached.content);
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
logCacheMiss('deserialize exception', cacheNamespace, normalizedUrl, error);
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
if (data === undefined) {
|
|
150
|
-
logCacheMiss('deserialize failure', cacheNamespace, normalizedUrl);
|
|
151
|
-
return null;
|
|
152
|
-
}
|
|
153
|
-
logDebug('Cache hit', { namespace: cacheNamespace, url: normalizedUrl });
|
|
154
|
-
const finalUrl = cached.url !== normalizedUrl ? cached.url : undefined;
|
|
155
|
-
return {
|
|
156
|
-
data,
|
|
157
|
-
fromCache: true,
|
|
158
|
-
url: normalizedUrl,
|
|
159
|
-
...(finalUrl ? { finalUrl } : {}),
|
|
160
|
-
fetchedAt: cached.fetchedAt,
|
|
161
|
-
cacheKey,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
function restoreCachedPipelineResult(options, resolvedUrl, cacheKey) {
|
|
165
|
-
if (options.forceRefresh)
|
|
166
|
-
return null;
|
|
167
|
-
options.onStage?.('check_cache');
|
|
168
|
-
const cachedResult = attemptCacheRetrieval(cacheKey, options.deserialize, options.cacheNamespace, resolvedUrl.normalizedUrl);
|
|
169
|
-
if (!cachedResult)
|
|
170
|
-
return null;
|
|
171
|
-
options.onStage?.('cache_hit');
|
|
172
|
-
options.onStage?.('cache_restore');
|
|
173
|
-
return { ...cachedResult, originalUrl: resolvedUrl.originalUrl };
|
|
174
|
-
}
|
|
175
|
-
function persistCacheEntry(cacheKey, data, serialize, normalizedUrl, cacheNamespace) {
|
|
176
|
-
const serializer = serialize ?? JSON.stringify;
|
|
177
|
-
const dataRecord = isObject(data)
|
|
178
|
-
? data
|
|
179
|
-
: undefined;
|
|
180
|
-
const title = typeof dataRecord?.title === 'string' ? dataRecord.title : undefined;
|
|
181
|
-
const metadata = {
|
|
182
|
-
url: normalizedUrl,
|
|
183
|
-
scopeIds: [toCacheScopeId(getSessionId())],
|
|
184
|
-
...(title === undefined ? {} : { title }),
|
|
185
|
-
};
|
|
186
|
-
try {
|
|
187
|
-
set(cacheKey, serializer(data), metadata);
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
logWarn('Failed to persist cache entry', {
|
|
191
|
-
namespace: cacheNamespace,
|
|
192
|
-
url: normalizedUrl,
|
|
193
|
-
error: getErrorMessage(error),
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
function persistCacheTargets(requestedUrl, finalUrl, cacheKey, data, options) {
|
|
198
|
-
if (!cacheKey)
|
|
199
|
-
return;
|
|
200
|
-
const targets = new Map();
|
|
201
|
-
targets.set(cacheKey, finalUrl ?? requestedUrl);
|
|
202
|
-
if (finalUrl && finalUrl !== requestedUrl) {
|
|
203
|
-
const finalCacheKey = createCacheKey(options.cacheNamespace, finalUrl, options.cacheVary);
|
|
204
|
-
if (finalCacheKey) {
|
|
205
|
-
targets.set(finalCacheKey, finalUrl);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
for (const [key, url] of targets) {
|
|
209
|
-
persistCacheEntry(key, data, options.serialize, url, options.cacheNamespace);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
113
|
export async function executeFetchPipeline(options) {
|
|
213
114
|
options.onStage?.('resolve_url');
|
|
214
115
|
const resolvedUrl = resolveNormalizedUrl(options.url);
|
|
@@ -217,10 +118,6 @@ export async function executeFetchPipeline(options) {
|
|
|
217
118
|
original: resolvedUrl.originalUrl,
|
|
218
119
|
});
|
|
219
120
|
}
|
|
220
|
-
const cacheKey = createCacheKey(options.cacheNamespace, resolvedUrl.normalizedUrl, options.cacheVary);
|
|
221
|
-
const cachedResult = restoreCachedPipelineResult(options, resolvedUrl, cacheKey);
|
|
222
|
-
if (cachedResult)
|
|
223
|
-
return cachedResult;
|
|
224
121
|
options.onStage?.('fetch_remote');
|
|
225
122
|
logDebug('Fetching URL', { url: resolvedUrl.normalizedUrl });
|
|
226
123
|
const { buffer, encoding, truncated, finalUrl } = await fetchNormalizedUrlBuffer(resolvedUrl.normalizedUrl, withSignal(options.signal));
|
|
@@ -228,26 +125,14 @@ export async function executeFetchPipeline(options) {
|
|
|
228
125
|
options.onStage?.('transform_start');
|
|
229
126
|
const resolvedFinalUrl = finalUrl || resolvedUrl.normalizedUrl;
|
|
230
127
|
const data = await options.transform({ buffer, encoding, ...(truncated ? { truncated: true } : {}) }, resolvedFinalUrl);
|
|
231
|
-
if (isEnabled()) {
|
|
232
|
-
persistCacheTargets(resolvedUrl.normalizedUrl, finalUrl, cacheKey, data, options);
|
|
233
|
-
}
|
|
234
128
|
return {
|
|
235
129
|
data,
|
|
236
|
-
fromCache: false,
|
|
237
130
|
url: resolvedUrl.normalizedUrl,
|
|
238
131
|
originalUrl: resolvedUrl.originalUrl,
|
|
239
132
|
...(finalUrl ? { finalUrl } : {}),
|
|
240
133
|
fetchedAt: new Date().toISOString(),
|
|
241
|
-
cacheKey,
|
|
242
134
|
};
|
|
243
135
|
}
|
|
244
|
-
const markdownPipelineResultSchema = z.strictObject({
|
|
245
|
-
markdown: z.string(),
|
|
246
|
-
content: z.string(),
|
|
247
|
-
title: z.union([z.string(), z.undefined()]),
|
|
248
|
-
metadata: extractedMetadataSchema.optional(),
|
|
249
|
-
truncated: z.boolean(),
|
|
250
|
-
});
|
|
251
136
|
function createMarkdownPipelineResult({ markdown: rawMarkdown, title, metadata, truncated, }) {
|
|
252
137
|
const markdown = normalizeMarkdownForTruncation(rawMarkdown, truncated);
|
|
253
138
|
return {
|
|
@@ -258,33 +143,9 @@ function createMarkdownPipelineResult({ markdown: rawMarkdown, title, metadata,
|
|
|
258
143
|
truncated,
|
|
259
144
|
};
|
|
260
145
|
}
|
|
261
|
-
const markdownPipelineCacheCodec = z.codec(cachedPayloadValueSchema, markdownPipelineResultSchema, {
|
|
262
|
-
decode: (payload) => createMarkdownPipelineResult({
|
|
263
|
-
markdown: payload.markdown,
|
|
264
|
-
title: payload.title,
|
|
265
|
-
metadata: payload.metadata,
|
|
266
|
-
truncated: payload.truncated ?? false,
|
|
267
|
-
}),
|
|
268
|
-
encode: (result) => {
|
|
269
|
-
const title = normalizePageTitle(result.title);
|
|
270
|
-
const metadata = normalizeExtractedMetadata(result.metadata);
|
|
271
|
-
return {
|
|
272
|
-
markdown: normalizeMarkdownForTruncation(result.markdown, result.truncated),
|
|
273
|
-
...(title !== undefined ? { title } : {}),
|
|
274
|
-
...(metadata ? { metadata } : {}),
|
|
275
|
-
truncated: result.truncated,
|
|
276
|
-
};
|
|
277
|
-
},
|
|
278
|
-
});
|
|
279
|
-
export function parseCachedMarkdownResult(cached) {
|
|
280
|
-
const payload = parseCachedPayload(cached);
|
|
281
|
-
if (!payload)
|
|
282
|
-
return undefined;
|
|
283
|
-
return z.decode(markdownPipelineCacheCodec, payload);
|
|
284
|
-
}
|
|
285
146
|
export const markdownTransform = async (input, url, signal) => {
|
|
286
147
|
const result = await transformBufferToMarkdown(input.buffer, url, {
|
|
287
|
-
|
|
148
|
+
includeMetadataFooter: true,
|
|
288
149
|
encoding: input.encoding,
|
|
289
150
|
...withSignal(signal),
|
|
290
151
|
...(input.truncated ? { inputTruncated: true } : {}),
|
|
@@ -296,14 +157,8 @@ export const markdownTransform = async (input, url, signal) => {
|
|
|
296
157
|
truncated: Boolean(result.truncated || input.truncated),
|
|
297
158
|
});
|
|
298
159
|
};
|
|
299
|
-
export function serializeMarkdownResult(result) {
|
|
300
|
-
return stringifyCachedPayload(z.encode(markdownPipelineCacheCodec, result));
|
|
301
|
-
}
|
|
302
160
|
function buildSharedFetchPipelineOptions(options) {
|
|
303
|
-
return {
|
|
304
|
-
...options,
|
|
305
|
-
cacheNamespace: 'markdown',
|
|
306
|
-
};
|
|
161
|
+
return { ...options };
|
|
307
162
|
}
|
|
308
163
|
export async function performSharedFetch(options, deps = {}) {
|
|
309
164
|
const executePipeline = deps.executeFetchPipeline ?? executeFetchPipeline;
|
package/dist/lib/http.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import { type ServerResponse } from 'node:http';
|
|
2
1
|
import { Agent } from 'undici';
|
|
3
2
|
import { type TransformResult } from './url.js';
|
|
4
|
-
export declare function generateSafeFilename(url: string, title?: string, hashFallback?: string, extension?: string): string;
|
|
5
|
-
export declare function handleDownload(res: ServerResponse, namespace: string, hash: string): void;
|
|
6
3
|
interface FetchTelemetryContext {
|
|
7
4
|
requestId: string;
|
|
8
5
|
startTime: number;
|
package/dist/lib/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AAYhD,OAAO,EAOL,KAAK,eAAe,EAGrB,MAAM,UAAU,CAAC;AA2vClB,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"}
|
package/dist/lib/http.js
CHANGED
|
@@ -1,119 +1,16 @@
|
|
|
1
1
|
import { isUtf8 } from 'node:buffer';
|
|
2
|
-
import {
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
4
|
-
import {} from 'node:http';
|
|
5
|
-
import { posix as pathPosix } from 'node:path';
|
|
6
4
|
import { PassThrough, Readable } from 'node:stream';
|
|
7
5
|
import { finished, pipeline } from 'node:stream/promises';
|
|
8
6
|
import {} from 'node:stream/web';
|
|
9
7
|
import tls from 'node:tls';
|
|
10
8
|
import { createBrotliDecompress, createGunzip, createInflate } from 'node:zlib';
|
|
11
9
|
import { Agent } from 'undici';
|
|
12
|
-
import {
|
|
13
|
-
import { parseCachedPayload, resolveCachedPayloadContent } from '../schemas.js';
|
|
14
|
-
import { get as cacheGet, config, getOperationId, getRequestId, logDebug, logError, logWarn, redactUrl, } from './core.js';
|
|
10
|
+
import { config, getOperationId, getRequestId, logDebug, logError, logWarn, redactUrl, } from './core.js';
|
|
15
11
|
import { isIP } from './url.js';
|
|
16
12
|
import { BLOCKED_HOST_SUFFIXES, createDnsPreflight, IpBlocker, RawUrlTransformer, SafeDnsResolver, UrlNormalizer, VALIDATION_ERROR_CODE, } from './url.js';
|
|
17
13
|
import { composeAbortSignal, createErrorWithCode, FetchError, isAbortError, isError, isObject, isSystemError, toError, } from './utils.js';
|
|
18
|
-
import { formatZodError } from './zod.js';
|
|
19
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
20
|
-
// FILENAME GENERATION & DOWNLOAD
|
|
21
|
-
// ═══════════════════════════════════════════════════════════════════
|
|
22
|
-
const FILENAME_RULES = {
|
|
23
|
-
MAX_LEN: 200,
|
|
24
|
-
UNSAFE_CHARS: /[<>:"/\\|?*\p{C}]/gu,
|
|
25
|
-
WHITESPACE: /\s+/g,
|
|
26
|
-
EXTENSIONS: /\.(html?|php|aspx?|jsp)$/i,
|
|
27
|
-
};
|
|
28
|
-
function sanitizeString(input) {
|
|
29
|
-
return input
|
|
30
|
-
.toLowerCase()
|
|
31
|
-
.replace(FILENAME_RULES.UNSAFE_CHARS, '')
|
|
32
|
-
.replace(FILENAME_RULES.WHITESPACE, '-')
|
|
33
|
-
.replace(/-+/g, '-')
|
|
34
|
-
.replace(/(?:^-|-$)/g, '');
|
|
35
|
-
}
|
|
36
|
-
function resolveUrlFilenameCandidate(url) {
|
|
37
|
-
const parsed = new URL(url);
|
|
38
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
|
|
39
|
-
return null;
|
|
40
|
-
const basename = pathPosix.basename(parsed.pathname);
|
|
41
|
-
if (!basename || basename === 'index')
|
|
42
|
-
return null;
|
|
43
|
-
const cleaned = basename.replace(FILENAME_RULES.EXTENSIONS, '');
|
|
44
|
-
const sanitized = sanitizeString(cleaned);
|
|
45
|
-
if (sanitized === 'index')
|
|
46
|
-
return null;
|
|
47
|
-
return sanitized || null;
|
|
48
|
-
}
|
|
49
|
-
function truncateFilenameBase(name, extension) {
|
|
50
|
-
const maxBase = FILENAME_RULES.MAX_LEN - extension.length;
|
|
51
|
-
return name.length > maxBase ? name.substring(0, maxBase) : name;
|
|
52
|
-
}
|
|
53
|
-
function resolveTitleFilenameCandidate(title) {
|
|
54
|
-
if (!title)
|
|
55
|
-
return null;
|
|
56
|
-
return sanitizeString(title) || null;
|
|
57
|
-
}
|
|
58
|
-
function resolveFilenameBase(url, title, hashFallback) {
|
|
59
|
-
try {
|
|
60
|
-
const fromUrl = resolveUrlFilenameCandidate(url);
|
|
61
|
-
if (fromUrl)
|
|
62
|
-
return fromUrl;
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Ignore URL parsing errors and continue fallbacks.
|
|
66
|
-
}
|
|
67
|
-
const fromTitle = resolveTitleFilenameCandidate(title);
|
|
68
|
-
if (fromTitle)
|
|
69
|
-
return fromTitle;
|
|
70
|
-
if (hashFallback)
|
|
71
|
-
return hashFallback.substring(0, 16);
|
|
72
|
-
return `download-${hash('sha256', url, 'hex').substring(0, 16)}`;
|
|
73
|
-
}
|
|
74
|
-
export function generateSafeFilename(url, title, hashFallback, extension = '.md') {
|
|
75
|
-
const name = resolveFilenameBase(url, title, hashFallback);
|
|
76
|
-
return `${truncateFilenameBase(name, extension)}${extension}`;
|
|
77
|
-
}
|
|
78
|
-
const DownloadParamsSchema = z.strictObject({
|
|
79
|
-
namespace: z.literal('markdown'),
|
|
80
|
-
hash: z
|
|
81
|
-
.string()
|
|
82
|
-
.regex(/^[a-f0-9.]+$/i)
|
|
83
|
-
.min(8)
|
|
84
|
-
.max(64),
|
|
85
|
-
});
|
|
86
|
-
function writeJsonError(res, status, message, code) {
|
|
87
|
-
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
88
|
-
res.end(JSON.stringify({ error: message, code }));
|
|
89
|
-
}
|
|
90
|
-
export function handleDownload(res, namespace, hash) {
|
|
91
|
-
const parsed = DownloadParamsSchema.safeParse({ namespace, hash });
|
|
92
|
-
if (!parsed.success) {
|
|
93
|
-
writeJsonError(res, 400, `Invalid download parameters: ${formatZodError(parsed.error)}`, 'BAD_REQUEST');
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const cacheKey = `${parsed.data.namespace}:${parsed.data.hash}`;
|
|
97
|
-
const entry = cacheGet(cacheKey, { force: true });
|
|
98
|
-
if (!entry) {
|
|
99
|
-
writeJsonError(res, 404, 'Not found or expired', 'NOT_FOUND');
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const payload = parseCachedPayload(entry.content);
|
|
103
|
-
const content = payload ? resolveCachedPayloadContent(payload) : null;
|
|
104
|
-
if (!content) {
|
|
105
|
-
writeJsonError(res, 404, 'Content missing', 'NOT_FOUND');
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const fileName = generateSafeFilename(entry.url, payload?.title, parsed.data.hash);
|
|
109
|
-
// Safe header generation — RFC 5987 encoding for non-ASCII filenames
|
|
110
|
-
const encoded = encodeURIComponent(fileName).replace(/'/g, '%27');
|
|
111
|
-
res.setHeader('Content-Type', 'text/markdown; charset=utf-8');
|
|
112
|
-
res.setHeader('Content-Disposition', `attachment; filename="${fileName}"; filename*=UTF-8''${encoded}`);
|
|
113
|
-
res.setHeader('Cache-Control', `private, max-age=${config.cache.ttl}`);
|
|
114
|
-
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
115
|
-
res.end(content);
|
|
116
|
-
}
|
|
117
14
|
// ═══════════════════════════════════════════════════════════════════
|
|
118
15
|
// ENCODING DETECTION
|
|
119
16
|
// ═══════════════════════════════════════════════════════════════════
|
|
@@ -434,9 +331,8 @@ function mapFetchError(error, fallbackUrl, timeoutMs) {
|
|
|
434
331
|
if (isSystemError(error)) {
|
|
435
332
|
return mapSystemError(error, url);
|
|
436
333
|
}
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
return createFetchError({ kind: 'network', message: `${err.message}. Cause: ${causeStr}` }, url);
|
|
334
|
+
const causeStr = error.cause instanceof Error ? error.cause.message : String(error.cause);
|
|
335
|
+
return createFetchError({ kind: 'network', message: `${error.message}. Cause: ${causeStr}` }, url);
|
|
440
336
|
}
|
|
441
337
|
// ═══════════════════════════════════════════════════════════════════
|
|
442
338
|
// REDIRECT FOLLOWING
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-interop.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-interop.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAK/C,QAAA,MAAM,oBAAoB;;;;;;;kBAKxB,CAAC;AAeH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;oBAGzB,CAAC;AACH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;sBAGxB,CAAC;AACH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3D,KAAK,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACjE,KAAK,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE5D;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,cAAc,CAEtE;AACD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,mBAAmB,CAE7B;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAE1E;AAUD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG7E;AACD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAUT;AAMD,KAAK,iBAAiB,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,IAAI,CAAC;CACf,CAAC;AA6BF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE;IACN,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,GACA,iBAAiB,CAenB;AAQD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,MAAM,EACX,eAAe,SAAqB,GACnC,iBAAiB,CA2BnB;AAMD,KAAK,eAAe,GAAG,MAAM,IAAI,CAAC;AAClC,KAAK,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-interop.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-interop.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/mcp-interop.js
CHANGED
|
@@ -106,11 +106,13 @@ function isValidationError(error) {
|
|
|
106
106
|
export function handleToolError(error, url, fallbackMessage = 'Operation failed') {
|
|
107
107
|
if (error instanceof FetchError) {
|
|
108
108
|
const { code: detailsCode, reason } = error.details;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
let { code } = error;
|
|
110
|
+
if (typeof detailsCode === 'string') {
|
|
111
|
+
code = detailsCode;
|
|
112
|
+
}
|
|
113
|
+
else if (reason === 'queue_full') {
|
|
114
|
+
code = 'queue_full';
|
|
115
|
+
}
|
|
114
116
|
const details = sanitizeToolErrorDetails(error.details);
|
|
115
117
|
return createToolErrorResponse(error.message, url, {
|
|
116
118
|
code,
|
|
@@ -129,6 +131,10 @@ export function handleToolError(error, url, fallbackMessage = 'Operation failed'
|
|
|
129
131
|
: `${fallbackMessage}: Unknown error`;
|
|
130
132
|
return createToolErrorResponse(message, url, { code });
|
|
131
133
|
}
|
|
134
|
+
function getNestedRecord(value, key) {
|
|
135
|
+
const nested = value[key];
|
|
136
|
+
return isObject(nested) ? nested : undefined;
|
|
137
|
+
}
|
|
132
138
|
const patchedCleanupServers = new WeakSet();
|
|
133
139
|
const serverCleanupCallbacks = new WeakMap();
|
|
134
140
|
function getServerCleanupCallbackSet(server) {
|
|
@@ -196,14 +202,10 @@ export function setTaskToolCallCapability(server, enabled) {
|
|
|
196
202
|
const capabilities = Reflect.get(server.server, '_capabilities');
|
|
197
203
|
if (!isObject(capabilities))
|
|
198
204
|
return;
|
|
199
|
-
const tasks =
|
|
200
|
-
? capabilities.tasks
|
|
201
|
-
: undefined;
|
|
205
|
+
const tasks = getNestedRecord(capabilities, 'tasks');
|
|
202
206
|
if (!tasks)
|
|
203
207
|
return;
|
|
204
|
-
const requests =
|
|
205
|
-
? tasks.requests
|
|
206
|
-
: undefined;
|
|
208
|
+
const requests = getNestedRecord(tasks, 'requests');
|
|
207
209
|
if (!requests)
|
|
208
210
|
return;
|
|
209
211
|
if (enabled) {
|
|
@@ -1 +1 @@
|
|
|
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,CAErE;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,
|
|
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,CAErE;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"}
|
package/dist/lib/session.js
CHANGED
|
@@ -127,14 +127,10 @@ export function reserveSessionSlot(store, maxSessions) {
|
|
|
127
127
|
export function ensureSessionCapacity({ store, maxSessions, evictOldest, }) {
|
|
128
128
|
if (maxSessions <= 0)
|
|
129
129
|
return false;
|
|
130
|
-
|
|
131
|
-
const inflight = store.inFlight();
|
|
132
|
-
if (currentSize + inflight < maxSessions)
|
|
130
|
+
if (store.size() + store.inFlight() < maxSessions)
|
|
133
131
|
return true;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return false;
|
|
139
|
-
return store.size() + store.inFlight() < maxSessions;
|
|
132
|
+
if (store.size() > 0 && evictOldest(store)) {
|
|
133
|
+
return store.size() + store.inFlight() < maxSessions;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
140
136
|
}
|
package/dist/lib/url.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export declare class RawUrlTransformer {
|
|
|
35
35
|
private isRawUrl;
|
|
36
36
|
private splitParams;
|
|
37
37
|
private tryTransformWithUrl;
|
|
38
|
+
private matchAndTransform;
|
|
38
39
|
private transformGithubBlob;
|
|
39
40
|
private transformGithubGist;
|
|
40
41
|
private transformRawGist;
|
|
@@ -77,7 +78,6 @@ export declare class UrlNormalizer {
|
|
|
77
78
|
};
|
|
78
79
|
validateAndNormalize(urlString: string): string;
|
|
79
80
|
private requireTrimmedUrl;
|
|
80
|
-
private normalizeHostname;
|
|
81
81
|
private assertHostnameAllowed;
|
|
82
82
|
}
|
|
83
83
|
export { isIP };
|
package/dist/lib/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/lib/url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAiB,MAAM,UAAU,CAAC;AAG1D,OAAO,EAAE,MAAM,EAAY,MAAM,WAAW,CAAC;AA6C7C,qBAAa,eAAe;IAOxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IARtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAG3B;gBAGgB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,cAAc,EACxB,mBAAmB,EAAE,SAAS,MAAM,EAAE;IAGzD,OAAO,CAAC,eAAe;IAajB,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAgElB,OAAO,CAAC,iBAAiB;YAIX,oBAAoB;YA2BpB,YAAY;CAiC3B;AACD,KAAK,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAMhF,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,eAAe,GAC3B,iBAAiB,CAKnB;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc1D;AAWD,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAyChC,wBAAgB,sBAAsB,IAAI,SAAS,CAMlD;
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/lib/url.ts"],"names":[],"mappings":"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"}
|