@mcp-b/global 1.1.2 → 1.1.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/global.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/global.ts"],"sourcesContent":[],"mappings":"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"}
@@ -5,4 +5,4 @@ ${t}`:t}else if(e.examples!==void 0&&Array.isArray(e.examples)){let t=e.examples
5
5
  ${t.map(e=>` ${JSON.stringify(e)}`).join(`
6
6
  `)}`;n=n?`${n}
7
7
  ${e}`:e}}return n&&(t=t.describe(n)),t},za=(e,t,n)=>{if(e.default!==void 0){if(e.default===null&&n?.path.some(e=>e===`anyOf`||e===`oneOf`)&&e.type&&e.type!==`null`&&!e.nullable)return t;t=t.default(e.default)}return t},Ba=(e,t)=>(e.readOnly&&(t=t.readonly()),t),Va=(e,t)=>xa.a.nullable(e)?Ma(e,t):xa.an.object(e)?Ia(e,t):xa.an.array(e)?Sa(e,t):xa.an.anyOf(e)?ba(e,t):xa.an.allOf(e)?ya(e,t):xa.a.oneOf(e)?Pa(e,t):xa.a.not(e)?ka(e,t):xa.an.enum(e)?Ea(e):xa.a.const(e)?wa(e):xa.a.multipleType(e)?Oa(e,t):xa.a.primitive(e,`string`)?La(e):xa.a.primitive(e,`number`)||xa.a.primitive(e,`integer`)?Na(e):xa.a.primitive(e,`boolean`)?Ca(e):xa.a.primitive(e,`null`)?Aa(e):xa.a.conditional(e)?Da(e,t):Ta(e),Ha=(e,t={seen:new Map,path:[]},n)=>{if(typeof e!=`object`)return e?tt():rt();if(t.parserOverride){let n=t.parserOverride(e,t);if(n instanceof N)return n}let r=t.seen.get(e);if(r){if(r.r!==void 0)return r.r;if(t.depth===void 0||r.n>=t.depth)return tt();r.n+=1}else r={r:void 0,n:0},t.seen.set(e,r);let i=Va(e,t);return n||(t.withoutDescribes||(i=Ra(e,i)),t.withoutDefaults||(i=za(e,i,t)),i=Ba(e,i)),r.r=i,i},Ua=(e,t={})=>Ha(e,{path:[],seen:new Map,...t});function Wa(e){if(typeof e!=`object`||!e||`type`in e&&typeof e.type==`string`)return!1;let t=Object.values(e);return t.length===0?!1:t.some(e=>e instanceof N)}function Ga(e){try{return Ua(e)}catch(e){return console.warn(`[Web Model Context] Failed to convert JSON Schema to Zod:`,e),Y({}).passthrough()}}function Ka(e){let t={},n=[];for(let[r,i]of Object.entries(e)){let e=i.description||void 0,a=`string`,o,s;if(i instanceof pe)a=`string`;else if(i instanceof he)a=`number`;else if(i instanceof _e)a=`boolean`;else if(i instanceof Ee){a=`array`;let e=i.element;s=e instanceof pe?{type:`string`}:e instanceof he?{type:`number`}:e instanceof _e?{type:`boolean`}:{type:`string`}}else if(i instanceof Oe)a=`object`;else if(i instanceof He){a=`string`;let e=i._def;e?.values&&(o=e.values)}let c={type:a};e&&(c.description=e),o&&(c.enum=o),s&&(c.items=s),t[r]=c,i.isOptional()||n.push(r)}return{type:`object`,properties:t,...n.length>0&&{required:n}}}function qa(e){if(Wa(e))return{jsonSchema:Ka(e),zodValidator:Y(e)};let t=e;return{jsonSchema:t,zodValidator:Ga(t)}}function Ja(e,t){let n=t.safeParse(e);return n.success?{success:!0,data:n.data}:{success:!1,error:`Validation failed:\n${n.error.errors.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
8
- `)}`}}function Ya(){if(typeof window>`u`||typeof navigator>`u`)return{hasNativeContext:!1,hasNativeTesting:!1};let e=navigator.modelContext,t=navigator.modelContextTesting;return!e||!t||(t.constructor?.name||``).includes(`WebModelContext`)?{hasNativeContext:!1,hasNativeTesting:!1}:{hasNativeContext:!0,hasNativeTesting:!0}}var Xa=class{nativeContext;nativeTesting;bridge;syncInProgress=!1;constructor(e,t,n){this.bridge=e,this.nativeContext=t,this.nativeTesting=n,this.nativeTesting.registerToolsChangedCallback(()=>{console.log(`[Native Adapter] Tool change detected from native API`),this.syncToolsFromNative()}),this.syncToolsFromNative()}syncToolsFromNative(){if(!this.syncInProgress){this.syncInProgress=!0;try{let e=this.nativeTesting.listTools();console.log(`[Native Adapter] Syncing ${e.length} tools from native API`),this.bridge.tools.clear();for(let t of e)try{let e=JSON.parse(t.inputSchema),n={name:t.name,description:t.description,inputSchema:e,execute:async e=>{let n=await this.nativeTesting.executeTool(t.name,JSON.stringify(e));return this.convertToToolResponse(n)},inputValidator:Ga(e)};this.bridge.tools.set(t.name,n)}catch(e){console.error(`[Native Adapter] Failed to sync tool "${t.name}":`,e)}this.notifyMCPServers()}finally{this.syncInProgress=!1}}}convertToToolResponse(e){return typeof e==`string`?{content:[{type:`text`,text:e}]}:e==null?{content:[{type:`text`,text:``}]}:typeof e==`object`?{content:[{type:`text`,text:JSON.stringify(e,null,2)}],structuredContent:e}:{content:[{type:`text`,text:String(e)}]}}notifyMCPServers(){this.bridge.tabServer?.notification&&this.bridge.tabServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/tools/list_changed`,params:{}})}provideContext(e){console.log(`[Native Adapter] Delegating provideContext to native API`),this.nativeContext.provideContext(e)}registerTool(e){return console.log(`[Native Adapter] Delegating registerTool("${e.name}") to native API`),this.nativeContext.registerTool(e)}unregisterTool(e){console.log(`[Native Adapter] Delegating unregisterTool("${e}") to native API`),this.nativeContext.unregisterTool(e)}clearContext(){console.log(`[Native Adapter] Delegating clearContext to native API`),this.nativeContext.clearContext()}async executeTool(e,t){console.log(`[Native Adapter] Executing tool "${e}" via native API`);try{let n=await this.nativeTesting.executeTool(e,JSON.stringify(t));return this.convertToToolResponse(n)}catch(t){return console.error(`[Native Adapter] Error executing tool "${e}":`,t),{content:[{type:`text`,text:`Error: ${t instanceof Error?t.message:String(t)}`}],isError:!0}}}listTools(){return Array.from(this.bridge.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,...e.outputSchema&&{outputSchema:e.outputSchema},...e.annotations&&{annotations:e.annotations}}))}addEventListener(e,t,n){this.nativeContext.addEventListener(e,t,n)}removeEventListener(e,t,n){this.nativeContext.removeEventListener(e,t,n)}dispatchEvent(e){return this.nativeContext.dispatchEvent(e)}},Za=class extends Event{name;arguments;_response=null;_responded=!1;constructor(e,t){super(`toolcall`,{cancelable:!0}),this.name=e,this.arguments=t}respondWith(e){if(this._responded)throw Error(`Response already provided for this tool call`);this._response=e,this._responded=!0}getResponse(){return this._response}hasResponse(){return this._responded}},Qa=class{toolCallHistory=[];mockResponses=new Map;toolsChangedCallbacks=new Set;bridge;constructor(e){this.bridge=e}recordToolCall(e,t){this.toolCallHistory.push({toolName:e,arguments:t,timestamp:Date.now()})}hasMockResponse(e){return this.mockResponses.has(e)}getMockResponse(e){return this.mockResponses.get(e)}notifyToolsChanged(){for(let e of this.toolsChangedCallbacks)try{e()}catch(e){console.error(`[Model Context Testing] Error in tools changed callback:`,e)}}async executeTool(e,t){console.log(`[Model Context Testing] Executing tool: ${e}`);let n;try{n=JSON.parse(t)}catch(e){throw SyntaxError(`Invalid JSON input: ${e instanceof Error?e.message:String(e)}`)}if(!this.bridge.tools.get(e))throw Error(`Tool not found: ${e}`);let r=await this.bridge.modelContext.executeTool(e,n);if(!r.isError){if(r.structuredContent)return r.structuredContent;if(r.content&&r.content.length>0){let e=r.content[0];if(e&&e.type===`text`)return e.text}}}listTools(){return this.bridge.modelContext.listTools().map(e=>({name:e.name,description:e.description,inputSchema:JSON.stringify(e.inputSchema)}))}registerToolsChangedCallback(e){this.toolsChangedCallbacks.add(e),console.log(`[Model Context Testing] Tools changed callback registered`)}getToolCalls(){return[...this.toolCallHistory]}clearToolCalls(){this.toolCallHistory=[],console.log(`[Model Context Testing] Tool call history cleared`)}setMockToolResponse(e,t){this.mockResponses.set(e,t),console.log(`[Model Context Testing] Mock response set for tool: ${e}`)}clearMockToolResponse(e){this.mockResponses.delete(e),console.log(`[Model Context Testing] Mock response cleared for tool: ${e}`)}clearAllMockToolResponses(){this.mockResponses.clear(),console.log(`[Model Context Testing] All mock responses cleared`)}getRegisteredTools(){return this.bridge.modelContext.listTools()}reset(){this.clearToolCalls(),this.clearAllMockToolResponses(),console.log(`[Model Context Testing] Testing state reset`)}},$a=class{bridge;eventTarget;provideContextTools;dynamicTools;registrationTimestamps;unregisterFunctions;testingAPI;constructor(e){this.bridge=e,this.eventTarget=new EventTarget,this.provideContextTools=new Map,this.dynamicTools=new Map,this.registrationTimestamps=new Map,this.unregisterFunctions=new Map}setTestingAPI(e){this.testingAPI=e}addEventListener(e,t,n){this.eventTarget.addEventListener(e,t,n)}removeEventListener(e,t,n){this.eventTarget.removeEventListener(e,t,n)}dispatchEvent(e){return this.eventTarget.dispatchEvent(e)}provideContext(e){console.log(`[Web Model Context] Registering ${e.tools.length} tools via provideContext`),this.provideContextTools.clear();for(let t of e.tools){if(this.dynamicTools.has(t.name))throw Error(`[Web Model Context] Tool name collision: "${t.name}" is already registered via registerTool(). Please use a different name or unregister the dynamic tool first.`);let{jsonSchema:e,zodValidator:n}=qa(t.inputSchema),r=t.outputSchema?qa(t.outputSchema):null,i={name:t.name,description:t.description,inputSchema:e,...r&&{outputSchema:r.jsonSchema},...t.annotations&&{annotations:t.annotations},execute:t.execute,inputValidator:n,...r&&{outputValidator:r.zodValidator}};this.provideContextTools.set(t.name,i)}this.updateBridgeTools(),this.notifyToolsListChanged()}registerTool(e){console.log(`[Web Model Context] Registering tool dynamically: ${e.name}`);let t=Date.now(),n=this.registrationTimestamps.get(e.name);if(n&&t-n<50){console.warn(`[Web Model Context] Tool "${e.name}" registered multiple times within 50ms. This is likely due to React Strict Mode double-mounting. Ignoring duplicate registration.`);let t=this.unregisterFunctions.get(e.name);if(t)return{unregister:t}}if(this.provideContextTools.has(e.name))throw Error(`[Web Model Context] Tool name collision: "${e.name}" is already registered via provideContext(). Please use a different name or update your provideContext() call.`);if(this.dynamicTools.has(e.name))throw Error(`[Web Model Context] Tool name collision: "${e.name}" is already registered via registerTool(). Please unregister it first or use a different name.`);let{jsonSchema:r,zodValidator:i}=qa(e.inputSchema),a=e.outputSchema?qa(e.outputSchema):null,o={name:e.name,description:e.description,inputSchema:r,...a&&{outputSchema:a.jsonSchema},...e.annotations&&{annotations:e.annotations},execute:e.execute,inputValidator:i,...a&&{outputValidator:a.zodValidator}};this.dynamicTools.set(e.name,o),this.registrationTimestamps.set(e.name,t),this.updateBridgeTools(),this.notifyToolsListChanged();let s=()=>{if(console.log(`[Web Model Context] Unregistering tool: ${e.name}`),this.provideContextTools.has(e.name))throw Error(`[Web Model Context] Cannot unregister tool "${e.name}": This tool was registered via provideContext(). Use provideContext() to update the base tool set.`);if(!this.dynamicTools.has(e.name)){console.warn(`[Web Model Context] Tool "${e.name}" is not registered, ignoring unregister call`);return}this.dynamicTools.delete(e.name),this.registrationTimestamps.delete(e.name),this.unregisterFunctions.delete(e.name),this.updateBridgeTools(),this.notifyToolsListChanged()};return this.unregisterFunctions.set(e.name,s),{unregister:s}}unregisterTool(e){console.log(`[Web Model Context] Unregistering tool: ${e}`);let t=this.provideContextTools.has(e),n=this.dynamicTools.has(e);if(!t&&!n){console.warn(`[Web Model Context] Tool "${e}" is not registered, ignoring unregister call`);return}t&&this.provideContextTools.delete(e),n&&(this.dynamicTools.delete(e),this.registrationTimestamps.delete(e),this.unregisterFunctions.delete(e)),this.updateBridgeTools(),this.notifyToolsListChanged()}clearContext(){console.log(`[Web Model Context] Clearing all tools`),this.provideContextTools.clear(),this.dynamicTools.clear(),this.registrationTimestamps.clear(),this.unregisterFunctions.clear(),this.updateBridgeTools(),this.notifyToolsListChanged()}updateBridgeTools(){this.bridge.tools.clear();for(let[e,t]of this.provideContextTools)this.bridge.tools.set(e,t);for(let[e,t]of this.dynamicTools)this.bridge.tools.set(e,t);console.log(`[Web Model Context] Updated bridge with ${this.provideContextTools.size} base tools + ${this.dynamicTools.size} dynamic tools = ${this.bridge.tools.size} total`)}notifyToolsListChanged(){this.bridge.tabServer.notification&&this.bridge.tabServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.testingAPI&&`notifyToolsChanged`in this.testingAPI&&this.testingAPI.notifyToolsChanged()}async executeTool(e,t){let n=this.bridge.tools.get(e);if(!n)throw Error(`Tool not found: ${e}`);console.log(`[Web Model Context] Validating input for tool: ${e}`);let r=Ja(t,n.inputValidator);if(!r.success)return console.error(`[Web Model Context] Input validation failed for ${e}:`,r.error),{content:[{type:`text`,text:`Input validation error for tool "${e}":\n${r.error}`}],isError:!0};let i=r.data;if(this.testingAPI&&this.testingAPI.recordToolCall(e,i),this.testingAPI?.hasMockResponse(e)){let t=this.testingAPI.getMockResponse(e);if(t)return console.log(`[Web Model Context] Returning mock response for tool: ${e}`),t}let a=new Za(e,i);if(this.dispatchEvent(a),a.defaultPrevented&&a.hasResponse()){let t=a.getResponse();if(t)return console.log(`[Web Model Context] Tool ${e} handled by event listener`),t}console.log(`[Web Model Context] Executing tool: ${e}`);try{let t=await n.execute(i);if(n.outputValidator&&t.structuredContent){let r=Ja(t.structuredContent,n.outputValidator);r.success||console.warn(`[Web Model Context] Output validation failed for ${e}:`,r.error)}return t}catch(t){return console.error(`[Web Model Context] Error executing tool ${e}:`,t),{content:[{type:`text`,text:`Error: ${t instanceof Error?t.message:String(t)}`}],isError:!0}}}listTools(){return Array.from(this.bridge.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,...e.outputSchema&&{outputSchema:e.outputSchema},...e.annotations&&{annotations:e.annotations}}))}};function eo(e){console.log(`[Web Model Context] Initializing MCP bridge`);let t=window.location.hostname||`localhost`,n=e?.transport,r=(e,t)=>{e.setRequestHandler(Jr,async()=>(console.log(`[MCP Bridge] Handling list_tools request`),{tools:t.modelContext.listTools()})),e.setRequestHandler(Zr,async e=>{console.log(`[MCP Bridge] Handling call_tool request: ${e.params.name}`);let n=e.params.name,r=e.params.arguments||{};try{let e=await t.modelContext.executeTool(n,r);return{content:e.content,isError:e.isError}}catch(e){throw console.error(`[MCP Bridge] Error calling tool ${n}:`,e),e}})},i=n?.create?.();if(i){console.log(`[Web Model Context] Using custom transport`);let e=new fa({name:t,version:`1.0.0`},{capabilities:{tools:{listChanged:!0}}}),n={tabServer:e,tools:new Map,modelContext:void 0,isInitialized:!0};return n.modelContext=new $a(n),r(e,n),e.connect(i),console.log(`[Web Model Context] MCP server connected with custom transport`),n}console.log(`[Web Model Context] Using dual-server mode`);let a=n?.tabServer!==!1,o=new fa({name:`${t}-tab`,version:`1.0.0`},{capabilities:{tools:{listChanged:!0}}}),s={tabServer:o,tools:new Map,modelContext:void 0,isInitialized:!0};if(s.modelContext=new $a(s),r(o,s),a){let{allowedOrigins:e,...t}=typeof n?.tabServer==`object`?n.tabServer:{},r=new Rn({allowedOrigins:e??[`*`],...t});o.connect(r),console.log(`[Web Model Context] Tab server connected`)}let c=typeof window<`u`&&window.parent!==window,l=n?.iframeServer;if(l!==!1&&(l!==void 0||c)){console.log(`[Web Model Context] Enabling iframe server`);let e=new fa({name:`${t}-iframe`,version:`1.0.0`},{capabilities:{tools:{listChanged:!0}}});r(e,s);let{allowedOrigins:n,...i}=typeof l==`object`?l:{},a=new Ln({allowedOrigins:n??[`*`],...i});e.connect(a),s.iframeServer=e,console.log(`[Web Model Context] Iframe server connected`)}return s}function to(e){if(typeof window>`u`){console.warn(`[Web Model Context] Not in browser environment, skipping initialization`);return}let t=e??window.__webModelContextOptions,n=Ya();if(n.hasNativeContext&&n.hasNativeTesting){let e=window.navigator.modelContext,n=window.navigator.modelContextTesting;if(!e||!n){console.error(`[Web Model Context] Native API detection mismatch`);return}console.log(`✅ [Web Model Context] Native Chromium API detected`),console.log(` Using native implementation with MCP bridge synchronization`),console.log(` Native API will automatically collect tools from embedded iframes`);try{let r=eo(t);r.modelContext=new Xa(r,e,n),r.modelContextTesting=n,Object.defineProperty(window,`__mcpBridge`,{value:r,writable:!1,configurable:!0}),console.log(`✅ [Web Model Context] MCP bridge synced with native API`),console.log(` MCP clients will receive automatic tool updates from native registry`)}catch(e){throw console.error(`[Web Model Context] Failed to initialize native adapter:`,e),e}return}if(n.hasNativeContext&&!n.hasNativeTesting){console.warn(`[Web Model Context] Partial native API detected`),console.warn(` navigator.modelContext exists but navigator.modelContextTesting is missing`),console.warn(` Cannot sync with native API. Please enable experimental features:`),console.warn(` - Navigate to chrome://flags`),console.warn(` - Enable "Experimental Web Platform Features"`),console.warn(` - Or launch with: --enable-experimental-web-platform-features`),console.warn(` Skipping initialization to avoid conflicts`);return}if(window.navigator.modelContext){console.warn(`[Web Model Context] window.navigator.modelContext already exists, skipping initialization`);return}console.log(`[Web Model Context] Native API not detected, installing polyfill`);try{let e=eo(t);Object.defineProperty(window.navigator,`modelContext`,{value:e.modelContext,writable:!1,configurable:!1}),Object.defineProperty(window,`__mcpBridge`,{value:e,writable:!1,configurable:!0}),console.log(`✅ [Web Model Context] window.navigator.modelContext initialized successfully`),console.log(`[Model Context Testing] Installing polyfill`),console.log(` 💡 To use the native implementation in Chromium:`),console.log(` - Navigate to chrome://flags`),console.log(` - Enable "Experimental Web Platform Features"`),console.log(` - Or launch with: --enable-experimental-web-platform-features`);let n=new Qa(e);e.modelContextTesting=n,e.modelContext.setTestingAPI(n),Object.defineProperty(window.navigator,`modelContextTesting`,{value:n,writable:!1,configurable:!0}),console.log(`✅ [Model Context Testing] Polyfill installed at window.navigator.modelContextTesting`)}catch(e){throw console.error(`[Web Model Context] Failed to initialize:`,e),e}}function no(){if(!(typeof window>`u`)){if(window.__mcpBridge)try{window.__mcpBridge.tabServer.close(),window.__mcpBridge.iframeServer&&window.__mcpBridge.iframeServer.close()}catch(e){console.warn(`[Web Model Context] Error closing MCP servers:`,e)}delete window.navigator.modelContext,delete window.navigator.modelContextTesting,delete window.__mcpBridge,console.log(`[Web Model Context] Cleaned up`)}}function ro(e,t){return e?t?{...e,...t,tabServer:{...e.tabServer??{},...t.tabServer??{}}}:e:t}function io(e,t){return e?t?{...e,...t,transport:ro(e.transport??{},t.transport??{})}:e:t}function ao(e){if(!e||!e.dataset)return;let{dataset:t}=e;if(t.webmcpOptions)try{return JSON.parse(t.webmcpOptions)}catch(e){console.error(`[Web Model Context] Invalid JSON in data-webmcp-options:`,e);return}let n={},r=!1;t.webmcpAutoInitialize!==void 0&&(n.autoInitialize=t.webmcpAutoInitialize!==`false`,r=!0);let i={},a=!1;if(t.webmcpAllowedOrigins){let e=t.webmcpAllowedOrigins.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);e.length>0&&(i.allowedOrigins=e,r=!0,a=!0)}return t.webmcpChannelId&&(i.channelId=t.webmcpChannelId,r=!0,a=!0),a&&(n.transport={...n.transport??{},tabServer:{...n.transport?.tabServer??{},...i}}),r?n:void 0}if(typeof window<`u`&&typeof document<`u`){let e=window.__webModelContextOptions,t=document.currentScript,n=ao(t),r=io(e,n)??e??n;r&&(window.__webModelContextOptions=r);let i=r?.autoInitialize!==!1;try{i&&to(r)}catch(e){console.error(`[Web Model Context] Auto-initialization failed:`,e)}}return e.cleanupWebModelContext=no,e.initializeWebModelContext=to,e})({});
8
+ `)}`}}function Ya(){if(typeof window>`u`||typeof navigator>`u`)return{hasNativeContext:!1,hasNativeTesting:!1};let e=navigator.modelContext,t=navigator.modelContextTesting;return!e||!t||(t.constructor?.name||``).includes(`WebModelContext`)?{hasNativeContext:!1,hasNativeTesting:!1}:{hasNativeContext:!0,hasNativeTesting:!0}}var Xa=class{nativeContext;nativeTesting;bridge;syncInProgress=!1;constructor(e,t,n){this.bridge=e,this.nativeContext=t,this.nativeTesting=n,this.nativeTesting.registerToolsChangedCallback(()=>{console.log(`[Native Adapter] Tool change detected from native API`),this.syncToolsFromNative()}),this.syncToolsFromNative()}syncToolsFromNative(){if(!this.syncInProgress){this.syncInProgress=!0;try{let e=this.nativeTesting.listTools();console.log(`[Native Adapter] Syncing ${e.length} tools from native API`),this.bridge.tools.clear();for(let t of e)try{let e=JSON.parse(t.inputSchema),n={name:t.name,description:t.description,inputSchema:e,execute:async e=>{let n=await this.nativeTesting.executeTool(t.name,JSON.stringify(e));return this.convertToToolResponse(n)},inputValidator:Ga(e)};this.bridge.tools.set(t.name,n)}catch(e){console.error(`[Native Adapter] Failed to sync tool "${t.name}":`,e)}this.notifyMCPServers()}finally{this.syncInProgress=!1}}}convertToToolResponse(e){return typeof e==`string`?{content:[{type:`text`,text:e}]}:e==null?{content:[{type:`text`,text:``}]}:typeof e==`object`?{content:[{type:`text`,text:JSON.stringify(e,null,2)}],structuredContent:e}:{content:[{type:`text`,text:String(e)}]}}notifyMCPServers(){this.bridge.tabServer?.notification&&this.bridge.tabServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/tools/list_changed`,params:{}})}provideContext(e){console.log(`[Native Adapter] Delegating provideContext to native API`),this.nativeContext.provideContext(e)}registerTool(e){return console.log(`[Native Adapter] Delegating registerTool("${e.name}") to native API`),this.nativeContext.registerTool(e)}unregisterTool(e){console.log(`[Native Adapter] Delegating unregisterTool("${e}") to native API`),this.nativeContext.unregisterTool(e)}clearContext(){console.log(`[Native Adapter] Delegating clearContext to native API`),this.nativeContext.clearContext()}async executeTool(e,t){console.log(`[Native Adapter] Executing tool "${e}" via native API`);try{let n=await this.nativeTesting.executeTool(e,JSON.stringify(t));return this.convertToToolResponse(n)}catch(t){return console.error(`[Native Adapter] Error executing tool "${e}":`,t),{content:[{type:`text`,text:`Error: ${t instanceof Error?t.message:String(t)}`}],isError:!0}}}listTools(){return Array.from(this.bridge.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,...e.outputSchema&&{outputSchema:e.outputSchema},...e.annotations&&{annotations:e.annotations}}))}registerResource(e){return console.warn(`[Native Adapter] registerResource is not supported by native API`),{unregister:()=>{}}}unregisterResource(e){console.warn(`[Native Adapter] unregisterResource is not supported by native API`)}listResources(){return[]}listResourceTemplates(){return[]}async readResource(e){throw Error(`[Native Adapter] readResource is not supported by native API`)}registerPrompt(e){return console.warn(`[Native Adapter] registerPrompt is not supported by native API`),{unregister:()=>{}}}unregisterPrompt(e){console.warn(`[Native Adapter] unregisterPrompt is not supported by native API`)}listPrompts(){return[]}async getPrompt(e,t){throw Error(`[Native Adapter] getPrompt is not supported by native API`)}addEventListener(e,t,n){this.nativeContext.addEventListener(e,t,n)}removeEventListener(e,t,n){this.nativeContext.removeEventListener(e,t,n)}dispatchEvent(e){return this.nativeContext.dispatchEvent(e)}async createMessage(e){console.log(`[Native Adapter] Requesting sampling from client`);let t=this.bridge.tabServer.server;if(!t?.createMessage)throw Error(`Sampling is not supported: no connected client with sampling capability`);return t.createMessage(e)}async elicitInput(e){console.log(`[Native Adapter] Requesting elicitation from client`);let t=this.bridge.tabServer.server;if(!t?.elicitInput)throw Error(`Elicitation is not supported: no connected client with elicitation capability`);return t.elicitInput(e)}},Za=class extends Event{name;arguments;_response=null;_responded=!1;constructor(e,t){super(`toolcall`,{cancelable:!0}),this.name=e,this.arguments=t}respondWith(e){if(this._responded)throw Error(`Response already provided for this tool call`);this._response=e,this._responded=!0}getResponse(){return this._response}hasResponse(){return this._responded}},Qa=class{toolCallHistory=[];mockResponses=new Map;toolsChangedCallbacks=new Set;bridge;constructor(e){this.bridge=e}recordToolCall(e,t){this.toolCallHistory.push({toolName:e,arguments:t,timestamp:Date.now()})}hasMockResponse(e){return this.mockResponses.has(e)}getMockResponse(e){return this.mockResponses.get(e)}notifyToolsChanged(){for(let e of this.toolsChangedCallbacks)try{e()}catch(e){console.error(`[Model Context Testing] Error in tools changed callback:`,e)}}async executeTool(e,t){console.log(`[Model Context Testing] Executing tool: ${e}`);let n;try{n=JSON.parse(t)}catch(e){throw SyntaxError(`Invalid JSON input: ${e instanceof Error?e.message:String(e)}`)}if(!this.bridge.tools.get(e))throw Error(`Tool not found: ${e}`);let r=await this.bridge.modelContext.executeTool(e,n);if(!r.isError){if(r.structuredContent)return r.structuredContent;if(r.content&&r.content.length>0){let e=r.content[0];if(e&&e.type===`text`)return e.text}}}listTools(){return this.bridge.modelContext.listTools().map(e=>({name:e.name,description:e.description,inputSchema:JSON.stringify(e.inputSchema)}))}registerToolsChangedCallback(e){this.toolsChangedCallbacks.add(e),console.log(`[Model Context Testing] Tools changed callback registered`)}getToolCalls(){return[...this.toolCallHistory]}clearToolCalls(){this.toolCallHistory=[],console.log(`[Model Context Testing] Tool call history cleared`)}setMockToolResponse(e,t){this.mockResponses.set(e,t),console.log(`[Model Context Testing] Mock response set for tool: ${e}`)}clearMockToolResponse(e){this.mockResponses.delete(e),console.log(`[Model Context Testing] Mock response cleared for tool: ${e}`)}clearAllMockToolResponses(){this.mockResponses.clear(),console.log(`[Model Context Testing] All mock responses cleared`)}getRegisteredTools(){return this.bridge.modelContext.listTools()}reset(){this.clearToolCalls(),this.clearAllMockToolResponses(),console.log(`[Model Context Testing] Testing state reset`)}},$a=class{bridge;eventTarget;provideContextTools;dynamicTools;provideContextResources;dynamicResources;provideContextPrompts;dynamicPrompts;toolRegistrationTimestamps;resourceRegistrationTimestamps;promptRegistrationTimestamps;toolUnregisterFunctions;resourceUnregisterFunctions;promptUnregisterFunctions;testingAPI;constructor(e){this.bridge=e,this.eventTarget=new EventTarget,this.provideContextTools=new Map,this.dynamicTools=new Map,this.toolRegistrationTimestamps=new Map,this.toolUnregisterFunctions=new Map,this.provideContextResources=new Map,this.dynamicResources=new Map,this.resourceRegistrationTimestamps=new Map,this.resourceUnregisterFunctions=new Map,this.provideContextPrompts=new Map,this.dynamicPrompts=new Map,this.promptRegistrationTimestamps=new Map,this.promptUnregisterFunctions=new Map}setTestingAPI(e){this.testingAPI=e}addEventListener(e,t,n){this.eventTarget.addEventListener(e,t,n)}removeEventListener(e,t,n){this.eventTarget.removeEventListener(e,t,n)}dispatchEvent(e){return this.eventTarget.dispatchEvent(e)}provideContext(e){let t=e.tools?.length??0,n=e.resources?.length??0,r=e.prompts?.length??0;console.log(`[Web Model Context] provideContext: ${t} tools, ${n} resources, ${r} prompts`),this.provideContextTools.clear(),this.provideContextResources.clear(),this.provideContextPrompts.clear();for(let t of e.tools??[]){if(this.dynamicTools.has(t.name))throw Error(`[Web Model Context] Tool name collision: "${t.name}" is already registered via registerTool(). Please use a different name or unregister the dynamic tool first.`);let{jsonSchema:e,zodValidator:n}=qa(t.inputSchema),r=t.outputSchema?qa(t.outputSchema):null,i={name:t.name,description:t.description,inputSchema:e,...r&&{outputSchema:r.jsonSchema},...t.annotations&&{annotations:t.annotations},execute:t.execute,inputValidator:n,...r&&{outputValidator:r.zodValidator}};this.provideContextTools.set(t.name,i)}for(let t of e.resources??[]){if(this.dynamicResources.has(t.uri))throw Error(`[Web Model Context] Resource URI collision: "${t.uri}" is already registered via registerResource(). Please use a different URI or unregister the dynamic resource first.`);let e=this.validateResource(t);this.provideContextResources.set(t.uri,e)}for(let t of e.prompts??[]){if(this.dynamicPrompts.has(t.name))throw Error(`[Web Model Context] Prompt name collision: "${t.name}" is already registered via registerPrompt(). Please use a different name or unregister the dynamic prompt first.`);let e=this.validatePrompt(t);this.provideContextPrompts.set(t.name,e)}this.updateBridgeTools(),this.updateBridgeResources(),this.updateBridgePrompts(),this.notifyToolsListChanged(),this.notifyResourcesListChanged(),this.notifyPromptsListChanged()}validateResource(e){let t=/\{([^}]+)\}/g,n=[];for(let r of e.uri.matchAll(t)){let e=r[1];e&&n.push(e)}return{uri:e.uri,name:e.name,description:e.description,mimeType:e.mimeType,read:e.read,isTemplate:n.length>0,templateParams:n}}validatePrompt(e){let t,n;if(e.argsSchema){let r=qa(e.argsSchema);t=r.jsonSchema,n=r.zodValidator}return{name:e.name,description:e.description,argsSchema:t,get:e.get,argsValidator:n}}registerTool(e){console.log(`[Web Model Context] Registering tool dynamically: ${e.name}`);let t=Date.now(),n=this.toolRegistrationTimestamps.get(e.name);if(n&&t-n<50){console.warn(`[Web Model Context] Tool "${e.name}" registered multiple times within 50ms. This is likely due to React Strict Mode double-mounting. Ignoring duplicate registration.`);let t=this.toolUnregisterFunctions.get(e.name);if(t)return{unregister:t}}if(this.provideContextTools.has(e.name))throw Error(`[Web Model Context] Tool name collision: "${e.name}" is already registered via provideContext(). Please use a different name or update your provideContext() call.`);if(this.dynamicTools.has(e.name))throw Error(`[Web Model Context] Tool name collision: "${e.name}" is already registered via registerTool(). Please unregister it first or use a different name.`);let{jsonSchema:r,zodValidator:i}=qa(e.inputSchema),a=e.outputSchema?qa(e.outputSchema):null,o={name:e.name,description:e.description,inputSchema:r,...a&&{outputSchema:a.jsonSchema},...e.annotations&&{annotations:e.annotations},execute:e.execute,inputValidator:i,...a&&{outputValidator:a.zodValidator}};this.dynamicTools.set(e.name,o),this.toolRegistrationTimestamps.set(e.name,t),this.updateBridgeTools(),this.notifyToolsListChanged();let s=()=>{if(console.log(`[Web Model Context] Unregistering tool: ${e.name}`),this.provideContextTools.has(e.name))throw Error(`[Web Model Context] Cannot unregister tool "${e.name}": This tool was registered via provideContext(). Use provideContext() to update the base tool set.`);if(!this.dynamicTools.has(e.name)){console.warn(`[Web Model Context] Tool "${e.name}" is not registered, ignoring unregister call`);return}this.dynamicTools.delete(e.name),this.toolRegistrationTimestamps.delete(e.name),this.toolUnregisterFunctions.delete(e.name),this.updateBridgeTools(),this.notifyToolsListChanged()};return this.toolUnregisterFunctions.set(e.name,s),{unregister:s}}registerResource(e){console.log(`[Web Model Context] Registering resource dynamically: ${e.uri}`);let t=Date.now(),n=this.resourceRegistrationTimestamps.get(e.uri);if(n&&t-n<50){console.warn(`[Web Model Context] Resource "${e.uri}" registered multiple times within 50ms. This is likely due to React Strict Mode double-mounting. Ignoring duplicate registration.`);let t=this.resourceUnregisterFunctions.get(e.uri);if(t)return{unregister:t}}if(this.provideContextResources.has(e.uri))throw Error(`[Web Model Context] Resource URI collision: "${e.uri}" is already registered via provideContext(). Please use a different URI or update your provideContext() call.`);if(this.dynamicResources.has(e.uri))throw Error(`[Web Model Context] Resource URI collision: "${e.uri}" is already registered via registerResource(). Please unregister it first or use a different URI.`);let r=this.validateResource(e);this.dynamicResources.set(e.uri,r),this.resourceRegistrationTimestamps.set(e.uri,t),this.updateBridgeResources(),this.notifyResourcesListChanged();let i=()=>{if(console.log(`[Web Model Context] Unregistering resource: ${e.uri}`),this.provideContextResources.has(e.uri))throw Error(`[Web Model Context] Cannot unregister resource "${e.uri}": This resource was registered via provideContext(). Use provideContext() to update the base resource set.`);if(!this.dynamicResources.has(e.uri)){console.warn(`[Web Model Context] Resource "${e.uri}" is not registered, ignoring unregister call`);return}this.dynamicResources.delete(e.uri),this.resourceRegistrationTimestamps.delete(e.uri),this.resourceUnregisterFunctions.delete(e.uri),this.updateBridgeResources(),this.notifyResourcesListChanged()};return this.resourceUnregisterFunctions.set(e.uri,i),{unregister:i}}unregisterResource(e){console.log(`[Web Model Context] Unregistering resource: ${e}`);let t=this.provideContextResources.has(e),n=this.dynamicResources.has(e);if(!t&&!n){console.warn(`[Web Model Context] Resource "${e}" is not registered, ignoring unregister call`);return}t&&this.provideContextResources.delete(e),n&&(this.dynamicResources.delete(e),this.resourceRegistrationTimestamps.delete(e),this.resourceUnregisterFunctions.delete(e)),this.updateBridgeResources(),this.notifyResourcesListChanged()}listResources(){return Array.from(this.bridge.resources.values()).filter(e=>!e.isTemplate).map(e=>({uri:e.uri,name:e.name,description:e.description,mimeType:e.mimeType}))}listResourceTemplates(){return Array.from(this.bridge.resources.values()).filter(e=>e.isTemplate).map(e=>({uriTemplate:e.uri,name:e.name,...e.description!==void 0&&{description:e.description},...e.mimeType!==void 0&&{mimeType:e.mimeType}}))}registerPrompt(e){console.log(`[Web Model Context] Registering prompt dynamically: ${e.name}`);let t=Date.now(),n=this.promptRegistrationTimestamps.get(e.name);if(n&&t-n<50){console.warn(`[Web Model Context] Prompt "${e.name}" registered multiple times within 50ms. This is likely due to React Strict Mode double-mounting. Ignoring duplicate registration.`);let t=this.promptUnregisterFunctions.get(e.name);if(t)return{unregister:t}}if(this.provideContextPrompts.has(e.name))throw Error(`[Web Model Context] Prompt name collision: "${e.name}" is already registered via provideContext(). Please use a different name or update your provideContext() call.`);if(this.dynamicPrompts.has(e.name))throw Error(`[Web Model Context] Prompt name collision: "${e.name}" is already registered via registerPrompt(). Please unregister it first or use a different name.`);let r=this.validatePrompt(e);this.dynamicPrompts.set(e.name,r),this.promptRegistrationTimestamps.set(e.name,t),this.updateBridgePrompts(),this.notifyPromptsListChanged();let i=()=>{if(console.log(`[Web Model Context] Unregistering prompt: ${e.name}`),this.provideContextPrompts.has(e.name))throw Error(`[Web Model Context] Cannot unregister prompt "${e.name}": This prompt was registered via provideContext(). Use provideContext() to update the base prompt set.`);if(!this.dynamicPrompts.has(e.name)){console.warn(`[Web Model Context] Prompt "${e.name}" is not registered, ignoring unregister call`);return}this.dynamicPrompts.delete(e.name),this.promptRegistrationTimestamps.delete(e.name),this.promptUnregisterFunctions.delete(e.name),this.updateBridgePrompts(),this.notifyPromptsListChanged()};return this.promptUnregisterFunctions.set(e.name,i),{unregister:i}}unregisterPrompt(e){console.log(`[Web Model Context] Unregistering prompt: ${e}`);let t=this.provideContextPrompts.has(e),n=this.dynamicPrompts.has(e);if(!t&&!n){console.warn(`[Web Model Context] Prompt "${e}" is not registered, ignoring unregister call`);return}t&&this.provideContextPrompts.delete(e),n&&(this.dynamicPrompts.delete(e),this.promptRegistrationTimestamps.delete(e),this.promptUnregisterFunctions.delete(e)),this.updateBridgePrompts(),this.notifyPromptsListChanged()}listPrompts(){return Array.from(this.bridge.prompts.values()).map(e=>({name:e.name,description:e.description,arguments:e.argsSchema?.properties?Object.entries(e.argsSchema.properties).map(([t,n])=>({name:t,description:n.description,required:e.argsSchema?.required?.includes(t)??!1})):void 0}))}unregisterTool(e){console.log(`[Web Model Context] Unregistering tool: ${e}`);let t=this.provideContextTools.has(e),n=this.dynamicTools.has(e);if(!t&&!n){console.warn(`[Web Model Context] Tool "${e}" is not registered, ignoring unregister call`);return}t&&this.provideContextTools.delete(e),n&&(this.dynamicTools.delete(e),this.toolRegistrationTimestamps.delete(e),this.toolUnregisterFunctions.delete(e)),this.updateBridgeTools(),this.notifyToolsListChanged()}clearContext(){console.log(`[Web Model Context] Clearing all context (tools, resources, prompts)`),this.provideContextTools.clear(),this.dynamicTools.clear(),this.toolRegistrationTimestamps.clear(),this.toolUnregisterFunctions.clear(),this.provideContextResources.clear(),this.dynamicResources.clear(),this.resourceRegistrationTimestamps.clear(),this.resourceUnregisterFunctions.clear(),this.provideContextPrompts.clear(),this.dynamicPrompts.clear(),this.promptRegistrationTimestamps.clear(),this.promptUnregisterFunctions.clear(),this.updateBridgeTools(),this.updateBridgeResources(),this.updateBridgePrompts(),this.notifyToolsListChanged(),this.notifyResourcesListChanged(),this.notifyPromptsListChanged()}updateBridgeTools(){this.bridge.tools.clear();for(let[e,t]of this.provideContextTools)this.bridge.tools.set(e,t);for(let[e,t]of this.dynamicTools)this.bridge.tools.set(e,t);console.log(`[Web Model Context] Updated bridge with ${this.provideContextTools.size} base tools + ${this.dynamicTools.size} dynamic tools = ${this.bridge.tools.size} total`)}notifyToolsListChanged(){this.bridge.tabServer.notification&&this.bridge.tabServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/tools/list_changed`,params:{}}),this.testingAPI&&`notifyToolsChanged`in this.testingAPI&&this.testingAPI.notifyToolsChanged()}updateBridgeResources(){this.bridge.resources.clear();for(let[e,t]of this.provideContextResources)this.bridge.resources.set(e,t);for(let[e,t]of this.dynamicResources)this.bridge.resources.set(e,t);console.log(`[Web Model Context] Updated bridge with ${this.provideContextResources.size} base resources + ${this.dynamicResources.size} dynamic resources = ${this.bridge.resources.size} total`)}notifyResourcesListChanged(){this.bridge.tabServer.notification&&this.bridge.tabServer.notification({method:`notifications/resources/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/resources/list_changed`,params:{}})}updateBridgePrompts(){this.bridge.prompts.clear();for(let[e,t]of this.provideContextPrompts)this.bridge.prompts.set(e,t);for(let[e,t]of this.dynamicPrompts)this.bridge.prompts.set(e,t);console.log(`[Web Model Context] Updated bridge with ${this.provideContextPrompts.size} base prompts + ${this.dynamicPrompts.size} dynamic prompts = ${this.bridge.prompts.size} total`)}notifyPromptsListChanged(){this.bridge.tabServer.notification&&this.bridge.tabServer.notification({method:`notifications/prompts/list_changed`,params:{}}),this.bridge.iframeServer?.notification&&this.bridge.iframeServer.notification({method:`notifications/prompts/list_changed`,params:{}})}async readResource(e){console.log(`[Web Model Context] Reading resource: ${e}`);let t=this.bridge.resources.get(e);if(t&&!t.isTemplate)try{let n=new URL(e);return await t.read(n)}catch(t){throw console.error(`[Web Model Context] Error reading resource ${e}:`,t),t}for(let t of this.bridge.resources.values()){if(!t.isTemplate)continue;let n=this.matchUriTemplate(t.uri,e);if(n)try{let r=new URL(e);return await t.read(r,n)}catch(t){throw console.error(`[Web Model Context] Error reading resource ${e}:`,t),t}}throw Error(`Resource not found: ${e}`)}matchUriTemplate(e,t){let n=[],r=e.replace(/[.*+?^${}()|[\]\\]/g,e=>e===`{`||e===`}`?e:`\\${e}`);r=r.replace(/\{([^}]+)\}/g,(e,t)=>(n.push(t),`(.+)`));let i=RegExp(`^${r}$`),a=t.match(i);if(!a)return null;let o={};for(let e=0;e<n.length;e++){let t=n[e],r=a[e+1];t!==void 0&&r!==void 0&&(o[t]=r)}return o}async getPrompt(e,t){console.log(`[Web Model Context] Getting prompt: ${e}`);let n=this.bridge.prompts.get(e);if(!n)throw Error(`Prompt not found: ${e}`);if(n.argsValidator&&t){let r=Ja(t,n.argsValidator);if(!r.success)throw console.error(`[Web Model Context] Argument validation failed for prompt ${e}:`,r.error),Error(`Argument validation error for prompt "${e}":\n${r.error}`)}try{return await n.get(t??{})}catch(t){throw console.error(`[Web Model Context] Error getting prompt ${e}:`,t),t}}async executeTool(e,t){let n=this.bridge.tools.get(e);if(!n)throw Error(`Tool not found: ${e}`);console.log(`[Web Model Context] Validating input for tool: ${e}`);let r=Ja(t,n.inputValidator);if(!r.success)return console.error(`[Web Model Context] Input validation failed for ${e}:`,r.error),{content:[{type:`text`,text:`Input validation error for tool "${e}":\n${r.error}`}],isError:!0};let i=r.data;if(this.testingAPI&&this.testingAPI.recordToolCall(e,i),this.testingAPI?.hasMockResponse(e)){let t=this.testingAPI.getMockResponse(e);if(t)return console.log(`[Web Model Context] Returning mock response for tool: ${e}`),t}let a=new Za(e,i);if(this.dispatchEvent(a),a.defaultPrevented&&a.hasResponse()){let t=a.getResponse();if(t)return console.log(`[Web Model Context] Tool ${e} handled by event listener`),t}console.log(`[Web Model Context] Executing tool: ${e}`);try{let t=await n.execute(i);if(n.outputValidator&&t.structuredContent){let r=Ja(t.structuredContent,n.outputValidator);r.success||console.warn(`[Web Model Context] Output validation failed for ${e}:`,r.error)}return t}catch(t){return console.error(`[Web Model Context] Error executing tool ${e}:`,t),{content:[{type:`text`,text:`Error: ${t instanceof Error?t.message:String(t)}`}],isError:!0}}}listTools(){return Array.from(this.bridge.tools.values()).map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema,...e.outputSchema&&{outputSchema:e.outputSchema},...e.annotations&&{annotations:e.annotations}}))}async createMessage(e){console.log(`[Web Model Context] Requesting sampling from client`);let t=this.bridge.tabServer.server;if(!t?.createMessage)throw Error(`Sampling is not supported: no connected client with sampling capability`);return t.createMessage(e)}async elicitInput(e){console.log(`[Web Model Context] Requesting elicitation from client`);let t=this.bridge.tabServer.server;if(!t?.elicitInput)throw Error(`Elicitation is not supported: no connected client with elicitation capability`);return t.elicitInput(e)}};function eo(e){console.log(`[Web Model Context] Initializing MCP bridge`);let t=window.location.hostname||`localhost`,n=e?.transport,r=(e,t)=>{e.setRequestHandler(Jr,async()=>(console.log(`[MCP Bridge] Handling list_tools request`),{tools:t.modelContext.listTools()})),e.setRequestHandler(Zr,async e=>{console.log(`[MCP Bridge] Handling call_tool request: ${e.params.name}`);let n=e.params.name,r=e.params.arguments||{};try{let e=await t.modelContext.executeTool(n,r);return{content:e.content,isError:e.isError}}catch(e){throw console.error(`[MCP Bridge] Error calling tool ${n}:`,e),e}}),e.setRequestHandler(Cr,async()=>(console.log(`[MCP Bridge] Handling list_resources request`),{resources:t.modelContext.listResources()})),e.setRequestHandler(Dr,async e=>{console.log(`[MCP Bridge] Handling read_resource request: ${e.params.uri}`);try{return await t.modelContext.readResource(e.params.uri)}catch(t){throw console.error(`[MCP Bridge] Error reading resource ${e.params.uri}:`,t),t}}),e.setRequestHandler(Fr,async()=>(console.log(`[MCP Bridge] Handling list_prompts request`),{prompts:t.modelContext.listPrompts()})),e.setRequestHandler(Lr,async e=>{console.log(`[MCP Bridge] Handling get_prompt request: ${e.params.name}`);try{return await t.modelContext.getPrompt(e.params.name,e.params.arguments)}catch(t){throw console.error(`[MCP Bridge] Error getting prompt ${e.params.name}:`,t),t}})},i=n?.create?.();if(i){console.log(`[Web Model Context] Using custom transport`);let e=new fa({name:t,version:`1.0.0`},{capabilities:{tools:{listChanged:!0},resources:{listChanged:!0},prompts:{listChanged:!0}}}),n={tabServer:e,tools:new Map,resources:new Map,prompts:new Map,modelContext:void 0,isInitialized:!0};return n.modelContext=new $a(n),r(e,n),e.connect(i),console.log(`[Web Model Context] MCP server connected with custom transport`),n}console.log(`[Web Model Context] Using dual-server mode`);let a=n?.tabServer!==!1,o=new fa({name:`${t}-tab`,version:`1.0.0`},{capabilities:{tools:{listChanged:!0},resources:{listChanged:!0},prompts:{listChanged:!0}}}),s={tabServer:o,tools:new Map,resources:new Map,prompts:new Map,modelContext:void 0,isInitialized:!0};if(s.modelContext=new $a(s),r(o,s),a){let{allowedOrigins:e,...t}=typeof n?.tabServer==`object`?n.tabServer:{},r=new Rn({allowedOrigins:e??[`*`],...t});o.connect(r),console.log(`[Web Model Context] Tab server connected`)}let c=typeof window<`u`&&window.parent!==window,l=n?.iframeServer;if(l!==!1&&(l!==void 0||c)){console.log(`[Web Model Context] Enabling iframe server`);let e=new fa({name:`${t}-iframe`,version:`1.0.0`},{capabilities:{tools:{listChanged:!0},resources:{listChanged:!0},prompts:{listChanged:!0}}});r(e,s);let{allowedOrigins:n,...i}=typeof l==`object`?l:{},a=new Ln({allowedOrigins:n??[`*`],...i});e.connect(a),s.iframeServer=e,console.log(`[Web Model Context] Iframe server connected`)}return s}function to(e){if(typeof window>`u`){console.warn(`[Web Model Context] Not in browser environment, skipping initialization`);return}let t=e??window.__webModelContextOptions,n=Ya();if(n.hasNativeContext&&n.hasNativeTesting){let e=window.navigator.modelContext,n=window.navigator.modelContextTesting;if(!e||!n){console.error(`[Web Model Context] Native API detection mismatch`);return}console.log(`✅ [Web Model Context] Native Chromium API detected`),console.log(` Using native implementation with MCP bridge synchronization`),console.log(` Native API will automatically collect tools from embedded iframes`);try{let r=eo(t);r.modelContext=new Xa(r,e,n),r.modelContextTesting=n,Object.defineProperty(window,`__mcpBridge`,{value:r,writable:!1,configurable:!0}),console.log(`✅ [Web Model Context] MCP bridge synced with native API`),console.log(` MCP clients will receive automatic tool updates from native registry`)}catch(e){throw console.error(`[Web Model Context] Failed to initialize native adapter:`,e),e}return}if(n.hasNativeContext&&!n.hasNativeTesting){console.warn(`[Web Model Context] Partial native API detected`),console.warn(` navigator.modelContext exists but navigator.modelContextTesting is missing`),console.warn(` Cannot sync with native API. Please enable experimental features:`),console.warn(` - Navigate to chrome://flags`),console.warn(` - Enable "Experimental Web Platform Features"`),console.warn(` - Or launch with: --enable-experimental-web-platform-features`),console.warn(` Skipping initialization to avoid conflicts`);return}if(window.navigator.modelContext){console.warn(`[Web Model Context] window.navigator.modelContext already exists, skipping initialization`);return}console.log(`[Web Model Context] Native API not detected, installing polyfill`);try{let e=eo(t);Object.defineProperty(window.navigator,`modelContext`,{value:e.modelContext,writable:!1,configurable:!1}),Object.defineProperty(window,`__mcpBridge`,{value:e,writable:!1,configurable:!0}),console.log(`✅ [Web Model Context] window.navigator.modelContext initialized successfully`),console.log(`[Model Context Testing] Installing polyfill`),console.log(` 💡 To use the native implementation in Chromium:`),console.log(` - Navigate to chrome://flags`),console.log(` - Enable "Experimental Web Platform Features"`),console.log(` - Or launch with: --enable-experimental-web-platform-features`);let n=new Qa(e);e.modelContextTesting=n,e.modelContext.setTestingAPI(n),Object.defineProperty(window.navigator,`modelContextTesting`,{value:n,writable:!1,configurable:!0}),console.log(`✅ [Model Context Testing] Polyfill installed at window.navigator.modelContextTesting`)}catch(e){throw console.error(`[Web Model Context] Failed to initialize:`,e),e}}function no(){if(!(typeof window>`u`)){if(window.__mcpBridge)try{window.__mcpBridge.tabServer.close(),window.__mcpBridge.iframeServer&&window.__mcpBridge.iframeServer.close()}catch(e){console.warn(`[Web Model Context] Error closing MCP servers:`,e)}delete window.navigator.modelContext,delete window.navigator.modelContextTesting,delete window.__mcpBridge,console.log(`[Web Model Context] Cleaned up`)}}function ro(e,t){return e?t?{...e,...t,tabServer:{...e.tabServer??{},...t.tabServer??{}}}:e:t}function io(e,t){return e?t?{...e,...t,transport:ro(e.transport??{},t.transport??{})}:e:t}function ao(e){if(!e||!e.dataset)return;let{dataset:t}=e;if(t.webmcpOptions)try{return JSON.parse(t.webmcpOptions)}catch(e){console.error(`[Web Model Context] Invalid JSON in data-webmcp-options:`,e);return}let n={},r=!1;t.webmcpAutoInitialize!==void 0&&(n.autoInitialize=t.webmcpAutoInitialize!==`false`,r=!0);let i={},a=!1;if(t.webmcpAllowedOrigins){let e=t.webmcpAllowedOrigins.split(`,`).map(e=>e.trim()).filter(e=>e.length>0);e.length>0&&(i.allowedOrigins=e,r=!0,a=!0)}return t.webmcpChannelId&&(i.channelId=t.webmcpChannelId,r=!0,a=!0),a&&(n.transport={...n.transport??{},tabServer:{...n.transport?.tabServer??{},...i}}),r?n:void 0}if(typeof window<`u`&&typeof document<`u`){let e=window.__webModelContextOptions,t=document.currentScript,n=ao(t),r=io(e,n)??e??n;r&&(window.__webModelContextOptions=r);let i=r?.autoInitialize!==!1;try{i&&to(r)}catch(e){console.error(`[Web Model Context] Auto-initialization failed:`,e)}}return e.cleanupWebModelContext=no,e.initializeWebModelContext=to,e})({});