auto-webmcp 0.3.15 → 0.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/auto-webmcp.cjs.js +209 -115
- package/dist/auto-webmcp.cjs.js.map +4 -4
- package/dist/auto-webmcp.esm.js +209 -122
- package/dist/auto-webmcp.esm.js.map +4 -4
- package/dist/auto-webmcp.iife.js +1 -1
- package/dist/auto-webmcp.iife.js.map +4 -4
- package/dist/discovery.d.ts.map +1 -1
- package/dist/interceptor.d.ts +1 -1
- package/dist/interceptor.d.ts.map +1 -1
- package/dist/registry.d.ts +7 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/auto-webmcp.iife.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var AutoWebMCP=(()=>{var W=Object.defineProperty;var De=Object.getOwnPropertyDescriptor;var We=Object.getOwnPropertyNames;var Je=Object.prototype.hasOwnProperty;var je=(e,t)=>()=>(e&&(t=e(e=0)),t);var re=(e,t)=>{for(var o in t)W(e,o,{get:t[o],enumerable:!0})},Ue=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of We(t))!Je.call(e,r)&&r!==o&&W(e,r,{get:()=>t[r],enumerable:!(n=De(t,r))||n.enumerable});return e};var Ve=e=>Ue(W({},"__esModule",{value:!0}),e);var He={};re(He,{getAllRegisteredTools:()=>K,getRegisteredToolName:()=>ft,isWebMCPSupported:()=>L,registerFormTool:()=>G,unregisterAll:()=>Y,unregisterFormTool:()=>k});function L(){return typeof navigator<"u"&&typeof navigator.modelContext<"u"}async function G(e,t,o){if(!L())return;H.get(e)&&await k(e);let r={name:t.name,description:t.description,inputSchema:t.inputSchema,execute:o};t.annotations&&Object.keys(t.annotations).length>0&&(r.annotations=t.annotations);try{await navigator.modelContext.registerTool(r)}catch{try{await navigator.modelContext.unregisterTool(t.name),await navigator.modelContext.registerTool(r)}catch{}}H.set(e,t.name)}async function k(e){if(!L())return;let t=H.get(e);if(t){try{await navigator.modelContext.unregisterTool(t)}catch{}H.delete(e)}}function ft(e){return H.get(e)}function K(){return Array.from(H.entries()).map(([e,t])=>({form:e,name:t}))}async function Y(){let e=Array.from(H.entries());await Promise.all(e.map(([t])=>k(t)))}var H,O=je(()=>{"use strict";H=new Map});var kt={};re(kt,{autoWebMCP:()=>qe});function ae(e){return{exclude:e?.exclude??[],autoSubmit:e?.autoSubmit??!1,overrides:e?.overrides??{},debug:e?.debug??!1}}var C=["textbox","combobox","checkbox","radio","switch","spinbutton","searchbox","slider"];function j(e){return e instanceof HTMLInputElement?ze(e):e instanceof HTMLTextAreaElement?{type:"string"}:e instanceof HTMLSelectElement?Ke(e):null}function ze(e){switch(e.type.toLowerCase()){case"text":case"search":case"tel":return J(e);case"email":return{...J(e),format:"email"};case"url":return{...J(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 J(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 r=Array.from(n.options).filter(a=>!a.disabled&&a.value.trim()!=="");r.length>0&&(t.enum=r.map(a=>a.value.trim()),t.oneOf=r.map(a=>({const:a.value.trim(),title:a.textContent?.trim()||a.value.trim()})))}}return t}var Ge=/^(select|choose|pick)\b|^--+|---/i;function se(e){return e.disabled?!0:e.value!==""?!1:Ge.test(e.text.trim())}function Ke(e){let t=[],o=[];for(let n of Array.from(e.children))if(n instanceof HTMLOptGroupElement){if(n.disabled)continue;let r=n.label?.trim()??"";for(let a of Array.from(n.children)){if(!(a instanceof HTMLOptionElement)||se(a))continue;t.push(a.value);let i={const:a.value,title:a.text.trim()||a.value};r&&(i.group=r),o.push(i)}}else if(n instanceof HTMLOptionElement){if(se(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 le(e,t){return Array.from(e.querySelectorAll(`input[type="checkbox"][name="${CSS.escape(t)}"]`)).map(o=>o.value).filter(o=>o!==""&&o!=="on")}function ce(e,t){return Array.from(e.querySelectorAll(`input[type="radio"][name="${CSS.escape(t)}"]`)).map(n=>n.value).filter(n=>n!=="")}function ue(e,t){return Array.from(e.querySelectorAll(`input[type="radio"][name="${CSS.escape(t)}"]`)).filter(n=>n.value!=="").map(n=>{let r=Ye(n);return{const:n.value,title:r||n.value}})}function me(e,t){switch(t){case"checkbox":case"switch":return{type:"boolean"};case"spinbutton":case"slider":{let o={type:"number"},n=e.getAttribute("aria-valuemin"),r=e.getAttribute("aria-valuemax");return n!==null&&(o.minimum=parseFloat(n)),r!==null&&(o.maximum=parseFloat(r)),o}case"combobox":{let o=e.getAttribute("aria-owns")??e.getAttribute("aria-controls");if(o){let n=document.getElementById(o);if(n){let r=Array.from(n.querySelectorAll('[role="option"]')).filter(a=>a.getAttribute("aria-disabled")!=="true");if(r.length>0){let a=r.map(l=>(l.getAttribute("data-value")??l.textContent??"").trim()).filter(Boolean),i=r.map(l=>({const:(l.getAttribute("data-value")??l.textContent??"").trim(),title:(l.textContent??"").trim()}));return{type:"string",enum:a,oneOf:i}}}}return{type:"string"}}case"textbox":case"searchbox":case"radio":default:return{type:"string"}}}function Ye(e){let t=e.closest("label");if(t){let o=t.cloneNode(!0);o.querySelectorAll("input, select, textarea, button").forEach(r=>r.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 pe=0;function fe(e,t){let o=t?.name??Xe(e),n=t?.description??Ze(e),{schema:r,fieldElements:a}=ot(e),i=tt(e);return{name:o,description:n,inputSchema:r,annotations:i,fieldElements:a}}function Xe(e){let t=e.getAttribute("toolname");if(t)return h(t);let o=e.dataset.webmcpName;if(o)return h(o);let n=U(e);if(n)return h(n);let r=ge(e);if(r)return h(r);if(e.id)return h(e.id);if(e.name)return h(e.name);if(e.action){let a=Qe(e.action);if(a)return h(a)}return`form_${++pe}`}function h(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64)||"form"}function U(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 ge(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 Qe(e){try{let o=new URL(e,window.location.href).pathname.split("/").filter(Boolean);return o[o.length-1]??""}catch{return""}}function Ze(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 r=e.getAttribute("aria-label");if(r?.trim())return r.trim();let a=e.getAttribute("aria-describedby");if(a){let s=document.getElementById(a);if(s?.textContent?.trim())return s.textContent.trim()}let i=ge(e),l=document.title?.trim();return i&&l?`${i}: ${l}`:i||l||"Submit form"}var be=/^(search|find|look|filter|browse|view|show|check|preview|get|fetch|retrieve|load)\b/i,he=/^(delete|remove|cancel|terminate|destroy|purge|revoke|unsubscribe|deactivate)\b/i,et=/\/(delete|remove|cancel|destroy)\b/i;function tt(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",r=U(e),a=r?be.test(r.trim()):!1;(n||a)&&(t.readOnlyHint=!0)}if(t.destructiveHint===void 0){let n=U(e),r=n?he.test(n.trim()):!1,a=e.action?et.test(e.action):!1;(r||a)&&(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 nt(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 Ee(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 r=Array.from(n.shadowRoot.querySelectorAll("input, textarea, select"));r.length>0&&console.log(`[auto-webmcp] shadow: found ${r.length} control(s) in ${n.tagName.toLowerCase()} shadow root:`,r.map(a=>`${a.tagName.toLowerCase()}[type=${a.type??"?"}][name="${a.name}"][id="${a.id}"]`)),o.push(...r,...Ee(n.shadowRoot,t))}return o}function ot(e){let t={},o=[],n=new Map,r=new Set,a=new Set,i=[...Array.from(e.querySelectorAll("input, textarea, select")),...Ee(e)];for(let c of i){let u=c.name,d=u||ye(c);if(!d)continue;if(c instanceof HTMLInputElement&&c.type==="radio"){if(r.has(d))continue;r.add(d)}if(c instanceof HTMLInputElement&&c.type==="checkbox"){if(a.has(d))continue;a.add(d)}let p=j(c);if(!p||!z(c))continue;p.title=xe(c);let b=we(c);b&&(p.description=b);let T=nt(c);if(T!==void 0&&(p.default=T),c instanceof HTMLInputElement&&c.type==="radio"){p.enum=ce(e,d);let m=ue(e,d);m.length>0&&(p.oneOf=m);let g=e.querySelector(`input[type="radio"][name="${CSS.escape(d)}"]:checked`);g?.value&&(p.default=g.value)}if(c instanceof HTMLInputElement&&c.type==="checkbox"){let m=le(e,d);if(m.length>1){let g={type:"array",items:{type:"string",enum:m},title:p.title};p.description&&(g.description=p.description);let f=Array.from(e.querySelectorAll(`input[type="checkbox"][name="${CSS.escape(d)}"]:checked`)).map(E=>E.value);f.length>0&&(g.default=f),t[d]=g,c.required&&o.push(d);continue}}t[d]=p,u||n.set(d,c);let w=c.required;if(!w){let m=c;for(;;){let g=m.getRootNode();if(!(g instanceof ShadowRoot))break;let f=g.host;if(f.hasAttribute("required")||f.getAttribute("aria-required")==="true"){w=!0;break}m=f}}w&&o.push(d)}let l=at(e),s=new Set;for(let{el:c,role:u,key:d,enumValues:p,enumOneOf:b}of l){if(t[d])continue;if(u==="radio"){if(s.has(d))continue;s.add(d)}let T=me(c,u);p&&p.length>0&&(T.enum=p,b&&b.length>0&&(T.oneOf=b)),T.title=st(c);let w=lt(c);w&&(T.description=w),t[d]=T,n.set(d,c),c.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 Te=/^_r_[0-9a-z]+_$|^:[a-z0-9]+:$/i;function ye(e){let t=e;if(t.dataset.webmcpName)return h(t.dataset.webmcpName);if(e.id&&!Te.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=it(e);return n||(e instanceof HTMLInputElement&&e.type!=="text"?e.type:null)}function it(e){let t=e;for(;;){let o=t.getRootNode();if(!(o instanceof ShadowRoot))break;let n=o.host,r=n.getAttribute("field-name");if(r)return console.log("[auto-webmcp] shadow host key: field-name=",r),h(r);let a=n.getAttribute("label")||n.getAttribute("aria-label");if(a)return console.log("[auto-webmcp] shadow host key: label=",a),h(a);let i=n.getAttribute("name");if(i)return console.log("[auto-webmcp] shadow host key: name=",i),h(i);t=n}return null}function rt(e){if(e.dataset.webmcpName)return h(e.dataset.webmcpName);if(e.id&&!Te.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 at(e){let t=C.map(s=>`[role="${s}"]`).join(", "),o=[];for(let s of Array.from(e.querySelectorAll(t))){if(s instanceof HTMLInputElement||s instanceof HTMLTextAreaElement||s instanceof HTMLSelectElement||s.getAttribute("aria-hidden")==="true"||s.hidden)continue;let c=s.getAttribute("role"),u=de(s);u&&o.push({el:s,role:c,key:u})}let n=o.filter(s=>s.role==="radio"),r=o.filter(s=>s.role!=="radio"),a=new Map,i=[];for(let s of n){let c=s.el.closest('[role="radiogroup"]');c?(a.has(c)||a.set(c,[]),a.get(c).push(s.el)):i.push(s)}let l=[];for(let[s,c]of a){let u=de(s);if(!u)continue;let d=c.map(b=>(b.getAttribute("data-value")??b.getAttribute("aria-label")??b.textContent??"").trim()).filter(Boolean),p=c.map(b=>{let T=(b.getAttribute("data-value")??b.getAttribute("aria-label")??b.textContent??"").trim(),w=(b.getAttribute("aria-label")??b.textContent??"").trim();return{const:T,title:w||T}}).filter(b=>b.const!=="");d.length>0&&l.push({el:s,role:"radio",key:u,enumValues:d,enumOneOf:p})}return[...r,...l,...i]}function de(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 r=document.getElementById(n)?.textContent?.trim();if(r)return h(r)}return null}function st(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 r=document.getElementById(n)?.textContent?.trim();if(r)return r}return e.id?V(e.id):""}function lt(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 r=e.getAttribute("aria-describedby");if(r){let i=document.getElementById(r)?.textContent?.trim();if(i)return i}let a=e.getAttribute("placeholder")??e.dataset?.placeholder;return a?a.trim():""}function xe(e){if("dataset"in e&&e.dataset.webmcpTitle)return e.dataset.webmcpTitle;let t=ct(e);return t||(e.name?V(e.name):e.id?V(e.id):(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim()?e.placeholder.trim():"")}function we(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 r=e.getAttribute("aria-describedby");if(r){let a=document.getElementById(r);if(a?.textContent?.trim())return a.textContent.trim()}if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){let a=e.placeholder?.trim();if(a&&a.length>0)return a}return""}function ct(e){if(e.id){let r=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(r){let a=$(r);if(a)return a}}let t=e.getRootNode();if(t instanceof ShadowRoot){if(e.id){let a=t.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(a){let i=$(a);if(i)return i}}let r=t.querySelector("label");if(r){let a=$(r);if(a)return a}}let o=e.closest("label");if(o){let r=$(o);if(r)return r}let n=e;for(;;){let r=n.getRootNode();if(!(r instanceof ShadowRoot))break;let a=r.host,i=a.getAttribute("label")||a.getAttribute("aria-label");if(i)return i;n=a}return""}function $(e){let t=e.cloneNode(!0);return t.querySelectorAll("input, select, textarea, button").forEach(o=>o.remove()),t.textContent?.trim()??""}function V(e){return e.replace(/[-_]/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().replace(/\b\w/g,t=>t.toUpperCase())}function z(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 Le(e,t,o){let n=mt(e,o),r=dt(e),{schema:a,fieldElements:i}=pt(t),l=ut(o);return{name:n,description:r,inputSchema:a,annotations:l,fieldElements:i}}function ut(e){let t={},o=e instanceof HTMLInputElement?e.value.trim():e?.textContent?.trim()??"";return be.test(o)&&(t.readOnlyHint=!0,t.idempotentHint=!0),he.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 r=t instanceof HTMLInputElement?t.value.trim():t.textContent?.trim()??"";if(r&&r.length>0&&r.length<80)return h(r)}let o=Me(e);if(o)return h(o);let n=document.title?.trim();return n?h(n):`form_${++pe}`}function dt(e){let t=Me(e),o=document.title?.trim();return t&&o&&t!==o?`${t} on ${o}`:t||o||"Submit form"}function Me(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 r=n.textContent?.trim()??"";if(r)return r}n=n.previousElementSibling}if(o=o.parentElement,!o||o===document.body)break}return""}function pt(e){let t={},o=[],n=new Map,r=new Set,a=new Set;for(let i of e){if(!(i instanceof HTMLInputElement)&&!(i instanceof HTMLTextAreaElement)&&!(i instanceof HTMLSelectElement)){let d=rt(i);if(!d||!z(i))continue;let p={type:"string"};p.title=i.getAttribute("aria-label")??d;let b=(i.getAttribute("aria-description")??i.getAttribute("aria-describedby"),null);b&&(p.description=b),t[d]=p,n.set(d,i),o.push(d);continue}let l=i.name,s=(l?h(l):null)||ye(i);if(!s)continue;if(i instanceof HTMLInputElement&&i.type==="radio"){if(r.has(s))continue;r.add(s)}if(i instanceof HTMLInputElement&&i.type==="checkbox"){if(a.has(s))continue;a.add(s)}let c=j(i);if(!c||!z(i))continue;c.title=xe(i);let u=we(i);if(u&&(c.description=u),i instanceof HTMLInputElement&&i.type==="checkbox"){let d=e.filter(p=>p instanceof HTMLInputElement&&p.type==="checkbox"&&p.name===s).map(p=>p.value).filter(p=>p!==""&&p!=="on");if(d.length>1){let p={type:"array",items:{type:"string",enum:d},title:c.title};c.description&&(p.description=c.description),t[s]=p,i.required&&o.push(s);continue}}t[s]=c,l||n.set(s,i),i.required&&o.push(s)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:o},fieldElements:n}}O();var P=new WeakMap,Ce=new WeakMap,_=new WeakMap,M=new WeakMap,A=new WeakMap,N=new WeakMap,gt=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value")?.set,bt=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value")?.set,v=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked")?.set;function ke(e,t,o,n){return n?.fieldElements&&_.set(e,n.fieldElements),Ae(e,o),async r=>{A.set(e,[]),M.delete(e),X(e,r);let a=Tt(n,r);return a.length>0&&M.set(e,a),window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:o}})),new Promise((i,l)=>{P.set(e,{resolve:i,reject:l}),(t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0)&&ve(e).then(async()=>{try{X(e,r);for(let c=0;c<2&&Et(e,r,_.get(e)).length!==0;c++)X(e,r),await ve(e,400,100);let s=e;if(!e.isConnected){let u=document.querySelector('button[type="submit"]:not([disabled]), input[type="submit"]:not([disabled])')?.closest("form");u&&(s=u,P.set(s,{resolve:i,reject:l}),Ae(s,o))}s!==e&&M.has(e)&&(M.set(s,M.get(e)),M.delete(e)),s.requestSubmit()}catch(s){l(s instanceof Error?s:new Error(String(s)))}})})}}function Ae(e,t){e.__awmcp_intercepted||(e.__awmcp_intercepted=!0,e.addEventListener("submit",o=>{let n=P.get(e);if(!n)return;let{resolve:r}=n;P.delete(e);let a=ht(e,Ce.get(e),_.get(e));N.delete(e);let i=M.get(e)??[];M.delete(e);let l=A.get(e)??[];A.delete(e);let s=l.filter(T=>T.type==="not_filled").map(T=>T.field),c={status:i.length>0||s.length>0?"partial":"success",filled_fields:a,skipped_fields:s,missing_required:i,warnings:[...i.map(T=>({field:T,type:"missing_required",message:`required field "${T}" was not provided`})),...l]},u=[...i.length?[`required fields were not filled: ${i.join(", ")}`]:[],...l.map(T=>T.message)],d=u.length?` Note: ${u.join("; ")}.`:"",b={content:[{type:"text",text:`Form submitted. Fields: ${JSON.stringify(a)}${d}`},{type:"text",text:JSON.stringify(c)}]};o.agentInvoked&&typeof o.respondWith=="function"&&(o.preventDefault(),o.respondWith(Promise.resolve(b))),r(b)}),e.addEventListener("reset",()=>{N.delete(e),window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:t}}))}))}function R(e,t){if(e.focus(),e.select?.(),document.execCommand("insertText",!1,t)&&e.value===t)return;let o=e instanceof HTMLTextAreaElement?bt:gt;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 Q(e,t){v?v.call(e,t):e.checked=t,e.dispatchEvent(new Event("change",{bubbles:!0}))}function B(e,t){for(let o of Array.from(e.querySelectorAll("*"))){let n=o.shadowRoot;if(!n)continue;let r=n.querySelector(t);if(r)return r;let a=B(n,t);if(a)return a}return null}function ee(e,t){let o=CSS.escape(t),n=e.querySelector(`[name="${o}"]`)??e.querySelector(`input#${o}, textarea#${o}, select#${o}`);return n||(B(document,`[name="${o}"]`)??B(document,`input#${o}, textarea#${o}, select#${o}`))}function X(e,t){Ce.set(e,t);let o=_.get(e),n={};for(let[r,a]of Object.entries(t)){let i=ee(e,r);if(i){if(i instanceof HTMLInputElement)if(Se(i,e,r,a),i.type==="checkbox")if(Array.isArray(a)){let s=CSS.escape(r);n[r]=Array.from(e.querySelectorAll(`input[type="checkbox"][name="${s}"]`)).filter(c=>c.checked).map(c=>c.value)}else n[r]=i.checked;else n[r]=i.value;else i instanceof HTMLTextAreaElement?(R(i,String(a??"")),n[r]=i.value):i instanceof HTMLSelectElement&&(Z(i,a,e,r),n[r]=i.multiple?Array.from(i.options).filter(s=>s.selected).map(s=>s.value):i.value);continue}let l=o?.get(r);if(l){let s=l;if(!l.isConnected){let c=l.id;if(c){let u=document.getElementById(c)??B(document,`#${CSS.escape(c)}`);u&&(s=u)}}s instanceof HTMLInputElement?(Se(s,e,r,a),n[r]=s.type==="checkbox"?s.checked:s.value):s instanceof HTMLTextAreaElement?(R(s,String(a??"")),n[r]=s.value):s instanceof HTMLSelectElement?(Z(s,a,e,r),n[r]=s.multiple?Array.from(s.options).filter(c=>c.selected).map(c=>c.value):s.value):(Re(s,a),n[r]=a)}}N.set(e,n),window.__lastFillWarnings=A.get(e)??[]}function Se(e,t,o,n){let r=e.type.toLowerCase();if(r==="checkbox"){if(Array.isArray(n)){let a=CSS.escape(o),i=t.querySelectorAll(`input[type="checkbox"][name="${a}"]`);for(let l of i)Q(l,n.map(String).includes(l.value));return}Q(e,!!n);return}if(r==="number"||r==="range"){let a=String(n??""),i=Number(a);if(a===""||isNaN(i)){A.get(t)?.push({field:o,type:"type_mismatch",message:`"${o}" expects a number, got: ${JSON.stringify(n)}`,original:n});return}let l=e.min!==""?parseFloat(e.min):-1/0,s=e.max!==""?parseFloat(e.max):1/0;if(i<l||i>s){let c=Math.min(Math.max(i,l),s);A.get(t)?.push({field:o,type:"clamped",message:`"${o}" value ${i} is outside allowed range [${e.min||"?"}, ${e.max||"?"}], clamped to ${c}`,original:i,actual:c}),e.value=String(c)}else e.value=String(i);e.dispatchEvent(new InputEvent("input",{bubbles:!0,cancelable:!0,inputType:"insertText",data:String(i)})),e.dispatchEvent(new Event("change",{bubbles:!0}));return}if(r==="radio"){let a=CSS.escape(o),i=t.querySelectorAll(`input[type="radio"][name="${a}"]`);for(let l of i)if(l.value===String(n)){v?v.call(l,!0):l.checked=!0,l.dispatchEvent(new Event("change",{bubbles:!0}));break}return}R(e,String(n??""))}function Z(e,t,o,n){if(e.multiple){let a=Array.isArray(t)?t.map(String):[String(t??"")];for(let i of Array.from(e.options))i.selected=a.includes(i.value);e.dispatchEvent(new Event("change",{bubbles:!0}));return}let r=String(t??"");if(e.value=r,e.value!==r){let a=r.toLowerCase(),i=Array.from(e.options).find(l=>l.text.trim().toLowerCase()===a||l.label.trim().toLowerCase()===a);i?e.value=i.value:o&&n&&A.get(o)?.push({field:n,type:"not_filled",message:`"${n}" value "${r}" did not match any option in the select`,original:r})}e.dispatchEvent(new Event("change",{bubbles:!0}))}function Re(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 r=Array.from(e.querySelectorAll('[role="radio"]'));for(let a of r)if((a.getAttribute("data-value")??a.getAttribute("aria-label")??a.textContent??"").trim()===String(t)){a.setAttribute("aria-checked","true"),a.dispatchEvent(new MouseEvent("click",{bubbles:!0}));for(let l of r)l!==a&&l.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 r=document.createRange();r.selectNodeContents(n);let a=window.getSelection();a?.removeAllRanges(),a?.addRange(r);let i=String(t??"");console.log("[auto-webmcp] fillAriaField: text to insert:",JSON.stringify(i));let l=!1;try{let s=new DataTransfer;s.setData("text/plain",i),n.dispatchEvent(new ClipboardEvent("paste",{bubbles:!0,cancelable:!0,composed:!0,clipboardData:s})),l=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S1 paste result:",l,JSON.stringify((n.textContent??"").slice(0,80)))}catch(s){console.log("[auto-webmcp] fillAriaField: S1 paste threw:",s)}if(!l){let s=document.execCommand("insertText",!1,i);l=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S2 execCommand result:",s,"inserted:",l,JSON.stringify((n.textContent??"").slice(0,80)))}if(!l)try{n.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,composed:!0,inputType:"insertText",data:i})),l=(n.textContent??"").trim().length>0,console.log("[auto-webmcp] fillAriaField: S3 beforeinput result:",l,JSON.stringify((n.textContent??"").slice(0,80)))}catch(s){console.log("[auto-webmcp] fillAriaField: S3 beforeinput threw:",s)}if(!l){n.textContent=i;let s=document.createRange();s.selectNodeContents(n),s.collapse(!1),a?.removeAllRanges(),a?.addRange(s),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:i})),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 ht(e,t,o){let n={},r=new FormData(e),a=N.get(e);for(let[i,l]of r.entries())if(n[i]!==void 0){let s=n[i];Array.isArray(s)?s.push(l):n[i]=[s,l]}else n[i]=l;if(t)for(let i of Object.keys(t)){if(i in n)continue;if(a&&i in a){n[i]=a[i];continue}let l=ee(e,i)??o?.get(i)??null;if(l)if(l instanceof HTMLInputElement&&l.type==="checkbox")n[i]=l.checked;else if(l instanceof HTMLInputElement||l instanceof HTMLTextAreaElement||l instanceof HTMLSelectElement)n[i]=l.value;else{let s=l.getAttribute("role");s==="checkbox"||s==="switch"?n[i]=l.getAttribute("aria-checked")==="true":n[i]=l.textContent?.trim()??""}}return n}function Ie(e,t){if(e instanceof HTMLInputElement){let o=e.type.toLowerCase();o==="checkbox"?Q(e,!!t):o==="radio"?e.value===String(t)&&(v?v.call(e,!0):e.checked=!0,e.dispatchEvent(new Event("change",{bubbles:!0}))):R(e,String(t??""))}else e instanceof HTMLTextAreaElement?R(e,String(t??"")):e instanceof HTMLSelectElement?Z(e,t):Re(e,t)}function ve(e,t=800,o=150){return new Promise(n=>{let r=!1,a=null,i=()=>{r||(r=!0,l.disconnect(),a!==null&&clearTimeout(a),n())},l=new MutationObserver(()=>{a!==null&&clearTimeout(a),a=setTimeout(i,o)});l.observe(e,{childList:!0,subtree:!0,attributes:!0,characterData:!0}),setTimeout(i,t),a=setTimeout(i,o)})}function Et(e,t,o){let n=[];for(let[r,a]of Object.entries(t)){let i=ee(e,r)??o?.get(r)??null;i&&(i instanceof HTMLInputElement&&i.type==="checkbox"?i.checked!==!!a&&n.push(r):(i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement||i instanceof HTMLSelectElement)&&i.value!==String(a??"")&&n.push(r))}return n}function Tt(e,t){return e?.inputSchema?.required?.length?e.inputSchema.required.filter(o=>!(o in t)):[]}async function Fe(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(l=>{let s=Date.now()+1e3,c=()=>{let u=document.querySelector('[role="listbox"]')??document.querySelector('[role="option"]')?.closest('[role="listbox"]')??null;if(u){l(u);return}if(Date.now()>=s){l(null);return}setTimeout(c,50)};c()});if(!n){console.warn("[auto-webmcp] fillComboboxButton: listbox did not appear after 1s");return}let r=Array.from(n.querySelectorAll('[role="option"]'));console.log("[auto-webmcp] fillComboboxButton: listbox has",r.length,"options");let a=o.toLowerCase(),i=r.find(l=>{let s=(l.getAttribute("data-value")??"").toLowerCase(),c=(l.getAttribute("aria-label")??"").toLowerCase(),u=(l.textContent??"").trim().toLowerCase();return s===a||c===a||u===a});i?(console.log("[auto-webmcp] fillComboboxButton: clicking option",i.textContent?.trim()),i.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0}))):console.warn("[auto-webmcp] fillComboboxButton: no option matched",JSON.stringify(o),"available:",r.map(l=>l.textContent?.trim()))}function Oe(e,t,o){window.dispatchEvent(new CustomEvent(e,{detail:{form:t,toolName:o}}))}function yt(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}async function D(e,t){if(yt(e,t))return;let o;for(let[l,s]of Object.entries(t.overrides))try{if(e.matches(l)){o=s;break}}catch{}let n=fe(e,o);t.debug&&Ct(n.name,n.description);let r=ke(e,t,n.name,n);await G(e,n,r),oe.add(e),Pe++;let a=e.querySelector('[type="submit"], button[data-variant="primary"], button:not([type])')??null,i=window.__pendingSubmitBtns??={};i[n.name]=a,t.debug&&console.log(`[auto-webmcp] Registered: ${n.name}`,n),Oe("form:registered",e,n.name)}async function xt(e,t){let{getRegisteredToolName:o}=await Promise.resolve().then(()=>(O(),He)),n=o(e);n&&(await k(e),oe.delete(e),t.debug&&console.log(`[auto-webmcp] Unregistered: ${n}`),Oe("form:unregistered",e,n))}var F=null,oe=new WeakSet,Pe=0,te=new Map,wt=300,q=null,Lt=500,ne=new Set;function Mt(e){q&&clearTimeout(q),q=setTimeout(()=>{q=null,_e(e)},Lt)}function $e(e){let t=e.tagName.toLowerCase();if(t==="input"||t==="textarea"||t==="select")return!0;let o=e.getAttribute("role");if(o&&C.includes(o)||e.querySelector("input, textarea, select"))return!0;for(let n of C)if(e.querySelector(`[role="${n}"]`))return!0;return!1}function Ht(e,t){let o=te.get(e);o&&clearTimeout(o),te.set(e,setTimeout(()=>{te.delete(e),D(e,t)},wt))}function At(e){F||(F=new MutationObserver(t=>{for(let o of t){for(let n of o.addedNodes){if(!(n instanceof Element))continue;if(n instanceof HTMLFormElement){D(n,e);continue}let r=n.closest("form");r instanceof HTMLFormElement&&oe.has(r)&&$e(n)&&Ht(r,e);for(let a of Array.from(n.querySelectorAll("form")))D(a,e);$e(n)&&!n.closest("form")&&Mt(e)}for(let n of o.removedNodes){if(!(n instanceof Element))continue;let r=n instanceof HTMLFormElement?[n]:Array.from(n.querySelectorAll("form"));for(let a of r)xt(a,e)}}}),F.observe(document.body,{childList:!0,subtree:!0}))}function St(e){window.addEventListener("hashchange",()=>I(e));let t={pushState:history.pushState.bind(history),replaceState:history.replaceState.bind(history)};history.pushState=function(...o){t.pushState(...o),I(e)},history.replaceState=function(...o){t.replaceState(...o),I(e)},window.addEventListener("popstate",()=>I(e))}async function I(e){let t=Array.from(document.querySelectorAll("form"));await Promise.allSettled(t.map(o=>D(o,e)))}var vt=new Set(["password","hidden","file","submit","reset","button","image"]);async function _e(e){if(!L())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,r=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(i=>{if(i instanceof HTMLInputElement&&vt.has(i.type.toLowerCase()))return console.log(`[auto-webmcp] orphan: skipping excluded type "${i.type}" (name="${i.name}" id="${i.id}")`),!1;let l=i.getBoundingClientRect();return l.width===0||l.height===0?(console.log(`[auto-webmcp] orphan: skipping invisible input (name="${i.name}" id="${i.id}")`),!1):!0});if(console.log(`[auto-webmcp] orphan: found ${r.length} visible orphan input(s)`),r.length===0)return;let a=new Map;for(let i of r){let l=i.parentElement,s=i.parentElement??document.body;for(;l&&l!==document.body;){if(l.querySelector(o)!==null||Array.from(l.querySelectorAll("button")).some(u=>n.test(u.textContent??""))){s=l;break}l=l.parentElement}console.log(`[auto-webmcp] orphan: input (name="${i.name}" id="${i.id}") grouped into container`,s),a.has(s)||a.set(s,[]),a.get(s).push(i)}console.log(`[auto-webmcp] orphan: ${a.size} group(s) found`);for(let[i,l]of a){let s=Array.from(i.querySelectorAll(t)).filter(m=>{let g=m.getBoundingClientRect();return g.width>0&&g.height>0}),c=s[s.length-1]??null;if(!c){let m=Array.from(i.querySelectorAll(o)).filter(g=>{let f=g.getBoundingClientRect();return f.width>0&&f.height>0&&g.disabled});c=m[m.length-1]??null,c&&console.log(`[auto-webmcp] orphan: using disabled submit button as reference: "${c.textContent?.trim()}"`)}if(!c){let m=Array.from(i.querySelectorAll('button, [role="button"]')).filter(g=>{let f=g.getBoundingClientRect();return f.width>0&&f.height>0&&!g.disabled&&g.getAttribute("aria-disabled")!=="true"&&n.test(g.textContent??"")});c=m[m.length-1]??null,c&&console.log(`[auto-webmcp] orphan: using text-matched button in container: "${c.textContent?.trim()}"`)}if(!c){let m=i.closest('[role="dialog"], [aria-modal="true"]');if(m){let g=Array.from(m.querySelectorAll('button, [role="button"]')).filter(x=>{let S=x.getBoundingClientRect();return S.width>0&&S.height>0&&n.test(x.textContent??"")});console.log("[auto-webmcp] orphan: dialog buttons matching submit text:",g.map(x=>`"${x.textContent?.trim().slice(0,30)}" disabled=${x.disabled} aria-disabled=${x.getAttribute("aria-disabled")}`));let f=g.filter(x=>x.disabled||x.getAttribute("aria-disabled")==="true"),E=g.filter(x=>!x.disabled&&x.getAttribute("aria-disabled")!=="true"),y=f.length>0?f:E;c=y[y.length-1]??null,c&&console.log(`[auto-webmcp] orphan: using text-matched button in dialog: "${c.textContent?.trim().slice(0,40)}" disabled=${c.disabled} aria-disabled=${c.getAttribute("aria-disabled")}`)}}if(!c){let m=Array.from(document.querySelectorAll('button, [role="button"]')).filter(g=>{let f=g.getBoundingClientRect();return f.width>0&&f.height>0&&g.getAttribute("aria-disabled")!=="true"&&n.test(g.textContent??"")});c=m[m.length-1]??null,c&&console.log(`[auto-webmcp] orphan: using page-wide fallback submit button: "${c.textContent?.trim()}"`)}console.log("[auto-webmcp] orphan: submit button for group:",c?`"${c.textContent?.trim()}" disabled=${c.disabled}`:"none");let u=Le(i,l,c);console.log(`[auto-webmcp] orphan: tool="${u.name}" schema keys:`,Object.keys(u.inputSchema.properties));let d=[],p=u.inputSchema.properties,b=/^_r_[0-9a-z]+_$/i;for(let m of l){let g=m.id&&!b.test(m.id)?m.id:null,f=m.name||m.getAttribute("name")||m.dataset.webmcpName||g||m.getAttribute("aria-label")||m.getAttribute("placeholder")||null,E=f?f.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64):null,y=!!(E&&p[E]);console.log(`[auto-webmcp] orphan: field (name="${m.name??""}" id="${m.id}") rawKey="${f}" safeKey="${E}" matched=${y}`),y&&d.push({key:E,el:m})}if(console.log(`[auto-webmcp] orphan: ${d.length}/${l.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 T=u.name,w=async m=>{console.log(`[auto-webmcp] orphan execute: tool="${T}" params=`,m),console.log("[auto-webmcp] orphan execute: inputPairs=",d.map(E=>E.key));for(let{key:E,el:y}of d)m[E]!==void 0?(console.log(`[auto-webmcp] orphan execute: filling key="${E}" value=`,m[E],"element=",y),y.getAttribute("role")==="combobox"&&y.tagName.toLowerCase()==="button"?await Fe(y,m[E]):Ie(y,m[E]),console.log("[auto-webmcp] orphan execute: after fill, element value=",y.value)):console.log(`[auto-webmcp] orphan execute: key="${E}" not in params, skipping`);if(window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:T}})),!(e.autoSubmit||!!c?.hasAttribute("toolautosubmit")||c instanceof HTMLElement&&c.dataset.webmcpAutosubmit!==void 0||i.hasAttribute("toolautosubmit")||i instanceof HTMLElement&&i.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 f=null;if(c&&document.contains(c)){let E=!c.disabled&&c.getAttribute("aria-disabled")!=="true",y=c.getBoundingClientRect();E&&y.width>0&&y.height>0&&(f=c,console.log(`[auto-webmcp] orphan execute: using captured submit button "${f.textContent?.trim()}"`))}if(!f){let E=Date.now()+2e3;for(;Date.now()<E;){let y=Array.from(i.querySelectorAll(t)).filter(S=>{let ie=S.getBoundingClientRect();return ie.width>0&&ie.height>0}),x=y[y.length-1]??null;if(x){f=x;break}await new Promise(S=>setTimeout(S,100))}}if(!f){let E=Array.from((i!==document.body?i:document).querySelectorAll('button, [role="button"]')).filter(y=>{let x=y.getBoundingClientRect();return x.width>0&&x.height>0&&!y.disabled&&y.getAttribute("aria-disabled")!=="true"&&n.test(y.textContent??"")});f=E[E.length-1]??null,f&&console.log(`[auto-webmcp] orphan execute: using text-matched fallback button "${f.textContent?.trim()}"`)}return f?(console.log(`[auto-webmcp] orphan execute: clicking submit button "${f.textContent?.trim()}"`),f.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{if(ne.has(u.name)){console.log(`[auto-webmcp] orphan: "${u.name}" already registered, skipping`);continue}let m={name:u.name,description:u.description,inputSchema:u.inputSchema,execute:w};u.annotations&&Object.keys(u.annotations).length>0&&(m.annotations=u.annotations),await navigator.modelContext.registerTool(m),ne.add(u.name);let g=window.__pendingSubmitBtns??={};g[u.name]=c,e.debug&&console.log(`[auto-webmcp] Orphan tool registered: ${u.name}`,u)}catch{}}}function Ct(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 Ne(e){document.readyState==="loading"&&await new Promise(t=>document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})),Pe=0,ne.clear(),At(e),St(e),await I(e),await _e(e)}function Be(){F?.disconnect(),F=null}O();async function qe(e){let t=ae(e);return t.debug&&console.debug("[auto-webmcp] Initializing",{webmcpSupported:L(),config:t}),await Ne(t),{destroy:async()=>{Be(),await Y()},getTools:K,isSupported:L()}}typeof window<"u"&&!window.__AUTO_WEBMCP_NO_AUTOINIT&&qe();return Ve(kt);})();
|
|
1
|
+
"use strict";var AutoWebMCP=(()=>{var V=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Ke=Object.prototype.hasOwnProperty;var Ye=(e,t)=>{for(var o in t)V(e,o,{get:t[o],enumerable:!0})},Xe=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ge(t))!Ke.call(e,i)&&i!==o&&V(e,i,{get:()=>t[i],enumerable:!(n=ze(t,i))||n.enumerable});return e};var Qe=e=>Xe(V({},"__esModule",{value:!0}),e);var _t={};Ye(_t,{autoWebMCP:()=>Ve});function ce(e){return{exclude:e?.exclude??[],autoSubmit:e?.autoSubmit??!1,overrides:e?.overrides??{},debug:e?.debug??!1}}var k=["textbox","combobox","checkbox","radio","switch","spinbutton","searchbox","slider"];function G(e){return e instanceof HTMLInputElement?Ze(e):e instanceof HTMLTextAreaElement?{type:"string"}:e instanceof HTMLSelectElement?tt(e):null}function Ze(e){switch(e.type.toLowerCase()){case"text":case"search":case"tel":return z(e);case"email":return{...z(e),format:"email"};case"url":return{...z(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 z(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 et=/^(select|choose|pick)\b|^--+|---/i;function ue(e){return e.disabled?!0:e.value!==""?!1:et.test(e.text.trim())}function tt(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)||ue(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(ue(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 me(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 de(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 fe(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=nt(n);return{const:n.value,title:i||n.value}})}function pe(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 nt(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 be=0;function Ee(e,t){let o=t?.name??ot(e),n=t?.description??rt(e),{schema:i,fieldElements:s}=ut(e),r=at(e);return{name:o,description:n,inputSchema:i,annotations:r,fieldElements:s}}function ot(e){let t=e.getAttribute("toolname");if(t)return E(t);let o=e.dataset.webmcpName;if(o)return E(o);let n=K(e);if(n)return E(n);let i=he(e);if(i)return E(i);if(e.id)return E(e.id);if(e.name)return E(e.name);if(e.action){let s=it(e.action);if(s)return E(s)}return`form_${++be}`}function E(e){return e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64)||"form"}function K(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 he(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 it(e){try{let o=new URL(e,window.location.href).pathname.split("/").filter(Boolean);return o[o.length-1]??""}catch{return""}}function rt(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=he(e),c=document.title?.trim();return r&&c?`${r}: ${c}`:r||c||"Submit form"}var Te=/^(search|find|look|filter|browse|view|show|check|preview|get|fetch|retrieve|load)\b/i,ye=/^(delete|remove|cancel|terminate|destroy|purge|revoke|unsubscribe|deactivate)\b/i,st=/\/(delete|remove|cancel|destroy)\b/i;function at(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=K(e),s=i?Te.test(i.trim()):!1;(n||s)&&(t.readOnlyHint=!0)}if(t.destructiveHint===void 0){let n=K(e),i=n?ye.test(n.trim()):!1,s=e.action?st.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 lt(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 Le(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,...Le(n.shadowRoot,t))}return o}function ct(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 Le(e))o.has(n)||(t.push(n),o.add(n));return t}function ut(e){let t={},o=[],n=new Map,i=new Set,s=new Set,r=ct(e);for(let l of r){let u=l.name,m=u||Me(l);if(!m)continue;if(l instanceof HTMLInputElement&&l.type==="radio"){if(i.has(m))continue;i.add(m)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){if(s.has(m))continue;s.add(m)}let d=G(l);if(!d||!X(l))continue;d.title=xe(l);let b=He(l);b&&(d.description=b);let T=lt(l);if(T!==void 0&&(d.default=T),l instanceof HTMLInputElement&&l.type==="radio"){d.enum=de(e,m);let M=fe(e,m);M.length>0&&(d.oneOf=M);let f=Array.from(e.elements).find(p=>p instanceof HTMLInputElement&&p.type==="radio"&&p.name===m&&p.checked);f?.value&&(d.default=f.value)}if(l instanceof HTMLInputElement&&l.type==="checkbox"){let M=me(e,m);if(M.length>1){let f={type:"array",items:{type:"string",enum:M},title:d.title};d.description&&(f.description=d.description);let p=Array.from(e.elements).filter(h=>h instanceof HTMLInputElement&&h.type==="checkbox"&&h.name===m&&h.checked).map(h=>h.value);p.length>0&&(f.default=p),t[m]=f,l.required&&o.push(m);continue}}t[m]=d,u||n.set(m,l);let w=l.required;if(!w){let M=l;for(;;){let f=M.getRootNode();if(!(f instanceof ShadowRoot))break;let p=f.host;if(p.hasAttribute("required")||p.getAttribute("aria-required")==="true"){w=!0;break}M=p}}w&&o.push(m)}let c=ft(e),a=new Set;for(let{el:l,role:u,key:m,enumValues:d,enumOneOf:b}of c){if(t[m])continue;if(u==="radio"){if(a.has(m))continue;a.add(m)}let T=pe(l,u);d&&d.length>0&&(T.enum=d,b&&b.length>0&&(T.oneOf=b)),T.title=pt(l);let w=gt(l);w&&(T.description=w),t[m]=T,n.set(m,l),l.getAttribute("aria-required")==="true"&&o.push(m)}return{schema:{$schema:"https://json-schema.org/draft/2020-12/schema",type:"object",properties:t,required:o},fieldElements:n}}var we=/^_r_[0-9a-z]+_$|^:[a-z0-9]+:$/i;function Me(e){let t=e;if(t.dataset.webmcpName)return E(t.dataset.webmcpName);if(e.id&&!we.test(e.id))return E(e.id);let o=e.getAttribute("aria-label");if(o)return E(o);if((e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim())return E(e.placeholder.trim());let n=mt(e);return n||(e instanceof HTMLInputElement&&e.type!=="text"?e.type:null)}function mt(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),E(i);let s=n.getAttribute("label")||n.getAttribute("aria-label");if(s)return console.log("[auto-webmcp] shadow host key: label=",s),E(s);let r=n.getAttribute("name");if(r)return console.log("[auto-webmcp] shadow host key: name=",r),E(r);t=n}return null}function dt(e){if(e.dataset.webmcpName)return E(e.dataset.webmcpName);if(e.id&&!we.test(e.id))return E(e.id);let t=e.getAttribute("aria-label");if(t)return E(t);let o=e.getAttribute("placeholder");return o?E(o):null}function ft(e){let t=k.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=ge(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=ge(a);if(!u)continue;let m=l.map(b=>(b.getAttribute("data-value")??b.getAttribute("aria-label")??b.textContent??"").trim()).filter(Boolean),d=l.map(b=>{let T=(b.getAttribute("data-value")??b.getAttribute("aria-label")??b.textContent??"").trim(),w=(b.getAttribute("aria-label")??b.textContent??"").trim();return{const:T,title:w||T}}).filter(b=>b.const!=="");m.length>0&&c.push({el:a,role:"radio",key:u,enumValues:m,enumOneOf:d})}return[...i,...c,...r]}function ge(e){let t=e;if(t.dataset?.webmcpName)return E(t.dataset.webmcpName);if(e.id)return E(e.id);let o=e.getAttribute("aria-label");if(o)return E(o);let n=e.getAttribute("aria-labelledby");if(n){let i=document.getElementById(n)?.textContent?.trim();if(i)return E(i)}return null}function pt(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?Y(e.id):""}function gt(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 xe(e){if("dataset"in e&&e.dataset.webmcpTitle)return e.dataset.webmcpTitle;let t=bt(e);return t||(e.name?Y(e.name):e.id?Y(e.id):(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&e.placeholder?.trim()?e.placeholder.trim():"")}function He(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 bt(e){if(e.id){let i=document.querySelector(`label[for="${CSS.escape(e.id)}"]`);if(i){let s=B(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=B(s);if(r)return r}}let i=t.querySelector("label");if(i){let s=B(i);if(s)return s}}let o=e.closest("label");if(o){let i=B(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 B(e){let t=e.cloneNode(!0);return t.querySelectorAll("input, select, textarea, button").forEach(o=>o.remove()),t.textContent?.trim()??""}function Y(e){return e.replace(/[-_]/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().replace(/\b\w/g,t=>t.toUpperCase())}function X(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 Ae(e,t,o){let n=ht(e,o),i=Tt(e),{schema:s,fieldElements:r}=yt(t),c=Et(o);return{name:n,description:i,inputSchema:s,annotations:c,fieldElements:r}}function Et(e){let t={},o=e instanceof HTMLInputElement?e.value.trim():e?.textContent?.trim()??"";return Te.test(o)&&(t.readOnlyHint=!0,t.idempotentHint=!0),ye.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 ht(e,t){if(t){let i=t instanceof HTMLInputElement?t.value.trim():t.textContent?.trim()??"";if(i&&i.length>0&&i.length<80)return E(i)}let o=ve(e);if(o)return E(o);let n=document.title?.trim();return n?E(n):`form_${++be}`}function Tt(e){let t=ve(e),o=document.title?.trim();return t&&o&&t!==o?`${t} on ${o}`:t||o||"Submit form"}function ve(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 yt(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 m=dt(r);if(!m||!X(r))continue;let d={type:"string"};d.title=r.getAttribute("aria-label")??m;let b=(r.getAttribute("aria-description")??r.getAttribute("aria-describedby"),null);b&&(d.description=b),t[m]=d,n.set(m,r),o.push(m);continue}let c=r.name,a=(c?E(c):null)||Me(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=G(r);if(!l||!X(r))continue;l.title=xe(r);let u=He(r);if(u&&(l.description=u),r instanceof HTMLInputElement&&r.type==="checkbox"){let m=e.filter(d=>d instanceof HTMLInputElement&&d.type==="checkbox"&&d.name===a).map(d=>d.value).filter(d=>d!==""&&d!=="on");if(m.length>1){let d={type:"array",items:{type:"string",enum:m},title:l.title};l.description&&(d.description=l.description),t[a]=d,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 A=new Map,Q=new Map;function v(){return typeof navigator<"u"&&typeof navigator.modelContext<"u"}async function Se(e,t,o){if(!v())return;A.get(e)&&await _(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;Q.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{}}A.set(e,t.name)}async function _(e){if(!v())return;let t=A.get(e);if(!t)return;let o=Q.get(e);o&&(o.abort(),Q.delete(e));try{await navigator.modelContext.unregisterTool?.(t)}catch{}A.delete(e)}function Z(e){return A.get(e)}function P(){return Array.from(A.entries()).map(([e,t])=>({form:e,name:t}))}async function Ce(){let e=Array.from(A.entries());await Promise.all(e.map(([t])=>_(t)))}var N=new WeakMap,Fe=new WeakMap,q=new WeakMap,H=new WeakMap,S=new WeakMap,D=new WeakMap,Lt=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value")?.set,wt=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,"value")?.set,C=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked")?.set;function Oe(e,t,o,n){return n?.fieldElements&&q.set(e,n.fieldElements),ke(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(l=>{let u=window.confirm(`Agent requested a destructive action via "${o}". Continue?`);l(u)})))return window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:o}})),{content:[{type:"text",text:`Cancelled "${o}" by user.`}]};S.set(e,[]),H.delete(e),ee(e,i);let c=Ht(n,i);return c.length>0&&H.set(e,c),window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:o}})),new Promise((a,l)=>{N.set(e,{resolve:a,reject:l}),(t.autoSubmit||e.hasAttribute("toolautosubmit")||e.dataset.webmcpAutosubmit!==void 0)&&Ie(e).then(async()=>{try{ee(e,i);for(let m=0;m<2&&xt(e,i,q.get(e)).length!==0;m++)ee(e,i),await Ie(e,400,100);let u=e;if(!e.isConnected){let d=document.querySelector('button[type="submit"]:not([disabled]), input[type="submit"]:not([disabled])')?.closest("form");d&&(u=d,N.set(u,{resolve:a,reject:l}),ke(u,o))}u!==e&&H.has(e)&&(H.set(u,H.get(e)),H.delete(e)),u.requestSubmit()}catch(u){l(u instanceof Error?u:new Error(String(u)))}})})}}function ke(e,t){e.__awmcp_intercepted||(e.__awmcp_intercepted=!0,e.addEventListener("submit",o=>{let n=N.get(e);if(!n)return;let{resolve:i}=n;N.delete(e);let s=Mt(e,Fe.get(e),q.get(e));D.delete(e);let r=H.get(e)??[];H.delete(e);let c=S.get(e)??[];S.delete(e);let a=c.filter(T=>T.type==="not_filled").map(T=>T.field),l={status:r.length>0||a.length>0?"partial":"success",filled_fields:s,skipped_fields:a,missing_required:r,warnings:[...r.map(T=>({field:T,type:"missing_required",message:`required field "${T}" was not provided`})),...c]},u=[...r.length?[`required fields were not filled: ${r.join(", ")}`]:[],...c.map(T=>T.message)],m=u.length?` Note: ${u.join("; ")}.`:"",b={content:[{type:"text",text:`Form submitted. Fields: ${JSON.stringify(s)}${m}`},{type:"text",text:JSON.stringify(l)}]};o.agentInvoked&&typeof o.respondWith=="function"&&(o.preventDefault(),o.respondWith(Promise.resolve(b))),i(b)}),e.addEventListener("reset",()=>{D.delete(e),window.dispatchEvent(new CustomEvent("toolcancel",{detail:{toolName:t}}))}))}function R(e,t){if(e.focus(),e.select?.(),document.execCommand("insertText",!1,t)&&e.value===t)return;let o=e instanceof HTMLTextAreaElement?wt:Lt;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 te(e,t){C?C.call(e,t):e.checked=t,e.dispatchEvent(new Event("change",{bubbles:!0}))}function W(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=W(n,t);if(s)return s}return null}function ne(e,t,o){return Array.from(e.elements).filter(n=>n instanceof HTMLInputElement&&n.type===t&&n.name===o)}function ie(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||(W(document,`[name="${n}"]`)??W(document,`input#${n}, textarea#${n}, select#${n}`))}function ee(e,t){Fe.set(e,t);let o=q.get(e),n={};for(let[i,s]of Object.entries(t)){let r=ie(e,i);if(r){r instanceof HTMLInputElement?(Re(r,e,i,s),r.type==="checkbox"?Array.isArray(s)?n[i]=ne(e,"checkbox",i).filter(a=>a.checked).map(a=>a.value):n[i]=r.checked:n[i]=r.value):r instanceof HTMLTextAreaElement?(R(r,String(s??"")),n[i]=r.value):r instanceof HTMLSelectElement&&(oe(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)??W(document,`#${CSS.escape(l)}`);u&&(a=u)}}a instanceof HTMLInputElement?(Re(a,e,i,s),n[i]=a.type==="checkbox"?a.checked:a.value):a instanceof HTMLTextAreaElement?(R(a,String(s??"")),n[i]=a.value):a instanceof HTMLSelectElement?(oe(a,s,e,i),n[i]=a.multiple?Array.from(a.options).filter(l=>l.selected).map(l=>l.value):a.value):($e(a,s),n[i]=s)}}D.set(e,n),window.__lastFillWarnings=S.get(e)??[]}function Re(e,t,o,n){let i=e.type.toLowerCase();if(i==="checkbox"){if(Array.isArray(n)){let s=ne(t,"checkbox",o);for(let r of s)te(r,n.map(String).includes(r.value));return}te(e,!!n);return}if(i==="number"||i==="range"){let s=String(n??""),r=Number(s);if(s===""||isNaN(r)){S.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);S.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=ne(t,"radio",o);for(let r of s)if(r.value===String(n)){C?C.call(r,!0):r.checked=!0,r.dispatchEvent(new Event("change",{bubbles:!0}));break}return}R(e,String(n??""))}function oe(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&&S.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 $e(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 Mt(e,t,o){let n={},i=new FormData(e),s=D.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=ie(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 Be(e,t){if(e instanceof HTMLInputElement){let o=e.type.toLowerCase();o==="checkbox"?te(e,!!t):o==="radio"?e.value===String(t)&&(C?C.call(e,!0):e.checked=!0,e.dispatchEvent(new Event("change",{bubbles:!0}))):R(e,String(t??""))}else e instanceof HTMLTextAreaElement?R(e,String(t??"")):e instanceof HTMLSelectElement?oe(e,t):$e(e,t)}function Ie(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 xt(e,t,o){let n=[];for(let[i,s]of Object.entries(t)){let r=ie(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 Ht(e,t){return e?.inputSchema?.required?.length?e.inputSchema.required.filter(o=>!(o in t)):[]}async function _e(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 qe(e,t,o){window.dispatchEvent(new CustomEvent(e,{detail:{form:t,toolName:o}}))}function At(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 Pe(e,t){let o=`_${t}`;return`${e.slice(0,Math.max(1,64-o.length))}${o}`}function vt(e){let t=new Set(j);for(let{form:o,name:n}of P())e&&o===e||t.add(n);return t}function De(e,t){let o=vt(t);if(!o.has(e))return e;let n=2,i=Pe(e,n);for(;o.has(i);)n++,i=Pe(e,n);return i}async function F(e,t){if(At(e,t))return;let o=Z(e),n;for(let[l,u]of Object.entries(t.overrides))try{if(e.matches(l)){n=u;break}}catch{}let i=Ee(e,n),s=De(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&&Bt(i.name,i.description);let r=Oe(e,t,i.name,i);await Se(e,i,r),$.add(e),We++;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),qe("form:registered",e,i.name)}async function St(e,t){let o=Z(e);if(!o)return;await _(e),$.delete(e);let n=window.__pendingSubmitBtns;n&&delete n[o],t.debug&&console.log(`[auto-webmcp] Unregistered: ${o}`),qe("form:unregistered",e,o)}var O=null,$=new WeakSet,We=0,re=new Map,Ct=300,J=null,kt=500,j=new Set;function Ne(e){J&&clearTimeout(J),J=setTimeout(()=>{J=null,Je(e)},kt)}function se(e){let t=e.tagName.toLowerCase();if(t==="input"||t==="textarea"||t==="select")return!0;let o=e.getAttribute("role");if(o&&k.includes(o)||e.querySelector("input, textarea, select"))return!0;for(let n of k)if(e.querySelector(`[role="${n}"]`))return!0;return!1}function ae(e,t){let o=re.get(e);o&&clearTimeout(o),re.set(e,setTimeout(()=>{re.delete(e),F(e,t)},Ct))}function Rt(e,t){let o=document.getElementById(e);o instanceof HTMLFormElement&&$.has(o)&&ae(o,t)}function It(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 Ft(e){O||(O=new MutationObserver(t=>{for(let o of t){if(o.type==="attributes"&&o.target instanceof Element){let n=o.target,i=It(n);i&&$.has(i)?ae(i,e):n instanceof HTMLFormElement?F(n,e):se(n)&&!n.closest("form")&&Ne(e),o.attributeName==="form"&&o.oldValue&&Rt(o.oldValue,e);continue}for(let n of o.addedNodes){if(!(n instanceof Element))continue;if(n instanceof HTMLFormElement){F(n,e);continue}let i=n.closest("form");i instanceof HTMLFormElement&&$.has(i)&&se(n)&&ae(i,e);for(let s of Array.from(n.querySelectorAll("form")))F(s,e);se(n)&&!n.closest("form")&&Ne(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)St(s,e)}}}),O.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeOldValue:!0}))}function Ot(e){window.addEventListener("hashchange",()=>I(e));let t={pushState:history.pushState.bind(history),replaceState:history.replaceState.bind(history)};history.pushState=function(...o){t.pushState(...o),I(e)},history.replaceState=function(...o){t.replaceState(...o),I(e)},window.addEventListener("popstate",()=>I(e))}async function I(e){let t=Array.from(document.querySelectorAll("form"));await Promise.allSettled(t.map(o=>F(o,e)))}var $t=new Set(["password","hidden","file","submit","reset","button","image"]);async function Je(e){if(!v())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&&$t.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 p=f.getBoundingClientRect();return p.width>0&&p.height>0}),l=a[a.length-1]??null;if(!l){let f=Array.from(r.querySelectorAll(o)).filter(p=>{let h=p.getBoundingClientRect();return h.width>0&&h.height>0&&p.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(p=>{let h=p.getBoundingClientRect();return h.width>0&&h.height>0&&!p.disabled&&p.getAttribute("aria-disabled")!=="true"&&n.test(p.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 p=Array.from(f.querySelectorAll('button, [role="button"]')).filter(g=>{let x=g.getBoundingClientRect();return x.width>0&&x.height>0&&n.test(g.textContent??"")});console.log("[auto-webmcp] orphan: dialog buttons matching submit text:",p.map(g=>`"${g.textContent?.trim().slice(0,30)}" disabled=${g.disabled} aria-disabled=${g.getAttribute("aria-disabled")}`));let h=p.filter(g=>g.disabled||g.getAttribute("aria-disabled")==="true"),L=p.filter(g=>!g.disabled&&g.getAttribute("aria-disabled")!=="true"),y=h.length>0?h:L;l=y[y.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(p=>{let h=p.getBoundingClientRect();return h.width>0&&h.height>0&&p.getAttribute("aria-disabled")!=="true"&&n.test(p.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=Ae(r,c,l);if(j.has(u.name)){console.log(`[auto-webmcp] orphan: "${u.name}" already registered, skipping`);continue}let m=De(u.name);m!==u.name&&e.debug&&console.warn(`[auto-webmcp] orphan tool name collision: "${u.name}" renamed to "${m}"`),u.name=m,console.log(`[auto-webmcp] orphan: tool="${u.name}" schema keys:`,Object.keys(u.inputSchema.properties));let d=[],b=u.inputSchema.properties,T=/^_r_[0-9a-z]+_$/i;for(let f of c){let p=f.id&&!T.test(f.id)?f.id:null,h=f.name||f.getAttribute("name")||f.dataset.webmcpName||p||f.getAttribute("aria-label")||f.getAttribute("placeholder")||null,L=h?h.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").slice(0,64):null,y=!!(L&&b[L]);console.log(`[auto-webmcp] orphan: field (name="${f.name??""}" id="${f.id}") rawKey="${h}" safeKey="${L}" matched=${y}`),y&&d.push({key:L,el:f})}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 w=u.name,M=async(f,p)=>{console.log(`[auto-webmcp] orphan execute: tool="${w}" params=`,f),console.log("[auto-webmcp] orphan execute: inputPairs=",d.map(y=>y.key));for(let{key:y,el:g}of d)f[y]!==void 0?(console.log(`[auto-webmcp] orphan execute: filling key="${y}" value=`,f[y],"element=",g),g.getAttribute("role")==="combobox"&&g.tagName.toLowerCase()==="button"?await _e(g,f[y]):Be(g,f[y]),console.log("[auto-webmcp] orphan execute: after fill, element value=",g.value)):console.log(`[auto-webmcp] orphan execute: key="${y}" not in params, skipping`);if(window.dispatchEvent(new CustomEvent("toolactivated",{detail:{toolName:w}})),!(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 y=!l.disabled&&l.getAttribute("aria-disabled")!=="true",g=l.getBoundingClientRect();y&&g.width>0&&g.height>0&&(L=l,console.log(`[auto-webmcp] orphan execute: using captured submit button "${L.textContent?.trim()}"`))}if(!L){let y=Date.now()+2e3;for(;Date.now()<y;){let g=Array.from(r.querySelectorAll(t)).filter(U=>{let le=U.getBoundingClientRect();return le.width>0&&le.height>0}),x=g[g.length-1]??null;if(x){L=x;break}await new Promise(U=>setTimeout(U,100))}}if(!L){let y=Array.from((r!==document.body?r:document).querySelectorAll('button, [role="button"]')).filter(g=>{let x=g.getBoundingClientRect();return x.width>0&&x.height>0&&!g.disabled&&g.getAttribute("aria-disabled")!=="true"&&n.test(g.textContent??"")});L=y[y.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:M};u.annotations&&Object.keys(u.annotations).length>0&&(f.annotations=u.annotations),await navigator.modelContext.registerTool(f),j.add(u.name);let p=window.__pendingSubmitBtns??={};p[u.name]=l,e.debug&&console.log(`[auto-webmcp] Orphan tool registered: ${u.name}`,u)}catch{}}}function Bt(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 je(e){document.readyState==="loading"&&await new Promise(t=>document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})),We=0,j.clear(),Ft(e),Ot(e),await I(e),await Je(e)}function Ue(){O?.disconnect(),O=null}async function Ve(e){let t=ce(e);return t.debug&&console.debug("[auto-webmcp] Initializing",{webmcpSupported:v(),config:t}),await je(t),{destroy:async()=>{Ue(),await Ce()},getTools:P,isSupported:v()}}typeof window<"u"&&!window.__AUTO_WEBMCP_NO_AUTOINIT&&Ve();return Qe(_t);})();
|
|
2
2
|
//# sourceMappingURL=auto-webmcp.iife.js.map
|