@webmcp-auto-ui/core 2.5.26 → 2.5.28
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/client.d.ts.map +1 -1
- package/dist/client.js +8 -2
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/multi-mcp-bridge.d.ts +61 -0
- package/dist/multi-mcp-bridge.d.ts.map +1 -0
- package/dist/multi-mcp-bridge.js +285 -0
- package/dist/multi-mcp-bridge.js.map +1 -0
- package/dist/polyfill.d.ts +4 -2
- package/dist/polyfill.d.ts.map +1 -1
- package/dist/polyfill.js +31 -16
- package/dist/polyfill.js.map +1 -1
- package/dist/webmcp-server.d.ts.map +1 -1
- package/dist/webmcp-server.js +13 -4
- package/dist/webmcp-server.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +8 -2
- package/src/index.d.ts +2 -0
- package/src/index.ts +4 -0
- package/src/multi-mcp-bridge.d.ts +60 -0
- package/src/multi-mcp-bridge.ts +303 -0
- package/src/polyfill.d.ts +4 -2
- package/src/polyfill.ts +48 -25
- package/src/webmcp-server.ts +12 -4
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,aAAa,EAEb,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAWpB,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAA8B;gBAE1C,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAS7C,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoBvC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAM/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAO9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,aAAa,GAAG,IAAI;IAIrC,eAAe,IAAI,eAAe,GAAG,IAAI;IAIzC,QAAQ,IAAI,OAAO,EAAE;IAIrB,YAAY,IAAI,MAAM,GAAG,IAAI;YAQf,MAAM;YAaN,GAAG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,aAAa,EAEb,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAWpB,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAA8B;gBAE1C,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB;IAS7C,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoBvC,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAM/B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAO9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,aAAa,GAAG,IAAI;IAIrC,eAAe,IAAI,eAAe,GAAG,IAAI;IAIzC,QAAQ,IAAI,OAAO,EAAE;IAIrB,YAAY,IAAI,MAAM,GAAG,IAAI;YAQf,MAAM;YAaN,GAAG;IAuGjB,OAAO,CAAC,gBAAgB;CAsCzB"}
|
package/dist/client.js
CHANGED
|
@@ -151,9 +151,15 @@ export class McpClient {
|
|
|
151
151
|
// Auto-reconnect on 404 (session expired)
|
|
152
152
|
if (response.status === 404 && this.options.autoReconnect) {
|
|
153
153
|
if (this.isReconnecting) {
|
|
154
|
-
// Another call already triggered reconnect — wait for it then retry
|
|
154
|
+
// Another call already triggered reconnect — wait for it then retry.
|
|
155
|
+
// Increment attempt to enforce the maxReconnectAttempts cap on this
|
|
156
|
+
// concurrent path as well; otherwise we could loop forever if the
|
|
157
|
+
// session keeps expiring.
|
|
155
158
|
await this.reconnectPromise;
|
|
156
|
-
|
|
159
|
+
if (attempt >= this.options.maxReconnectAttempts) {
|
|
160
|
+
throw new Error(`MCP session expired and reconnect failed after ${attempt} attempts`);
|
|
161
|
+
}
|
|
162
|
+
return this.rpc(method, params, attempt + 1);
|
|
157
163
|
}
|
|
158
164
|
if (attempt < this.options.maxReconnectAttempts) {
|
|
159
165
|
this.isReconnecting = true;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export type { SchemaPatch } from './utils.js';
|
|
|
9
9
|
export { textResult, jsonResult, } from './webmcp-helpers.js';
|
|
10
10
|
export { McpMultiClient } from './multi-client.js';
|
|
11
11
|
export type { ConnectedServer } from './multi-client.js';
|
|
12
|
+
export { MultiMcpBridge, installMultiMcpBridge, parseRecipesFromToolResponse } from './multi-mcp-bridge.js';
|
|
13
|
+
export type { MultiMcpBridgeOptions } from './multi-mcp-bridge.js';
|
|
12
14
|
export { createWebMcpServer, parseFrontmatter, mountWidget } from './webmcp-server.js';
|
|
13
15
|
export type { WebMcpServer, WebMcpServerOptions, WebMcpToolDef, WidgetEntry, WidgetRenderer, McpRecipeSummary } from './webmcp-server.js';
|
|
14
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,2BAA2B,EAC3B,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,2BAA2B,EAC3B,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,OAAO,EACP,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGvE,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC5G,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,8 @@ export { dispatchAndWait, signalCompletion, sanitizeSchema, sanitizeSchemaWithRe
|
|
|
14
14
|
export { textResult, jsonResult, } from './webmcp-helpers.js';
|
|
15
15
|
// Multi-MCP client
|
|
16
16
|
export { McpMultiClient } from './multi-client.js';
|
|
17
|
+
// Multi-MCP bridge (canvas store <-> McpMultiClient reconciler)
|
|
18
|
+
export { MultiMcpBridge, installMultiMcpBridge, parseRecipesFromToolResponse } from './multi-mcp-bridge.js';
|
|
17
19
|
// WebMCP Server
|
|
18
20
|
export { createWebMcpServer, parseFrontmatter, mountWidget } from './webmcp-server.js';
|
|
19
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,+DAA+D;AAiD/D,aAAa;AACb,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,WAAW;AACX,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAqB;AACrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,mCAAmC;AACnC,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,+DAA+D;AAiD/D,aAAa;AACb,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,WAAW;AACX,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,qBAAqB;AACrB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,YAAY;AACZ,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,mCAAmC;AACnC,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAC;AAE7B,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,gEAAgE;AAChE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAG5G,gBAAgB;AAChB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { McpMultiClient } from './multi-client.js';
|
|
2
|
+
import type { McpToolResult } from './types.js';
|
|
3
|
+
export interface MultiMcpBridgeOptions {
|
|
4
|
+
/** Accessor for the canvas store. Typically returns globalThis.__canvasVanilla. */
|
|
5
|
+
getCanvas: () => any;
|
|
6
|
+
/** Optional logger. */
|
|
7
|
+
log?: (msg: string, data?: any) => void;
|
|
8
|
+
}
|
|
9
|
+
interface RecipeItem {
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
body?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extract recipes from an MCP tool response. Expects `res.content` as the
|
|
16
|
+
* standard MCP content array; looks for a text chunk whose payload parses as
|
|
17
|
+
* JSON and contains an array of `{ name, description?, body? }` items (or an
|
|
18
|
+
* object with an `items`/`recipes` array).
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseRecipesFromToolResponse(res: unknown): RecipeItem[] | null;
|
|
21
|
+
export declare class MultiMcpBridge {
|
|
22
|
+
private client;
|
|
23
|
+
private unsub;
|
|
24
|
+
/** server name -> url (for reverse lookup, since McpMultiClient keys by url) */
|
|
25
|
+
private nameToUrl;
|
|
26
|
+
/** server names currently connected */
|
|
27
|
+
private connected;
|
|
28
|
+
/** server names whose handshake is in-flight */
|
|
29
|
+
private connecting;
|
|
30
|
+
private options;
|
|
31
|
+
private started;
|
|
32
|
+
constructor(options: MultiMcpBridgeOptions);
|
|
33
|
+
start(): void;
|
|
34
|
+
stop(): void;
|
|
35
|
+
/** Ensure a server is in the store with enabled=true; reconcile picks it up. */
|
|
36
|
+
connect(name: string, url: string): Promise<void>;
|
|
37
|
+
/** Call a tool on a named server. */
|
|
38
|
+
callTool(serverName: string, toolName: string, args: unknown): Promise<McpToolResult>;
|
|
39
|
+
/** Direct access to the underlying multi-client (read-only usage preferred). */
|
|
40
|
+
get multiClient(): McpMultiClient;
|
|
41
|
+
/** True if a server with this name has completed its handshake. */
|
|
42
|
+
hasServer(serverName: string): boolean;
|
|
43
|
+
/** Snapshot of currently connected server names. */
|
|
44
|
+
connectedServers(): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Wait until every enabled data server in the canvas is connected, or the
|
|
47
|
+
* timeout elapses. Resolves either way (no throw) — caller inspects
|
|
48
|
+
* `connectedServers()` to decide what's reachable.
|
|
49
|
+
*/
|
|
50
|
+
waitForEnabledServers(timeoutMs?: number): Promise<void>;
|
|
51
|
+
private reconcile;
|
|
52
|
+
private handshake;
|
|
53
|
+
private disconnect;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Install a singleton bridge on globalThis.__multiMcp. If a previous bridge
|
|
57
|
+
* exists, it is stopped first (idempotent).
|
|
58
|
+
*/
|
|
59
|
+
export declare function installMultiMcpBridge(options: MultiMcpBridgeOptions): MultiMcpBridge;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=multi-mcp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-mcp-bridge.d.ts","sourceRoot":"","sources":["../src/multi-mcp-bridge.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,YAAY,CAAC;AAMzD,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,uBAAuB;IACvB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CACzC;AASD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,IAAI,CAmB9E;AA4BD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA6B;IAC1C,gFAAgF;IAChF,OAAO,CAAC,SAAS,CAA6B;IAC9C,uCAAuC;IACvC,OAAO,CAAC,SAAS,CAAqB;IACtC,gDAAgD;IAChD,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,qBAAqB;IAS1C,KAAK,IAAI,IAAI;IAgBb,IAAI,IAAI,IAAI;IAiBZ,gFAAgF;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,qCAAqC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAM3F,gFAAgF;IAChF,IAAI,WAAW,IAAI,cAAc,CAEhC;IAED,mEAAmE;IACnE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAItC,oDAAoD;IACpD,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;;;OAIG;IACG,qBAAqB,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB9C,SAAS;YA0BT,SAAS;YA6CT,UAAU;CAWzB;AAMD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAUpF"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// @webmcp-auto-ui/core — MultiMcpBridge
|
|
3
|
+
// Observes a canvas store with a `dataServers` field and reconciles the real
|
|
4
|
+
// MCP connection state with the user intent (`enabled`). Populates tools and
|
|
5
|
+
// recipes metadata back into the store. Framework-agnostic.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { McpMultiClient } from './multi-client.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Helpers
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Extract recipes from an MCP tool response. Expects `res.content` as the
|
|
13
|
+
* standard MCP content array; looks for a text chunk whose payload parses as
|
|
14
|
+
* JSON and contains an array of `{ name, description?, body? }` items (or an
|
|
15
|
+
* object with an `items`/`recipes` array).
|
|
16
|
+
*/
|
|
17
|
+
export function parseRecipesFromToolResponse(res) {
|
|
18
|
+
if (!res || typeof res !== 'object')
|
|
19
|
+
return null;
|
|
20
|
+
const content = res.content;
|
|
21
|
+
if (!Array.isArray(content))
|
|
22
|
+
return null;
|
|
23
|
+
for (const chunk of content) {
|
|
24
|
+
if (!chunk || typeof chunk !== 'object')
|
|
25
|
+
continue;
|
|
26
|
+
if (chunk.type !== 'text' || typeof chunk.text !== 'string')
|
|
27
|
+
continue;
|
|
28
|
+
const text = chunk.text;
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = JSON.parse(text);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const items = extractItems(parsed);
|
|
37
|
+
if (items)
|
|
38
|
+
return items;
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function extractItems(parsed) {
|
|
43
|
+
const candidate = Array.isArray(parsed)
|
|
44
|
+
? parsed
|
|
45
|
+
: Array.isArray(parsed?.items)
|
|
46
|
+
? parsed.items
|
|
47
|
+
: Array.isArray(parsed?.recipes)
|
|
48
|
+
? parsed.recipes
|
|
49
|
+
: null;
|
|
50
|
+
if (!candidate)
|
|
51
|
+
return null;
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const it of candidate) {
|
|
54
|
+
if (!it || typeof it !== 'object')
|
|
55
|
+
continue;
|
|
56
|
+
const name = typeof it.name === 'string' ? it.name : typeof it.id === 'string' ? it.id : null;
|
|
57
|
+
if (!name)
|
|
58
|
+
continue;
|
|
59
|
+
const entry = { name };
|
|
60
|
+
if (typeof it.description === 'string')
|
|
61
|
+
entry.description = it.description;
|
|
62
|
+
if (typeof it.body === 'string')
|
|
63
|
+
entry.body = it.body;
|
|
64
|
+
out.push(entry);
|
|
65
|
+
}
|
|
66
|
+
return out.length > 0 ? out : null;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// MultiMcpBridge
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
export class MultiMcpBridge {
|
|
72
|
+
client;
|
|
73
|
+
unsub = null;
|
|
74
|
+
/** server name -> url (for reverse lookup, since McpMultiClient keys by url) */
|
|
75
|
+
nameToUrl = new Map();
|
|
76
|
+
/** server names currently connected */
|
|
77
|
+
connected = new Set();
|
|
78
|
+
/** server names whose handshake is in-flight */
|
|
79
|
+
connecting = new Set();
|
|
80
|
+
options;
|
|
81
|
+
started = false;
|
|
82
|
+
constructor(options) {
|
|
83
|
+
this.options = options;
|
|
84
|
+
this.client = new McpMultiClient();
|
|
85
|
+
}
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
// Lifecycle
|
|
88
|
+
// -------------------------------------------------------------------------
|
|
89
|
+
start() {
|
|
90
|
+
if (this.started)
|
|
91
|
+
return;
|
|
92
|
+
const canvas = this.options.getCanvas();
|
|
93
|
+
if (canvas && typeof canvas.subscribe === 'function') {
|
|
94
|
+
this.started = true;
|
|
95
|
+
this.unsub = canvas.subscribe(() => {
|
|
96
|
+
void this.reconcile();
|
|
97
|
+
});
|
|
98
|
+
void this.reconcile();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Canvas not ready yet — retry shortly. Without this the bridge would
|
|
102
|
+
// stay dead forever because no subscription was ever established.
|
|
103
|
+
setTimeout(() => this.start(), 50);
|
|
104
|
+
}
|
|
105
|
+
stop() {
|
|
106
|
+
if (!this.started)
|
|
107
|
+
return;
|
|
108
|
+
this.started = false;
|
|
109
|
+
if (this.unsub) {
|
|
110
|
+
try {
|
|
111
|
+
this.unsub();
|
|
112
|
+
}
|
|
113
|
+
catch { /* ignore */ }
|
|
114
|
+
this.unsub = null;
|
|
115
|
+
}
|
|
116
|
+
void this.client.disconnectAll().catch(() => { });
|
|
117
|
+
this.connected.clear();
|
|
118
|
+
this.connecting.clear();
|
|
119
|
+
this.nameToUrl.clear();
|
|
120
|
+
}
|
|
121
|
+
// -------------------------------------------------------------------------
|
|
122
|
+
// Imperative helpers
|
|
123
|
+
// -------------------------------------------------------------------------
|
|
124
|
+
/** Ensure a server is in the store with enabled=true; reconcile picks it up. */
|
|
125
|
+
async connect(name, url) {
|
|
126
|
+
const canvas = this.options.getCanvas();
|
|
127
|
+
if (!canvas)
|
|
128
|
+
return;
|
|
129
|
+
canvas.addDataServer?.({ name, url });
|
|
130
|
+
canvas.setDataServerEnabled?.(name, true);
|
|
131
|
+
await this.reconcile();
|
|
132
|
+
}
|
|
133
|
+
/** Call a tool on a named server. */
|
|
134
|
+
async callTool(serverName, toolName, args) {
|
|
135
|
+
const url = this.nameToUrl.get(serverName);
|
|
136
|
+
if (!url)
|
|
137
|
+
throw new Error(`MultiMcpBridge: server "${serverName}" is not connected`);
|
|
138
|
+
return this.client.callToolOn(url, toolName, (args ?? {}));
|
|
139
|
+
}
|
|
140
|
+
/** Direct access to the underlying multi-client (read-only usage preferred). */
|
|
141
|
+
get multiClient() {
|
|
142
|
+
return this.client;
|
|
143
|
+
}
|
|
144
|
+
/** True if a server with this name has completed its handshake. */
|
|
145
|
+
hasServer(serverName) {
|
|
146
|
+
return this.connected.has(serverName);
|
|
147
|
+
}
|
|
148
|
+
/** Snapshot of currently connected server names. */
|
|
149
|
+
connectedServers() {
|
|
150
|
+
return Array.from(this.connected);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Wait until every enabled data server in the canvas is connected, or the
|
|
154
|
+
* timeout elapses. Resolves either way (no throw) — caller inspects
|
|
155
|
+
* `connectedServers()` to decide what's reachable.
|
|
156
|
+
*/
|
|
157
|
+
async waitForEnabledServers(timeoutMs = 5000) {
|
|
158
|
+
const canvas = this.options.getCanvas();
|
|
159
|
+
if (!canvas)
|
|
160
|
+
return;
|
|
161
|
+
const deadline = Date.now() + Math.max(0, timeoutMs);
|
|
162
|
+
while (Date.now() < deadline) {
|
|
163
|
+
const enabled = (Array.isArray(canvas.dataServers) ? canvas.dataServers : [])
|
|
164
|
+
.filter((s) => s?.enabled !== false)
|
|
165
|
+
.map((s) => s.name);
|
|
166
|
+
if (enabled.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
const allReady = enabled.every((n) => this.connected.has(n));
|
|
169
|
+
if (allReady)
|
|
170
|
+
return;
|
|
171
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// -------------------------------------------------------------------------
|
|
175
|
+
// Reconciliation
|
|
176
|
+
// -------------------------------------------------------------------------
|
|
177
|
+
async reconcile() {
|
|
178
|
+
const canvas = this.options.getCanvas();
|
|
179
|
+
if (!canvas)
|
|
180
|
+
return;
|
|
181
|
+
const servers = (canvas.dataServers ?? []);
|
|
182
|
+
if (!Array.isArray(servers))
|
|
183
|
+
return;
|
|
184
|
+
const seenNames = new Set();
|
|
185
|
+
for (const srv of servers) {
|
|
186
|
+
if (!srv || typeof srv.name !== 'string' || typeof srv.url !== 'string')
|
|
187
|
+
continue;
|
|
188
|
+
seenNames.add(srv.name);
|
|
189
|
+
const key = srv.name;
|
|
190
|
+
if (srv.enabled && !this.connected.has(key) && !this.connecting.has(key)) {
|
|
191
|
+
void this.handshake(srv);
|
|
192
|
+
}
|
|
193
|
+
else if (!srv.enabled && this.connected.has(key)) {
|
|
194
|
+
void this.disconnect(srv);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Disconnect servers that were removed from the store entirely
|
|
198
|
+
for (const name of Array.from(this.connected)) {
|
|
199
|
+
if (!seenNames.has(name)) {
|
|
200
|
+
void this.disconnect({ name, url: this.nameToUrl.get(name) ?? '' });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async handshake(srv) {
|
|
205
|
+
const canvas = this.options.getCanvas();
|
|
206
|
+
this.connecting.add(srv.name);
|
|
207
|
+
this.options.log?.(`[bridge] handshake start: ${srv.name}`, { url: srv.url });
|
|
208
|
+
try {
|
|
209
|
+
const { name: actualName, tools } = await this.client.addServer(srv.url);
|
|
210
|
+
// The MCP server may return a different name than the one stored in the
|
|
211
|
+
// canvas. Key the bridge by the canvas name so callers stay consistent.
|
|
212
|
+
this.nameToUrl.set(srv.name, srv.url);
|
|
213
|
+
this.connected.add(srv.name);
|
|
214
|
+
// Try to fetch recipes via tool `list_recipes` if exposed.
|
|
215
|
+
let recipes = [];
|
|
216
|
+
const hasListRecipes = tools.some((t) => t.name === 'list_recipes');
|
|
217
|
+
if (hasListRecipes) {
|
|
218
|
+
try {
|
|
219
|
+
const res = await this.client.callToolOn(srv.url, 'list_recipes', {});
|
|
220
|
+
recipes = parseRecipesFromToolResponse(res) ?? [];
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
this.options.log?.(`[bridge] list_recipes failed for ${srv.name}`, err);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
canvas.setDataServerMeta?.(srv.name, {
|
|
227
|
+
connected: true,
|
|
228
|
+
tools,
|
|
229
|
+
recipes,
|
|
230
|
+
error: undefined,
|
|
231
|
+
serverName: actualName,
|
|
232
|
+
});
|
|
233
|
+
this.options.log?.(`[bridge] connected: ${srv.name}`, { tools: tools.length, recipes: recipes.length });
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
const message = err?.message ? String(err.message) : String(err);
|
|
237
|
+
canvas.setDataServerMeta?.(srv.name, {
|
|
238
|
+
connected: false,
|
|
239
|
+
tools: [],
|
|
240
|
+
recipes: [],
|
|
241
|
+
error: message,
|
|
242
|
+
});
|
|
243
|
+
this.options.log?.(`[bridge] handshake failed: ${srv.name}`, message);
|
|
244
|
+
}
|
|
245
|
+
finally {
|
|
246
|
+
this.connecting.delete(srv.name);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async disconnect(srv) {
|
|
250
|
+
const canvas = this.options.getCanvas();
|
|
251
|
+
const url = srv.url || this.nameToUrl.get(srv.name);
|
|
252
|
+
if (url) {
|
|
253
|
+
try {
|
|
254
|
+
await this.client.removeServer(url);
|
|
255
|
+
}
|
|
256
|
+
catch { /* ignore */ }
|
|
257
|
+
}
|
|
258
|
+
this.connected.delete(srv.name);
|
|
259
|
+
this.nameToUrl.delete(srv.name);
|
|
260
|
+
canvas?.setDataServerMeta?.(srv.name, { connected: false });
|
|
261
|
+
this.options.log?.(`[bridge] disconnected: ${srv.name}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// Singleton installer
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
/**
|
|
268
|
+
* Install a singleton bridge on globalThis.__multiMcp. If a previous bridge
|
|
269
|
+
* exists, it is stopped first (idempotent).
|
|
270
|
+
*/
|
|
271
|
+
export function installMultiMcpBridge(options) {
|
|
272
|
+
const g = globalThis;
|
|
273
|
+
const existing = g.__multiMcp;
|
|
274
|
+
if (existing && typeof existing.stop === 'function') {
|
|
275
|
+
try {
|
|
276
|
+
existing.stop();
|
|
277
|
+
}
|
|
278
|
+
catch { /* ignore */ }
|
|
279
|
+
}
|
|
280
|
+
const bridge = new MultiMcpBridge(options);
|
|
281
|
+
g.__multiMcp = bridge;
|
|
282
|
+
bridge.start();
|
|
283
|
+
return bridge;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=multi-mcp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-mcp-bridge.js","sourceRoot":"","sources":["../src/multi-mcp-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/polyfill.d.ts
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
* Implements the 17 MUST HAVE features of the W3C WebMCP Draft CG Report
|
|
5
5
|
* (2026-03-27) plus ecosystem extras.
|
|
6
6
|
*
|
|
7
|
-
* Architecture: module-level state (
|
|
8
|
-
*
|
|
7
|
+
* Architecture: shared module-level state (toolMap, polyfillOptions,
|
|
8
|
+
* installState) mutated by installPolyfill/uninstallPolyfill. Installs a
|
|
9
|
+
* single `navigator.modelContext` descriptor at init time; cleanup restores
|
|
10
|
+
* the previous descriptor. Zero external dependencies.
|
|
9
11
|
*
|
|
10
12
|
* @license AGPL-3.0-or-later
|
|
11
13
|
*/
|
package/dist/polyfill.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAKV,iBAAiB,EAOjB,qBAAqB,EAOtB,MAAM,YAAY,CAAC;AA2SpB;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA2B5B;AA6UD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAWzC;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAyEN;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAsD5C;AAMD,OAAO,EAAE,wBAAwB,IAAI,OAAO,EAAE,CAAC"}
|
package/dist/polyfill.js
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
* Implements the 17 MUST HAVE features of the W3C WebMCP Draft CG Report
|
|
5
5
|
* (2026-03-27) plus ecosystem extras.
|
|
6
6
|
*
|
|
7
|
-
* Architecture: module-level state (
|
|
8
|
-
*
|
|
7
|
+
* Architecture: shared module-level state (toolMap, polyfillOptions,
|
|
8
|
+
* installState) mutated by installPolyfill/uninstallPolyfill. Installs a
|
|
9
|
+
* single `navigator.modelContext` descriptor at init time; cleanup restores
|
|
10
|
+
* the previous descriptor. Zero external dependencies.
|
|
9
11
|
*
|
|
10
12
|
* @license AGPL-3.0-or-later
|
|
11
13
|
*/
|
|
@@ -22,7 +24,7 @@ let toolsChangedCallback = null;
|
|
|
22
24
|
/** Polyfill configuration set at init time */
|
|
23
25
|
let polyfillOptions = {};
|
|
24
26
|
/** Install state — tracks whether we installed and the previous descriptors */
|
|
25
|
-
const installState = { installed: false };
|
|
27
|
+
const installState = { installed: false, didOverride: false, didOverrideTesting: false };
|
|
26
28
|
// ---------------------------------------------------------------------------
|
|
27
29
|
// Internal helpers
|
|
28
30
|
// ---------------------------------------------------------------------------
|
|
@@ -578,6 +580,8 @@ export function initializeWebMCPPolyfill(options) {
|
|
|
578
580
|
// forcePolyfill is checked BEFORE the native skip so it takes precedence
|
|
579
581
|
if (hasNativeWebMCP() && !polyfillOptions.forcePolyfill) {
|
|
580
582
|
installState.installed = true;
|
|
583
|
+
installState.didOverride = false;
|
|
584
|
+
installState.didOverrideTesting = false;
|
|
581
585
|
return;
|
|
582
586
|
}
|
|
583
587
|
// If our polyfill is already installed, cleanup first then re-install
|
|
@@ -597,6 +601,7 @@ export function initializeWebMCPPolyfill(options) {
|
|
|
597
601
|
writable: false,
|
|
598
602
|
enumerable: true,
|
|
599
603
|
});
|
|
604
|
+
installState.didOverride = true;
|
|
600
605
|
// Fix 14 — installTestingShim option
|
|
601
606
|
const shimOption = polyfillOptions.installTestingShim ?? 'if-missing';
|
|
602
607
|
if (shimOption === 'always' ||
|
|
@@ -607,6 +612,7 @@ export function initializeWebMCPPolyfill(options) {
|
|
|
607
612
|
writable: false,
|
|
608
613
|
enumerable: true,
|
|
609
614
|
});
|
|
615
|
+
installState.didOverrideTesting = true;
|
|
610
616
|
}
|
|
611
617
|
}
|
|
612
618
|
installState.installed = true;
|
|
@@ -626,22 +632,29 @@ export function cleanupWebMCPPolyfill() {
|
|
|
626
632
|
toolMap.clear();
|
|
627
633
|
// Clear callback slot
|
|
628
634
|
toolsChangedCallback = null;
|
|
629
|
-
// Fix 7 — Restore previous descriptors instead of deleting
|
|
635
|
+
// Fix 7 — Restore previous descriptors instead of deleting.
|
|
636
|
+
// Guard with didOverride/didOverrideTesting: when native WebMCP was present
|
|
637
|
+
// and we short-circuited install, we never defined properties on navigator
|
|
638
|
+
// and must NOT delete or overwrite them here (that would remove the native).
|
|
630
639
|
if (typeof navigator !== 'undefined') {
|
|
631
640
|
try {
|
|
632
|
-
if (installState.
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
Object.defineProperty(navigator, 'modelContextTesting', installState.previousModelContextTestingDescriptor);
|
|
641
|
+
if (installState.didOverride) {
|
|
642
|
+
if (installState.previousModelContextDescriptor) {
|
|
643
|
+
Object.defineProperty(navigator, 'modelContext', installState.previousModelContextDescriptor);
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
delete navigator.modelContext;
|
|
647
|
+
}
|
|
640
648
|
}
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
649
|
+
if (installState.didOverrideTesting) {
|
|
650
|
+
if (installState.previousModelContextTestingDescriptor) {
|
|
651
|
+
Object.defineProperty(navigator, 'modelContextTesting', installState.previousModelContextTestingDescriptor);
|
|
652
|
+
}
|
|
653
|
+
else {
|
|
654
|
+
const testingDesc = Object.getOwnPropertyDescriptor(navigator, 'modelContextTesting');
|
|
655
|
+
if (testingDesc?.configurable) {
|
|
656
|
+
delete navigator.modelContextTesting;
|
|
657
|
+
}
|
|
645
658
|
}
|
|
646
659
|
}
|
|
647
660
|
}
|
|
@@ -652,6 +665,8 @@ export function cleanupWebMCPPolyfill() {
|
|
|
652
665
|
// Reset options and install state
|
|
653
666
|
polyfillOptions = {};
|
|
654
667
|
installState.installed = false;
|
|
668
|
+
installState.didOverride = false;
|
|
669
|
+
installState.didOverrideTesting = false;
|
|
655
670
|
installState.previousModelContextDescriptor = undefined;
|
|
656
671
|
installState.previousModelContextTestingDescriptor = undefined;
|
|
657
672
|
}
|