@mcp-b/webmcp-polyfill 5.0.3 → 5.1.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
- var WebMCPPolyfill=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=`Tool was executed but the invocation failed. For example, the script function threw an error`,n=/^[A-Za-z0-9_.-]{1,128}$/u;function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e){if(typeof e==`symbol`)throw TypeError(`Symbol values cannot be converted to a DOMString`);return String(e)}function a(e){let t=Reflect.get(e,`name`),n=Reflect.get(e,`description`),a=Reflect.get(e,`title`);if(t===void 0)throw TypeError(`Tool "name" is required`);if(n===void 0)throw TypeError(`Tool "description" is required`);let o=Reflect.get(e,`annotations`),s=r(o)?o:{},c=Reflect.get(e,`inputSchema`),l=Reflect.get(e,`outputSchema`),u=Reflect.get(e,`execute`);return{name:i(t),...a===void 0?{}:{title:i(a).toWellFormed()},description:i(n),...c===void 0?{}:{inputSchema:c},...l===void 0?{}:{outputSchema:l},execute:u,...o===void 0?{}:{annotations:{...s.title===void 0?{}:{title:i(s.title).toWellFormed()},readOnlyHint:!!s.readOnlyHint,...s.destructiveHint===void 0?{}:{destructiveHint:!!s.destructiveHint},...s.idempotentHint===void 0?{}:{idempotentHint:!!s.idempotentHint},...s.openWorldHint===void 0?{}:{openWorldHint:!!s.openWorldHint},untrustedContentHint:!!s.untrustedContentHint}}}}function o(e){return new DOMException(e,`UnknownError`)}function s(e){return o(e instanceof Error?`${t}: ${e.message}`:t)}function c(e){return new DOMException(e,`InvalidStateError`)}function l(e){if(e.name===``)throw c(`Tool "name" must be a non-empty string`);if(typeof e.name!=`string`||!n.test(e.name))throw c(`Tool "name" must be 1–128 characters and contain only ASCII alphanumeric, underscore, hyphen, or period`);if(typeof e.description!=`string`||e.description.length===0)throw c(`Tool "description" must be a non-empty string`);if(typeof e.execute!=`function`)throw TypeError(`Tool "execute" must be a function`)}function u(e){return{readOnlyHint:e.readOnlyHint??!1,untrustedContentHint:e.untrustedContentHint??!1}}function d(e){try{let t=JSON.parse(e);if(Array.isArray(t)||r(t))return t}catch{}throw o(`Failed to parse input arguments`)}function f(e){if(typeof e==`object`&&e||typeof e==`function`)try{let t=JSON.stringify(e);if(t)return t}catch{}return String(e)||`Operation succeeded`}function p(e,t,n=()=>t?.reason){return t?t.aborted?Promise.reject(n()):new Promise((r,i)=>{let a=()=>{o(),i(n())},o=()=>t.removeEventListener(`abort`,a);t.addEventListener(`abort`,a,{once:!0}),e.then(e=>{o(),r(e)},e=>{o(),i(e)})}):e}function m(e){let t=e.origin===`null`?e:new URL(e.origin),n=t.protocol;if([`https:`,`wss:`,`file:`,`chrome-extension:`,`moz-extension:`].includes(n))return!0;let r=t.hostname.toLowerCase(),i=r.split(`.`),a=i.length===4&&i.every(e=>/^\d{1,3}$/u.test(e)&&Number(e)<=255)&&Number(i[0])===127;return r===`::1`||r===`[::1]`||r===`localhost`||r===`localhost.`||r.endsWith(`.localhost`)||r.endsWith(`.localhost.`)||a}function h(e){for(let t of e??[]){let e;try{e=new URL(t)}catch{throw new DOMException(`Invalid or untrustworthy origin: ${String(t)}`,`SecurityError`)}if(!m(e))throw new DOMException(`Invalid or untrustworthy origin: ${t}`,`SecurityError`)}}function g(e){if(ee(),!e)return;let t=e.defaultView?.DOMException??DOMException,n=!1;try{let t=e.defaultView;n=!!(t&&t.document===e)}catch{}if(!n)throw new t(`The associated document is not fully active`,`InvalidStateError`);let r=Reflect.get(e,`permissionsPolicy`)??Reflect.get(e,`featurePolicy`);if(r&&typeof r==`object`){let e=Reflect.get(r,`features`),n=Reflect.get(r,`allowsFeature`);if(typeof e==`function`&&typeof n==`function`){let i=Reflect.apply(e,r,[]);if(Array.isArray(i)&&i.includes(`tools`)){if(Reflect.apply(n,r,[`tools`])===!0)return;throw new t(`WebMCP is disabled by Permissions Policy`,`NotAllowedError`)}}}let i=e.defaultView;if(!(!i||i.parent===i)){try{i.parent.document;return}catch{}throw new t(`WebMCP in cross-origin frames requires native Permissions Policy support`,`NotAllowedError`)}}function ee(){if(globalThis.originAgentCluster===!1&&globalThis.location?.protocol!==`file:`)throw new DOMException(``,`SecurityError`)}function te(e){try{if(new URL(String(e)).origin!==`null`)return}catch{}throw new DOMException(`Unsupported tool origin: ${String(e)}`,`NotSupportedError`)}function ne(e){if(e===null||typeof e!=`object`&&typeof e!=`function`)throw TypeError(`inputSchema must be an object`);let t=JSON.stringify(e);if(t===void 0)throw TypeError(`inputSchema must be JSON-serializable`);return t}let _=new WeakSet,v=new WeakMap,y=new WeakMap;function b(e){return e.isTrusted&&(_.has(e)||e.eventPhase!==Event.NONE&&e.target instanceof HTMLFormElement&&y.has(e.target))}function re(e,t){if(!b(e))throw new DOMException(`respondWith() is only available during an agent-invoked submit event`,`InvalidStateError`);if(!e.defaultPrevented)throw new DOMException(`respondWith() requires preventDefault() during an agent-invoked submit event`,`InvalidStateError`);if(e.eventPhase===Event.NONE)throw new DOMException(`respondWith() is only available while the submit event is being dispatched`,`InvalidStateError`);_.add(e);let n=Promise.resolve(t);v.set(e,n),e.target instanceof HTMLFormElement&&y.get(e.target)?.respond(e)}let x=new Set([`email`,`password`,`search`,`tel`,`text`,`url`]),ie=new Set([...x,`date`,`datetime-local`,`month`,`number`,`time`,`week`]);function S(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function C(e){return Reflect.get(HTMLFormElement.prototype,`elements`,e)}function w(e,t){return Reflect.apply(Element.prototype.getAttribute,e,[t])}function T(e,t){return Reflect.apply(Element.prototype.hasAttribute,e,[t])}function ae(e){return Reflect.get(Node.prototype,`isConnected`,e)}function oe(e){return Reflect.get(Element.prototype,`shadowRoot`,e)}function se(e){return Reflect.apply(HTMLFormElement.prototype.checkValidity,e,[])}function ce(e,t){Reflect.apply(HTMLFormElement.prototype.requestSubmit,e,t?[t]:[])}function le(e){return[...C(e)].filter(e=>S(e)&&!e.matches(`:disabled`)&&!(`readOnly`in e&&e.readOnly&&(e instanceof HTMLTextAreaElement||ie.has(e.type))))}function E(e){let t=new Map;for(let n of le(e)){let e=n.name.trim(),r=t.get(e);r?r.push(n):t.set(e,[n])}return t}function D(e){return[...e.labels??[]].map(e=>{let t=e.cloneNode(!0);return t instanceof HTMLElement?(t.querySelectorAll(`button, input, meter, output, progress, select, textarea`).forEach(e=>e.remove()),t.textContent?.trim()??``):``}).filter(Boolean).join(`; `)}function ue(e,t){for(let n=t[0]?.parentElement;n&&n!==e;n=n.parentElement)if(n instanceof HTMLFieldSetElement&&t.every(e=>n.contains(e)))return n}function de(e,t){if(t.length===1){let e=t[0];return e&&(e.getAttribute(`toolparamdescription`)||D(e)||e.getAttribute(`aria-description`))||void 0}return ue(e,t)?.getAttribute(`toolparamdescription`)||void 0}function O(e,t,n,r){let i=de(t,n),a=i&&r?`${i} (${r})`:i||r;return a?{...e,description:a}:e}function k(e,t){let n=e.getAttribute(t);if(n===null||n.trim()===``)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function fe(e,t){let n=e/t;return Math.abs(n-Math.round(n))<2**-52*16}function A(e){let t=e.getAttribute(`pattern`);if(t!==null)try{return new RegExp(t,`v`),t}catch{return}}function j(e,t=!0){let n={type:`number`},r=k(e,`min`),i=k(e,`max`);r!==void 0&&(n.minimum=r),i!==void 0&&(n.maximum=i);let a=e.getAttribute(`step`);if(a!==`any`){let t=a===null||a===``?1:Number(a),i=Number.isFinite(t)&&t>0?t:1,o=Number(e.getAttribute(`value`));fe(r??(Number.isFinite(o)?o:0),i)&&(n.multipleOf=i)}let o=t?A(e):void 0;return o!==void 0&&(n.pattern=o),n}function M(e,t){let n=e.getAttribute(`step`),r=n===null||n===``?60:Number(n),i=Number.isFinite(r)&&r>0?r:60;return i<1?`${t}(:[0-5][0-9](\\.[0-9]{1,3})?)?$`:i<60?`${t}(:[0-5][0-9])?$`:`${t}$`}function pe(e){return{anyOf:e.map(e=>({type:`string`,const:e.value,title:e.textContent??``})),enum:e.map(e=>e.value)}}function N(e){return{anyOf:e.map(e=>{let t=D(e);return{type:`string`,const:e.value,...t?{title:t}:{}}}),enum:e.map(e=>e.value)}}function P(e,t){let n=t[0];if(n){if(t.length>1)return t.every(e=>e instanceof HTMLInputElement)?t.every(e=>e.type===`checkbox`)?O({type:`array`,items:{type:`string`,...N(t)},uniqueItems:!0},e,t):t.every(e=>e.type===`radio`)?O({type:`string`,...N(t)},e,t):void 0:void 0;if(n instanceof HTMLTextAreaElement)return O({type:`string`},e,t);if(n instanceof HTMLSelectElement){let r=pe([...n.options]);return O(n.multiple?{type:`array`,items:{type:`string`,...r},uniqueItems:!0}:{type:`string`,...r},e,t)}if(x.has(n.type)){let r={type:`string`},i=A(n);return i!==void 0&&(r.pattern=i),O(r,e,t)}if(n.type===`hidden`)return n.getAttribute(`toolparamdescription`)?O({type:`string`},e,t):void 0;if(n.type===`number`)return O(j(n),e,t);if(n.type===`range`){let r=j(n,!1);return r.minimum??=0,r.maximum??=100,O(r,e,t)}if(n.type===`checkbox`)return O({type:`boolean`},e,t);if(n.type===`radio`)return O({type:`string`,...N([n])},e,t);if(n.type===`date`)return O({type:`string`,format:`date`},e,t,`Dates MUST be provided in 'YYYY-MM-DD' format.`);if(n.type===`month`)return O({type:`string`,format:`^[0-9]{4}-(0[1-9]|1[0-2])$`},e,t);if(n.type===`week`)return O({type:`string`,format:`^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$`},e,t);if(n.type===`time`)return O({type:`string`,format:M(n,`^([01][0-9]|2[0-3]):[0-5][0-9]`)},e,t);if(n.type===`datetime-local`)return O({type:`string`,format:M(n,`^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]`)},e,t);if(n.type===`color`)return O({type:`string`,format:`^#[0-9a-zA-Z]{6}$`},e,t)}}function me(e){let t={},n=[];for(let[r,i]of E(e)){if(!r)continue;let a=P(e,i);a&&(Object.defineProperty(t,r,{configurable:!0,enumerable:!0,value:a,writable:!0}),i.some(e=>e.required)&&n.push(r))}return{type:`object`,properties:t,required:n}}function he(e){return{name:w(e,`toolname`)??``,title:w(e,`tooltitle`)??``,description:w(e,`tooldescription`)??``,inputSchema:me(e),autosubmit:T(e,`toolautosubmit`)}}function F(e){if(typeof e==`string`||typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e))return String(e)}function I(e){if(typeof e==`boolean`)return e;if(typeof e==`number`&&Number.isInteger(e))return e!==0;if(typeof e==`string`){if(e===`1`||e.toLowerCase()===`true`)return!0;if(e===`0`||e.toLowerCase()===`false`)return!1}}function L(e,t){if(!Array.isArray(e))return!1;let n=new Set(t);for(let t of e){let e=F(t);if(e===void 0||!n.delete(e))return!1}return!0}function ge(e,t){if(t===``)return e.type!==`number`&&e.type!==`range`;let n=e.ownerDocument.createElement(`input`);return n.type=e.type,n.value=t,n.value!==``}function _e(e,t,n){let r=t[0];if(!r||!P(e,t))return!1;if(t.length>1){if(!t.every(e=>e instanceof HTMLInputElement))return!1;if(t.every(e=>e.type===`checkbox`))return L(n,new Set(t.map(e=>e.value)));if(t.every(e=>e.type===`radio`)){let e=F(n);return e!==void 0&&t.some(t=>t.value===e)}return!1}if(r instanceof HTMLSelectElement){let e=new Set([...r.options].map(e=>e.value));if(r.multiple)return L(n,e);let t=F(n);return t!==void 0&&e.has(t)}if(r instanceof HTMLTextAreaElement)return F(n)!==void 0;if(r.type===`checkbox`)return I(n)!==void 0;if(r.type===`radio`){let e=F(n);return e!==void 0&&r.value===e}let i=F(n);return i!==void 0&&ge(r,i)}function R(e){e.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0})),e.dispatchEvent(new Event(`change`,{bubbles:!0}))}function ve(e,t){let n=e instanceof HTMLInputElement?HTMLInputElement.prototype:HTMLTextAreaElement.prototype;Object.getOwnPropertyDescriptor(n,`value`)?.set?.call(e,t)}function z(e,t){Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,`checked`)?.set?.call(e,t)}function ye(e,t){let n=e[0];if(!n)return;if(e.length>1&&e.every(e=>e instanceof HTMLInputElement)){if(e.every(e=>e.type===`checkbox`)&&Array.isArray(t)){let n=new Set(t.map(F));for(let t of e){let e=n.has(t.value);t.checked!==e&&(z(t,e),R(t))}return}let n=F(t),r=e.find(e=>e.value===n);r&&!r.checked&&(z(r,!0),R(r));return}if(n instanceof HTMLSelectElement){if(n.multiple&&Array.isArray(t)){let e=new Set(t.map(F)),r=!1;for(let t of n.options){let n=e.has(t.value);t.selected!==n&&(t.selected=n,r=!0)}r&&R(n);return}let e=F(t);e!==void 0&&n.value!==e&&(n.value=e,R(n));return}if(n instanceof HTMLInputElement&&n.type===`checkbox`){let e=I(t);e!==void 0&&n.checked!==e&&(z(n,e),R(n));return}if(n instanceof HTMLInputElement&&n.type===`radio`){F(t)===n.value&&!n.checked&&(z(n,!0),R(n));return}let r=F(t);r!==void 0&&n.value!==r&&(ve(n,r),R(n))}function be(e,t){if(Array.isArray(t))throw TypeError(`Declarative tool input must be an object`);let n=E(e);for(let[r,i]of Object.entries(t)){let t=n.get(r);if(!t||!_e(e,t,i))throw TypeError(`Invalid value for declarative form parameter "${r}"`)}for(let[e,r]of Object.entries(t))ye(n.get(e)??[],r)}function xe(e){return[...C(e)].find(e=>!e.matches(`:disabled`)&&(e instanceof HTMLButtonElement&&e.type===`submit`||e instanceof HTMLInputElement&&[`image`,`submit`].includes(e.type)))}function Se(e){let t=[...C(e)].filter(e=>S(e)&&e.willValidate&&!e.validity.valid).map(e=>`${e.name.trim()||`{unknown}`}: ${e.validationMessage}`).join(`. `);return new DOMException(`Form validation failed: ${t}`,`UnknownError`)}function B(e){let t=new Event(`toolactivated`);return Object.defineProperty(t,`toolName`,{enumerable:!0,value:e}),t}function Ce(e,t,n,r){let{form:i}=e;return e.cancelPending?.(new DOMException(`Tool execution cancelled`,`UnknownError`)),new Promise((a,o)=>{let s=!1,c=()=>{Reflect.apply(EventTarget.prototype.removeEventListener,i,[`invalid`,f,!0]),y.delete(i),e.cancelPending===u&&delete e.cancelPending},l=e=>{s||(s=!0,c(),e())},u=e=>l(()=>o(e)),d=e=>{e.then(e=>l(()=>a(e)),e=>l(()=>o(e)))},f=e=>{e.isTrusted&&queueMicrotask(()=>{se(i)||u(Se(i))})};if(y.set(i,{complete(e){queueMicrotask(()=>{let t=v.get(e);t?d(t):e.defaultPrevented?u(new DOMException(`preventDefault() requires respondWith()`,`UnknownError`)):l(()=>a(void 0))})},direct(){l(()=>a(void 0))},respond(e){queueMicrotask(()=>{let t=v.get(e);t&&d(t)})}}),e.cancelPending=u,Reflect.apply(EventTarget.prototype.addEventListener,i,[`invalid`,f,!0]),!n){r?.focus(),window.dispatchEvent(B(t));return}try{ce(i,r),window.dispatchEvent(B(t))}catch(e){u(e)}})}function we(e,t){let n=!0,r=new Map,i=new Map,a=new Map,o=e=>{if(!(e instanceof SubmitEvent)||!e.isTrusted||!(e.target instanceof HTMLFormElement))return;let t=y.get(e.target);t&&(_.add(e),t.complete(e))},s=e=>{if(!e.isTrusted||!(e.target instanceof HTMLFormElement))return;let t=e.target;queueMicrotask(()=>{e.defaultPrevented||r.get(t)?.cancelPending?.(new DOMException(`Tool execution cancelled by form reset`,`UnknownError`))})};function c(e){a.get(e)?.disconnect(),a.delete(e),e.removeEventListener(`reset`,s,!0),e.removeEventListener(`submit`,o,!0)}function l(e){if(a.has(e))return;let t=new MutationObserver(u);a.set(e,t),t.observe(e,{attributes:!0,characterData:!0,childList:!0,subtree:!0}),e.addEventListener(`reset`,s,!0),e.addEventListener(`submit`,o,!0)}function u(){l(e);for(let e of a.keys())e instanceof ShadowRoot&&!Reflect.get(Node.prototype,`isConnected`,e.host)&&c(e);let n=new Set,o=new Map,s=new Map;for(let e of a.keys())for(let t of e.querySelectorAll(`*`)){let e=oe(t);if(e&&l(e),!(t instanceof HTMLFormElement)||!T(t,`toolname`)||!T(t,`tooldescription`)||!ae(t))continue;let r=t;n.add(r);let a=he(r),c=JSON.stringify(a),u=i.get(r);if(u===c)continue;let d=u!==void 0;i.delete(r);let f=s.get(a.name);if(f&&!d){i.set(r,c);continue}if(f){let e=o.get(f);e&&(i.set(f,e.fingerprint),o.delete(f))}s.set(a.name,r),o.set(r,{definition:a,fingerprint:c})}for(let e of i.keys())n.has(e)||i.delete(e);for(let[e,t]of r)o.get(e)?.fingerprint!==t.fingerprint&&(t.cancelPending?.(new DOMException(`Tool execution cancelled because its form changed`,`UnknownError`)),t.controller.abort(),r.delete(e));for(let[e,{definition:n,fingerprint:i}]of o){if(r.has(e))continue;let a=new AbortController,o={controller:a,fingerprint:i,form:e};r.set(e,o),t.registerTool({name:n.name,title:n.title,description:n.description,inputSchema:n.inputSchema,execute(t){let r=xe(e);if(!n.autosubmit&&!r)throw new DOMException(`A declarative form without toolautosubmit requires a submit button`,`UnknownError`);return be(e,t),Ce(o,n.name,n.autosubmit,r)}},{signal:a.signal}).catch(e=>{a.abort(),e?.name!==`AbortError`&&console.error(`[webmcp] declarative form tool "${n.name}" was not registered:`,e)})}}let d=()=>{},f=e.defaultView?.Element.prototype,p=f?Object.getOwnPropertyDescriptor(f,`attachShadow`):void 0;if(f&&p?.configurable){let t=f.attachShadow,r=function(r){let i=t.call(this,r);return n&&i.mode===`open`&&Reflect.get(Node.prototype,`ownerDocument`,this)===e&&Reflect.get(Node.prototype,`isConnected`,this)&&l(i),i};Object.defineProperty(f,`attachShadow`,{...p,value:r}),d=()=>{f.attachShadow===r&&Object.defineProperty(f,`attachShadow`,p)}}let m=()=>{},h=e.defaultView?.HTMLFormElement.prototype,g=h?Object.getOwnPropertyDescriptor(h,`submit`):void 0;if(h&&g?.configurable){let e=h.submit,t=function(){e.call(this),n&&y.get(this)?.direct()};Object.defineProperty(h,`submit`,{...g,value:t}),m=()=>{h.submit===t&&Object.defineProperty(h,`submit`,g)}}return u(),()=>{n=!1,m(),d();for(let e of a.keys())c(e);i.clear();for(let e of r.values())e.cancelPending?.(new DOMException(`Tool execution cancelled`,`UnknownError`)),e.controller.abort();r.clear()}}let V=Symbol(`registeredInputSchema`),H=Symbol(`registrationSignal`),U=Symbol(`registrationAbort`),W=[],G=null,K=null;function q(){return typeof globalThis.origin==`string`?globalThis.origin:globalThis.location?.origin??``}function J(e,t,n){let r=Object.getOwnPropertyDescriptor(e,t);try{Object.defineProperty(e,t,n)}catch(e){throw $(),e}W.push({target:e,key:t,previous:r})}var Y=class extends EventTarget{#e=new Map;#t=null;#n=null;#r=e=>{this.#n?.call(this,e)};#i;#a;constructor(e){super(),this.#a=e,this.#i=e?.defaultView?.DOMException??DOMException,Object.defineProperty(this,`__isWebMCPPolyfill`,{value:!0,enumerable:!1,writable:!1,configurable:!1})}get ontoolchange(){return this.#n}set ontoolchange(e){let t=typeof e==`function`?e:null;if(t===null){this.#n=null,super.removeEventListener(`toolchange`,this.#r);return}this.#n===null&&super.addEventListener(`toolchange`,this.#r),this.#n=t}async registerTool(e,t={}){g(this.#a);let n=t?.signal,r=Ee(e,this.#e);if(n?.throwIfAborted(),h(t?.exposedTo),n?.throwIfAborted(),t?.exposedTo?.length)throw new this.#i(`Cross-document tool exposure requires native WebMCP`,`NotSupportedError`);if(this.#e.set(r.name,r),n){let e=()=>{this.#o(r.name,r)&&this.#c()};r[H]=n,r[U]=e,n.addEventListener(`abort`,e,{once:!0})}if(await this.#c(),n?.aborted)throw n.reason}async getTools(e={}){if(g(this.#a),h(e?.fromOrigins),e?.fromOrigins?.length)throw new this.#i(`Cross-document tool discovery requires native WebMCP`,`NotSupportedError`);let t=[...this.#e.values()].map(e=>{let t=e[V],n=t===void 0?void 0:JSON.parse(t);return{name:e.name,title:e.title??``,description:e.description,...r(n)?{inputSchema:n}:{},origin:q(),window:globalThis.window,...e.annotations?{annotations:u(e.annotations)}:{}}}).sort((e,t)=>e.name<t.name?-1:+(e.name>t.name));return await new Promise(e=>setTimeout(e,0)),t}async executeTool(e,t,n={}){if(g(this.#a),typeof e!=`object`||!e)throw TypeError(`RegisteredTool must be an object`);for(let t of[`name`,`description`,`window`,`origin`])if(!(t in e))throw TypeError(`RegisteredTool.${t} is required`);if(te(e.origin),e.window!==globalThis.window||e.origin!==q())throw o(`Tool not found: ${e.name}`);return this.#s(e.name,t,n)}static getTestingShim(e){return e.#t??=new Te(e),e.#t}static getToolInfos(e){return[...e.#e.values()].map(e=>({name:e.name,description:e.description,...e[V]===void 0?{}:{inputSchema:e[V]}}))}static executeToolForTesting(e,t,n,r){return g(e.#a),e.#s(t,n,r)}static dispose(e){for(let t of e.#e.keys())e.#o(t);e.ontoolchange=null,e.#t?.dispose()}#o(e,t){let n=this.#e.get(e);if(!n||t&&n!==t)return!1;let r=n[H],i=n[U];return r&&i&&r.removeEventListener(`abort`,i),this.#e.delete(e)}async#s(e,t,n){n?.signal?.throwIfAborted();let r=this.#e.get(e);if(!r)throw o(`Tool not found: ${e}`);let i=d(t);if(n?.signal?.throwIfAborted(),r[H]?.aborted)throw o(`Tool unregistered`);let a;try{let e=r[H];a=await p(p(Promise.resolve(r.execute(i)),e,()=>o(`Tool unregistered`)),n?.signal)}catch(e){throw n?.signal?.aborted&&e===n.signal.reason||r[H]?.aborted?e:s(e)}return f(a)}async#c(){await new Promise(e=>setTimeout(e,0)),this.dispatchEvent(new Event(`toolchange`)),this.#t?.dispatchToolChange()}};let X=function(){throw TypeError(`Illegal constructor`)};Object.defineProperty(X,`name`,{value:`ModelContext`}),Object.defineProperty(X,`prototype`,{value:Y.prototype,writable:!1}),Object.setPrototypeOf(X,EventTarget),Object.defineProperty(Y.prototype,`constructor`,{configurable:!0,writable:!0,value:X}),Object.defineProperty(Y.prototype,Symbol.toStringTag,{configurable:!0,value:`ModelContext`});for(let e of[`registerTool`,`getTools`,`executeTool`,`ontoolchange`]){let t=Object.getOwnPropertyDescriptor(Y.prototype,e);t&&Object.defineProperty(Y.prototype,e,{...t,enumerable:!0})}var Te=class extends EventTarget{_ontoolchange=null;ontoolchangeListener=e=>{this._ontoolchange?.call(this,e)};#e;constructor(e){super(),this.#e=e}listTools(){return Y.getToolInfos(this.#e)}executeTool(e,t,n){return Y.executeToolForTesting(this.#e,e,t,n)}get ontoolchange(){return this._ontoolchange}set ontoolchange(e){let t=typeof e==`function`?e:null;if(t===null){this._ontoolchange=null,super.removeEventListener(`toolchange`,this.ontoolchangeListener);return}this._ontoolchange===null&&super.addEventListener(`toolchange`,this.ontoolchangeListener),this._ontoolchange=t}dispatchToolChange(){this.dispatchEvent(new Event(`toolchange`))}dispose(){this.ontoolchange=null}};function Ee(e,t){if(!e||typeof e!=`object`)throw TypeError(`registerTool(tool) requires a tool object`);let n=a(e);if(l(n),t.has(n.name))throw c(`Tool already registered: ${n.name}`);let r=n.inputSchema===void 0?void 0:ne(n.inputSchema);return{name:n.name,...n.title===void 0?{}:{title:n.title},description:n.description,...n.inputSchema===void 0?{}:{inputSchema:n.inputSchema},...n.annotations===void 0?{}:{annotations:n.annotations},execute:e=>Reflect.apply(n.execute,void 0,[e]),...r===void 0?{}:{[V]:r}}}let Z=!1,De=new WeakMap,{modelContext:Oe}={modelContext(){if(!(this instanceof Document))throw TypeError(`Illegal invocation`);return De.get(this)}};Object.defineProperty(Oe,`name`,{value:`get modelContext`});function ke(e,t){De.set(e,t),!Object.hasOwn(Document.prototype,`modelContext`)&&J(Document.prototype,`modelContext`,{configurable:!0,enumerable:!0,get:Oe})}function Ae(e,t){J(e,`modelContext`,{configurable:!0,enumerable:!0,get(){return Z||(Z=!0,console.warn(`[WebMCPPolyfill] navigator.modelContext is deprecated. The May 27, 2026 WebMCP draft moved the modelContext getter from Navigator to Document — use document.modelContext instead. See https://github.com/webmachinelearning/webmcp/pull/184.`)),t}})}function je(){let e=SubmitEvent.prototype;`agentInvoked`in e||J(e,`agentInvoked`,{configurable:!0,enumerable:!0,get(){return b(this)}}),`respondWith`in e||J(e,`respondWith`,{configurable:!0,enumerable:!0,writable:!0,value(e){re(this,e)}})}function Q(e){if(globalThis.isSecureContext===!1)return;let t=typeof navigator>`u`?null:navigator,n=typeof document>`u`?null:document;if(!t||!n||typeof window>`u`||n.modelContext)return;let r=t.modelContext;if(W.length>0&&$(),r){ke(n,r);return}let i=Object.getOwnPropertyDescriptor(window,`ModelContext`);if(i&&!i.configurable){if(!Object.is(Reflect.get(window,`ModelContext`),X))throw TypeError(`Cannot install ModelContext over a non-configurable global`)}else J(window,`ModelContext`,{configurable:!0,enumerable:!1,writable:!0,value:X});let a=new Y(n);G=a,ke(n,a),Z=!1,Ae(t,a),je(),e?.installTestingShim&&!t.modelContextTesting&&J(t,`modelContextTesting`,{configurable:!0,enumerable:!0,writable:!1,value:Y.getTestingShim(a)}),K=we(n,a)}function $(){K?.(),K=null,G&&Y.dispose(G),G=null;for(let{target:e,key:t,previous:n}of[...W].reverse())n?Object.defineProperty(e,t,n):Reflect.deleteProperty(e,t);W.length=0,Z=!1}try{Q(window.__webMCPPolyfillOptions)}catch(e){console.error(`[WebMCPPolyfill] Auto-initialization failed:`,e)}return e.cleanupWebMCPPolyfill=$,e.initializeWebMCPPolyfill=Q,e})({});
1
+ var WebMCPPolyfill=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=`Tool was executed but the invocation failed. For example, the script function threw an error`,n=/^[A-Za-z0-9_.-]{1,128}$/u;function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e){if(typeof e==`symbol`)throw TypeError(`Symbol values cannot be converted to a DOMString`);return String(e)}function a(e){let t=Reflect.get(e,`name`),n=Reflect.get(e,`description`),a=Reflect.get(e,`title`);if(t===void 0)throw TypeError(`Tool "name" is required`);if(n===void 0)throw TypeError(`Tool "description" is required`);let o=Reflect.get(e,`annotations`),s=r(o)?o:{},c=Reflect.get(e,`inputSchema`),l=Reflect.get(e,`outputSchema`),u=Reflect.get(e,`execute`);return{name:i(t),...a===void 0?{}:{title:i(a).toWellFormed()},description:i(n),...c===void 0?{}:{inputSchema:c},...l===void 0?{}:{outputSchema:l},execute:u,...o===void 0?{}:{annotations:{...s.title===void 0?{}:{title:i(s.title).toWellFormed()},readOnlyHint:!!s.readOnlyHint,...s.destructiveHint===void 0?{}:{destructiveHint:!!s.destructiveHint},...s.idempotentHint===void 0?{}:{idempotentHint:!!s.idempotentHint},...s.openWorldHint===void 0?{}:{openWorldHint:!!s.openWorldHint},untrustedContentHint:!!s.untrustedContentHint}}}}function o(e){return new DOMException(e,`UnknownError`)}function s(e){return o(e instanceof Error?`${t}: ${e.message}`:t)}function c(e){return new DOMException(e,`InvalidStateError`)}function l(e){if(e.name===``)throw c(`Tool "name" must be a non-empty string`);if(typeof e.name!=`string`||!n.test(e.name))throw c(`Tool "name" must be 1–128 characters and contain only ASCII alphanumeric, underscore, hyphen, or period`);if(typeof e.description!=`string`||e.description.length===0)throw c(`Tool "description" must be a non-empty string`);if(typeof e.execute!=`function`)throw TypeError(`Tool "execute" must be a function`)}function u(e){return{readOnlyHint:e.readOnlyHint??!1,untrustedContentHint:e.untrustedContentHint??!1}}function d(e){try{let t=JSON.parse(e);if(Array.isArray(t)||r(t))return t}catch{}throw o(`Failed to parse input arguments`)}function f(e){if(typeof e==`object`&&e||typeof e==`function`)try{let t=JSON.stringify(e);if(t)return t}catch{}return String(e)||`Operation succeeded`}function p(e,t,n=()=>t?.reason){return t?t.aborted?Promise.reject(n()):new Promise((r,i)=>{let a=()=>{o(),i(n())},o=()=>t.removeEventListener(`abort`,a);t.addEventListener(`abort`,a,{once:!0}),e.then(e=>{o(),r(e)},e=>{o(),i(e)})}):e}function m(e){let t=e.origin===`null`?e:new URL(e.origin),n=t.protocol;if([`https:`,`wss:`,`file:`,`chrome-extension:`,`moz-extension:`].includes(n))return!0;let r=t.hostname.toLowerCase(),i=r.split(`.`),a=i.length===4&&i.every(e=>/^\d{1,3}$/u.test(e)&&Number(e)<=255)&&Number(i[0])===127;return r===`::1`||r===`[::1]`||r===`localhost`||r===`localhost.`||r.endsWith(`.localhost`)||r.endsWith(`.localhost.`)||a}function h(e){for(let t of e??[]){let e;try{e=new URL(t)}catch{throw new DOMException(`Invalid or untrustworthy origin: ${String(t)}`,`SecurityError`)}if(!m(e))throw new DOMException(`Invalid or untrustworthy origin: ${t}`,`SecurityError`)}}function g(e){if(ee(),!e)return;let t=e.defaultView?.DOMException??DOMException,n=!1;try{let t=e.defaultView;n=!!(t&&t.document===e)}catch{}if(!n)throw new t(`The associated document is not fully active`,`InvalidStateError`);let r=Reflect.get(e,`permissionsPolicy`)??Reflect.get(e,`featurePolicy`);if(r&&typeof r==`object`){let e=Reflect.get(r,`features`),n=Reflect.get(r,`allowsFeature`);if(typeof e==`function`&&typeof n==`function`){let i=Reflect.apply(e,r,[]);if(Array.isArray(i)&&i.includes(`tools`)){if(Reflect.apply(n,r,[`tools`])===!0)return;throw new t(`WebMCP is disabled by Permissions Policy`,`NotAllowedError`)}}}let i=e.defaultView;if(!(!i||i.parent===i)){try{i.parent.document;return}catch{}throw new t(`WebMCP in cross-origin frames requires native Permissions Policy support`,`NotAllowedError`)}}function ee(){if(globalThis.originAgentCluster===!1&&globalThis.location?.protocol!==`file:`)throw new DOMException(``,`SecurityError`)}function te(e){try{if(new URL(String(e)).origin!==`null`)return}catch{}throw new DOMException(`Unsupported tool origin: ${String(e)}`,`NotSupportedError`)}function ne(e){if(e===null||typeof e!=`object`&&typeof e!=`function`)throw TypeError(`inputSchema must be an object`);let t=JSON.stringify(e);if(t===void 0)throw TypeError(`inputSchema must be JSON-serializable`);return t}let _=new WeakSet,v=new WeakMap,y=new WeakMap;function b(e){return e.isTrusted&&(_.has(e)||e.eventPhase!==Event.NONE&&e.target instanceof HTMLFormElement&&y.has(e.target))}function re(e,t){if(!b(e))throw new DOMException(`respondWith() is only available during an agent-invoked submit event`,`InvalidStateError`);if(!e.defaultPrevented)throw new DOMException(`respondWith() requires preventDefault() during an agent-invoked submit event`,`InvalidStateError`);if(e.eventPhase===Event.NONE)throw new DOMException(`respondWith() is only available while the submit event is being dispatched`,`InvalidStateError`);_.add(e);let n=Promise.resolve(t);v.set(e,n),e.target instanceof HTMLFormElement&&y.get(e.target)?.respond(e)}let x=new Set([`email`,`password`,`search`,`tel`,`text`,`url`]),ie=new Set([...x,`date`,`datetime-local`,`month`,`number`,`time`,`week`]);function S(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function C(e){return Reflect.get(HTMLFormElement.prototype,`elements`,e)}function w(e,t){return Reflect.apply(Element.prototype.getAttribute,e,[t])}function T(e,t){return Reflect.apply(Element.prototype.hasAttribute,e,[t])}function ae(e){return Reflect.get(Node.prototype,`isConnected`,e)}function oe(e){return Reflect.get(Element.prototype,`shadowRoot`,e)}function se(e){return Reflect.apply(HTMLFormElement.prototype.checkValidity,e,[])}function ce(e,t){Reflect.apply(HTMLFormElement.prototype.requestSubmit,e,t?[t]:[])}function le(e){return[...C(e)].filter(e=>S(e)&&!e.matches(`:disabled`)&&!(`readOnly`in e&&e.readOnly&&(e instanceof HTMLTextAreaElement||ie.has(e.type))))}function E(e){let t=new Map;for(let n of le(e)){let e=n.name.trim(),r=t.get(e);r?r.push(n):t.set(e,[n])}return t}function D(e){return[...e.labels??[]].map(e=>{let t=e.cloneNode(!0);return t instanceof HTMLElement?(t.querySelectorAll(`button, input, meter, output, progress, select, textarea`).forEach(e=>e.remove()),t.textContent?.trim()??``):``}).filter(Boolean).join(`; `)}function ue(e,t){for(let n=t[0]?.parentElement;n&&n!==e;n=n.parentElement)if(n instanceof HTMLFieldSetElement&&t.every(e=>n.contains(e)))return n}function de(e,t){if(t.length===1){let e=t[0];return e&&(e.getAttribute(`toolparamdescription`)||D(e)||e.getAttribute(`aria-description`))||void 0}return ue(e,t)?.getAttribute(`toolparamdescription`)||void 0}function O(e,t,n,r){let i=de(t,n),a=i&&r?`${i} (${r})`:i||r;return a?{...e,description:a}:e}function k(e,t){let n=e.getAttribute(t);if(n===null||n.trim()===``)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function fe(e,t){let n=e/t;return Math.abs(n-Math.round(n))<2**-52*16}function A(e){let t=e.getAttribute(`pattern`);if(t!==null)try{return new RegExp(t,`v`),t}catch{return}}function j(e,t=!0){let n={type:`number`},r=k(e,`min`),i=k(e,`max`);r!==void 0&&(n.minimum=r),i!==void 0&&(n.maximum=i);let a=e.getAttribute(`step`);if(a!==`any`){let t=a===null||a===``?1:Number(a),i=Number.isFinite(t)&&t>0?t:1,o=Number(e.getAttribute(`value`));fe(r??(Number.isFinite(o)?o:0),i)&&(n.multipleOf=i)}let o=t?A(e):void 0;return o!==void 0&&(n.pattern=o),n}function M(e,t){let n=e.getAttribute(`step`),r=n===null||n===``?60:Number(n),i=Number.isFinite(r)&&r>0?r:60;return i<1?`${t}(:[0-5][0-9](\\.[0-9]{1,3})?)?$`:i<60?`${t}(:[0-5][0-9])?$`:`${t}$`}function pe(e){return{anyOf:e.map(e=>({type:`string`,const:e.value,title:e.textContent??``})),enum:e.map(e=>e.value)}}function N(e){return{anyOf:e.map(e=>{let t=D(e);return{type:`string`,const:e.value,...t?{title:t}:{}}}),enum:e.map(e=>e.value)}}function P(e,t){let n=t[0];if(n){if(t.length>1)return t.every(e=>e instanceof HTMLInputElement)?t.every(e=>e.type===`checkbox`)?O({type:`array`,items:{type:`string`,...N(t)},uniqueItems:!0},e,t):t.every(e=>e.type===`radio`)?O({type:`string`,...N(t)},e,t):void 0:void 0;if(n instanceof HTMLTextAreaElement)return O({type:`string`},e,t);if(n instanceof HTMLSelectElement){let r=pe([...n.options]);return O(n.multiple?{type:`array`,items:{type:`string`,...r},uniqueItems:!0}:{type:`string`,...r},e,t)}if(x.has(n.type)){let r={type:`string`},i=A(n);return i!==void 0&&(r.pattern=i),O(r,e,t)}if(n.type===`hidden`)return n.getAttribute(`toolparamdescription`)?O({type:`string`},e,t):void 0;if(n.type===`number`)return O(j(n),e,t);if(n.type===`range`){let r=j(n,!1);return r.minimum??=0,r.maximum??=100,O(r,e,t)}if(n.type===`checkbox`)return O({type:`boolean`},e,t);if(n.type===`radio`)return O({type:`string`,...N([n])},e,t);if(n.type===`date`)return O({type:`string`,format:`date`},e,t,`Dates MUST be provided in 'YYYY-MM-DD' format.`);if(n.type===`month`)return O({type:`string`,format:`^[0-9]{4}-(0[1-9]|1[0-2])$`},e,t);if(n.type===`week`)return O({type:`string`,format:`^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$`},e,t);if(n.type===`time`)return O({type:`string`,format:M(n,`^([01][0-9]|2[0-3]):[0-5][0-9]`)},e,t);if(n.type===`datetime-local`)return O({type:`string`,format:M(n,`^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]`)},e,t);if(n.type===`color`)return O({type:`string`,format:`^#[0-9a-zA-Z]{6}$`},e,t)}}function me(e){let t={},n=[];for(let[r,i]of E(e)){if(!r)continue;let a=P(e,i);a&&(Object.defineProperty(t,r,{configurable:!0,enumerable:!0,value:a,writable:!0}),i.some(e=>e.required)&&n.push(r))}return{type:`object`,properties:t,required:n}}function he(e){return{name:w(e,`toolname`)??``,title:w(e,`tooltitle`)??``,description:w(e,`tooldescription`)??``,inputSchema:me(e),autosubmit:T(e,`toolautosubmit`)}}function F(e){if(typeof e==`string`||typeof e==`boolean`||typeof e==`number`&&Number.isFinite(e))return String(e)}function I(e){if(typeof e==`boolean`)return e;if(typeof e==`number`&&Number.isInteger(e))return e!==0;if(typeof e==`string`){if(e===`1`||e.toLowerCase()===`true`)return!0;if(e===`0`||e.toLowerCase()===`false`)return!1}}function L(e,t){if(!Array.isArray(e))return!1;let n=new Set(t);for(let t of e){let e=F(t);if(e===void 0||!n.delete(e))return!1}return!0}function ge(e,t){if(t===``)return e.type!==`number`&&e.type!==`range`;let n=e.ownerDocument.createElement(`input`);return n.type=e.type,n.value=t,n.value!==``}function _e(e,t,n){let r=t[0];if(!r||!P(e,t))return!1;if(t.length>1){if(!t.every(e=>e instanceof HTMLInputElement))return!1;if(t.every(e=>e.type===`checkbox`))return L(n,new Set(t.map(e=>e.value)));if(t.every(e=>e.type===`radio`)){let e=F(n);return e!==void 0&&t.some(t=>t.value===e)}return!1}if(r instanceof HTMLSelectElement){let e=new Set([...r.options].map(e=>e.value));if(r.multiple)return L(n,e);let t=F(n);return t!==void 0&&e.has(t)}if(r instanceof HTMLTextAreaElement)return F(n)!==void 0;if(r.type===`checkbox`)return I(n)!==void 0;if(r.type===`radio`){let e=F(n);return e!==void 0&&r.value===e}let i=F(n);return i!==void 0&&ge(r,i)}function R(e){e.dispatchEvent(new Event(`input`,{bubbles:!0,composed:!0})),e.dispatchEvent(new Event(`change`,{bubbles:!0}))}function ve(e,t){let n=e instanceof HTMLInputElement?HTMLInputElement.prototype:HTMLTextAreaElement.prototype;Object.getOwnPropertyDescriptor(n,`value`)?.set?.call(e,t)}function z(e,t){Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,`checked`)?.set?.call(e,t)}function ye(e,t){let n=e[0];if(!n)return;if(e.length>1&&e.every(e=>e instanceof HTMLInputElement)){if(e.every(e=>e.type===`checkbox`)&&Array.isArray(t)){let n=new Set(t.map(F));for(let t of e){let e=n.has(t.value);t.checked!==e&&(z(t,e),R(t))}return}let n=F(t),r=e.find(e=>e.value===n);r&&!r.checked&&(z(r,!0),R(r));return}if(n instanceof HTMLSelectElement){if(n.multiple&&Array.isArray(t)){let e=new Set(t.map(F)),r=!1;for(let t of n.options){let n=e.has(t.value);t.selected!==n&&(t.selected=n,r=!0)}r&&R(n);return}let e=F(t);e!==void 0&&n.value!==e&&(n.value=e,R(n));return}if(n instanceof HTMLInputElement&&n.type===`checkbox`){let e=I(t);e!==void 0&&n.checked!==e&&(z(n,e),R(n));return}if(n instanceof HTMLInputElement&&n.type===`radio`){F(t)===n.value&&!n.checked&&(z(n,!0),R(n));return}let r=F(t);r!==void 0&&n.value!==r&&(ve(n,r),R(n))}function be(e,t){if(Array.isArray(t))throw TypeError(`Declarative tool input must be an object`);let n=E(e);for(let[r,i]of Object.entries(t)){let t=n.get(r);if(!t||!_e(e,t,i))throw TypeError(`Invalid value for declarative form parameter "${r}"`)}for(let[e,r]of Object.entries(t))ye(n.get(e)??[],r)}function xe(e){return[...C(e)].find(e=>!e.matches(`:disabled`)&&(e instanceof HTMLButtonElement&&e.type===`submit`||e instanceof HTMLInputElement&&[`image`,`submit`].includes(e.type)))}function Se(e){let t=[...C(e)].filter(e=>S(e)&&e.willValidate&&!e.validity.valid).map(e=>`${e.name.trim()||`{unknown}`}: ${e.validationMessage}`).join(`. `);return new DOMException(`Form validation failed: ${t}`,`UnknownError`)}function B(e){let t=new Event(`toolactivated`);return Object.defineProperty(t,"toolName",{enumerable:!0,value:e}),t}function Ce(e,t,n,r){let{form:i}=e;return e.cancelPending?.(new DOMException(`Tool execution cancelled`,`UnknownError`)),new Promise((a,o)=>{let s=!1,c=()=>{Reflect.apply(EventTarget.prototype.removeEventListener,i,[`invalid`,f,!0]),y.delete(i),e.cancelPending===u&&delete e.cancelPending},l=e=>{s||(s=!0,c(),e())},u=e=>l(()=>o(e)),d=e=>{e.then(e=>l(()=>a(e)),e=>l(()=>o(e)))},f=e=>{e.isTrusted&&queueMicrotask(()=>{se(i)||u(Se(i))})};if(y.set(i,{complete(e){queueMicrotask(()=>{let t=v.get(e);t?d(t):e.defaultPrevented?u(new DOMException(`preventDefault() requires respondWith()`,`UnknownError`)):l(()=>a(void 0))})},direct(){l(()=>a(void 0))},respond(e){queueMicrotask(()=>{let t=v.get(e);t&&d(t)})}}),e.cancelPending=u,Reflect.apply(EventTarget.prototype.addEventListener,i,[`invalid`,f,!0]),!n){r?.focus(),window.dispatchEvent(B(t));return}try{ce(i,r),window.dispatchEvent(B(t))}catch(e){u(e)}})}function we(e,t){let n=!0,r=new Map,i=new Map,a=new Map,o=e=>{if(!(e instanceof SubmitEvent)||!e.isTrusted||!(e.target instanceof HTMLFormElement))return;let t=y.get(e.target);t&&(_.add(e),t.complete(e))},s=e=>{if(!e.isTrusted||!(e.target instanceof HTMLFormElement))return;let t=e.target;queueMicrotask(()=>{e.defaultPrevented||r.get(t)?.cancelPending?.(new DOMException(`Tool execution cancelled by form reset`,`UnknownError`))})};function c(e){a.get(e)?.disconnect(),a.delete(e),e.removeEventListener(`reset`,s,!0),e.removeEventListener(`submit`,o,!0)}function l(e){if(a.has(e))return;let t=new MutationObserver(u);a.set(e,t),t.observe(e,{attributes:!0,characterData:!0,childList:!0,subtree:!0}),e.addEventListener(`reset`,s,!0),e.addEventListener(`submit`,o,!0)}function u(){l(e);for(let e of a.keys())e instanceof ShadowRoot&&!Reflect.get(Node.prototype,`isConnected`,e.host)&&c(e);let n=new Set,o=new Map,s=new Map;for(let e of a.keys())for(let t of e.querySelectorAll(`*`)){let e=oe(t);if(e&&l(e),!(t instanceof HTMLFormElement)||!T(t,`toolname`)||!T(t,`tooldescription`)||!ae(t))continue;let r=t;n.add(r);let a=he(r),c=JSON.stringify(a),u=i.get(r);if(u===c)continue;let d=u!==void 0;i.delete(r);let f=s.get(a.name);if(f&&!d){i.set(r,c);continue}if(f){let e=o.get(f);e&&(i.set(f,e.fingerprint),o.delete(f))}s.set(a.name,r),o.set(r,{definition:a,fingerprint:c})}for(let e of i.keys())n.has(e)||i.delete(e);for(let[e,t]of r)o.get(e)?.fingerprint!==t.fingerprint&&(t.cancelPending?.(new DOMException(`Tool execution cancelled because its form changed`,`UnknownError`)),t.controller.abort(),r.delete(e));for(let[e,{definition:n,fingerprint:i}]of o){if(r.has(e))continue;let a=new AbortController,o={controller:a,fingerprint:i,form:e};r.set(e,o),t.registerTool({name:n.name,title:n.title,description:n.description,inputSchema:n.inputSchema,execute(t){let r=xe(e);if(!n.autosubmit&&!r)throw new DOMException(`A declarative form without toolautosubmit requires a submit button`,`UnknownError`);return be(e,t),Ce(o,n.name,n.autosubmit,r)}},{signal:a.signal}).catch(e=>{a.abort(),e?.name!==`AbortError`&&console.error(`[webmcp] declarative form tool "${n.name}" was not registered:`,e)})}}let d=()=>{},f=e.defaultView?.Element.prototype,p=f?Object.getOwnPropertyDescriptor(f,`attachShadow`):void 0;if(f&&p?.configurable){let t=f.attachShadow,r=function(r){let i=t.call(this,r);return n&&i.mode===`open`&&Reflect.get(Node.prototype,`ownerDocument`,this)===e&&Reflect.get(Node.prototype,`isConnected`,this)&&l(i),i};Object.defineProperty(f,"attachShadow",{...p,value:r}),d=()=>{f.attachShadow===r&&Object.defineProperty(f,"attachShadow",p)}}let m=()=>{},h=e.defaultView?.HTMLFormElement.prototype,g=h?Object.getOwnPropertyDescriptor(h,`submit`):void 0;if(h&&g?.configurable){let e=h.submit,t=function(){e.call(this),n&&y.get(this)?.direct()};Object.defineProperty(h,"submit",{...g,value:t}),m=()=>{h.submit===t&&Object.defineProperty(h,"submit",g)}}return u(),()=>{n=!1,m(),d();for(let e of a.keys())c(e);i.clear();for(let e of r.values())e.cancelPending?.(new DOMException(`Tool execution cancelled`,`UnknownError`)),e.controller.abort();r.clear()}}let V=Symbol(`registeredInputSchema`),H=Symbol(`registrationSignal`),U=Symbol(`registrationAbort`),W=[],G=null,K=null;function q(){return typeof globalThis.origin==`string`?globalThis.origin:globalThis.location?.origin??``}function J(e,t,n){let r=Object.getOwnPropertyDescriptor(e,t);try{Object.defineProperty(e,t,n)}catch(e){throw $(),e}W.push({target:e,key:t,previous:r})}var Y=class extends EventTarget{#e=new Map;#t=null;#n=null;#r=e=>{this.#n?.call(this,e)};#i;#a;constructor(e){super(),this.#a=e,this.#i=e?.defaultView?.DOMException??DOMException,Object.defineProperty(this,"__isWebMCPPolyfill",{value:!0,enumerable:!1,writable:!1,configurable:!1})}get ontoolchange(){return this.#n}set ontoolchange(e){let t=typeof e==`function`?e:null;if(t===null){this.#n=null,super.removeEventListener(`toolchange`,this.#r);return}this.#n===null&&super.addEventListener(`toolchange`,this.#r),this.#n=t}async registerTool(e,t={}){g(this.#a);let n=t?.signal,r=Ee(e,this.#e);if(n?.throwIfAborted(),h(t?.exposedTo),n?.throwIfAborted(),t?.exposedTo?.length)throw new this.#i(`Cross-document tool exposure requires native WebMCP`,`NotSupportedError`);if(this.#e.set(r.name,r),n){let e=()=>{this.#o(r.name,r)&&this.#c()};r[H]=n,r[U]=e,n.addEventListener(`abort`,e,{once:!0})}if(await this.#c(),n?.aborted)throw n.reason}async getTools(e={}){if(g(this.#a),h(e?.fromOrigins),e?.fromOrigins?.length)throw new this.#i(`Cross-document tool discovery requires native WebMCP`,`NotSupportedError`);let t=[...this.#e.values()].map(e=>{let t=e[V],n=t===void 0?void 0:JSON.parse(t);return{name:e.name,title:e.title??``,description:e.description,...r(n)?{inputSchema:n}:{},origin:q(),window:globalThis.window,...e.annotations?{annotations:u(e.annotations)}:{}}}).sort((e,t)=>e.name<t.name?-1:+(e.name>t.name));return await new Promise(e=>setTimeout(e,0)),t}async executeTool(e,t,n={}){if(g(this.#a),typeof e!=`object`||!e)throw TypeError(`RegisteredTool must be an object`);for(let t of[`name`,`description`,`window`,`origin`])if(!(t in e))throw TypeError(`RegisteredTool.${t} is required`);if(te(e.origin),e.window!==globalThis.window||e.origin!==q())throw o(`Tool not found: ${e.name}`);return this.#s(e.name,t,n)}static getTestingShim(e){return e.#t??=new Te(e),e.#t}static getToolInfos(e){return[...e.#e.values()].map(e=>({name:e.name,description:e.description,...e[V]===void 0?{}:{inputSchema:e[V]}}))}static executeToolForTesting(e,t,n,r){return g(e.#a),e.#s(t,n,r)}static dispose(e){for(let t of e.#e.keys())e.#o(t);e.ontoolchange=null,e.#t?.dispose()}#o(e,t){let n=this.#e.get(e);if(!n||t&&n!==t)return!1;let r=n[H],i=n[U];return r&&i&&r.removeEventListener(`abort`,i),this.#e.delete(e)}async#s(e,t,n){n?.signal?.throwIfAborted();let r=this.#e.get(e);if(!r)throw o(`Tool not found: ${e}`);let i=d(t);if(n?.signal?.throwIfAborted(),r[H]?.aborted)throw o(`Tool unregistered`);let a;try{let e=r[H];a=await p(p(Promise.resolve(r.execute(i)),e,()=>o(`Tool unregistered`)),n?.signal)}catch(e){throw n?.signal?.aborted&&e===n.signal.reason||r[H]?.aborted?e:s(e)}return f(a)}async#c(){await new Promise(e=>setTimeout(e,0)),this.dispatchEvent(new Event(`toolchange`)),this.#t?.dispatchToolChange()}};let X=function(){throw TypeError(`Illegal constructor`)};Object.defineProperty(X,"name",{value:`ModelContext`}),Object.defineProperty(X,"prototype",{value:Y.prototype,writable:!1}),Object.setPrototypeOf(X,EventTarget),Object.defineProperty(Y.prototype,"constructor",{configurable:!0,writable:!0,value:X}),Object.defineProperty(Y.prototype,Symbol.toStringTag,{configurable:!0,value:`ModelContext`});for(let e of[`registerTool`,`getTools`,`executeTool`,`ontoolchange`]){let t=Object.getOwnPropertyDescriptor(Y.prototype,e);t&&Object.defineProperty(Y.prototype,e,{...t,enumerable:!0})}var Te=class extends EventTarget{_ontoolchange=null;ontoolchangeListener=e=>{this._ontoolchange?.call(this,e)};#e;constructor(e){super(),this.#e=e}listTools(){return Y.getToolInfos(this.#e)}executeTool(e,t,n){return Y.executeToolForTesting(this.#e,e,t,n)}get ontoolchange(){return this._ontoolchange}set ontoolchange(e){let t=typeof e==`function`?e:null;if(t===null){this._ontoolchange=null,super.removeEventListener(`toolchange`,this.ontoolchangeListener);return}this._ontoolchange===null&&super.addEventListener(`toolchange`,this.ontoolchangeListener),this._ontoolchange=t}dispatchToolChange(){this.dispatchEvent(new Event(`toolchange`))}dispose(){this.ontoolchange=null}};function Ee(e,t){if(!e||typeof e!=`object`)throw TypeError(`registerTool(tool) requires a tool object`);let n=a(e);if(l(n),t.has(n.name))throw c(`Tool already registered: ${n.name}`);let r=n.inputSchema===void 0?void 0:ne(n.inputSchema);return{name:n.name,...n.title===void 0?{}:{title:n.title},description:n.description,...n.inputSchema===void 0?{}:{inputSchema:n.inputSchema},...n.annotations===void 0?{}:{annotations:n.annotations},execute:e=>Reflect.apply(n.execute,void 0,[e]),...r===void 0?{}:{[V]:r}}}let Z=!1,De=new WeakMap,{modelContext:Oe}={modelContext(){if(!(this instanceof Document))throw TypeError(`Illegal invocation`);return De.get(this)}};Object.defineProperty(Oe,"name",{value:`get modelContext`});function ke(e,t){De.set(e,t),!Object.hasOwn(Document.prototype,`modelContext`)&&J(Document.prototype,`modelContext`,{configurable:!0,enumerable:!0,get:Oe})}function Ae(e,t){J(e,`modelContext`,{configurable:!0,enumerable:!0,get(){return Z||(Z=!0,console.warn(`[WebMCPPolyfill] navigator.modelContext is deprecated. The May 27, 2026 WebMCP draft moved the modelContext getter from Navigator to Document — use document.modelContext instead. See https://github.com/webmachinelearning/webmcp/pull/184.`)),t}})}function je(){let e=SubmitEvent.prototype;`agentInvoked`in e||J(e,`agentInvoked`,{configurable:!0,enumerable:!0,get(){return b(this)}}),`respondWith`in e||J(e,`respondWith`,{configurable:!0,enumerable:!0,writable:!0,value(e){re(this,e)}})}function Q(e){if(globalThis.isSecureContext===!1)return;let t=typeof navigator>`u`?null:navigator,n=typeof document>`u`?null:document;if(!t||!n||typeof window>`u`||n.modelContext)return;let r=t.modelContext;if(W.length>0&&$(),r){ke(n,r);return}let i=Object.getOwnPropertyDescriptor(window,`ModelContext`);if(i&&!i.configurable){if(!Object.is(Reflect.get(window,`ModelContext`),X))throw TypeError(`Cannot install ModelContext over a non-configurable global`)}else J(window,`ModelContext`,{configurable:!0,enumerable:!1,writable:!0,value:X});let a=new Y(n);G=a,ke(n,a),Z=!1,Ae(t,a),je(),e?.installTestingShim&&!t.modelContextTesting&&J(t,`modelContextTesting`,{configurable:!0,enumerable:!0,writable:!1,value:Y.getTestingShim(a)}),K=we(n,a)}function $(){K?.(),K=null,G&&Y.dispose(G),G=null;for(let{target:e,key:t,previous:n}of[...W].reverse())n?Object.defineProperty(e,t,n):Reflect.deleteProperty(e,t);W.length=0,Z=!1}try{Q(window.__webMCPPolyfillOptions)}catch(e){console.error(`[WebMCPPolyfill] Auto-initialization failed:`,e)}return e.cleanupWebMCPPolyfill=$,e.initializeWebMCPPolyfill=Q,e})({});
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#tools","#ontoolchangeListener","#ontoolchangeHandler","#domException","#ownerDocument","#removeTool","#notifyToolsChanged","#invokeToolByName","#testingShim","#context"],"sources":["../src/declarative-forms.ts","../src/index.ts"],"sourcesContent":["import type { InputSchema, ModelContext, WebMcpToolInput } from '@mcp-b/webmcp-types';\n\ntype DeclarativeControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\ntype Submitter = HTMLButtonElement | HTMLInputElement;\n\ninterface DeclarativeToolDefinition {\n name: string;\n title: string;\n description: string;\n inputSchema: InputSchema;\n autosubmit: boolean;\n}\n\ninterface DeclarativeRegistration {\n controller: AbortController;\n fingerprint: string;\n form: HTMLFormElement;\n cancelPending?: (reason: unknown) => void;\n}\n\ninterface ActiveSubmission {\n complete(event: SubmitEvent): void;\n direct(): void;\n respond(event: SubmitEvent): void;\n}\n\nconst agentInvokedEvents = new WeakSet<SubmitEvent>();\nconst agentResponses = new WeakMap<SubmitEvent, Promise<unknown>>();\nconst activeSubmissions = new WeakMap<HTMLFormElement, ActiveSubmission>();\n\nexport function isAgentInvokedSubmitEvent(event: SubmitEvent): boolean {\n return (\n event.isTrusted &&\n (agentInvokedEvents.has(event) ||\n (event.eventPhase !== Event.NONE &&\n event.target instanceof HTMLFormElement &&\n activeSubmissions.has(event.target)))\n );\n}\n\nexport function respondWithAgentSubmitEvent(\n event: SubmitEvent,\n agentResponse: Promise<unknown>\n): void {\n if (!isAgentInvokedSubmitEvent(event)) {\n throw new DOMException(\n 'respondWith() is only available during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (!event.defaultPrevented) {\n throw new DOMException(\n 'respondWith() requires preventDefault() during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (event.eventPhase === Event.NONE) {\n throw new DOMException(\n 'respondWith() is only available while the submit event is being dispatched',\n 'InvalidStateError'\n );\n }\n agentInvokedEvents.add(event);\n const response = Promise.resolve(agentResponse);\n agentResponses.set(event, response);\n if (event.target instanceof HTMLFormElement) {\n activeSubmissions.get(event.target)?.respond(event);\n }\n}\n\nconst TEXT_INPUT_TYPES = new Set(['email', 'password', 'search', 'tel', 'text', 'url']);\nconst READONLY_INPUT_TYPES = new Set([\n ...TEXT_INPUT_TYPES,\n 'date',\n 'datetime-local',\n 'month',\n 'number',\n 'time',\n 'week',\n]);\n\nfunction isControl(element: Element): element is DeclarativeControl {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n );\n}\n\nfunction getFormControls(form: HTMLFormElement): HTMLFormControlsCollection {\n return Reflect.get(HTMLFormElement.prototype, 'elements', form);\n}\n\nfunction getFormAttribute(form: HTMLFormElement, name: string): string | null {\n return Reflect.apply(Element.prototype.getAttribute, form, [name]);\n}\n\nfunction formHasAttribute(form: HTMLFormElement, name: string): boolean {\n return Reflect.apply(Element.prototype.hasAttribute, form, [name]);\n}\n\nfunction isFormConnected(form: HTMLFormElement): boolean {\n return Reflect.get(Node.prototype, 'isConnected', form);\n}\n\nfunction getOpenShadowRoot(element: Element): ShadowRoot | null {\n return Reflect.get(Element.prototype, 'shadowRoot', element);\n}\n\nfunction checkFormValidity(form: HTMLFormElement): boolean {\n return Reflect.apply(HTMLFormElement.prototype.checkValidity, form, []);\n}\n\nfunction requestFormSubmit(form: HTMLFormElement, submitter?: Submitter): void {\n Reflect.apply(HTMLFormElement.prototype.requestSubmit, form, submitter ? [submitter] : []);\n}\n\nfunction getControls(form: HTMLFormElement): DeclarativeControl[] {\n return [...getFormControls(form)].filter(\n (element): element is DeclarativeControl =>\n isControl(element) &&\n !element.matches(':disabled') &&\n !(\n 'readOnly' in element &&\n element.readOnly &&\n (element instanceof HTMLTextAreaElement || READONLY_INPUT_TYPES.has(element.type))\n )\n );\n}\n\nfunction controlGroups(form: HTMLFormElement): Map<string, DeclarativeControl[]> {\n const groups = new Map<string, DeclarativeControl[]>();\n for (const control of getControls(form)) {\n const name = control.name.trim();\n const controls = groups.get(name);\n if (controls) controls.push(control);\n else groups.set(name, [control]);\n }\n return groups;\n}\n\nfunction labelText(control: DeclarativeControl): string {\n return [...(control.labels ?? [])]\n .map((label) => {\n const copy = label.cloneNode(true);\n if (!(copy instanceof HTMLElement)) return '';\n copy\n .querySelectorAll('button, input, meter, output, progress, select, textarea')\n .forEach((element) => element.remove());\n return copy.textContent?.trim() ?? '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction commonFieldset(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): HTMLFieldSetElement | undefined {\n for (\n let element = controls[0]?.parentElement;\n element && element !== form;\n element = element.parentElement\n ) {\n if (\n element instanceof HTMLFieldSetElement &&\n controls.every((control) => element.contains(control))\n ) {\n return element;\n }\n }\n return undefined;\n}\n\nfunction parameterDescription(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): string | undefined {\n if (controls.length === 1) {\n const control = controls[0];\n if (!control) return undefined;\n return (\n control.getAttribute('toolparamdescription') ||\n labelText(control) ||\n control.getAttribute('aria-description') ||\n undefined\n );\n }\n return commonFieldset(form, controls)?.getAttribute('toolparamdescription') || undefined;\n}\n\nfunction withDescription(\n schema: Record<string, unknown>,\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n extra?: string\n): Record<string, unknown> {\n const description = parameterDescription(form, controls);\n const combined = description && extra ? `${description} (${extra})` : description || extra;\n return combined ? { ...schema, description: combined } : schema;\n}\n\nfunction validNumberAttribute(input: HTMLInputElement, name: 'max' | 'min'): number | undefined {\n const raw = input.getAttribute(name);\n if (raw === null || raw.trim() === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction isStepBaseMultiple(stepBase: number, step: number): boolean {\n const quotient = stepBase / step;\n return Math.abs(quotient - Math.round(quotient)) < Number.EPSILON * 16;\n}\n\nfunction validPattern(input: HTMLInputElement): string | undefined {\n const pattern = input.getAttribute('pattern');\n if (pattern === null) return undefined;\n try {\n new RegExp(pattern, 'v');\n return pattern;\n } catch {\n return undefined;\n }\n}\n\nfunction numberSchema(input: HTMLInputElement, includePattern = true): Record<string, unknown> {\n const schema: Record<string, unknown> = { type: 'number' };\n const minimum = validNumberAttribute(input, 'min');\n const maximum = validNumberAttribute(input, 'max');\n if (minimum !== undefined) schema.minimum = minimum;\n if (maximum !== undefined) schema.maximum = maximum;\n\n const rawStep = input.getAttribute('step');\n if (rawStep !== 'any') {\n const parsedStep = rawStep === null || rawStep === '' ? 1 : Number(rawStep);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const rawValue = Number(input.getAttribute('value'));\n const stepBase = minimum ?? (Number.isFinite(rawValue) ? rawValue : 0);\n if (isStepBaseMultiple(stepBase, step)) schema.multipleOf = step;\n }\n\n const pattern = includePattern ? validPattern(input) : undefined;\n if (pattern !== undefined) schema.pattern = pattern;\n return schema;\n}\n\nfunction temporalFormat(input: HTMLInputElement, datePrefix: string): string {\n const rawStep = input.getAttribute('step');\n const parsedStep = rawStep === null || rawStep === '' ? 60 : Number(rawStep);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 60;\n if (step < 1) return `${datePrefix}(:[0-5][0-9](\\\\.[0-9]{1,3})?)?$`;\n if (step < 60) return `${datePrefix}(:[0-5][0-9])?$`;\n return `${datePrefix}$`;\n}\n\nfunction optionSchemas(options: readonly HTMLOptionElement[]): {\n anyOf: Record<string, unknown>[];\n enum: string[];\n} {\n return {\n anyOf: options.map((option) => ({\n type: 'string',\n const: option.value,\n title: option.textContent ?? '',\n })),\n enum: options.map((option) => option.value),\n };\n}\n\nfunction groupChoiceSchemas(controls: readonly HTMLInputElement[]): {\n anyOf: Record<string, unknown>[];\n enum: string[];\n} {\n return {\n anyOf: controls.map((control) => {\n const title = labelText(control);\n return { type: 'string', const: control.value, ...(title ? { title } : {}) };\n }),\n enum: controls.map((control) => control.value),\n };\n}\n\nfunction parameterSchema(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): Record<string, unknown> | undefined {\n const first = controls[0];\n if (!first) return undefined;\n\n if (controls.length > 1) {\n if (!controls.every((control) => control instanceof HTMLInputElement)) return undefined;\n if (controls.every((control) => control.type === 'checkbox')) {\n return withDescription(\n {\n type: 'array',\n items: { type: 'string', ...groupChoiceSchemas(controls) },\n uniqueItems: true,\n },\n form,\n controls\n );\n }\n if (controls.every((control) => control.type === 'radio')) {\n return withDescription({ type: 'string', ...groupChoiceSchemas(controls) }, form, controls);\n }\n return undefined;\n }\n\n if (first instanceof HTMLTextAreaElement) {\n return withDescription({ type: 'string' }, form, controls);\n }\n\n if (first instanceof HTMLSelectElement) {\n const choices = optionSchemas([...first.options]);\n return withDescription(\n first.multiple\n ? { type: 'array', items: { type: 'string', ...choices }, uniqueItems: true }\n : { type: 'string', ...choices },\n form,\n controls\n );\n }\n\n if (TEXT_INPUT_TYPES.has(first.type)) {\n const schema: Record<string, unknown> = { type: 'string' };\n const pattern = validPattern(first);\n if (pattern !== undefined) schema.pattern = pattern;\n return withDescription(schema, form, controls);\n }\n if (first.type === 'hidden') {\n return first.getAttribute('toolparamdescription')\n ? withDescription({ type: 'string' }, form, controls)\n : undefined;\n }\n if (first.type === 'number') {\n return withDescription(numberSchema(first), form, controls);\n }\n if (first.type === 'range') {\n const schema = numberSchema(first, false);\n schema.minimum ??= 0;\n schema.maximum ??= 100;\n return withDescription(schema, form, controls);\n }\n if (first.type === 'checkbox') {\n return withDescription({ type: 'boolean' }, form, controls);\n }\n if (first.type === 'radio') {\n return withDescription({ type: 'string', ...groupChoiceSchemas([first]) }, form, controls);\n }\n if (first.type === 'date') {\n return withDescription(\n { type: 'string', format: 'date' },\n form,\n controls,\n \"Dates MUST be provided in 'YYYY-MM-DD' format.\"\n );\n }\n if (first.type === 'month') {\n return withDescription(\n { type: 'string', format: '^[0-9]{4}-(0[1-9]|1[0-2])$' },\n form,\n controls\n );\n }\n if (first.type === 'week') {\n return withDescription(\n { type: 'string', format: '^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$' },\n form,\n controls\n );\n }\n if (first.type === 'time') {\n return withDescription(\n {\n type: 'string',\n format: temporalFormat(first, '^([01][0-9]|2[0-3]):[0-5][0-9]'),\n },\n form,\n controls\n );\n }\n if (first.type === 'datetime-local') {\n return withDescription(\n {\n type: 'string',\n format: temporalFormat(\n first,\n '^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]'\n ),\n },\n form,\n controls\n );\n }\n if (first.type === 'color') {\n return withDescription({ type: 'string', format: '^#[0-9a-zA-Z]{6}$' }, form, controls);\n }\n return undefined;\n}\n\nfunction synthesizeSchema(form: HTMLFormElement): InputSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [name, controls] of controlGroups(form)) {\n if (!name) continue;\n const schema = parameterSchema(form, controls);\n if (!schema) continue;\n Object.defineProperty(properties, name, {\n configurable: true,\n enumerable: true,\n value: schema,\n writable: true,\n });\n if (controls.some((control) => control.required)) required.push(name);\n }\n return { type: 'object', properties, required };\n}\n\nfunction toolDefinition(form: HTMLFormElement): DeclarativeToolDefinition {\n return {\n name: getFormAttribute(form, 'toolname') ?? '',\n title: getFormAttribute(form, 'tooltitle') ?? '',\n description: getFormAttribute(form, 'tooldescription') ?? '',\n inputSchema: synthesizeSchema(form),\n autosubmit: formHasAttribute(form, 'toolautosubmit'),\n };\n}\n\nfunction toFormString(value: unknown): string | undefined {\n if (typeof value === 'string' || typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction toFormBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isInteger(value)) return value !== 0;\n if (typeof value !== 'string') return undefined;\n if (value === '1' || value.toLowerCase() === 'true') return true;\n if (value === '0' || value.toLowerCase() === 'false') return false;\n return undefined;\n}\n\nfunction hasUniqueAllowedValues(value: unknown, allowed: ReadonlySet<string>): value is unknown[] {\n if (!Array.isArray(value)) return false;\n const remaining = new Set(allowed);\n for (const item of value) {\n const string = toFormString(item);\n if (string === undefined || !remaining.delete(string)) return false;\n }\n return true;\n}\n\nfunction inputAcceptsValue(input: HTMLInputElement, value: string): boolean {\n if (value === '') return input.type !== 'number' && input.type !== 'range';\n const probe = input.ownerDocument.createElement('input');\n probe.type = input.type;\n probe.value = value;\n return probe.value !== '';\n}\n\nfunction validatesParameter(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n value: unknown\n): boolean {\n const first = controls[0];\n if (!first || !parameterSchema(form, controls)) return false;\n\n if (controls.length > 1) {\n if (!controls.every((control) => control instanceof HTMLInputElement)) return false;\n if (controls.every((control) => control.type === 'checkbox')) {\n return hasUniqueAllowedValues(value, new Set(controls.map((control) => control.value)));\n }\n if (controls.every((control) => control.type === 'radio')) {\n const string = toFormString(value);\n return string !== undefined && controls.some((control) => control.value === string);\n }\n return false;\n }\n\n if (first instanceof HTMLSelectElement) {\n const allowed = new Set([...first.options].map((option) => option.value));\n if (first.multiple) return hasUniqueAllowedValues(value, allowed);\n const string = toFormString(value);\n return string !== undefined && allowed.has(string);\n }\n if (first instanceof HTMLTextAreaElement) return toFormString(value) !== undefined;\n if (first.type === 'checkbox') return toFormBoolean(value) !== undefined;\n if (first.type === 'radio') {\n const string = toFormString(value);\n return string !== undefined && first.value === string;\n }\n const string = toFormString(value);\n return string !== undefined && inputAcceptsValue(first, string);\n}\n\nfunction dispatchInputAndChange(control: DeclarativeControl): void {\n control.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n control.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\nfunction setNativeValue(control: HTMLInputElement | HTMLTextAreaElement, value: string): void {\n const prototype =\n control instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n Object.getOwnPropertyDescriptor(prototype, 'value')?.set?.call(control, value);\n}\n\nfunction setNativeChecked(control: HTMLInputElement, checked: boolean): void {\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked')?.set?.call(\n control,\n checked\n );\n}\n\nfunction fillParameter(controls: readonly DeclarativeControl[], value: unknown): void {\n const first = controls[0];\n if (!first) return;\n\n if (controls.length > 1 && controls.every((control) => control instanceof HTMLInputElement)) {\n if (controls.every((control) => control.type === 'checkbox') && Array.isArray(value)) {\n const checked = new Set(value.map(toFormString));\n for (const control of controls) {\n const next = checked.has(control.value);\n if (control.checked === next) continue;\n setNativeChecked(control, next);\n dispatchInputAndChange(control);\n }\n return;\n }\n const selected = toFormString(value);\n const control = controls.find((candidate) => candidate.value === selected);\n if (control && !control.checked) {\n setNativeChecked(control, true);\n dispatchInputAndChange(control);\n }\n return;\n }\n\n if (first instanceof HTMLSelectElement) {\n if (first.multiple && Array.isArray(value)) {\n const selected = new Set(value.map(toFormString));\n let changed = false;\n for (const option of first.options) {\n const next = selected.has(option.value);\n if (option.selected === next) continue;\n option.selected = next;\n changed = true;\n }\n if (changed) dispatchInputAndChange(first);\n return;\n }\n const next = toFormString(value);\n if (next !== undefined && first.value !== next) {\n first.value = next;\n dispatchInputAndChange(first);\n }\n return;\n }\n\n if (first instanceof HTMLInputElement && first.type === 'checkbox') {\n const next = toFormBoolean(value);\n if (next !== undefined && first.checked !== next) {\n setNativeChecked(first, next);\n dispatchInputAndChange(first);\n }\n return;\n }\n\n if (first instanceof HTMLInputElement && first.type === 'radio') {\n const next = toFormString(value);\n if (next === first.value && !first.checked) {\n setNativeChecked(first, true);\n dispatchInputAndChange(first);\n }\n return;\n }\n\n const next = toFormString(value);\n if (next !== undefined && first.value !== next) {\n setNativeValue(first, next);\n dispatchInputAndChange(first);\n }\n}\n\nfunction fillForm(form: HTMLFormElement, input: WebMcpToolInput): void {\n if (Array.isArray(input)) throw new TypeError('Declarative tool input must be an object');\n const groups = controlGroups(form);\n for (const [name, value] of Object.entries(input)) {\n const controls = groups.get(name);\n if (!controls || !validatesParameter(form, controls, value)) {\n throw new TypeError(`Invalid value for declarative form parameter \"${name}\"`);\n }\n }\n for (const [name, value] of Object.entries(input)) fillParameter(groups.get(name) ?? [], value);\n}\n\nfunction findSubmitter(form: HTMLFormElement): Submitter | undefined {\n return [...getFormControls(form)].find(\n (element): element is Submitter =>\n !element.matches(':disabled') &&\n ((element instanceof HTMLButtonElement && element.type === 'submit') ||\n (element instanceof HTMLInputElement && ['image', 'submit'].includes(element.type)))\n );\n}\n\nfunction validationError(form: HTMLFormElement): DOMException {\n const failures = [...getFormControls(form)]\n .filter(\n (element): element is DeclarativeControl =>\n isControl(element) && element.willValidate && !element.validity.valid\n )\n .map((control) => `${control.name.trim() || '{unknown}'}: ${control.validationMessage}`)\n .join('. ');\n return new DOMException(`Form validation failed: ${failures}`, 'UnknownError');\n}\n\nfunction toolActivatedEvent(toolName: string): Event {\n const event = new Event('toolactivated');\n Object.defineProperty(event, 'toolName', { enumerable: true, value: toolName });\n return event;\n}\n\nfunction waitForSubmission(\n registration: DeclarativeRegistration,\n toolName: string,\n autosubmit: boolean,\n submitter: Submitter | undefined\n): Promise<unknown> {\n const { form } = registration;\n registration.cancelPending?.(new DOMException('Tool execution cancelled', 'UnknownError'));\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n Reflect.apply(EventTarget.prototype.removeEventListener, form, ['invalid', onInvalid, true]);\n activeSubmissions.delete(form);\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n };\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const cancel = (reason: unknown) => finish(() => reject(reason));\n const settleResponse = (response: Promise<unknown>) => {\n response.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error))\n );\n };\n const onInvalid = (event: Event) => {\n if (!event.isTrusted) return;\n queueMicrotask(() => {\n if (!checkFormValidity(form)) cancel(validationError(form));\n });\n };\n\n activeSubmissions.set(form, {\n complete(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n else if (event.defaultPrevented) {\n cancel(new DOMException('preventDefault() requires respondWith()', 'UnknownError'));\n } else finish(() => resolve(undefined));\n });\n },\n direct() {\n finish(() => resolve(undefined));\n },\n respond(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n });\n },\n });\n registration.cancelPending = cancel;\n Reflect.apply(EventTarget.prototype.addEventListener, form, ['invalid', onInvalid, true]);\n\n if (!autosubmit) {\n submitter?.focus();\n window.dispatchEvent(toolActivatedEvent(toolName));\n return;\n }\n try {\n requestFormSubmit(form, submitter);\n window.dispatchEvent(toolActivatedEvent(toolName));\n } catch (error) {\n cancel(error);\n }\n });\n}\n\n/** Installs the DOM-backed half of the draft Declarative WebMCP API. */\nexport function installDeclarativeForms(document: Document, context: ModelContext): () => void {\n let active = true;\n const registrations = new Map<HTMLFormElement, DeclarativeRegistration>();\n const blockedDefinitions = new Map<HTMLFormElement, string>();\n const observers = new Map<Document | ShadowRoot, MutationObserver>();\n const onSubmit = (event: Event) => {\n if (\n !(event instanceof SubmitEvent) ||\n !event.isTrusted ||\n !(event.target instanceof HTMLFormElement)\n ) {\n return;\n }\n // Only a form with a running tool call submits on the agent's behalf; marking\n // every trusted submit would report agentInvoked for ordinary user submissions.\n const submission = activeSubmissions.get(event.target);\n if (!submission) return;\n agentInvokedEvents.add(event);\n submission.complete(event);\n };\n\n const onReset = (event: Event) => {\n if (!event.isTrusted || !(event.target instanceof HTMLFormElement)) return;\n const form = event.target;\n queueMicrotask(() => {\n if (event.defaultPrevented) return;\n registrations\n .get(form)\n ?.cancelPending?.(\n new DOMException('Tool execution cancelled by form reset', 'UnknownError')\n );\n });\n };\n\n function stopObservingRoot(root: Document | ShadowRoot): void {\n observers.get(root)?.disconnect();\n observers.delete(root);\n root.removeEventListener('reset', onReset, true);\n root.removeEventListener('submit', onSubmit, true);\n }\n\n function observeRoot(root: Document | ShadowRoot): void {\n if (observers.has(root)) return;\n const observer = new MutationObserver(sync);\n observers.set(root, observer);\n observer.observe(root, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n root.addEventListener('reset', onReset, true);\n // ponytail: submit is composed:false, so per-root capture sees every submission; hook\n // window capture too if a page listener ever stops propagation before this one.\n root.addEventListener('submit', onSubmit, true);\n }\n\n function sync(): void {\n observeRoot(document);\n for (const root of observers.keys()) {\n if (root instanceof ShadowRoot && !Reflect.get(Node.prototype, 'isConnected', root.host)) {\n stopObservingRoot(root);\n }\n }\n\n const candidates = new Set<HTMLFormElement>();\n const selected = new Map<\n HTMLFormElement,\n { definition: DeclarativeToolDefinition; fingerprint: string }\n >();\n const selectedByName = new Map<string, HTMLFormElement>();\n for (const root of observers.keys()) {\n for (const element of root.querySelectorAll('*')) {\n const shadowRoot = getOpenShadowRoot(element);\n if (shadowRoot) observeRoot(shadowRoot);\n\n if (\n !(element instanceof HTMLFormElement) ||\n !formHasAttribute(element, 'toolname') ||\n !formHasAttribute(element, 'tooldescription') ||\n !isFormConnected(element)\n ) {\n continue;\n }\n const form = element;\n candidates.add(form);\n const definition = toolDefinition(form);\n const fingerprint = JSON.stringify(definition);\n const blockedFingerprint = blockedDefinitions.get(form);\n if (blockedFingerprint === fingerprint) continue;\n const retryingChangedDefinition = blockedFingerprint !== undefined;\n blockedDefinitions.delete(form);\n const existingForm = selectedByName.get(definition.name);\n if (existingForm && !retryingChangedDefinition) {\n blockedDefinitions.set(form, fingerprint);\n continue;\n }\n if (existingForm) {\n const existingSelection = selected.get(existingForm);\n if (existingSelection) {\n blockedDefinitions.set(existingForm, existingSelection.fingerprint);\n selected.delete(existingForm);\n }\n }\n selectedByName.set(definition.name, form);\n selected.set(form, { definition, fingerprint });\n }\n }\n for (const form of blockedDefinitions.keys()) {\n if (!candidates.has(form)) blockedDefinitions.delete(form);\n }\n\n for (const [form, registration] of registrations) {\n const fingerprint = selected.get(form)?.fingerprint;\n if (fingerprint !== registration.fingerprint) {\n registration.cancelPending?.(\n new DOMException('Tool execution cancelled because its form changed', 'UnknownError')\n );\n registration.controller.abort();\n registrations.delete(form);\n }\n }\n\n for (const [form, { definition, fingerprint }] of selected) {\n if (registrations.has(form)) continue;\n const controller = new AbortController();\n const registration: DeclarativeRegistration = {\n controller,\n fingerprint,\n form,\n };\n registrations.set(form, registration);\n void context\n .registerTool(\n {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n execute(input: WebMcpToolInput) {\n const submitter = findSubmitter(form);\n if (!definition.autosubmit && !submitter) {\n throw new DOMException(\n 'A declarative form without toolautosubmit requires a submit button',\n 'UnknownError'\n );\n }\n fillForm(form, input);\n return waitForSubmission(\n registration,\n definition.name,\n definition.autosubmit,\n submitter\n );\n },\n },\n { signal: controller.signal }\n )\n .catch((error: unknown) => {\n controller.abort();\n // Invalid toolname/tooldescription attributes reject here. Without this the\n // form silently never becomes a tool, with no diagnostic in any channel.\n // Aborts are ordinary teardown, not a failure worth reporting.\n if ((error as { name?: unknown } | null)?.name === 'AbortError') return;\n console.error(\n `[webmcp] declarative form tool \"${definition.name}\" was not registered:`,\n error\n );\n });\n }\n }\n\n let restoreAttachShadow = () => {};\n const elementPrototype = document.defaultView?.Element.prototype;\n const attachShadowDescriptor = elementPrototype\n ? Object.getOwnPropertyDescriptor(elementPrototype, 'attachShadow')\n : undefined;\n if (elementPrototype && attachShadowDescriptor?.configurable) {\n const nativeAttachShadow = elementPrototype.attachShadow;\n const attachShadow = function (this: Element, init: ShadowRootInit): ShadowRoot {\n const root = nativeAttachShadow.call(this, init);\n if (\n active &&\n root.mode === 'open' &&\n Reflect.get(Node.prototype, 'ownerDocument', this) === document &&\n Reflect.get(Node.prototype, 'isConnected', this)\n ) {\n observeRoot(root);\n }\n return root;\n };\n Object.defineProperty(elementPrototype, 'attachShadow', {\n ...attachShadowDescriptor,\n value: attachShadow,\n });\n restoreAttachShadow = () => {\n if (elementPrototype.attachShadow === attachShadow) {\n Object.defineProperty(elementPrototype, 'attachShadow', attachShadowDescriptor);\n }\n };\n }\n\n let restoreFormSubmit = () => {};\n const formPrototype = document.defaultView?.HTMLFormElement.prototype;\n const submitDescriptor = formPrototype\n ? Object.getOwnPropertyDescriptor(formPrototype, 'submit')\n : undefined;\n if (formPrototype && submitDescriptor?.configurable) {\n const nativeSubmit = formPrototype.submit;\n const submit = function (this: HTMLFormElement): void {\n nativeSubmit.call(this);\n if (active) activeSubmissions.get(this)?.direct();\n };\n Object.defineProperty(formPrototype, 'submit', { ...submitDescriptor, value: submit });\n restoreFormSubmit = () => {\n if (formPrototype.submit === submit) {\n Object.defineProperty(formPrototype, 'submit', submitDescriptor);\n }\n };\n }\n\n // ponytail: a whole-tree rescan keeps DOM ownership obvious; index forms if this\n // becomes measurable on pages with thousands of annotated controls.\n sync();\n\n return () => {\n active = false;\n restoreFormSubmit();\n restoreAttachShadow();\n for (const root of observers.keys()) stopObservingRoot(root);\n blockedDefinitions.clear();\n for (const registration of registrations.values()) {\n registration.cancelPending?.(new DOMException('Tool execution cancelled', 'UnknownError'));\n registration.controller.abort();\n }\n registrations.clear();\n };\n}\n","import type {\n ChromeModelContextExecuteToolOptions,\n ModelContext,\n ModelContextGetToolOptions,\n ModelContextRegisterToolOptions,\n ModelContextTesting,\n ModelContextTestingToolInfo,\n ModelContextTool,\n RegisteredTool,\n WebMcpToolInput,\n} from '@mcp-b/webmcp-types';\nimport {\n coerceWebMcpToolDescriptor,\n createInvalidStateError,\n createToolInvocationFailedError,\n createUnknownError,\n isPlainObject,\n parseChromeToolInput,\n serializeChromeToolResult,\n serializeInputSchema,\n toWebMcpAnnotations,\n validateExecutableOrigin,\n validatePotentiallyTrustworthyOrigins,\n validateWebMcpAccess,\n validateWebMcpToolDescriptor,\n withAbortSignal,\n} from './schema.js';\nimport {\n installDeclarativeForms,\n isAgentInvokedSubmitEvent,\n respondWithAgentSubmitEvent,\n} from './declarative-forms.js';\n\nconst POLYFILL_MARKER_PROPERTY = '__isWebMCPPolyfill' as const;\nconst REGISTERED_INPUT_SCHEMA_SYMBOL = Symbol('registeredInputSchema');\nconst REGISTRATION_SIGNAL_SYMBOL = Symbol('registrationSignal');\nconst REGISTRATION_ABORT_SYMBOL = Symbol('registrationAbort');\n\ninterface PolyfillToolDescriptor extends Omit<ModelContextTool<WebMcpToolInput>, 'execute'> {\n execute(input: WebMcpToolInput): unknown;\n [REGISTERED_INPUT_SCHEMA_SYMBOL]?: string;\n [REGISTRATION_SIGNAL_SYMBOL]?: AbortSignal;\n [REGISTRATION_ABORT_SYMBOL]?: () => void;\n}\n\ninterface InstalledProperty {\n target: object;\n key: PropertyKey;\n previous: PropertyDescriptor | undefined;\n}\n\nconst installedProperties: InstalledProperty[] = [];\nlet installedContext: StrictWebMCPContext | null = null;\nlet cleanupDeclarativeForms: (() => void) | null = null;\n\nfunction currentOrigin(): string {\n return typeof globalThis.origin === 'string'\n ? globalThis.origin\n : (globalThis.location?.origin ?? '');\n}\n\nfunction installProperty(target: object, key: PropertyKey, descriptor: PropertyDescriptor): void {\n const previous = Object.getOwnPropertyDescriptor(target, key);\n try {\n Object.defineProperty(target, key, descriptor);\n } catch (error) {\n cleanupWebMCPPolyfill();\n throw error;\n }\n installedProperties.push({ target, key, previous });\n}\n\nexport interface WebMCPPolyfillInitOptions {\n /**\n * Controls installation of navigator.modelContextTesting when this polyfill provides modelContext.\n * The shim is testing-only and never replaces an existing implementation.\n *\n * Off by default so the polyfill stays spec-pure; modelContextTesting is a removed\n * Chromium preview API. `@mcp-b/global` deliberately opts in (its own default is true).\n * @default false\n */\n installTestingShim?: boolean;\n}\n\nclass StrictWebMCPContext extends EventTarget implements ModelContext {\n // ECMAScript #private, not TypeScript `private`: TypeScript's modifier is\n // erased at build time and leaves ordinary own enumerable properties, which\n // leak through Object.keys/for..in/spread and make JSON.stringify throw on\n // the ownerDocument cycle. Chrome's ModelContext instance has no own keys.\n readonly #tools = new Map<string, PolyfillToolDescriptor>();\n #testingShim: PolyfillTestingShim | null = null;\n #ontoolchangeHandler: ((this: ModelContext, ev: Event) => unknown) | null = null;\n readonly #ontoolchangeListener: EventListener = (event) => {\n this.#ontoolchangeHandler?.call(this, event);\n };\n readonly #domException: typeof DOMException;\n readonly #ownerDocument: Document | null;\n\n constructor(ownerDocument: Document | null) {\n super();\n this.#ownerDocument = ownerDocument;\n this.#domException = ownerDocument?.defaultView?.DOMException ?? DOMException;\n // The sole deliberate exception to \"Chrome's ModelContext has no own keys\":\n // this is the documented polyfill-vs-native check, read by\n // e2e/web-standards-showcase/src/api/detection.ts and the e2e specs. Keeping\n // it non-enumerable means the instance still spreads, enumerates, and\n // JSON.stringify()s exactly like Chrome's.\n Object.defineProperty(this, POLYFILL_MARKER_PROPERTY, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n get ontoolchange(): ((this: ModelContext, ev: Event) => unknown) | null {\n return this.#ontoolchangeHandler;\n }\n\n set ontoolchange(handler: ((this: ModelContext, ev: Event) => unknown) | null) {\n const listener = typeof handler === 'function' ? handler : null;\n if (listener === null) {\n this.#ontoolchangeHandler = null;\n super.removeEventListener('toolchange', this.#ontoolchangeListener);\n return;\n }\n\n if (this.#ontoolchangeHandler === null) {\n super.addEventListener('toolchange', this.#ontoolchangeListener);\n }\n this.#ontoolchangeHandler = listener;\n }\n\n // The `= {}` defaults on `options` here and in getTools/executeTool are\n // load-bearing: a defaulted parameter is excluded from Function.length, which\n // is what gives these three the arity WebIDL requires and idlharness checks\n // (1, 0, 2). The `options?.` reads stay too — a default only fills in\n // `undefined`, so an explicitly passed `null` still reaches the body.\n async registerTool<TArgs extends WebMcpToolInput>(\n tool: ModelContextTool<TArgs>,\n options: ModelContextRegisterToolOptions = {}\n ): Promise<void> {\n validateWebMcpAccess(this.#ownerDocument);\n const signal = options?.signal;\n const normalized = normalizeToolDescriptor(tool, this.#tools);\n signal?.throwIfAborted();\n validatePotentiallyTrustworthyOrigins(options?.exposedTo);\n signal?.throwIfAborted();\n if (options?.exposedTo?.length) {\n throw new this.#domException(\n 'Cross-document tool exposure requires native WebMCP',\n 'NotSupportedError'\n );\n }\n this.#tools.set(normalized.name, normalized);\n\n if (signal) {\n const abort = () => {\n if (this.#removeTool(normalized.name, normalized)) void this.#notifyToolsChanged();\n };\n normalized[REGISTRATION_SIGNAL_SYMBOL] = signal;\n normalized[REGISTRATION_ABORT_SYMBOL] = abort;\n signal.addEventListener('abort', abort, { once: true });\n }\n\n await this.#notifyToolsChanged();\n if (signal?.aborted) throw signal.reason;\n }\n\n async getTools(options: ModelContextGetToolOptions = {}): Promise<RegisteredTool[]> {\n validateWebMcpAccess(this.#ownerDocument);\n validatePotentiallyTrustworthyOrigins(options?.fromOrigins);\n if (options?.fromOrigins?.length) {\n throw new this.#domException(\n 'Cross-document tool discovery requires native WebMCP',\n 'NotSupportedError'\n );\n }\n const tools = [...this.#tools.values()]\n .map((tool) => {\n // A fresh object per call, like Blink parsing its serialized copy\n // (webmcp#241). A custom toJSON can serialize to non-object JSON; omit\n // those rather than emit a value consumers would mistake for a pre-154\n // serialized string.\n const serialized = tool[REGISTERED_INPUT_SCHEMA_SYMBOL];\n const parsed: unknown = serialized === undefined ? undefined : JSON.parse(serialized);\n return {\n name: tool.name,\n title: tool.title ?? '',\n description: tool.description,\n ...(isPlainObject(parsed) ? { inputSchema: parsed } : {}),\n origin: currentOrigin(),\n window: globalThis.window,\n ...(tool.annotations ? { annotations: toWebMcpAnnotations(tool.annotations) } : {}),\n };\n })\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n return tools;\n }\n\n async executeTool(\n tool: RegisteredTool,\n inputArgsJson: string,\n options: ChromeModelContextExecuteToolOptions = {}\n ): Promise<string | null> {\n validateWebMcpAccess(this.#ownerDocument);\n if (tool === null || typeof tool !== 'object') {\n throw new TypeError('RegisteredTool must be an object');\n }\n for (const required of ['name', 'description', 'window', 'origin'] as const) {\n if (!(required in tool)) {\n throw new TypeError(`RegisteredTool.${required} is required`);\n }\n }\n validateExecutableOrigin(tool.origin);\n if (tool.window !== globalThis.window || tool.origin !== currentOrigin()) {\n throw createUnknownError(`Tool not found: ${tool.name}`);\n }\n return this.#invokeToolByName(tool.name, inputArgsJson, options);\n }\n\n // Everything below is non-standard. `ModelContext.prototype` must expose only\n // the WebIDL members above, so the polyfill's own plumbing is either #private\n // (which gets no prototype slot at all) or static. The statics hang off this\n // module-private class binding, not off the exposed `ModelContext` interface\n // object, so no page script can reach them.\n\n /** @internal Used by initializeWebMCPPolyfill */\n static getTestingShim(context: StrictWebMCPContext): PolyfillTestingShim {\n context.#testingShim ??= new PolyfillTestingShim(context);\n return context.#testingShim;\n }\n\n /** @internal Used by PolyfillTestingShim */\n static getToolInfos(context: StrictWebMCPContext): ModelContextTestingToolInfo[] {\n return [...context.#tools.values()].map((tool) => ({\n name: tool.name,\n description: tool.description,\n // Pinned to the string: the removed modelContextTesting surface predates\n // webmcp#241.\n ...(tool[REGISTERED_INPUT_SCHEMA_SYMBOL] === undefined\n ? {}\n : { inputSchema: tool[REGISTERED_INPUT_SCHEMA_SYMBOL] }),\n }));\n }\n\n /** @internal Used by PolyfillTestingShim */\n static executeToolForTesting(\n context: StrictWebMCPContext,\n toolName: string,\n inputArgsJson: string,\n options?: ChromeModelContextExecuteToolOptions\n ): Promise<string | null> {\n validateWebMcpAccess(context.#ownerDocument);\n return context.#invokeToolByName(toolName, inputArgsJson, options);\n }\n\n /** @internal Used by cleanupWebMCPPolyfill */\n static dispose(context: StrictWebMCPContext): void {\n for (const name of context.#tools.keys()) context.#removeTool(name);\n context.ontoolchange = null;\n context.#testingShim?.dispose();\n }\n\n #removeTool(name: string, expected?: PolyfillToolDescriptor): boolean {\n const registered = this.#tools.get(name);\n if (!registered || (expected && registered !== expected)) return false;\n const signal = registered[REGISTRATION_SIGNAL_SYMBOL];\n const abort = registered[REGISTRATION_ABORT_SYMBOL];\n if (signal && abort) signal.removeEventListener('abort', abort);\n return this.#tools.delete(name);\n }\n\n async #invokeToolByName(\n toolName: string,\n inputArgsJson: string,\n options: ChromeModelContextExecuteToolOptions | undefined\n ): Promise<string | null> {\n options?.signal?.throwIfAborted();\n\n const tool = this.#tools.get(toolName);\n if (!tool) {\n throw createUnknownError(`Tool not found: ${toolName}`);\n }\n\n const args = parseChromeToolInput(inputArgsJson);\n options?.signal?.throwIfAborted();\n if (tool[REGISTRATION_SIGNAL_SYMBOL]?.aborted) throw createUnknownError('Tool unregistered');\n\n let rawResult: unknown;\n try {\n const registrationSignal = tool[REGISTRATION_SIGNAL_SYMBOL];\n const execution = withAbortSignal(\n Promise.resolve(tool.execute(args)),\n registrationSignal,\n () => createUnknownError('Tool unregistered')\n );\n rawResult = await withAbortSignal(execution, options?.signal);\n } catch (error) {\n if (options?.signal?.aborted && error === options.signal.reason) throw error;\n if (tool[REGISTRATION_SIGNAL_SYMBOL]?.aborted) throw error;\n throw createToolInvocationFailedError(error);\n }\n\n return serializeChromeToolResult(rawResult);\n }\n\n async #notifyToolsChanged(): Promise<void> {\n // ponytail: the platform does not expose its WebMCP task source; a timer\n // preserves task (rather than microtask) ordering for local registrations.\n await new Promise((resolve) => setTimeout(resolve, 0));\n this.dispatchEvent(new Event('toolchange'));\n this.#testingShim?.dispatchToolChange();\n }\n}\n\n// A function *expression*, not a method shorthand: WebIDL interface objects must\n// pass the IsConstructor check, and method shorthands have no [[Construct]].\nconst modelContextConstructor = function ModelContext(): never {\n throw new TypeError('Illegal constructor');\n};\n\n// Pinned explicitly: minifiers rename function expressions, and WebIDL requires\n// the interface object's `name` to be the interface identifier.\nObject.defineProperty(modelContextConstructor, 'name', { value: 'ModelContext' });\nObject.defineProperty(modelContextConstructor, 'prototype', {\n value: StrictWebMCPContext.prototype,\n writable: false,\n});\n// WebIDL: an interface object's [[Prototype]] is the inherited interface's\n// interface object. `interface ModelContext : EventTarget` therefore requires\n// Object.getPrototypeOf(ModelContext) === EventTarget, not Function.prototype.\nObject.setPrototypeOf(modelContextConstructor, EventTarget);\nObject.defineProperty(StrictWebMCPContext.prototype, 'constructor', {\n configurable: true,\n writable: true,\n value: modelContextConstructor,\n});\nObject.defineProperty(StrictWebMCPContext.prototype, Symbol.toStringTag, {\n configurable: true,\n value: 'ModelContext',\n});\n\n// WebIDL members are enumerable on the interface prototype object; ECMAScript\n// class members are not. `executeTool` is a Chrome extension, not spec IDL.\nfor (const member of ['registerTool', 'getTools', 'executeTool', 'ontoolchange'] as const) {\n const descriptor = Object.getOwnPropertyDescriptor(StrictWebMCPContext.prototype, member);\n if (descriptor) {\n Object.defineProperty(StrictWebMCPContext.prototype, member, {\n ...descriptor,\n enumerable: true,\n });\n }\n}\n\n/**\n * EventTarget-based testing shim matching the native Chromium ModelContextTesting surface.\n *\n * Fires `toolchange` events and supports the `ontoolchange` handler property.\n */\nclass PolyfillTestingShim extends EventTarget implements ModelContextTesting {\n private _ontoolchange: ((this: ModelContextTesting, ev: Event) => unknown) | null = null;\n private readonly ontoolchangeListener: EventListener = (event) => {\n this._ontoolchange?.call(this, event);\n };\n\n readonly #context: StrictWebMCPContext;\n\n constructor(context: StrictWebMCPContext) {\n super();\n this.#context = context;\n }\n\n listTools(): ModelContextTestingToolInfo[] {\n return StrictWebMCPContext.getToolInfos(this.#context);\n }\n\n executeTool(\n toolName: string,\n inputArgsJson: string,\n options?: ChromeModelContextExecuteToolOptions\n ): Promise<string | null> {\n return StrictWebMCPContext.executeToolForTesting(\n this.#context,\n toolName,\n inputArgsJson,\n options\n );\n }\n\n get ontoolchange(): ((this: ModelContextTesting, ev: Event) => unknown) | null {\n return this._ontoolchange;\n }\n\n set ontoolchange(handler: ((this: ModelContextTesting, ev: Event) => unknown) | null) {\n const listener = typeof handler === 'function' ? handler : null;\n if (listener === null) {\n this._ontoolchange = null;\n super.removeEventListener('toolchange', this.ontoolchangeListener);\n return;\n }\n\n if (this._ontoolchange === null) {\n super.addEventListener('toolchange', this.ontoolchangeListener);\n }\n this._ontoolchange = listener;\n }\n\n /** @internal Called by StrictWebMCPContext when tools change. */\n dispatchToolChange(): void {\n this.dispatchEvent(new Event('toolchange'));\n }\n\n dispose(): void {\n this.ontoolchange = null;\n }\n}\n\nfunction normalizeToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ModelContextTool<TArgs>,\n existing: Map<string, PolyfillToolDescriptor>\n): PolyfillToolDescriptor {\n if (!tool || typeof tool !== 'object') {\n throw new TypeError('registerTool(tool) requires a tool object');\n }\n\n const coerced = coerceWebMcpToolDescriptor(tool);\n\n validateWebMcpToolDescriptor(coerced);\n\n if (existing.has(coerced.name)) {\n throw createInvalidStateError(`Tool already registered: ${coerced.name}`);\n }\n\n const registeredInputSchema =\n coerced.inputSchema === undefined ? undefined : serializeInputSchema(coerced.inputSchema);\n\n return {\n name: coerced.name,\n ...(coerced.title === undefined ? {} : { title: coerced.title }),\n description: coerced.description,\n ...(coerced.inputSchema === undefined ? {} : { inputSchema: coerced.inputSchema }),\n ...(coerced.annotations === undefined ? {} : { annotations: coerced.annotations }),\n execute: (input) => Reflect.apply(coerced.execute, undefined, [input]),\n ...(registeredInputSchema !== undefined\n ? { [REGISTERED_INPUT_SCHEMA_SYMBOL]: registeredInputSchema }\n : {}),\n };\n}\n\nlet navigatorModelContextDeprecationWarned = false;\n\n/**\n * Backing store for the `Document.prototype.modelContext` getter.\n *\n * WebIDL puts `[SameObject] readonly attribute ModelContext modelContext` on\n * the Document *interface prototype object*, not on the document instance, and\n * Chrome matches that. One shared accessor therefore needs somewhere to keep\n * the per-document value, and keying it by document is what makes repeated\n * reads return the identical object, as `[SameObject]` requires.\n */\nconst documentModelContexts = new WeakMap<Document, ModelContext>();\n\n// A method shorthand, so it has no `prototype` and is not constructable, like a\n// native getter. `name` is pinned because Chrome reports \"get modelContext\" and\n// minifiers rename otherwise.\nconst { modelContext: documentModelContextGetter } = {\n modelContext(this: Document): ModelContext | undefined {\n // WebIDL brand check: the getter is only callable on a Document.\n // Document.prototype is not one, so reading it throws, as Chrome does.\n if (!(this instanceof Document)) {\n throw new TypeError('Illegal invocation');\n }\n return documentModelContexts.get(this);\n },\n};\nObject.defineProperty(documentModelContextGetter, 'name', { value: 'get modelContext' });\n\nfunction defineDocumentModelContext(target: Document, value: ModelContext): void {\n documentModelContexts.set(target, value);\n if (Object.hasOwn(Document.prototype, 'modelContext')) return;\n installProperty(Document.prototype, 'modelContext', {\n configurable: true,\n enumerable: true,\n get: documentModelContextGetter,\n });\n}\n\n// Per webmachinelearning/webmcp#173 / PR #184, the modelContext getter moved\n// from Navigator to Document. We install on document.modelContext as the\n// primary surface and expose navigator.modelContext as a deprecated alias that\n// returns the same instance and logs a one-time console warning on first\n// access. This mirrors the deprecation behavior shipped in Chrome 150.\nfunction defineDeprecatedNavigatorModelContext(target: Navigator, value: ModelContext): void {\n installProperty(target, 'modelContext', {\n configurable: true,\n enumerable: true,\n get() {\n if (!navigatorModelContextDeprecationWarned) {\n navigatorModelContextDeprecationWarned = true;\n console.warn(\n '[WebMCPPolyfill] navigator.modelContext is deprecated. The May 27, 2026 WebMCP draft moved the modelContext getter from Navigator to Document — use document.modelContext instead. See https://github.com/webmachinelearning/webmcp/pull/184.'\n );\n }\n return value;\n },\n });\n}\n\nfunction installSubmitEventPolyfill(): void {\n const prototype = SubmitEvent.prototype;\n if (!('agentInvoked' in prototype)) {\n installProperty(prototype, 'agentInvoked', {\n configurable: true,\n enumerable: true,\n get(this: SubmitEvent) {\n return isAgentInvokedSubmitEvent(this);\n },\n });\n }\n if (!('respondWith' in prototype)) {\n installProperty(prototype, 'respondWith', {\n configurable: true,\n enumerable: true,\n writable: true,\n value(this: SubmitEvent, agentResponse: Promise<unknown>) {\n respondWithAgentSubmitEvent(this, agentResponse);\n },\n });\n }\n}\n\nexport function initializeWebMCPPolyfill(options?: WebMCPPolyfillInitOptions): void {\n if (globalThis.isSecureContext === false) return;\n const nav = typeof navigator === 'undefined' ? null : navigator;\n const doc = typeof document === 'undefined' ? null : document;\n if (!nav || !doc || typeof window === 'undefined') return;\n\n if (doc.modelContext) return;\n\n const navigatorModelContext = nav.modelContext;\n\n if (installedProperties.length > 0) {\n cleanupWebMCPPolyfill();\n }\n\n if (navigatorModelContext) {\n defineDocumentModelContext(doc, navigatorModelContext);\n return;\n }\n\n const previousDescriptor = Object.getOwnPropertyDescriptor(window, 'ModelContext');\n if (previousDescriptor && !previousDescriptor.configurable) {\n if (!Object.is(Reflect.get(window, 'ModelContext'), modelContextConstructor)) {\n throw new TypeError('Cannot install ModelContext over a non-configurable global');\n }\n } else {\n installProperty(window, 'ModelContext', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: modelContextConstructor,\n });\n }\n\n const context = new StrictWebMCPContext(doc);\n installedContext = context;\n\n defineDocumentModelContext(doc, context);\n\n // Reset the one-shot warning flag so a fresh install warns again on first access.\n navigatorModelContextDeprecationWarned = false;\n defineDeprecatedNavigatorModelContext(nav, context);\n installSubmitEventPolyfill();\n\n if (options?.installTestingShim && !nav.modelContextTesting) {\n installProperty(nav, 'modelContextTesting', {\n configurable: true,\n enumerable: true,\n writable: false,\n value: StrictWebMCPContext.getTestingShim(context),\n });\n }\n\n cleanupDeclarativeForms = installDeclarativeForms(doc, context);\n}\n\nexport function cleanupWebMCPPolyfill(): void {\n cleanupDeclarativeForms?.();\n cleanupDeclarativeForms = null;\n if (installedContext) StrictWebMCPContext.dispose(installedContext);\n installedContext = null;\n for (const { target, key, previous } of [...installedProperties].reverse()) {\n if (previous) Object.defineProperty(target, key, previous);\n else Reflect.deleteProperty(target, key);\n }\n installedProperties.length = 0;\n navigatorModelContextDeprecationWarned = false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["#tools","#ontoolchangeListener","#ontoolchangeHandler","#domException","#ownerDocument","#removeTool","#notifyToolsChanged","#invokeToolByName","#testingShim","#context"],"sources":["../src/declarative-forms.ts","../src/index.ts"],"sourcesContent":["import type { InputSchema, ModelContext, WebMcpToolInput } from '@mcp-b/webmcp-types';\n\ntype DeclarativeControl = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\ntype Submitter = HTMLButtonElement | HTMLInputElement;\n\ninterface DeclarativeToolDefinition {\n name: string;\n title: string;\n description: string;\n inputSchema: InputSchema;\n autosubmit: boolean;\n}\n\ninterface DeclarativeRegistration {\n controller: AbortController;\n fingerprint: string;\n form: HTMLFormElement;\n cancelPending?: (reason: unknown) => void;\n}\n\ninterface ActiveSubmission {\n complete(event: SubmitEvent): void;\n direct(): void;\n respond(event: SubmitEvent): void;\n}\n\nconst agentInvokedEvents = new WeakSet<SubmitEvent>();\nconst agentResponses = new WeakMap<SubmitEvent, Promise<unknown>>();\nconst activeSubmissions = new WeakMap<HTMLFormElement, ActiveSubmission>();\n\nexport function isAgentInvokedSubmitEvent(event: SubmitEvent): boolean {\n return (\n event.isTrusted &&\n (agentInvokedEvents.has(event) ||\n (event.eventPhase !== Event.NONE &&\n event.target instanceof HTMLFormElement &&\n activeSubmissions.has(event.target)))\n );\n}\n\nexport function respondWithAgentSubmitEvent(\n event: SubmitEvent,\n agentResponse: Promise<unknown>\n): void {\n if (!isAgentInvokedSubmitEvent(event)) {\n throw new DOMException(\n 'respondWith() is only available during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (!event.defaultPrevented) {\n throw new DOMException(\n 'respondWith() requires preventDefault() during an agent-invoked submit event',\n 'InvalidStateError'\n );\n }\n if (event.eventPhase === Event.NONE) {\n throw new DOMException(\n 'respondWith() is only available while the submit event is being dispatched',\n 'InvalidStateError'\n );\n }\n agentInvokedEvents.add(event);\n const response = Promise.resolve(agentResponse);\n agentResponses.set(event, response);\n if (event.target instanceof HTMLFormElement) {\n activeSubmissions.get(event.target)?.respond(event);\n }\n}\n\nconst TEXT_INPUT_TYPES = new Set(['email', 'password', 'search', 'tel', 'text', 'url']);\nconst READONLY_INPUT_TYPES = new Set([\n ...TEXT_INPUT_TYPES,\n 'date',\n 'datetime-local',\n 'month',\n 'number',\n 'time',\n 'week',\n]);\n\nfunction isControl(element: Element): element is DeclarativeControl {\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n );\n}\n\nfunction getFormControls(form: HTMLFormElement): HTMLFormControlsCollection {\n return Reflect.get(HTMLFormElement.prototype, 'elements', form);\n}\n\nfunction getFormAttribute(form: HTMLFormElement, name: string): string | null {\n return Reflect.apply(Element.prototype.getAttribute, form, [name]);\n}\n\nfunction formHasAttribute(form: HTMLFormElement, name: string): boolean {\n return Reflect.apply(Element.prototype.hasAttribute, form, [name]);\n}\n\nfunction isFormConnected(form: HTMLFormElement): boolean {\n return Reflect.get(Node.prototype, 'isConnected', form);\n}\n\nfunction getOpenShadowRoot(element: Element): ShadowRoot | null {\n return Reflect.get(Element.prototype, 'shadowRoot', element);\n}\n\nfunction checkFormValidity(form: HTMLFormElement): boolean {\n return Reflect.apply(HTMLFormElement.prototype.checkValidity, form, []);\n}\n\nfunction requestFormSubmit(form: HTMLFormElement, submitter?: Submitter): void {\n Reflect.apply(HTMLFormElement.prototype.requestSubmit, form, submitter ? [submitter] : []);\n}\n\nfunction getControls(form: HTMLFormElement): DeclarativeControl[] {\n return [...getFormControls(form)].filter(\n (element): element is DeclarativeControl =>\n isControl(element) &&\n !element.matches(':disabled') &&\n !(\n 'readOnly' in element &&\n element.readOnly &&\n (element instanceof HTMLTextAreaElement || READONLY_INPUT_TYPES.has(element.type))\n )\n );\n}\n\nfunction controlGroups(form: HTMLFormElement): Map<string, DeclarativeControl[]> {\n const groups = new Map<string, DeclarativeControl[]>();\n for (const control of getControls(form)) {\n const name = control.name.trim();\n const controls = groups.get(name);\n if (controls) controls.push(control);\n else groups.set(name, [control]);\n }\n return groups;\n}\n\nfunction labelText(control: DeclarativeControl): string {\n return [...(control.labels ?? [])]\n .map((label) => {\n const copy = label.cloneNode(true);\n if (!(copy instanceof HTMLElement)) return '';\n copy\n .querySelectorAll('button, input, meter, output, progress, select, textarea')\n .forEach((element) => element.remove());\n return copy.textContent?.trim() ?? '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nfunction commonFieldset(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): HTMLFieldSetElement | undefined {\n for (\n let element = controls[0]?.parentElement;\n element && element !== form;\n element = element.parentElement\n ) {\n if (\n element instanceof HTMLFieldSetElement &&\n controls.every((control) => element.contains(control))\n ) {\n return element;\n }\n }\n return undefined;\n}\n\nfunction parameterDescription(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): string | undefined {\n if (controls.length === 1) {\n const control = controls[0];\n if (!control) return undefined;\n return (\n control.getAttribute('toolparamdescription') ||\n labelText(control) ||\n control.getAttribute('aria-description') ||\n undefined\n );\n }\n return commonFieldset(form, controls)?.getAttribute('toolparamdescription') || undefined;\n}\n\nfunction withDescription(\n schema: Record<string, unknown>,\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n extra?: string\n): Record<string, unknown> {\n const description = parameterDescription(form, controls);\n const combined = description && extra ? `${description} (${extra})` : description || extra;\n return combined ? { ...schema, description: combined } : schema;\n}\n\nfunction validNumberAttribute(input: HTMLInputElement, name: 'max' | 'min'): number | undefined {\n const raw = input.getAttribute(name);\n if (raw === null || raw.trim() === '') return undefined;\n const value = Number(raw);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction isStepBaseMultiple(stepBase: number, step: number): boolean {\n const quotient = stepBase / step;\n return Math.abs(quotient - Math.round(quotient)) < Number.EPSILON * 16;\n}\n\nfunction validPattern(input: HTMLInputElement): string | undefined {\n const pattern = input.getAttribute('pattern');\n if (pattern === null) return undefined;\n try {\n new RegExp(pattern, 'v');\n return pattern;\n } catch {\n return undefined;\n }\n}\n\nfunction numberSchema(input: HTMLInputElement, includePattern = true): Record<string, unknown> {\n const schema: Record<string, unknown> = { type: 'number' };\n const minimum = validNumberAttribute(input, 'min');\n const maximum = validNumberAttribute(input, 'max');\n if (minimum !== undefined) schema.minimum = minimum;\n if (maximum !== undefined) schema.maximum = maximum;\n\n const rawStep = input.getAttribute('step');\n if (rawStep !== 'any') {\n const parsedStep = rawStep === null || rawStep === '' ? 1 : Number(rawStep);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 1;\n const rawValue = Number(input.getAttribute('value'));\n const stepBase = minimum ?? (Number.isFinite(rawValue) ? rawValue : 0);\n if (isStepBaseMultiple(stepBase, step)) schema.multipleOf = step;\n }\n\n const pattern = includePattern ? validPattern(input) : undefined;\n if (pattern !== undefined) schema.pattern = pattern;\n return schema;\n}\n\nfunction temporalFormat(input: HTMLInputElement, datePrefix: string): string {\n const rawStep = input.getAttribute('step');\n const parsedStep = rawStep === null || rawStep === '' ? 60 : Number(rawStep);\n const step = Number.isFinite(parsedStep) && parsedStep > 0 ? parsedStep : 60;\n if (step < 1) return `${datePrefix}(:[0-5][0-9](\\\\.[0-9]{1,3})?)?$`;\n if (step < 60) return `${datePrefix}(:[0-5][0-9])?$`;\n return `${datePrefix}$`;\n}\n\nfunction optionSchemas(options: readonly HTMLOptionElement[]): {\n anyOf: Record<string, unknown>[];\n enum: string[];\n} {\n return {\n anyOf: options.map((option) => ({\n type: 'string',\n const: option.value,\n title: option.textContent ?? '',\n })),\n enum: options.map((option) => option.value),\n };\n}\n\nfunction groupChoiceSchemas(controls: readonly HTMLInputElement[]): {\n anyOf: Record<string, unknown>[];\n enum: string[];\n} {\n return {\n anyOf: controls.map((control) => {\n const title = labelText(control);\n return { type: 'string', const: control.value, ...(title ? { title } : {}) };\n }),\n enum: controls.map((control) => control.value),\n };\n}\n\nfunction parameterSchema(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[]\n): Record<string, unknown> | undefined {\n const first = controls[0];\n if (!first) return undefined;\n\n if (controls.length > 1) {\n if (!controls.every((control) => control instanceof HTMLInputElement)) return undefined;\n if (controls.every((control) => control.type === 'checkbox')) {\n return withDescription(\n {\n type: 'array',\n items: { type: 'string', ...groupChoiceSchemas(controls) },\n uniqueItems: true,\n },\n form,\n controls\n );\n }\n if (controls.every((control) => control.type === 'radio')) {\n return withDescription({ type: 'string', ...groupChoiceSchemas(controls) }, form, controls);\n }\n return undefined;\n }\n\n if (first instanceof HTMLTextAreaElement) {\n return withDescription({ type: 'string' }, form, controls);\n }\n\n if (first instanceof HTMLSelectElement) {\n const choices = optionSchemas([...first.options]);\n return withDescription(\n first.multiple\n ? { type: 'array', items: { type: 'string', ...choices }, uniqueItems: true }\n : { type: 'string', ...choices },\n form,\n controls\n );\n }\n\n if (TEXT_INPUT_TYPES.has(first.type)) {\n const schema: Record<string, unknown> = { type: 'string' };\n const pattern = validPattern(first);\n if (pattern !== undefined) schema.pattern = pattern;\n return withDescription(schema, form, controls);\n }\n if (first.type === 'hidden') {\n return first.getAttribute('toolparamdescription')\n ? withDescription({ type: 'string' }, form, controls)\n : undefined;\n }\n if (first.type === 'number') {\n return withDescription(numberSchema(first), form, controls);\n }\n if (first.type === 'range') {\n const schema = numberSchema(first, false);\n schema.minimum ??= 0;\n schema.maximum ??= 100;\n return withDescription(schema, form, controls);\n }\n if (first.type === 'checkbox') {\n return withDescription({ type: 'boolean' }, form, controls);\n }\n if (first.type === 'radio') {\n return withDescription({ type: 'string', ...groupChoiceSchemas([first]) }, form, controls);\n }\n if (first.type === 'date') {\n return withDescription(\n { type: 'string', format: 'date' },\n form,\n controls,\n \"Dates MUST be provided in 'YYYY-MM-DD' format.\"\n );\n }\n if (first.type === 'month') {\n return withDescription(\n { type: 'string', format: '^[0-9]{4}-(0[1-9]|1[0-2])$' },\n form,\n controls\n );\n }\n if (first.type === 'week') {\n return withDescription(\n { type: 'string', format: '^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-3])$' },\n form,\n controls\n );\n }\n if (first.type === 'time') {\n return withDescription(\n {\n type: 'string',\n format: temporalFormat(first, '^([01][0-9]|2[0-3]):[0-5][0-9]'),\n },\n form,\n controls\n );\n }\n if (first.type === 'datetime-local') {\n return withDescription(\n {\n type: 'string',\n format: temporalFormat(\n first,\n '^[0-9]{4}-(0[1-9]|1[0-2])-[0-9]{2}T([01][0-9]|2[0-3]):[0-5][0-9]'\n ),\n },\n form,\n controls\n );\n }\n if (first.type === 'color') {\n return withDescription({ type: 'string', format: '^#[0-9a-zA-Z]{6}$' }, form, controls);\n }\n return undefined;\n}\n\nfunction synthesizeSchema(form: HTMLFormElement): InputSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [name, controls] of controlGroups(form)) {\n if (!name) continue;\n const schema = parameterSchema(form, controls);\n if (!schema) continue;\n Object.defineProperty(properties, name, {\n configurable: true,\n enumerable: true,\n value: schema,\n writable: true,\n });\n if (controls.some((control) => control.required)) required.push(name);\n }\n return { type: 'object', properties, required };\n}\n\nfunction toolDefinition(form: HTMLFormElement): DeclarativeToolDefinition {\n return {\n name: getFormAttribute(form, 'toolname') ?? '',\n title: getFormAttribute(form, 'tooltitle') ?? '',\n description: getFormAttribute(form, 'tooldescription') ?? '',\n inputSchema: synthesizeSchema(form),\n autosubmit: formHasAttribute(form, 'toolautosubmit'),\n };\n}\n\nfunction toFormString(value: unknown): string | undefined {\n if (typeof value === 'string' || typeof value === 'boolean') return String(value);\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction toFormBoolean(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number' && Number.isInteger(value)) return value !== 0;\n if (typeof value !== 'string') return undefined;\n if (value === '1' || value.toLowerCase() === 'true') return true;\n if (value === '0' || value.toLowerCase() === 'false') return false;\n return undefined;\n}\n\nfunction hasUniqueAllowedValues(value: unknown, allowed: ReadonlySet<string>): value is unknown[] {\n if (!Array.isArray(value)) return false;\n const remaining = new Set(allowed);\n for (const item of value) {\n const string = toFormString(item);\n if (string === undefined || !remaining.delete(string)) return false;\n }\n return true;\n}\n\nfunction inputAcceptsValue(input: HTMLInputElement, value: string): boolean {\n if (value === '') return input.type !== 'number' && input.type !== 'range';\n const probe = input.ownerDocument.createElement('input');\n probe.type = input.type;\n probe.value = value;\n return probe.value !== '';\n}\n\nfunction validatesParameter(\n form: HTMLFormElement,\n controls: readonly DeclarativeControl[],\n value: unknown\n): boolean {\n const first = controls[0];\n if (!first || !parameterSchema(form, controls)) return false;\n\n if (controls.length > 1) {\n if (!controls.every((control) => control instanceof HTMLInputElement)) return false;\n if (controls.every((control) => control.type === 'checkbox')) {\n return hasUniqueAllowedValues(value, new Set(controls.map((control) => control.value)));\n }\n if (controls.every((control) => control.type === 'radio')) {\n const string = toFormString(value);\n return string !== undefined && controls.some((control) => control.value === string);\n }\n return false;\n }\n\n if (first instanceof HTMLSelectElement) {\n const allowed = new Set([...first.options].map((option) => option.value));\n if (first.multiple) return hasUniqueAllowedValues(value, allowed);\n const string = toFormString(value);\n return string !== undefined && allowed.has(string);\n }\n if (first instanceof HTMLTextAreaElement) return toFormString(value) !== undefined;\n if (first.type === 'checkbox') return toFormBoolean(value) !== undefined;\n if (first.type === 'radio') {\n const string = toFormString(value);\n return string !== undefined && first.value === string;\n }\n const string = toFormString(value);\n return string !== undefined && inputAcceptsValue(first, string);\n}\n\nfunction dispatchInputAndChange(control: DeclarativeControl): void {\n control.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n control.dispatchEvent(new Event('change', { bubbles: true }));\n}\n\nfunction setNativeValue(control: HTMLInputElement | HTMLTextAreaElement, value: string): void {\n const prototype =\n control instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n Object.getOwnPropertyDescriptor(prototype, 'value')?.set?.call(control, value);\n}\n\nfunction setNativeChecked(control: HTMLInputElement, checked: boolean): void {\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked')?.set?.call(\n control,\n checked\n );\n}\n\nfunction fillParameter(controls: readonly DeclarativeControl[], value: unknown): void {\n const first = controls[0];\n if (!first) return;\n\n if (controls.length > 1 && controls.every((control) => control instanceof HTMLInputElement)) {\n if (controls.every((control) => control.type === 'checkbox') && Array.isArray(value)) {\n const checked = new Set(value.map(toFormString));\n for (const control of controls) {\n const next = checked.has(control.value);\n if (control.checked === next) continue;\n setNativeChecked(control, next);\n dispatchInputAndChange(control);\n }\n return;\n }\n const selected = toFormString(value);\n const control = controls.find((candidate) => candidate.value === selected);\n if (control && !control.checked) {\n setNativeChecked(control, true);\n dispatchInputAndChange(control);\n }\n return;\n }\n\n if (first instanceof HTMLSelectElement) {\n if (first.multiple && Array.isArray(value)) {\n const selected = new Set(value.map(toFormString));\n let changed = false;\n for (const option of first.options) {\n const next = selected.has(option.value);\n if (option.selected === next) continue;\n option.selected = next;\n changed = true;\n }\n if (changed) dispatchInputAndChange(first);\n return;\n }\n const next = toFormString(value);\n if (next !== undefined && first.value !== next) {\n first.value = next;\n dispatchInputAndChange(first);\n }\n return;\n }\n\n if (first instanceof HTMLInputElement && first.type === 'checkbox') {\n const next = toFormBoolean(value);\n if (next !== undefined && first.checked !== next) {\n setNativeChecked(first, next);\n dispatchInputAndChange(first);\n }\n return;\n }\n\n if (first instanceof HTMLInputElement && first.type === 'radio') {\n const next = toFormString(value);\n if (next === first.value && !first.checked) {\n setNativeChecked(first, true);\n dispatchInputAndChange(first);\n }\n return;\n }\n\n const next = toFormString(value);\n if (next !== undefined && first.value !== next) {\n setNativeValue(first, next);\n dispatchInputAndChange(first);\n }\n}\n\nfunction fillForm(form: HTMLFormElement, input: WebMcpToolInput): void {\n if (Array.isArray(input)) throw new TypeError('Declarative tool input must be an object');\n const groups = controlGroups(form);\n for (const [name, value] of Object.entries(input)) {\n const controls = groups.get(name);\n if (!controls || !validatesParameter(form, controls, value)) {\n throw new TypeError(`Invalid value for declarative form parameter \"${name}\"`);\n }\n }\n for (const [name, value] of Object.entries(input)) fillParameter(groups.get(name) ?? [], value);\n}\n\nfunction findSubmitter(form: HTMLFormElement): Submitter | undefined {\n return [...getFormControls(form)].find(\n (element): element is Submitter =>\n !element.matches(':disabled') &&\n ((element instanceof HTMLButtonElement && element.type === 'submit') ||\n (element instanceof HTMLInputElement && ['image', 'submit'].includes(element.type)))\n );\n}\n\nfunction validationError(form: HTMLFormElement): DOMException {\n const failures = [...getFormControls(form)]\n .filter(\n (element): element is DeclarativeControl =>\n isControl(element) && element.willValidate && !element.validity.valid\n )\n .map((control) => `${control.name.trim() || '{unknown}'}: ${control.validationMessage}`)\n .join('. ');\n return new DOMException(`Form validation failed: ${failures}`, 'UnknownError');\n}\n\nfunction toolActivatedEvent(toolName: string): Event {\n const event = new Event('toolactivated');\n Object.defineProperty(event, 'toolName', { enumerable: true, value: toolName });\n return event;\n}\n\nfunction waitForSubmission(\n registration: DeclarativeRegistration,\n toolName: string,\n autosubmit: boolean,\n submitter: Submitter | undefined\n): Promise<unknown> {\n const { form } = registration;\n registration.cancelPending?.(new DOMException('Tool execution cancelled', 'UnknownError'));\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n Reflect.apply(EventTarget.prototype.removeEventListener, form, ['invalid', onInvalid, true]);\n activeSubmissions.delete(form);\n if (registration.cancelPending === cancel) delete registration.cancelPending;\n };\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const cancel = (reason: unknown) => finish(() => reject(reason));\n const settleResponse = (response: Promise<unknown>) => {\n response.then(\n (value) => finish(() => resolve(value)),\n (error: unknown) => finish(() => reject(error))\n );\n };\n const onInvalid = (event: Event) => {\n if (!event.isTrusted) return;\n queueMicrotask(() => {\n if (!checkFormValidity(form)) cancel(validationError(form));\n });\n };\n\n activeSubmissions.set(form, {\n complete(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n else if (event.defaultPrevented) {\n cancel(new DOMException('preventDefault() requires respondWith()', 'UnknownError'));\n } else finish(() => resolve(undefined));\n });\n },\n direct() {\n finish(() => resolve(undefined));\n },\n respond(event) {\n queueMicrotask(() => {\n const response = agentResponses.get(event);\n if (response) settleResponse(response);\n });\n },\n });\n registration.cancelPending = cancel;\n Reflect.apply(EventTarget.prototype.addEventListener, form, ['invalid', onInvalid, true]);\n\n if (!autosubmit) {\n submitter?.focus();\n window.dispatchEvent(toolActivatedEvent(toolName));\n return;\n }\n try {\n requestFormSubmit(form, submitter);\n window.dispatchEvent(toolActivatedEvent(toolName));\n } catch (error) {\n cancel(error);\n }\n });\n}\n\n/** Installs the DOM-backed half of the draft Declarative WebMCP API. */\nexport function installDeclarativeForms(document: Document, context: ModelContext): () => void {\n let active = true;\n const registrations = new Map<HTMLFormElement, DeclarativeRegistration>();\n const blockedDefinitions = new Map<HTMLFormElement, string>();\n const observers = new Map<Document | ShadowRoot, MutationObserver>();\n const onSubmit = (event: Event) => {\n if (\n !(event instanceof SubmitEvent) ||\n !event.isTrusted ||\n !(event.target instanceof HTMLFormElement)\n ) {\n return;\n }\n // Only a form with a running tool call submits on the agent's behalf; marking\n // every trusted submit would report agentInvoked for ordinary user submissions.\n const submission = activeSubmissions.get(event.target);\n if (!submission) return;\n agentInvokedEvents.add(event);\n submission.complete(event);\n };\n\n const onReset = (event: Event) => {\n if (!event.isTrusted || !(event.target instanceof HTMLFormElement)) return;\n const form = event.target;\n queueMicrotask(() => {\n if (event.defaultPrevented) return;\n registrations\n .get(form)\n ?.cancelPending?.(\n new DOMException('Tool execution cancelled by form reset', 'UnknownError')\n );\n });\n };\n\n function stopObservingRoot(root: Document | ShadowRoot): void {\n observers.get(root)?.disconnect();\n observers.delete(root);\n root.removeEventListener('reset', onReset, true);\n root.removeEventListener('submit', onSubmit, true);\n }\n\n function observeRoot(root: Document | ShadowRoot): void {\n if (observers.has(root)) return;\n const observer = new MutationObserver(sync);\n observers.set(root, observer);\n observer.observe(root, {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n });\n root.addEventListener('reset', onReset, true);\n // ponytail: submit is composed:false, so per-root capture sees every submission; hook\n // window capture too if a page listener ever stops propagation before this one.\n root.addEventListener('submit', onSubmit, true);\n }\n\n function sync(): void {\n observeRoot(document);\n for (const root of observers.keys()) {\n if (root instanceof ShadowRoot && !Reflect.get(Node.prototype, 'isConnected', root.host)) {\n stopObservingRoot(root);\n }\n }\n\n const candidates = new Set<HTMLFormElement>();\n const selected = new Map<\n HTMLFormElement,\n { definition: DeclarativeToolDefinition; fingerprint: string }\n >();\n const selectedByName = new Map<string, HTMLFormElement>();\n for (const root of observers.keys()) {\n for (const element of root.querySelectorAll('*')) {\n const shadowRoot = getOpenShadowRoot(element);\n if (shadowRoot) observeRoot(shadowRoot);\n\n if (\n !(element instanceof HTMLFormElement) ||\n !formHasAttribute(element, 'toolname') ||\n !formHasAttribute(element, 'tooldescription') ||\n !isFormConnected(element)\n ) {\n continue;\n }\n const form = element;\n candidates.add(form);\n const definition = toolDefinition(form);\n const fingerprint = JSON.stringify(definition);\n const blockedFingerprint = blockedDefinitions.get(form);\n if (blockedFingerprint === fingerprint) continue;\n const retryingChangedDefinition = blockedFingerprint !== undefined;\n blockedDefinitions.delete(form);\n const existingForm = selectedByName.get(definition.name);\n if (existingForm && !retryingChangedDefinition) {\n blockedDefinitions.set(form, fingerprint);\n continue;\n }\n if (existingForm) {\n const existingSelection = selected.get(existingForm);\n if (existingSelection) {\n blockedDefinitions.set(existingForm, existingSelection.fingerprint);\n selected.delete(existingForm);\n }\n }\n selectedByName.set(definition.name, form);\n selected.set(form, { definition, fingerprint });\n }\n }\n for (const form of blockedDefinitions.keys()) {\n if (!candidates.has(form)) blockedDefinitions.delete(form);\n }\n\n for (const [form, registration] of registrations) {\n const fingerprint = selected.get(form)?.fingerprint;\n if (fingerprint !== registration.fingerprint) {\n registration.cancelPending?.(\n new DOMException('Tool execution cancelled because its form changed', 'UnknownError')\n );\n registration.controller.abort();\n registrations.delete(form);\n }\n }\n\n for (const [form, { definition, fingerprint }] of selected) {\n if (registrations.has(form)) continue;\n const controller = new AbortController();\n const registration: DeclarativeRegistration = {\n controller,\n fingerprint,\n form,\n };\n registrations.set(form, registration);\n void context\n .registerTool(\n {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n execute(input: WebMcpToolInput) {\n const submitter = findSubmitter(form);\n if (!definition.autosubmit && !submitter) {\n throw new DOMException(\n 'A declarative form without toolautosubmit requires a submit button',\n 'UnknownError'\n );\n }\n fillForm(form, input);\n return waitForSubmission(\n registration,\n definition.name,\n definition.autosubmit,\n submitter\n );\n },\n },\n { signal: controller.signal }\n )\n .catch((error: unknown) => {\n controller.abort();\n // Invalid toolname/tooldescription attributes reject here. Without this the\n // form silently never becomes a tool, with no diagnostic in any channel.\n // Aborts are ordinary teardown, not a failure worth reporting.\n if ((error as { name?: unknown } | null)?.name === 'AbortError') return;\n console.error(\n `[webmcp] declarative form tool \"${definition.name}\" was not registered:`,\n error\n );\n });\n }\n }\n\n let restoreAttachShadow = () => {};\n const elementPrototype = document.defaultView?.Element.prototype;\n const attachShadowDescriptor = elementPrototype\n ? Object.getOwnPropertyDescriptor(elementPrototype, 'attachShadow')\n : undefined;\n if (elementPrototype && attachShadowDescriptor?.configurable) {\n const nativeAttachShadow = elementPrototype.attachShadow;\n const attachShadow = function (this: Element, init: ShadowRootInit): ShadowRoot {\n const root = nativeAttachShadow.call(this, init);\n if (\n active &&\n root.mode === 'open' &&\n Reflect.get(Node.prototype, 'ownerDocument', this) === document &&\n Reflect.get(Node.prototype, 'isConnected', this)\n ) {\n observeRoot(root);\n }\n return root;\n };\n Object.defineProperty(elementPrototype, 'attachShadow', {\n ...attachShadowDescriptor,\n value: attachShadow,\n });\n restoreAttachShadow = () => {\n if (elementPrototype.attachShadow === attachShadow) {\n Object.defineProperty(elementPrototype, 'attachShadow', attachShadowDescriptor);\n }\n };\n }\n\n let restoreFormSubmit = () => {};\n const formPrototype = document.defaultView?.HTMLFormElement.prototype;\n const submitDescriptor = formPrototype\n ? Object.getOwnPropertyDescriptor(formPrototype, 'submit')\n : undefined;\n if (formPrototype && submitDescriptor?.configurable) {\n const nativeSubmit = formPrototype.submit;\n const submit = function (this: HTMLFormElement): void {\n nativeSubmit.call(this);\n if (active) activeSubmissions.get(this)?.direct();\n };\n Object.defineProperty(formPrototype, 'submit', { ...submitDescriptor, value: submit });\n restoreFormSubmit = () => {\n if (formPrototype.submit === submit) {\n Object.defineProperty(formPrototype, 'submit', submitDescriptor);\n }\n };\n }\n\n // ponytail: a whole-tree rescan keeps DOM ownership obvious; index forms if this\n // becomes measurable on pages with thousands of annotated controls.\n sync();\n\n return () => {\n active = false;\n restoreFormSubmit();\n restoreAttachShadow();\n for (const root of observers.keys()) stopObservingRoot(root);\n blockedDefinitions.clear();\n for (const registration of registrations.values()) {\n registration.cancelPending?.(new DOMException('Tool execution cancelled', 'UnknownError'));\n registration.controller.abort();\n }\n registrations.clear();\n };\n}\n","import type {\n ChromeModelContextExecuteToolOptions,\n ModelContext,\n ModelContextGetToolOptions,\n ModelContextRegisterToolOptions,\n ModelContextTesting,\n ModelContextTestingToolInfo,\n ModelContextTool,\n RegisteredTool,\n WebMcpToolInput,\n} from '@mcp-b/webmcp-types';\nimport {\n coerceWebMcpToolDescriptor,\n createInvalidStateError,\n createToolInvocationFailedError,\n createUnknownError,\n isPlainObject,\n parseChromeToolInput,\n serializeChromeToolResult,\n serializeInputSchema,\n toWebMcpAnnotations,\n validateExecutableOrigin,\n validatePotentiallyTrustworthyOrigins,\n validateWebMcpAccess,\n validateWebMcpToolDescriptor,\n withAbortSignal,\n} from './schema.js';\nimport {\n installDeclarativeForms,\n isAgentInvokedSubmitEvent,\n respondWithAgentSubmitEvent,\n} from './declarative-forms.js';\n\nconst POLYFILL_MARKER_PROPERTY = '__isWebMCPPolyfill' as const;\nconst REGISTERED_INPUT_SCHEMA_SYMBOL = Symbol('registeredInputSchema');\nconst REGISTRATION_SIGNAL_SYMBOL = Symbol('registrationSignal');\nconst REGISTRATION_ABORT_SYMBOL = Symbol('registrationAbort');\n\ninterface PolyfillToolDescriptor extends Omit<ModelContextTool<WebMcpToolInput>, 'execute'> {\n execute(input: WebMcpToolInput): unknown;\n [REGISTERED_INPUT_SCHEMA_SYMBOL]?: string;\n [REGISTRATION_SIGNAL_SYMBOL]?: AbortSignal;\n [REGISTRATION_ABORT_SYMBOL]?: () => void;\n}\n\ninterface InstalledProperty {\n target: object;\n key: PropertyKey;\n previous: PropertyDescriptor | undefined;\n}\n\nconst installedProperties: InstalledProperty[] = [];\nlet installedContext: StrictWebMCPContext | null = null;\nlet cleanupDeclarativeForms: (() => void) | null = null;\n\nfunction currentOrigin(): string {\n return typeof globalThis.origin === 'string'\n ? globalThis.origin\n : (globalThis.location?.origin ?? '');\n}\n\nfunction installProperty(target: object, key: PropertyKey, descriptor: PropertyDescriptor): void {\n const previous = Object.getOwnPropertyDescriptor(target, key);\n try {\n Object.defineProperty(target, key, descriptor);\n } catch (error) {\n cleanupWebMCPPolyfill();\n throw error;\n }\n installedProperties.push({ target, key, previous });\n}\n\nexport interface WebMCPPolyfillInitOptions {\n /**\n * Controls installation of navigator.modelContextTesting when this polyfill provides modelContext.\n * The shim is testing-only and never replaces an existing implementation.\n *\n * Off by default so the polyfill stays spec-pure; modelContextTesting is a removed\n * Chromium preview API. `@mcp-b/global` deliberately opts in (its own default is true).\n * @default false\n */\n installTestingShim?: boolean;\n}\n\nclass StrictWebMCPContext extends EventTarget implements ModelContext {\n // ECMAScript #private, not TypeScript `private`: TypeScript's modifier is\n // erased at build time and leaves ordinary own enumerable properties, which\n // leak through Object.keys/for..in/spread and make JSON.stringify throw on\n // the ownerDocument cycle. Chrome's ModelContext instance has no own keys.\n readonly #tools = new Map<string, PolyfillToolDescriptor>();\n #testingShim: PolyfillTestingShim | null = null;\n #ontoolchangeHandler: ((this: ModelContext, ev: Event) => unknown) | null = null;\n readonly #ontoolchangeListener: EventListener = (event) => {\n this.#ontoolchangeHandler?.call(this, event);\n };\n readonly #domException: typeof DOMException;\n readonly #ownerDocument: Document | null;\n\n constructor(ownerDocument: Document | null) {\n super();\n this.#ownerDocument = ownerDocument;\n this.#domException = ownerDocument?.defaultView?.DOMException ?? DOMException;\n // The sole deliberate exception to \"Chrome's ModelContext has no own keys\":\n // this is the documented polyfill-vs-native check, read by\n // e2e/web-standards-showcase/src/api/detection.ts and the e2e specs. Keeping\n // it non-enumerable means the instance still spreads, enumerates, and\n // JSON.stringify()s exactly like Chrome's.\n Object.defineProperty(this, POLYFILL_MARKER_PROPERTY, {\n value: true,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n }\n\n get ontoolchange(): ((this: ModelContext, ev: Event) => unknown) | null {\n return this.#ontoolchangeHandler;\n }\n\n set ontoolchange(handler: ((this: ModelContext, ev: Event) => unknown) | null) {\n const listener = typeof handler === 'function' ? handler : null;\n if (listener === null) {\n this.#ontoolchangeHandler = null;\n super.removeEventListener('toolchange', this.#ontoolchangeListener);\n return;\n }\n\n if (this.#ontoolchangeHandler === null) {\n super.addEventListener('toolchange', this.#ontoolchangeListener);\n }\n this.#ontoolchangeHandler = listener;\n }\n\n // The `= {}` defaults on `options` here and in getTools/executeTool are\n // load-bearing: a defaulted parameter is excluded from Function.length, which\n // is what gives these three the arity WebIDL requires and idlharness checks\n // (1, 0, 2). The `options?.` reads stay too — a default only fills in\n // `undefined`, so an explicitly passed `null` still reaches the body.\n async registerTool<TArgs extends WebMcpToolInput>(\n tool: ModelContextTool<TArgs>,\n options: ModelContextRegisterToolOptions = {}\n ): Promise<void> {\n validateWebMcpAccess(this.#ownerDocument);\n const signal = options?.signal;\n const normalized = normalizeToolDescriptor(tool, this.#tools);\n signal?.throwIfAborted();\n validatePotentiallyTrustworthyOrigins(options?.exposedTo);\n signal?.throwIfAborted();\n if (options?.exposedTo?.length) {\n throw new this.#domException(\n 'Cross-document tool exposure requires native WebMCP',\n 'NotSupportedError'\n );\n }\n this.#tools.set(normalized.name, normalized);\n\n if (signal) {\n const abort = () => {\n if (this.#removeTool(normalized.name, normalized)) void this.#notifyToolsChanged();\n };\n normalized[REGISTRATION_SIGNAL_SYMBOL] = signal;\n normalized[REGISTRATION_ABORT_SYMBOL] = abort;\n signal.addEventListener('abort', abort, { once: true });\n }\n\n await this.#notifyToolsChanged();\n if (signal?.aborted) throw signal.reason;\n }\n\n async getTools(options: ModelContextGetToolOptions = {}): Promise<RegisteredTool[]> {\n validateWebMcpAccess(this.#ownerDocument);\n validatePotentiallyTrustworthyOrigins(options?.fromOrigins);\n if (options?.fromOrigins?.length) {\n throw new this.#domException(\n 'Cross-document tool discovery requires native WebMCP',\n 'NotSupportedError'\n );\n }\n const tools = [...this.#tools.values()]\n .map((tool) => {\n // A fresh object per call, like Blink parsing its serialized copy\n // (webmcp#241). A custom toJSON can serialize to non-object JSON; omit\n // those rather than emit a value consumers would mistake for a pre-154\n // serialized string.\n const serialized = tool[REGISTERED_INPUT_SCHEMA_SYMBOL];\n const parsed: unknown = serialized === undefined ? undefined : JSON.parse(serialized);\n return {\n name: tool.name,\n title: tool.title ?? '',\n description: tool.description,\n ...(isPlainObject(parsed) ? { inputSchema: parsed } : {}),\n origin: currentOrigin(),\n window: globalThis.window,\n ...(tool.annotations ? { annotations: toWebMcpAnnotations(tool.annotations) } : {}),\n };\n })\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n return tools;\n }\n\n async executeTool(\n tool: RegisteredTool,\n inputArgsJson: string,\n options: ChromeModelContextExecuteToolOptions = {}\n ): Promise<string | null> {\n validateWebMcpAccess(this.#ownerDocument);\n if (tool === null || typeof tool !== 'object') {\n throw new TypeError('RegisteredTool must be an object');\n }\n for (const required of ['name', 'description', 'window', 'origin'] as const) {\n if (!(required in tool)) {\n throw new TypeError(`RegisteredTool.${required} is required`);\n }\n }\n validateExecutableOrigin(tool.origin);\n if (tool.window !== globalThis.window || tool.origin !== currentOrigin()) {\n throw createUnknownError(`Tool not found: ${tool.name}`);\n }\n return this.#invokeToolByName(tool.name, inputArgsJson, options);\n }\n\n // Everything below is non-standard. `ModelContext.prototype` must expose only\n // the WebIDL members above, so the polyfill's own plumbing is either #private\n // (which gets no prototype slot at all) or static. The statics hang off this\n // module-private class binding, not off the exposed `ModelContext` interface\n // object, so no page script can reach them.\n\n /** @internal Used by initializeWebMCPPolyfill */\n static getTestingShim(context: StrictWebMCPContext): PolyfillTestingShim {\n context.#testingShim ??= new PolyfillTestingShim(context);\n return context.#testingShim;\n }\n\n /** @internal Used by PolyfillTestingShim */\n static getToolInfos(context: StrictWebMCPContext): ModelContextTestingToolInfo[] {\n return [...context.#tools.values()].map((tool) => ({\n name: tool.name,\n description: tool.description,\n // Pinned to the string: the removed modelContextTesting surface predates\n // webmcp#241.\n ...(tool[REGISTERED_INPUT_SCHEMA_SYMBOL] === undefined\n ? {}\n : { inputSchema: tool[REGISTERED_INPUT_SCHEMA_SYMBOL] }),\n }));\n }\n\n /** @internal Used by PolyfillTestingShim */\n static executeToolForTesting(\n context: StrictWebMCPContext,\n toolName: string,\n inputArgsJson: string,\n options?: ChromeModelContextExecuteToolOptions\n ): Promise<string | null> {\n validateWebMcpAccess(context.#ownerDocument);\n return context.#invokeToolByName(toolName, inputArgsJson, options);\n }\n\n /** @internal Used by cleanupWebMCPPolyfill */\n static dispose(context: StrictWebMCPContext): void {\n for (const name of context.#tools.keys()) context.#removeTool(name);\n context.ontoolchange = null;\n context.#testingShim?.dispose();\n }\n\n #removeTool(name: string, expected?: PolyfillToolDescriptor): boolean {\n const registered = this.#tools.get(name);\n if (!registered || (expected && registered !== expected)) return false;\n const signal = registered[REGISTRATION_SIGNAL_SYMBOL];\n const abort = registered[REGISTRATION_ABORT_SYMBOL];\n if (signal && abort) signal.removeEventListener('abort', abort);\n return this.#tools.delete(name);\n }\n\n async #invokeToolByName(\n toolName: string,\n inputArgsJson: string,\n options: ChromeModelContextExecuteToolOptions | undefined\n ): Promise<string | null> {\n options?.signal?.throwIfAborted();\n\n const tool = this.#tools.get(toolName);\n if (!tool) {\n throw createUnknownError(`Tool not found: ${toolName}`);\n }\n\n const args = parseChromeToolInput(inputArgsJson);\n options?.signal?.throwIfAborted();\n if (tool[REGISTRATION_SIGNAL_SYMBOL]?.aborted) throw createUnknownError('Tool unregistered');\n\n let rawResult: unknown;\n try {\n const registrationSignal = tool[REGISTRATION_SIGNAL_SYMBOL];\n const execution = withAbortSignal(\n Promise.resolve(tool.execute(args)),\n registrationSignal,\n () => createUnknownError('Tool unregistered')\n );\n rawResult = await withAbortSignal(execution, options?.signal);\n } catch (error) {\n if (options?.signal?.aborted && error === options.signal.reason) throw error;\n if (tool[REGISTRATION_SIGNAL_SYMBOL]?.aborted) throw error;\n throw createToolInvocationFailedError(error);\n }\n\n return serializeChromeToolResult(rawResult);\n }\n\n async #notifyToolsChanged(): Promise<void> {\n // ponytail: the platform does not expose its WebMCP task source; a timer\n // preserves task (rather than microtask) ordering for local registrations.\n await new Promise((resolve) => setTimeout(resolve, 0));\n this.dispatchEvent(new Event('toolchange'));\n this.#testingShim?.dispatchToolChange();\n }\n}\n\n// A function *expression*, not a method shorthand: WebIDL interface objects must\n// pass the IsConstructor check, and method shorthands have no [[Construct]].\nconst modelContextConstructor = function ModelContext(): never {\n throw new TypeError('Illegal constructor');\n};\n\n// Pinned explicitly: minifiers rename function expressions, and WebIDL requires\n// the interface object's `name` to be the interface identifier.\nObject.defineProperty(modelContextConstructor, 'name', { value: 'ModelContext' });\nObject.defineProperty(modelContextConstructor, 'prototype', {\n value: StrictWebMCPContext.prototype,\n writable: false,\n});\n// WebIDL: an interface object's [[Prototype]] is the inherited interface's\n// interface object. `interface ModelContext : EventTarget` therefore requires\n// Object.getPrototypeOf(ModelContext) === EventTarget, not Function.prototype.\nObject.setPrototypeOf(modelContextConstructor, EventTarget);\nObject.defineProperty(StrictWebMCPContext.prototype, 'constructor', {\n configurable: true,\n writable: true,\n value: modelContextConstructor,\n});\nObject.defineProperty(StrictWebMCPContext.prototype, Symbol.toStringTag, {\n configurable: true,\n value: 'ModelContext',\n});\n\n// WebIDL members are enumerable on the interface prototype object; ECMAScript\n// class members are not. `executeTool` is a Chrome extension, not spec IDL.\nfor (const member of ['registerTool', 'getTools', 'executeTool', 'ontoolchange'] as const) {\n const descriptor = Object.getOwnPropertyDescriptor(StrictWebMCPContext.prototype, member);\n if (descriptor) {\n Object.defineProperty(StrictWebMCPContext.prototype, member, {\n ...descriptor,\n enumerable: true,\n });\n }\n}\n\n/**\n * EventTarget-based testing shim matching the native Chromium ModelContextTesting surface.\n *\n * Fires `toolchange` events and supports the `ontoolchange` handler property.\n */\nclass PolyfillTestingShim extends EventTarget implements ModelContextTesting {\n private _ontoolchange: ((this: ModelContextTesting, ev: Event) => unknown) | null = null;\n private readonly ontoolchangeListener: EventListener = (event) => {\n this._ontoolchange?.call(this, event);\n };\n\n readonly #context: StrictWebMCPContext;\n\n constructor(context: StrictWebMCPContext) {\n super();\n this.#context = context;\n }\n\n listTools(): ModelContextTestingToolInfo[] {\n return StrictWebMCPContext.getToolInfos(this.#context);\n }\n\n executeTool(\n toolName: string,\n inputArgsJson: string,\n options?: ChromeModelContextExecuteToolOptions\n ): Promise<string | null> {\n return StrictWebMCPContext.executeToolForTesting(\n this.#context,\n toolName,\n inputArgsJson,\n options\n );\n }\n\n get ontoolchange(): ((this: ModelContextTesting, ev: Event) => unknown) | null {\n return this._ontoolchange;\n }\n\n set ontoolchange(handler: ((this: ModelContextTesting, ev: Event) => unknown) | null) {\n const listener = typeof handler === 'function' ? handler : null;\n if (listener === null) {\n this._ontoolchange = null;\n super.removeEventListener('toolchange', this.ontoolchangeListener);\n return;\n }\n\n if (this._ontoolchange === null) {\n super.addEventListener('toolchange', this.ontoolchangeListener);\n }\n this._ontoolchange = listener;\n }\n\n /** @internal Called by StrictWebMCPContext when tools change. */\n dispatchToolChange(): void {\n this.dispatchEvent(new Event('toolchange'));\n }\n\n dispose(): void {\n this.ontoolchange = null;\n }\n}\n\nfunction normalizeToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ModelContextTool<TArgs>,\n existing: Map<string, PolyfillToolDescriptor>\n): PolyfillToolDescriptor {\n if (!tool || typeof tool !== 'object') {\n throw new TypeError('registerTool(tool) requires a tool object');\n }\n\n const coerced = coerceWebMcpToolDescriptor(tool);\n\n validateWebMcpToolDescriptor(coerced);\n\n if (existing.has(coerced.name)) {\n throw createInvalidStateError(`Tool already registered: ${coerced.name}`);\n }\n\n const registeredInputSchema =\n coerced.inputSchema === undefined ? undefined : serializeInputSchema(coerced.inputSchema);\n\n return {\n name: coerced.name,\n ...(coerced.title === undefined ? {} : { title: coerced.title }),\n description: coerced.description,\n ...(coerced.inputSchema === undefined ? {} : { inputSchema: coerced.inputSchema }),\n ...(coerced.annotations === undefined ? {} : { annotations: coerced.annotations }),\n execute: (input) => Reflect.apply(coerced.execute, undefined, [input]),\n ...(registeredInputSchema !== undefined\n ? { [REGISTERED_INPUT_SCHEMA_SYMBOL]: registeredInputSchema }\n : {}),\n };\n}\n\nlet navigatorModelContextDeprecationWarned = false;\n\n/**\n * Backing store for the `Document.prototype.modelContext` getter.\n *\n * WebIDL puts `[SameObject] readonly attribute ModelContext modelContext` on\n * the Document *interface prototype object*, not on the document instance, and\n * Chrome matches that. One shared accessor therefore needs somewhere to keep\n * the per-document value, and keying it by document is what makes repeated\n * reads return the identical object, as `[SameObject]` requires.\n */\nconst documentModelContexts = new WeakMap<Document, ModelContext>();\n\n// A method shorthand, so it has no `prototype` and is not constructable, like a\n// native getter. `name` is pinned because Chrome reports \"get modelContext\" and\n// minifiers rename otherwise.\nconst { modelContext: documentModelContextGetter } = {\n modelContext(this: Document): ModelContext | undefined {\n // WebIDL brand check: the getter is only callable on a Document.\n // Document.prototype is not one, so reading it throws, as Chrome does.\n if (!(this instanceof Document)) {\n throw new TypeError('Illegal invocation');\n }\n return documentModelContexts.get(this);\n },\n};\nObject.defineProperty(documentModelContextGetter, 'name', { value: 'get modelContext' });\n\nfunction defineDocumentModelContext(target: Document, value: ModelContext): void {\n documentModelContexts.set(target, value);\n if (Object.hasOwn(Document.prototype, 'modelContext')) return;\n installProperty(Document.prototype, 'modelContext', {\n configurable: true,\n enumerable: true,\n get: documentModelContextGetter,\n });\n}\n\n// Per webmachinelearning/webmcp#173 / PR #184, the modelContext getter moved\n// from Navigator to Document. We install on document.modelContext as the\n// primary surface and expose navigator.modelContext as a deprecated alias that\n// returns the same instance and logs a one-time console warning on first\n// access. This mirrors the deprecation behavior shipped in Chrome 150.\nfunction defineDeprecatedNavigatorModelContext(target: Navigator, value: ModelContext): void {\n installProperty(target, 'modelContext', {\n configurable: true,\n enumerable: true,\n get() {\n if (!navigatorModelContextDeprecationWarned) {\n navigatorModelContextDeprecationWarned = true;\n console.warn(\n '[WebMCPPolyfill] navigator.modelContext is deprecated. The May 27, 2026 WebMCP draft moved the modelContext getter from Navigator to Document — use document.modelContext instead. See https://github.com/webmachinelearning/webmcp/pull/184.'\n );\n }\n return value;\n },\n });\n}\n\nfunction installSubmitEventPolyfill(): void {\n const prototype = SubmitEvent.prototype;\n if (!('agentInvoked' in prototype)) {\n installProperty(prototype, 'agentInvoked', {\n configurable: true,\n enumerable: true,\n get(this: SubmitEvent) {\n return isAgentInvokedSubmitEvent(this);\n },\n });\n }\n if (!('respondWith' in prototype)) {\n installProperty(prototype, 'respondWith', {\n configurable: true,\n enumerable: true,\n writable: true,\n value(this: SubmitEvent, agentResponse: Promise<unknown>) {\n respondWithAgentSubmitEvent(this, agentResponse);\n },\n });\n }\n}\n\nexport function initializeWebMCPPolyfill(options?: WebMCPPolyfillInitOptions): void {\n if (globalThis.isSecureContext === false) return;\n const nav = typeof navigator === 'undefined' ? null : navigator;\n const doc = typeof document === 'undefined' ? null : document;\n if (!nav || !doc || typeof window === 'undefined') return;\n\n if (doc.modelContext) return;\n\n const navigatorModelContext = nav.modelContext;\n\n if (installedProperties.length > 0) {\n cleanupWebMCPPolyfill();\n }\n\n if (navigatorModelContext) {\n defineDocumentModelContext(doc, navigatorModelContext);\n return;\n }\n\n const previousDescriptor = Object.getOwnPropertyDescriptor(window, 'ModelContext');\n if (previousDescriptor && !previousDescriptor.configurable) {\n if (!Object.is(Reflect.get(window, 'ModelContext'), modelContextConstructor)) {\n throw new TypeError('Cannot install ModelContext over a non-configurable global');\n }\n } else {\n installProperty(window, 'ModelContext', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: modelContextConstructor,\n });\n }\n\n const context = new StrictWebMCPContext(doc);\n installedContext = context;\n\n defineDocumentModelContext(doc, context);\n\n // Reset the one-shot warning flag so a fresh install warns again on first access.\n navigatorModelContextDeprecationWarned = false;\n defineDeprecatedNavigatorModelContext(nav, context);\n installSubmitEventPolyfill();\n\n if (options?.installTestingShim && !nav.modelContextTesting) {\n installProperty(nav, 'modelContextTesting', {\n configurable: true,\n enumerable: true,\n writable: false,\n value: StrictWebMCPContext.getTestingShim(context),\n });\n }\n\n cleanupDeclarativeForms = installDeclarativeForms(doc, context);\n}\n\nexport function cleanupWebMCPPolyfill(): void {\n cleanupDeclarativeForms?.();\n cleanupDeclarativeForms = null;\n if (installedContext) StrictWebMCPContext.dispose(installedContext);\n installedContext = null;\n for (const { target, key, previous } of [...installedProperties].reverse()) {\n if (previous) Object.defineProperty(target, key, previous);\n else Reflect.deleteProperty(target, key);\n }\n installedProperties.length = 0;\n navigatorModelContextDeprecationWarned = false;\n}\n"],"mappings":";;;AA0BA,MAAM,qCAAqB,IAAI,QAAqB;AACpD,MAAM,iCAAiB,IAAI,QAAuC;AAClE,MAAM,oCAAoB,IAAI,QAA2C;AAEzE,SAAgB,0BAA0B,OAA6B;CACrE,OACE,MAAM,cACL,mBAAmB,IAAI,KAAK,KAC1B,MAAM,eAAe,MAAM,QAC1B,MAAM,kBAAkB,mBACxB,kBAAkB,IAAI,MAAM,MAAM;AAE1C;AAEA,SAAgB,4BACd,OACA,eACM;CACN,IAAI,CAAC,0BAA0B,KAAK,GAClC,MAAM,IAAI,aACR,wEACA,mBACF;CAEF,IAAI,CAAC,MAAM,kBACT,MAAM,IAAI,aACR,gFACA,mBACF;CAEF,IAAI,MAAM,eAAe,MAAM,MAC7B,MAAM,IAAI,aACR,8EACA,mBACF;CAEF,mBAAmB,IAAI,KAAK;CAC5B,MAAM,WAAW,QAAQ,QAAQ,aAAa;CAC9C,eAAe,IAAI,OAAO,QAAQ;CAClC,IAAI,MAAM,kBAAkB,iBAC1B,kBAAkB,IAAI,MAAM,MAAM,GAAG,QAAQ,KAAK;AAEtD;AAEA,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAS;CAAY;CAAU;CAAO;CAAQ;AAAK,CAAC;AACtF,MAAM,uBAAuB,IAAI,IAAI;CACnC,GAAG;CACH;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,UAAU,SAAiD;CAClE,OACE,mBAAmB,oBACnB,mBAAmB,qBACnB,mBAAmB;AAEvB;AAEA,SAAS,gBAAgB,MAAmD;CAC1E,OAAO,QAAQ,IAAI,gBAAgB,WAAW,YAAY,IAAI;AAChE;AAEA,SAAS,iBAAiB,MAAuB,MAA6B;CAC5E,OAAO,QAAQ,MAAM,QAAQ,UAAU,cAAc,MAAM,CAAC,IAAI,CAAC;AACnE;AAEA,SAAS,iBAAiB,MAAuB,MAAuB;CACtE,OAAO,QAAQ,MAAM,QAAQ,UAAU,cAAc,MAAM,CAAC,IAAI,CAAC;AACnE;AAEA,SAAS,gBAAgB,MAAgC;CACvD,OAAO,QAAQ,IAAI,KAAK,WAAW,eAAe,IAAI;AACxD;AAEA,SAAS,kBAAkB,SAAqC;CAC9D,OAAO,QAAQ,IAAI,QAAQ,WAAW,cAAc,OAAO;AAC7D;AAEA,SAAS,kBAAkB,MAAgC;CACzD,OAAO,QAAQ,MAAM,gBAAgB,UAAU,eAAe,MAAM,CAAC,CAAC;AACxE;AAEA,SAAS,kBAAkB,MAAuB,WAA6B;CAC7E,QAAQ,MAAM,gBAAgB,UAAU,eAAe,MAAM,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC;AAC3F;AAEA,SAAS,YAAY,MAA6C;CAChE,OAAO,CAAC,GAAG,gBAAgB,IAAI,CAAC,EAAE,QAC/B,YACC,UAAU,OAAO,KACjB,CAAC,QAAQ,QAAQ,WAAW,KAC5B,EACE,cAAc,WACd,QAAQ,aACP,mBAAmB,uBAAuB,qBAAqB,IAAI,QAAQ,IAAI,GAEtF;AACF;AAEA,SAAS,cAAc,MAA0D;CAC/E,MAAM,yBAAS,IAAI,IAAkC;CACrD,KAAK,MAAM,WAAW,YAAY,IAAI,GAAG;EACvC,MAAM,OAAO,QAAQ,KAAK,KAAK;EAC/B,MAAM,WAAW,OAAO,IAAI,IAAI;EAChC,IAAI,UAAU,SAAS,KAAK,OAAO;OAC9B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;CACjC;CACA,OAAO;AACT;AAEA,SAAS,UAAU,SAAqC;CACtD,OAAO,CAAC,GAAI,QAAQ,UAAU,CAAC,CAAE,EAC9B,KAAK,UAAU;EACd,MAAM,OAAO,MAAM,UAAU,IAAI;EACjC,IAAI,EAAE,gBAAgB,cAAc,OAAO;EAC3C,KACG,iBAAiB,0DAA0D,EAC3E,SAAS,YAAY,QAAQ,OAAO,CAAC;EACxC,OAAO,KAAK,aAAa,KAAK,KAAK;CACrC,CAAC,EACA,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,eACP,MACA,UACiC;CACjC,KACE,IAAI,UAAU,SAAS,IAAI,eAC3B,WAAW,YAAY,MACvB,UAAU,QAAQ,eAElB,IACE,mBAAmB,uBACnB,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,CAAC,GAErD,OAAO;AAIb;AAEA,SAAS,qBACP,MACA,UACoB;CACpB,IAAI,SAAS,WAAW,GAAG;EACzB,MAAM,UAAU,SAAS;EACzB,IAAI,CAAC,SAAS,OAAO;EACrB,OACE,QAAQ,aAAa,sBAAsB,KAC3C,UAAU,OAAO,KACjB,QAAQ,aAAa,kBAAkB,KACvC;CAEJ;CACA,OAAO,eAAe,MAAM,QAAQ,GAAG,aAAa,sBAAsB,KAAK;AACjF;AAEA,SAAS,gBACP,QACA,MACA,UACA,OACyB;CACzB,MAAM,cAAc,qBAAqB,MAAM,QAAQ;CACvD,MAAM,WAAW,eAAe,QAAQ,GAAG,YAAY,IAAI,MAAM,KAAK,eAAe;CACrF,OAAO,WAAW;EAAE,GAAG;EAAQ,aAAa;CAAS,IAAI;AAC3D;AAEA,SAAS,qBAAqB,OAAyB,MAAyC;CAC9F,MAAM,MAAM,MAAM,aAAa,IAAI;CACnC,IAAI,QAAQ,QAAQ,IAAI,KAAK,MAAM,IAAI,OAAO;CAC9C,MAAM,QAAQ,OAAO,GAAG;CACxB,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,SAAS,mBAAmB,UAAkB,MAAuB;CACnE,MAAM,WAAW,WAAW;CAC5B,OAAO,KAAK,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,IAAI,OAAO,UAAU;AACtE;AAEA,SAAS,aAAa,OAA6C;CACjE,MAAM,UAAU,MAAM,aAAa,SAAS;CAC5C,IAAI,YAAY,MAAM,OAAO;CAC7B,IAAI;EACF,IAAI,OAAO,SAAS,GAAG;EACvB,OAAO;CACT,QAAQ;EACN;CACF;AACF;AAEA,SAAS,aAAa,OAAyB,iBAAiB,MAA+B;CAC7F,MAAM,SAAkC,EAAE,MAAM,SAAS;CACzD,MAAM,UAAU,qBAAqB,OAAO,KAAK;CACjD,MAAM,UAAU,qBAAqB,OAAO,KAAK;CACjD,IAAI,YAAY,QAAW,OAAO,UAAU;CAC5C,IAAI,YAAY,QAAW,OAAO,UAAU;CAE5C,MAAM,UAAU,MAAM,aAAa,MAAM;CACzC,IAAI,YAAY,OAAO;EACrB,MAAM,aAAa,YAAY,QAAQ,YAAY,KAAK,IAAI,OAAO,OAAO;EAC1E,MAAM,OAAO,OAAO,SAAS,UAAU,KAAK,aAAa,IAAI,aAAa;EAC1E,MAAM,WAAW,OAAO,MAAM,aAAa,OAAO,CAAC;EAEnD,IAAI,mBADa,YAAY,OAAO,SAAS,QAAQ,IAAI,WAAW,IACnC,IAAI,GAAG,OAAO,aAAa;CAC9D;CAEA,MAAM,UAAU,iBAAiB,aAAa,KAAK,IAAI;CACvD,IAAI,YAAY,QAAW,OAAO,UAAU;CAC5C,OAAO;AACT;AAEA,SAAS,eAAe,OAAyB,YAA4B;CAC3E,MAAM,UAAU,MAAM,aAAa,MAAM;CACzC,MAAM,aAAa,YAAY,QAAQ,YAAY,KAAK,KAAK,OAAO,OAAO;CAC3E,MAAM,OAAO,OAAO,SAAS,UAAU,KAAK,aAAa,IAAI,aAAa;CAC1E,IAAI,OAAO,GAAG,OAAO,GAAG,WAAW;CACnC,IAAI,OAAO,IAAI,OAAO,GAAG,WAAW;CACpC,OAAO,GAAG,WAAW;AACvB;AAEA,SAAS,cAAc,SAGrB;CACA,OAAO;EACL,OAAO,QAAQ,KAAK,YAAY;GAC9B,MAAM;GACN,OAAO,OAAO;GACd,OAAO,OAAO,eAAe;EAC/B,EAAE;EACF,MAAM,QAAQ,KAAK,WAAW,OAAO,KAAK;CAC5C;AACF;AAEA,SAAS,mBAAmB,UAG1B;CACA,OAAO;EACL,OAAO,SAAS,KAAK,YAAY;GAC/B,MAAM,QAAQ,UAAU,OAAO;GAC/B,OAAO;IAAE,MAAM;IAAU,OAAO,QAAQ;IAAO,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;GAAG;EAC7E,CAAC;EACD,MAAM,SAAS,KAAK,YAAY,QAAQ,KAAK;CAC/C;AACF;AAEA,SAAS,gBACP,MACA,UACqC;CACrC,MAAM,QAAQ,SAAS;CACvB,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,SAAS,SAAS,GAAG;EACvB,IAAI,CAAC,SAAS,OAAO,YAAY,mBAAmB,gBAAgB,GAAG,OAAO;EAC9E,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,UAAU,GACzD,OAAO,gBACL;GACE,MAAM;GACN,OAAO;IAAE,MAAM;IAAU,GAAG,mBAAmB,QAAQ;GAAE;GACzD,aAAa;EACf,GACA,MACA,QACF;EAEF,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,GACtD,OAAO,gBAAgB;GAAE,MAAM;GAAU,GAAG,mBAAmB,QAAQ;EAAE,GAAG,MAAM,QAAQ;EAE5F;CACF;CAEA,IAAI,iBAAiB,qBACnB,OAAO,gBAAgB,EAAE,MAAM,SAAS,GAAG,MAAM,QAAQ;CAG3D,IAAI,iBAAiB,mBAAmB;EACtC,MAAM,UAAU,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC;EAChD,OAAO,gBACL,MAAM,WACF;GAAE,MAAM;GAAS,OAAO;IAAE,MAAM;IAAU,GAAG;GAAQ;GAAG,aAAa;EAAK,IAC1E;GAAE,MAAM;GAAU,GAAG;EAAQ,GACjC,MACA,QACF;CACF;CAEA,IAAI,iBAAiB,IAAI,MAAM,IAAI,GAAG;EACpC,MAAM,SAAkC,EAAE,MAAM,SAAS;EACzD,MAAM,UAAU,aAAa,KAAK;EAClC,IAAI,YAAY,QAAW,OAAO,UAAU;EAC5C,OAAO,gBAAgB,QAAQ,MAAM,QAAQ;CAC/C;CACA,IAAI,MAAM,SAAS,UACjB,OAAO,MAAM,aAAa,sBAAsB,IAC5C,gBAAgB,EAAE,MAAM,SAAS,GAAG,MAAM,QAAQ,IAClD;CAEN,IAAI,MAAM,SAAS,UACjB,OAAO,gBAAgB,aAAa,KAAK,GAAG,MAAM,QAAQ;CAE5D,IAAI,MAAM,SAAS,SAAS;EAC1B,MAAM,SAAS,aAAa,OAAO,KAAK;EACxC,OAAO,YAAY;EACnB,OAAO,YAAY;EACnB,OAAO,gBAAgB,QAAQ,MAAM,QAAQ;CAC/C;CACA,IAAI,MAAM,SAAS,YACjB,OAAO,gBAAgB,EAAE,MAAM,UAAU,GAAG,MAAM,QAAQ;CAE5D,IAAI,MAAM,SAAS,SACjB,OAAO,gBAAgB;EAAE,MAAM;EAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC;CAAE,GAAG,MAAM,QAAQ;CAE3F,IAAI,MAAM,SAAS,QACjB,OAAO,gBACL;EAAE,MAAM;EAAU,QAAQ;CAAO,GACjC,MACA,UACA,gDACF;CAEF,IAAI,MAAM,SAAS,SACjB,OAAO,gBACL;EAAE,MAAM;EAAU,QAAQ;CAA6B,GACvD,MACA,QACF;CAEF,IAAI,MAAM,SAAS,QACjB,OAAO,gBACL;EAAE,MAAM;EAAU,QAAQ;CAAyC,GACnE,MACA,QACF;CAEF,IAAI,MAAM,SAAS,QACjB,OAAO,gBACL;EACE,MAAM;EACN,QAAQ,eAAe,OAAO,gCAAgC;CAChE,GACA,MACA,QACF;CAEF,IAAI,MAAM,SAAS,kBACjB,OAAO,gBACL;EACE,MAAM;EACN,QAAQ,eACN,OACA,kEACF;CACF,GACA,MACA,QACF;CAEF,IAAI,MAAM,SAAS,SACjB,OAAO,gBAAgB;EAAE,MAAM;EAAU,QAAQ;CAAoB,GAAG,MAAM,QAAQ;AAG1F;AAEA,SAAS,iBAAiB,MAAoC;CAC5D,MAAM,aAAsC,CAAC;CAC7C,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,CAAC,MAAM,aAAa,cAAc,IAAI,GAAG;EAClD,IAAI,CAAC,MAAM;EACX,MAAM,SAAS,gBAAgB,MAAM,QAAQ;EAC7C,IAAI,CAAC,QAAQ;EACb,OAAO,eAAe,YAAY,MAAM;GACtC,cAAc;GACd,YAAY;GACZ,OAAO;GACP,UAAU;EACZ,CAAC;EACD,IAAI,SAAS,MAAM,YAAY,QAAQ,QAAQ,GAAG,SAAS,KAAK,IAAI;CACtE;CACA,OAAO;EAAE,MAAM;EAAU;EAAY;CAAS;AAChD;AAEA,SAAS,eAAe,MAAkD;CACxE,OAAO;EACL,MAAM,iBAAiB,MAAM,UAAU,KAAK;EAC5C,OAAO,iBAAiB,MAAM,WAAW,KAAK;EAC9C,aAAa,iBAAiB,MAAM,iBAAiB,KAAK;EAC1D,aAAa,iBAAiB,IAAI;EAClC,YAAY,iBAAiB,MAAM,gBAAgB;CACrD;AACF;AAEA,SAAS,aAAa,OAAoC;CACxD,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,OAAO,KAAK;CAChF,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO,OAAO,KAAK;AAE9E;AAEA,SAAS,cAAc,OAAqC;CAC1D,IAAI,OAAO,UAAU,WAAW,OAAO;CACvC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG,OAAO,UAAU;CAC3E,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,UAAU,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAO;CAC5D,IAAI,UAAU,OAAO,MAAM,YAAY,MAAM,SAAS,OAAO;AAE/D;AAEA,SAAS,uBAAuB,OAAgB,SAAkD;CAChG,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;CAClC,MAAM,YAAY,IAAI,IAAI,OAAO;CACjC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,SAAS,aAAa,IAAI;EAChC,IAAI,WAAW,UAAa,CAAC,UAAU,OAAO,MAAM,GAAG,OAAO;CAChE;CACA,OAAO;AACT;AAEA,SAAS,kBAAkB,OAAyB,OAAwB;CAC1E,IAAI,UAAU,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,SAAS;CACnE,MAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;CACvD,MAAM,OAAO,MAAM;CACnB,MAAM,QAAQ;CACd,OAAO,MAAM,UAAU;AACzB;AAEA,SAAS,mBACP,MACA,UACA,OACS;CACT,MAAM,QAAQ,SAAS;CACvB,IAAI,CAAC,SAAS,CAAC,gBAAgB,MAAM,QAAQ,GAAG,OAAO;CAEvD,IAAI,SAAS,SAAS,GAAG;EACvB,IAAI,CAAC,SAAS,OAAO,YAAY,mBAAmB,gBAAgB,GAAG,OAAO;EAC9E,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,UAAU,GACzD,OAAO,uBAAuB,OAAO,IAAI,IAAI,SAAS,KAAK,YAAY,QAAQ,KAAK,CAAC,CAAC;EAExF,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,GAAG;GACzD,MAAM,SAAS,aAAa,KAAK;GACjC,OAAO,WAAW,UAAa,SAAS,MAAM,YAAY,QAAQ,UAAU,MAAM;EACpF;EACA,OAAO;CACT;CAEA,IAAI,iBAAiB,mBAAmB;EACtC,MAAM,UAAU,IAAI,IAAI,CAAC,GAAG,MAAM,OAAO,EAAE,KAAK,WAAW,OAAO,KAAK,CAAC;EACxE,IAAI,MAAM,UAAU,OAAO,uBAAuB,OAAO,OAAO;EAChE,MAAM,SAAS,aAAa,KAAK;EACjC,OAAO,WAAW,UAAa,QAAQ,IAAI,MAAM;CACnD;CACA,IAAI,iBAAiB,qBAAqB,OAAO,aAAa,KAAK,MAAM;CACzE,IAAI,MAAM,SAAS,YAAY,OAAO,cAAc,KAAK,MAAM;CAC/D,IAAI,MAAM,SAAS,SAAS;EAC1B,MAAM,SAAS,aAAa,KAAK;EACjC,OAAO,WAAW,UAAa,MAAM,UAAU;CACjD;CACA,MAAM,SAAS,aAAa,KAAK;CACjC,OAAO,WAAW,UAAa,kBAAkB,OAAO,MAAM;AAChE;AAEA,SAAS,uBAAuB,SAAmC;CACjE,QAAQ,cAAc,IAAI,MAAM,SAAS;EAAE,SAAS;EAAM,UAAU;CAAK,CAAC,CAAC;CAC3E,QAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAC9D;AAEA,SAAS,eAAe,SAAiD,OAAqB;CAC5F,MAAM,YACJ,mBAAmB,mBACf,iBAAiB,YACjB,oBAAoB;CAC1B,OAAO,yBAAyB,WAAW,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK;AAC/E;AAEA,SAAS,iBAAiB,SAA2B,SAAwB;CAC3E,OAAO,yBAAyB,iBAAiB,WAAW,SAAS,GAAG,KAAK,KAC3E,SACA,OACF;AACF;AAEA,SAAS,cAAc,UAAyC,OAAsB;CACpF,MAAM,QAAQ,SAAS;CACvB,IAAI,CAAC,OAAO;CAEZ,IAAI,SAAS,SAAS,KAAK,SAAS,OAAO,YAAY,mBAAmB,gBAAgB,GAAG;EAC3F,IAAI,SAAS,OAAO,YAAY,QAAQ,SAAS,UAAU,KAAK,MAAM,QAAQ,KAAK,GAAG;GACpF,MAAM,UAAU,IAAI,IAAI,MAAM,IAAI,YAAY,CAAC;GAC/C,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,OAAO,QAAQ,IAAI,QAAQ,KAAK;IACtC,IAAI,QAAQ,YAAY,MAAM;IAC9B,iBAAiB,SAAS,IAAI;IAC9B,uBAAuB,OAAO;GAChC;GACA;EACF;EACA,MAAM,WAAW,aAAa,KAAK;EACnC,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,UAAU,QAAQ;EACzE,IAAI,WAAW,CAAC,QAAQ,SAAS;GAC/B,iBAAiB,SAAS,IAAI;GAC9B,uBAAuB,OAAO;EAChC;EACA;CACF;CAEA,IAAI,iBAAiB,mBAAmB;EACtC,IAAI,MAAM,YAAY,MAAM,QAAQ,KAAK,GAAG;GAC1C,MAAM,WAAW,IAAI,IAAI,MAAM,IAAI,YAAY,CAAC;GAChD,IAAI,UAAU;GACd,KAAK,MAAM,UAAU,MAAM,SAAS;IAClC,MAAM,OAAO,SAAS,IAAI,OAAO,KAAK;IACtC,IAAI,OAAO,aAAa,MAAM;IAC9B,OAAO,WAAW;IAClB,UAAU;GACZ;GACA,IAAI,SAAS,uBAAuB,KAAK;GACzC;EACF;EACA,MAAM,OAAO,aAAa,KAAK;EAC/B,IAAI,SAAS,UAAa,MAAM,UAAU,MAAM;GAC9C,MAAM,QAAQ;GACd,uBAAuB,KAAK;EAC9B;EACA;CACF;CAEA,IAAI,iBAAiB,oBAAoB,MAAM,SAAS,YAAY;EAClE,MAAM,OAAO,cAAc,KAAK;EAChC,IAAI,SAAS,UAAa,MAAM,YAAY,MAAM;GAChD,iBAAiB,OAAO,IAAI;GAC5B,uBAAuB,KAAK;EAC9B;EACA;CACF;CAEA,IAAI,iBAAiB,oBAAoB,MAAM,SAAS,SAAS;EAE/D,IADa,aAAa,KACnB,MAAM,MAAM,SAAS,CAAC,MAAM,SAAS;GAC1C,iBAAiB,OAAO,IAAI;GAC5B,uBAAuB,KAAK;EAC9B;EACA;CACF;CAEA,MAAM,OAAO,aAAa,KAAK;CAC/B,IAAI,SAAS,UAAa,MAAM,UAAU,MAAM;EAC9C,eAAe,OAAO,IAAI;EAC1B,uBAAuB,KAAK;CAC9B;AACF;AAEA,SAAS,SAAS,MAAuB,OAA8B;CACrE,IAAI,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,0CAA0C;CACxF,MAAM,SAAS,cAAc,IAAI;CACjC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,GAAG;EACjD,MAAM,WAAW,OAAO,IAAI,IAAI;EAChC,IAAI,CAAC,YAAY,CAAC,mBAAmB,MAAM,UAAU,KAAK,GACxD,MAAM,IAAI,UAAU,iDAAiD,KAAK,EAAE;CAEhF;CACA,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,KAAK,GAAG,cAAc,OAAO,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK;AAChG;AAEA,SAAS,cAAc,MAA8C;CACnE,OAAO,CAAC,GAAG,gBAAgB,IAAI,CAAC,EAAE,MAC/B,YACC,CAAC,QAAQ,QAAQ,WAAW,MAC1B,mBAAmB,qBAAqB,QAAQ,SAAS,YACxD,mBAAmB,oBAAoB,CAAC,SAAS,QAAQ,EAAE,SAAS,QAAQ,IAAI,EACvF;AACF;AAEA,SAAS,gBAAgB,MAAqC;CAC5D,MAAM,WAAW,CAAC,GAAG,gBAAgB,IAAI,CAAC,EACvC,QACE,YACC,UAAU,OAAO,KAAK,QAAQ,gBAAgB,CAAC,QAAQ,SAAS,KACpE,EACC,KAAK,YAAY,GAAG,QAAQ,KAAK,KAAK,KAAK,YAAY,IAAI,QAAQ,mBAAmB,EACtF,KAAK,IAAI;CACZ,OAAO,IAAI,aAAa,2BAA2B,YAAY,cAAc;AAC/E;AAEA,SAAS,mBAAmB,UAAyB;CACnD,MAAM,QAAQ,IAAI,MAAM,eAAe;CACvC,OAAO,eAAe,OAAO,YAAY;EAAE,YAAY;EAAM,OAAO;CAAS,CAAC;CAC9E,OAAO;AACT;AAEA,SAAS,kBACP,cACA,UACA,YACA,WACkB;CAClB,MAAM,EAAE,SAAS;CACjB,aAAa,gBAAgB,IAAI,aAAa,4BAA4B,cAAc,CAAC;CAEzF,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,UAAU;EAEd,MAAM,gBAAgB;GACpB,QAAQ,MAAM,YAAY,UAAU,qBAAqB,MAAM;IAAC;IAAW;IAAW;GAAI,CAAC;GAC3F,kBAAkB,OAAO,IAAI;GAC7B,IAAI,aAAa,kBAAkB,QAAQ,OAAO,aAAa;EACjE;EACA,MAAM,UAAU,aAAyB;GACvC,IAAI,SAAS;GACb,UAAU;GACV,QAAQ;GACR,SAAS;EACX;EACA,MAAM,UAAU,WAAoB,aAAa,OAAO,MAAM,CAAC;EAC/D,MAAM,kBAAkB,aAA+B;GACrD,SAAS,MACN,UAAU,aAAa,QAAQ,KAAK,CAAC,IACrC,UAAmB,aAAa,OAAO,KAAK,CAAC,CAChD;EACF;EACA,MAAM,aAAa,UAAiB;GAClC,IAAI,CAAC,MAAM,WAAW;GACtB,qBAAqB;IACnB,IAAI,CAAC,kBAAkB,IAAI,GAAG,OAAO,gBAAgB,IAAI,CAAC;GAC5D,CAAC;EACH;EAEA,kBAAkB,IAAI,MAAM;GAC1B,SAAS,OAAO;IACd,qBAAqB;KACnB,MAAM,WAAW,eAAe,IAAI,KAAK;KACzC,IAAI,UAAU,eAAe,QAAQ;UAChC,IAAI,MAAM,kBACb,OAAO,IAAI,aAAa,2CAA2C,cAAc,CAAC;UAC7E,aAAa,QAAQ,MAAS,CAAC;IACxC,CAAC;GACH;GACA,SAAS;IACP,aAAa,QAAQ,MAAS,CAAC;GACjC;GACA,QAAQ,OAAO;IACb,qBAAqB;KACnB,MAAM,WAAW,eAAe,IAAI,KAAK;KACzC,IAAI,UAAU,eAAe,QAAQ;IACvC,CAAC;GACH;EACF,CAAC;EACD,aAAa,gBAAgB;EAC7B,QAAQ,MAAM,YAAY,UAAU,kBAAkB,MAAM;GAAC;GAAW;GAAW;EAAI,CAAC;EAExF,IAAI,CAAC,YAAY;GACf,WAAW,MAAM;GACjB,OAAO,cAAc,mBAAmB,QAAQ,CAAC;GACjD;EACF;EACA,IAAI;GACF,kBAAkB,MAAM,SAAS;GACjC,OAAO,cAAc,mBAAmB,QAAQ,CAAC;EACnD,SAAS,OAAO;GACd,OAAO,KAAK;EACd;CACF,CAAC;AACH;;AAGA,SAAgB,wBAAwB,UAAoB,SAAmC;CAC7F,IAAI,SAAS;CACb,MAAM,gCAAgB,IAAI,IAA8C;CACxE,MAAM,qCAAqB,IAAI,IAA6B;CAC5D,MAAM,4BAAY,IAAI,IAA6C;CACnE,MAAM,YAAY,UAAiB;EACjC,IACE,EAAE,iBAAiB,gBACnB,CAAC,MAAM,aACP,EAAE,MAAM,kBAAkB,kBAE1B;EAIF,MAAM,aAAa,kBAAkB,IAAI,MAAM,MAAM;EACrD,IAAI,CAAC,YAAY;EACjB,mBAAmB,IAAI,KAAK;EAC5B,WAAW,SAAS,KAAK;CAC3B;CAEA,MAAM,WAAW,UAAiB;EAChC,IAAI,CAAC,MAAM,aAAa,EAAE,MAAM,kBAAkB,kBAAkB;EACpE,MAAM,OAAO,MAAM;EACnB,qBAAqB;GACnB,IAAI,MAAM,kBAAkB;GAC5B,cACG,IAAI,IAAI,GACP,gBACA,IAAI,aAAa,0CAA0C,cAAc,CAC3E;EACJ,CAAC;CACH;CAEA,SAAS,kBAAkB,MAAmC;EAC5D,UAAU,IAAI,IAAI,GAAG,WAAW;EAChC,UAAU,OAAO,IAAI;EACrB,KAAK,oBAAoB,SAAS,SAAS,IAAI;EAC/C,KAAK,oBAAoB,UAAU,UAAU,IAAI;CACnD;CAEA,SAAS,YAAY,MAAmC;EACtD,IAAI,UAAU,IAAI,IAAI,GAAG;EACzB,MAAM,WAAW,IAAI,iBAAiB,IAAI;EAC1C,UAAU,IAAI,MAAM,QAAQ;EAC5B,SAAS,QAAQ,MAAM;GACrB,YAAY;GACZ,eAAe;GACf,WAAW;GACX,SAAS;EACX,CAAC;EACD,KAAK,iBAAiB,SAAS,SAAS,IAAI;EAG5C,KAAK,iBAAiB,UAAU,UAAU,IAAI;CAChD;CAEA,SAAS,OAAa;EACpB,YAAY,QAAQ;EACpB,KAAK,MAAM,QAAQ,UAAU,KAAK,GAChC,IAAI,gBAAgB,cAAc,CAAC,QAAQ,IAAI,KAAK,WAAW,eAAe,KAAK,IAAI,GACrF,kBAAkB,IAAI;EAI1B,MAAM,6BAAa,IAAI,IAAqB;EAC5C,MAAM,2BAAW,IAAI,IAGnB;EACF,MAAM,iCAAiB,IAAI,IAA6B;EACxD,KAAK,MAAM,QAAQ,UAAU,KAAK,GAChC,KAAK,MAAM,WAAW,KAAK,iBAAiB,GAAG,GAAG;GAChD,MAAM,aAAa,kBAAkB,OAAO;GAC5C,IAAI,YAAY,YAAY,UAAU;GAEtC,IACE,EAAE,mBAAmB,oBACrB,CAAC,iBAAiB,SAAS,UAAU,KACrC,CAAC,iBAAiB,SAAS,iBAAiB,KAC5C,CAAC,gBAAgB,OAAO,GAExB;GAEF,MAAM,OAAO;GACb,WAAW,IAAI,IAAI;GACnB,MAAM,aAAa,eAAe,IAAI;GACtC,MAAM,cAAc,KAAK,UAAU,UAAU;GAC7C,MAAM,qBAAqB,mBAAmB,IAAI,IAAI;GACtD,IAAI,uBAAuB,aAAa;GACxC,MAAM,4BAA4B,uBAAuB;GACzD,mBAAmB,OAAO,IAAI;GAC9B,MAAM,eAAe,eAAe,IAAI,WAAW,IAAI;GACvD,IAAI,gBAAgB,CAAC,2BAA2B;IAC9C,mBAAmB,IAAI,MAAM,WAAW;IACxC;GACF;GACA,IAAI,cAAc;IAChB,MAAM,oBAAoB,SAAS,IAAI,YAAY;IACnD,IAAI,mBAAmB;KACrB,mBAAmB,IAAI,cAAc,kBAAkB,WAAW;KAClE,SAAS,OAAO,YAAY;IAC9B;GACF;GACA,eAAe,IAAI,WAAW,MAAM,IAAI;GACxC,SAAS,IAAI,MAAM;IAAE;IAAY;GAAY,CAAC;EAChD;EAEF,KAAK,MAAM,QAAQ,mBAAmB,KAAK,GACzC,IAAI,CAAC,WAAW,IAAI,IAAI,GAAG,mBAAmB,OAAO,IAAI;EAG3D,KAAK,MAAM,CAAC,MAAM,iBAAiB,eAEjC,IADoB,SAAS,IAAI,IAAI,GAAG,gBACpB,aAAa,aAAa;GAC5C,aAAa,gBACX,IAAI,aAAa,qDAAqD,cAAc,CACtF;GACA,aAAa,WAAW,MAAM;GAC9B,cAAc,OAAO,IAAI;EAC3B;EAGF,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,kBAAkB,UAAU;GAC1D,IAAI,cAAc,IAAI,IAAI,GAAG;GAC7B,MAAM,aAAa,IAAI,gBAAgB;GACvC,MAAM,eAAwC;IAC5C;IACA;IACA;GACF;GACA,cAAc,IAAI,MAAM,YAAY;GACpC,AAAK,QACF,aACC;IACE,MAAM,WAAW;IACjB,OAAO,WAAW;IAClB,aAAa,WAAW;IACxB,aAAa,WAAW;IACxB,QAAQ,OAAwB;KAC9B,MAAM,YAAY,cAAc,IAAI;KACpC,IAAI,CAAC,WAAW,cAAc,CAAC,WAC7B,MAAM,IAAI,aACR,sEACA,cACF;KAEF,SAAS,MAAM,KAAK;KACpB,OAAO,kBACL,cACA,WAAW,MACX,WAAW,YACX,SACF;IACF;GACF,GACA,EAAE,QAAQ,WAAW,OAAO,CAC9B,EACC,OAAO,UAAmB;IACzB,WAAW,MAAM;IAIjB,IAAK,OAAqC,SAAS,cAAc;IACjE,QAAQ,MACN,mCAAmC,WAAW,KAAK,wBACnD,KACF;GACF,CAAC;EACL;CACF;CAEA,IAAI,4BAA4B,CAAC;CACjC,MAAM,mBAAmB,SAAS,aAAa,QAAQ;CACvD,MAAM,yBAAyB,mBAC3B,OAAO,yBAAyB,kBAAkB,cAAc,IAChE;CACJ,IAAI,oBAAoB,wBAAwB,cAAc;EAC5D,MAAM,qBAAqB,iBAAiB;EAC5C,MAAM,eAAe,SAAyB,MAAkC;GAC9E,MAAM,OAAO,mBAAmB,KAAK,MAAM,IAAI;GAC/C,IACE,UACA,KAAK,SAAS,UACd,QAAQ,IAAI,KAAK,WAAW,iBAAiB,IAAI,MAAM,YACvD,QAAQ,IAAI,KAAK,WAAW,eAAe,IAAI,GAE/C,YAAY,IAAI;GAElB,OAAO;EACT;EACA,OAAO,eAAe,kBAAkB,gBAAgB;GACtD,GAAG;GACH,OAAO;EACT,CAAC;EACD,4BAA4B;GAC1B,IAAI,iBAAiB,iBAAiB,cACpC,OAAO,eAAe,kBAAkB,gBAAgB,sBAAsB;EAElF;CACF;CAEA,IAAI,0BAA0B,CAAC;CAC/B,MAAM,gBAAgB,SAAS,aAAa,gBAAgB;CAC5D,MAAM,mBAAmB,gBACrB,OAAO,yBAAyB,eAAe,QAAQ,IACvD;CACJ,IAAI,iBAAiB,kBAAkB,cAAc;EACnD,MAAM,eAAe,cAAc;EACnC,MAAM,SAAS,WAAuC;GACpD,aAAa,KAAK,IAAI;GACtB,IAAI,QAAQ,kBAAkB,IAAI,IAAI,GAAG,OAAO;EAClD;EACA,OAAO,eAAe,eAAe,UAAU;GAAE,GAAG;GAAkB,OAAO;EAAO,CAAC;EACrF,0BAA0B;GACxB,IAAI,cAAc,WAAW,QAC3B,OAAO,eAAe,eAAe,UAAU,gBAAgB;EAEnE;CACF;CAIA,KAAK;CAEL,aAAa;EACX,SAAS;EACT,kBAAkB;EAClB,oBAAoB;EACpB,KAAK,MAAM,QAAQ,UAAU,KAAK,GAAG,kBAAkB,IAAI;EAC3D,mBAAmB,MAAM;EACzB,KAAK,MAAM,gBAAgB,cAAc,OAAO,GAAG;GACjD,aAAa,gBAAgB,IAAI,aAAa,4BAA4B,cAAc,CAAC;GACzF,aAAa,WAAW,MAAM;EAChC;EACA,cAAc,MAAM;CACtB;AACF;;;;ACx4BA,MAAM,2BAA2B;AACjC,MAAM,iCAAiC,OAAO,uBAAuB;AACrE,MAAM,6BAA6B,OAAO,oBAAoB;AAC9D,MAAM,4BAA4B,OAAO,mBAAmB;AAe5D,MAAM,sBAA2C,CAAC;AAClD,IAAI,mBAA+C;AACnD,IAAI,0BAA+C;AAEnD,SAAS,gBAAwB;CAC/B,OAAO,OAAO,WAAW,WAAW,WAChC,WAAW,SACV,WAAW,UAAU,UAAU;AACtC;AAEA,SAAS,gBAAgB,QAAgB,KAAkB,YAAsC;CAC/F,MAAM,WAAW,OAAO,yBAAyB,QAAQ,GAAG;CAC5D,IAAI;EACF,OAAO,eAAe,QAAQ,KAAK,UAAU;CAC/C,SAAS,OAAO;EACd,sBAAsB;EACtB,MAAM;CACR;CACA,oBAAoB,KAAK;EAAE;EAAQ;EAAK;CAAS,CAAC;AACpD;AAcA,IAAM,sBAAN,cAAkC,YAAoC;CAKpE,AAASA,yBAAS,IAAI,IAAoC;CAC1D,eAA2C;CAC3C,uBAA4E;CAC5E,AAASC,yBAAwC,UAAU;EACzD,KAAKC,sBAAsB,KAAK,MAAM,KAAK;CAC7C;CACA,AAASC;CACT,AAASC;CAET,YAAY,eAAgC;EAC1C,MAAM;EACN,KAAKA,iBAAiB;EACtB,KAAKD,gBAAgB,eAAe,aAAa,gBAAgB;EAMjE,OAAO,eAAe,MAAM,0BAA0B;GACpD,OAAO;GACP,YAAY;GACZ,UAAU;GACV,cAAc;EAChB,CAAC;CACH;CAEA,IAAI,eAAoE;EACtE,OAAO,KAAKD;CACd;CAEA,IAAI,aAAa,SAA8D;EAC7E,MAAM,WAAW,OAAO,YAAY,aAAa,UAAU;EAC3D,IAAI,aAAa,MAAM;GACrB,KAAKA,uBAAuB;GAC5B,MAAM,oBAAoB,cAAc,KAAKD,qBAAqB;GAClE;EACF;EAEA,IAAI,KAAKC,yBAAyB,MAChC,MAAM,iBAAiB,cAAc,KAAKD,qBAAqB;EAEjE,KAAKC,uBAAuB;CAC9B;CAOA,MAAM,aACJ,MACA,UAA2C,CAAC,GAC7B;EACf,qBAAqB,KAAKE,cAAc;EACxC,MAAM,SAAS,SAAS;EACxB,MAAM,aAAa,wBAAwB,MAAM,KAAKJ,MAAM;EAC5D,QAAQ,eAAe;EACvB,sCAAsC,SAAS,SAAS;EACxD,QAAQ,eAAe;EACvB,IAAI,SAAS,WAAW,QACtB,MAAM,IAAI,KAAKG,cACb,uDACA,mBACF;EAEF,KAAKH,OAAO,IAAI,WAAW,MAAM,UAAU;EAE3C,IAAI,QAAQ;GACV,MAAM,cAAc;IAClB,IAAI,KAAKK,YAAY,WAAW,MAAM,UAAU,GAAG,AAAK,KAAKC,oBAAoB;GACnF;GACA,WAAW,8BAA8B;GACzC,WAAW,6BAA6B;GACxC,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;EACxD;EAEA,MAAM,KAAKA,oBAAoB;EAC/B,IAAI,QAAQ,SAAS,MAAM,OAAO;CACpC;CAEA,MAAM,SAAS,UAAsC,CAAC,GAA8B;EAClF,qBAAqB,KAAKF,cAAc;EACxC,sCAAsC,SAAS,WAAW;EAC1D,IAAI,SAAS,aAAa,QACxB,MAAM,IAAI,KAAKD,cACb,wDACA,mBACF;EAEF,MAAM,QAAQ,CAAC,GAAG,KAAKH,OAAO,OAAO,CAAC,EACnC,KAAK,SAAS;GAKb,MAAM,aAAa,KAAK;GACxB,MAAM,SAAkB,eAAe,SAAY,SAAY,KAAK,MAAM,UAAU;GACpF,OAAO;IACL,MAAM,KAAK;IACX,OAAO,KAAK,SAAS;IACrB,aAAa,KAAK;IAClB,GAAI,cAAc,MAAM,IAAI,EAAE,aAAa,OAAO,IAAI,CAAC;IACvD,QAAQ,cAAc;IACtB,QAAQ,WAAW;IACnB,GAAI,KAAK,cAAc,EAAE,aAAa,oBAAoB,KAAK,WAAW,EAAE,IAAI,CAAC;GACnF;EACF,CAAC,EACA,MAAM,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,CAAE;EAClE,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,CAAC,CAAC;EACrD,OAAO;CACT;CAEA,MAAM,YACJ,MACA,eACA,UAAgD,CAAC,GACzB;EACxB,qBAAqB,KAAKI,cAAc;EACxC,IAAI,SAAS,QAAQ,OAAO,SAAS,UACnC,MAAM,IAAI,UAAU,kCAAkC;EAExD,KAAK,MAAM,YAAY;GAAC;GAAQ;GAAe;GAAU;EAAQ,GAC/D,IAAI,EAAE,YAAY,OAChB,MAAM,IAAI,UAAU,kBAAkB,SAAS,aAAa;EAGhE,yBAAyB,KAAK,MAAM;EACpC,IAAI,KAAK,WAAW,WAAW,UAAU,KAAK,WAAW,cAAc,GACrE,MAAM,mBAAmB,mBAAmB,KAAK,MAAM;EAEzD,OAAO,KAAKG,kBAAkB,KAAK,MAAM,eAAe,OAAO;CACjE;;CASA,OAAO,eAAe,SAAmD;EACvE,QAAQC,iBAAiB,IAAI,oBAAoB,OAAO;EACxD,OAAO,QAAQA;CACjB;;CAGA,OAAO,aAAa,SAA6D;EAC/E,OAAO,CAAC,GAAG,QAAQR,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU;GACjD,MAAM,KAAK;GACX,aAAa,KAAK;GAGlB,GAAI,KAAK,oCAAoC,SACzC,CAAC,IACD,EAAE,aAAa,KAAK,gCAAgC;EAC1D,EAAE;CACJ;;CAGA,OAAO,sBACL,SACA,UACA,eACA,SACwB;EACxB,qBAAqB,QAAQI,cAAc;EAC3C,OAAO,QAAQG,kBAAkB,UAAU,eAAe,OAAO;CACnE;;CAGA,OAAO,QAAQ,SAAoC;EACjD,KAAK,MAAM,QAAQ,QAAQP,OAAO,KAAK,GAAG,QAAQK,YAAY,IAAI;EAClE,QAAQ,eAAe;EACvB,QAAQG,cAAc,QAAQ;CAChC;CAEA,YAAY,MAAc,UAA4C;EACpE,MAAM,aAAa,KAAKR,OAAO,IAAI,IAAI;EACvC,IAAI,CAAC,cAAe,YAAY,eAAe,UAAW,OAAO;EACjE,MAAM,SAAS,WAAW;EAC1B,MAAM,QAAQ,WAAW;EACzB,IAAI,UAAU,OAAO,OAAO,oBAAoB,SAAS,KAAK;EAC9D,OAAO,KAAKA,OAAO,OAAO,IAAI;CAChC;CAEA,MAAMO,kBACJ,UACA,eACA,SACwB;EACxB,SAAS,QAAQ,eAAe;EAEhC,MAAM,OAAO,KAAKP,OAAO,IAAI,QAAQ;EACrC,IAAI,CAAC,MACH,MAAM,mBAAmB,mBAAmB,UAAU;EAGxD,MAAM,OAAO,qBAAqB,aAAa;EAC/C,SAAS,QAAQ,eAAe;EAChC,IAAI,KAAK,6BAA6B,SAAS,MAAM,mBAAmB,mBAAmB;EAE3F,IAAI;EACJ,IAAI;GACF,MAAM,qBAAqB,KAAK;GAMhC,YAAY,MAAM,gBALA,gBAChB,QAAQ,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAClC,0BACM,mBAAmB,mBAAmB,CAEJ,GAAG,SAAS,MAAM;EAC9D,SAAS,OAAO;GACd,IAAI,SAAS,QAAQ,WAAW,UAAU,QAAQ,OAAO,QAAQ,MAAM;GACvE,IAAI,KAAK,6BAA6B,SAAS,MAAM;GACrD,MAAM,gCAAgC,KAAK;EAC7C;EAEA,OAAO,0BAA0B,SAAS;CAC5C;CAEA,MAAMM,sBAAqC;EAGzC,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,CAAC,CAAC;EACrD,KAAK,cAAc,IAAI,MAAM,YAAY,CAAC;EAC1C,KAAKE,cAAc,mBAAmB;CACxC;AACF;AAIA,MAAM,0BAA0B,SAAS,eAAsB;CAC7D,MAAM,IAAI,UAAU,qBAAqB;AAC3C;AAIA,OAAO,eAAe,yBAAyB,QAAQ,EAAE,OAAO,eAAe,CAAC;AAChF,OAAO,eAAe,yBAAyB,aAAa;CAC1D,OAAO,oBAAoB;CAC3B,UAAU;AACZ,CAAC;AAID,OAAO,eAAe,yBAAyB,WAAW;AAC1D,OAAO,eAAe,oBAAoB,WAAW,eAAe;CAClE,cAAc;CACd,UAAU;CACV,OAAO;AACT,CAAC;AACD,OAAO,eAAe,oBAAoB,WAAW,OAAO,aAAa;CACvE,cAAc;CACd,OAAO;AACT,CAAC;AAID,KAAK,MAAM,UAAU;CAAC;CAAgB;CAAY;CAAe;AAAc,GAAY;CACzF,MAAM,aAAa,OAAO,yBAAyB,oBAAoB,WAAW,MAAM;CACxF,IAAI,YACF,OAAO,eAAe,oBAAoB,WAAW,QAAQ;EAC3D,GAAG;EACH,YAAY;CACd,CAAC;AAEL;;;;;;AAOA,IAAM,sBAAN,cAAkC,YAA2C;CAC3E,AAAQ,gBAA4E;CACpF,AAAiB,wBAAuC,UAAU;EAChE,KAAK,eAAe,KAAK,MAAM,KAAK;CACtC;CAEA,AAASC;CAET,YAAY,SAA8B;EACxC,MAAM;EACN,KAAKA,WAAW;CAClB;CAEA,YAA2C;EACzC,OAAO,oBAAoB,aAAa,KAAKA,QAAQ;CACvD;CAEA,YACE,UACA,eACA,SACwB;EACxB,OAAO,oBAAoB,sBACzB,KAAKA,UACL,UACA,eACA,OACF;CACF;CAEA,IAAI,eAA2E;EAC7E,OAAO,KAAK;CACd;CAEA,IAAI,aAAa,SAAqE;EACpF,MAAM,WAAW,OAAO,YAAY,aAAa,UAAU;EAC3D,IAAI,aAAa,MAAM;GACrB,KAAK,gBAAgB;GACrB,MAAM,oBAAoB,cAAc,KAAK,oBAAoB;GACjE;EACF;EAEA,IAAI,KAAK,kBAAkB,MACzB,MAAM,iBAAiB,cAAc,KAAK,oBAAoB;EAEhE,KAAK,gBAAgB;CACvB;;CAGA,qBAA2B;EACzB,KAAK,cAAc,IAAI,MAAM,YAAY,CAAC;CAC5C;CAEA,UAAgB;EACd,KAAK,eAAe;CACtB;AACF;AAEA,SAAS,wBACP,MACA,UACwB;CACxB,IAAI,CAAC,QAAQ,OAAO,SAAS,UAC3B,MAAM,IAAI,UAAU,2CAA2C;CAGjE,MAAM,UAAU,2BAA2B,IAAI;CAE/C,6BAA6B,OAAO;CAEpC,IAAI,SAAS,IAAI,QAAQ,IAAI,GAC3B,MAAM,wBAAwB,4BAA4B,QAAQ,MAAM;CAG1E,MAAM,wBACJ,QAAQ,gBAAgB,SAAY,SAAY,qBAAqB,QAAQ,WAAW;CAE1F,OAAO;EACL,MAAM,QAAQ;EACd,GAAI,QAAQ,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;EAC9D,aAAa,QAAQ;EACrB,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;EAChF,GAAI,QAAQ,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;EAChF,UAAU,UAAU,QAAQ,MAAM,QAAQ,SAAS,QAAW,CAAC,KAAK,CAAC;EACrE,GAAI,0BAA0B,SAC1B,GAAG,iCAAiC,sBAAsB,IAC1D,CAAC;CACP;AACF;AAEA,IAAI,yCAAyC;;;;;;;;;;AAW7C,MAAM,wCAAwB,IAAI,QAAgC;AAKlE,MAAM,EAAE,cAAc,+BAA+B,EACnD,eAAuD;CAGrD,IAAI,EAAE,gBAAgB,WACpB,MAAM,IAAI,UAAU,oBAAoB;CAE1C,OAAO,sBAAsB,IAAI,IAAI;AACvC,EACF;AACA,OAAO,eAAe,4BAA4B,QAAQ,EAAE,OAAO,mBAAmB,CAAC;AAEvF,SAAS,2BAA2B,QAAkB,OAA2B;CAC/E,sBAAsB,IAAI,QAAQ,KAAK;CACvC,IAAI,OAAO,OAAO,SAAS,WAAW,cAAc,GAAG;CACvD,gBAAgB,SAAS,WAAW,gBAAgB;EAClD,cAAc;EACd,YAAY;EACZ,KAAK;CACP,CAAC;AACH;AAOA,SAAS,sCAAsC,QAAmB,OAA2B;CAC3F,gBAAgB,QAAQ,gBAAgB;EACtC,cAAc;EACd,YAAY;EACZ,MAAM;GACJ,IAAI,CAAC,wCAAwC;IAC3C,yCAAyC;IACzC,QAAQ,KACN,+OACF;GACF;GACA,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAS,6BAAmC;CAC1C,MAAM,YAAY,YAAY;CAC9B,IAAI,EAAE,kBAAkB,YACtB,gBAAgB,WAAW,gBAAgB;EACzC,cAAc;EACd,YAAY;EACZ,MAAuB;GACrB,OAAO,0BAA0B,IAAI;EACvC;CACF,CAAC;CAEH,IAAI,EAAE,iBAAiB,YACrB,gBAAgB,WAAW,eAAe;EACxC,cAAc;EACd,YAAY;EACZ,UAAU;EACV,MAAyB,eAAiC;GACxD,4BAA4B,MAAM,aAAa;EACjD;CACF,CAAC;AAEL;AAEA,SAAgB,yBAAyB,SAA2C;CAClF,IAAI,WAAW,oBAAoB,OAAO;CAC1C,MAAM,MAAM,OAAO,cAAc,cAAc,OAAO;CACtD,MAAM,MAAM,OAAO,aAAa,cAAc,OAAO;CACrD,IAAI,CAAC,OAAO,CAAC,OAAO,OAAO,WAAW,aAAa;CAEnD,IAAI,IAAI,cAAc;CAEtB,MAAM,wBAAwB,IAAI;CAElC,IAAI,oBAAoB,SAAS,GAC/B,sBAAsB;CAGxB,IAAI,uBAAuB;EACzB,2BAA2B,KAAK,qBAAqB;EACrD;CACF;CAEA,MAAM,qBAAqB,OAAO,yBAAyB,QAAQ,cAAc;CACjF,IAAI,sBAAsB,CAAC,mBAAmB,cAC5C;MAAI,CAAC,OAAO,GAAG,QAAQ,IAAI,QAAQ,cAAc,GAAG,uBAAuB,GACzE,MAAM,IAAI,UAAU,4DAA4D;CAClF,OAEA,gBAAgB,QAAQ,gBAAgB;EACtC,cAAc;EACd,YAAY;EACZ,UAAU;EACV,OAAO;CACT,CAAC;CAGH,MAAM,UAAU,IAAI,oBAAoB,GAAG;CAC3C,mBAAmB;CAEnB,2BAA2B,KAAK,OAAO;CAGvC,yCAAyC;CACzC,sCAAsC,KAAK,OAAO;CAClD,2BAA2B;CAE3B,IAAI,SAAS,sBAAsB,CAAC,IAAI,qBACtC,gBAAgB,KAAK,uBAAuB;EAC1C,cAAc;EACd,YAAY;EACZ,UAAU;EACV,OAAO,oBAAoB,eAAe,OAAO;CACnD,CAAC;CAGH,0BAA0B,wBAAwB,KAAK,OAAO;AAChE;AAEA,SAAgB,wBAA8B;CAC5C,0BAA0B;CAC1B,0BAA0B;CAC1B,IAAI,kBAAkB,oBAAoB,QAAQ,gBAAgB;CAClE,mBAAmB;CACnB,KAAK,MAAM,EAAE,QAAQ,KAAK,cAAc,CAAC,GAAG,mBAAmB,EAAE,QAAQ,GACvE,IAAI,UAAU,OAAO,eAAe,QAAQ,KAAK,QAAQ;MACpD,QAAQ,eAAe,QAAQ,GAAG;CAEzC,oBAAoB,SAAS;CAC7B,yCAAyC;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import type {\n CallToolResult,\n InputSchema,\n JsonValue,\n ToolDescriptor,\n WebMcpToolInput,\n WebMcpToolAnnotations,\n} from '@mcp-b/webmcp-types';\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from '@standard-schema/spec';\n\ntype StandardInputValidatorSchema = StandardSchemaV1<WebMcpToolInput, WebMcpToolInput>;\ntype StandardInputJsonSchema = StandardJSONSchemaV1<WebMcpToolInput, WebMcpToolInput>;\n\nconst DEFAULT_INPUT_SCHEMA: InputSchema = { type: 'object', properties: {} };\nconst FAILED_TO_PARSE_INPUT_ARGUMENTS_MESSAGE = 'Failed to parse input arguments';\nconst TOOL_INVOCATION_FAILED_MESSAGE =\n 'Tool was executed but the invocation failed. For example, the script function threw an error';\nconst STANDARD_JSON_SCHEMA_TARGETS = ['draft-2020-12', 'draft-07'] as const;\nconst VALID_TOOL_NAME_RE = /^[A-Za-z0-9_.-]{1,128}$/u;\n\nexport type ToolInputSchema = InputSchema | StandardInputJsonSchema;\n\nexport interface NormalizedInputSchema {\n inputSchema: InputSchema;\n registeredInputSchema?: string;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toDomString(value: unknown): string {\n if (typeof value === 'symbol') {\n throw new TypeError('Symbol values cannot be converted to a DOMString');\n }\n return String(value);\n}\n\nexport function coerceWebMcpToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ToolDescriptor<TArgs>\n): ToolDescriptor<TArgs>;\nexport function coerceWebMcpToolDescriptor(\n tool: Record<string, unknown>\n): ToolDescriptor<WebMcpToolInput>;\nexport function coerceWebMcpToolDescriptor(tool: object): ToolDescriptor<WebMcpToolInput> {\n const name: unknown = Reflect.get(tool, 'name');\n const description: unknown = Reflect.get(tool, 'description');\n const title: unknown = Reflect.get(tool, 'title');\n if (name === undefined) {\n throw new TypeError('Tool \"name\" is required');\n }\n if (description === undefined) {\n throw new TypeError('Tool \"description\" is required');\n }\n\n const annotations: unknown = Reflect.get(tool, 'annotations');\n const annotationMembers = isPlainObject(annotations) ? annotations : {};\n const inputSchema: unknown = Reflect.get(tool, 'inputSchema');\n const outputSchema: unknown = Reflect.get(tool, 'outputSchema');\n const execute: unknown = Reflect.get(tool, 'execute');\n\n // Web IDL dictionaries read known members without retaining the caller's object.\n // The cast is load-bearing: `execute` stays unnarrowed until validateWebMcpToolDescriptor().\n return {\n name: toDomString(name),\n ...(title === undefined\n ? {}\n : {\n title: toDomString(title).toWellFormed(),\n }),\n description: toDomString(description),\n ...(inputSchema === undefined ? {} : { inputSchema }),\n ...(outputSchema === undefined ? {} : { outputSchema }),\n execute,\n ...(annotations === undefined\n ? {}\n : {\n annotations: {\n ...(annotationMembers.title === undefined\n ? {}\n : { title: toDomString(annotationMembers.title).toWellFormed() }),\n readOnlyHint: Boolean(annotationMembers.readOnlyHint),\n ...(annotationMembers.destructiveHint === undefined\n ? {}\n : { destructiveHint: Boolean(annotationMembers.destructiveHint) }),\n ...(annotationMembers.idempotentHint === undefined\n ? {}\n : { idempotentHint: Boolean(annotationMembers.idempotentHint) }),\n ...(annotationMembers.openWorldHint === undefined\n ? {}\n : { openWorldHint: Boolean(annotationMembers.openWorldHint) }),\n untrustedContentHint: Boolean(annotationMembers.untrustedContentHint),\n },\n }),\n } as ToolDescriptor<WebMcpToolInput>;\n}\n\nfunction isJsonObjectRecord(value: unknown): value is Record<string, unknown> {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, seen = new WeakSet<object>()): value is JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return true;\n }\n\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n\n if (typeof value !== 'object') {\n return false;\n }\n\n if (seen.has(value)) {\n return false;\n }\n\n seen.add(value);\n try {\n const entries = Array.isArray(value)\n ? value\n : isJsonObjectRecord(value)\n ? Object.values(value)\n : null;\n return entries?.every((entry) => isJsonValue(entry, seen)) ?? false;\n } catch {\n return false;\n } finally {\n seen.delete(value);\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue | undefined {\n return isJsonValue(value) ? value : undefined;\n}\n\nfunction hasCallToolResultShape(\n value: unknown\n): value is Record<string, unknown> & { content: unknown[] } {\n return isPlainObject(value) && Array.isArray(value.content);\n}\n\nfunction serializeTextContent(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nexport function normalizeToolResponse(value: unknown): CallToolResult {\n // Preserve protocol-evolving content blocks at this compatibility boundary.\n if (hasCallToolResultShape(value)) return value as CallToolResult;\n const structuredContent = toJsonValue(value);\n return {\n content: [{ type: 'text', text: serializeTextContent(value) }],\n ...(structuredContent === undefined ? {} : { structuredContent }),\n isError: false,\n };\n}\n\nexport function createUnknownError(message: string): Error {\n return new DOMException(message, 'UnknownError');\n}\n\nexport function createToolInvocationFailedError(error: unknown): Error {\n return createUnknownError(\n error instanceof Error\n ? `${TOOL_INVOCATION_FAILED_MESSAGE}: ${error.message}`\n : TOOL_INVOCATION_FAILED_MESSAGE\n );\n}\n\nexport function createInvalidStateError(message: string): Error {\n return new DOMException(message, 'InvalidStateError');\n}\n\nexport function validateWebMcpToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ToolDescriptor<TArgs>\n): void {\n if (tool.name === '') {\n throw createInvalidStateError('Tool \"name\" must be a non-empty string');\n }\n if (typeof tool.name !== 'string' || !VALID_TOOL_NAME_RE.test(tool.name)) {\n throw createInvalidStateError(\n 'Tool \"name\" must be 1–128 characters and contain only ASCII alphanumeric, underscore, hyphen, or period'\n );\n }\n if (typeof tool.description !== 'string' || tool.description.length === 0) {\n throw createInvalidStateError('Tool \"description\" must be a non-empty string');\n }\n if (typeof tool.execute !== 'function') {\n throw new TypeError('Tool \"execute\" must be a function');\n }\n}\n\nexport function toWebMcpAnnotations(annotations: WebMcpToolAnnotations): WebMcpToolAnnotations {\n return {\n readOnlyHint: annotations.readOnlyHint ?? false,\n untrustedContentHint: annotations.untrustedContentHint ?? false,\n };\n}\n\nexport function parseChromeToolInput(input: string): WebMcpToolInput {\n try {\n const value: unknown = JSON.parse(input);\n if (Array.isArray(value) || isPlainObject(value)) return value;\n } catch {\n // Chrome reports invalid JSON and non-object inputs as UnknownError.\n }\n throw createUnknownError(FAILED_TO_PARSE_INPUT_ARGUMENTS_MESSAGE);\n}\n\nexport function serializeChromeToolResult(value: unknown): string {\n if ((typeof value === 'object' && value !== null) || typeof value === 'function') {\n try {\n const serialized = JSON.stringify(value);\n if (serialized) return serialized;\n } catch {\n // Chromium falls back to string conversion when JSON serialization fails.\n }\n }\n return String(value) || 'Operation succeeded';\n}\n\nexport function withAbortSignal<T>(\n operation: Promise<T>,\n signal?: AbortSignal,\n getAbortReason: () => unknown = () => signal?.reason\n): Promise<T> {\n if (!signal) return operation;\n if (signal.aborted) return Promise.reject(getAbortReason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(getAbortReason());\n };\n const cleanup = () => signal.removeEventListener('abort', onAbort);\n\n signal.addEventListener('abort', onAbort, { once: true });\n operation.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n }\n );\n });\n}\n\nfunction isPotentiallyTrustworthyOrigin(url: URL): boolean {\n const originUrl = url.origin === 'null' ? url : new URL(url.origin);\n const protocol = originUrl.protocol;\n if (['https:', 'wss:', 'file:', 'chrome-extension:', 'moz-extension:'].includes(protocol)) {\n return true;\n }\n\n const hostname = originUrl.hostname.toLowerCase();\n const ipv4 = hostname.split('.');\n const isLoopbackIpv4 =\n ipv4.length === 4 &&\n ipv4.every((part) => /^\\d{1,3}$/u.test(part) && Number(part) <= 255) &&\n Number(ipv4[0]) === 127;\n return (\n hostname === '::1' ||\n hostname === '[::1]' ||\n hostname === 'localhost' ||\n hostname === 'localhost.' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.localhost.') ||\n isLoopbackIpv4\n );\n}\n\nexport function validatePotentiallyTrustworthyOrigins(\n origins: readonly string[] | undefined\n): void {\n for (const origin of origins ?? []) {\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new DOMException(`Invalid or untrustworthy origin: ${String(origin)}`, 'SecurityError');\n }\n if (!isPotentiallyTrustworthyOrigin(parsed)) {\n throw new DOMException(`Invalid or untrustworthy origin: ${origin}`, 'SecurityError');\n }\n }\n}\n\nexport function validateWebMcpAccess(ownerDocument: Document | null): void {\n validateOriginAgentCluster();\n if (!ownerDocument) return;\n\n const DOMExceptionConstructor = ownerDocument.defaultView?.DOMException ?? DOMException;\n let fullyActive = false;\n try {\n const ownerWindow = ownerDocument.defaultView;\n fullyActive = Boolean(ownerWindow && ownerWindow.document === ownerDocument);\n } catch {\n // A navigated cross-origin WindowProxy is not the document's active window.\n }\n if (!fullyActive) {\n throw new DOMExceptionConstructor(\n 'The associated document is not fully active',\n 'InvalidStateError'\n );\n }\n\n const policy: unknown =\n Reflect.get(ownerDocument, 'permissionsPolicy') ?? Reflect.get(ownerDocument, 'featurePolicy');\n if (policy && typeof policy === 'object') {\n const features = Reflect.get(policy, 'features');\n const allowsFeature = Reflect.get(policy, 'allowsFeature');\n if (typeof features === 'function' && typeof allowsFeature === 'function') {\n const supported: unknown = Reflect.apply(features, policy, []);\n if (Array.isArray(supported) && supported.includes('tools')) {\n if (Reflect.apply(allowsFeature, policy, ['tools']) === true) return;\n throw new DOMExceptionConstructor(\n 'WebMCP is disabled by Permissions Policy',\n 'NotAllowedError'\n );\n }\n }\n }\n\n const ownerWindow = ownerDocument.defaultView;\n if (!ownerWindow || ownerWindow.parent === ownerWindow) return;\n try {\n void ownerWindow.parent.document;\n return;\n } catch {\n // Without native policy support, cross-origin frames fail closed.\n }\n throw new DOMExceptionConstructor(\n 'WebMCP in cross-origin frames requires native Permissions Policy support',\n 'NotAllowedError'\n );\n}\n\nexport function validateOriginAgentCluster(): void {\n if (globalThis.originAgentCluster === false && globalThis.location?.protocol !== 'file:') {\n throw new DOMException('', 'SecurityError');\n }\n}\n\nexport function validateExecutableOrigin(origin: unknown): void {\n try {\n if (new URL(String(origin)).origin !== 'null') return;\n } catch {\n // Invalid and opaque origins share the WebMCP NotSupportedError result.\n }\n throw new DOMException(`Unsupported tool origin: ${String(origin)}`, 'NotSupportedError');\n}\n\nfunction getStandardProps(value: unknown): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n return null;\n }\n\n const standard = value['~standard'];\n if (!isPlainObject(standard)) {\n return null;\n }\n\n return standard;\n}\n\nfunction isStandardInputValidatorSchema(value: unknown): value is StandardInputValidatorSchema {\n const standard = getStandardProps(value);\n return Boolean(standard && standard.version === 1 && typeof standard.validate === 'function');\n}\n\nfunction isStandardInputJsonSchema(value: unknown): value is StandardInputJsonSchema {\n const standard = getStandardProps(value);\n if (!standard || standard.version !== 1 || !isPlainObject(standard.jsonSchema)) {\n return false;\n }\n\n return typeof standard.jsonSchema.input === 'function';\n}\n\nfunction preserveStandardSchema(\n inputSchema: InputSchema,\n standardSchema: StandardInputValidatorSchema\n): InputSchema {\n const normalized = { ...inputSchema };\n Object.defineProperty(normalized, '~standard', {\n value: standardSchema['~standard'],\n });\n return normalized;\n}\n\nfunction convertStandardInputSchema(schema: StandardInputJsonSchema): InputSchema {\n for (const target of STANDARD_JSON_SCHEMA_TARGETS) {\n try {\n const converted = schema['~standard'].jsonSchema.input({ target });\n const serialized = serializeInputSchema(converted);\n const parsed: unknown = JSON.parse(serialized);\n if (!isPlainObject(parsed)) throw new TypeError('inputSchema must serialize to an object');\n return parsed;\n } catch {}\n }\n\n throw new Error('Failed to convert Standard JSON Schema inputSchema to a JSON Schema object');\n}\n\nexport function normalizeInputSchema(\n inputSchema: ToolInputSchema | undefined\n): NormalizedInputSchema {\n if (inputSchema === undefined) {\n return { inputSchema: DEFAULT_INPUT_SCHEMA };\n }\n\n if (isStandardInputJsonSchema(inputSchema)) {\n const converted = convertStandardInputSchema(inputSchema);\n const registeredInputSchema = serializeInputSchema(converted);\n return {\n inputSchema: isStandardInputValidatorSchema(inputSchema)\n ? preserveStandardSchema(converted, inputSchema)\n : converted,\n registeredInputSchema,\n };\n }\n\n if (isStandardInputValidatorSchema(inputSchema)) {\n throw new Error(\n 'Standard Schema inputSchema must provide ~standard.jsonSchema.input() for tool metadata'\n );\n }\n\n if (\n inputSchema === null ||\n (typeof inputSchema !== 'object' && typeof inputSchema !== 'function')\n ) {\n throw new TypeError('inputSchema must be an object');\n }\n const registeredInputSchema = serializeInputSchema(inputSchema);\n const serializedValue: unknown = JSON.parse(registeredInputSchema);\n const jsonSchema = isPlainObject(serializedValue) ? serializedValue : undefined;\n\n // Empty {} is valid JSON Schema but lacks type:\"object\" required by MCP.\n if (!jsonSchema || Object.keys(jsonSchema).length === 0) {\n return {\n inputSchema: DEFAULT_INPUT_SCHEMA,\n registeredInputSchema,\n };\n }\n\n const normalizedSchema: InputSchema =\n jsonSchema.type === undefined ? { type: 'object', ...jsonSchema } : jsonSchema;\n return {\n inputSchema: normalizedSchema,\n registeredInputSchema,\n };\n}\n\nexport function serializeInputSchema(schema: unknown): string {\n if (schema === null || (typeof schema !== 'object' && typeof schema !== 'function')) {\n throw new TypeError('inputSchema must be an object');\n }\n const serialized = JSON.stringify(schema);\n if (serialized === undefined) {\n throw new TypeError('inputSchema must be JSON-serializable');\n }\n return serialized;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import type {\n CallToolResult,\n InputSchema,\n JsonValue,\n ToolDescriptor,\n WebMcpToolInput,\n WebMcpToolAnnotations,\n} from '@mcp-b/webmcp-types';\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from '@standard-schema/spec';\n\ntype StandardInputValidatorSchema = StandardSchemaV1<WebMcpToolInput, WebMcpToolInput>;\ntype StandardInputJsonSchema = StandardJSONSchemaV1<WebMcpToolInput, WebMcpToolInput>;\n\nconst DEFAULT_INPUT_SCHEMA: InputSchema = { type: 'object', properties: {} };\nconst FAILED_TO_PARSE_INPUT_ARGUMENTS_MESSAGE = 'Failed to parse input arguments';\nconst TOOL_INVOCATION_FAILED_MESSAGE =\n 'Tool was executed but the invocation failed. For example, the script function threw an error';\nconst STANDARD_JSON_SCHEMA_TARGETS = ['draft-2020-12', 'draft-07'] as const;\nconst VALID_TOOL_NAME_RE = /^[A-Za-z0-9_.-]{1,128}$/u;\n\nexport type ToolInputSchema = InputSchema | StandardInputJsonSchema;\n\nexport interface NormalizedInputSchema {\n inputSchema: InputSchema;\n registeredInputSchema?: string;\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toDomString(value: unknown): string {\n if (typeof value === 'symbol') {\n throw new TypeError('Symbol values cannot be converted to a DOMString');\n }\n return String(value);\n}\n\nexport function coerceWebMcpToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ToolDescriptor<TArgs>\n): ToolDescriptor<TArgs>;\nexport function coerceWebMcpToolDescriptor(\n tool: Record<string, unknown>\n): ToolDescriptor<WebMcpToolInput>;\nexport function coerceWebMcpToolDescriptor(tool: object): ToolDescriptor<WebMcpToolInput> {\n const name: unknown = Reflect.get(tool, 'name');\n const description: unknown = Reflect.get(tool, 'description');\n const title: unknown = Reflect.get(tool, 'title');\n if (name === undefined) {\n throw new TypeError('Tool \"name\" is required');\n }\n if (description === undefined) {\n throw new TypeError('Tool \"description\" is required');\n }\n\n const annotations: unknown = Reflect.get(tool, 'annotations');\n const annotationMembers = isPlainObject(annotations) ? annotations : {};\n const inputSchema: unknown = Reflect.get(tool, 'inputSchema');\n const outputSchema: unknown = Reflect.get(tool, 'outputSchema');\n const execute: unknown = Reflect.get(tool, 'execute');\n\n // Web IDL dictionaries read known members without retaining the caller's object.\n // The cast is load-bearing: `execute` stays unnarrowed until validateWebMcpToolDescriptor().\n return {\n name: toDomString(name),\n ...(title === undefined\n ? {}\n : {\n title: toDomString(title).toWellFormed(),\n }),\n description: toDomString(description),\n ...(inputSchema === undefined ? {} : { inputSchema }),\n ...(outputSchema === undefined ? {} : { outputSchema }),\n execute,\n ...(annotations === undefined\n ? {}\n : {\n annotations: {\n ...(annotationMembers.title === undefined\n ? {}\n : { title: toDomString(annotationMembers.title).toWellFormed() }),\n readOnlyHint: Boolean(annotationMembers.readOnlyHint),\n ...(annotationMembers.destructiveHint === undefined\n ? {}\n : { destructiveHint: Boolean(annotationMembers.destructiveHint) }),\n ...(annotationMembers.idempotentHint === undefined\n ? {}\n : { idempotentHint: Boolean(annotationMembers.idempotentHint) }),\n ...(annotationMembers.openWorldHint === undefined\n ? {}\n : { openWorldHint: Boolean(annotationMembers.openWorldHint) }),\n untrustedContentHint: Boolean(annotationMembers.untrustedContentHint),\n },\n }),\n } as ToolDescriptor<WebMcpToolInput>;\n}\n\nfunction isJsonObjectRecord(value: unknown): value is Record<string, unknown> {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isJsonValue(value: unknown, seen = new WeakSet<object>()): value is JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return true;\n }\n\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n\n if (typeof value !== 'object') {\n return false;\n }\n\n if (seen.has(value)) {\n return false;\n }\n\n seen.add(value);\n try {\n const entries = Array.isArray(value)\n ? value\n : isJsonObjectRecord(value)\n ? Object.values(value)\n : null;\n return entries?.every((entry) => isJsonValue(entry, seen)) ?? false;\n } catch {\n return false;\n } finally {\n seen.delete(value);\n }\n}\n\nfunction toJsonValue(value: unknown): JsonValue | undefined {\n return isJsonValue(value) ? value : undefined;\n}\n\nfunction hasCallToolResultShape(\n value: unknown\n): value is Record<string, unknown> & { content: unknown[] } {\n return isPlainObject(value) && Array.isArray(value.content);\n}\n\nfunction serializeTextContent(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nexport function normalizeToolResponse(value: unknown): CallToolResult {\n // Preserve protocol-evolving content blocks at this compatibility boundary.\n if (hasCallToolResultShape(value)) return value as CallToolResult;\n const structuredContent = toJsonValue(value);\n return {\n content: [{ type: 'text', text: serializeTextContent(value) }],\n ...(structuredContent === undefined ? {} : { structuredContent }),\n isError: false,\n };\n}\n\nexport function createUnknownError(message: string): Error {\n return new DOMException(message, 'UnknownError');\n}\n\nexport function createToolInvocationFailedError(error: unknown): Error {\n return createUnknownError(\n error instanceof Error\n ? `${TOOL_INVOCATION_FAILED_MESSAGE}: ${error.message}`\n : TOOL_INVOCATION_FAILED_MESSAGE\n );\n}\n\nexport function createInvalidStateError(message: string): Error {\n return new DOMException(message, 'InvalidStateError');\n}\n\nexport function validateWebMcpToolDescriptor<TArgs extends WebMcpToolInput>(\n tool: ToolDescriptor<TArgs>\n): void {\n if (tool.name === '') {\n throw createInvalidStateError('Tool \"name\" must be a non-empty string');\n }\n if (typeof tool.name !== 'string' || !VALID_TOOL_NAME_RE.test(tool.name)) {\n throw createInvalidStateError(\n 'Tool \"name\" must be 1–128 characters and contain only ASCII alphanumeric, underscore, hyphen, or period'\n );\n }\n if (typeof tool.description !== 'string' || tool.description.length === 0) {\n throw createInvalidStateError('Tool \"description\" must be a non-empty string');\n }\n if (typeof tool.execute !== 'function') {\n throw new TypeError('Tool \"execute\" must be a function');\n }\n}\n\nexport function toWebMcpAnnotations(annotations: WebMcpToolAnnotations): WebMcpToolAnnotations {\n return {\n readOnlyHint: annotations.readOnlyHint ?? false,\n untrustedContentHint: annotations.untrustedContentHint ?? false,\n };\n}\n\nexport function parseChromeToolInput(input: string): WebMcpToolInput {\n try {\n const value: unknown = JSON.parse(input);\n if (Array.isArray(value) || isPlainObject(value)) return value;\n } catch {\n // Chrome reports invalid JSON and non-object inputs as UnknownError.\n }\n throw createUnknownError(FAILED_TO_PARSE_INPUT_ARGUMENTS_MESSAGE);\n}\n\nexport function serializeChromeToolResult(value: unknown): string {\n if ((typeof value === 'object' && value !== null) || typeof value === 'function') {\n try {\n const serialized = JSON.stringify(value);\n if (serialized) return serialized;\n } catch {\n // Chromium falls back to string conversion when JSON serialization fails.\n }\n }\n return String(value) || 'Operation succeeded';\n}\n\nexport function withAbortSignal<T>(\n operation: Promise<T>,\n signal?: AbortSignal,\n getAbortReason: () => unknown = () => signal?.reason\n): Promise<T> {\n if (!signal) return operation;\n if (signal.aborted) return Promise.reject(getAbortReason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n cleanup();\n reject(getAbortReason());\n };\n const cleanup = () => signal.removeEventListener('abort', onAbort);\n\n signal.addEventListener('abort', onAbort, { once: true });\n operation.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (error: unknown) => {\n cleanup();\n reject(error);\n }\n );\n });\n}\n\nfunction isPotentiallyTrustworthyOrigin(url: URL): boolean {\n const originUrl = url.origin === 'null' ? url : new URL(url.origin);\n const protocol = originUrl.protocol;\n if (['https:', 'wss:', 'file:', 'chrome-extension:', 'moz-extension:'].includes(protocol)) {\n return true;\n }\n\n const hostname = originUrl.hostname.toLowerCase();\n const ipv4 = hostname.split('.');\n const isLoopbackIpv4 =\n ipv4.length === 4 &&\n ipv4.every((part) => /^\\d{1,3}$/u.test(part) && Number(part) <= 255) &&\n Number(ipv4[0]) === 127;\n return (\n hostname === '::1' ||\n hostname === '[::1]' ||\n hostname === 'localhost' ||\n hostname === 'localhost.' ||\n hostname.endsWith('.localhost') ||\n hostname.endsWith('.localhost.') ||\n isLoopbackIpv4\n );\n}\n\nexport function validatePotentiallyTrustworthyOrigins(\n origins: readonly string[] | undefined\n): void {\n for (const origin of origins ?? []) {\n let parsed: URL;\n try {\n parsed = new URL(origin);\n } catch {\n throw new DOMException(`Invalid or untrustworthy origin: ${String(origin)}`, 'SecurityError');\n }\n if (!isPotentiallyTrustworthyOrigin(parsed)) {\n throw new DOMException(`Invalid or untrustworthy origin: ${origin}`, 'SecurityError');\n }\n }\n}\n\nexport function validateWebMcpAccess(ownerDocument: Document | null): void {\n validateOriginAgentCluster();\n if (!ownerDocument) return;\n\n const DOMExceptionConstructor = ownerDocument.defaultView?.DOMException ?? DOMException;\n let fullyActive = false;\n try {\n const ownerWindow = ownerDocument.defaultView;\n fullyActive = Boolean(ownerWindow && ownerWindow.document === ownerDocument);\n } catch {\n // A navigated cross-origin WindowProxy is not the document's active window.\n }\n if (!fullyActive) {\n throw new DOMExceptionConstructor(\n 'The associated document is not fully active',\n 'InvalidStateError'\n );\n }\n\n const policy: unknown =\n Reflect.get(ownerDocument, 'permissionsPolicy') ?? Reflect.get(ownerDocument, 'featurePolicy');\n if (policy && typeof policy === 'object') {\n const features = Reflect.get(policy, 'features');\n const allowsFeature = Reflect.get(policy, 'allowsFeature');\n if (typeof features === 'function' && typeof allowsFeature === 'function') {\n const supported: unknown = Reflect.apply(features, policy, []);\n if (Array.isArray(supported) && supported.includes('tools')) {\n if (Reflect.apply(allowsFeature, policy, ['tools']) === true) return;\n throw new DOMExceptionConstructor(\n 'WebMCP is disabled by Permissions Policy',\n 'NotAllowedError'\n );\n }\n }\n }\n\n const ownerWindow = ownerDocument.defaultView;\n if (!ownerWindow || ownerWindow.parent === ownerWindow) return;\n try {\n void ownerWindow.parent.document;\n return;\n } catch {\n // Without native policy support, cross-origin frames fail closed.\n }\n throw new DOMExceptionConstructor(\n 'WebMCP in cross-origin frames requires native Permissions Policy support',\n 'NotAllowedError'\n );\n}\n\nexport function validateOriginAgentCluster(): void {\n if (globalThis.originAgentCluster === false && globalThis.location?.protocol !== 'file:') {\n throw new DOMException('', 'SecurityError');\n }\n}\n\nexport function validateExecutableOrigin(origin: unknown): void {\n try {\n if (new URL(String(origin)).origin !== 'null') return;\n } catch {\n // Invalid and opaque origins share the WebMCP NotSupportedError result.\n }\n throw new DOMException(`Unsupported tool origin: ${String(origin)}`, 'NotSupportedError');\n}\n\nfunction getStandardProps(value: unknown): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n return null;\n }\n\n const standard = value['~standard'];\n if (!isPlainObject(standard)) {\n return null;\n }\n\n return standard;\n}\n\nfunction isStandardInputValidatorSchema(value: unknown): value is StandardInputValidatorSchema {\n const standard = getStandardProps(value);\n return Boolean(standard && standard.version === 1 && typeof standard.validate === 'function');\n}\n\nfunction isStandardInputJsonSchema(value: unknown): value is StandardInputJsonSchema {\n const standard = getStandardProps(value);\n if (!standard || standard.version !== 1 || !isPlainObject(standard.jsonSchema)) {\n return false;\n }\n\n return typeof standard.jsonSchema.input === 'function';\n}\n\nfunction preserveStandardSchema(\n inputSchema: InputSchema,\n standardSchema: StandardInputValidatorSchema\n): InputSchema {\n const normalized = { ...inputSchema };\n Object.defineProperty(normalized, '~standard', {\n value: standardSchema['~standard'],\n });\n return normalized;\n}\n\nfunction convertStandardInputSchema(schema: StandardInputJsonSchema): InputSchema {\n for (const target of STANDARD_JSON_SCHEMA_TARGETS) {\n try {\n const converted = schema['~standard'].jsonSchema.input({ target });\n const serialized = serializeInputSchema(converted);\n const parsed: unknown = JSON.parse(serialized);\n if (!isPlainObject(parsed)) throw new TypeError('inputSchema must serialize to an object');\n return parsed;\n } catch {}\n }\n\n throw new Error('Failed to convert Standard JSON Schema inputSchema to a JSON Schema object');\n}\n\nexport function normalizeInputSchema(\n inputSchema: ToolInputSchema | undefined\n): NormalizedInputSchema {\n if (inputSchema === undefined) {\n return { inputSchema: DEFAULT_INPUT_SCHEMA };\n }\n\n if (isStandardInputJsonSchema(inputSchema)) {\n const converted = convertStandardInputSchema(inputSchema);\n const registeredInputSchema = serializeInputSchema(converted);\n return {\n inputSchema: isStandardInputValidatorSchema(inputSchema)\n ? preserveStandardSchema(converted, inputSchema)\n : converted,\n registeredInputSchema,\n };\n }\n\n if (isStandardInputValidatorSchema(inputSchema)) {\n throw new Error(\n 'Standard Schema inputSchema must provide ~standard.jsonSchema.input() for tool metadata'\n );\n }\n\n if (\n inputSchema === null ||\n (typeof inputSchema !== 'object' && typeof inputSchema !== 'function')\n ) {\n throw new TypeError('inputSchema must be an object');\n }\n const registeredInputSchema = serializeInputSchema(inputSchema);\n const serializedValue: unknown = JSON.parse(registeredInputSchema);\n const jsonSchema = isPlainObject(serializedValue) ? serializedValue : undefined;\n\n // Empty {} is valid JSON Schema but lacks type:\"object\" required by MCP.\n if (!jsonSchema || Object.keys(jsonSchema).length === 0) {\n return {\n inputSchema: DEFAULT_INPUT_SCHEMA,\n registeredInputSchema,\n };\n }\n\n const normalizedSchema: InputSchema =\n jsonSchema.type === undefined ? { type: 'object', ...jsonSchema } : jsonSchema;\n return {\n inputSchema: normalizedSchema,\n registeredInputSchema,\n };\n}\n\nexport function serializeInputSchema(schema: unknown): string {\n if (schema === null || (typeof schema !== 'object' && typeof schema !== 'function')) {\n throw new TypeError('inputSchema must be an object');\n }\n const serialized = JSON.stringify(schema);\n if (serialized === undefined) {\n throw new TypeError('inputSchema must be JSON-serializable');\n }\n return serialized;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/webmcp-polyfill",
3
- "version": "5.0.3",
3
+ "version": "5.1.0",
4
4
  "description": "Strict WebMCP core runtime polyfill for document.modelContext (with deprecated navigator.modelContext alias)",
5
5
  "keywords": [
6
6
  "browser",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@standard-schema/spec": "^1.1.0",
56
- "@mcp-b/webmcp-types": "5.0.3"
56
+ "@mcp-b/webmcp-types": "5.1.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@vitest/coverage-v8": "4.1.6",
60
- "playwright": "^1.60.0",
59
+ "@vitest/coverage-v8": "4.1.8",
60
+ "playwright": "^1.62.1",
61
61
  "typescript": "^5.8.3",
62
- "vite-plus": "0.1.22",
63
- "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.22"
62
+ "vite-plus": "0.1.24",
63
+ "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.24"
64
64
  },
65
65
  "engines": {
66
66
  "node": ">=20"