dat2ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ var Dat2AI=function(t){"use strict";const e="[dat2ai]";class n{constructor(t=!1){this.events=[],this.debugMode=t}debug(t,...n){this.debugMode&&console.debug(e,t,...n)}info(t,...n){console.info(e,t,...n)}warn(t,...n){console.warn(e,t,...n)}error(t,...n){console.error(e,t,...n)}addEvent(t){this.events.push(t),this.debug("Event recorded:",t.eventType,t.toolName)}getEvents(){return[...this.events]}clearEvents(){this.events=[]}}class o{constructor(t){this.tools=[],this.observer=null,this.logger=t}enable(t){this.tools=t;for(const e of t)this.applyTool(e);this.observeDom()}addTool(t){this.tools.push(t),this.applyTool(t)}applyTool(t){const e=document.querySelectorAll(t.formSelector);0!==e.length?e.forEach(e=>this.applyToForm(e,t)):this.logger.debug(`No form found for selector: ${t.formSelector}`)}applyToForm(t,e){if(t.hasAttribute("toolname"))this.logger.debug(`Form already has toolname, skipping: ${e.formSelector}`);else{if(t.setAttribute("toolname",e.toolName),t.setAttribute("tooldescription",e.toolDescription),e.autoSubmit&&t.setAttribute("toolautosubmit","true"),e.fields)for(const n of e.fields){const o=t.querySelector(n.fieldSelector);o?(o.setAttribute("toolparamtitle",n.paramTitle),o.setAttribute("toolparamdescription",n.paramDescription)):this.logger.debug(`Field not found: ${n.fieldSelector} in ${e.formSelector}`)}this.logger.debug(`Enabled tool "${e.toolName}" on ${e.formSelector}`)}}observeDom(){this.observer||"undefined"==typeof MutationObserver||(this.observer=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes){if(!(t instanceof HTMLElement))continue;const e="FORM"===t.tagName?[t]:Array.from(t.querySelectorAll("form"));for(const t of e)for(const e of this.tools)t.matches(e.formSelector)&&this.applyToForm(t,e)}}),this.observer.observe(document.body,{childList:!0,subtree:!0}))}destroy(){this.observer&&(this.observer.disconnect(),this.observer=null),this.tools=[]}}const i=[[/Gemini/i,"extension"],[/Google-Extended/i,"browser_agent"],[/ChatGPT/i,"extension"],[/Claude/i,"extension"],[/Copilot/i,"extension"],[/HeadlessChrome/i,"automated"],[/Puppeteer/i,"automated"],[/Playwright/i,"automated"],[/Selenium/i,"automated"]];function s(t){if(t&&"agentInvoked"in t&&!0===t.agentInvoked)return{agentType:"browser_agent",userAgent:navigator.userAgent};const e=navigator.userAgent;for(const[t,n]of i)if(t.test(e))return{agentType:n,userAgent:e};return{agentType:"unknown",userAgent:e}}class r{constructor(t,e,n,o){this.handlers=new Map,this.siteKey=t,this.logger=e,this.consent=n,this.rateLimiter=o,this.boundSubmitHandler=this.handleSubmit.bind(this),this.boundToolActivated=this.handleToolActivated.bind(this),this.boundToolCancel=this.handleToolCancel.bind(this)}start(){document.addEventListener("submit",this.boundSubmitHandler,!0),document.addEventListener("toolactivated",this.boundToolActivated,!0),document.addEventListener("toolcancel",this.boundToolCancel,!0),this.logger.debug("Interceptor started")}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){this.handlers.get(t)?.delete(e)}handleSubmit(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;if(!("unknown"!==s(t).agentType||"agentInvoked"in t&&!0===t.agentInvoked))return;const n=e.getAttribute("toolname")||"unknown";if(this.consent&&this.consent.config.required&&!this.consent.hasConsent()){const n=this.createEvent(e,"consent_denied",t);return n.consentGiven=!1,this.logger.addEvent(n),this.emit("consentDenied",n),this.consent.requestConsent(),void t.preventDefault()}if(this.rateLimiter){const o=this.rateLimiter.checkLimit(n);if("ok"!==o){const n=this.createEvent(e,"rate_limited",t);return n.rateLimitStatus=o,this.logger.addEvent(n),this.emit("rateLimited",n),void t.preventDefault()}}const o=this.createEvent(e,"invocation",t);o.consentGiven=!!this.consent&&this.consent.hasConsent(),o.rateLimitStatus="ok",this.logger.addEvent(o),this.emit("invocation",o)}handleToolActivated(t){const e=t.target;e&&e.hasAttribute("toolname")&&this.logger.debug("Tool activated:",e.getAttribute("toolname"))}handleToolCancel(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;const n=this.createEvent(e,"cancel",t);this.logger.addEvent(n),this.emit("cancel",n)}createEvent(t,e,n){const o=t.getAttribute("toolname")||"unknown",i=s(n),r=t.id?`#${t.id}`:t.getAttribute("name")?`form[name="${t.getAttribute("name")}"]`:t.className?`form.${t.className.split(" ")[0]}`:"form";return{id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),timestamp:(new Date).toISOString(),siteKey:this.siteKey,toolName:o,formSelector:r,eventType:e,agentInfo:i,consentGiven:!1,rateLimitStatus:"ok"}}emit(t,e){const n=this.handlers.get(t);if(n)for(const t of n)try{t(e)}catch(t){this.logger.error("Event handler error:",t)}}destroy(){document.removeEventListener("submit",this.boundSubmitHandler,!0),document.removeEventListener("toolactivated",this.boundToolActivated,!0),document.removeEventListener("toolcancel",this.boundToolCancel,!0),this.handlers.clear(),this.logger.debug("Interceptor destroyed")}}class a{constructor(t){this.bannerEl=null,this.pendingPromise=null,this.config=t,this.storageKey=t.storageKey||"dat2ai_consent"}hasConsent(){try{return"granted"===localStorage.getItem(this.storageKey)}catch{return!1}}requestConsent(){return this.bannerEl?new Promise(t=>{this.pendingPromise={resolve:t}}):new Promise(t=>{this.pendingPromise={resolve:t},this.bannerEl=this.buildBanner(),document.body.appendChild(this.bannerEl)})}revokeConsent(){try{localStorage.removeItem(this.storageKey)}catch{}}getStorageKey(){return this.storageKey}destroy(){this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise=null}handleDecision(t){try{localStorage.setItem(this.storageKey,t?"granted":"denied")}catch{}this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise&&(this.pendingPromise.resolve(t),this.pendingPromise=null)}buildBanner(){const t=document,e=t.createElement("div");e.id="dat2ai-consent-banner",e.setAttribute("role","dialog"),e.setAttribute("aria-label","AI Agent Consent"),e.style.cssText="position:fixed;bottom:0;left:0;right:0;padding:16px;background:var(--dat2ai-banner-bg,#1a1a2e);color:var(--dat2ai-banner-text,#fff);font:14px/1.4 system-ui,sans-serif;z-index:999999;display:flex;align-items:center;gap:12px";const n=t.createElement("p");n.style.cssText="margin:0;flex:1",n.textContent=this.config.bannerText||"This site allows AI agents to interact with forms.",e.appendChild(n);const o="padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font:inherit;font-weight:600",i=t.createElement("button");i.textContent="Accept",i.setAttribute("aria-label","Accept AI agent interactions"),i.style.cssText=o+";background:var(--dat2ai-btn-accept-bg,#4CAF50);color:var(--dat2ai-btn-accept-text,#fff)",i.addEventListener("click",()=>this.handleDecision(!0)),e.appendChild(i);const s=t.createElement("button");if(s.textContent="Reject",s.setAttribute("aria-label","Reject AI agent interactions"),s.style.cssText=o+";background:var(--dat2ai-btn-reject-bg,#666);color:var(--dat2ai-btn-reject-text,#fff)",s.addEventListener("click",()=>this.handleDecision(!1)),e.appendChild(s),this.config.policyUrl){const n=t.createElement("a");n.href=this.config.policyUrl,n.target="_blank",n.rel="noopener",n.textContent="More info",n.style.cssText="color:var(--dat2ai-link-color,#90CAF9);text-decoration:underline",e.appendChild(n)}return e}}class l{constructor(t){this.globalWindow=[],this.toolWindows=new Map,this.cooldownUntil=0,this.config=t}checkLimit(t){const e=Date.now();if(e<this.cooldownUntil)return"blocked";if(this.globalWindow=this.globalWindow.filter(t=>e-t<6e4),this.globalWindow.length>=this.config.maxInvocationsPerMinute)return this.cooldownUntil=e+1e3*(this.config.cooldownSeconds??60),"limited";if(this.config.maxPerTool){this.toolWindows.has(t)||this.toolWindows.set(t,[]);const n=this.toolWindows.get(t).filter(t=>e-t<6e4);if(this.toolWindows.set(t,n),n.length>=this.config.maxPerTool)return"limited";n.push(e)}return this.globalWindow.push(e),"ok"}reset(){this.globalWindow=[],this.toolWindows.clear(),this.cooldownUntil=0}}const d="dat2ai_retry_queue";class c{constructor(t,e,n){this.intervalId=null,this.apiEndpoint=t,this.siteKey=e,this.logger=n,this.boundBeforeUnload=this.onBeforeUnload.bind(this)}start(){this.intervalId=setInterval(()=>{this.flush()},5e3),window.addEventListener("beforeunload",this.boundBeforeUnload)}async flush(){const t=this.logger.getEvents();let e=[];try{const t=sessionStorage.getItem(d);t&&(e=JSON.parse(t))}catch{}const n=[...e,...t];if(0!==n.length)try{if(!(await fetch(this.apiEndpoint+"/api/events",{method:"POST",headers:{"Content-Type":"application/json","X-Site-Key":this.siteKey},body:JSON.stringify(n)})).ok)throw new Error("Non-2xx");this.logger.clearEvents();try{sessionStorage.removeItem(d)}catch{}}catch{const t=n.slice(-100);try{sessionStorage.setItem(d,JSON.stringify(t))}catch{}this.logger.clearEvents()}}destroy(){null!==this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),window.removeEventListener("beforeunload",this.boundBeforeUnload),this.onBeforeUnload()}onBeforeUnload(){const t=this.logger.getEvents();if(0===t.length)return;const e=this.apiEndpoint+"/api/events?siteKey="+encodeURIComponent(this.siteKey),n=new Blob([JSON.stringify(t)],{type:"application/json"});if("undefined"!=typeof navigator&&navigator.sendBeacon)navigator.sendBeacon(e,n);else try{fetch(e,{method:"POST",body:n,keepalive:!0})}catch{}this.logger.clearEvents()}}class h{constructor(t){this.config=t,this.logger=new n(t.debug??!1),t.consent&&(this.consent=new a(t.consent)),t.rateLimiting&&(this.rateLimiter=new l(t.rateLimiting)),this.enabler=new o(this.logger),this.interceptor=new r(t.siteKey,this.logger,this.consent,this.rateLimiter),this.logger.info(`Initialized for site: ${t.siteKey}`),t.enabler?.tools?.length&&this.enabler.enable(t.enabler.tools),this.interceptor.start(),!t.offline&&t.apiEndpoint&&(this.reporter=new c(t.apiEndpoint,t.siteKey,this.logger),this.reporter.start())}static init(t){return new h(t)}enableTool(t){this.enabler.addTool(t),this.logger.debug(`Tool added: ${t.toolName}`)}on(t,e){this.interceptor.on(t,e)}off(t,e){this.interceptor.off(t,e)}getEvents(){return this.logger.getEvents()}getConfig(){return{...this.config}}hasConsent(){return this.consent?.hasConsent()??!1}destroy(){this.reporter?.destroy(),this.consent?.destroy(),this.enabler.destroy(),this.interceptor.destroy(),this.logger.info("Destroyed")}}return"undefined"!=typeof window&&window.Dat2AIConfig&&(window.Dat2AIInstance=h.init(window.Dat2AIConfig)),t.ConsentManager=a,t.Dat2AI=h,t.RateLimiter=l,t.Reporter=c,t}({});
2
+ //# sourceMappingURL=dat2ai.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dat2ai.min.js","sources":["../src/logger.ts","../src/enabler.ts","../src/detector.ts","../src/interceptor.ts","../src/consent.ts","../src/rate-limiter.ts","../src/reporter.ts","../src/shield.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","Logger","constructor","debug","this","events","debugMode","msg","args","console","info","warn","error","addEvent","event","push","eventType","toolName","getEvents","clearEvents","Enabler","logger","tools","observer","enable","tool","applyTool","observeDom","addTool","forms","document","querySelectorAll","formSelector","length","forEach","form","applyToForm","hasAttribute","setAttribute","toolDescription","autoSubmit","fields","field","el","querySelector","fieldSelector","paramTitle","paramDescription","MutationObserver","mutations","mutation","node","addedNodes","HTMLElement","tagName","Array","from","matches","observe","body","childList","subtree","destroy","disconnect","AGENT_PATTERNS","detectAgent","agentInvoked","agentType","userAgent","navigator","ua","pattern","type","test","Interceptor","siteKey","consent","rateLimiter","handlers","Map","boundSubmitHandler","handleSubmit","bind","boundToolActivated","handleToolActivated","boundToolCancel","handleToolCancel","start","addEventListener","on","handler","has","set","Set","get","add","off","delete","e","target","getAttribute","config","required","hasConsent","createEvent","consentGiven","emit","requestConsent","preventDefault","status","checkLimit","rateLimitStatus","originalEvent","agentInfo","id","className","split","Date","now","toString","Math","random","slice","timestamp","toISOString","name","err","removeEventListener","clear","ConsentManager","bannerEl","pendingPromise","storageKey","localStorage","getItem","Promise","resolve","buildBanner","appendChild","revokeConsent","removeItem","getStorageKey","parentNode","removeChild","handleDecision","granted","setItem","d","banner","createElement","style","cssText","text","textContent","bannerText","btnCss","accept","reject","policyUrl","link","href","rel","RateLimiter","globalWindow","toolWindows","cooldownUntil","filter","t","maxInvocationsPerMinute","cooldownSeconds","maxPerTool","pruned","reset","RETRY_KEY","Reporter","apiEndpoint","intervalId","boundBeforeUnload","onBeforeUnload","setInterval","flush","window","retryQueue","stored","sessionStorage","JSON","parse","all","fetch","method","headers","stringify","ok","Error","toStore","clearInterval","url","encodeURIComponent","blob","Blob","sendBeacon","keepalive","Dat2AI","rateLimiting","enabler","interceptor","offline","reporter","init","enableTool","getConfig","Dat2AIConfig","Dat2AIInstance","_Shield"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const t="[dat2ai]";class e{constructor(t=!1){this.events=[],this.debugMode=t}debug(e,...n){this.debugMode&&console.debug(t,e,...n)}info(e,...n){console.info(t,e,...n)}warn(e,...n){console.warn(t,e,...n)}error(e,...n){console.error(t,e,...n)}addEvent(t){this.events.push(t),this.debug("Event recorded:",t.eventType,t.toolName)}getEvents(){return[...this.events]}clearEvents(){this.events=[]}}class n{constructor(t){this.tools=[],this.observer=null,this.logger=t}enable(t){this.tools=t;for(const e of t)this.applyTool(e);this.observeDom()}addTool(t){this.tools.push(t),this.applyTool(t)}applyTool(t){const e=document.querySelectorAll(t.formSelector);0!==e.length?e.forEach(e=>this.applyToForm(e,t)):this.logger.debug(`No form found for selector: ${t.formSelector}`)}applyToForm(t,e){if(t.hasAttribute("toolname"))this.logger.debug(`Form already has toolname, skipping: ${e.formSelector}`);else{if(t.setAttribute("toolname",e.toolName),t.setAttribute("tooldescription",e.toolDescription),e.autoSubmit&&t.setAttribute("toolautosubmit","true"),e.fields)for(const n of e.fields){const o=t.querySelector(n.fieldSelector);o?(o.setAttribute("toolparamtitle",n.paramTitle),o.setAttribute("toolparamdescription",n.paramDescription)):this.logger.debug(`Field not found: ${n.fieldSelector} in ${e.formSelector}`)}this.logger.debug(`Enabled tool "${e.toolName}" on ${e.formSelector}`)}}observeDom(){this.observer||"undefined"==typeof MutationObserver||(this.observer=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes){if(!(t instanceof HTMLElement))continue;const e="FORM"===t.tagName?[t]:Array.from(t.querySelectorAll("form"));for(const t of e)for(const e of this.tools)t.matches(e.formSelector)&&this.applyToForm(t,e)}}),this.observer.observe(document.body,{childList:!0,subtree:!0}))}destroy(){this.observer&&(this.observer.disconnect(),this.observer=null),this.tools=[]}}const o=[[/Gemini/i,"extension"],[/Google-Extended/i,"browser_agent"],[/ChatGPT/i,"extension"],[/Claude/i,"extension"],[/Copilot/i,"extension"],[/HeadlessChrome/i,"automated"],[/Puppeteer/i,"automated"],[/Playwright/i,"automated"],[/Selenium/i,"automated"]];function i(t){if(t&&"agentInvoked"in t&&!0===t.agentInvoked)return{agentType:"browser_agent",userAgent:navigator.userAgent};const e=navigator.userAgent;for(const[t,n]of o)if(t.test(e))return{agentType:n,userAgent:e};return{agentType:"unknown",userAgent:e}}class s{constructor(t,e,n,o){this.handlers=new Map,this.siteKey=t,this.logger=e,this.consent=n,this.rateLimiter=o,this.boundSubmitHandler=this.handleSubmit.bind(this),this.boundToolActivated=this.handleToolActivated.bind(this),this.boundToolCancel=this.handleToolCancel.bind(this)}start(){document.addEventListener("submit",this.boundSubmitHandler,!0),document.addEventListener("toolactivated",this.boundToolActivated,!0),document.addEventListener("toolcancel",this.boundToolCancel,!0),this.logger.debug("Interceptor started")}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){this.handlers.get(t)?.delete(e)}handleSubmit(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;if(!("unknown"!==i(t).agentType||"agentInvoked"in t&&!0===t.agentInvoked))return;const n=e.getAttribute("toolname")||"unknown";if(this.consent&&this.consent.config.required&&!this.consent.hasConsent()){const n=this.createEvent(e,"consent_denied",t);return n.consentGiven=!1,this.logger.addEvent(n),this.emit("consentDenied",n),this.consent.requestConsent(),void t.preventDefault()}if(this.rateLimiter){const o=this.rateLimiter.checkLimit(n);if("ok"!==o){const n=this.createEvent(e,"rate_limited",t);return n.rateLimitStatus=o,this.logger.addEvent(n),this.emit("rateLimited",n),void t.preventDefault()}}const o=this.createEvent(e,"invocation",t);o.consentGiven=!!this.consent&&this.consent.hasConsent(),o.rateLimitStatus="ok",this.logger.addEvent(o),this.emit("invocation",o)}handleToolActivated(t){const e=t.target;e&&e.hasAttribute("toolname")&&this.logger.debug("Tool activated:",e.getAttribute("toolname"))}handleToolCancel(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;const n=this.createEvent(e,"cancel",t);this.logger.addEvent(n),this.emit("cancel",n)}createEvent(t,e,n){const o=t.getAttribute("toolname")||"unknown",s=i(n),r=t.id?`#${t.id}`:t.getAttribute("name")?`form[name="${t.getAttribute("name")}"]`:t.className?`form.${t.className.split(" ")[0]}`:"form";return{id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),timestamp:(new Date).toISOString(),siteKey:this.siteKey,toolName:o,formSelector:r,eventType:e,agentInfo:s,consentGiven:!1,rateLimitStatus:"ok"}}emit(t,e){const n=this.handlers.get(t);if(n)for(const t of n)try{t(e)}catch(t){this.logger.error("Event handler error:",t)}}destroy(){document.removeEventListener("submit",this.boundSubmitHandler,!0),document.removeEventListener("toolactivated",this.boundToolActivated,!0),document.removeEventListener("toolcancel",this.boundToolCancel,!0),this.handlers.clear(),this.logger.debug("Interceptor destroyed")}}class r{constructor(t){this.bannerEl=null,this.pendingPromise=null,this.config=t,this.storageKey=t.storageKey||"dat2ai_consent"}hasConsent(){try{return"granted"===localStorage.getItem(this.storageKey)}catch{return!1}}requestConsent(){return this.bannerEl?new Promise(t=>{this.pendingPromise={resolve:t}}):new Promise(t=>{this.pendingPromise={resolve:t},this.bannerEl=this.buildBanner(),document.body.appendChild(this.bannerEl)})}revokeConsent(){try{localStorage.removeItem(this.storageKey)}catch{}}getStorageKey(){return this.storageKey}destroy(){this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise=null}handleDecision(t){try{localStorage.setItem(this.storageKey,t?"granted":"denied")}catch{}this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise&&(this.pendingPromise.resolve(t),this.pendingPromise=null)}buildBanner(){const t=document,e=t.createElement("div");e.id="dat2ai-consent-banner",e.setAttribute("role","dialog"),e.setAttribute("aria-label","AI Agent Consent"),e.style.cssText="position:fixed;bottom:0;left:0;right:0;padding:16px;background:var(--dat2ai-banner-bg,#1a1a2e);color:var(--dat2ai-banner-text,#fff);font:14px/1.4 system-ui,sans-serif;z-index:999999;display:flex;align-items:center;gap:12px";const n=t.createElement("p");n.style.cssText="margin:0;flex:1",n.textContent=this.config.bannerText||"This site allows AI agents to interact with forms.",e.appendChild(n);const o="padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font:inherit;font-weight:600",i=t.createElement("button");i.textContent="Accept",i.setAttribute("aria-label","Accept AI agent interactions"),i.style.cssText=o+";background:var(--dat2ai-btn-accept-bg,#4CAF50);color:var(--dat2ai-btn-accept-text,#fff)",i.addEventListener("click",()=>this.handleDecision(!0)),e.appendChild(i);const s=t.createElement("button");if(s.textContent="Reject",s.setAttribute("aria-label","Reject AI agent interactions"),s.style.cssText=o+";background:var(--dat2ai-btn-reject-bg,#666);color:var(--dat2ai-btn-reject-text,#fff)",s.addEventListener("click",()=>this.handleDecision(!1)),e.appendChild(s),this.config.policyUrl){const n=t.createElement("a");n.href=this.config.policyUrl,n.target="_blank",n.rel="noopener",n.textContent="More info",n.style.cssText="color:var(--dat2ai-link-color,#90CAF9);text-decoration:underline",e.appendChild(n)}return e}}class a{constructor(t){this.globalWindow=[],this.toolWindows=new Map,this.cooldownUntil=0,this.config=t}checkLimit(t){const e=Date.now();if(e<this.cooldownUntil)return"blocked";if(this.globalWindow=this.globalWindow.filter(t=>e-t<6e4),this.globalWindow.length>=this.config.maxInvocationsPerMinute)return this.cooldownUntil=e+1e3*(this.config.cooldownSeconds??60),"limited";if(this.config.maxPerTool){this.toolWindows.has(t)||this.toolWindows.set(t,[]);const n=this.toolWindows.get(t).filter(t=>e-t<6e4);if(this.toolWindows.set(t,n),n.length>=this.config.maxPerTool)return"limited";n.push(e)}return this.globalWindow.push(e),"ok"}reset(){this.globalWindow=[],this.toolWindows.clear(),this.cooldownUntil=0}}const l="dat2ai_retry_queue";class d{constructor(t,e,n){this.intervalId=null,this.apiEndpoint=t,this.siteKey=e,this.logger=n,this.boundBeforeUnload=this.onBeforeUnload.bind(this)}start(){this.intervalId=setInterval(()=>{this.flush()},5e3),window.addEventListener("beforeunload",this.boundBeforeUnload)}async flush(){const t=this.logger.getEvents();let e=[];try{const t=sessionStorage.getItem(l);t&&(e=JSON.parse(t))}catch{}const n=[...e,...t];if(0!==n.length)try{if(!(await fetch(this.apiEndpoint+"/api/events",{method:"POST",headers:{"Content-Type":"application/json","X-Site-Key":this.siteKey},body:JSON.stringify(n)})).ok)throw new Error("Non-2xx");this.logger.clearEvents();try{sessionStorage.removeItem(l)}catch{}}catch{const t=n.slice(-100);try{sessionStorage.setItem(l,JSON.stringify(t))}catch{}this.logger.clearEvents()}}destroy(){null!==this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),window.removeEventListener("beforeunload",this.boundBeforeUnload),this.onBeforeUnload()}onBeforeUnload(){const t=this.logger.getEvents();if(0===t.length)return;const e=this.apiEndpoint+"/api/events?siteKey="+encodeURIComponent(this.siteKey),n=new Blob([JSON.stringify(t)],{type:"application/json"});if("undefined"!=typeof navigator&&navigator.sendBeacon)navigator.sendBeacon(e,n);else try{fetch(e,{method:"POST",body:n,keepalive:!0})}catch{}this.logger.clearEvents()}}class c{constructor(t){this.config=t,this.logger=new e(t.debug??!1),t.consent&&(this.consent=new r(t.consent)),t.rateLimiting&&(this.rateLimiter=new a(t.rateLimiting)),this.enabler=new n(this.logger),this.interceptor=new s(t.siteKey,this.logger,this.consent,this.rateLimiter),this.logger.info(`Initialized for site: ${t.siteKey}`),t.enabler?.tools?.length&&this.enabler.enable(t.enabler.tools),this.interceptor.start(),!t.offline&&t.apiEndpoint&&(this.reporter=new d(t.apiEndpoint,t.siteKey,this.logger),this.reporter.start())}static init(t){return new c(t)}enableTool(t){this.enabler.addTool(t),this.logger.debug(`Tool added: ${t.toolName}`)}on(t,e){this.interceptor.on(t,e)}off(t,e){this.interceptor.off(t,e)}getEvents(){return this.logger.getEvents()}getConfig(){return{...this.config}}hasConsent(){return this.consent?.hasConsent()??!1}destroy(){this.reporter?.destroy(),this.consent?.destroy(),this.enabler.destroy(),this.interceptor.destroy(),this.logger.info("Destroyed")}}"undefined"!=typeof window&&window.Dat2AIConfig&&(window.Dat2AIInstance=c.init(window.Dat2AIConfig));export{r as ConsentManager,c as Dat2AI,a as RateLimiter,d as Reporter};
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/logger.ts","../src/enabler.ts","../src/detector.ts","../src/interceptor.ts","../src/consent.ts","../src/rate-limiter.ts","../src/reporter.ts","../src/shield.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","Logger","constructor","debug","this","events","debugMode","msg","args","console","info","warn","error","addEvent","event","push","eventType","toolName","getEvents","clearEvents","Enabler","logger","tools","observer","enable","tool","applyTool","observeDom","addTool","forms","document","querySelectorAll","formSelector","length","forEach","form","applyToForm","hasAttribute","setAttribute","toolDescription","autoSubmit","fields","field","el","querySelector","fieldSelector","paramTitle","paramDescription","MutationObserver","mutations","mutation","node","addedNodes","HTMLElement","tagName","Array","from","matches","observe","body","childList","subtree","destroy","disconnect","AGENT_PATTERNS","detectAgent","agentInvoked","agentType","userAgent","navigator","ua","pattern","type","test","Interceptor","siteKey","consent","rateLimiter","handlers","Map","boundSubmitHandler","handleSubmit","bind","boundToolActivated","handleToolActivated","boundToolCancel","handleToolCancel","start","addEventListener","on","handler","has","set","Set","get","add","off","delete","e","target","getAttribute","config","required","hasConsent","createEvent","consentGiven","emit","requestConsent","preventDefault","status","checkLimit","rateLimitStatus","originalEvent","agentInfo","id","className","split","Date","now","toString","Math","random","slice","timestamp","toISOString","name","err","removeEventListener","clear","ConsentManager","bannerEl","pendingPromise","storageKey","localStorage","getItem","Promise","resolve","buildBanner","appendChild","revokeConsent","removeItem","getStorageKey","parentNode","removeChild","handleDecision","granted","setItem","d","banner","createElement","style","cssText","text","textContent","bannerText","btnCss","accept","reject","policyUrl","link","href","rel","RateLimiter","globalWindow","toolWindows","cooldownUntil","filter","t","maxInvocationsPerMinute","cooldownSeconds","maxPerTool","pruned","reset","RETRY_KEY","Reporter","apiEndpoint","intervalId","boundBeforeUnload","onBeforeUnload","setInterval","flush","window","retryQueue","stored","sessionStorage","JSON","parse","all","fetch","method","headers","stringify","ok","Error","toStore","clearInterval","url","encodeURIComponent","blob","Blob","sendBeacon","keepalive","Dat2AI","rateLimiting","enabler","interceptor","offline","reporter","init","enableTool","getConfig","Dat2AIConfig","Dat2AIInstance","_Shield"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Dat2AI={})}(this,function(t){"use strict";const e="[dat2ai]";class n{constructor(t=!1){this.events=[],this.debugMode=t}debug(t,...n){this.debugMode&&console.debug(e,t,...n)}info(t,...n){console.info(e,t,...n)}warn(t,...n){console.warn(e,t,...n)}error(t,...n){console.error(e,t,...n)}addEvent(t){this.events.push(t),this.debug("Event recorded:",t.eventType,t.toolName)}getEvents(){return[...this.events]}clearEvents(){this.events=[]}}class o{constructor(t){this.tools=[],this.observer=null,this.logger=t}enable(t){this.tools=t;for(const e of t)this.applyTool(e);this.observeDom()}addTool(t){this.tools.push(t),this.applyTool(t)}applyTool(t){const e=document.querySelectorAll(t.formSelector);0!==e.length?e.forEach(e=>this.applyToForm(e,t)):this.logger.debug(`No form found for selector: ${t.formSelector}`)}applyToForm(t,e){if(t.hasAttribute("toolname"))this.logger.debug(`Form already has toolname, skipping: ${e.formSelector}`);else{if(t.setAttribute("toolname",e.toolName),t.setAttribute("tooldescription",e.toolDescription),e.autoSubmit&&t.setAttribute("toolautosubmit","true"),e.fields)for(const n of e.fields){const o=t.querySelector(n.fieldSelector);o?(o.setAttribute("toolparamtitle",n.paramTitle),o.setAttribute("toolparamdescription",n.paramDescription)):this.logger.debug(`Field not found: ${n.fieldSelector} in ${e.formSelector}`)}this.logger.debug(`Enabled tool "${e.toolName}" on ${e.formSelector}`)}}observeDom(){this.observer||"undefined"==typeof MutationObserver||(this.observer=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes){if(!(t instanceof HTMLElement))continue;const e="FORM"===t.tagName?[t]:Array.from(t.querySelectorAll("form"));for(const t of e)for(const e of this.tools)t.matches(e.formSelector)&&this.applyToForm(t,e)}}),this.observer.observe(document.body,{childList:!0,subtree:!0}))}destroy(){this.observer&&(this.observer.disconnect(),this.observer=null),this.tools=[]}}const i=[[/Gemini/i,"extension"],[/Google-Extended/i,"browser_agent"],[/ChatGPT/i,"extension"],[/Claude/i,"extension"],[/Copilot/i,"extension"],[/HeadlessChrome/i,"automated"],[/Puppeteer/i,"automated"],[/Playwright/i,"automated"],[/Selenium/i,"automated"]];function s(t){if(t&&"agentInvoked"in t&&!0===t.agentInvoked)return{agentType:"browser_agent",userAgent:navigator.userAgent};const e=navigator.userAgent;for(const[t,n]of i)if(t.test(e))return{agentType:n,userAgent:e};return{agentType:"unknown",userAgent:e}}class r{constructor(t,e,n,o){this.handlers=new Map,this.siteKey=t,this.logger=e,this.consent=n,this.rateLimiter=o,this.boundSubmitHandler=this.handleSubmit.bind(this),this.boundToolActivated=this.handleToolActivated.bind(this),this.boundToolCancel=this.handleToolCancel.bind(this)}start(){document.addEventListener("submit",this.boundSubmitHandler,!0),document.addEventListener("toolactivated",this.boundToolActivated,!0),document.addEventListener("toolcancel",this.boundToolCancel,!0),this.logger.debug("Interceptor started")}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){this.handlers.get(t)?.delete(e)}handleSubmit(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;if(!("unknown"!==s(t).agentType||"agentInvoked"in t&&!0===t.agentInvoked))return;const n=e.getAttribute("toolname")||"unknown";if(this.consent&&this.consent.config.required&&!this.consent.hasConsent()){const n=this.createEvent(e,"consent_denied",t);return n.consentGiven=!1,this.logger.addEvent(n),this.emit("consentDenied",n),this.consent.requestConsent(),void t.preventDefault()}if(this.rateLimiter){const o=this.rateLimiter.checkLimit(n);if("ok"!==o){const n=this.createEvent(e,"rate_limited",t);return n.rateLimitStatus=o,this.logger.addEvent(n),this.emit("rateLimited",n),void t.preventDefault()}}const o=this.createEvent(e,"invocation",t);o.consentGiven=!!this.consent&&this.consent.hasConsent(),o.rateLimitStatus="ok",this.logger.addEvent(o),this.emit("invocation",o)}handleToolActivated(t){const e=t.target;e&&e.hasAttribute("toolname")&&this.logger.debug("Tool activated:",e.getAttribute("toolname"))}handleToolCancel(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;const n=this.createEvent(e,"cancel",t);this.logger.addEvent(n),this.emit("cancel",n)}createEvent(t,e,n){const o=t.getAttribute("toolname")||"unknown",i=s(n),r=t.id?`#${t.id}`:t.getAttribute("name")?`form[name="${t.getAttribute("name")}"]`:t.className?`form.${t.className.split(" ")[0]}`:"form";return{id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),timestamp:(new Date).toISOString(),siteKey:this.siteKey,toolName:o,formSelector:r,eventType:e,agentInfo:i,consentGiven:!1,rateLimitStatus:"ok"}}emit(t,e){const n=this.handlers.get(t);if(n)for(const t of n)try{t(e)}catch(t){this.logger.error("Event handler error:",t)}}destroy(){document.removeEventListener("submit",this.boundSubmitHandler,!0),document.removeEventListener("toolactivated",this.boundToolActivated,!0),document.removeEventListener("toolcancel",this.boundToolCancel,!0),this.handlers.clear(),this.logger.debug("Interceptor destroyed")}}class a{constructor(t){this.bannerEl=null,this.pendingPromise=null,this.config=t,this.storageKey=t.storageKey||"dat2ai_consent"}hasConsent(){try{return"granted"===localStorage.getItem(this.storageKey)}catch{return!1}}requestConsent(){return this.bannerEl?new Promise(t=>{this.pendingPromise={resolve:t}}):new Promise(t=>{this.pendingPromise={resolve:t},this.bannerEl=this.buildBanner(),document.body.appendChild(this.bannerEl)})}revokeConsent(){try{localStorage.removeItem(this.storageKey)}catch{}}getStorageKey(){return this.storageKey}destroy(){this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise=null}handleDecision(t){try{localStorage.setItem(this.storageKey,t?"granted":"denied")}catch{}this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise&&(this.pendingPromise.resolve(t),this.pendingPromise=null)}buildBanner(){const t=document,e=t.createElement("div");e.id="dat2ai-consent-banner",e.setAttribute("role","dialog"),e.setAttribute("aria-label","AI Agent Consent"),e.style.cssText="position:fixed;bottom:0;left:0;right:0;padding:16px;background:var(--dat2ai-banner-bg,#1a1a2e);color:var(--dat2ai-banner-text,#fff);font:14px/1.4 system-ui,sans-serif;z-index:999999;display:flex;align-items:center;gap:12px";const n=t.createElement("p");n.style.cssText="margin:0;flex:1",n.textContent=this.config.bannerText||"This site allows AI agents to interact with forms.",e.appendChild(n);const o="padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font:inherit;font-weight:600",i=t.createElement("button");i.textContent="Accept",i.setAttribute("aria-label","Accept AI agent interactions"),i.style.cssText=o+";background:var(--dat2ai-btn-accept-bg,#4CAF50);color:var(--dat2ai-btn-accept-text,#fff)",i.addEventListener("click",()=>this.handleDecision(!0)),e.appendChild(i);const s=t.createElement("button");if(s.textContent="Reject",s.setAttribute("aria-label","Reject AI agent interactions"),s.style.cssText=o+";background:var(--dat2ai-btn-reject-bg,#666);color:var(--dat2ai-btn-reject-text,#fff)",s.addEventListener("click",()=>this.handleDecision(!1)),e.appendChild(s),this.config.policyUrl){const n=t.createElement("a");n.href=this.config.policyUrl,n.target="_blank",n.rel="noopener",n.textContent="More info",n.style.cssText="color:var(--dat2ai-link-color,#90CAF9);text-decoration:underline",e.appendChild(n)}return e}}class l{constructor(t){this.globalWindow=[],this.toolWindows=new Map,this.cooldownUntil=0,this.config=t}checkLimit(t){const e=Date.now();if(e<this.cooldownUntil)return"blocked";if(this.globalWindow=this.globalWindow.filter(t=>e-t<6e4),this.globalWindow.length>=this.config.maxInvocationsPerMinute)return this.cooldownUntil=e+1e3*(this.config.cooldownSeconds??60),"limited";if(this.config.maxPerTool){this.toolWindows.has(t)||this.toolWindows.set(t,[]);const n=this.toolWindows.get(t).filter(t=>e-t<6e4);if(this.toolWindows.set(t,n),n.length>=this.config.maxPerTool)return"limited";n.push(e)}return this.globalWindow.push(e),"ok"}reset(){this.globalWindow=[],this.toolWindows.clear(),this.cooldownUntil=0}}const d="dat2ai_retry_queue";class c{constructor(t,e,n){this.intervalId=null,this.apiEndpoint=t,this.siteKey=e,this.logger=n,this.boundBeforeUnload=this.onBeforeUnload.bind(this)}start(){this.intervalId=setInterval(()=>{this.flush()},5e3),window.addEventListener("beforeunload",this.boundBeforeUnload)}async flush(){const t=this.logger.getEvents();let e=[];try{const t=sessionStorage.getItem(d);t&&(e=JSON.parse(t))}catch{}const n=[...e,...t];if(0!==n.length)try{if(!(await fetch(this.apiEndpoint+"/api/events",{method:"POST",headers:{"Content-Type":"application/json","X-Site-Key":this.siteKey},body:JSON.stringify(n)})).ok)throw new Error("Non-2xx");this.logger.clearEvents();try{sessionStorage.removeItem(d)}catch{}}catch{const t=n.slice(-100);try{sessionStorage.setItem(d,JSON.stringify(t))}catch{}this.logger.clearEvents()}}destroy(){null!==this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),window.removeEventListener("beforeunload",this.boundBeforeUnload),this.onBeforeUnload()}onBeforeUnload(){const t=this.logger.getEvents();if(0===t.length)return;const e=this.apiEndpoint+"/api/events?siteKey="+encodeURIComponent(this.siteKey),n=new Blob([JSON.stringify(t)],{type:"application/json"});if("undefined"!=typeof navigator&&navigator.sendBeacon)navigator.sendBeacon(e,n);else try{fetch(e,{method:"POST",body:n,keepalive:!0})}catch{}this.logger.clearEvents()}}class h{constructor(t){this.config=t,this.logger=new n(t.debug??!1),t.consent&&(this.consent=new a(t.consent)),t.rateLimiting&&(this.rateLimiter=new l(t.rateLimiting)),this.enabler=new o(this.logger),this.interceptor=new r(t.siteKey,this.logger,this.consent,this.rateLimiter),this.logger.info(`Initialized for site: ${t.siteKey}`),t.enabler?.tools?.length&&this.enabler.enable(t.enabler.tools),this.interceptor.start(),!t.offline&&t.apiEndpoint&&(this.reporter=new c(t.apiEndpoint,t.siteKey,this.logger),this.reporter.start())}static init(t){return new h(t)}enableTool(t){this.enabler.addTool(t),this.logger.debug(`Tool added: ${t.toolName}`)}on(t,e){this.interceptor.on(t,e)}off(t,e){this.interceptor.off(t,e)}getEvents(){return this.logger.getEvents()}getConfig(){return{...this.config}}hasConsent(){return this.consent?.hasConsent()??!1}destroy(){this.reporter?.destroy(),this.consent?.destroy(),this.enabler.destroy(),this.interceptor.destroy(),this.logger.info("Destroyed")}}"undefined"!=typeof window&&window.Dat2AIConfig&&(window.Dat2AIInstance=h.init(window.Dat2AIConfig)),t.ConsentManager=a,t.Dat2AI=h,t.RateLimiter=l,t.Reporter=c});
2
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/logger.ts","../src/enabler.ts","../src/detector.ts","../src/interceptor.ts","../src/consent.ts","../src/rate-limiter.ts","../src/reporter.ts","../src/shield.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","Logger","constructor","debug","this","events","debugMode","msg","args","console","info","warn","error","addEvent","event","push","eventType","toolName","getEvents","clearEvents","Enabler","logger","tools","observer","enable","tool","applyTool","observeDom","addTool","forms","document","querySelectorAll","formSelector","length","forEach","form","applyToForm","hasAttribute","setAttribute","toolDescription","autoSubmit","fields","field","el","querySelector","fieldSelector","paramTitle","paramDescription","MutationObserver","mutations","mutation","node","addedNodes","HTMLElement","tagName","Array","from","matches","observe","body","childList","subtree","destroy","disconnect","AGENT_PATTERNS","detectAgent","agentInvoked","agentType","userAgent","navigator","ua","pattern","type","test","Interceptor","siteKey","consent","rateLimiter","handlers","Map","boundSubmitHandler","handleSubmit","bind","boundToolActivated","handleToolActivated","boundToolCancel","handleToolCancel","start","addEventListener","on","handler","has","set","Set","get","add","off","delete","e","target","getAttribute","config","required","hasConsent","createEvent","consentGiven","emit","requestConsent","preventDefault","status","checkLimit","rateLimitStatus","originalEvent","agentInfo","id","className","split","Date","now","toString","Math","random","slice","timestamp","toISOString","name","err","removeEventListener","clear","ConsentManager","bannerEl","pendingPromise","storageKey","localStorage","getItem","Promise","resolve","buildBanner","appendChild","revokeConsent","removeItem","getStorageKey","parentNode","removeChild","handleDecision","granted","setItem","d","banner","createElement","style","cssText","text","textContent","bannerText","btnCss","accept","reject","policyUrl","link","href","rel","RateLimiter","globalWindow","toolWindows","cooldownUntil","filter","t","maxInvocationsPerMinute","cooldownSeconds","maxPerTool","pruned","reset","RETRY_KEY","Reporter","apiEndpoint","intervalId","boundBeforeUnload","onBeforeUnload","setInterval","flush","window","retryQueue","stored","sessionStorage","JSON","parse","all","fetch","method","headers","stringify","ok","Error","toStore","clearInterval","url","encodeURIComponent","blob","Blob","sendBeacon","keepalive","Dat2AI","rateLimiting","enabler","interceptor","offline","reporter","init","enableTool","getConfig","Dat2AIConfig","Dat2AIInstance","_Shield"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var Dat2AI=function(t){"use strict";const e="[dat2ai]";class n{constructor(t=!1){this.events=[],this.debugMode=t}debug(t,...n){this.debugMode&&console.debug(e,t,...n)}info(t,...n){console.info(e,t,...n)}warn(t,...n){console.warn(e,t,...n)}error(t,...n){console.error(e,t,...n)}addEvent(t){this.events.push(t),this.debug("Event recorded:",t.eventType,t.toolName)}getEvents(){return[...this.events]}clearEvents(){this.events=[]}}class o{constructor(t){this.tools=[],this.observer=null,this.logger=t}enable(t){this.tools=t;for(const e of t)this.applyTool(e);this.observeDom()}addTool(t){this.tools.push(t),this.applyTool(t)}applyTool(t){const e=document.querySelectorAll(t.formSelector);0!==e.length?e.forEach(e=>this.applyToForm(e,t)):this.logger.debug(`No form found for selector: ${t.formSelector}`)}applyToForm(t,e){if(t.hasAttribute("toolname"))this.logger.debug(`Form already has toolname, skipping: ${e.formSelector}`);else{if(t.setAttribute("toolname",e.toolName),t.setAttribute("tooldescription",e.toolDescription),e.autoSubmit&&t.setAttribute("toolautosubmit","true"),e.fields)for(const n of e.fields){const o=t.querySelector(n.fieldSelector);o?(o.setAttribute("toolparamtitle",n.paramTitle),o.setAttribute("toolparamdescription",n.paramDescription)):this.logger.debug(`Field not found: ${n.fieldSelector} in ${e.formSelector}`)}this.logger.debug(`Enabled tool "${e.toolName}" on ${e.formSelector}`)}}observeDom(){this.observer||"undefined"==typeof MutationObserver||(this.observer=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes){if(!(t instanceof HTMLElement))continue;const e="FORM"===t.tagName?[t]:Array.from(t.querySelectorAll("form"));for(const t of e)for(const e of this.tools)t.matches(e.formSelector)&&this.applyToForm(t,e)}}),this.observer.observe(document.body,{childList:!0,subtree:!0}))}destroy(){this.observer&&(this.observer.disconnect(),this.observer=null),this.tools=[]}}const i=[[/Gemini/i,"extension"],[/Google-Extended/i,"browser_agent"],[/ChatGPT/i,"extension"],[/Claude/i,"extension"],[/Copilot/i,"extension"],[/HeadlessChrome/i,"automated"],[/Puppeteer/i,"automated"],[/Playwright/i,"automated"],[/Selenium/i,"automated"]];function s(t){if(t&&"agentInvoked"in t&&!0===t.agentInvoked)return{agentType:"browser_agent",userAgent:navigator.userAgent};const e=navigator.userAgent;for(const[t,n]of i)if(t.test(e))return{agentType:n,userAgent:e};return{agentType:"unknown",userAgent:e}}class r{constructor(t,e,n,o){this.handlers=new Map,this.siteKey=t,this.logger=e,this.consent=n,this.rateLimiter=o,this.boundSubmitHandler=this.handleSubmit.bind(this),this.boundToolActivated=this.handleToolActivated.bind(this),this.boundToolCancel=this.handleToolCancel.bind(this)}start(){document.addEventListener("submit",this.boundSubmitHandler,!0),document.addEventListener("toolactivated",this.boundToolActivated,!0),document.addEventListener("toolcancel",this.boundToolCancel,!0),this.logger.debug("Interceptor started")}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set),this.handlers.get(t).add(e)}off(t,e){this.handlers.get(t)?.delete(e)}handleSubmit(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;if(!("unknown"!==s(t).agentType||"agentInvoked"in t&&!0===t.agentInvoked))return;const n=e.getAttribute("toolname")||"unknown";if(this.consent&&this.consent.config.required&&!this.consent.hasConsent()){const n=this.createEvent(e,"consent_denied",t);return n.consentGiven=!1,this.logger.addEvent(n),this.emit("consentDenied",n),this.consent.requestConsent(),void t.preventDefault()}if(this.rateLimiter){const o=this.rateLimiter.checkLimit(n);if("ok"!==o){const n=this.createEvent(e,"rate_limited",t);return n.rateLimitStatus=o,this.logger.addEvent(n),this.emit("rateLimited",n),void t.preventDefault()}}const o=this.createEvent(e,"invocation",t);o.consentGiven=!!this.consent&&this.consent.hasConsent(),o.rateLimitStatus="ok",this.logger.addEvent(o),this.emit("invocation",o)}handleToolActivated(t){const e=t.target;e&&e.hasAttribute("toolname")&&this.logger.debug("Tool activated:",e.getAttribute("toolname"))}handleToolCancel(t){const e=t.target;if(!e||!e.hasAttribute("toolname"))return;const n=this.createEvent(e,"cancel",t);this.logger.addEvent(n),this.emit("cancel",n)}createEvent(t,e,n){const o=t.getAttribute("toolname")||"unknown",i=s(n),r=t.id?`#${t.id}`:t.getAttribute("name")?`form[name="${t.getAttribute("name")}"]`:t.className?`form.${t.className.split(" ")[0]}`:"form";return{id:Date.now().toString(36)+Math.random().toString(36).slice(2,10),timestamp:(new Date).toISOString(),siteKey:this.siteKey,toolName:o,formSelector:r,eventType:e,agentInfo:i,consentGiven:!1,rateLimitStatus:"ok"}}emit(t,e){const n=this.handlers.get(t);if(n)for(const t of n)try{t(e)}catch(t){this.logger.error("Event handler error:",t)}}destroy(){document.removeEventListener("submit",this.boundSubmitHandler,!0),document.removeEventListener("toolactivated",this.boundToolActivated,!0),document.removeEventListener("toolcancel",this.boundToolCancel,!0),this.handlers.clear(),this.logger.debug("Interceptor destroyed")}}class a{constructor(t){this.bannerEl=null,this.pendingPromise=null,this.config=t,this.storageKey=t.storageKey||"webmcp_consent"}hasConsent(){try{return"granted"===localStorage.getItem(this.storageKey)}catch{return!1}}requestConsent(){return this.bannerEl?new Promise(t=>{this.pendingPromise={resolve:t}}):new Promise(t=>{this.pendingPromise={resolve:t},this.bannerEl=this.buildBanner(),document.body.appendChild(this.bannerEl)})}revokeConsent(){try{localStorage.removeItem(this.storageKey)}catch{}}getStorageKey(){return this.storageKey}destroy(){this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise=null}handleDecision(t){try{localStorage.setItem(this.storageKey,t?"granted":"denied")}catch{}this.bannerEl&&this.bannerEl.parentNode&&this.bannerEl.parentNode.removeChild(this.bannerEl),this.bannerEl=null,this.pendingPromise&&(this.pendingPromise.resolve(t),this.pendingPromise=null)}buildBanner(){const t=document,e=t.createElement("div");e.id="webmcp-consent-banner",e.setAttribute("role","dialog"),e.setAttribute("aria-label","AI Agent Consent"),e.style.cssText="position:fixed;bottom:0;left:0;right:0;padding:16px;background:var(--webmcp-banner-bg,#1a1a2e);color:var(--webmcp-banner-text,#fff);font:14px/1.4 system-ui,sans-serif;z-index:999999;display:flex;align-items:center;gap:12px";const n=t.createElement("p");n.style.cssText="margin:0;flex:1",n.textContent=this.config.bannerText||"This site allows AI agents to interact with forms.",e.appendChild(n);const o="padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font:inherit;font-weight:600",i=t.createElement("button");i.textContent="Accept",i.setAttribute("aria-label","Accept AI agent interactions"),i.style.cssText=o+";background:var(--webmcp-btn-accept-bg,#4CAF50);color:var(--webmcp-btn-accept-text,#fff)",i.addEventListener("click",()=>this.handleDecision(!0)),e.appendChild(i);const s=t.createElement("button");if(s.textContent="Reject",s.setAttribute("aria-label","Reject AI agent interactions"),s.style.cssText=o+";background:var(--webmcp-btn-reject-bg,#666);color:var(--webmcp-btn-reject-text,#fff)",s.addEventListener("click",()=>this.handleDecision(!1)),e.appendChild(s),this.config.policyUrl){const n=t.createElement("a");n.href=this.config.policyUrl,n.target="_blank",n.rel="noopener",n.textContent="More info",n.style.cssText="color:var(--webmcp-link-color,#90CAF9);text-decoration:underline",e.appendChild(n)}return e}}class l{constructor(t){this.globalWindow=[],this.toolWindows=new Map,this.cooldownUntil=0,this.config=t}checkLimit(t){const e=Date.now();if(e<this.cooldownUntil)return"blocked";if(this.globalWindow=this.globalWindow.filter(t=>e-t<6e4),this.globalWindow.length>=this.config.maxInvocationsPerMinute)return this.cooldownUntil=e+1e3*(this.config.cooldownSeconds??60),"limited";if(this.config.maxPerTool){this.toolWindows.has(t)||this.toolWindows.set(t,[]);const n=this.toolWindows.get(t).filter(t=>e-t<6e4);if(this.toolWindows.set(t,n),n.length>=this.config.maxPerTool)return"limited";n.push(e)}return this.globalWindow.push(e),"ok"}reset(){this.globalWindow=[],this.toolWindows.clear(),this.cooldownUntil=0}}const c="webmcp_retry_queue";class d{constructor(t,e,n){this.intervalId=null,this.apiEndpoint=t,this.siteKey=e,this.logger=n,this.boundBeforeUnload=this.onBeforeUnload.bind(this)}start(){this.intervalId=setInterval(()=>{this.flush()},5e3),window.addEventListener("beforeunload",this.boundBeforeUnload)}async flush(){const t=this.logger.getEvents();let e=[];try{const t=sessionStorage.getItem(c);t&&(e=JSON.parse(t))}catch{}const n=[...e,...t];if(0!==n.length)try{if(!(await fetch(this.apiEndpoint+"/api/events",{method:"POST",headers:{"Content-Type":"application/json","X-Site-Key":this.siteKey},body:JSON.stringify(n)})).ok)throw new Error("Non-2xx");this.logger.clearEvents();try{sessionStorage.removeItem(c)}catch{}}catch{const t=n.slice(-100);try{sessionStorage.setItem(c,JSON.stringify(t))}catch{}this.logger.clearEvents()}}destroy(){null!==this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),window.removeEventListener("beforeunload",this.boundBeforeUnload),this.onBeforeUnload()}onBeforeUnload(){const t=this.logger.getEvents();if(0===t.length)return;const e=this.apiEndpoint+"/api/events?siteKey="+encodeURIComponent(this.siteKey),n=new Blob([JSON.stringify(t)],{type:"application/json"});if("undefined"!=typeof navigator&&navigator.sendBeacon)navigator.sendBeacon(e,n);else try{fetch(e,{method:"POST",body:n,keepalive:!0})}catch{}this.logger.clearEvents()}}class h{constructor(t){this.config=t,this.logger=new n(t.debug??!1),t.consent&&(this.consent=new a(t.consent)),t.rateLimiting&&(this.rateLimiter=new l(t.rateLimiting)),this.enabler=new o(this.logger),this.interceptor=new r(t.siteKey,this.logger,this.consent,this.rateLimiter),this.logger.info(`Initialized for site: ${t.siteKey}`),t.enabler?.tools?.length&&this.enabler.enable(t.enabler.tools),this.interceptor.start(),!t.offline&&t.apiEndpoint&&(this.reporter=new d(t.apiEndpoint,t.siteKey,this.logger),this.reporter.start())}static init(t){return new h(t)}enableTool(t){this.enabler.addTool(t),this.logger.debug(`Tool added: ${t.toolName}`)}on(t,e){this.interceptor.on(t,e)}off(t,e){this.interceptor.off(t,e)}getEvents(){return this.logger.getEvents()}getConfig(){return{...this.config}}hasConsent(){return this.consent?.hasConsent()??!1}destroy(){this.reporter?.destroy(),this.consent?.destroy(),this.enabler.destroy(),this.interceptor.destroy(),this.logger.info("Destroyed")}}return"undefined"!=typeof window&&window.Dat2AIConfig&&(window.Dat2AIInstance=h.init(window.Dat2AIConfig)),t.ConsentManager=a,t.Dat2AI=h,t.RateLimiter=l,t.Reporter=d,t}({});
2
+ //# sourceMappingURL=shield.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shield.min.js","sources":["../src/logger.ts","../src/enabler.ts","../src/detector.ts","../src/interceptor.ts","../src/consent.ts","../src/rate-limiter.ts","../src/reporter.ts","../src/shield.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","Logger","constructor","debug","this","events","debugMode","msg","args","console","info","warn","error","addEvent","event","push","eventType","toolName","getEvents","clearEvents","Enabler","logger","tools","observer","enable","tool","applyTool","observeDom","addTool","forms","document","querySelectorAll","formSelector","length","forEach","form","applyToForm","hasAttribute","setAttribute","toolDescription","autoSubmit","fields","field","el","querySelector","fieldSelector","paramTitle","paramDescription","MutationObserver","mutations","mutation","node","addedNodes","HTMLElement","tagName","Array","from","matches","observe","body","childList","subtree","destroy","disconnect","AGENT_PATTERNS","detectAgent","agentInvoked","agentType","userAgent","navigator","ua","pattern","type","test","Interceptor","siteKey","consent","rateLimiter","handlers","Map","boundSubmitHandler","handleSubmit","bind","boundToolActivated","handleToolActivated","boundToolCancel","handleToolCancel","start","addEventListener","on","handler","has","set","Set","get","add","off","delete","e","target","getAttribute","config","required","hasConsent","createEvent","consentGiven","emit","requestConsent","preventDefault","status","checkLimit","rateLimitStatus","originalEvent","agentInfo","id","className","split","Date","now","toString","Math","random","slice","timestamp","toISOString","name","err","removeEventListener","clear","ConsentManager","bannerEl","pendingPromise","storageKey","localStorage","getItem","Promise","resolve","buildBanner","appendChild","revokeConsent","removeItem","getStorageKey","parentNode","removeChild","handleDecision","granted","setItem","d","banner","createElement","style","cssText","text","textContent","bannerText","btnCss","accept","reject","policyUrl","link","href","rel","RateLimiter","globalWindow","toolWindows","cooldownUntil","filter","t","maxInvocationsPerMinute","cooldownSeconds","maxPerTool","pruned","reset","RETRY_KEY","Reporter","apiEndpoint","intervalId","boundBeforeUnload","onBeforeUnload","setInterval","flush","window","retryQueue","stored","sessionStorage","JSON","parse","all","fetch","method","headers","stringify","ok","Error","toStore","clearInterval","url","encodeURIComponent","blob","Blob","sendBeacon","keepalive","Dat2AI","rateLimiting","enabler","interceptor","offline","reporter","init","enableTool","getConfig","Dat2AIConfig","Dat2AIInstance","_Shield"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ConsentConfig } from './types';
2
+ /** Manages user consent for AI agent interactions. */
3
+ export declare class ConsentManager {
4
+ readonly config: ConsentConfig;
5
+ private storageKey;
6
+ private bannerEl;
7
+ private pendingPromise;
8
+ constructor(config: ConsentConfig);
9
+ /** Returns true if user has previously granted consent. */
10
+ hasConsent(): boolean;
11
+ /** Show consent banner. Resolves to true (accepted) or false (rejected). */
12
+ requestConsent(): Promise<boolean>;
13
+ /** Revoke consent and remove from localStorage. */
14
+ revokeConsent(): void;
15
+ /** Get the localStorage key used. */
16
+ getStorageKey(): string;
17
+ /** Remove banner DOM if present. */
18
+ destroy(): void;
19
+ private handleDecision;
20
+ private buildBanner;
21
+ }
@@ -0,0 +1,8 @@
1
+ import type { AgentInfo } from './types';
2
+ /** Detect agent type from a SubmitEvent and context. */
3
+ export declare function detectAgent(event?: Event): AgentInfo;
4
+ /**
5
+ * Check if an interaction shows automated timing patterns.
6
+ * Returns true if the time between interactions is inhumanly fast (< 100ms).
7
+ */
8
+ export declare function isAutomatedTiming(timestamps: number[]): boolean;
@@ -0,0 +1,21 @@
1
+ import type { ToolDefinition } from './types';
2
+ import type { Logger } from './logger';
3
+ /** Injects WebMCP attributes into HTML forms. */
4
+ export declare class Enabler {
5
+ private tools;
6
+ private observer;
7
+ private logger;
8
+ constructor(logger: Logger);
9
+ /** Enable tools by injecting WebMCP attributes into matching forms. */
10
+ enable(tools: ToolDefinition[]): void;
11
+ /** Add and apply a single tool definition. */
12
+ addTool(tool: ToolDefinition): void;
13
+ /** Apply WebMCP attributes to a form matching the tool definition. */
14
+ private applyTool;
15
+ /** Inject attributes into a single form element. */
16
+ private applyToForm;
17
+ /** Watch for dynamically added forms (SPAs, lazy-loaded content). */
18
+ private observeDom;
19
+ /** Disconnect the MutationObserver and clean up. */
20
+ destroy(): void;
21
+ }
@@ -0,0 +1,5 @@
1
+ export { Dat2AI } from './shield';
2
+ export { ConsentManager } from './consent';
3
+ export { RateLimiter } from './rate-limiter';
4
+ export { Reporter } from './reporter';
5
+ export type { ShieldConfig, EnablerConfig, ToolDefinition, FieldMapping, ConsentConfig, RateLimitConfig, ShieldEvent, ShieldEventName, ShieldEventHandler, AgentInfo, AgentType, EventType, } from './types';
@@ -0,0 +1,34 @@
1
+ import type { ShieldEventName, ShieldEventHandler } from './types';
2
+ import type { Logger } from './logger';
3
+ import type { ConsentManager } from './consent';
4
+ import type { RateLimiter } from './rate-limiter';
5
+ /** Intercepts agent invocations on WebMCP-enabled forms. */
6
+ export declare class Interceptor {
7
+ private siteKey;
8
+ private logger;
9
+ private consent?;
10
+ private rateLimiter?;
11
+ private handlers;
12
+ private boundSubmitHandler;
13
+ private boundToolActivated;
14
+ private boundToolCancel;
15
+ constructor(siteKey: string, logger: Logger, consent?: ConsentManager, rateLimiter?: RateLimiter);
16
+ /** Start listening for agent invocations on the document. */
17
+ start(): void;
18
+ /** Register an event handler. */
19
+ on(event: ShieldEventName, handler: ShieldEventHandler): void;
20
+ /** Unregister an event handler. */
21
+ off(event: ShieldEventName, handler: ShieldEventHandler): void;
22
+ /** Handle form submit events. */
23
+ private handleSubmit;
24
+ /** Handle toolactivated events (WebMCP standard). */
25
+ private handleToolActivated;
26
+ /** Handle toolcancel events (WebMCP standard). */
27
+ private handleToolCancel;
28
+ /** Create a ShieldEvent from a form interaction. */
29
+ private createEvent;
30
+ /** Emit an event to registered handlers. */
31
+ private emit;
32
+ /** Stop listening and clean up. */
33
+ destroy(): void;
34
+ }
@@ -0,0 +1,17 @@
1
+ import type { ShieldEvent } from './types';
2
+ /** Internal logger with in-memory event store. */
3
+ export declare class Logger {
4
+ private debugMode;
5
+ private events;
6
+ constructor(debug?: boolean);
7
+ debug(msg: string, ...args: unknown[]): void;
8
+ info(msg: string, ...args: unknown[]): void;
9
+ warn(msg: string, ...args: unknown[]): void;
10
+ error(msg: string, ...args: unknown[]): void;
11
+ /** Store an event in memory for batch reporting. */
12
+ addEvent(event: ShieldEvent): void;
13
+ /** Get all stored events. */
14
+ getEvents(): ShieldEvent[];
15
+ /** Clear stored events (after successful batch send). */
16
+ clearEvents(): void;
17
+ }
@@ -0,0 +1,16 @@
1
+ import type { RateLimitConfig } from './types';
2
+ /** In-memory sliding window rate limiter for agent invocations. */
3
+ export declare class RateLimiter {
4
+ private config;
5
+ private globalWindow;
6
+ private toolWindows;
7
+ private cooldownUntil;
8
+ constructor(config: RateLimitConfig);
9
+ /**
10
+ * Check if an invocation is allowed for the given tool.
11
+ * Records the timestamp if allowed.
12
+ */
13
+ checkLimit(toolName: string): 'ok' | 'limited' | 'blocked';
14
+ /** Clear all tracked invocations and cooldown. */
15
+ reset(): void;
16
+ }
@@ -0,0 +1,17 @@
1
+ import type { Logger } from './logger';
2
+ /** Batches ShieldEvents and sends them to the dashboard API. */
3
+ export declare class Reporter {
4
+ private apiEndpoint;
5
+ private siteKey;
6
+ private logger;
7
+ private intervalId;
8
+ private boundBeforeUnload;
9
+ constructor(apiEndpoint: string, siteKey: string, logger: Logger);
10
+ /** Start the periodic flush timer and beforeunload listener. */
11
+ start(): void;
12
+ /** Flush pending events to the dashboard API. */
13
+ flush(): Promise<void>;
14
+ /** Stop the timer, flush remaining, clean up. */
15
+ destroy(): void;
16
+ private onBeforeUnload;
17
+ }
@@ -0,0 +1,28 @@
1
+ import type { ShieldConfig, ShieldEvent, ShieldEventName, ShieldEventHandler, ToolDefinition } from './types';
2
+ /** dat2ai — AI Agent Governance for the Web. */
3
+ export declare class Dat2AI {
4
+ private config;
5
+ private logger;
6
+ private enabler;
7
+ private interceptor;
8
+ private consent?;
9
+ private rateLimiter?;
10
+ private reporter?;
11
+ constructor(config: ShieldConfig);
12
+ /** Factory method for script tag / IIFE usage. */
13
+ static init(config: ShieldConfig): Dat2AI;
14
+ /** Add and enable a tool dynamically. */
15
+ enableTool(tool: ToolDefinition): void;
16
+ /** Register an event handler. */
17
+ on(event: ShieldEventName, handler: ShieldEventHandler): void;
18
+ /** Unregister an event handler. */
19
+ off(event: ShieldEventName, handler: ShieldEventHandler): void;
20
+ /** Get all recorded events. */
21
+ getEvents(): ShieldEvent[];
22
+ /** Get the current configuration. */
23
+ getConfig(): ShieldConfig;
24
+ /** Check if consent has been granted. */
25
+ hasConsent(): boolean;
26
+ /** Tear down all modules and clean up. */
27
+ destroy(): void;
28
+ }
@@ -0,0 +1,106 @@
1
+ /** Configuration for dat2ai initialization. */
2
+ export interface ShieldConfig {
3
+ /** Unique site identifier from the dashboard. */
4
+ siteKey: string;
5
+ /** Dashboard SaaS API endpoint. */
6
+ apiEndpoint?: string;
7
+ /** Enabler configuration for tool injection. */
8
+ enabler?: EnablerConfig;
9
+ /** Consent management configuration. */
10
+ consent?: ConsentConfig;
11
+ /** Rate limiting configuration. */
12
+ rateLimiting?: RateLimitConfig;
13
+ /** Offline mode — log locally only, don't send to dashboard. */
14
+ offline?: boolean;
15
+ /** Enable debug logging to console. */
16
+ debug?: boolean;
17
+ }
18
+ /** Configuration for the enabler module. */
19
+ export interface EnablerConfig {
20
+ /** Tool definitions to inject into forms. */
21
+ tools: ToolDefinition[];
22
+ /** Auto-detect forms without WebMCP attributes and report them. */
23
+ autoDetect?: boolean;
24
+ }
25
+ /** Definition of a tool mapped to an HTML form. */
26
+ export interface ToolDefinition {
27
+ /** CSS selector for the target form element. */
28
+ formSelector: string;
29
+ /** Value for the `toolname` attribute. */
30
+ toolName: string;
31
+ /** Value for the `tooldescription` attribute. */
32
+ toolDescription: string;
33
+ /** Whether agents can auto-submit this form. */
34
+ autoSubmit?: boolean;
35
+ /** Field mappings for tool parameters. */
36
+ fields?: FieldMapping[];
37
+ }
38
+ /** Mapping of a form field to a tool parameter. */
39
+ export interface FieldMapping {
40
+ /** CSS selector for the form field. */
41
+ fieldSelector: string;
42
+ /** Value for the `toolparamtitle` attribute. */
43
+ paramTitle: string;
44
+ /** Value for the `toolparamdescription` attribute. */
45
+ paramDescription: string;
46
+ }
47
+ /** Consent management configuration. */
48
+ export interface ConsentConfig {
49
+ /** Whether consent is required before allowing agent invocations. */
50
+ required: boolean;
51
+ /** Custom text for the consent banner. */
52
+ bannerText?: string;
53
+ /** URL to the agent interaction policy. */
54
+ policyUrl?: string;
55
+ /** localStorage key for storing consent state. */
56
+ storageKey?: string;
57
+ }
58
+ /** Rate limiting configuration. */
59
+ export interface RateLimitConfig {
60
+ /** Global max invocations per minute. */
61
+ maxInvocationsPerMinute: number;
62
+ /** Max invocations per individual tool per minute. */
63
+ maxPerTool?: number;
64
+ /** Cooldown in seconds after exceeding the limit. */
65
+ cooldownSeconds?: number;
66
+ }
67
+ /** Type of AI agent detected. */
68
+ export type AgentType = 'browser_agent' | 'extension' | 'automated' | 'unknown';
69
+ /** Type of shield event. */
70
+ export type EventType = 'invocation' | 'cancel' | 'rate_limited' | 'consent_given' | 'consent_denied';
71
+ /** Agent information detected during an invocation. */
72
+ export interface AgentInfo {
73
+ /** Raw user-agent string if available. */
74
+ userAgent?: string;
75
+ /** Classified agent type. */
76
+ agentType: AgentType;
77
+ }
78
+ /** Event generated by dat2ai when an agent interacts with a form. */
79
+ export interface ShieldEvent {
80
+ /** Unique event identifier. */
81
+ id: string;
82
+ /** ISO 8601 timestamp. */
83
+ timestamp: string;
84
+ /** Site key this event belongs to. */
85
+ siteKey: string;
86
+ /** Name of the tool invoked. */
87
+ toolName: string;
88
+ /** CSS selector of the form. */
89
+ formSelector: string;
90
+ /** Type of event. */
91
+ eventType: EventType;
92
+ /** Detected agent information. */
93
+ agentInfo: AgentInfo;
94
+ /** Form field data (only captured if consent allows and field is not sensitive). */
95
+ fieldData?: Record<string, string>;
96
+ /** Whether user consent was given. */
97
+ consentGiven: boolean;
98
+ /** Rate limit status at time of event. */
99
+ rateLimitStatus: 'ok' | 'limited' | 'blocked';
100
+ /** Additional metadata. */
101
+ metadata?: Record<string, unknown>;
102
+ }
103
+ /** Shield event names that can be listened to. */
104
+ export type ShieldEventName = 'invocation' | 'cancel' | 'rateLimited' | 'consentGiven' | 'consentDenied' | 'error';
105
+ /** Callback handler for shield events. */
106
+ export type ShieldEventHandler = (event: ShieldEvent) => void;
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "dat2ai",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "dat2ai - AI Agent Governance for the Web",
6
+ "main": "dist/index.umd.js",
7
+ "module": "dist/index.esm.js",
8
+ "browser": "dist/dat2ai.min.js",
9
+ "types": "dist/types/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.esm.js",
16
+ "require": "./dist/index.umd.js",
17
+ "types": "./dist/types/index.d.ts"
18
+ }
19
+ },
20
+ "scripts": {
21
+ "build": "node ../../node_modules/rollup/dist/bin/rollup -c",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest"
24
+ },
25
+ "devDependencies": {
26
+ "@rollup/plugin-terser": "^0.4.4",
27
+ "@rollup/plugin-typescript": "^12.1.0",
28
+ "jsdom": "^25.0.0",
29
+ "rollup": "^4.28.0",
30
+ "tslib": "^2.8.0",
31
+ "typescript": "^5.7.0",
32
+ "vitest": "^2.1.0"
33
+ },
34
+ "sideEffects": false,
35
+ "license": "MIT"
36
+ }