auto-webmcp 0.3.17 → 0.3.18

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,2 +1,2 @@
1
- "use strict";var AutoWebMCP=(()=>{var G=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Qe=Object.prototype.hasOwnProperty;var Ze=(e,t)=>{for(var o in t)G(e,o,{get:t[o],enumerable:!0})},et=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Xe(t))!Qe.call(e,i)&&i!==o&&G(e,i,{get:()=>t[i],enumerable:!(n=Ye(t,i))||n.enumerable});return e};var tt=e=>et(G({},"__esModule",{value:!0}),e);var Jt={};Ze(Jt,{autoWebMCP:()=>Ge});function de(e){let t=e?.paramBinding?.strict??!1,o=t?!1:e?.paramBinding?.enableAliasResolution??!0;return{exclude:e?.exclude??[],autoSubmit:e?.autoSubmit??!1,declarativeMode:e?.declarativeMode??"skip",paramBinding:{strict:t,enableAliasResolution:o},execution:{timeoutMs:Math.max(100,e?.execution?.timeoutMs??15e3)},overrides:e?.overrides??{},debug:e?.debug??!1}}var _=["textbox","combobox","checkbox","radio","switch","spinbutton","searchbox","slider"];function X(e){return e instanceof HTMLInputElement?nt(e):e instanceof HTMLTextAreaElement?{type:"string"}:e instanceof HTMLSelectElement?it(e):null}function nt(e){switch(e.type.toLowerCase()){case"text":case"search":case"tel":return Y(e);case"email":return{...Y(e),format:"email"};case"url":return{...Y(e),format:"uri"};case"number":case"range":{let o={type:"number"};return e.min!==""&&(o.minimum=parseFloat(e.min)),e.max!==""&&(o.maximum=parseFloat(e.max)),o}case"date":return{type:"string",format:"date"};case"datetime-local":return{type:"string",format:"date-time"};case"time":return{type:"string",format:"time"};case"month":return{type:"string",pattern:"^\\d{4}-\\d{2}$"};case"week":return{type:"string",pattern:"^\\d{4}-W\\d{2}$"};case"color":return{type:"string",pattern:"^#[0-9a-fA-F]{6}$"};case"checkbox":return{type:"boolean"};case"radio":return{type:"string"};case"file":case"hidden":case"submit":case"reset":case"button":case"image":return null;case"password":return null;default:return{type:"string"}}}function Y(e){let t={type:"string"};e.minLength>0&&(t.minLength=e.minLength),e.maxLength>0&&e.maxLength!==524288&&(t.maxLength=e.maxLength),e.pattern&&(t.pattern=e.pattern);let o=e.getAttribute("list");if(o){let n=e.ownerDocument.getElementById(o);if(n instanceof HTMLDataListElement){let i=Array.from(n.options).filter(s=>!s.disabled&&s.value.trim()!=="");i.length>0&&(t.enum=i.map(s=>s.value.trim()),t.oneOf=i.map(s=>({const:s.value.trim(),title:s.textContent?.trim()||s.value.trim()})))}}return t}var ot=/^(select|choose|pick)\b|^--+|---/i;function fe(e){return e.disabled?!0:e.value!==""?!1:ot.test(e.text.trim())}function it(e){let t=[],o=[];for(let n of Array.from(e.children))if(n instanceof HTMLOptGroupElement){if(n.disabled)continue;let i=n.label?.trim()??"";for(let s of Array.from(n.children)){if(!(s instanceof HTMLOptionElement)||fe(s))continue;t.push(s.value);let r={const:s.value,title:s.text.trim()||s.value};i&&(r.group=i),o.push(r)}}else if(n instanceof HTMLOptionElement){if(fe(n))continue;t.push(n.value),o.push({const:n.value,title:n.text.trim()||n.value})}return t.length===0?{type:"string"}:e.multiple?{type:"array",items:{type:"string",enum:t}}:{type:"string",enum:t,oneOf:o}}function pe(e,t){return Array.from(e.elements).filter(o=>o instanceof HTMLInputElement&&o.type==="checkbox"&&o.name===t).map(o=>o.value).filter(o=>o!==""&&o!=="on")}function ge(e,t){return Array.from(e.elements).filter(n=>n instanceof HTMLInputElement&&n.type==="radio"&&n.name===t).map(n=>n.value).filter(n=>n!=="")}function be(e,t){return Array.from(e.elements).filter(n=>n instanceof HTMLInputElement&&n.type==="radio"&&n.name===t).filter(n=>n.value!=="").map(n=>{let i=rt(n);return{const:n.value,title:i||n.value}})}function Ee(e,t){switch(t){case"checkbox":case"switch":return{type:"boolean"};case"spinbutton":case"slider":{let o={type:"number"},n=e.getAttribute("aria-valuemin"),i=e.getAttribute("aria-valuemax");return n!==null&&(o.minimum=parseFloat(n)),i!==null&&(o.maximum=parseFloat(i)),o}case"combobox":{let o=e.getAttribute("aria-owns")??e.getAttribute("aria-controls");if(o){let n=document.getElementById(o);if(n){let i=Array.from(n.querySelectorAll('[role="option"]')).filter(s=>s.getAttribute("aria-disabled")!=="true");if(i.length>0){let s=i.map(c=>(c.getAttribute("data-value")??c.textContent??"").trim()).filter(Boolean),r=i.map(c=>({const:(c.getAttribute("data-value")??c.textContent??"").trim(),title:(c.textContent??"").trim()}));return{type:"string",enum:s,oneOf:r}}}}return{type:"string"}}case"textbox":case"searchbox":case"radio":default:return{type:"string"}}}function rt(e){let t=e.closest("label");if(t){let o=t.cloneNode(!0);o.querySelectorAll("input, select, textarea, button").forEach(i=>i.remove());let n=o.textContent?.trim()??"";if(n)return n}if(e.id){let o=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(o){let n=o.textContent?.trim()??"";if(n)return n}}return""}var Te=0;function ye(e,t){let o=t?.name??st(e),n=t?.description??lt(e),{schema:i,fieldElements:s}=ft(e),r=ut(e);return{name:o,description:n,inputSchema:i,annotations:r,fieldElements:s}}function st(e){let t=e.getAttribute("toolname");if(t)return h(t);let o=e.dataset.webmcpName;if(o)return h(o);let n=Q(e);if(n)return h(n);let i=Me(e);if(i)return h(i);if(e.id)return h(e.id);if(e.name)return h(e.name);if(e.action){let s=at(e.action);if(s)return h(s)}return`form_${++Te}`}function h(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64)||"form"}function Q(e){let t=[...Array.from(e.querySelectorAll('button[type="submit"], button:not([type])')),...Array.from(e.querySelectorAll('input[type="submit"]'))];for(let o of t){let n=o instanceof HTMLInputElement?o.value.trim():o.textContent?.trim()??"";if(n&&n.length>0&&n.length<80)return n}return""}function Me(e){let t=e;for(;t;){let o=t.previousElementSibling;for(;o;){if(/^H[1-3]$/i.test(o.tagName)){let n=o.textContent?.trim()??"";if(n)return n}o=o.previousElementSibling}if(t=t.parentElement,!t||t===document.body)break}return""}function at(e){try{let o=new URL(e,window.location.href).pathname.split("/").filter(Boolean);return o[o.length-1]??""}catch{return""}}function lt(e){let t=e.getAttribute("tooldescription");if(t)return t.trim();let o=e.dataset.webmcpDescription;if(o)return o.trim();let n=e.querySelector("legend");if(n?.textContent?.trim())return n.textContent.trim();let i=e.getAttribute("aria-label");if(i?.trim())return i.trim();let s=e.getAttribute("aria-describedby");if(s){let a=document.getElementById(s);if(a?.textContent?.trim())return a.textContent.trim()}let r=Me(e),c=document.title?.trim();return r&&c?`${r}: ${c}`:r||c||"Submit form"}var we=/^(search|find|look|filter|browse|view|show|check|preview|get|fetch|retrieve|load)\b/i,Le=/^(delete|remove|cancel|terminate|destroy|purge|revoke|unsubscribe|deactivate)\b/i,ct=/\/(delete|remove|cancel|destroy)\b/i;function ut(e){let t={};if(e.dataset.webmcpReadonly!==void 0&&(t.readOnlyHint=e.dataset.webmcpReadonly!=="false"),e.dataset.webmcpDestructive!==void 0&&(t.destructiveHint=e.dataset.webmcpDestructive!=="false"),e.dataset.webmcpIdempotent!==void 0&&(t.idempotentHint=e.dataset.webmcpIdempotent!=="false"),e.dataset.webmcpOpenworld!==void 0&&(t.openWorldHint=e.dataset.webmcpOpenworld!=="false"),t.readOnlyHint===void 0){let n=e.method.toLowerCase()==="get",i=Q(e),s=i?we.test(i.trim()):!1;(n||s)&&(t.readOnlyHint=!0)}if(t.destructiveHint===void 0){let n=Q(e),i=n?Le.test(n.trim()):!1,s=e.action?ct.test(e.action):!1;(i||s)&&(t.destructiveHint=!0)}return t.idempotentHint===void 0&&(t.readOnlyHint===!0||e.method.toLowerCase()==="get")&&(t.idempotentHint=!0),t.openWorldHint===void 0&&(t.openWorldHint=t.readOnlyHint!==!0),t.readOnlyHint===!0||t.destructiveHint===!0||t.idempotentHint===!0||t.openWorldHint===!1?t:{}}function mt(e){if(e instanceof HTMLInputElement){let t=e.type.toLowerCase();return t==="checkbox"?e.checked?!0:void 0:t==="radio"?void 0:t==="number"||t==="range"?e.value!==""?parseFloat(e.value):void 0:e.value!==""?e.value:void 0}if(e instanceof HTMLTextAreaElement)return e.value!==""?e.value:void 0;if(e instanceof HTMLSelectElement){if(e.multiple){let t=Array.from(e.options).filter(o=>o.selected).map(o=>o.value);return t.length>0?t:void 0}return e.value!==""?e.value:void 0}}function xe(e,t=new Set){if(t.has(e))return[];t.add(e);let o=[];for(let n of Array.from(e.querySelectorAll("*")))if(n.shadowRoot){let i=Array.from(n.shadowRoot.querySelectorAll("input, textarea, select"));i.length>0&&console.log(`[auto-webmcp] shadow: found ${i.length} control(s) in ${n.tagName.toLowerCase()} shadow root:`,i.map(s=>`${s.tagName.toLowerCase()}[type=${s.type??"?"}][name="${s.name}"][id="${s.id}"]`)),o.push(...i,...xe(n.shadowRoot,t))}return o}function dt(e){let t=Array.from(e.elements).filter(n=>n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement),o=new Set(t);for(let n of xe(e))o.has(n)||(t.push(n),o.add(n));return t}function ft(e){let t={},o=[],n=new Map,i=new Set,s=new Set,r=dt(e);for(let l of r){let u=l.name,d=u||Ae(l);if(!d)continue;if(l instanceof HTMLInputElement&&l.type==="radio"){if(i.has(d))continue;i.add(d)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){if(s.has(d))continue;s.add(d)}let m=X(l);if(!m||!ee(l))continue;m.title=ve(l);let E=Se(l);E&&(m.description=E);let p=mt(l);if(p!==void 0&&(m.default=p),l instanceof HTMLInputElement&&l.type==="radio"){m.enum=ge(e,d);let w=be(e,d);w.length>0&&(m.oneOf=w);let f=Array.from(e.elements).find(g=>g instanceof HTMLInputElement&&g.type==="radio"&&g.name===d&&g.checked);f?.value&&(m.default=f.value)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){let w=pe(e,d);if(w.length>1){let f={type:"array",items:{type:"string",enum:w},title:m.title};m.description&&(f.description=m.description);let g=Array.from(e.elements).filter(T=>T instanceof HTMLInputElement&&T.type==="checkbox"&&T.name===d&&T.checked).map(T=>T.value);g.length>0&&(f.default=g),t[d]=f,l.required&&o.push(d);continue}}t[d]=m,u||n.set(d,l);let y=l.required;if(!y){let w=l;for(;;){let f=w.getRootNode();if(!(f instanceof ShadowRoot))break;let g=f.host;if(g.hasAttribute("required")||g.getAttribute("aria-required")==="true"){y=!0;break}w=g}}y&&o.push(d)}let c=bt(e),a=new Set;for(let{el:l,role:u,key:d,enumValues:m,enumOneOf:E}of c){if(t[d])continue;if(u==="radio"){if(a.has(d))continue;a.add(d)}let p=Ee(l,u);m&&m.length>0&&(p.enum=m,E&&E.length>0&&(p.oneOf=E)),p.title=Et(l);let y=ht(l);y&&(p.description=y),t[d]=p,n.set(d,l),l.getAttribute("aria-required")==="true"&&o.push(d)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:o},fieldElements:n}}var He=/^_r_[0-9a-z]+_$|^:[a-z0-9]+:$/i;function Ae(e){let t=e;if(t.dataset.webmcpName)return h(t.dataset.webmcpName);if(e.id&&!He.test(e.id))return h(e.id);let o=e.getAttribute("aria-label");if(o)return h(o);if((e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim())return h(e.placeholder.trim());let n=pt(e);return n||(e instanceof HTMLInputElement&&e.type!=="text"?e.type:null)}function pt(e){let t=e;for(;;){let o=t.getRootNode();if(!(o instanceof ShadowRoot))break;let n=o.host,i=n.getAttribute("field-name");if(i)return console.log("[auto-webmcp] shadow host key: field-name=",i),h(i);let s=n.getAttribute("label")||n.getAttribute("aria-label");if(s)return console.log("[auto-webmcp] shadow host key: label=",s),h(s);let r=n.getAttribute("name");if(r)return console.log("[auto-webmcp] shadow host key: name=",r),h(r);t=n}return null}function gt(e){if(e.dataset.webmcpName)return h(e.dataset.webmcpName);if(e.id&&!He.test(e.id))return h(e.id);let t=e.getAttribute("aria-label");if(t)return h(t);let o=e.getAttribute("placeholder");return o?h(o):null}function bt(e){let t=_.map(a=>`[role="${a}"]`).join(", "),o=[];for(let a of Array.from(e.querySelectorAll(t))){if(a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement||a instanceof HTMLSelectElement||a.getAttribute("aria-hidden")==="true"||a.hidden)continue;let l=a.getAttribute("role"),u=he(a);u&&o.push({el:a,role:l,key:u})}let n=o.filter(a=>a.role==="radio"),i=o.filter(a=>a.role!=="radio"),s=new Map,r=[];for(let a of n){let l=a.el.closest('[role="radiogroup"]');l?(s.has(l)||s.set(l,[]),s.get(l).push(a.el)):r.push(a)}let c=[];for(let[a,l]of s){let u=he(a);if(!u)continue;let d=l.map(E=>(E.getAttribute("data-value")??E.getAttribute("aria-label")??E.textContent??"").trim()).filter(Boolean),m=l.map(E=>{let p=(E.getAttribute("data-value")??E.getAttribute("aria-label")??E.textContent??"").trim(),y=(E.getAttribute("aria-label")??E.textContent??"").trim();return{const:p,title:y||p}}).filter(E=>E.const!=="");d.length>0&&c.push({el:a,role:"radio",key:u,enumValues:d,enumOneOf:m})}return[...i,...c,...r]}function he(e){let t=e;if(t.dataset?.webmcpName)return h(t.dataset.webmcpName);if(e.id)return h(e.id);let o=e.getAttribute("aria-label");if(o)return h(o);let n=e.getAttribute("aria-labelledby");if(n){let i=document.getElementById(n)?.textContent?.trim();if(i)return h(i)}return null}function Et(e){let t=e;if(t.dataset?.webmcpTitle)return t.dataset.webmcpTitle;let o=e.getAttribute("aria-label");if(o)return o.trim();let n=e.getAttribute("aria-labelledby");if(n){let i=document.getElementById(n)?.textContent?.trim();if(i)return i}return e.id?Z(e.id):""}function ht(e){let t=e.getAttribute("toolparamdescription");if(t)return t.trim();let o=e;if(o.dataset?.webmcpDescription)return o.dataset.webmcpDescription;let n=e.getAttribute("aria-description");if(n)return n;let i=e.getAttribute("aria-describedby");if(i){let r=document.getElementById(i)?.textContent?.trim();if(r)return r}let s=e.getAttribute("placeholder")??e.dataset?.placeholder;return s?s.trim():""}function ve(e){if("dataset"in e&&e.dataset.webmcpTitle)return e.dataset.webmcpTitle;let t=Tt(e);return t||(e.name?Z(e.name):e.id?Z(e.id):(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim()?e.placeholder.trim():"")}function Se(e){let t=e.getAttribute("toolparamdescription");if(t)return t.trim();let o=e;if(o.dataset.webmcpDescription)return o.dataset.webmcpDescription;let n=e.getAttribute("aria-description");if(n)return n;let i=e.getAttribute("aria-describedby");if(i){let s=document.getElementById(i);if(s?.textContent?.trim())return s.textContent.trim()}if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){let s=e.placeholder?.trim();if(s&&s.length>0)return s}return""}function Tt(e){if(e.id){let i=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(i){let s=W(i);if(s)return s}}let t=e.getRootNode();if(t instanceof ShadowRoot){if(e.id){let s=t.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(s){let r=W(s);if(r)return r}}let i=t.querySelector("label");if(i){let s=W(i);if(s)return s}}let o=e.closest("label");if(o){let i=W(o);if(i)return i}let n=e;for(;;){let i=n.getRootNode();if(!(i instanceof ShadowRoot))break;let s=i.host,r=s.getAttribute("label")||s.getAttribute("aria-label");if(r)return r;n=s}return""}function W(e){let t=e.cloneNode(!0);return t.querySelectorAll("input, select, textarea, button").forEach(o=>o.remove()),t.textContent?.trim()??""}function Z(e){return e.replace(/[-_]/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().replace(/\b\w/g,t=>t.toUpperCase())}function ee(e){let t=window.getComputedStyle(e);if(t.display==="none"||t.visibility==="hidden"||e.offsetParent===null&&t.position!=="fixed")return!1;let o=e;for(;o&&o!==document.body;){if(o.getAttribute("aria-hidden")==="true")return!1;o=o.parentElement}return!e.closest("fieldset")?.disabled}function Ce(e,t,o){let n=Mt(e,o),i=wt(e),{schema:s,fieldElements:r}=Lt(t),c=yt(o);return{name:n,description:i,inputSchema:s,annotations:c,fieldElements:r}}function yt(e){let t={},o=e instanceof HTMLInputElement?e.value.trim():e?.textContent?.trim()??"";return we.test(o)&&(t.readOnlyHint=!0,t.idempotentHint=!0),Le.test(o)&&(t.destructiveHint=!0),t.readOnlyHint!==!0&&(t.openWorldHint=!0),t.readOnlyHint===!0||t.destructiveHint===!0||t.idempotentHint===!0||t.openWorldHint===!1?t:{}}function Mt(e,t){if(t){let i=t instanceof HTMLInputElement?t.value.trim():t.textContent?.trim()??"";if(i&&i.length>0&&i.length<80)return h(i)}let o=ke(e);if(o)return h(o);let n=document.title?.trim();return n?h(n):`form_${++Te}`}function wt(e){let t=ke(e),o=document.title?.trim();return t&&o&&t!==o?`${t} on ${o}`:t||o||"Submit form"}function ke(e){let t=e.querySelector("h1, h2, h3");if(t?.textContent?.trim())return t.textContent.trim();let o=e;for(;o;){let n=o.previousElementSibling;for(;n;){if(/^H[1-3]$/i.test(n.tagName)){let i=n.textContent?.trim()??"";if(i)return i}n=n.previousElementSibling}if(o=o.parentElement,!o||o===document.body)break}return""}function Lt(e){let t={},o=[],n=new Map,i=new Set,s=new Set;for(let r of e){if(!(r instanceof HTMLInputElement)&&!(r instanceof HTMLTextAreaElement)&&!(r instanceof HTMLSelectElement)){let d=gt(r);if(!d||!ee(r))continue;let m={type:"string"};m.title=r.getAttribute("aria-label")??d;let E=(r.getAttribute("aria-description")??r.getAttribute("aria-describedby"),null);E&&(m.description=E),t[d]=m,n.set(d,r),o.push(d);continue}let c=r.name,a=(c?h(c):null)||Ae(r);if(!a)continue;if(r instanceof HTMLInputElement&&r.type==="radio"){if(i.has(a))continue;i.add(a)}if(r instanceof HTMLInputElement&&r.type==="checkbox"){if(s.has(a))continue;s.add(a)}let l=X(r);if(!l||!ee(r))continue;l.title=ve(r);let u=Se(r);if(u&&(l.description=u),r instanceof HTMLInputElement&&r.type==="checkbox"){let d=e.filter(m=>m instanceof HTMLInputElement&&m.type==="checkbox"&&m.name===a).map(m=>m.value).filter(m=>m!==""&&m!=="on");if(d.length>1){let m={type:"array",items:{type:"string",enum:d},title:l.title};l.description&&(m.description=l.description),t[a]=m,r.required&&o.push(a);continue}}t[a]=l,c||n.set(a,r),r.required&&o.push(a)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:o},fieldElements:n}}var C=new Map,te=new Map;function k(){return typeof navigator<"u"&&typeof navigator.modelContext<"u"}async function Re(e,t,o){if(!k())return;C.get(e)&&await O(e);let i={name:t.name,description:t.description,inputSchema:t.inputSchema,execute:o};t.annotations&&Object.keys(t.annotations).length>0&&(i.annotations=t.annotations);let s=new AbortController;te.set(e,s);try{await navigator.modelContext.registerTool(i,{signal:s.signal})}catch{try{await navigator.modelContext.unregisterTool?.(t.name),await navigator.modelContext.registerTool(i,{signal:s.signal})}catch{}}C.set(e,t.name)}async function O(e){if(!k())return;let t=C.get(e);if(!t)return;let o=te.get(e);o&&(o.abort(),te.delete(e));try{await navigator.modelContext.unregisterTool?.(t)}catch{}C.delete(e)}function ne(e){return C.get(e)}function J(){return Array.from(C.entries()).map(([e,t])=>({form:e,name:t}))}async function Ie(){let e=Array.from(C.entries());await Promise.all(e.map(([t])=>O(t)))}var A=new WeakMap,$=new WeakMap,R=new WeakMap,H=new WeakMap,x=new WeakMap,I=new WeakMap,xt=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value")?.set,Ht=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value")?.set,F=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked")?.set;function $e(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function S(e,t,o){if(!t)return;let n=$e(t);n&&(e.has(n)||e.set(n,new Set),e.get(n).add(o))}function At(e,t){let o=new Map,n=t?.inputSchema?.properties??{};for(let[i,s]of Object.entries(n)){S(o,i,i),S(o,i.replace(/_/g," "),i),S(o,s.title,i);let r=U(e,i),c=t?.fieldElements?.get(i),a=r??c??null;if(!a)continue;let l=a;if(S(o,l.getAttribute("id"),i),S(o,l.getAttribute("name"),i),S(o,l.getAttribute("aria-label"),i),S(o,l.getAttribute("placeholder"),i),a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement||a instanceof HTMLSelectElement)for(let u of Array.from(a.labels??[]))S(o,u.textContent?.trim(),i)}return o}function vt(e,t,o,n){let i={},s=[],r=o?.inputSchema?.properties??{},c=n.paramBinding.enableAliasResolution;for(let[l,u]of Object.entries(t))l in r&&(i[l]=u);if(!c)return{resolved:i,warnings:s};let a=At(e,o);for(let[l,u]of Object.entries(t)){if(l in r)continue;let d=a.get($e(l));if(!d||d.size!==1)continue;let m=Array.from(d)[0];!m||m in i||(i[m]=u,s.push({field:m,type:"alias_resolved",original:l,message:`resolved "${l}" to schema field "${m}"`}))}return{resolved:i,warnings:s}}function St(e){let t=[],o=Array.from(e.elements).filter(n=>n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement);for(let n of o){if(!n.willValidate||n.checkValidity())continue;let i=n.name||n.id||n.getAttribute("aria-label")||"unknown_field";t.push({field:i,type:"blocked_submit",message:n.validationMessage||`field "${i}" failed validation`})}return t}function Be(e,t,o,n){return n?.fieldElements&&R.set(e,n.fieldElements),Fe(e,o),async(i,s)=>{let r=s;if(t.autoSubmit&&n?.annotations?.destructiveHint===!0&&typeof r?.requestUserInteraction=="function"&&!await r.requestUserInteraction(async()=>new Promise(d=>{let m=window.confirm(`Agent requested a destructive action via "${o}". Continue?`);d(m)})))return window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:o}})),{content:[{type:"text",text:`Cancelled "${o}" by user.`}]};x.set(e,[]),H.delete(e);let{resolved:c,warnings:a}=vt(e,i,n,t);a.length>0&&x.set(e,[...x.get(e)??[],...a]),oe(e,c);let l=kt(n,c);return l.length>0&&H.set(e,l),window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:o}})),new Promise((u,d)=>{let m=t.execution.timeoutMs,E=setTimeout(()=>{if(!A.get(e))return;A.delete(e);let y=t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0?"timed_out":"awaiting_user_action",w={field:"__form__",type:"timeout",message:y==="timed_out"?`tool execution timed out after ${m}ms`:`waiting for user submit (timed out after ${m}ms)`},f={status:y,filled_fields:ae(e,$.get(e),R.get(e)),skipped_fields:[],missing_required:H.get(e)??[],warnings:[...x.get(e)??[],w]};H.delete(e),x.delete(e),I.delete(e),u({content:[{type:"text",text:w.message},{type:"text",text:JSON.stringify(f)}]})},m);A.set(e,{resolve:u,reject:d,timeoutId:E}),(t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0)&&Oe(e).then(async()=>{try{oe(e,c);for(let y=0;y<2&&Ct(e,c,R.get(e)).length!==0;y++)oe(e,c),await Oe(e,400,100);let p=e;if(!e.isConnected){let w=document.querySelector('button[type="submit"]:not([disabled]), input[type="submit"]:not([disabled])')?.closest("form");if(w){p=w;let f=A.get(e),g=f?.timeoutId?{resolve:u,reject:d,timeoutId:f.timeoutId}:{resolve:u,reject:d};A.set(p,g),Fe(p,o)}}if(p!==e&&H.has(e)&&(H.set(p,H.get(e)),H.delete(e)),!p.checkValidity()){let y=A.get(p)??A.get(e);if(y){y.timeoutId&&clearTimeout(y.timeoutId),A.delete(p),A.delete(e);let w=[...x.get(p)??x.get(e)??[],...St(p)];x.delete(p),x.delete(e);let f={status:"blocked_invalid",filled_fields:ae(p,$.get(p)??$.get(e),R.get(p)??R.get(e)),skipped_fields:[],missing_required:H.get(p)??H.get(e)??[],warnings:w};H.delete(p),H.delete(e),I.delete(p),I.delete(e),u({content:[{type:"text",text:"Form submission blocked by native validation."},{type:"text",text:JSON.stringify(f)}]})}return}p.requestSubmit()}catch(p){d(p instanceof Error?p:new Error(String(p)))}})})}}function Fe(e,t){e.__awmcp_intercepted||(e.__awmcp_intercepted=!0,e.addEventListener("submit",o=>{let n=A.get(e);if(!n)return;let{resolve:i}=n;n.timeoutId&&clearTimeout(n.timeoutId),A.delete(e);let s=ae(e,$.get(e),R.get(e));I.delete(e);let r=H.get(e)??[];H.delete(e);let c=x.get(e)??[];x.delete(e);let a=c.filter(p=>p.type==="not_filled").map(p=>p.field),l={status:r.length>0||a.length>0?"partial":"success",filled_fields:s,skipped_fields:a,missing_required:r,warnings:[...r.map(p=>({field:p,type:"missing_required",message:`required field "${p}" was not provided`})),...c]},u=[...r.length?[`required fields were not filled: ${r.join(", ")}`]:[],...c.map(p=>p.message)],d=u.length?` Note: ${u.join("; ")}.`:"",E={content:[{type:"text",text:`Form submitted. Fields: ${JSON.stringify(s)}${d}`},{type:"text",text:JSON.stringify(l)}]};o.agentInvoked&&typeof o.respondWith=="function"&&(o.preventDefault(),o.respondWith(Promise.resolve(E))),i(E)}),e.addEventListener("reset",()=>{I.delete(e),window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:t}}))}))}function B(e,t){if(e.focus(),e.select?.(),document.execCommand("insertText",!1,t)&&e.value===t)return;let o=e instanceof HTMLTextAreaElement?Ht:xt;o?o.call(e,t):e.value=t,e.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:t})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function ie(e,t){F?F.call(e,t):e.checked=t,e.dispatchEvent(new Event("change",{bubbles:!0}))}function j(e,t){for(let o of Array.from(e.querySelectorAll("*"))){let n=o.shadowRoot;if(!n)continue;let i=n.querySelector(t);if(i)return i;let s=j(n,t);if(s)return s}return null}function re(e,t,o){return Array.from(e.elements).filter(n=>n instanceof HTMLInputElement&&n.type===t&&n.name===o)}function U(e,t){let o=e.elements.namedItem(t);if(typeof o=="object"&&o!==null&&(o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement||o instanceof HTMLSelectElement))return o;if(o instanceof RadioNodeList){let r=o[0];if(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement)return r}let n=CSS.escape(t),i=e.querySelector(`[name="${n}"]`)??e.querySelector(`input#${n}, textarea#${n}, select#${n}`);return i||(j(document,`[name="${n}"]`)??j(document,`input#${n}, textarea#${n}, select#${n}`))}function oe(e,t){$.set(e,t);let o=R.get(e),n={};for(let[i,s]of Object.entries(t)){let r=U(e,i);if(r){r instanceof HTMLInputElement?(_e(r,e,i,s),r.type==="checkbox"?Array.isArray(s)?n[i]=re(e,"checkbox",i).filter(a=>a.checked).map(a=>a.value):n[i]=r.checked:n[i]=r.value):r instanceof HTMLTextAreaElement?(B(r,String(s??"")),n[i]=r.value):r instanceof HTMLSelectElement&&(se(r,s,e,i),n[i]=r.multiple?Array.from(r.options).filter(a=>a.selected).map(a=>a.value):r.value);continue}let c=o?.get(i);if(c){let a=c;if(!c.isConnected){let l=c.id;if(l){let u=document.getElementById(l)??j(document,`#${CSS.escape(l)}`);u&&(a=u)}}a instanceof HTMLInputElement?(_e(a,e,i,s),n[i]=a.type==="checkbox"?a.checked:a.value):a instanceof HTMLTextAreaElement?(B(a,String(s??"")),n[i]=a.value):a instanceof HTMLSelectElement?(se(a,s,e,i),n[i]=a.multiple?Array.from(a.options).filter(l=>l.selected).map(l=>l.value):a.value):(Pe(a,s),n[i]=s)}}I.set(e,n),window.__lastFillWarnings=x.get(e)??[]}function _e(e,t,o,n){let i=e.type.toLowerCase();if(i==="checkbox"){if(Array.isArray(n)){let s=re(t,"checkbox",o);for(let r of s)ie(r,n.map(String).includes(r.value));return}ie(e,!!n);return}if(i==="number"||i==="range"){let s=String(n??""),r=Number(s);if(s===""||isNaN(r)){x.get(t)?.push({field:o,type:"type_mismatch",message:`"${o}" expects a number, got: ${JSON.stringify(n)}`,original:n});return}let c=e.min!==""?parseFloat(e.min):-1/0,a=e.max!==""?parseFloat(e.max):1/0;if(r<c||r>a){let l=Math.min(Math.max(r,c),a);x.get(t)?.push({field:o,type:"clamped",message:`"${o}" value ${r} is outside allowed range [${e.min||"?"}, ${e.max||"?"}], clamped to ${l}`,original:r,actual:l}),e.value=String(l)}else e.value=String(r);e.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:String(r)})),e.dispatchEvent(new Event("change",{bubbles:!0}));return}if(i==="radio"){let s=re(t,"radio",o);for(let r of s)if(r.value===String(n)){F?F.call(r,!0):r.checked=!0,r.dispatchEvent(new Event("change",{bubbles:!0}));break}return}B(e,String(n??""))}function se(e,t,o,n){if(e.multiple){let s=Array.isArray(t)?t.map(String):[String(t??"")];for(let r of Array.from(e.options))r.selected=s.includes(r.value);e.dispatchEvent(new Event("change",{bubbles:!0}));return}let i=String(t??"");if(e.value=i,e.value!==i){let s=i.toLowerCase(),r=Array.from(e.options).find(c=>c.text.trim().toLowerCase()===s||c.label.trim().toLowerCase()===s);r?e.value=r.value:o&&n&&x.get(o)?.push({field:n,type:"not_filled",message:`"${n}" value "${i}" did not match any option in the select`,original:i})}e.dispatchEvent(new Event("change",{bubbles:!0}))}function Pe(e,t){let o=e.getAttribute("role");if(o==="checkbox"||o==="switch"){e.setAttribute("aria-checked",String(!!t)),e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));return}if(o==="radio"){e.setAttribute("aria-checked","true"),e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));return}if(o==="radiogroup"){let i=Array.from(e.querySelectorAll('[role="radio"]'));for(let s of i)if((s.getAttribute("data-value")??s.getAttribute("aria-label")??s.textContent??"").trim()===String(t)){s.setAttribute("aria-checked","true"),s.dispatchEvent(new MouseEvent("click",{bubbles:!0}));for(let c of i)c!==s&&c.setAttribute("aria-checked","false");break}return}let n=e;if(console.log("[auto-webmcp] fillAriaField",{tag:e.tagName,role:o,isContentEditable:n.isContentEditable,id:e.id,ariaLabel:e.getAttribute("aria-label"),textContentBefore:(n.textContent??"").slice(0,80)}),n.isContentEditable){n.focus();let i=document.createRange();i.selectNodeContents(n);let s=window.getSelection();s?.removeAllRanges(),s?.addRange(i);let r=String(t??"");console.log("[auto-webmcp] fillAriaField: text to insert:",JSON.stringify(r));let c=!1;try{let a=new DataTransfer;a.setData("text/plain",r),n.dispatchEvent(new ClipboardEvent("paste",{bubbles:!0,cancelable:!0,composed:!0,clipboardData:a})),c=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S1 paste result:",c,JSON.stringify((n.textContent??"").slice(0,80)))}catch(a){console.log("[auto-webmcp] fillAriaField: S1 paste threw:",a)}if(!c){let a=document.execCommand("insertText",!1,r);c=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S2 execCommand result:",a,"inserted:",c,JSON.stringify((n.textContent??"").slice(0,80)))}if(!c)try{n.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,composed:!0,inputType:"insertText",data:r})),c=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S3 beforeinput result:",c,JSON.stringify((n.textContent??"").slice(0,80)))}catch(a){console.log("[auto-webmcp] fillAriaField: S3 beforeinput threw:",a)}if(!c){n.textContent=r;let a=document.createRange();a.selectNodeContents(n),a.collapse(!1),s?.removeAllRanges(),s?.addRange(a),console.log("[auto-webmcp] fillAriaField: S4 textContent assignment done, textContent:",JSON.stringify((n.textContent??"").slice(0,80)))}n.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:r})),console.log("[auto-webmcp] fillAriaField: done, final textContent:",JSON.stringify((n.textContent??"").slice(0,80)))}else console.log("[auto-webmcp] fillAriaField: not contentEditable, dispatching input/change only"),e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function ae(e,t,o){let n={},i=new FormData(e),s=I.get(e);for(let[r,c]of i.entries())if(n[r]!==void 0){let a=n[r];Array.isArray(a)?a.push(c):n[r]=[a,c]}else n[r]=c;if(t)for(let r of Object.keys(t)){if(r in n)continue;if(s&&r in s){n[r]=s[r];continue}let c=U(e,r)??o?.get(r)??null;if(c)if(c instanceof HTMLInputElement&&c.type==="checkbox")n[r]=c.checked;else if(c instanceof HTMLInputElement||c instanceof HTMLTextAreaElement||c instanceof HTMLSelectElement)n[r]=c.value;else{let a=c.getAttribute("role");a==="checkbox"||a==="switch"?n[r]=c.getAttribute("aria-checked")==="true":n[r]=c.textContent?.trim()??""}}return n}function Ne(e,t){if(e instanceof HTMLInputElement){let o=e.type.toLowerCase();o==="checkbox"?ie(e,!!t):o==="radio"?e.value===String(t)&&(F?F.call(e,!0):e.checked=!0,e.dispatchEvent(new Event("change",{bubbles:!0}))):B(e,String(t??""))}else e instanceof HTMLTextAreaElement?B(e,String(t??"")):e instanceof HTMLSelectElement?se(e,t):Pe(e,t)}function Oe(e,t=800,o=150){return new Promise(n=>{let i=!1,s=null,r=()=>{i||(i=!0,c.disconnect(),s!==null&&clearTimeout(s),n())},c=new MutationObserver(()=>{s!==null&&clearTimeout(s),s=setTimeout(r,o)});c.observe(e,{childList:!0,subtree:!0,attributes:!0,characterData:!0}),setTimeout(r,t),s=setTimeout(r,o)})}function Ct(e,t,o){let n=[];for(let[i,s]of Object.entries(t)){let r=U(e,i)??o?.get(i)??null;r&&(r instanceof HTMLInputElement&&r.type==="checkbox"?r.checked!==!!s&&n.push(i):(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement)&&r.value!==String(s??"")&&n.push(i))}return n}function kt(e,t){return e?.inputSchema?.required?.length?e.inputSchema.required.filter(o=>!(o in t)):[]}async function qe(e,t){let o=String(t??"").trim();console.log("[auto-webmcp] fillComboboxButton: clicking button, value=",JSON.stringify(o)),e.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}));let n=await new Promise(c=>{let a=Date.now()+1e3,l=()=>{let u=document.querySelector('[role="listbox"]')??document.querySelector('[role="option"]')?.closest('[role="listbox"]')??null;if(u){c(u);return}if(Date.now()>=a){c(null);return}setTimeout(l,50)};l()});if(!n){console.warn("[auto-webmcp] fillComboboxButton: listbox did not appear after 1s");return}let i=Array.from(n.querySelectorAll('[role="option"]'));console.log("[auto-webmcp] fillComboboxButton: listbox has",i.length,"options");let s=o.toLowerCase(),r=i.find(c=>{let a=(c.getAttribute("data-value")??"").toLowerCase(),l=(c.getAttribute("aria-label")??"").toLowerCase(),u=(c.textContent??"").trim().toLowerCase();return a===s||l===s||u===s});r?(console.log("[auto-webmcp] fillComboboxButton: clicking option",r.textContent?.trim()),r.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))):console.warn("[auto-webmcp] fillComboboxButton: no option matched",JSON.stringify(o),"available:",i.map(c=>c.textContent?.trim()))}function Je(e,t,o){window.dispatchEvent(new CustomEvent(e,{detail:{form:t,toolName:o}}))}function Rt(e,t){if(e.dataset.noWebmcp!==void 0)return!0;for(let o of t.exclude)try{if(e.matches(o))return!0}catch{}return!1}function De(e,t){let o=`_${t}`;return`${e.slice(0,Math.max(1,64-o.length))}${o}`}function It(e){let t=new Set(z);for(let{form:o,name:n}of J())e&&o===e||t.add(n);return t}function je(e,t){let o=It(t);if(!o.has(e))return e;let n=2,i=De(e,n);for(;o.has(i);)n++,i=De(e,n);return i}function Ft(e){return!!e.getAttribute("toolname")?.trim().length}async function N(e,t){if(Rt(e,t))return;let o=ne(e);if(Ft(e)&&t.declarativeMode!=="force"){if(o&&await O(e),t.debug){let l=t.declarativeMode;console.log(`[auto-webmcp] Skipping imperative registration for native declarative form (mode=${l})`)}return}let n;for(let[l,u]of Object.entries(t.overrides))try{if(e.matches(l)){n=u;break}}catch{}let i=ye(e,n),s=je(i.name,e);s!==i.name&&t.debug&&console.warn(`[auto-webmcp] tool name collision: "${i.name}" renamed to "${s}"`),i.name=s,t.debug&&Wt(i.name,i.description);let r=Be(e,t,i.name,i);await Re(e,i,r),D.add(e),Ue++;let c=e.querySelector('[type="submit"], button[data-variant="primary"], button:not([type])')??null,a=window.__pendingSubmitBtns??={};o&&o!==i.name&&delete a[o],a[i.name]=c,t.debug&&console.log(`[auto-webmcp] Registered: ${i.name}`,i),Je("form:registered",e,i.name)}async function _t(e,t){let o=ne(e);if(!o)return;await O(e),D.delete(e);let n=window.__pendingSubmitBtns;n&&delete n[o],t.debug&&console.log(`[auto-webmcp] Unregistered: ${o}`),Je("form:unregistered",e,o)}var q=null,D=new WeakSet,Ue=0,le=new Map,Ot=300,V=null,$t=500,z=new Set;function We(e){V&&clearTimeout(V),V=setTimeout(()=>{V=null,Ve(e)},$t)}function ce(e){let t=e.tagName.toLowerCase();if(t==="input"||t==="textarea"||t==="select")return!0;let o=e.getAttribute("role");if(o&&_.includes(o)||e.querySelector("input, textarea, select"))return!0;for(let n of _)if(e.querySelector(`[role="${n}"]`))return!0;return!1}function ue(e,t){let o=le.get(e);o&&clearTimeout(o),le.set(e,setTimeout(()=>{le.delete(e),N(e,t)},Ot))}function Bt(e,t){let o=document.getElementById(e);o instanceof HTMLFormElement&&D.has(o)&&ue(o,t)}function Pt(e){let t=e.closest("form");if(t instanceof HTMLFormElement)return t;let o=e.form;if(o instanceof HTMLFormElement)return o;let n=e.getAttribute("form");if(n){let i=document.getElementById(n);if(i instanceof HTMLFormElement)return i}return null}function Nt(e){q||(q=new MutationObserver(t=>{for(let o of t){if(o.type==="attributes"&&o.target instanceof Element){let n=o.target,i=Pt(n);i&&D.has(i)?ue(i,e):n instanceof HTMLFormElement?N(n,e):ce(n)&&!n.closest("form")&&We(e),o.attributeName==="form"&&o.oldValue&&Bt(o.oldValue,e);continue}for(let n of o.addedNodes){if(!(n instanceof Element))continue;if(n instanceof HTMLFormElement){N(n,e);continue}let i=n.closest("form");i instanceof HTMLFormElement&&D.has(i)&&ce(n)&&ue(i,e);for(let s of Array.from(n.querySelectorAll("form")))N(s,e);ce(n)&&!n.closest("form")&&We(e)}for(let n of o.removedNodes){if(!(n instanceof Element))continue;let i=n instanceof HTMLFormElement?[n]:Array.from(n.querySelectorAll("form"));for(let s of i)_t(s,e)}}}),q.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeOldValue:!0}))}function qt(e){window.addEventListener("hashchange",()=>P(e));let t={pushState:history.pushState.bind(history),replaceState:history.replaceState.bind(history)};history.pushState=function(...o){t.pushState(...o),P(e)},history.replaceState=function(...o){t.replaceState(...o),P(e)},window.addEventListener("popstate",()=>P(e))}async function P(e){let t=Array.from(document.querySelectorAll("form"));await Promise.allSettled(t.map(o=>N(o,e)))}var Dt=new Set(["password","hidden","file","submit","reset","button","image"]);async function Ve(e){if(!k())return;let t='[type="submit"]:not([disabled]), button[data-variant="primary"]:not([disabled])',o='[type="submit"], button[data-variant="primary"]',n=/subscribe|submit|sign[\s-]?up|send|join|go|search|post|tweet|publish|save/i,i=Array.from(document.querySelectorAll('input:not(form input), textarea:not(form textarea), select:not(form select), [role="textbox"]:not(form [role="textbox"]):not(input):not(textarea), [role="searchbox"]:not(form [role="searchbox"]):not(input):not(textarea), [contenteditable="true"]:not(form [contenteditable="true"]):not(input):not(textarea), button[role="combobox"]:not(form button[role="combobox"])')).filter(r=>{if(r instanceof HTMLInputElement&&Dt.has(r.type.toLowerCase()))return console.log(`[auto-webmcp] orphan: skipping excluded type "${r.type}" (name="${r.name}" id="${r.id}")`),!1;let c=r.getBoundingClientRect();return c.width===0||c.height===0?(console.log(`[auto-webmcp] orphan: skipping invisible input (name="${r.name}" id="${r.id}")`),!1):!0});if(console.log(`[auto-webmcp] orphan: found ${i.length} visible orphan input(s)`),i.length===0)return;let s=new Map;for(let r of i){let c=r.parentElement,a=r.parentElement??document.body;for(;c&&c!==document.body;){if(c.querySelector(o)!==null||Array.from(c.querySelectorAll("button")).some(u=>n.test(u.textContent??""))){a=c;break}c=c.parentElement}console.log(`[auto-webmcp] orphan: input (name="${r.name}" id="${r.id}") grouped into container`,a),s.has(a)||s.set(a,[]),s.get(a).push(r)}console.log(`[auto-webmcp] orphan: ${s.size} group(s) found`);for(let[r,c]of s){let a=Array.from(r.querySelectorAll(t)).filter(f=>{let g=f.getBoundingClientRect();return g.width>0&&g.height>0}),l=a[a.length-1]??null;if(!l){let f=Array.from(r.querySelectorAll(o)).filter(g=>{let T=g.getBoundingClientRect();return T.width>0&&T.height>0&&g.disabled});l=f[f.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using disabled submit button as reference: "${l.textContent?.trim()}"`)}if(!l){let f=Array.from(r.querySelectorAll('button, [role="button"]')).filter(g=>{let T=g.getBoundingClientRect();return T.width>0&&T.height>0&&!g.disabled&&g.getAttribute("aria-disabled")!=="true"&&n.test(g.textContent??"")});l=f[f.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using text-matched button in container: "${l.textContent?.trim()}"`)}if(!l){let f=r.closest('[role="dialog"], [aria-modal="true"]');if(f){let g=Array.from(f.querySelectorAll('button, [role="button"]')).filter(b=>{let v=b.getBoundingClientRect();return v.width>0&&v.height>0&&n.test(b.textContent??"")});console.log("[auto-webmcp] orphan: dialog buttons matching submit text:",g.map(b=>`"${b.textContent?.trim().slice(0,30)}" disabled=${b.disabled} aria-disabled=${b.getAttribute("aria-disabled")}`));let T=g.filter(b=>b.disabled||b.getAttribute("aria-disabled")==="true"),L=g.filter(b=>!b.disabled&&b.getAttribute("aria-disabled")!=="true"),M=T.length>0?T:L;l=M[M.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using text-matched button in dialog: "${l.textContent?.trim().slice(0,40)}" disabled=${l.disabled} aria-disabled=${l.getAttribute("aria-disabled")}`)}}if(!l){let f=Array.from(document.querySelectorAll('button, [role="button"]')).filter(g=>{let T=g.getBoundingClientRect();return T.width>0&&T.height>0&&g.getAttribute("aria-disabled")!=="true"&&n.test(g.textContent??"")});l=f[f.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using page-wide fallback submit button: "${l.textContent?.trim()}"`)}console.log("[auto-webmcp] orphan: submit button for group:",l?`"${l.textContent?.trim()}" disabled=${l.disabled}`:"none");let u=Ce(r,c,l);if(z.has(u.name)){console.log(`[auto-webmcp] orphan: "${u.name}" already registered, skipping`);continue}let d=je(u.name);d!==u.name&&e.debug&&console.warn(`[auto-webmcp] orphan tool name collision: "${u.name}" renamed to "${d}"`),u.name=d,console.log(`[auto-webmcp] orphan: tool="${u.name}" schema keys:`,Object.keys(u.inputSchema.properties));let m=[],E=u.inputSchema.properties,p=/^_r_[0-9a-z]+_$/i;for(let f of c){let g=f.id&&!p.test(f.id)?f.id:null,T=f.name||f.getAttribute("name")||f.dataset.webmcpName||g||f.getAttribute("aria-label")||f.getAttribute("placeholder")||null,L=T?T.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64):null,M=!!(L&&E[L]);console.log(`[auto-webmcp] orphan: field (name="${f.name??""}" id="${f.id}") rawKey="${T}" safeKey="${L}" matched=${M}`),M&&m.push({key:L,el:f})}if(console.log(`[auto-webmcp] orphan: ${m.length}/${c.length} input(s) mapped to schema keys`),m.length===0){console.log(`[auto-webmcp] orphan: skipping group "${u.name}" \u2014 no inputs mapped to schema keys`);continue}let y=u.name,w=async(f,g)=>{console.log(`[auto-webmcp] orphan execute: tool="${y}" params=`,f),console.log("[auto-webmcp] orphan execute: inputPairs=",m.map(M=>M.key));for(let{key:M,el:b}of m)f[M]!==void 0?(console.log(`[auto-webmcp] orphan execute: filling key="${M}" value=`,f[M],"element=",b),b.getAttribute("role")==="combobox"&&b.tagName.toLowerCase()==="button"?await qe(b,f[M]):Ne(b,f[M]),console.log("[auto-webmcp] orphan execute: after fill, element value=",b.value)):console.log(`[auto-webmcp] orphan execute: key="${M}" not in params, skipping`);if(window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:y}})),!(e.autoSubmit||!!l?.hasAttribute("toolautosubmit")||l instanceof HTMLElement&&l.dataset.webmcpAutosubmit!==void 0||r.hasAttribute("toolautosubmit")||r instanceof HTMLElement&&r.dataset.webmcpAutosubmit!==void 0))return console.log("[auto-webmcp] orphan execute: autoSubmit=false, returning without clicking submit"),{content:[{type:"text",text:"Fields filled. Ready to submit."}]};console.log("[auto-webmcp] orphan execute: resolving submit button (up to 2s)...");let L=null;if(l&&document.contains(l)){let M=!l.disabled&&l.getAttribute("aria-disabled")!=="true",b=l.getBoundingClientRect();M&&b.width>0&&b.height>0&&(L=l,console.log(`[auto-webmcp] orphan execute: using captured submit button "${L.textContent?.trim()}"`))}if(!L){let M=Date.now()+2e3;for(;Date.now()<M;){let b=Array.from(r.querySelectorAll(t)).filter(K=>{let me=K.getBoundingClientRect();return me.width>0&&me.height>0}),v=b[b.length-1]??null;if(v){L=v;break}await new Promise(K=>setTimeout(K,100))}}if(!L){let M=Array.from((r!==document.body?r:document).querySelectorAll('button, [role="button"]')).filter(b=>{let v=b.getBoundingClientRect();return v.width>0&&v.height>0&&!b.disabled&&b.getAttribute("aria-disabled")!=="true"&&n.test(b.textContent??"")});L=M[M.length-1]??null,L&&console.log(`[auto-webmcp] orphan execute: using text-matched fallback button "${L.textContent?.trim()}"`)}return L?(console.log(`[auto-webmcp] orphan execute: clicking submit button "${L.textContent?.trim()}"`),L.click(),{content:[{type:"text",text:"Fields filled and form submitted."}]}):(console.warn("[auto-webmcp] orphan execute: submit button still disabled after 2s"),{content:[{type:"text",text:"Fields filled but the submit button is still disabled. The page may require additional input before submitting."}]})};try{let f={name:u.name,description:u.description,inputSchema:u.inputSchema,execute:w};u.annotations&&Object.keys(u.annotations).length>0&&(f.annotations=u.annotations),await navigator.modelContext.registerTool(f),z.add(u.name);let g=window.__pendingSubmitBtns??={};g[u.name]=l,e.debug&&console.log(`[auto-webmcp] Orphan tool registered: ${u.name}`,u)}catch{}}}function Wt(e,t){/^form_\d+$|^submit$|^form$/.test(e)&&console.warn(`[auto-webmcp] Tool "${e}" has a generic name. Consider adding a toolname or data-webmcp-name attribute.`),(!t||t==="Submit form")&&console.warn(`[auto-webmcp] Tool "${e}" has no meaningful description.`),/don'?t|do not|never|avoid|not for/i.test(t)&&console.warn(`[auto-webmcp] Tool "${e}" description contains negative instructions. Per spec best practices, prefer positive descriptions.`)}async function ze(e){document.readyState==="loading"&&await new Promise(t=>document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})),Ue=0,z.clear(),Nt(e),qt(e),await P(e),await Ve(e)}function Ke(){q?.disconnect(),q=null}async function Ge(e){let t=de(e);return t.debug&&console.debug("[auto-webmcp] Initializing",{webmcpSupported:k(),config:t}),await ze(t),{destroy:async()=>{Ke(),await Ie()},getTools:J,isSupported:k()}}typeof window<"u"&&!window.__AUTO_WEBMCP_NO_AUTOINIT&&Ge();return tt(Jt);})();
1
+ "use strict";var AutoWebMCP=(()=>{var X=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var Ze=Object.prototype.hasOwnProperty;var et=(e,t)=>{for(var n in t)X(e,n,{get:t[n],enumerable:!0})},tt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Qe(t))!Ze.call(e,i)&&i!==n&&X(e,i,{get:()=>t[i],enumerable:!(o=Ye(t,i))||o.enumerable});return e};var nt=e=>tt(X({},"__esModule",{value:!0}),e);var zt={};et(zt,{autoWebMCP:()=>Xe});function pe(e){let t=e?.paramBinding?.strict??!1,n=t?!1:e?.paramBinding?.enableAliasResolution??!0;return{exclude:e?.exclude??[],autoSubmit:e?.autoSubmit??!1,declarativeMode:e?.declarativeMode??"skip",paramBinding:{strict:t,enableAliasResolution:n},execution:{timeoutMs:Math.max(100,e?.execution?.timeoutMs??15e3)},overrides:e?.overrides??{},preserveExisting:e?.preserveExisting??!1,debug:e?.debug??!1}}var O=["textbox","combobox","checkbox","radio","switch","spinbutton","searchbox","slider"];function Q(e){return e instanceof HTMLInputElement?ot(e):e instanceof HTMLTextAreaElement?{type:"string"}:e instanceof HTMLSelectElement?rt(e):null}function ot(e){switch(e.type.toLowerCase()){case"text":case"search":case"tel":return Y(e);case"email":return{...Y(e),format:"email"};case"url":return{...Y(e),format:"uri"};case"number":case"range":{let n={type:"number"};return e.min!==""&&(n.minimum=parseFloat(e.min)),e.max!==""&&(n.maximum=parseFloat(e.max)),n}case"date":return{type:"string",format:"date"};case"datetime-local":return{type:"string",format:"date-time"};case"time":return{type:"string",format:"time"};case"month":return{type:"string",pattern:"^\\d{4}-\\d{2}$"};case"week":return{type:"string",pattern:"^\\d{4}-W\\d{2}$"};case"color":return{type:"string",pattern:"^#[0-9a-fA-F]{6}$"};case"checkbox":return{type:"boolean"};case"radio":return{type:"string"};case"file":case"hidden":case"submit":case"reset":case"button":case"image":return null;case"password":return null;default:return{type:"string"}}}function Y(e){let t={type:"string"};e.minLength>0&&(t.minLength=e.minLength),e.maxLength>0&&e.maxLength!==524288&&(t.maxLength=e.maxLength),e.pattern&&(t.pattern=e.pattern);let n=e.getAttribute("list");if(n){let o=e.ownerDocument.getElementById(n);if(o instanceof HTMLDataListElement){let i=Array.from(o.options).filter(s=>!s.disabled&&s.value.trim()!=="");i.length>0&&(t.enum=i.map(s=>s.value.trim()),t.oneOf=i.map(s=>({const:s.value.trim(),title:s.textContent?.trim()||s.value.trim()})))}}return t}var it=/^(select|choose|pick)\b|^--+|---/i;function fe(e){return e.disabled?!0:e.value!==""?!1:it.test(e.text.trim())}function rt(e){let t=[],n=[];for(let o of Array.from(e.children))if(o instanceof HTMLOptGroupElement){if(o.disabled)continue;let i=o.label?.trim()??"";for(let s of Array.from(o.children)){if(!(s instanceof HTMLOptionElement)||fe(s))continue;t.push(s.value);let r={const:s.value,title:s.text.trim()||s.value};i&&(r.group=i),n.push(r)}}else if(o instanceof HTMLOptionElement){if(fe(o))continue;t.push(o.value),n.push({const:o.value,title:o.text.trim()||o.value})}return t.length===0?{type:"string"}:e.multiple?{type:"array",items:{type:"string",enum:t}}:{type:"string",enum:t,oneOf:n}}function ge(e,t){return Array.from(e.elements).filter(n=>n instanceof HTMLInputElement&&n.type==="checkbox"&&n.name===t).map(n=>n.value).filter(n=>n!==""&&n!=="on")}function be(e,t){return Array.from(e.elements).filter(o=>o instanceof HTMLInputElement&&o.type==="radio"&&o.name===t).map(o=>o.value).filter(o=>o!=="")}function Ee(e,t){return Array.from(e.elements).filter(o=>o instanceof HTMLInputElement&&o.type==="radio"&&o.name===t).filter(o=>o.value!=="").map(o=>{let i=st(o);return{const:o.value,title:i||o.value}})}function he(e,t){switch(t){case"checkbox":case"switch":return{type:"boolean"};case"spinbutton":case"slider":{let n={type:"number"},o=e.getAttribute("aria-valuemin"),i=e.getAttribute("aria-valuemax");return o!==null&&(n.minimum=parseFloat(o)),i!==null&&(n.maximum=parseFloat(i)),n}case"combobox":{let n=e.getAttribute("aria-owns")??e.getAttribute("aria-controls");if(n){let o=document.getElementById(n);if(o){let i=Array.from(o.querySelectorAll('[role="option"]')).filter(s=>s.getAttribute("aria-disabled")!=="true");if(i.length>0){let s=i.map(c=>(c.getAttribute("data-value")??c.textContent??"").trim()).filter(Boolean),r=i.map(c=>({const:(c.getAttribute("data-value")??c.textContent??"").trim(),title:(c.textContent??"").trim()}));return{type:"string",enum:s,oneOf:r}}}}return{type:"string"}}case"textbox":case"searchbox":case"radio":default:return{type:"string"}}}function st(e){let t=e.closest("label");if(t){let n=t.cloneNode(!0);n.querySelectorAll("input, select, textarea, button").forEach(i=>i.remove());let o=n.textContent?.trim()??"";if(o)return o}if(e.id){let n=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(n){let o=n.textContent?.trim()??"";if(o)return o}}return""}var ye=0;function Me(e,t){let n=t?.name??at(e),o=t?.description??ct(e),{schema:i,fieldElements:s}=ft(e),r=dt(e);return{name:n,description:o,inputSchema:i,annotations:r,fieldElements:s}}function at(e){let t=e.getAttribute("toolname");if(t)return y(t);let n=e.dataset.webmcpName;if(n)return y(n);let o=Z(e);if(o)return y(o);let i=we(e);if(i)return y(i);if(e.id)return y(e.id);if(e.name)return y(e.name);if(e.action){let s=lt(e.action);if(s)return y(s)}return`form_${++ye}`}function y(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64)||"form"}function Z(e){let t=[...Array.from(e.querySelectorAll('button[type="submit"], button:not([type])')),...Array.from(e.querySelectorAll('input[type="submit"]'))];for(let n of t){let o=n instanceof HTMLInputElement?n.value.trim():n.textContent?.trim()??"";if(o&&o.length>0&&o.length<80)return o}return""}function we(e){let t=e;for(;t;){let n=t.previousElementSibling;for(;n;){if(/^H[1-3]$/i.test(n.tagName)){let o=n.textContent?.trim()??"";if(o)return o}n=n.previousElementSibling}if(t=t.parentElement,!t||t===document.body)break}return""}function lt(e){try{let n=new URL(e,window.location.href).pathname.split("/").filter(Boolean);return n[n.length-1]??""}catch{return""}}function ct(e){let t=e.getAttribute("tooldescription");if(t)return t.trim();let n=e.dataset.webmcpDescription;if(n)return n.trim();let o=e.querySelector("legend");if(o?.textContent?.trim())return o.textContent.trim();let i=e.getAttribute("aria-label");if(i?.trim())return i.trim();let s=e.getAttribute("aria-describedby");if(s){let a=document.getElementById(s);if(a?.textContent?.trim())return a.textContent.trim()}let r=we(e),c=document.title?.trim();return r&&c?`${r}: ${c}`:r||c||"Submit form"}var xe=/^(search|find|look|filter|browse|view|show|check|preview|get|fetch|retrieve|load)\b/i,Le=/^(delete|remove|cancel|terminate|destroy|purge|revoke|unsubscribe|deactivate)\b/i,ut=/\/(delete|remove|cancel|destroy)\b/i;function dt(e){let t={};if(e.dataset.webmcpReadonly!==void 0&&(t.readOnlyHint=e.dataset.webmcpReadonly!=="false"),e.dataset.webmcpDestructive!==void 0&&(t.destructiveHint=e.dataset.webmcpDestructive!=="false"),e.dataset.webmcpIdempotent!==void 0&&(t.idempotentHint=e.dataset.webmcpIdempotent!=="false"),e.dataset.webmcpOpenworld!==void 0&&(t.openWorldHint=e.dataset.webmcpOpenworld!=="false"),t.readOnlyHint===void 0){let o=e.method.toLowerCase()==="get",i=Z(e),s=i?xe.test(i.trim()):!1;(o||s)&&(t.readOnlyHint=!0)}if(t.destructiveHint===void 0){let o=Z(e),i=o?Le.test(o.trim()):!1,s=e.action?ut.test(e.action):!1;(i||s)&&(t.destructiveHint=!0)}return t.idempotentHint===void 0&&(t.readOnlyHint===!0||e.method.toLowerCase()==="get")&&(t.idempotentHint=!0),t.openWorldHint===void 0&&(t.openWorldHint=t.readOnlyHint!==!0),t.readOnlyHint===!0||t.destructiveHint===!0||t.idempotentHint===!0||t.openWorldHint===!1?t:{}}function mt(e){if(e instanceof HTMLInputElement){let t=e.type.toLowerCase();return t==="checkbox"?e.checked?!0:void 0:t==="radio"?void 0:t==="number"||t==="range"?e.value!==""?parseFloat(e.value):void 0:e.value!==""?e.value:void 0}if(e instanceof HTMLTextAreaElement)return e.value!==""?e.value:void 0;if(e instanceof HTMLSelectElement){if(e.multiple){let t=Array.from(e.options).filter(n=>n.selected).map(n=>n.value);return t.length>0?t:void 0}return e.value!==""?e.value:void 0}}function He(e,t=new Set){if(t.has(e))return[];t.add(e);let n=[];for(let o of Array.from(e.querySelectorAll("*")))if(o.shadowRoot){let i=Array.from(o.shadowRoot.querySelectorAll("input, textarea, select"));i.length>0&&console.log(`[auto-webmcp] shadow: found ${i.length} control(s) in ${o.tagName.toLowerCase()} shadow root:`,i.map(s=>`${s.tagName.toLowerCase()}[type=${s.type??"?"}][name="${s.name}"][id="${s.id}"]`)),n.push(...i,...He(o.shadowRoot,t))}return n}function pt(e){let t=Array.from(e.elements).filter(o=>o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement||o instanceof HTMLSelectElement),n=new Set(t);for(let o of He(e))n.has(o)||(t.push(o),n.add(o));return t}function ft(e){let t={},n=[],o=new Map,i=new Set,s=new Set,r=pt(e);for(let l of r){let u=l.name,p=u||Ae(l);if(!p)continue;if(l instanceof HTMLInputElement&&l.type==="radio"){if(i.has(p))continue;i.add(p)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){if(s.has(p))continue;s.add(p)}let d=Q(l);if(!d||!te(l))continue;d.title=Se(l);let g=Ce(l);g&&(d.description=g);let T=mt(l);if(T!==void 0&&(d.default=T),l instanceof HTMLInputElement&&l.type==="radio"){d.enum=be(e,p);let b=Ee(e,p);b.length>0&&(d.oneOf=b);let m=Array.from(e.elements).find(f=>f instanceof HTMLInputElement&&f.type==="radio"&&f.name===p&&f.checked);m?.value&&(d.default=m.value)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){let b=ge(e,p);if(b.length>1){let m={type:"array",items:{type:"string",enum:b},title:d.title};d.description&&(m.description=d.description);let f=Array.from(e.elements).filter(E=>E instanceof HTMLInputElement&&E.type==="checkbox"&&E.name===p&&E.checked).map(E=>E.value);f.length>0&&(m.default=f),t[p]=m,l.required&&n.push(p);continue}}t[p]=d,u||o.set(p,l);let M=l.required;if(!M){let b=l;for(;;){let m=b.getRootNode();if(!(m instanceof ShadowRoot))break;let f=m.host;if(f.hasAttribute("required")||f.getAttribute("aria-required")==="true"){M=!0;break}b=f}}M&&n.push(p)}let c=Et(e),a=new Set;for(let{el:l,role:u,key:p,enumValues:d,enumOneOf:g}of c){if(t[p])continue;if(u==="radio"){if(a.has(p))continue;a.add(p)}let T=he(l,u);d&&d.length>0&&(T.enum=d,g&&g.length>0&&(T.oneOf=g)),T.title=ht(l);let M=Tt(l);M&&(T.description=M),t[p]=T,o.set(p,l),l.getAttribute("aria-required")==="true"&&n.push(p)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:n},fieldElements:o}}var ve=/^_r_[0-9a-z]+_$|^:[a-z0-9]+:$/i;function Ae(e){let t=e;if(t.dataset.webmcpName)return y(t.dataset.webmcpName);if(e.id&&!ve.test(e.id))return y(e.id);let n=e.getAttribute("aria-label");if(n)return y(n);if((e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim())return y(e.placeholder.trim());let o=gt(e);return o||(e instanceof HTMLInputElement&&e.type!=="text"?e.type:null)}function gt(e){let t=e;for(;;){let n=t.getRootNode();if(!(n instanceof ShadowRoot))break;let o=n.host,i=o.getAttribute("field-name");if(i)return console.log("[auto-webmcp] shadow host key: field-name=",i),y(i);let s=o.getAttribute("label")||o.getAttribute("aria-label");if(s)return console.log("[auto-webmcp] shadow host key: label=",s),y(s);let r=o.getAttribute("name");if(r)return console.log("[auto-webmcp] shadow host key: name=",r),y(r);t=o}return null}function bt(e){if(e.dataset.webmcpName)return y(e.dataset.webmcpName);if(e.id&&!ve.test(e.id))return y(e.id);let t=e.getAttribute("aria-label");if(t)return y(t);let n=e.getAttribute("placeholder");return n?y(n):null}function Et(e){let t=O.map(a=>`[role="${a}"]`).join(", "),n=[];for(let a of Array.from(e.querySelectorAll(t))){if(a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement||a instanceof HTMLSelectElement||a.getAttribute("aria-hidden")==="true"||a.hidden)continue;let l=a.getAttribute("role"),u=Te(a);u&&n.push({el:a,role:l,key:u})}let o=n.filter(a=>a.role==="radio"),i=n.filter(a=>a.role!=="radio"),s=new Map,r=[];for(let a of o){let l=a.el.closest('[role="radiogroup"]');l?(s.has(l)||s.set(l,[]),s.get(l).push(a.el)):r.push(a)}let c=[];for(let[a,l]of s){let u=Te(a);if(!u)continue;let p=l.map(g=>(g.getAttribute("data-value")??g.getAttribute("aria-label")??g.textContent??"").trim()).filter(Boolean),d=l.map(g=>{let T=(g.getAttribute("data-value")??g.getAttribute("aria-label")??g.textContent??"").trim(),M=(g.getAttribute("aria-label")??g.textContent??"").trim();return{const:T,title:M||T}}).filter(g=>g.const!=="");p.length>0&&c.push({el:a,role:"radio",key:u,enumValues:p,enumOneOf:d})}return[...i,...c,...r]}function Te(e){let t=e;if(t.dataset?.webmcpName)return y(t.dataset.webmcpName);if(e.id)return y(e.id);let n=e.getAttribute("aria-label");if(n)return y(n);let o=e.getAttribute("aria-labelledby");if(o){let i=document.getElementById(o)?.textContent?.trim();if(i)return y(i)}return null}function ht(e){let t=e;if(t.dataset?.webmcpTitle)return t.dataset.webmcpTitle;let n=e.getAttribute("aria-label");if(n)return n.trim();let o=e.getAttribute("aria-labelledby");if(o){let i=document.getElementById(o)?.textContent?.trim();if(i)return i}return e.id?ee(e.id):""}function Tt(e){let t=e.getAttribute("toolparamdescription");if(t)return t.trim();let n=e;if(n.dataset?.webmcpDescription)return n.dataset.webmcpDescription;let o=e.getAttribute("aria-description");if(o)return o;let i=e.getAttribute("aria-describedby");if(i){let r=document.getElementById(i)?.textContent?.trim();if(r)return r}let s=e.getAttribute("placeholder")??e.dataset?.placeholder;return s?s.trim():""}function Se(e){if("dataset"in e&&e.dataset.webmcpTitle)return e.dataset.webmcpTitle;let t=yt(e);return t||(e.name?ee(e.name):e.id?ee(e.id):(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim()?e.placeholder.trim():"")}function Ce(e){let t=e.getAttribute("toolparamdescription");if(t)return t.trim();let n=e;if(n.dataset.webmcpDescription)return n.dataset.webmcpDescription;let o=e.getAttribute("aria-description");if(o)return o;let i=e.getAttribute("aria-describedby");if(i){let s=document.getElementById(i);if(s?.textContent?.trim())return s.textContent.trim()}if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){let s=e.placeholder?.trim();if(s&&s.length>0)return s}return""}function yt(e){if(e.id){let i=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(i){let s=j(i);if(s)return s}}let t=e.getRootNode();if(t instanceof ShadowRoot){if(e.id){let s=t.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(s){let r=j(s);if(r)return r}}let i=t.querySelector("label");if(i){let s=j(i);if(s)return s}}let n=e.closest("label");if(n){let i=j(n);if(i)return i}let o=e;for(;;){let i=o.getRootNode();if(!(i instanceof ShadowRoot))break;let s=i.host,r=s.getAttribute("label")||s.getAttribute("aria-label");if(r)return r;o=s}return""}function j(e){let t=e.cloneNode(!0);return t.querySelectorAll("input, select, textarea, button").forEach(n=>n.remove()),t.textContent?.trim()??""}function ee(e){return e.replace(/[-_]/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().replace(/\b\w/g,t=>t.toUpperCase())}function te(e){let t=window.getComputedStyle(e);if(t.display==="none"||t.visibility==="hidden"||e.offsetParent===null&&t.position!=="fixed")return!1;let n=e;for(;n&&n!==document.body;){if(n.getAttribute("aria-hidden")==="true")return!1;n=n.parentElement}return!e.closest("fieldset")?.disabled}function ke(e,t,n){let o=wt(e,n),i=xt(e),{schema:s,fieldElements:r}=Lt(t),c=Mt(n);return{name:o,description:i,inputSchema:s,annotations:c,fieldElements:r}}function Mt(e){let t={},n=e instanceof HTMLInputElement?e.value.trim():e?.textContent?.trim()??"";return xe.test(n)&&(t.readOnlyHint=!0,t.idempotentHint=!0),Le.test(n)&&(t.destructiveHint=!0),t.readOnlyHint!==!0&&(t.openWorldHint=!0),t.readOnlyHint===!0||t.destructiveHint===!0||t.idempotentHint===!0||t.openWorldHint===!1?t:{}}function wt(e,t){if(t){let i=t instanceof HTMLInputElement?t.value.trim():t.textContent?.trim()??"";if(i&&i.length>0&&i.length<80)return y(i)}let n=Re(e);if(n)return y(n);let o=document.title?.trim();return o?y(o):`form_${++ye}`}function xt(e){let t=Re(e),n=document.title?.trim();return t&&n&&t!==n?`${t} on ${n}`:t||n||"Submit form"}function Re(e){let t=e.querySelector("h1, h2, h3");if(t?.textContent?.trim())return t.textContent.trim();let n=e;for(;n;){let o=n.previousElementSibling;for(;o;){if(/^H[1-3]$/i.test(o.tagName)){let i=o.textContent?.trim()??"";if(i)return i}o=o.previousElementSibling}if(n=n.parentElement,!n||n===document.body)break}return""}function Lt(e){let t={},n=[],o=new Map,i=new Set,s=new Set;for(let r of e){if(!(r instanceof HTMLInputElement)&&!(r instanceof HTMLTextAreaElement)&&!(r instanceof HTMLSelectElement)){let p=bt(r);if(!p||!te(r))continue;let d={type:"string"};d.title=r.getAttribute("aria-label")??p;let g=(r.getAttribute("aria-description")??r.getAttribute("aria-describedby"),null);g&&(d.description=g),t[p]=d,o.set(p,r),n.push(p);continue}let c=r.name,a=(c?y(c):null)||Ae(r);if(!a)continue;if(r instanceof HTMLInputElement&&r.type==="radio"){if(i.has(a))continue;i.add(a)}if(r instanceof HTMLInputElement&&r.type==="checkbox"){if(s.has(a))continue;s.add(a)}let l=Q(r);if(!l||!te(r))continue;l.title=Se(r);let u=Ce(r);if(u&&(l.description=u),r instanceof HTMLInputElement&&r.type==="checkbox"){let p=e.filter(d=>d instanceof HTMLInputElement&&d.type==="checkbox"&&d.name===a).map(d=>d.value).filter(d=>d!==""&&d!=="on");if(p.length>1){let d={type:"array",items:{type:"string",enum:p},title:l.title};l.description&&(d.description=l.description),t[a]=d,r.required&&n.push(a);continue}}t[a]=l,c||o.set(a,r),r.required&&n.push(a)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:n},fieldElements:o}}var Ht={type:"object",properties:{status:{type:"string",enum:["success","partial","error","awaiting_user_action","timed_out","blocked_invalid"],description:"Outcome of the form execution."},filled_fields:{type:"object",description:"Field name to submitted value map."},skipped_fields:{type:"array",items:{type:"string"},description:"Fields the agent provided but that could not be filled."},missing_required:{type:"array",items:{type:"string"},description:"Required fields not supplied by the agent."},validation_errors:{type:"array",items:{type:"object",properties:{field:{type:"string"},constraint:{type:"string",description:"HTML ValidityState key that failed."},message:{type:"string"}},required:["field","constraint","message"]},description:"Per-field HTML5 validation failures (present when status is blocked_invalid)."},existing_values:{type:"object",description:"Field values present in the form before the agent filled it."},warnings:{type:"array",items:{type:"object"},description:"Non-fatal fill warnings (alias_resolved, clamped, not_filled, etc.)."}},required:["status","filled_fields","skipped_fields","missing_required","warnings"]},k=new Map,ne=new Map;function R(){return typeof navigator<"u"&&typeof navigator.modelContext<"u"}async function Ie(e,t,n){if(!R())return;k.get(e)&&await $(e);let i={name:t.name,description:t.description,inputSchema:t.inputSchema,outputSchema:Ht,execute:n};t.annotations&&Object.keys(t.annotations).length>0&&(i.annotations=t.annotations);let s=new AbortController;ne.set(e,s);try{await navigator.modelContext.registerTool(i,{signal:s.signal})}catch{try{await navigator.modelContext.unregisterTool?.(t.name),await navigator.modelContext.registerTool(i,{signal:s.signal})}catch{}}k.set(e,t.name)}async function $(e){if(!R())return;let t=k.get(e);if(!t)return;let n=ne.get(e);n&&(n.abort(),ne.delete(e));try{await navigator.modelContext.unregisterTool?.(t)}catch{}k.delete(e)}function oe(e){return k.get(e)}function J(){return Array.from(k.entries()).map(([e,t])=>({form:e,name:t}))}async function Fe(){let e=Array.from(k.entries());await Promise.all(e.map(([t])=>$(t)))}var v=new WeakMap,B=new WeakMap,I=new WeakMap,H=new WeakMap,L=new WeakMap,F=new WeakMap,C=new WeakMap,vt=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value")?.set,At=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value")?.set,_=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked")?.set;function Be(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"")}function S(e,t,n){if(!t)return;let o=Be(t);o&&(e.has(o)||e.set(o,new Set),e.get(o).add(n))}function St(e,t){let n=new Map,o=t?.inputSchema?.properties??{};for(let[i,s]of Object.entries(o)){S(n,i,i),S(n,i.replace(/_/g," "),i),S(n,s.title,i);let r=U(e,i),c=t?.fieldElements?.get(i),a=r??c??null;if(!a)continue;let l=a;if(S(n,l.getAttribute("id"),i),S(n,l.getAttribute("name"),i),S(n,l.getAttribute("aria-label"),i),S(n,l.getAttribute("placeholder"),i),a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement||a instanceof HTMLSelectElement)for(let u of Array.from(a.labels??[]))S(n,u.textContent?.trim(),i)}return n}function Ct(e,t,n,o){let i={},s=[],r=n?.inputSchema?.properties??{},c=o.paramBinding.enableAliasResolution;for(let[l,u]of Object.entries(t))l in r&&(i[l]=u);if(!c)return{resolved:i,warnings:s};let a=St(e,n);for(let[l,u]of Object.entries(t)){if(l in r)continue;let p=a.get(Be(l));if(!p||p.size!==1)continue;let d=Array.from(p)[0];!d||d in i||(i[d]=u,s.push({field:d,type:"alias_resolved",original:l,message:`resolved "${l}" to schema field "${d}"`}))}return{resolved:i,warnings:s}}function kt(e){let t=[],n=Array.from(e.elements).filter(o=>o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement||o instanceof HTMLSelectElement);for(let o of n){if(!o.willValidate||o.checkValidity())continue;let i=o.name||o.id||o.getAttribute("aria-label")||"unknown_field";t.push({field:i,type:"blocked_submit",message:o.validationMessage||`field "${i}" failed validation`})}return t}function Rt(e){let t={};try{let n=new FormData(e);for(let[o,i]of n.entries())if(t[o]!==void 0){let s=t[o];t[o]=Array.isArray(s)?[...s,i]:[s,i]}else t[o]=i}catch{}return t}function It(e){let t=[];for(let n of Array.from(e.elements)){if(!(n instanceof HTMLInputElement)&&!(n instanceof HTMLTextAreaElement)&&!(n instanceof HTMLSelectElement)||!n.willValidate||n.checkValidity())continue;let o=n.name||n.id||n.getAttribute("aria-label")||"unknown_field",i=n.validity,s=i.valueMissing?"valueMissing":i.typeMismatch?"typeMismatch":i.patternMismatch?"patternMismatch":i.tooLong?"tooLong":i.tooShort?"tooShort":i.rangeUnderflow?"rangeUnderflow":i.rangeOverflow?"rangeOverflow":i.stepMismatch?"stepMismatch":i.customError?"customError":"badInput";t.push({field:o,constraint:s,message:n.validationMessage||`field "${o}" failed validation`})}return t}function Pe(e,t,n,o){return o?.fieldElements&&I.set(e,o.fieldElements),_e(e,n),async(i,s)=>{let r=s;if(t.autoSubmit&&o?.annotations?.destructiveHint===!0&&typeof r?.requestUserInteraction=="function"&&!await r.requestUserInteraction(async()=>new Promise(g=>{let T=window.confirm(`Agent requested a destructive action via "${n}". Continue?`);g(T)})))return window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:n}})),{content:[{type:"text",text:`Cancelled "${n}" by user.`}]};L.set(e,[]),H.delete(e);let c=Rt(e);C.set(e,c);let{resolved:a,warnings:l}=Ct(e,i,o,t);l.length>0&&L.set(e,[...L.get(e)??[],...l]);let u=a;if(t.preserveExisting){let d=[];u=Object.fromEntries(Object.entries(a).filter(([g])=>{let T=c[g],M=T!==void 0&&T!==""&&T!==null;return M&&d.push({field:g,type:"not_filled",message:`field "${g}" already has a value and preserveExisting is enabled`}),!M})),d.length>0&&L.set(e,[...L.get(e)??[],...d])}ie(e,u);let p=_t(o,a);return p.length>0&&H.set(e,p),window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:n}})),new Promise((d,g)=>{let T=t.execution.timeoutMs,M=setTimeout(()=>{if(!v.get(e))return;v.delete(e);let m=t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0?"timed_out":"awaiting_user_action",f={field:"__form__",type:"timeout",message:m==="timed_out"?`tool execution timed out after ${T}ms`:`waiting for user submit (timed out after ${T}ms)`},E=C.get(e),w={status:m,filled_fields:le(e,B.get(e),I.get(e)),skipped_fields:[],missing_required:H.get(e)??[],warnings:[...L.get(e)??[],f],...E!==void 0&&{existing_values:E}};H.delete(e),L.delete(e),F.delete(e),C.delete(e),d({content:[{type:"text",text:f.message},{type:"text",text:JSON.stringify(w)}]})},T);v.set(e,{resolve:d,reject:g,timeoutId:M}),(t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0)&&$e(e).then(async()=>{try{ie(e,a);for(let m=0;m<2&&Ft(e,a,I.get(e)).length!==0;m++)ie(e,a),await $e(e,400,100);let b=e;if(!e.isConnected){let f=document.querySelector('button[type="submit"]:not([disabled]), input[type="submit"]:not([disabled])')?.closest("form");if(f){b=f;let E=v.get(e),w=E?.timeoutId?{resolve:d,reject:g,timeoutId:E.timeoutId}:{resolve:d,reject:g};v.set(b,w),_e(b,n)}}if(b!==e&&H.has(e)&&(H.set(b,H.get(e)),H.delete(e)),!b.checkValidity()){let m=v.get(b)??v.get(e);if(m){m.timeoutId&&clearTimeout(m.timeoutId),v.delete(b),v.delete(e);let f=[...L.get(b)??L.get(e)??[],...kt(b)];L.delete(b),L.delete(e);let E=C.get(e),w={status:"blocked_invalid",filled_fields:le(b,B.get(b)??B.get(e),I.get(b)??I.get(e)),skipped_fields:[],missing_required:H.get(b)??H.get(e)??[],warnings:f,validation_errors:It(b),...E!==void 0&&{existing_values:E}};H.delete(b),H.delete(e),F.delete(b),F.delete(e),C.delete(e),d({content:[{type:"text",text:"Form submission blocked by native validation."},{type:"text",text:JSON.stringify(w)}]})}return}b.requestSubmit()}catch(b){g(b instanceof Error?b:new Error(String(b)))}})})}}function _e(e,t){e.__awmcp_intercepted||(e.__awmcp_intercepted=!0,e.addEventListener("submit",n=>{let o=v.get(e);if(!o)return;let{resolve:i}=o;o.timeoutId&&clearTimeout(o.timeoutId),v.delete(e);let s=le(e,B.get(e),I.get(e)),r=C.get(e);F.delete(e),C.delete(e);let c=H.get(e)??[];H.delete(e);let a=L.get(e)??[];L.delete(e);let l=a.filter(M=>M.type==="not_filled").map(M=>M.field),u={status:c.length>0||l.length>0?"partial":"success",filled_fields:s,skipped_fields:l,missing_required:c,warnings:[...c.map(M=>({field:M,type:"missing_required",message:`required field "${M}" was not provided`})),...a],...r!==void 0&&{existing_values:r}},p=[...c.length?[`required fields were not filled: ${c.join(", ")}`]:[],...a.map(M=>M.message)],d=p.length?` Note: ${p.join("; ")}.`:"",T={content:[{type:"text",text:`Form submitted. Fields: ${JSON.stringify(s)}${d}`},{type:"text",text:JSON.stringify(u)}]};n.agentInvoked&&typeof n.respondWith=="function"&&(n.preventDefault(),n.respondWith(Promise.resolve(T))),i(T)}),e.addEventListener("reset",()=>{F.delete(e),C.delete(e),window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:t}}))}))}function P(e,t){if(e.focus(),e.select?.(),document.execCommand("insertText",!1,t)&&e.value===t)return;let n=e instanceof HTMLTextAreaElement?At:vt;n?n.call(e,t):e.value=t,e.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:t})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function re(e,t){_?_.call(e,t):e.checked=t,e.dispatchEvent(new Event("change",{bubbles:!0}))}function V(e,t){for(let n of Array.from(e.querySelectorAll("*"))){let o=n.shadowRoot;if(!o)continue;let i=o.querySelector(t);if(i)return i;let s=V(o,t);if(s)return s}return null}function se(e,t,n){return Array.from(e.elements).filter(o=>o instanceof HTMLInputElement&&o.type===t&&o.name===n)}function U(e,t){let n=e.elements.namedItem(t);if(typeof n=="object"&&n!==null&&(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement))return n;if(n instanceof RadioNodeList){let r=n[0];if(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement)return r}let o=CSS.escape(t),i=e.querySelector(`[name="${o}"]`)??e.querySelector(`input#${o}, textarea#${o}, select#${o}`);return i||(V(document,`[name="${o}"]`)??V(document,`input#${o}, textarea#${o}, select#${o}`))}function ie(e,t){B.set(e,t);let n=I.get(e),o={};for(let[i,s]of Object.entries(t)){let r=U(e,i);if(r){r instanceof HTMLInputElement?(Oe(r,e,i,s),r.type==="checkbox"?Array.isArray(s)?o[i]=se(e,"checkbox",i).filter(a=>a.checked).map(a=>a.value):o[i]=r.checked:o[i]=r.value):r instanceof HTMLTextAreaElement?(P(r,String(s??"")),o[i]=r.value):r instanceof HTMLSelectElement&&(ae(r,s,e,i),o[i]=r.multiple?Array.from(r.options).filter(a=>a.selected).map(a=>a.value):r.value);continue}let c=n?.get(i);if(c){let a=c;if(!c.isConnected){let l=c.id;if(l){let u=document.getElementById(l)??V(document,`#${CSS.escape(l)}`);u&&(a=u)}}a instanceof HTMLInputElement?(Oe(a,e,i,s),o[i]=a.type==="checkbox"?a.checked:a.value):a instanceof HTMLTextAreaElement?(P(a,String(s??"")),o[i]=a.value):a instanceof HTMLSelectElement?(ae(a,s,e,i),o[i]=a.multiple?Array.from(a.options).filter(l=>l.selected).map(l=>l.value):a.value):(Ne(a,s),o[i]=s)}}F.set(e,o),window.__lastFillWarnings=L.get(e)??[]}function Oe(e,t,n,o){let i=e.type.toLowerCase();if(i==="checkbox"){if(Array.isArray(o)){let s=se(t,"checkbox",n);for(let r of s)re(r,o.map(String).includes(r.value));return}re(e,!!o);return}if(i==="number"||i==="range"){let s=String(o??""),r=Number(s);if(s===""||isNaN(r)){L.get(t)?.push({field:n,type:"type_mismatch",message:`"${n}" expects a number, got: ${JSON.stringify(o)}`,original:o});return}let c=e.min!==""?parseFloat(e.min):-1/0,a=e.max!==""?parseFloat(e.max):1/0;if(r<c||r>a){let l=Math.min(Math.max(r,c),a);L.get(t)?.push({field:n,type:"clamped",message:`"${n}" value ${r} is outside allowed range [${e.min||"?"}, ${e.max||"?"}], clamped to ${l}`,original:r,actual:l}),e.value=String(l)}else e.value=String(r);e.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:String(r)})),e.dispatchEvent(new Event("change",{bubbles:!0}));return}if(i==="radio"){let s=se(t,"radio",n);for(let r of s)if(r.value===String(o)){_?_.call(r,!0):r.checked=!0,r.dispatchEvent(new Event("change",{bubbles:!0}));break}return}P(e,String(o??""))}function ae(e,t,n,o){if(e.multiple){let s=Array.isArray(t)?t.map(String):[String(t??"")];for(let r of Array.from(e.options))r.selected=s.includes(r.value);e.dispatchEvent(new Event("change",{bubbles:!0}));return}let i=String(t??"");if(e.value=i,e.value!==i){let s=i.toLowerCase(),r=Array.from(e.options).find(c=>c.text.trim().toLowerCase()===s||c.label.trim().toLowerCase()===s);r?e.value=r.value:n&&o&&L.get(n)?.push({field:o,type:"not_filled",message:`"${o}" value "${i}" did not match any option in the select`,original:i})}e.dispatchEvent(new Event("change",{bubbles:!0}))}function Ne(e,t){let n=e.getAttribute("role");if(n==="checkbox"||n==="switch"){e.setAttribute("aria-checked",String(!!t)),e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));return}if(n==="radio"){e.setAttribute("aria-checked","true"),e.dispatchEvent(new MouseEvent("click",{bubbles:!0}));return}if(n==="radiogroup"){let i=Array.from(e.querySelectorAll('[role="radio"]'));for(let s of i)if((s.getAttribute("data-value")??s.getAttribute("aria-label")??s.textContent??"").trim()===String(t)){s.setAttribute("aria-checked","true"),s.dispatchEvent(new MouseEvent("click",{bubbles:!0}));for(let c of i)c!==s&&c.setAttribute("aria-checked","false");break}return}let o=e;if(console.log("[auto-webmcp] fillAriaField",{tag:e.tagName,role:n,isContentEditable:o.isContentEditable,id:e.id,ariaLabel:e.getAttribute("aria-label"),textContentBefore:(o.textContent??"").slice(0,80)}),o.isContentEditable){o.focus();let i=document.createRange();i.selectNodeContents(o);let s=window.getSelection();s?.removeAllRanges(),s?.addRange(i);let r=String(t??"");console.log("[auto-webmcp] fillAriaField: text to insert:",JSON.stringify(r));let c=!1;try{let a=new DataTransfer;a.setData("text/plain",r),o.dispatchEvent(new ClipboardEvent("paste",{bubbles:!0,cancelable:!0,composed:!0,clipboardData:a})),c=(o.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S1 paste result:",c,JSON.stringify((o.textContent??"").slice(0,80)))}catch(a){console.log("[auto-webmcp] fillAriaField: S1 paste threw:",a)}if(!c){let a=document.execCommand("insertText",!1,r);c=(o.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S2 execCommand result:",a,"inserted:",c,JSON.stringify((o.textContent??"").slice(0,80)))}if(!c)try{o.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,composed:!0,inputType:"insertText",data:r})),c=(o.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S3 beforeinput result:",c,JSON.stringify((o.textContent??"").slice(0,80)))}catch(a){console.log("[auto-webmcp] fillAriaField: S3 beforeinput threw:",a)}if(!c){o.textContent=r;let a=document.createRange();a.selectNodeContents(o),a.collapse(!1),s?.removeAllRanges(),s?.addRange(a),console.log("[auto-webmcp] fillAriaField: S4 textContent assignment done, textContent:",JSON.stringify((o.textContent??"").slice(0,80)))}o.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:r})),console.log("[auto-webmcp] fillAriaField: done, final textContent:",JSON.stringify((o.textContent??"").slice(0,80)))}else console.log("[auto-webmcp] fillAriaField: not contentEditable, dispatching input/change only"),e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function le(e,t,n){let o={},i=new FormData(e),s=F.get(e);for(let[r,c]of i.entries())if(o[r]!==void 0){let a=o[r];Array.isArray(a)?a.push(c):o[r]=[a,c]}else o[r]=c;if(t)for(let r of Object.keys(t)){if(r in o)continue;if(s&&r in s){o[r]=s[r];continue}let c=U(e,r)??n?.get(r)??null;if(c)if(c instanceof HTMLInputElement&&c.type==="checkbox")o[r]=c.checked;else if(c instanceof HTMLInputElement||c instanceof HTMLTextAreaElement||c instanceof HTMLSelectElement)o[r]=c.value;else{let a=c.getAttribute("role");a==="checkbox"||a==="switch"?o[r]=c.getAttribute("aria-checked")==="true":o[r]=c.textContent?.trim()??""}}return o}function qe(e,t){if(e instanceof HTMLInputElement){let n=e.type.toLowerCase();n==="checkbox"?re(e,!!t):n==="radio"?e.value===String(t)&&(_?_.call(e,!0):e.checked=!0,e.dispatchEvent(new Event("change",{bubbles:!0}))):P(e,String(t??""))}else e instanceof HTMLTextAreaElement?P(e,String(t??"")):e instanceof HTMLSelectElement?ae(e,t):Ne(e,t)}function $e(e,t=800,n=150){return new Promise(o=>{let i=!1,s=null,r=()=>{i||(i=!0,c.disconnect(),s!==null&&clearTimeout(s),o())},c=new MutationObserver(()=>{s!==null&&clearTimeout(s),s=setTimeout(r,n)});c.observe(e,{childList:!0,subtree:!0,attributes:!0,characterData:!0}),setTimeout(r,t),s=setTimeout(r,n)})}function Ft(e,t,n){let o=[];for(let[i,s]of Object.entries(t)){let r=U(e,i)??n?.get(i)??null;r&&(r instanceof HTMLInputElement&&r.type==="checkbox"?r.checked!==!!s&&o.push(i):(r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement||r instanceof HTMLSelectElement)&&r.value!==String(s??"")&&o.push(i))}return o}function _t(e,t){return e?.inputSchema?.required?.length?e.inputSchema.required.filter(n=>!(n in t)):[]}async function De(e,t){let n=String(t??"").trim();console.log("[auto-webmcp] fillComboboxButton: clicking button, value=",JSON.stringify(n)),e.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}));let o=await new Promise(c=>{let a=Date.now()+1e3,l=()=>{let u=document.querySelector('[role="listbox"]')??document.querySelector('[role="option"]')?.closest('[role="listbox"]')??null;if(u){c(u);return}if(Date.now()>=a){c(null);return}setTimeout(l,50)};l()});if(!o){console.warn("[auto-webmcp] fillComboboxButton: listbox did not appear after 1s");return}let i=Array.from(o.querySelectorAll('[role="option"]'));console.log("[auto-webmcp] fillComboboxButton: listbox has",i.length,"options");let s=n.toLowerCase(),r=i.find(c=>{let a=(c.getAttribute("data-value")??"").toLowerCase(),l=(c.getAttribute("aria-label")??"").toLowerCase(),u=(c.textContent??"").trim().toLowerCase();return a===s||l===s||u===s});r?(console.log("[auto-webmcp] fillComboboxButton: clicking option",r.textContent?.trim()),r.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))):console.warn("[auto-webmcp] fillComboboxButton: no option matched",JSON.stringify(n),"available:",i.map(c=>c.textContent?.trim()))}function Je(e,t,n){window.dispatchEvent(new CustomEvent(e,{detail:{form:t,toolName:n}}))}function Ot(e,t){if(e.dataset.noWebmcp!==void 0)return!0;for(let n of t.exclude)try{if(e.matches(n))return!0}catch{}return!1}function We(e,t){let n=`_${t}`;return`${e.slice(0,Math.max(1,64-n.length))}${n}`}function $t(e){let t=new Set(K);for(let{form:n,name:o}of J())e&&n===e||t.add(o);return t}function Ve(e,t){let n=$t(t);if(!n.has(e))return e;let o=2,i=We(e,o);for(;n.has(i);)o++,i=We(e,o);return i}function Bt(e){return!!e.getAttribute("toolname")?.trim().length}async function q(e,t){if(Ot(e,t))return;let n=oe(e);if(Bt(e)&&t.declarativeMode!=="force"){if(n&&await $(e),t.debug){let l=t.declarativeMode;console.log(`[auto-webmcp] Skipping imperative registration for native declarative form (mode=${l})`)}return}let o;for(let[l,u]of Object.entries(t.overrides))try{if(e.matches(l)){o=u;break}}catch{}let i=Me(e,o),s=Ve(i.name,e);s!==i.name&&t.debug&&console.warn(`[auto-webmcp] tool name collision: "${i.name}" renamed to "${s}"`),i.name=s,t.debug&&Ut(i.name,i.description);let r=Pe(e,t,i.name,i);await Ie(e,i,r),W.add(e),Ue++;let c=e.querySelector('[type="submit"], button[data-variant="primary"], button:not([type])')??null,a=window.__pendingSubmitBtns??={};n&&n!==i.name&&delete a[n],a[i.name]=c,t.debug&&console.log(`[auto-webmcp] Registered: ${i.name}`,i),Je("form:registered",e,i.name)}async function Pt(e,t){let n=oe(e);if(!n)return;await $(e),W.delete(e);let o=window.__pendingSubmitBtns;o&&delete o[n],t.debug&&console.log(`[auto-webmcp] Unregistered: ${n}`),Je("form:unregistered",e,n)}var D=null,W=new WeakSet,Ue=0,ce=new Map,Nt=300,z=null,qt=500,K=new Set;function je(e){z&&clearTimeout(z),z=setTimeout(()=>{z=null,ze(e)},qt)}function ue(e){let t=e.tagName.toLowerCase();if(t==="input"||t==="textarea"||t==="select")return!0;let n=e.getAttribute("role");if(n&&O.includes(n)||e.querySelector("input, textarea, select"))return!0;for(let o of O)if(e.querySelector(`[role="${o}"]`))return!0;return!1}function de(e,t){let n=ce.get(e);n&&clearTimeout(n),ce.set(e,setTimeout(()=>{ce.delete(e),q(e,t)},Nt))}function Dt(e,t){let n=document.getElementById(e);n instanceof HTMLFormElement&&W.has(n)&&de(n,t)}function Wt(e){let t=e.closest("form");if(t instanceof HTMLFormElement)return t;let n=e.form;if(n instanceof HTMLFormElement)return n;let o=e.getAttribute("form");if(o){let i=document.getElementById(o);if(i instanceof HTMLFormElement)return i}return null}function jt(e){D||(D=new MutationObserver(t=>{for(let n of t){if(n.type==="attributes"&&n.target instanceof Element){let o=n.target,i=Wt(o);i&&W.has(i)?de(i,e):o instanceof HTMLFormElement?q(o,e):ue(o)&&!o.closest("form")&&je(e),n.attributeName==="form"&&n.oldValue&&Dt(n.oldValue,e);continue}for(let o of n.addedNodes){if(!(o instanceof Element))continue;if(o instanceof HTMLFormElement){q(o,e);continue}let i=o.closest("form");i instanceof HTMLFormElement&&W.has(i)&&ue(o)&&de(i,e);for(let s of Array.from(o.querySelectorAll("form")))q(s,e);ue(o)&&!o.closest("form")&&je(e)}for(let o of n.removedNodes){if(!(o instanceof Element))continue;let i=o instanceof HTMLFormElement?[o]:Array.from(o.querySelectorAll("form"));for(let s of i)Pt(s,e)}}}),D.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeOldValue:!0}))}function Jt(e){window.addEventListener("hashchange",()=>N(e));let t={pushState:history.pushState.bind(history),replaceState:history.replaceState.bind(history)};history.pushState=function(...n){t.pushState(...n),N(e)},history.replaceState=function(...n){t.replaceState(...n),N(e)},window.addEventListener("popstate",()=>N(e))}async function N(e){let t=Array.from(document.querySelectorAll("form"));await Promise.allSettled(t.map(n=>q(n,e)))}var Vt=new Set(["password","hidden","file","submit","reset","button","image"]);async function ze(e){if(!R())return;let t='[type="submit"]:not([disabled]), button[data-variant="primary"]:not([disabled])',n='[type="submit"], button[data-variant="primary"]',o=/subscribe|submit|sign[\s-]?up|send|join|go|search|post|tweet|publish|save/i,i=Array.from(document.querySelectorAll('input:not(form input), textarea:not(form textarea), select:not(form select), [role="textbox"]:not(form [role="textbox"]):not(input):not(textarea), [role="searchbox"]:not(form [role="searchbox"]):not(input):not(textarea), [contenteditable="true"]:not(form [contenteditable="true"]):not(input):not(textarea), button[role="combobox"]:not(form button[role="combobox"])')).filter(r=>{if(r instanceof HTMLInputElement&&Vt.has(r.type.toLowerCase()))return console.log(`[auto-webmcp] orphan: skipping excluded type "${r.type}" (name="${r.name}" id="${r.id}")`),!1;let c=r.getBoundingClientRect();return c.width===0||c.height===0?(console.log(`[auto-webmcp] orphan: skipping invisible input (name="${r.name}" id="${r.id}")`),!1):!0});if(console.log(`[auto-webmcp] orphan: found ${i.length} visible orphan input(s)`),i.length===0)return;let s=new Map;for(let r of i){let c=r.parentElement,a=r.parentElement??document.body;for(;c&&c!==document.body;){if(c.querySelector(n)!==null||Array.from(c.querySelectorAll("button")).some(u=>o.test(u.textContent??""))){a=c;break}c=c.parentElement}console.log(`[auto-webmcp] orphan: input (name="${r.name}" id="${r.id}") grouped into container`,a),s.has(a)||s.set(a,[]),s.get(a).push(r)}console.log(`[auto-webmcp] orphan: ${s.size} group(s) found`);for(let[r,c]of s){let a=Array.from(r.querySelectorAll(t)).filter(m=>{let f=m.getBoundingClientRect();return f.width>0&&f.height>0}),l=a[a.length-1]??null;if(!l){let m=Array.from(r.querySelectorAll(n)).filter(f=>{let E=f.getBoundingClientRect();return E.width>0&&E.height>0&&f.disabled});l=m[m.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using disabled submit button as reference: "${l.textContent?.trim()}"`)}if(!l){let m=Array.from(r.querySelectorAll('button, [role="button"]')).filter(f=>{let E=f.getBoundingClientRect();return E.width>0&&E.height>0&&!f.disabled&&f.getAttribute("aria-disabled")!=="true"&&o.test(f.textContent??"")});l=m[m.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using text-matched button in container: "${l.textContent?.trim()}"`)}if(!l){let m=r.closest('[role="dialog"], [aria-modal="true"]');if(m){let f=Array.from(m.querySelectorAll('button, [role="button"]')).filter(h=>{let A=h.getBoundingClientRect();return A.width>0&&A.height>0&&o.test(h.textContent??"")});console.log("[auto-webmcp] orphan: dialog buttons matching submit text:",f.map(h=>`"${h.textContent?.trim().slice(0,30)}" disabled=${h.disabled} aria-disabled=${h.getAttribute("aria-disabled")}`));let E=f.filter(h=>h.disabled||h.getAttribute("aria-disabled")==="true"),w=f.filter(h=>!h.disabled&&h.getAttribute("aria-disabled")!=="true"),x=E.length>0?E:w;l=x[x.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using text-matched button in dialog: "${l.textContent?.trim().slice(0,40)}" disabled=${l.disabled} aria-disabled=${l.getAttribute("aria-disabled")}`)}}if(!l){let m=Array.from(document.querySelectorAll('button, [role="button"]')).filter(f=>{let E=f.getBoundingClientRect();return E.width>0&&E.height>0&&f.getAttribute("aria-disabled")!=="true"&&o.test(f.textContent??"")});l=m[m.length-1]??null,l&&console.log(`[auto-webmcp] orphan: using page-wide fallback submit button: "${l.textContent?.trim()}"`)}console.log("[auto-webmcp] orphan: submit button for group:",l?`"${l.textContent?.trim()}" disabled=${l.disabled}`:"none");let u=ke(r,c,l);if(K.has(u.name)){console.log(`[auto-webmcp] orphan: "${u.name}" already registered, skipping`);continue}let p=Ve(u.name);p!==u.name&&e.debug&&console.warn(`[auto-webmcp] orphan tool name collision: "${u.name}" renamed to "${p}"`),u.name=p,console.log(`[auto-webmcp] orphan: tool="${u.name}" schema keys:`,Object.keys(u.inputSchema.properties));let d=[],g=u.inputSchema.properties,T=/^_r_[0-9a-z]+_$/i;for(let m of c){let f=m.id&&!T.test(m.id)?m.id:null,E=m.name||m.getAttribute("name")||m.dataset.webmcpName||f||m.getAttribute("aria-label")||m.getAttribute("placeholder")||null,w=E?E.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64):null,x=!!(w&&g[w]);console.log(`[auto-webmcp] orphan: field (name="${m.name??""}" id="${m.id}") rawKey="${E}" safeKey="${w}" matched=${x}`),x&&d.push({key:w,el:m})}if(console.log(`[auto-webmcp] orphan: ${d.length}/${c.length} input(s) mapped to schema keys`),d.length===0){console.log(`[auto-webmcp] orphan: skipping group "${u.name}" \u2014 no inputs mapped to schema keys`);continue}let M=u.name,b=async(m,f)=>{console.log(`[auto-webmcp] orphan execute: tool="${M}" params=`,m),console.log("[auto-webmcp] orphan execute: inputPairs=",d.map(x=>x.key));for(let{key:x,el:h}of d)m[x]!==void 0?(console.log(`[auto-webmcp] orphan execute: filling key="${x}" value=`,m[x],"element=",h),h.getAttribute("role")==="combobox"&&h.tagName.toLowerCase()==="button"?await De(h,m[x]):qe(h,m[x]),console.log("[auto-webmcp] orphan execute: after fill, element value=",h.value)):console.log(`[auto-webmcp] orphan execute: key="${x}" not in params, skipping`);if(window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:M}})),!(e.autoSubmit||!!l?.hasAttribute("toolautosubmit")||l instanceof HTMLElement&&l.dataset.webmcpAutosubmit!==void 0||r.hasAttribute("toolautosubmit")||r instanceof HTMLElement&&r.dataset.webmcpAutosubmit!==void 0))return console.log("[auto-webmcp] orphan execute: autoSubmit=false, returning without clicking submit"),{content:[{type:"text",text:"Fields filled. Ready to submit."}]};console.log("[auto-webmcp] orphan execute: resolving submit button (up to 2s)...");let w=null;if(l&&document.contains(l)){let x=!l.disabled&&l.getAttribute("aria-disabled")!=="true",h=l.getBoundingClientRect();x&&h.width>0&&h.height>0&&(w=l,console.log(`[auto-webmcp] orphan execute: using captured submit button "${w.textContent?.trim()}"`))}if(!w){let x=Date.now()+2e3;for(;Date.now()<x;){let h=Array.from(r.querySelectorAll(t)).filter(G=>{let me=G.getBoundingClientRect();return me.width>0&&me.height>0}),A=h[h.length-1]??null;if(A){w=A;break}await new Promise(G=>setTimeout(G,100))}}if(!w){let x=Array.from((r!==document.body?r:document).querySelectorAll('button, [role="button"]')).filter(h=>{let A=h.getBoundingClientRect();return A.width>0&&A.height>0&&!h.disabled&&h.getAttribute("aria-disabled")!=="true"&&o.test(h.textContent??"")});w=x[x.length-1]??null,w&&console.log(`[auto-webmcp] orphan execute: using text-matched fallback button "${w.textContent?.trim()}"`)}return w?(console.log(`[auto-webmcp] orphan execute: clicking submit button "${w.textContent?.trim()}"`),w.click(),{content:[{type:"text",text:"Fields filled and form submitted."}]}):(console.warn("[auto-webmcp] orphan execute: submit button still disabled after 2s"),{content:[{type:"text",text:"Fields filled but the submit button is still disabled. The page may require additional input before submitting."}]})};try{let m={name:u.name,description:u.description,inputSchema:u.inputSchema,execute:b};u.annotations&&Object.keys(u.annotations).length>0&&(m.annotations=u.annotations),await navigator.modelContext.registerTool(m),K.add(u.name);let f=window.__pendingSubmitBtns??={};f[u.name]=l,e.debug&&console.log(`[auto-webmcp] Orphan tool registered: ${u.name}`,u)}catch{}}}function Ut(e,t){/^form_\d+$|^submit$|^form$/.test(e)&&console.warn(`[auto-webmcp] Tool "${e}" has a generic name. Consider adding a toolname or data-webmcp-name attribute.`),(!t||t==="Submit form")&&console.warn(`[auto-webmcp] Tool "${e}" has no meaningful description.`),/don'?t|do not|never|avoid|not for/i.test(t)&&console.warn(`[auto-webmcp] Tool "${e}" description contains negative instructions. Per spec best practices, prefer positive descriptions.`)}async function Ke(e){document.readyState==="loading"&&await new Promise(t=>document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})),Ue=0,K.clear(),jt(e),Jt(e),await N(e),await ze(e)}function Ge(){D?.disconnect(),D=null}async function Xe(e){let t=pe(e);return t.debug&&console.debug("[auto-webmcp] Initializing",{webmcpSupported:R(),config:t}),await Ke(t),{destroy:async()=>{Ge(),await Fe()},getTools:J,isSupported:R()}}typeof window<"u"&&!window.__AUTO_WEBMCP_NO_AUTOINIT&&Xe();return nt(zt);})();
2
2
  //# sourceMappingURL=auto-webmcp.iife.js.map