@j0hanz/fetch-url-mcp 1.10.2 → 1.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/http/native.d.ts.map +1 -1
- package/dist/http/native.js +20 -26
- package/dist/http/session-teardown.d.ts +17 -0
- package/dist/http/session-teardown.d.ts.map +1 -0
- package/dist/http/session-teardown.js +30 -0
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +2 -0
- package/dist/lib/dom-prep.d.ts.map +1 -1
- package/dist/lib/dom-prep.js +19 -14
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +59 -32
- package/dist/lib/sdk-interop.d.ts +8 -0
- package/dist/lib/sdk-interop.d.ts.map +1 -0
- package/dist/lib/sdk-interop.js +73 -0
- package/dist/lib/task-handlers.d.ts +0 -2
- package/dist/lib/task-handlers.d.ts.map +1 -1
- package/dist/lib/task-handlers.js +9 -94
- package/dist/resources/index.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -3
- package/dist/tasks/call-contract.d.ts +25 -0
- package/dist/tasks/call-contract.d.ts.map +1 -0
- package/dist/tasks/call-contract.js +58 -0
- package/dist/tasks/cursor-codec.d.ts +5 -0
- package/dist/tasks/cursor-codec.d.ts.map +1 -0
- package/dist/tasks/cursor-codec.js +41 -0
- package/dist/tasks/execution.d.ts +1 -20
- package/dist/tasks/execution.d.ts.map +1 -1
- package/dist/tasks/execution.js +7 -32
- package/dist/tasks/manager.d.ts +1 -5
- package/dist/tasks/manager.d.ts.map +1 -1
- package/dist/tasks/manager.js +16 -144
- package/dist/tasks/owner.d.ts +12 -2
- package/dist/tasks/owner.d.ts.map +1 -1
- package/dist/tasks/owner.js +52 -3
- package/dist/tasks/tool-registry.d.ts +1 -0
- package/dist/tasks/tool-registry.d.ts.map +1 -1
- package/dist/tasks/waiters.d.ts +27 -0
- package/dist/tasks/waiters.d.ts.map +1 -0
- package/dist/tasks/waiters.js +113 -0
- package/dist/tools/fetch-url-progress.d.ts +17 -0
- package/dist/tools/fetch-url-progress.d.ts.map +1 -0
- package/dist/tools/fetch-url-progress.js +78 -0
- package/dist/tools/fetch-url.d.ts +5 -9
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +43 -96
- package/dist/transform/next-flight.d.ts +2 -0
- package/dist/transform/next-flight.d.ts.map +1 -0
- package/dist/transform/next-flight.js +285 -0
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +21 -336
- package/package.json +4 -4
- package/dist/tools/index.d.ts +0 -3
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/http/native.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/http/native.ts"],"names":[],"mappings":"AAq3BA,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CA0DD"}
|
package/dist/http/native.js
CHANGED
|
@@ -7,11 +7,10 @@ import process from 'node:process';
|
|
|
7
7
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
8
8
|
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
9
9
|
import { config, enableHttpMode } from '../lib/core.js';
|
|
10
|
-
import { logError, logInfo, registerMcpSessionServer,
|
|
10
|
+
import { logError, logInfo, registerMcpSessionServer, runWithRequestContext, } from '../lib/core.js';
|
|
11
11
|
import { composeCloseHandlers, createSessionStore, createSlotTracker, ensureSessionCapacity, reserveSessionSlot, startSessionCleanupLoop, } from '../lib/core.js';
|
|
12
12
|
import { handleDownload } from '../lib/http.js';
|
|
13
13
|
import { acceptsEventStream, acceptsJsonAndEventStream, isJsonRpcBatchRequest, isMcpMessageBody, isMcpRequestBody, } from '../lib/mcp-tools.js';
|
|
14
|
-
import { cancelTasksForOwner } from '../lib/task-handlers.js';
|
|
15
14
|
import { toError } from '../lib/utils.js';
|
|
16
15
|
import { applyHttpServerTuning, drainConnectionsOnShutdown, } from '../lib/utils.js';
|
|
17
16
|
import { isObject } from '../lib/utils.js';
|
|
@@ -20,6 +19,7 @@ import { applyInsufficientScopeAuthHeaders, applyUnauthorizedAuthHeaders, assert
|
|
|
20
19
|
import { disableEventLoopMonitoring, resetEventLoopMonitoring, sendHealthRouteResponse, shouldHandleHealthRoute, } from './health.js';
|
|
21
20
|
import { buildRequestContext, closeMcpServerBestEffort, closeTransportBestEffort, createRequestAbortSignal, createTransportAdapter, DEFAULT_BODY_LIMIT_BYTES, drainRequest, findDuplicateSingleValueHeader, getHeaderValue, getMcpSessionId, jsonBodyReader, registerInboundBlockList, sendEmpty, sendError, sendJson, } from './helpers.js';
|
|
22
21
|
import { createRateLimitManagerImpl, } from './rate-limit.js';
|
|
22
|
+
import { teardownSessionRegistration, teardownSessionResources, } from './session-teardown.js';
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
// MCP session gateway
|
|
25
25
|
// ---------------------------------------------------------------------------
|
|
@@ -288,9 +288,10 @@ class McpSessionGateway {
|
|
|
288
288
|
const session = this.store.remove(sessionId);
|
|
289
289
|
if (!session)
|
|
290
290
|
return;
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
void teardownSessionResources(session, {
|
|
292
|
+
cancelMessage: 'The task was cancelled because the MCP session ended.',
|
|
293
|
+
closeServerReason: `${context}-server`,
|
|
294
|
+
});
|
|
294
295
|
}
|
|
295
296
|
reserveCapacity(res, requestId) {
|
|
296
297
|
const allowed = ensureSessionCapacity({
|
|
@@ -299,14 +300,12 @@ class McpSessionGateway {
|
|
|
299
300
|
evictOldest: (store) => {
|
|
300
301
|
const evicted = store.evictOldest();
|
|
301
302
|
if (evicted) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
void closeTransportBestEffort(evicted.transport, 'session-eviction');
|
|
309
|
-
void closeMcpServerBestEffort(evicted.server, 'session-eviction');
|
|
303
|
+
void teardownSessionResources(evicted, {
|
|
304
|
+
cancelMessage: 'The task was cancelled because the MCP session was evicted.',
|
|
305
|
+
closeTransportReason: 'session-eviction',
|
|
306
|
+
closeServerReason: 'session-eviction',
|
|
307
|
+
unregisterByServer: true,
|
|
308
|
+
});
|
|
310
309
|
return true;
|
|
311
310
|
}
|
|
312
311
|
return false;
|
|
@@ -599,14 +598,13 @@ function createShutdownHandler(options) {
|
|
|
599
598
|
for (let i = 0; i < sessions.length; i += closeBatchSize) {
|
|
600
599
|
const batch = sessions.slice(i, i + closeBatchSize);
|
|
601
600
|
await Promise.all(batch.map(async (session) => {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
await closeMcpServerBestEffort(session.server, 'shutdown-session-close');
|
|
601
|
+
await teardownSessionResources(session, {
|
|
602
|
+
cancelMessage: 'The task was cancelled because the HTTP server is shutting down.',
|
|
603
|
+
closeTransportReason: 'shutdown-session-close',
|
|
604
|
+
closeServerReason: 'shutdown-session-close',
|
|
605
|
+
unregisterByServer: true,
|
|
606
|
+
awaitClose: true,
|
|
607
|
+
});
|
|
610
608
|
}));
|
|
611
609
|
}
|
|
612
610
|
await new Promise((resolve, reject) => {
|
|
@@ -627,11 +625,7 @@ export async function startHttpServer() {
|
|
|
627
625
|
const sessionStore = createSessionStore(config.server.sessionTtlMs);
|
|
628
626
|
const sessionCleanup = startSessionCleanupLoop(sessionStore, config.server.sessionTtlMs, {
|
|
629
627
|
onEvictSession: (session) => {
|
|
630
|
-
|
|
631
|
-
if (!sessionId)
|
|
632
|
-
return;
|
|
633
|
-
cancelTasksForOwner(`session:${sessionId}`, 'The task was cancelled because the MCP session expired.');
|
|
634
|
-
unregisterMcpSessionServer(sessionId);
|
|
628
|
+
teardownSessionRegistration(session.server, 'The task was cancelled because the MCP session expired.');
|
|
635
629
|
},
|
|
636
630
|
});
|
|
637
631
|
const mcpGateway = new McpSessionGateway(sessionStore, createMcpServerForHttpSession);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
+
interface SessionRecordLike {
|
|
4
|
+
server: McpServer;
|
|
5
|
+
transport: StreamableHTTPServerTransport;
|
|
6
|
+
}
|
|
7
|
+
interface SessionTeardownOptions {
|
|
8
|
+
cancelMessage: string;
|
|
9
|
+
closeServerReason?: string;
|
|
10
|
+
closeTransportReason?: string;
|
|
11
|
+
unregisterByServer?: boolean;
|
|
12
|
+
awaitClose?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function teardownSessionResources(session: SessionRecordLike, options: SessionTeardownOptions): Promise<void>;
|
|
15
|
+
export declare function teardownSessionRegistration(server: McpServer, cancelMessage: string): void;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=session-teardown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-teardown.d.ts","sourceRoot":"","sources":["../../src/http/session-teardown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAcxG,UAAU,iBAAiB;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,6BAA6B,CAAC;CAC1C;AAED,UAAU,sBAAsB;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAWD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,MAAM,GACpB,IAAI,CAEN"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { resolveMcpSessionIdByServer, unregisterMcpSessionServer, unregisterMcpSessionServerByServer, } from '../lib/core.js';
|
|
2
|
+
import { cancelTasksForOwner } from '../lib/task-handlers.js';
|
|
3
|
+
import { closeMcpServerBestEffort, closeTransportBestEffort, } from './helpers.js';
|
|
4
|
+
function cancelSessionTasks(server, message) {
|
|
5
|
+
const sessionId = resolveMcpSessionIdByServer(server);
|
|
6
|
+
if (!sessionId)
|
|
7
|
+
return null;
|
|
8
|
+
cancelTasksForOwner(`session:${sessionId}`, message);
|
|
9
|
+
unregisterMcpSessionServer(sessionId);
|
|
10
|
+
return sessionId;
|
|
11
|
+
}
|
|
12
|
+
export async function teardownSessionResources(session, options) {
|
|
13
|
+
cancelSessionTasks(session.server, options.cancelMessage);
|
|
14
|
+
if (options.unregisterByServer) {
|
|
15
|
+
unregisterMcpSessionServerByServer(session.server);
|
|
16
|
+
}
|
|
17
|
+
const closeTasks = [];
|
|
18
|
+
if (options.closeTransportReason) {
|
|
19
|
+
closeTasks.push(closeTransportBestEffort(session.transport, options.closeTransportReason));
|
|
20
|
+
}
|
|
21
|
+
if (options.closeServerReason) {
|
|
22
|
+
closeTasks.push(closeMcpServerBestEffort(session.server, options.closeServerReason));
|
|
23
|
+
}
|
|
24
|
+
if (options.awaitClose && closeTasks.length > 0) {
|
|
25
|
+
await Promise.all(closeTasks);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function teardownSessionRegistration(server, cancelMessage) {
|
|
29
|
+
cancelSessionTasks(server, cancelMessage);
|
|
30
|
+
}
|
package/dist/lib/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/lib/core.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/lib/core.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/lib/dom-prep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/lib/dom-prep.ts"],"names":[],"mappings":"AA6lBA,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAmPD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAkBN;AAiED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAcR"}
|
package/dist/lib/dom-prep.js
CHANGED
|
@@ -87,12 +87,23 @@ const PROMO_TOKENS_ALWAYS = [
|
|
|
87
87
|
'fb-post',
|
|
88
88
|
'instagram-media',
|
|
89
89
|
'social-embed',
|
|
90
|
+
'author-bio',
|
|
91
|
+
'byline',
|
|
92
|
+
'sharedaddy',
|
|
93
|
+
'sharing',
|
|
90
94
|
];
|
|
91
95
|
const PROMO_TOKENS_AGGRESSIVE = ['ad', 'related', 'comment'];
|
|
92
96
|
const PROMO_TOKENS_BY_CATEGORY = {
|
|
93
97
|
'cookie-banners': ['cookie', 'consent', 'popup', 'modal', 'overlay', 'toast'],
|
|
94
98
|
newsletters: ['newsletter', 'subscribe'],
|
|
95
|
-
'social-share': ['share', 'social'],
|
|
99
|
+
'social-share': ['share', 'social', 'share-button'],
|
|
100
|
+
'author-blocks': ['author-bio', 'byline', 'author-info', 'writer-profile'],
|
|
101
|
+
'related-content': [
|
|
102
|
+
'related-post',
|
|
103
|
+
'related-article',
|
|
104
|
+
'more-stories',
|
|
105
|
+
'recommended-posts',
|
|
106
|
+
],
|
|
96
107
|
};
|
|
97
108
|
// Noise selector configurations
|
|
98
109
|
const BASE_NOISE_SELECTORS = {
|
|
@@ -115,20 +126,16 @@ function addTokens(target, tokens) {
|
|
|
115
126
|
for (const token of tokens)
|
|
116
127
|
target.add(token);
|
|
117
128
|
}
|
|
118
|
-
function getPromoMatchers(currentConfig,
|
|
129
|
+
function getPromoMatchers(currentConfig, enabledCategories) {
|
|
119
130
|
const baseTokens = new Set(PROMO_TOKENS_ALWAYS);
|
|
120
131
|
const aggressiveTokens = new Set();
|
|
121
132
|
if (currentConfig.aggressiveMode) {
|
|
122
133
|
addTokens(aggressiveTokens, PROMO_TOKENS_AGGRESSIVE);
|
|
123
134
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
addTokens(baseTokens, PROMO_TOKENS_BY_CATEGORY['newsletters']);
|
|
129
|
-
}
|
|
130
|
-
if (flags.socialShare) {
|
|
131
|
-
addTokens(baseTokens, PROMO_TOKENS_BY_CATEGORY['social-share']);
|
|
135
|
+
for (const [category, tokens] of Object.entries(PROMO_TOKENS_BY_CATEGORY)) {
|
|
136
|
+
if (enabledCategories.has(category)) {
|
|
137
|
+
addTokens(baseTokens, tokens);
|
|
138
|
+
}
|
|
132
139
|
}
|
|
133
140
|
for (const t of currentConfig.extraTokens) {
|
|
134
141
|
const n = t.toLowerCase().trim();
|
|
@@ -164,15 +171,13 @@ function getContext() {
|
|
|
164
171
|
const flags = {
|
|
165
172
|
navFooter: isEnabled('nav-footer'),
|
|
166
173
|
cookieBanners: isEnabled('cookie-banners'),
|
|
167
|
-
newsletters: isEnabled('newsletters'),
|
|
168
|
-
socialShare: isEnabled('social-share'),
|
|
169
174
|
};
|
|
170
175
|
const structuralTags = new Set(BASE_STRUCTURAL_TAGS);
|
|
171
176
|
if (!currentConfig.preserveSvgCanvas) {
|
|
172
177
|
structuralTags.add('svg');
|
|
173
178
|
structuralTags.add('canvas');
|
|
174
179
|
}
|
|
175
|
-
const promoMatchers = getPromoMatchers(currentConfig,
|
|
180
|
+
const promoMatchers = getPromoMatchers(currentConfig, enabled);
|
|
176
181
|
const extraSelectors = currentConfig.extraSelectors
|
|
177
182
|
.map((s) => s.trim())
|
|
178
183
|
.filter((s) => s.length > 0);
|
|
@@ -198,7 +203,7 @@ function getContext() {
|
|
|
198
203
|
structuralTags,
|
|
199
204
|
weights: currentConfig.weights,
|
|
200
205
|
promoMatchers,
|
|
201
|
-
promoEnabled:
|
|
206
|
+
promoEnabled: Object.keys(PROMO_TOKENS_BY_CATEGORY).some((cat) => enabled.has(cat)),
|
|
202
207
|
extraSelectors,
|
|
203
208
|
baseSelector,
|
|
204
209
|
candidateSelector,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAOA,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AACrC,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AACD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,0BAA0B,CAAC;CACpC;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;CACnC;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AAOA,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AACrC,UAAU,WAAW;IACnB,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AACD,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AACD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,wBAAwB,CAAC;IACjC,MAAM,EAAE,0BAA0B,CAAC;CACpC;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;CACnC;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAiLD,wBAAgB,sBAAsB,CACpC,KAAK,CAAC,EAAE,gBAAgB,GACvB,gBAAgB,CAElB"}
|
package/dist/lib/progress.js
CHANGED
|
@@ -19,6 +19,9 @@ class ToolProgressReporter {
|
|
|
19
19
|
canReportProgress;
|
|
20
20
|
isTerminal = false;
|
|
21
21
|
lastProgress = -1;
|
|
22
|
+
lastMessage;
|
|
23
|
+
pendingNotification;
|
|
24
|
+
isDispatching = false;
|
|
22
25
|
constructor(token, sendNotification, relatedTaskMeta, onProgress, canReportProgress) {
|
|
23
26
|
this.token = token;
|
|
24
27
|
this.sendNotification = sendNotification;
|
|
@@ -50,13 +53,13 @@ class ToolProgressReporter {
|
|
|
50
53
|
return;
|
|
51
54
|
const effectiveProgress = Math.max(progress, this.lastProgress);
|
|
52
55
|
const isIncreasing = effectiveProgress > this.lastProgress;
|
|
56
|
+
const isMessageChanged = message !== this.lastMessage;
|
|
53
57
|
this.lastProgress = effectiveProgress;
|
|
58
|
+
this.lastMessage = message;
|
|
54
59
|
if (effectiveProgress >= FETCH_PROGRESS_TOTAL) {
|
|
55
60
|
this.isTerminal = true;
|
|
56
61
|
}
|
|
57
|
-
|
|
58
|
-
// task status updates (onProgress drives updateWorkingTaskStatus in task mode).
|
|
59
|
-
if (isIncreasing && this.onProgress) {
|
|
62
|
+
if ((isIncreasing || isMessageChanged) && this.onProgress) {
|
|
60
63
|
try {
|
|
61
64
|
this.onProgress(effectiveProgress, message);
|
|
62
65
|
}
|
|
@@ -70,44 +73,68 @@ class ToolProgressReporter {
|
|
|
70
73
|
}
|
|
71
74
|
if (!isIncreasing || this.token === null || !this.sendNotification)
|
|
72
75
|
return;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
this.pendingNotification = this.createProgressNotification(this.token, effectiveProgress, message);
|
|
77
|
+
this.flushNotifications();
|
|
78
|
+
}
|
|
79
|
+
flushNotifications() {
|
|
80
|
+
if (this.isDispatching || !this.sendNotification)
|
|
81
|
+
return;
|
|
82
|
+
this.isDispatching = true;
|
|
77
83
|
void (async () => {
|
|
78
|
-
let timeoutId;
|
|
79
|
-
const timeoutPromise = new Promise((resolve) => {
|
|
80
|
-
timeoutId = setTimeout(() => {
|
|
81
|
-
resolve({ timeout: true });
|
|
82
|
-
}, PROGRESS_NOTIFICATION_TIMEOUT_MS);
|
|
83
|
-
timeoutId.unref();
|
|
84
|
-
});
|
|
85
84
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
});
|
|
85
|
+
while (this.pendingNotification) {
|
|
86
|
+
if (this.canReportProgress && !this.canReportProgress()) {
|
|
87
|
+
this.pendingNotification = undefined;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const notification = this.pendingNotification;
|
|
91
|
+
this.pendingNotification = undefined;
|
|
92
|
+
await this.sendWithTimeout(notification);
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
logWarn('Failed to send progress notification', {
|
|
99
|
-
error: getErrorMessage(error),
|
|
100
|
-
progress: effectiveProgress,
|
|
101
|
-
message,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
95
|
finally {
|
|
105
|
-
|
|
106
|
-
|
|
96
|
+
this.isDispatching = false;
|
|
97
|
+
if (this.pendingNotification) {
|
|
98
|
+
this.flushNotifications();
|
|
107
99
|
}
|
|
108
100
|
}
|
|
109
101
|
})();
|
|
110
102
|
}
|
|
103
|
+
async sendWithTimeout(notification) {
|
|
104
|
+
if (!this.sendNotification)
|
|
105
|
+
return;
|
|
106
|
+
let timeoutId;
|
|
107
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
108
|
+
timeoutId = setTimeout(() => {
|
|
109
|
+
resolve({ timeout: true });
|
|
110
|
+
}, PROGRESS_NOTIFICATION_TIMEOUT_MS);
|
|
111
|
+
timeoutId.unref();
|
|
112
|
+
});
|
|
113
|
+
try {
|
|
114
|
+
const outcome = await Promise.race([
|
|
115
|
+
this.sendNotification(notification).then(() => ({ ok: true })),
|
|
116
|
+
timeoutPromise,
|
|
117
|
+
]);
|
|
118
|
+
if ('timeout' in outcome) {
|
|
119
|
+
logWarn('Progress notification timed out', {
|
|
120
|
+
progress: notification.params.progress,
|
|
121
|
+
message: notification.params.message,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
logWarn('Failed to send progress notification', {
|
|
127
|
+
error: getErrorMessage(error),
|
|
128
|
+
progress: notification.params.progress,
|
|
129
|
+
message: notification.params.message,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
if (timeoutId) {
|
|
134
|
+
clearTimeout(timeoutId);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
111
138
|
createProgressNotification(token, progress, message) {
|
|
112
139
|
return {
|
|
113
140
|
method: 'notifications/progress',
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
type CleanupCallback = () => void;
|
|
3
|
+
type RequestHandlerFn = (request: unknown, extra?: unknown) => Promise<unknown>;
|
|
4
|
+
export declare function registerServerLifecycleCleanup(server: McpServer, callback: CleanupCallback): void;
|
|
5
|
+
export declare function getSdkCallToolHandler(server: McpServer): RequestHandlerFn | null;
|
|
6
|
+
export declare function setTaskToolCallCapability(server: McpServer, enabled: boolean): void;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=sdk-interop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-interop.d.ts","sourceRoot":"","sources":["../../src/lib/sdk-interop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,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;AA8ChF,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,GACxB,IAAI,CAGN;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAChB,gBAAgB,GAAG,IAAI,CAMzB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,OAAO,GACf,IAAI,CAoBN"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { logWarn } from './core.js';
|
|
2
|
+
import { isObject } from './utils.js';
|
|
3
|
+
const patchedCleanupServers = new WeakSet();
|
|
4
|
+
const serverCleanupCallbacks = new WeakMap();
|
|
5
|
+
function getServerCleanupCallbackSet(server) {
|
|
6
|
+
let callbacks = serverCleanupCallbacks.get(server);
|
|
7
|
+
if (!callbacks) {
|
|
8
|
+
callbacks = new Set();
|
|
9
|
+
serverCleanupCallbacks.set(server, callbacks);
|
|
10
|
+
}
|
|
11
|
+
return callbacks;
|
|
12
|
+
}
|
|
13
|
+
function drainServerCleanupCallbacks(server) {
|
|
14
|
+
const callbacks = serverCleanupCallbacks.get(server);
|
|
15
|
+
if (!callbacks || callbacks.size === 0)
|
|
16
|
+
return;
|
|
17
|
+
const pending = [...callbacks];
|
|
18
|
+
callbacks.clear();
|
|
19
|
+
for (const callback of pending) {
|
|
20
|
+
try {
|
|
21
|
+
callback();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logWarn('Server cleanup callback failed', { error });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function ensureServerCleanupHooks(server) {
|
|
29
|
+
if (patchedCleanupServers.has(server))
|
|
30
|
+
return;
|
|
31
|
+
patchedCleanupServers.add(server);
|
|
32
|
+
const originalOnClose = server.server.onclose;
|
|
33
|
+
server.server.onclose = () => {
|
|
34
|
+
drainServerCleanupCallbacks(server);
|
|
35
|
+
originalOnClose?.();
|
|
36
|
+
};
|
|
37
|
+
const originalClose = server.close.bind(server);
|
|
38
|
+
server.close = async () => {
|
|
39
|
+
drainServerCleanupCallbacks(server);
|
|
40
|
+
await originalClose();
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function registerServerLifecycleCleanup(server, callback) {
|
|
44
|
+
ensureServerCleanupHooks(server);
|
|
45
|
+
getServerCleanupCallbackSet(server).add(callback);
|
|
46
|
+
}
|
|
47
|
+
export function getSdkCallToolHandler(server) {
|
|
48
|
+
const maybeHandlers = Reflect.get(server.server, '_requestHandlers');
|
|
49
|
+
if (!(maybeHandlers instanceof Map))
|
|
50
|
+
return null;
|
|
51
|
+
const handler = maybeHandlers.get('tools/call');
|
|
52
|
+
return typeof handler === 'function' ? handler : null;
|
|
53
|
+
}
|
|
54
|
+
export function setTaskToolCallCapability(server, enabled) {
|
|
55
|
+
const capabilities = Reflect.get(server.server, '_capabilities');
|
|
56
|
+
if (!isObject(capabilities))
|
|
57
|
+
return;
|
|
58
|
+
const tasks = isObject(capabilities.tasks)
|
|
59
|
+
? capabilities.tasks
|
|
60
|
+
: undefined;
|
|
61
|
+
if (!tasks)
|
|
62
|
+
return;
|
|
63
|
+
const requests = isObject(tasks.requests)
|
|
64
|
+
? tasks.requests
|
|
65
|
+
: undefined;
|
|
66
|
+
if (!requests)
|
|
67
|
+
return;
|
|
68
|
+
if (enabled) {
|
|
69
|
+
requests.tools = { call: {} };
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
delete requests.tools;
|
|
73
|
+
}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
type CleanupCallback = () => void;
|
|
3
|
-
export declare function registerServerLifecycleCleanup(server: McpServer, callback: CleanupCallback): void;
|
|
4
2
|
export { cancelTasksForOwner, abortAllTaskExecutions, } from '../tasks/execution.js';
|
|
5
3
|
interface TaskHandlerRegistrationOptions {
|
|
6
4
|
requireInterception?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-handlers.d.ts","sourceRoot":"","sources":["../../src/lib/task-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"task-handlers.d.ts","sourceRoot":"","sources":["../../src/lib/task-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCzE,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAoC/B,UAAU,8BAA8B;IACtC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,6BAA6B;IACrC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,0BAA0B,EAAE,OAAO,CAAC;CACrC;AACD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,8BAA8B,GACvC,6BAA6B,CA0J/B"}
|