@agentronics/sdk 0.1.2 → 0.2.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 @@
1
+ {"version":3,"sources":["../src/version.ts","../src/detection/webmcp.ts"],"names":["SDK_VERSION","readModelContext","value","detectWebMcp","options","pollMs","start","ctx","buildIdentity","resolve"],"mappings":"AAKO,IAAMA,CAAAA,CAAc,QCI3B,IAAMC,CAAAA,CAAmB,IAA+B,CACtD,GAAI,OAAO,SAAA,CAAc,GAAA,CAAa,OAAO,IAAA,CAC7C,IAAMC,CAAAA,CAAS,SAAA,CAA6D,YAAA,CAC5E,OAAOA,CAAAA,EAAS,OAAOA,GAAU,QAAA,CAAWA,CAAAA,CAAQ,IACtD,CAAA,CAUaC,CAAAA,CAAe,MAC1BC,EAA+B,EAAC,GACE,CAClC,GAAM,CAAE,MAAA,CAAAC,EAAS,GAAI,CAAA,CAAID,CAAAA,CACnBE,CAAAA,CAAQ,IAAA,CAAK,GAAA,GAEnB,OAAa,CACX,IAAMC,CAAAA,CAAMN,CAAAA,EAAiB,CAC7B,GAAIM,CAAAA,CAAK,OAAOC,CAAAA,CAAcD,CAAG,CAAA,CACjC,GAAI,IAAA,CAAK,KAAI,CAAID,CAAAA,EAASD,CAAAA,CAAQ,OAAO,IAAA,CACzC,MAAM,IAAI,OAAA,CAASI,CAAAA,EAAY,UAAA,CAAWA,CAAAA,CAAS,EAAE,CAAC,EACxD,CACF,CAAA,CAEMD,CAAAA,CAAiBD,CAAAA,GAA0C,CAC/D,KAAA,CAAO,SACP,KAAA,CAAO,UAAA,CACP,UAAA,CAAY,CAAA,CACZ,MAAA,CAAQA,CAAAA,CAAI,QAAUA,CAAAA,CAAI,MAAA,EAAU,IAAA,CACpC,SAAA,CAAW,OAAO,SAAA,CAAc,IAAc,IAAA,CAAO,SAAA,CAAU,SAAA,CAC/D,gBAAA,CAAkBP,CAAAA,CAClB,OAAA,CAAS,CACP,MAAA,CAAQ,IAAA,CACR,SAAA,CAAW,KAAA,CAAM,OAAA,CAAQO,CAAAA,CAAI,KAAK,CAAA,CAAIA,CAAAA,CAAI,KAAA,CAAM,MAAA,CAAS,CAC3D,CACF,CAAA","file":"chunk-LLD3Y2LZ.js","sourcesContent":["// Single source of truth for the SDK build version, surfaced on every\n// AgentIdentity as `detectionVersion` so traces can be filtered by SDK\n// generation. tsup inlines a pkg-version replacement at build time;\n// the literal here is the dev/test fallback. Bump this when you cut a\n// new SDK release.\nexport const SDK_VERSION = '0.1.2'\n","import type { AgentIdentity } from '@agentronics/protocol'\nimport { SDK_VERSION } from \"../version.js\"\n\ninterface ModelContextLike {\n client?: string\n vendor?: string\n tools?: unknown[]\n}\n\nconst readModelContext = (): ModelContextLike | null => {\n if (typeof navigator === 'undefined') return null\n const value = (navigator as unknown as { modelContext?: ModelContextLike }).modelContext\n return value && typeof value === 'object' ? value : null\n}\n\nexport interface DetectWebMcpOptions {\n /**\n * Some extensions inject `navigator.modelContext` after first paint. Poll for this many\n * milliseconds before giving up. Set to 0 to read synchronously and return immediately.\n */\n pollMs?: number\n}\n\nexport const detectWebMcp = async (\n options: DetectWebMcpOptions = {}\n): Promise<AgentIdentity | null> => {\n const { pollMs = 500 } = options\n const start = Date.now()\n\n while (true) {\n const ctx = readModelContext()\n if (ctx) return buildIdentity(ctx)\n if (Date.now() - start >= pollMs) return null\n await new Promise((resolve) => setTimeout(resolve, 50))\n }\n}\n\nconst buildIdentity = (ctx: ModelContextLike): AgentIdentity => ({\n class: 'webmcp',\n trust: 'detected',\n confidence: 1,\n vendor: ctx.vendor ?? ctx.client ?? null,\n userAgent: typeof navigator === 'undefined' ? null : navigator.userAgent,\n detectionVersion: SDK_VERSION,\n signals: {\n webmcp: true,\n toolCount: Array.isArray(ctx.tools) ? ctx.tools.length : 0,\n },\n})\n"]}
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var protocol=require('@agentronics/protocol');var yt=()=>{if(typeof navigator>"u")return null;let e=navigator.modelContext;return e&&typeof e=="object"?e:null},E=async(e={})=>{let{pollMs:t=500}=e,r=Date.now();for(;;){let n=yt();if(n)return gt(n);if(Date.now()-r>=t)return null;await new Promise(o=>setTimeout(o,50));}},gt=e=>({class:"webmcp",trust:"detected",confidence:1,vendor:e.vendor??e.client??null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{webmcp:true,toolCount:Array.isArray(e.tools)?e.tools.length:0}});var ft=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],ht=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),vt=()=>{if(typeof window>"u")return {hit:false,weight:.5};let e=Object.keys(window).filter(t=>t.startsWith("cdc_"));return {hit:e.length>0,weight:.5,detail:`window.${e[0]??"cdc_*"}`}},xt=()=>{if(typeof navigator>"u"||!navigator.plugins)return {hit:false,weight:.2};let e=/Win|Mac|Linux/.test(navigator.userAgent??""),t=navigator.plugins.length===0;return {hit:e&&t,weight:.2,detail:"desktop UA with no plugins"}},wt=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=ft.some(r=>r.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},St=()=>{if(typeof navigator>"u")return {hit:false,weight:.15};let e=navigator.languages;return {hit:!e||e.length===0,weight:.15,detail:"navigator.languages empty"}},Tt=()=>{if(typeof navigator>"u")return {hit:false,weight:.1};let e="chrome"in window,t=navigator.userAgent??"";return {hit:/Chrome\//.test(t)&&!/Edg\//.test(t)&&!e,weight:.2,detail:"Chrome UA without window.chrome"}},bt={webdriver:ht,chromedriver:vt,headlessUa:wt,languages:St,permissions:Tt,plugins:xt},C=(e={})=>{let{threshold:t=.4}=e,r={},n=0,o=0;for(let[s,a]of Object.entries(bt)){let l=a();n+=l.weight,r[s]={hit:l.hit,weight:l.weight,detail:l.detail},l.hit&&(o+=l.weight);}let i=n===0?0:o/n;return i<t?null:{class:"dom",trust:"detected",confidence:i,vendor:null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:r}};var X=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>E({pollMs:0})},{id:"dom.automation-heuristics",status:"beta",detect:()=>C()}],L=(e=X())=>{let t=new Map(e.map(r=>[r.id,r]));return {register(r){t.set(r.id,r);},list(r){let n=[...t.values()];return r?n.filter(o=>o.status===r):n},async detectAll(r=false){for(let n of t.values()){if(n.status==="research"&&!r)continue;let o=await n.detect();if(o)return o}return null}}};var Y=e=>{let t=protocol.AgentClass.parse(e.class),r=e.verificationToken?"verified":"declared";return {class:t,trust:r,confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{declared:true,hasVerificationToken:!!e.verificationToken}}};var Oe=({gatewayUrl:e,fetcher:t=fetch})=>{let r=null,n=[];return {snapshot(){return [...n]},async sync(){let o=await t(`${e.replace(/\/$/,"")}/v1/detector-signatures`,{headers:r?{"if-none-match":r}:{}});if(o.status===304)return this.snapshot();if(!o.ok)throw new Error(`Detector signature sync failed with status ${o.status}.`);return n=(await o.json()).signatures??[],r=o.headers.get("etag"),this.snapshot()}}};var W=async(e={})=>{if(e.customDetectors?.length){let t=await L(e.customDetectors).detectAll(!!e.experimental);if(t)return t}if(e.webmcp!==false){let t=await E(e.webmcp??{});if(t)return t}if(e.dom!==false){let t=C(e.dom??{});if(t)return t}return null};var Pt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),Q=()=>{let e=null;return {present(t){let r=protocol.IdentityClaim.safeParse(t);if(!r.success)throw new protocol.AgentronicsError("invalid_api_key",`Invalid identity claim: ${r.error.issues[0]?.message??"unknown"}`);let n={claim:r.data,identity:Pt(r.data)};return e=n,n},clear(){e=null;},preferOver(t){return e?t?protocol.isHigherTrust(e.identity.trust,t.trust)?e.identity:t:e.identity:t},snapshot(){return e}}};var Rt=({detected:e,declared:t,verified:r,linked:n})=>n?"linked":r?"verified":t?"declared":"detected",Z=e=>{let t=null;for(let r of e)(!t||protocol.TRUST_RANK[r.trust]>protocol.TRUST_RANK[t.trust])&&(t=r);return t};var Le=()=>({name:"bearer",async authenticate(e,t){if(!e.bearerToken)return null;let r=await t.verifyToken?.("bearer",e.bearerToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"bearer",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{bearer:true,verifiedRemotely:!!r}}}});var We=()=>({name:"detection",async authenticate(e){return e.detected??null}});var $e=()=>({name:"extensionToken",async authenticate(e,t){if(!e.extensionToken)return null;let r=await t.verifyToken?.("extensionToken",e.extensionToken);return {class:"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"browser-extension",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{extensionToken:true,verifiedRemotely:!!r}}}});var je=()=>({name:"mtls",async authenticate(e,t){if(!e.xfccHeader)return null;let r=await t.verifyToken?.("mtls",e.xfccHeader);return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"mtls",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{mtls:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var Ge=()=>({name:"oauth2",async authenticate(e,t){if(!e.oauth2AccessToken)return null;let r=await t.verifyToken?.("oauth2",e.oauth2AccessToken);return {class:e.classHint??"webmcp",trust:e.oauth2Subject?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"oauth2",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{oauth2:true,subject:e.oauth2Subject??null,verifiedRemotely:!!r}}}});var Ct=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),Be=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?Ct(protocol.IdentityClaim.parse(e.declaration)):null}});var Ne=()=>({name:"sessionLink",async authenticate(e,t){if(!e.sessionLinkToken)return null;let r=await t.verifyToken?.("sessionLink",e.sessionLinkToken);return {class:e.classHint??"screenshot",trust:e.linkedUserId?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"session-link",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{sessionLink:true,linkedUserId:e.linkedUserId??null,verifiedRemotely:!!r}}}});var _e=()=>({name:"sso",async authenticate(e,t){if(!e.ssoIdToken)return null;let r=await t.verifyToken?.("sso",e.ssoIdToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"sso",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{sso:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var Ue=()=>({name:"spiffe",async authenticate(e,t){if(!e.spiffeJwt)return null;let r=await t.verifyToken?.("spiffe",e.spiffeJwt),n=r?.vendor==="google";return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"spiffe",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{spiffe:true,spiffeId:r?.subject??null,subject:r?.subject??null,verifiedRemotely:!!r,...n?{googleAgent:true}:{},...r?.signals??{}}}}});var He=()=>({name:"xAgentHeader",async authenticate(e){if(!e.xAgentHeader)return null;let[t="x-agent",r="dom",n]=e.xAgentHeader.split(";"),o=protocol.AgentClass.safeParse(r);return {class:o.success?o.data:"dom",trust:n?"verified":"declared",confidence:n?1:.8,vendor:t,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:"2026.04",signals:{xAgentHeader:true,hasProof:!!n}}}});var Dt=()=>[We(),Be(),Le(),He(),$e(),Ne(),Ge(),_e(),Ue(),je()],Lt={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Wt=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":Lt[e],ee=({methods:e=Dt(),context:t={},onTrace:r}={})=>({async authenticate(n){let o=[],i={};for(let m of e){let p=await m.authenticate(n,t);i[m.name]=!!p,p&&o.push({method:m.name,identity:p});}let s=Z(o.map(m=>m.identity)),a=s?o.find(m=>m.identity===s):void 0,l=a?Wt(a.method,a.identity):void 0,u=typeof s?.signals?.subject=="string"?s.signals.subject:void 0,d={type:s?"auth.identity_presented":"sdk.error",agent:s,outcome:s?"success":"error",metadata:{methods:i,...l?{protocol:l}:{},...u?{subject:u}:{}}};return s||(d.error="No auth method produced an identity."),r?.(d),s},methods(){return e.map(n=>n.name)}});var $t={identity:null,source:"initial",updatedAt:null},te=()=>{let e=$t,t=new Set,r=()=>{t.size!==0&&t.forEach(n=>n(e));};return {snapshot(){return e},set(n,o){e={identity:n,source:o,updatedAt:new Date().toISOString()},r();},subscribe(n){return t.add(n),()=>{t.delete(n);}}}};var jt=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);}}},Gt=()=>typeof window>"u"||!window.localStorage?jt():{read:e=>{try{return window.localStorage.getItem(e)}catch{return null}},write:(e,t)=>{try{window.localStorage.setItem(e,t);}catch{}}},Bt=e=>{if(!e)return null;try{let t=JSON.parse(e);if(typeof t=="object"&&t!==null&&Number.isFinite(t.count)&&Number.isFinite(t.resetAt))return t}catch{return null}return null},re=(e=Gt())=>({consume(t,r,n=Date.now()){let o=`agtx:rate:${t}`,i=Bt(e.read(o)),s=i&&i.resetAt>n?i.resetAt:n+r.windowSeconds*1e3,a=i&&i.resetAt>n?i.count+1:1;return e.write(o,JSON.stringify({count:a,resetAt:s})),{allowed:a<=r.max,remaining:Math.max(0,r.max-a),resetAt:s}}});var Nt=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,_t=(e,t)=>{let r=e?protocol.TRUST_RANK[e.trust]:-1,n=protocol.TRUST_RANK[t.minTrust];return r>=n},Ut=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,ze="review",Ht=(e,t)=>{let r=t?.class??"unknown",n=t?.vendor??"unknown",o=t?.trust??"none";return `${e}:${r}:${n}:${o}`},ne=(e=[],t={})=>{let r=e.map(o=>protocol.PolicyRule.parse(o)),n=t.rateLimiter??re();return {set(o){r=o.map(i=>protocol.PolicyRule.parse(i));},list(){return [...r]},evaluate({tool:o,identity:i}){for(let s of r)if(Nt(s.tool,o)){if(!_t(i,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Ut(i,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let a=n.consume(Ht(o,i),s.rateLimit);if(!a.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(a.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:ze,ruleId:null,reason:`No rule matched tool "${o}". Falling back to "${ze}".`}}}};var oe=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={policies:[],etag:null};return {snapshot(){return {policies:[...o.policies],etag:o.etag}},async sync(){let i=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/policies`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(i.status===304)return this.snapshot();if(!i.ok)throw new Error(`Policy sync failed with status ${i.status}.`);let s=await i.json();return o={policies:protocol.PolicyRule.array().parse(s.policies??[]),etag:i.headers.get("etag")},this.snapshot()}}};var ie=({message:e="Agent action blocked by site policy.",durationMs:t=2400,documentRef:r=typeof document>"u"?void 0:document}={})=>{if(!r?.body)return null;let n=r.createElement("div");return n.setAttribute("role","status"),n.setAttribute("data-agentronics-deny-overlay","true"),n.textContent=e,Object.assign(n.style,{position:"fixed",zIndex:"2147483647",left:"50%",bottom:"24px",transform:"translateX(-50%)",maxWidth:"min(520px, calc(100vw - 32px))",padding:"12px 16px",borderRadius:"8px",background:"#07091A",color:"#F4F4F5",border:"1px solid #6366F1",boxShadow:"0 20px 48px -16px rgba(7,9,26,0.55)",font:"13px/1.45 'Space Mono', ui-monospace, SFMono-Regular, Menlo, monospace"}),r.body.appendChild(n),window.setTimeout(()=>n.remove(),t),n};var se=({policyEngine:e,getIdentity:t,documentRef:r=typeof document>"u"?void 0:document,selector:n="[data-agentronics-tool]"})=>{if(!r)return {uninstall:()=>{}};let o=i=>{let s=i.target instanceof Element?i.target.closest(n):null;if(!(s instanceof HTMLElement))return;let a=s.dataset.agentronicsTool;a&&Promise.resolve(t()).then(l=>{let u=e.evaluate({tool:a,identity:l});u.decision==="deny"&&(i.preventDefault(),i.stopPropagation(),ie({message:u.reason,documentRef:r}));});};return r.addEventListener("click",o,true),{uninstall:()=>r.removeEventListener("click",o,true)}};var ae=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);},remove:t=>{e.delete(t);},keys:()=>[...e.keys()]}},Je=(e,t)=>({read:r=>{try{return e.getItem(t+r)}catch{return null}},write:(r,n)=>{try{e.setItem(t+r,n);}catch{}},remove:r=>{try{e.removeItem(t+r);}catch{}},keys:()=>{let r=[];try{for(let n=0;n<e.length;n++){let o=e.key(n);o&&o.startsWith(t)&&r.push(o.slice(t.length));}}catch{}return r}}),Ve="agtx:",qe=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?Je(window.sessionStorage,Ve+"session:"):ae(),r=e&&typeof window.localStorage<"u"?Je(window.localStorage,Ve+"user:"):ae();return {session:t,user:r,org:ae()}};var Ye=(e,t)=>e.expiresAt!==null&&e.expiresAt<=t,Qe=e=>{if(!e)return null;try{let t=JSON.parse(e);return typeof t!="object"||t===null?null:t}catch{return null}},Kt=e=>JSON.stringify(e),ce=(e={})=>{let t=qe(),r=l=>{e.onTrace?.(l);};return {get:(l,u={})=>{let d=u.scope??"session",m=t[d],p=Qe(m.read(l));if(!p){r({type:"memory.accessed",metadata:{operation:"get",key:l,scope:d,hit:false}});return}if(Ye(p,Date.now())){m.remove(l),r({type:"memory.accessed",metadata:{operation:"get",key:l,scope:d,hit:false,expired:true}});return}return r({type:"memory.accessed",metadata:{operation:"get",key:l,scope:d,hit:true}}),p.value},set:(l,u,d={})=>{let m=d.scope??"session",p=d.ttlSeconds??null,f=Date.now(),x={value:u,expiresAt:p===null?null:f+p*1e3,updatedAt:new Date(f).toISOString()};return t[m].write(l,Kt(x)),r({type:"memory.updated",metadata:{operation:"set",key:l,scope:m,ttlSeconds:p}}),protocol.MemoryEntry.parse({key:l,value:u,scope:m,ttlSeconds:p,updatedAt:x.updatedAt})},remove:(l,u={})=>{let d=u.scope??"session";t[d].remove(l),r({type:"memory.updated",metadata:{operation:"remove",key:l,scope:d}});},list:(l={})=>{let u=l.scope??"session",d=t[u],m=Date.now(),p=[];for(let f of d.keys()){let x=Qe(d.read(f));if(x){if(Ye(x,m)){d.remove(f);continue}p.push(protocol.MemoryEntry.parse({key:f,value:x.value,scope:u,ttlSeconds:x.expiresAt===null?null:Math.max(0,Math.round((x.expiresAt-m)/1e3)),updatedAt:x.updatedAt}));}}return r({type:"memory.accessed",metadata:{operation:"list",scope:u,count:p.length}}),p},clear:(l={})=>{let u=l.scope??"session",d=t[u],m=d.keys().length;for(let p of d.keys())d.remove(p);r({type:"memory.updated",metadata:{operation:"clear",scope:u,count:m}});}}};var le=e=>protocol.SiteMemory.parse(JSON.parse(JSON.stringify(e))),$=e=>({...e,updatedAt:new Date().toISOString()}),ue=(e={})=>{let t=protocol.SiteMemory.parse({...protocol.SITE_MEMORY_DEFAULT,...e.initial??{}}),r=null,n=new Set,o=y=>{e.onTrace?.(y);},i=()=>{r=null;},s=()=>{if(n.size===0)return;let y=le(t);r=y,n.forEach(h=>h(y));},a=y=>{let h=protocol.SiteMemory.parse({...t,...y,workflows:{...t.workflows,...y.workflows??{}},policies:{...t.policies,...y.policies??{}},uiGuidance:{...t.uiGuidance,...y.uiGuidance??{}},pageContexts:{...t.pageContexts,...y.pageContexts??{}}});return t=$(h),i(),o({type:"memory.updated",metadata:{kind:"site",operation:"provide",keys:Object.keys(y)}}),s(),d()},l=(y,h)=>{let v=y.split(".").filter(Boolean);if(v.length===0)throw new Error("siteMemory.update() requires a non-empty dot-path.");let A=JSON.parse(JSON.stringify(t)),k=A;for(let M=0;M<v.length-1;M++){let T=v[M],I=k[T];(typeof I!="object"||I===null||Array.isArray(I))&&(k[T]={}),k=k[T];}return k[v[v.length-1]]=h,t=$(protocol.SiteMemory.parse(A)),i(),o({type:"memory.updated",metadata:{kind:"site",operation:"update",path:y}}),s(),d()},u=y=>{let h=protocol.SiteMemoryPageContext.parse({path:y.path,payload:y.payload,updatedAt:new Date().toISOString()});return t=$({...t,pageContexts:{...t.pageContexts,[y.path]:h}}),i(),o({type:"memory.updated",metadata:{kind:"site",operation:"provideForPage",path:y.path}}),s(),{...h,payload:{...h.payload}}},d=()=>(r||(r=le(t)),r);return {provide:a,update:l,provideForPage:u,snapshot:d,get:y=>{if(o({type:"memory.accessed",metadata:{kind:"site",operation:y?"get":"snapshot",path:y??null}}),!y)return le(t);let h=y.split(".").filter(Boolean),v=t;for(let A of h){if(typeof v!="object"||v===null)return;v=v[A];}return v},getForPage:y=>{o({type:"memory.accessed",metadata:{kind:"site",operation:"getForPage",path:y}});let h=t.pageContexts[y];return h?{...h,payload:{...h.payload}}:null},replace:y=>(t=$(protocol.SiteMemory.parse(y)),i(),s(),d()),subscribe:y=>(n.add(y),()=>{n.delete(y);})}};var pe=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={memory:null,etag:null};return {snapshot(){return {memory:o.memory?protocol.SiteMemory.parse(o.memory):null,etag:o.etag}},async sync(){let i=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/memory`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(i.status===304)return this.snapshot();if(!i.ok)throw new Error(`Memory sync failed with status ${i.status}.`);let s=await i.json();return o={memory:protocol.SiteMemory.parse(s.memory??{}),etag:i.headers.get("etag")},this.snapshot()}}};var et=({toolName:e="getSiteContext",description:t="Returns Agentronics site memory: page map, workflows, policies, UI guidance.",getSnapshot:r,onAccess:n})=>({name:e,description:t,inputSchema:{type:"object",properties:{path:{type:"string",description:'Optional dot-path into the site memory (e.g. "workflows.purchase").'}},required:[]},invoke(o={}){let i=r(),s=o.path??null;if(n?.(s),!s)return {content:i};let a=s.split(".").filter(Boolean),l=i;for(let u of a){if(typeof l!="object"||l===null)return {content:void 0};l=l[u];}return {content:l}}});var b="agent-context-",de="agentronics-site-context",Vt=e=>{try{return JSON.stringify(e)}catch{return "{}"}},j=(e,t,r)=>{let n=e.querySelector(`meta[name="${t}"]`);n||(n=e.createElement("meta"),n.setAttribute("name",t),e.head.appendChild(n)),n.setAttribute("content",r);},G=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(r=>r.remove());},B=({doc:e=typeof document>"u"?null:document,snapshot:t,schemaType:r="WebSite"})=>{if(!e)return {uninstall:()=>{}};j(e,`${b}version`,t.version),j(e,`${b}updated-at`,t.updatedAt??new Date().toISOString()),t.siteMap?.navigation?.flow&&j(e,`${b}flow`,t.siteMap.navigation.flow),j(e,`${b}workflows`,Object.keys(t.workflows).join(","));let n=e.getElementById(de);return n||(n=e.createElement("script"),n.type="application/ld+json",n.id=de,e.head.appendChild(n)),n.textContent=Vt({"@context":"https://schema.org","@type":r,name:"Agentronics Site Memory",agentronics:t}),{uninstall:()=>{G(e,`${b}version`),G(e,`${b}updated-at`),G(e,`${b}flow`),G(e,`${b}workflows`),e.getElementById(de)?.remove();}}};var tt="agentronics-memory-overlay",qt=e=>`
1
+ 'use strict';var protocol=require('@agentronics/protocol');var f="0.1.2";var xt=()=>{if(typeof navigator>"u")return null;let e=navigator.modelContext;return e&&typeof e=="object"?e:null},D=async(e={})=>{let{pollMs:t=500}=e,r=Date.now();for(;;){let n=xt();if(n)return wt(n);if(Date.now()-r>=t)return null;await new Promise(o=>setTimeout(o,50));}},wt=e=>({class:"webmcp",trust:"detected",confidence:1,vendor:e.vendor??e.client??null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{webmcp:true,toolCount:Array.isArray(e.tools)?e.tools.length:0}});var Tt=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],bt=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),At=()=>{if(typeof window>"u")return {hit:false,weight:.5};let e=Object.keys(window).filter(t=>t.startsWith("cdc_"));return {hit:e.length>0,weight:.5,detail:`window.${e[0]??"cdc_*"}`}},kt=()=>{if(typeof navigator>"u"||!navigator.plugins)return {hit:false,weight:.2};let e=/Win|Mac|Linux/.test(navigator.userAgent??""),t=navigator.plugins.length===0;return {hit:e&&t,weight:.2,detail:"desktop UA with no plugins"}},Mt=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=Tt.some(r=>r.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},It=()=>{if(typeof navigator>"u")return {hit:false,weight:.15};let e=navigator.languages;return {hit:!e||e.length===0,weight:.15,detail:"navigator.languages empty"}},Pt=()=>{if(typeof navigator>"u")return {hit:false,weight:.1};let e="chrome"in window,t=navigator.userAgent??"";return {hit:/Chrome\//.test(t)&&!/Edg\//.test(t)&&!e,weight:.2,detail:"Chrome UA without window.chrome"}},Rt={webdriver:bt,chromedriver:At,headlessUa:Mt,languages:It,permissions:Pt,plugins:kt},C=(e={})=>{let{threshold:t=.4}=e,r={},n=0,o=0;for(let[s,g]of Object.entries(Rt)){let i=g();n+=i.weight,r[s]={hit:i.hit,weight:i.weight,detail:i.detail},i.hit&&(o+=i.weight);}let a=n===0?0:o/n;return a<t?null:{class:"dom",trust:"detected",confidence:a,vendor:null,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:r}};var Q=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>D({pollMs:0})},{id:"dom.automation-heuristics",status:"beta",detect:()=>C()}],j=(e=Q())=>{let t=new Map(e.map(r=>[r.id,r]));return {register(r){t.set(r.id,r);},list(r){let n=[...t.values()];return r?n.filter(o=>o.status===r):n},async detectAll(r=false){for(let n of t.values()){if(n.status==="research"&&!r)continue;let o=await n.detect();if(o)return o}return null}}};var Z=e=>{let t=protocol.AgentClass.parse(e.class),r=e.verificationToken?"verified":"declared";return {class:t,trust:r,confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasVerificationToken:!!e.verificationToken}}};var Le=({gatewayUrl:e,fetcher:t=fetch})=>{let r=null,n=[];return {snapshot(){return [...n]},async sync(){let o=await t(`${e.replace(/\/$/,"")}/v1/detector-signatures`,{headers:r?{"if-none-match":r}:{}});if(o.status===304)return this.snapshot();if(!o.ok)throw new Error(`Detector signature sync failed with status ${o.status}.`);return n=(await o.json()).signatures??[],r=o.headers.get("etag"),this.snapshot()}}};var N=async(e={})=>{if(e.customDetectors?.length){let t=await j(e.customDetectors).detectAll(!!e.experimental);if(t)return t}if(e.webmcp!==false){let t=await D(e.webmcp??{});if(t)return t}if(e.dom!==false){let t=C(e.dom??{});if(t)return t}return null};var Lt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),ee=()=>{let e=null;return {present(t){let r=protocol.IdentityClaim.safeParse(t);if(!r.success)throw new protocol.AgentronicsError("invalid_api_key",`Invalid identity claim: ${r.error.issues[0]?.message??"unknown"}`);let n={claim:r.data,identity:Lt(r.data)};return e=n,n},clear(){e=null;},preferOver(t){return e?t?protocol.isHigherTrust(e.identity.trust,t.trust)?e.identity:t:e.identity:t},snapshot(){return e}}};var Wt=({detected:e,declared:t,verified:r,linked:n})=>n?"linked":r?"verified":t?"declared":"detected",te=e=>{let t=null;for(let r of e)(!t||protocol.TRUST_RANK[r.trust]>protocol.TRUST_RANK[t.trust])&&(t=r);return t};var $e=()=>({name:"bearer",async authenticate(e,t){if(!e.bearerToken)return null;let r=await t.verifyToken?.("bearer",e.bearerToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"bearer",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{bearer:true,verifiedRemotely:!!r}}}});var je=()=>({name:"detection",async authenticate(e){return e.detected??null}});var Ne=()=>({name:"extensionToken",async authenticate(e,t){if(!e.extensionToken)return null;let r=await t.verifyToken?.("extensionToken",e.extensionToken);return {class:"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"browser-extension",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{extensionToken:true,verifiedRemotely:!!r}}}});var Ge=()=>({name:"mtls",async authenticate(e,t){if(!e.xfccHeader)return null;let r=await t.verifyToken?.("mtls",e.xfccHeader);return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"mtls",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{mtls:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var _e=()=>({name:"oauth2",async authenticate(e,t){if(!e.oauth2AccessToken)return null;let r=await t.verifyToken?.("oauth2",e.oauth2AccessToken);return {class:e.classHint??"webmcp",trust:e.oauth2Subject?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"oauth2",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{oauth2:true,subject:e.oauth2Subject??null,verifiedRemotely:!!r}}}});var jt=e=>({class:e.class,trust:"declared",confidence:1,vendor:e.vendor,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{declared:true,hasToken:true,tokenExpiresAt:e.expiresAt??null}}),Be=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?jt(protocol.IdentityClaim.parse(e.declaration)):null}});var Ue=()=>({name:"sessionLink",async authenticate(e,t){if(!e.sessionLinkToken)return null;let r=await t.verifyToken?.("sessionLink",e.sessionLinkToken);return {class:e.classHint??"screenshot",trust:e.linkedUserId?"linked":r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"session-link",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sessionLink:true,linkedUserId:e.linkedUserId??null,verifiedRemotely:!!r}}}});var Ke=()=>({name:"sso",async authenticate(e,t){if(!e.ssoIdToken)return null;let r=await t.verifyToken?.("sso",e.ssoIdToken);return {class:e.classHint??"dom",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"sso",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{sso:true,subject:r?.subject??null,verifiedRemotely:!!r,...r?.signals??{}}}}});var He=()=>({name:"spiffe",async authenticate(e,t){if(!e.spiffeJwt)return null;let r=await t.verifyToken?.("spiffe",e.spiffeJwt),n=r?.vendor==="google";return {class:e.classHint??"webmcp",trust:r?.trust??"verified",confidence:1,vendor:r?.vendor??e.vendorHint??"spiffe",userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{spiffe:true,spiffeId:r?.subject??null,subject:r?.subject??null,verifiedRemotely:!!r,...n?{googleAgent:true}:{},...r?.signals??{}}}}});var Fe=()=>({name:"xAgentHeader",async authenticate(e){if(!e.xAgentHeader)return null;let[t="x-agent",r="dom",n]=e.xAgentHeader.split(";"),o=protocol.AgentClass.safeParse(r);return {class:o.success?o.data:"dom",trust:n?"verified":"declared",confidence:n?1:.8,vendor:t,userAgent:typeof navigator>"u"?null:navigator.userAgent,detectionVersion:f,signals:{xAgentHeader:true,hasProof:!!n}}}});var Gt=()=>[je(),Be(),$e(),Fe(),Ne(),Ue(),_e(),Ke(),He(),Ge()],_t={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Bt=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":_t[e],re=({methods:e=Gt(),context:t={},onTrace:r}={})=>({async authenticate(n){let o=[],a={};for(let d of e){let p=await d.authenticate(n,t);a[d.name]=!!p,p&&o.push({method:d.name,identity:p});}let s=te(o.map(d=>d.identity)),g=s?o.find(d=>d.identity===s):void 0,i=g?Bt(g.method,g.identity):void 0,y=typeof s?.signals?.subject=="string"?s.signals.subject:void 0,u={type:s?"auth.identity_presented":"sdk.error",agent:s,outcome:s?"success":"error",metadata:{methods:a,...i?{protocol:i}:{},...y?{subject:y}:{}}};return s||(u.error="No auth method produced an identity."),r?.(u),s},methods(){return e.map(n=>n.name)}});var Ut={identity:null,source:"initial",updatedAt:null},ne=()=>{let e=Ut,t=new Set,r=()=>{t.size!==0&&t.forEach(n=>n(e));};return {snapshot(){return e},set(n,o){e={identity:n,source:o,updatedAt:new Date().toISOString()},r();},subscribe(n){return t.add(n),()=>{t.delete(n);}}}};var Kt=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);}}},Ht=()=>typeof window>"u"||!window.localStorage?Kt():{read:e=>{try{return window.localStorage.getItem(e)}catch{return null}},write:(e,t)=>{try{window.localStorage.setItem(e,t);}catch{}}},Ft=e=>{if(!e)return null;try{let t=JSON.parse(e);if(typeof t=="object"&&t!==null&&Number.isFinite(t.count)&&Number.isFinite(t.resetAt))return t}catch{return null}return null},oe=(e=Ht())=>({consume(t,r,n=Date.now()){let o=`agtx:rate:${t}`,a=Ft(e.read(o)),s=a&&a.resetAt>n?a.resetAt:n+r.windowSeconds*1e3,g=a&&a.resetAt>n?a.count+1:1;return e.write(o,JSON.stringify({count:g,resetAt:s})),{allowed:g<=r.max,remaining:Math.max(0,r.max-g),resetAt:s}}});var Vt=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,zt=(e,t)=>{let r=e?protocol.TRUST_RANK[e.trust]:-1,n=protocol.TRUST_RANK[t.minTrust];return r>=n},Jt=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,Je="review",qt=(e,t)=>{let r=t?.class??"unknown",n=t?.vendor??"unknown",o=t?.trust??"none";return `${e}:${r}:${n}:${o}`},ie=(e=[],t={})=>{let r=e.map(o=>protocol.PolicyRule.parse(o)),n=t.rateLimiter??oe();return {set(o){r=o.map(a=>protocol.PolicyRule.parse(a));},list(){return [...r]},evaluate({tool:o,identity:a}){for(let s of r)if(Vt(s.tool,o)){if(!zt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Jt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let g=n.consume(qt(o,a),s.rateLimit);if(!g.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(g.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:Je,ruleId:null,reason:`No rule matched tool "${o}". Falling back to "${Je}".`}}}};var se=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={policies:[],etag:null};return {snapshot(){return {policies:[...o.policies],etag:o.etag}},async sync(){let a=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/policies`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(a.status===304)return this.snapshot();if(!a.ok)throw new Error(`Policy sync failed with status ${a.status}.`);let s=await a.json();return o={policies:protocol.PolicyRule.array().parse(s.policies??[]),etag:a.headers.get("etag")},this.snapshot()}}};var ae=({message:e="Agent action blocked by site policy.",durationMs:t=2400,documentRef:r=typeof document>"u"?void 0:document}={})=>{if(!r?.body)return null;let n=r.createElement("div");return n.setAttribute("role","status"),n.setAttribute("data-agentronics-deny-overlay","true"),n.textContent=e,Object.assign(n.style,{position:"fixed",zIndex:"2147483647",left:"50%",bottom:"24px",transform:"translateX(-50%)",maxWidth:"min(520px, calc(100vw - 32px))",padding:"12px 16px",borderRadius:"8px",background:"#07091A",color:"#F4F4F5",border:"1px solid #6366F1",boxShadow:"0 20px 48px -16px rgba(7,9,26,0.55)",font:"13px/1.45 'Space Mono', ui-monospace, SFMono-Regular, Menlo, monospace"}),r.body.appendChild(n),window.setTimeout(()=>n.remove(),t),n};var ce=({policyEngine:e,getIdentity:t,documentRef:r=typeof document>"u"?void 0:document,selector:n="[data-agentronics-tool]"})=>{if(!r)return {uninstall:()=>{}};let o=a=>{let s=a.target instanceof Element?a.target.closest(n):null;if(!(s instanceof HTMLElement))return;let g=s.dataset.agentronicsTool;g&&Promise.resolve(t()).then(i=>{let y=e.evaluate({tool:g,identity:i});y.decision==="deny"&&(a.preventDefault(),a.stopPropagation(),ae({message:y.reason,documentRef:r}));});};return r.addEventListener("click",o,true),{uninstall:()=>r.removeEventListener("click",o,true)}};var le=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);},remove:t=>{e.delete(t);},keys:()=>[...e.keys()]}},qe=(e,t)=>({read:r=>{try{return e.getItem(t+r)}catch{return null}},write:(r,n)=>{try{e.setItem(t+r,n);}catch{}},remove:r=>{try{e.removeItem(t+r);}catch{}},keys:()=>{let r=[];try{for(let n=0;n<e.length;n++){let o=e.key(n);o&&o.startsWith(t)&&r.push(o.slice(t.length));}}catch{}return r}}),Xe="agtx:",Ye=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?qe(window.sessionStorage,Xe+"session:"):le(),r=e&&typeof window.localStorage<"u"?qe(window.localStorage,Xe+"user:"):le();return {session:t,user:r,org:le()}};var Ze=(e,t)=>e.expiresAt!==null&&e.expiresAt<=t,et=e=>{if(!e)return null;try{let t=JSON.parse(e);return typeof t!="object"||t===null?null:t}catch{return null}},Yt=e=>JSON.stringify(e),ue=(e={})=>{let t=Ye(),r=i=>{e.onTrace?.(i);};return {get:(i,y={})=>{let u=y.scope??"session",d=t[u],p=et(d.read(i));if(!p){r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false}});return}if(Ze(p,Date.now())){d.remove(i),r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:false,expired:true}});return}return r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:u,hit:true}}),p.value},set:(i,y,u={})=>{let d=u.scope??"session",p=u.ttlSeconds??null,h=Date.now(),S={value:y,expiresAt:p===null?null:h+p*1e3,updatedAt:new Date(h).toISOString()};return t[d].write(i,Yt(S)),r({type:"memory.updated",metadata:{operation:"set",key:i,scope:d,ttlSeconds:p}}),protocol.MemoryEntry.parse({key:i,value:y,scope:d,ttlSeconds:p,updatedAt:S.updatedAt})},remove:(i,y={})=>{let u=y.scope??"session";t[u].remove(i),r({type:"memory.updated",metadata:{operation:"remove",key:i,scope:u}});},list:(i={})=>{let y=i.scope??"session",u=t[y],d=Date.now(),p=[];for(let h of u.keys()){let S=et(u.read(h));if(S){if(Ze(S,d)){u.remove(h);continue}p.push(protocol.MemoryEntry.parse({key:h,value:S.value,scope:y,ttlSeconds:S.expiresAt===null?null:Math.max(0,Math.round((S.expiresAt-d)/1e3)),updatedAt:S.updatedAt}));}}return r({type:"memory.accessed",metadata:{operation:"list",scope:y,count:p.length}}),p},clear:(i={})=>{let y=i.scope??"session",u=t[y],d=u.keys().length;for(let p of u.keys())u.remove(p);r({type:"memory.updated",metadata:{operation:"clear",scope:y,count:d}});}}};var pe=e=>protocol.SiteMemory.parse(JSON.parse(JSON.stringify(e))),G=e=>({...e,updatedAt:new Date().toISOString()}),de=(e={})=>{let t=protocol.SiteMemory.parse({...protocol.SITE_MEMORY_DEFAULT,...e.initial??{}}),r=null,n=new Set,o=l=>{e.onTrace?.(l);},a=()=>{r=null;},s=()=>{if(n.size===0)return;let l=pe(t);r=l,n.forEach(v=>v(l));},g=l=>{let v=protocol.SiteMemory.parse({...t,...l,workflows:{...t.workflows,...l.workflows??{}},policies:{...t.policies,...l.policies??{}},uiGuidance:{...t.uiGuidance,...l.uiGuidance??{}},pageContexts:{...t.pageContexts,...l.pageContexts??{}}});return t=G(v),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"provide",keys:Object.keys(l)}}),s(),u()},i=(l,v)=>{let x=l.split(".").filter(Boolean);if(x.length===0)throw new Error("siteMemory.update() requires a non-empty dot-path.");let k=JSON.parse(JSON.stringify(t)),M=k;for(let P=0;P<x.length-1;P++){let b=x[P],R=M[b];(typeof R!="object"||R===null||Array.isArray(R))&&(M[b]={}),M=M[b];}return M[x[x.length-1]]=v,t=G(protocol.SiteMemory.parse(k)),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"update",path:l}}),s(),u()},y=l=>{let v=protocol.SiteMemoryPageContext.parse({path:l.path,payload:l.payload,updatedAt:new Date().toISOString()});return t=G({...t,pageContexts:{...t.pageContexts,[l.path]:v}}),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"provideForPage",path:l.path}}),s(),{...v,payload:{...v.payload}}},u=()=>(r||(r=pe(t)),r);return {provide:g,update:i,provideForPage:y,snapshot:u,get:l=>{if(o({type:"memory.accessed",metadata:{kind:"site",operation:l?"get":"snapshot",path:l??null}}),!l)return pe(t);let v=l.split(".").filter(Boolean),x=t;for(let k of v){if(typeof x!="object"||x===null)return;x=x[k];}return x},getForPage:l=>{o({type:"memory.accessed",metadata:{kind:"site",operation:"getForPage",path:l}});let v=t.pageContexts[l];return v?{...v,payload:{...v.payload}}:null},replace:l=>(t=G(protocol.SiteMemory.parse(l)),a(),s(),u()),subscribe:l=>(n.add(l),()=>{n.delete(l);})}};var me=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>{let o={memory:null,etag:null};return {snapshot(){return {memory:o.memory?protocol.SiteMemory.parse(o.memory):null,etag:o.etag}},async sync(){let a=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/memory`,{headers:{authorization:`Bearer ${r}`,...o.etag?{"if-none-match":o.etag}:{}}});if(a.status===304)return this.snapshot();if(!a.ok)throw new Error(`Memory sync failed with status ${a.status}.`);let s=await a.json();return o={memory:protocol.SiteMemory.parse(s.memory??{}),etag:a.headers.get("etag")},this.snapshot()}}};var rt=({toolName:e="getSiteContext",description:t="Returns Agentronics site memory: page map, workflows, policies, UI guidance.",getSnapshot:r,onAccess:n})=>({name:e,description:t,inputSchema:{type:"object",properties:{path:{type:"string",description:'Optional dot-path into the site memory (e.g. "workflows.purchase").'}},required:[]},invoke(o={}){let a=r(),s=o.path??null;if(n?.(s),!s)return {content:a};let g=s.split(".").filter(Boolean),i=a;for(let y of g){if(typeof i!="object"||i===null)return {content:void 0};i=i[y];}return {content:i}}});var A="agent-context-",ye="agentronics-site-context",er=e=>{try{return JSON.stringify(e)}catch{return "{}"}},_=(e,t,r)=>{let n=e.querySelector(`meta[name="${t}"]`);n||(n=e.createElement("meta"),n.setAttribute("name",t),e.head.appendChild(n)),n.setAttribute("content",r);},B=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(r=>r.remove());},U=({doc:e=typeof document>"u"?null:document,snapshot:t,schemaType:r="WebSite"})=>{if(!e)return {uninstall:()=>{}};_(e,`${A}version`,t.version),_(e,`${A}updated-at`,t.updatedAt??new Date().toISOString()),t.siteMap?.navigation?.flow&&_(e,`${A}flow`,t.siteMap.navigation.flow),_(e,`${A}workflows`,Object.keys(t.workflows).join(","));let n=e.getElementById(ye);return n||(n=e.createElement("script"),n.type="application/ld+json",n.id=ye,e.head.appendChild(n)),n.textContent=er({"@context":"https://schema.org","@type":r,name:"Agentronics Site Memory",agentronics:t}),{uninstall:()=>{B(e,`${A}version`),B(e,`${A}updated-at`),B(e,`${A}flow`),B(e,`${A}workflows`),e.getElementById(ye)?.remove();}}};var nt="agentronics-memory-overlay",tr=e=>`
2
2
  position: fixed;
3
3
  bottom: 16px;
4
4
  right: 16px;
@@ -12,6 +12,6 @@ z-index: 2147483647;
12
12
  opacity: ${e?"0":"1"};
13
13
  pointer-events: ${e?"none":"auto"};
14
14
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.35);
15
- `,rt=e=>{let t=e.siteMap?.pages?.length??0,r=Object.keys(e.workflows).length,n=Object.keys(e.uiGuidance).length;return `Agentronics site memory \xB7 pages:${t} \xB7 workflows:${r} \xB7 ui-hints:${n}`},N=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:r=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let n=e.getElementById(tt);return n||(n=e.createElement("div"),n.id=tt,n.setAttribute("role","note"),n.setAttribute("aria-label","Agentronics site memory summary"),n.setAttribute("data-agent-context","overlay"),e.body.appendChild(n)),n.setAttribute("style",qt(r)),n.textContent=rt(t),{uninstall:()=>{n?.remove();},refresh:o=>{n&&(n.textContent=rt(o));}}};var me="/.well-known/agent-context.json",_=async({origin:e,fetcher:t=fetch,signal:r}={})=>{let n=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+me;if(!n.startsWith("http"))return null;let o={headers:{accept:"application/json"}};r!==void 0&&(o.signal=r);let i=await t(n,o);if(!i.ok){if(i.status===404)return null;throw new Error(`well-known agent-context fetch failed with status ${i.status}.`)}let s=await i.json();return protocol.SiteMemory.parse(s)},ot=({snapshot:e})=>JSON.stringify(protocol.SiteMemory.parse(e));var ye=({evaluate:e,setPolicies:t,listPolicies:r,onTrace:n})=>{let o=new Map,i=new Set,s=a=>{if(!a.authz||!t||!r)return;let l={id:`tool:${a.name}`,tool:a.name,...a.authz,rateLimit:a.rateLimit??a.authz.rateLimit};t([...r().filter(u=>u.id!==l.id),l]);};return {register(a){return o.set(a.name,a),i.delete(a.name),s(a),n?.({type:"tool.registered",tool:a.name,metadata:{version:a.version??null,group:a.group??null,stage:a.stage??null}}),()=>{o.delete(a.name),i.delete(a.name);}},unregister(a){o.delete(a),i.delete(a);},enable(a){!o.has(a)||!i.has(a)||(i.delete(a),n?.({type:"tool.surfaced",tool:a,metadata:{state:"enabled"}}));},disable(a){!o.has(a)||i.has(a)||(i.add(a),n?.({type:"tool.surfaced",tool:a,metadata:{state:"disabled"}}));},isEnabled:a=>o.has(a)&&!i.has(a),list({includeDisabled:a=false}={}){let l=[...o.values()];return a?l:l.filter(u=>!i.has(u.name))},get:a=>o.get(a),async execute(a,l,u=null){let d=o.get(a);if(!d)throw new Error(`Tool "${a}" is not registered.`);if(i.has(a)){let f={decision:"deny",ruleId:`tool:${a}`,reason:"Tool is disabled."};throw n?.({type:"tool.executed",tool:a,agent:u,policy:f,outcome:"blocked"}),new Error(f.reason)}let m=await e(a,{identity:u});if(m.decision==="deny")throw n?.({type:"tool.executed",tool:a,agent:u,policy:m,outcome:"blocked"}),new Error(m.reason);let p=Date.now();try{let f=await d.execute(l,{identity:u});return n?.({type:"tool.executed",tool:a,agent:u,policy:m,outcome:"success",durationMs:Date.now()-p}),f}catch(f){throw n?.({type:"tool.executed",tool:a,agent:u,policy:m,outcome:"error",durationMs:Date.now()-p,error:f instanceof Error?f.message:String(f)}),f}}}};var ge=(e,t={})=>{let r=new Map;for(let s of e.stages)r.set(s.name,s);if(!r.has(e.initial))throw new Error(`Initial stage "${e.initial}" is not declared in progression stages.`);let n=e.initial,o=()=>{let s=r.get(n);return s?.enables?[n,...s.enables]:[n]},i=(s,a)=>{let l=n;if(!r.has(s))throw new Error(`Cannot transition to unknown stage "${s}".`);return s===n?{changed:false,from:l,to:s}:(n=s,t.onTrace?.({type:"tool.progressed",metadata:{from:l,to:s,trigger:a}}),{changed:true,from:l,to:s})};return {current:()=>n,enabledStages:()=>o(),notify(s){let l=r.get(n)?.transitions?.find(u=>u.on===s);return l?i(l.to,s):{changed:false,from:n,to:n}},set(s){return i(s,"manual")},reset(){let s=n;n=e.initial,s!==n&&t.onTrace?.({type:"tool.progressed",metadata:{from:s,to:n,trigger:"reset"}});},snapshot:()=>({current:n,enabled:o()})}};var Xt=(e,t)=>{let r=e.authz?.minTrust;return r?t?protocol.TRUST_RANK[t.trust]<protocol.TRUST_RANK[r]?{ok:false,reason:`trust-too-low:${t.trust}<${r}`}:{ok:true,reason:"trust-ok"}:{ok:false,reason:`requires-trust:${r}`}:{ok:true,reason:"no-trust-floor"}},Yt=(e,t)=>{let r=e.authz?.allowedClasses??[];return r.length===0?{ok:true,reason:"no-class-restriction"}:t?r.includes(t.class)?{ok:true,reason:"class-ok"}:{ok:false,reason:`class-not-allowed:${t.class}`}:{ok:false,reason:`requires-class:${r.join("|")}`}},Qt=(e,t)=>e.stage?t.enabledStages&&t.enabledStages.includes(e.stage)?{ok:true,reason:`stage-enabled:${e.stage}`}:t.stage===e.stage?{ok:true,reason:`stage-active:${e.stage}`}:{ok:false,reason:`stage-locked:${e.stage}`}:{ok:true,reason:"no-stage"},fe=(e,t)=>{let r=Xt(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let n=Yt(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let o=Qt(e,t);return o.ok?e.authz?.decision==="deny"?{tool:e,visible:false,reason:"authz-deny"}:{tool:e,visible:true,reason:"visible"}:{tool:e,visible:false,reason:o.reason}},he=(e,t)=>e.filter(r=>fe(r,t).visible),ve=(e,t)=>e.map(r=>fe(r,t));var xe="default",we=e=>{let t=new Map;for(let r of e){let n=r.group??xe,o=t.get(n)??[];o.push(r),t.set(n,o);}return [...t.entries()].sort(([r],[n])=>r.localeCompare(n)).map(([r,n])=>({name:r,tools:n}))},Zt=e=>[...new Set(e.map(t=>t.group??xe))].sort();var Se=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Se).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Se(e[r])}`).join(",")}}`,st=e=>{let t={name:e.name,version:e.version??null,group:e.group??null,description:e.description??null,inputSchema:e.inputSchema??null,authz:e.authz??null,rateLimit:e.rateLimit??null},r=Se(t).length;return {name:e.name,characters:r,tokens:Math.ceil(r/4)}},Te=e=>{let t=e.map(st);return {total:t.reduce((n,o)=>n+o.tokens,0),perTool:t}};var at=e=>e.provider?e.provider:(e.doc?.defaultView??(typeof globalThis<"u"?globalThis:null))?.navigator?.modelContext??null,er=(e,t)=>{let r={name:e.name,invoke:n=>t(e,n)};return e.description!==void 0&&(r.description=e.description),e.inputSchema!==void 0&&(r.inputSchema=e.inputSchema),r},be=(e={})=>{let t=e.invoke??(async(n,o)=>n.execute(o,{identity:null})),r=null;return {publish(n){let o=at(e);return o?(r?.revoke(),r=o.provideContext({tools:n.map(i=>er(i,t))}),{revoked:true}):{revoked:false}},revoke(){r?.revoke(),r=null;},available:()=>!!at(e)}};var U=(e=500)=>{let t=[];return {add(r){t.push(r),t.length>e&&t.splice(0,t.length-e);},list(){return [...t]},clear(){t.length=0;}}};var ct=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Ae=(e={})=>{let t=ct(e.traceRate,1),r=ct(e.errorRate,1),n=e.random??Math.random;return {shouldKeep(o){let i=o.outcome==="error"?r:t;return n()<i}}};var tr="[REDACTED]",rr=e=>{if(e!==void 0)return JSON.parse(JSON.stringify(e))},ke=(e,t)=>{if(t.length===0||typeof e!="object"||e===null)return;let[r,...n]=t;if(!r)return;if(Array.isArray(e)){for(let i of e)ke(i,t);return}let o=e;if(r in o){if(n.length===0){o[r]=tr;return}ke(o[r],n);}},Me=(e,t=[])=>{if(t.length===0)return e;let r=rr(e);for(let n of t)ke(r,n.split(".").filter(Boolean));return r},Ie=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var or=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,lt=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},H=({siteId:e,bufferSize:t,sessionId:r=lt("ses"),scrubPaths:n=Ie,exporters:o=[],onExporterError:i,pageProvider:s=or,...a})=>{let l=U(t),u=Ae(a),d=()=>{try{return s()}catch{return}};return {sessionId:r,async emit(m){let p={...m.metadata};if(p.page===void 0){let x=d();x!==void 0&&(p.page=x);}let f=protocol.TraceEvent.parse(Me({id:lt("trc"),siteId:e,sessionId:r,occurredAt:new Date().toISOString(),outcome:m.outcome??"success",...m,metadata:p},n));return u.shouldKeep(f)?(l.add(f),await Promise.all(o.map(async x=>{try{await x.export([f]);}catch(y){i?.(y,x,f);}})),f):null},list:()=>l.list(),clear:()=>l.clear()}};var F=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var K=({gatewayUrl:e,publishableKey:t,fetcher:r=fetch})=>({name:"gateway",async export(n){let o={publishableKey:t,events:n};await r(`${e.replace(/\/$/,"")}/v1/traces`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(o)});}});var ir=e=>new Promise(t=>setTimeout(t,e)),z=({url:e,fetcher:t=fetch,maxRetries:r=2,queueLimit:n=500})=>({name:"webhook",async export(o){let s=[...sr(e),...o].slice(-n),a=0;for(;;){let l=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(l.ok){ut(e,[]);return}if(a>=r)throw ut(e,s),new Error(`Webhook exporter failed with status ${l.status}.`);a+=1,await ir(100*a);}}}),Pe=e=>`agtx:webhook:${e}`,sr=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(Pe(e));return t?JSON.parse(t):[]}catch{return []}},ut=(e,t)=>{if(!(typeof window>"u"||!window.localStorage))try{if(t.length===0){window.localStorage.removeItem(Pe(e));return}window.localStorage.setItem(Pe(e),JSON.stringify(t));}catch{}};var dt="https://gateway.agentronics.dev",lr=e=>{if(e===void 0)return dt;if(e===dt)return e;let t;try{t=new URL(e);}catch{throw new Error(`Agentronics SDK: \`gatewayUrl\` is not a valid URL: ${e}`)}if(t.hostname==="localhost"||t.hostname==="127.0.0.1")return e;throw new Error(`Agentronics SDK does not support custom gateway URLs. Omit \`gatewayUrl\` to use the canonical https://gateway.agentronics.dev. The only accepted override is a localhost / 127.0.0.1 URL for local development. Got: ${e}`)},mt=e=>{let{publishableKey:t,siteId:r="default",debug:n=false,policies:o=[],trace:i={}}=e,s=lr(e.gatewayUrl),a=protocol.classifyApiKey(t);if(a==="secret")throw new protocol.AgentronicsError("wrong_key_kind","A secret key was passed to Agentronics.init(). Browser code must use a publishable key (agtx_pk_*).");if(a!=="publishable")throw new protocol.AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${protocol.PUBLISHABLE_KEY_PREFIX}".`);let l=i.enabled??true,u=[...n?[F()]:[],...i.gateway?[K({gatewayUrl:s,publishableKey:t})]:[],...i.webhookUrl?[z({url:i.webhookUrl})]:[],...i.exporters??[]],d={siteId:r,exporters:l?u:[],onExporterError:(c,g)=>{n&&console.warn(`[agentronics] trace exporter "${g.name}" failed`,c);}};i.bufferSize!==void 0&&(d.bufferSize=i.bufferSize),i.traceRate!==void 0&&(d.traceRate=i.traceRate),i.errorRate!==void 0&&(d.errorRate=i.errorRate),i.scrubPaths!==void 0&&(d.scrubPaths=i.scrubPaths);let m=H(d),p=c=>{l&&m.emit(c);},f=Q(),x={onTrace:p};e.auth!==void 0&&(x.context=e.auth);let y=ee(x),h=te(),v=ne(o),A=oe({gatewayUrl:s,siteId:r,publishableKey:t}),k=ce({onTrace:p}),M={onTrace:p};e.siteMemory!==void 0&&(M.initial=e.siteMemory);let T=ue(M),I=pe({gatewayUrl:s,siteId:r,publishableKey:t}),J=async c=>{let g=Date.now(),w=await W(c),S=f.preferOver(w);return l&&await m.emit({type:S?"agent.detected":"agent.missed",agent:S,durationMs:Date.now()-g,metadata:{detectedClass:w?.class??null,presented:f.snapshot()!==null}}),h.set(S,"detect"),S},Re=async(c,g={})=>{let w=Date.now(),S=g.identity!==void 0?g.identity:await J(),q=v.evaluate({tool:c,identity:S});return l&&await m.emit({type:"authz.evaluated",tool:c,agent:S,policy:q,outcome:q.decision==="deny"?"blocked":"success",durationMs:Date.now()-w}),q},P=ye({evaluate:Re,setPolicies:c=>v.set(c),listPolicies:()=>v.list(),onTrace:p});for(let c of e.tools??[])P.register(c);let R=e.progression?ge(e.progression,{onTrace:p}):null,Ee=c=>{let g={identity:c};return R&&(g.stage=R.current(),g.enabledStages=R.enabledStages()),g},O=c=>he(P.list(),Ee(c)),Ce=c=>{if(!R)return;R.notify(c).changed&&V.publish(O(null));},V=be({invoke:async(c,g)=>{let w=await P.execute(c.name,g,null);return Ce(c.name),w}});return Object.freeze({publishableKey:t,siteId:r,gatewayUrl:s,debug:n,memory:k,siteMemory:T,memoryCache:I,tracer:m,auth:y,agentContext:h,authz:v,policyCache:A,tools:P,progression:R,webmcp:V,detect:J,authenticate:async c=>{let g=await y.authenticate(c);return h.set(g,"authenticate"),g},presentIdentity:c=>{let g=f.present(c);return p({type:"auth.identity_presented",agent:g.identity,metadata:{vendor:g.identity.vendor,class:g.identity.class}}),h.set(g.identity,"declare"),g},clearIdentity:()=>{f.clear(),p({type:"auth.identity_cleared"}),h.set(null,"cleared");},presentedIdentity:()=>f.snapshot(),setPolicies:c=>{v.set(c),p({type:"authz.policies_set",metadata:{count:c.length}});},listPolicies:()=>v.list(),syncPolicies:async()=>{let c=await A.sync();return v.set(c.policies),p({type:"authz.policies_set",metadata:{count:c.policies.length,synced:true}}),c.policies},syncSiteMemory:async()=>{let c=await I.sync();return c.memory&&(T.replace(c.memory),p({type:"memory.updated",metadata:{kind:"site",operation:"sync",etag:c.etag}})),c.memory},provideSiteMemory:c=>T.provide(c),provideForPage:c=>{T.provideForPage(c);},installMemoryDelivery:({metaTags:c=true,overlay:g=false}={})=>{let w=[];return c&&w.push(B({snapshot:T.snapshot()})),g&&w.push(N({snapshot:T.snapshot()})),{uninstall:()=>{w.forEach(S=>S.uninstall());}}},fetchWellKnown:async c=>{let g={};c!==void 0&&(g.origin=c);let w=await _(g);return w&&(T.replace(w),p({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),w},installDomEnforcer:()=>se({policyEngine:v,getIdentity:()=>J({webmcp:{pollMs:0}})}),registerTool:c=>P.register(c),surfaceTools:({identity:c=null}={})=>O(c),explainSurfacing:({identity:c=null}={})=>ve(P.list(),Ee(c)),groupedTools:({identity:c=null}={})=>we(O(c)),estimateTokens:({identity:c=null}={})=>Te(O(c)),publishToWebMcp:({identity:c=null}={})=>{let g=O(c),w=V.publish(g);return g.forEach(S=>{p({type:"tool.surfaced",tool:S.name,metadata:{state:"published",trust:c?.trust??null,group:S.group??null}});}),{revoked:w.revoked,surfaced:g.length}},notifyToolInvoked:c=>Ce(c),evaluate:Re,traces:()=>m.list(),clearTraces:()=>m.clear(),async ping(){try{let c=await fetch(`${s.replace(/\/$/,"")}/v1/health`,{method:"GET",headers:{authorization:`Bearer ${t}`}});if(!c.ok)return {ok:!1,status:c.status,error:`gateway returned ${c.status}`};let g=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:g}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};var Ko={init:mt,declareAgent:Y,detectAgent:W},zo="0.1.0";
16
- exports.Agentronics=Ko;exports.DEFAULT_GROUP=xe;exports.VERSION=zo;exports.WELL_KNOWN_PATH=me;exports.bundledDetectors=X;exports.createAgentContextStore=te;exports.createAuthEngine=ee;exports.createConsoleExporter=F;exports.createDetectorRegistry=L;exports.createGatewayExporter=K;exports.createIdentityStore=Q;exports.createMemoryCache=pe;exports.createMemoryStore=ce;exports.createPolicyCache=oe;exports.createPolicyEngine=ne;exports.createProgressionStore=ge;exports.createRateLimiter=re;exports.createSignatureLoader=Oe;exports.createSiteMemoryStore=ue;exports.createToolRegistry=ye;exports.createTraceBuffer=U;exports.createTracer=H;exports.createWebMcpAdapter=be;exports.createWebMcpContextTool=et;exports.createWebhookExporter=z;exports.decideSurfacing=fe;exports.declareAgent=Y;exports.deriveTrustLevel=Rt;exports.detectAgent=W;exports.detectDom=C;exports.detectWebMcp=E;exports.estimateBudget=Te;exports.estimateToolTokens=st;exports.explainSurfacing=ve;exports.fetchWellKnownContext=_;exports.groupTools=we;exports.highestTrust=Z;exports.init=mt;exports.installDomEnforcer=se;exports.installMemoryOverlay=N;exports.installMetaTags=B;exports.listGroupNames=Zt;exports.serializeWellKnownContext=ot;exports.showDenyOverlay=ie;exports.surfaceTools=he;//# sourceMappingURL=index.cjs.map
15
+ `,ot=e=>{let t=e.siteMap?.pages?.length??0,r=Object.keys(e.workflows).length,n=Object.keys(e.uiGuidance).length;return `Agentronics site memory \xB7 pages:${t} \xB7 workflows:${r} \xB7 ui-hints:${n}`},K=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:r=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let n=e.getElementById(nt);return n||(n=e.createElement("div"),n.id=nt,n.setAttribute("role","note"),n.setAttribute("aria-label","Agentronics site memory summary"),n.setAttribute("data-agent-context","overlay"),e.body.appendChild(n)),n.setAttribute("style",tr(r)),n.textContent=ot(t),{uninstall:()=>{n?.remove();},refresh:o=>{n&&(n.textContent=ot(o));}}};var ge="/.well-known/agent-context.json",H=async({origin:e,fetcher:t=fetch,signal:r}={})=>{let n=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+ge;if(!n.startsWith("http"))return null;let o={headers:{accept:"application/json"}};r!==void 0&&(o.signal=r);let a=await t(n,o);if(!a.ok){if(a.status===404)return null;throw new Error(`well-known agent-context fetch failed with status ${a.status}.`)}let s=await a.json();return protocol.SiteMemory.parse(s)},st=({snapshot:e})=>JSON.stringify(protocol.SiteMemory.parse(e));var fe=({evaluate:e,setPolicies:t,listPolicies:r,onTrace:n,identityResolver:o})=>{let a=new Map,s=new Set,g=i=>{if(!i.authz||!t||!r)return;let y={id:`tool:${i.name}`,tool:i.name,...i.authz,rateLimit:i.rateLimit??i.authz.rateLimit};t([...r().filter(u=>u.id!==y.id),y]);};return {register(i){return a.set(i.name,i),s.delete(i.name),g(i),n?.({type:"tool.registered",tool:i.name,metadata:{version:i.version??null,group:i.group??null,stage:i.stage??null}}),()=>{a.delete(i.name),s.delete(i.name);}},unregister(i){a.delete(i),s.delete(i);},enable(i){!a.has(i)||!s.has(i)||(s.delete(i),n?.({type:"tool.surfaced",tool:i,metadata:{state:"enabled"}}));},disable(i){!a.has(i)||s.has(i)||(s.add(i),n?.({type:"tool.surfaced",tool:i,metadata:{state:"disabled"}}));},isEnabled:i=>a.has(i)&&!s.has(i),list({includeDisabled:i=false}={}){let y=[...a.values()];return i?y:y.filter(u=>!s.has(u.name))},get:i=>a.get(i),async execute(i,y,u){let d=u===void 0?o?.()??null:u,p=a.get(i);if(!p)throw new Error(`Tool "${i}" is not registered.`);if(s.has(i)){let l={decision:"deny",ruleId:`tool:${i}`,reason:"Tool is disabled."};throw n?.({type:"tool.executed",tool:i,agent:d,policy:l,outcome:"blocked"}),new Error(l.reason)}let h=await e(i,{identity:d});if(h.decision==="deny")throw n?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"blocked"}),new Error(h.reason);let S=Date.now();try{let l=await p.execute(y,{identity:d});return n?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"success",durationMs:Date.now()-S}),l}catch(l){throw n?.({type:"tool.executed",tool:i,agent:d,policy:h,outcome:"error",durationMs:Date.now()-S,error:l instanceof Error?l.message:String(l)}),l}}}};var rr=e=>{let t={name:e.name,description:e.description??"",inputSchema:e.inputSchema??{},tokens:0};return e.group&&(t.group=e.group),e.stage&&(t.page=e.stage),e.outputSchema&&(t.outputSchema=e.outputSchema),t.tokens=Math.ceil(JSON.stringify({name:t.name,description:t.description,inputSchema:t.inputSchema,...t.outputSchema?{outputSchema:t.outputSchema}:{}}).length/4),t},at=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>({async push(o){let a=o.map(rr),s=await n(`${e.replace(/\/$/,"")}/v1/sites/${encodeURIComponent(t)}/tools`,{method:"PUT",headers:{authorization:`Bearer ${r}`,"content-type":"application/json"},body:JSON.stringify({registry:{tools:a}})});if(!s.ok)throw new Error(`Tool sync failed with status ${s.status}.`);return a.length}});var he=(e,t={})=>{let r=new Map;for(let s of e.stages)r.set(s.name,s);if(!r.has(e.initial))throw new Error(`Initial stage "${e.initial}" is not declared in progression stages.`);let n=e.initial,o=()=>{let s=r.get(n);return s?.enables?[n,...s.enables]:[n]},a=(s,g)=>{let i=n;if(!r.has(s))throw new Error(`Cannot transition to unknown stage "${s}".`);return s===n?{changed:false,from:i,to:s}:(n=s,t.onTrace?.({type:"tool.progressed",metadata:{from:i,to:s,trigger:g}}),{changed:true,from:i,to:s})};return {current:()=>n,enabledStages:()=>o(),notify(s){let i=r.get(n)?.transitions?.find(y=>y.on===s);return i?a(i.to,s):{changed:false,from:n,to:n}},set(s){return a(s,"manual")},reset(){let s=n;n=e.initial,s!==n&&t.onTrace?.({type:"tool.progressed",metadata:{from:s,to:n,trigger:"reset"}});},snapshot:()=>({current:n,enabled:o()})}};var nr=(e,t)=>{let r=e.authz?.minTrust;return r?t?protocol.TRUST_RANK[t.trust]<protocol.TRUST_RANK[r]?{ok:false,reason:`trust-too-low:${t.trust}<${r}`}:{ok:true,reason:"trust-ok"}:{ok:false,reason:`requires-trust:${r}`}:{ok:true,reason:"no-trust-floor"}},or=(e,t)=>{let r=e.authz?.allowedClasses??[];return r.length===0?{ok:true,reason:"no-class-restriction"}:t?r.includes(t.class)?{ok:true,reason:"class-ok"}:{ok:false,reason:`class-not-allowed:${t.class}`}:{ok:false,reason:`requires-class:${r.join("|")}`}},ir=(e,t)=>e.stage?t.enabledStages&&t.enabledStages.includes(e.stage)?{ok:true,reason:`stage-enabled:${e.stage}`}:t.stage===e.stage?{ok:true,reason:`stage-active:${e.stage}`}:{ok:false,reason:`stage-locked:${e.stage}`}:{ok:true,reason:"no-stage"},ve=(e,t)=>{let r=nr(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let n=or(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let o=ir(e,t);return o.ok?e.authz?.decision==="deny"?{tool:e,visible:false,reason:"authz-deny"}:{tool:e,visible:true,reason:"visible"}:{tool:e,visible:false,reason:o.reason}},Se=(e,t)=>e.filter(r=>ve(r,t).visible),xe=(e,t)=>e.map(r=>ve(r,t));var we="default",Te=e=>{let t=new Map;for(let r of e){let n=r.group??we,o=t.get(n)??[];o.push(r),t.set(n,o);}return [...t.entries()].sort(([r],[n])=>r.localeCompare(n)).map(([r,n])=>({name:r,tools:n}))},sr=e=>[...new Set(e.map(t=>t.group??we))].sort();var be=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(be).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${be(e[r])}`).join(",")}}`,lt=e=>{let t={name:e.name,version:e.version??null,group:e.group??null,description:e.description??null,inputSchema:e.inputSchema??null,authz:e.authz??null,rateLimit:e.rateLimit??null},r=be(t).length;return {name:e.name,characters:r,tokens:Math.ceil(r/4)}},Ae=e=>{let t=e.map(lt);return {total:t.reduce((n,o)=>n+o.tokens,0),perTool:t}};var ut=e=>{if(e.provider)return e.provider;let r=(e.doc?.defaultView??(typeof globalThis<"u"?globalThis:null))?.navigator?.modelContext;return !r||typeof r.provideContext!="function"?null:r},ar=(e,t)=>{let r={name:e.name,invoke:n=>t(e,n)};return e.description!==void 0&&(r.description=e.description),e.inputSchema!==void 0&&(r.inputSchema=e.inputSchema),r},ke=(e={})=>{let t=e.invoke??(async(n,o)=>n.execute(o,{identity:null})),r=null;return {publish(n){let o=ut(e);return o?(r?.revoke(),r=o.provideContext({tools:n.map(a=>ar(a,t))}),{revoked:true}):{revoked:false}},revoke(){r?.revoke(),r=null;},available:()=>!!ut(e)}};var F=(e=500)=>{let t=[];return {add(r){t.push(r),t.length>e&&t.splice(0,t.length-e);},list(){return [...t]},clear(){t.length=0;}}};var pt=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Me=(e={})=>{let t=pt(e.traceRate,1),r=pt(e.errorRate,1),n=e.random??Math.random;return {shouldKeep(o){let a=o.outcome==="error"?r:t;return n()<a}}};var cr="[REDACTED]",lr=e=>{if(e!==void 0)return JSON.parse(JSON.stringify(e))},Ie=(e,t)=>{if(t.length===0||typeof e!="object"||e===null)return;let[r,...n]=t;if(!r)return;if(Array.isArray(e)){for(let a of e)Ie(a,t);return}let o=e;if(r in o){if(n.length===0){o[r]=cr;return}Ie(o[r],n);}},Pe=(e,t=[])=>{if(t.length===0)return e;let r=lr(e);for(let n of t)Ie(r,n.split(".").filter(Boolean));return r},Re=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var pr=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,dt=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},V=({siteId:e,bufferSize:t,sessionId:r=dt("ses"),scrubPaths:n=Re,exporters:o=[],onExporterError:a,pageProvider:s=pr,...g})=>{let i=F(t),y=Me(g),u=()=>{try{return s()}catch{return}};return {sessionId:r,async emit(d){let p={...d.metadata};if(p.page===void 0){let S=u();S!==void 0&&(p.page=S);}let h=protocol.TraceEvent.parse(Pe({id:dt("trc"),siteId:e,sessionId:r,occurredAt:new Date().toISOString(),outcome:d.outcome??"success",...d,metadata:p},n));return y.shouldKeep(h)?(i.add(h),await Promise.all(o.map(async S=>{try{await S.export([h]);}catch(l){a?.(l,S,h);}})),h):null},list:()=>i.list(),clear:()=>i.clear()}};var z=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var J=({gatewayUrl:e,publishableKey:t,fetcher:r=fetch})=>({name:"gateway",async export(n){let o={publishableKey:t,events:n};await r(`${e.replace(/\/$/,"")}/v1/traces`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(o)});}});var dr=e=>new Promise(t=>setTimeout(t,e)),q=({url:e,fetcher:t=fetch,maxRetries:r=2,queueLimit:n=500})=>({name:"webhook",async export(o){let s=[...mr(e),...o].slice(-n),g=0;for(;;){let i=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(i.ok){mt(e,[]);return}if(g>=r)throw mt(e,s),new Error(`Webhook exporter failed with status ${i.status}.`);g+=1,await dr(100*g);}}}),Ee=e=>`agtx:webhook:${e}`,mr=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(Ee(e));return t?JSON.parse(t):[]}catch{return []}},mt=(e,t)=>{if(!(typeof window>"u"||!window.localStorage))try{if(t.length===0){window.localStorage.removeItem(Ee(e));return}window.localStorage.setItem(Ee(e),JSON.stringify(t));}catch{}};var gt="https://gateway.agentronics.dev",fr=e=>{if(e===void 0)return gt;if(e===gt)return e;let t;try{t=new URL(e);}catch{throw new Error(`Agentronics SDK: \`gatewayUrl\` is not a valid URL: ${e}`)}if(t.hostname==="localhost"||t.hostname==="127.0.0.1")return e;throw new Error(`Agentronics SDK does not support custom gateway URLs. Omit \`gatewayUrl\` to use the canonical https://gateway.agentronics.dev. The only accepted override is a localhost / 127.0.0.1 URL for local development. Got: ${e}`)},ft=e=>{let{publishableKey:t,siteId:r="default",debug:n=false,policies:o=[],trace:a={}}=e,s=fr(e.gatewayUrl),g=protocol.classifyApiKey(t);if(g==="secret")throw new protocol.AgentronicsError("wrong_key_kind","A secret key was passed to Agentronics.init(). Browser code must use a publishable key (agtx_pk_*).");if(g!=="publishable")throw new protocol.AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${protocol.PUBLISHABLE_KEY_PREFIX}".`);let i=a.enabled??true,y=[...n?[z()]:[],...a.gateway?[J({gatewayUrl:s,publishableKey:t})]:[],...a.webhookUrl?[q({url:a.webhookUrl})]:[],...a.exporters??[]],u={siteId:r,exporters:i?y:[],onExporterError:(c,m)=>{n&&console.warn(`[agentronics] trace exporter "${m.name}" failed`,c);}};a.bufferSize!==void 0&&(u.bufferSize=a.bufferSize),a.traceRate!==void 0&&(u.traceRate=a.traceRate),a.errorRate!==void 0&&(u.errorRate=a.errorRate),a.scrubPaths!==void 0&&(u.scrubPaths=a.scrubPaths);let d=V(u),p=c=>{i&&d.emit(c);},h=ee(),S={onTrace:p};e.auth!==void 0&&(S.context=e.auth);let l=re(S),v=ne(),x=ie(o),k=se({gatewayUrl:s,siteId:r,publishableKey:t}),M=ue({onTrace:p}),P={onTrace:p};e.siteMemory!==void 0&&(P.initial=e.siteMemory);let b=de(P),R=me({gatewayUrl:s,siteId:r,publishableKey:t}),ht=at({gatewayUrl:s,siteId:r,publishableKey:t}),$=async c=>{let m=Date.now(),w=await N(c),T=h.preferOver(w);return i&&await d.emit({type:T?"agent.detected":"agent.missed",agent:T,durationMs:Date.now()-m,metadata:{detectedClass:w?.class??null,presented:h.snapshot()!==null}}),v.set(T,"detect"),T},Oe=async(c,m={})=>{let w=Date.now(),T=m.identity!==void 0?m.identity:await $(),Y=x.evaluate({tool:c,identity:T});return i&&await d.emit({type:"authz.evaluated",tool:c,agent:T,policy:Y,outcome:Y.decision==="deny"?"blocked":"success",durationMs:Date.now()-w}),Y},I=fe({evaluate:Oe,setPolicies:c=>x.set(c),listPolicies:()=>x.list(),onTrace:p,identityResolver:()=>v.snapshot().identity});for(let c of e.tools??[])I.register(c);let E=e.progression?he(e.progression,{onTrace:p}):null,De=c=>{let m={identity:c};return E&&(m.stage=E.current(),m.enabledStages=E.enabledStages()),m},O=c=>Se(I.list(),De(c)),Ce=c=>{if(!E)return;E.notify(c).changed&&L.publish(O(v.snapshot().identity));},vt={class:"webmcp",trust:"detected",confidence:1,vendor:null,userAgent:typeof navigator<"u"?navigator.userAgent:null,detectionVersion:f,signals:{source:"navigator.modelContext"}},L=ke({invoke:async(c,m)=>{let w=v.snapshot().identity??vt,T=await I.execute(c.name,m,w);return Ce(c.name),T}});v.subscribe(c=>{L.available()&&L.publish(O(c.identity));});let X=e.autoDetect??true,St=X===false?Promise.resolve(null):(async()=>{let c=X===true?{}:X;try{return await $(c)}catch(m){return n&&console.warn("[agentronics] autoDetect failed:",m),null}})();return Object.freeze({publishableKey:t,siteId:r,gatewayUrl:s,debug:n,memory:M,siteMemory:b,memoryCache:R,tracer:d,auth:l,agentContext:v,authz:x,policyCache:k,tools:I,progression:E,webmcp:L,ready:St,detect:$,authenticate:async c=>{let m=await l.authenticate(c);return v.set(m,"authenticate"),m},presentIdentity:c=>{let m=h.present(c);return p({type:"auth.identity_presented",agent:m.identity,metadata:{vendor:m.identity.vendor,class:m.identity.class}}),v.set(m.identity,"declare"),m},clearIdentity:()=>{h.clear(),p({type:"auth.identity_cleared"}),v.set(null,"cleared");},presentedIdentity:()=>h.snapshot(),setPolicies:c=>{x.set(c),p({type:"authz.policies_set",metadata:{count:c.length}});},listPolicies:()=>x.list(),syncPolicies:async()=>{let c=await k.sync();return x.set(c.policies),p({type:"authz.policies_set",metadata:{count:c.policies.length,synced:true}}),c.policies},syncSiteMemory:async()=>{let c=await R.sync();return c.memory&&(b.replace(c.memory),p({type:"memory.updated",metadata:{kind:"site",operation:"sync",etag:c.etag}})),c.memory},provideSiteMemory:c=>b.provide(c),provideForPage:c=>{b.provideForPage(c);},installMemoryDelivery:({metaTags:c=true,overlay:m=false}={})=>{let w=[];return c&&w.push(U({snapshot:b.snapshot()})),m&&w.push(K({snapshot:b.snapshot()})),{uninstall:()=>{w.forEach(T=>T.uninstall());}}},fetchWellKnown:async c=>{let m={};c!==void 0&&(m.origin=c);let w=await H(m);return w&&(b.replace(w),p({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),w},installDomEnforcer:()=>ce({policyEngine:x,getIdentity:()=>$({webmcp:{pollMs:0}})}),registerTool:c=>I.register(c),syncTools:async()=>{let c=I.list({includeDisabled:true}),m=await ht.push(c);return p({type:"tool.registered",metadata:{operation:"sync",count:m}}),m},surfaceTools:({identity:c=null}={})=>O(c),explainSurfacing:({identity:c=null}={})=>xe(I.list(),De(c)),groupedTools:({identity:c=null}={})=>Te(O(c)),estimateTokens:({identity:c=null}={})=>Ae(O(c)),publishToWebMcp:({identity:c=null}={})=>{let m=O(c),w=L.publish(m);return m.forEach(T=>{p({type:"tool.surfaced",tool:T.name,metadata:{state:"published",trust:c?.trust??null,group:T.group??null}});}),{revoked:w.revoked,surfaced:m.length}},notifyToolInvoked:c=>Ce(c),evaluate:Oe,traces:()=>d.list(),clearTraces:()=>d.clear(),async ping(){try{let c=await fetch(`${s.replace(/\/$/,"")}/v1/health`,{method:"GET",headers:{authorization:`Bearer ${t}`}});if(!c.ok)return {ok:!1,status:c.status,error:`gateway returned ${c.status}`};let m=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:m}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};var gi={init:ft,declareAgent:Z,detectAgent:N},fi="0.1.0";
16
+ exports.Agentronics=gi;exports.DEFAULT_GROUP=we;exports.VERSION=fi;exports.WELL_KNOWN_PATH=ge;exports.bundledDetectors=Q;exports.createAgentContextStore=ne;exports.createAuthEngine=re;exports.createConsoleExporter=z;exports.createDetectorRegistry=j;exports.createGatewayExporter=J;exports.createIdentityStore=ee;exports.createMemoryCache=me;exports.createMemoryStore=ue;exports.createPolicyCache=se;exports.createPolicyEngine=ie;exports.createProgressionStore=he;exports.createRateLimiter=oe;exports.createSignatureLoader=Le;exports.createSiteMemoryStore=de;exports.createToolRegistry=fe;exports.createTraceBuffer=F;exports.createTracer=V;exports.createWebMcpAdapter=ke;exports.createWebMcpContextTool=rt;exports.createWebhookExporter=q;exports.decideSurfacing=ve;exports.declareAgent=Z;exports.deriveTrustLevel=Wt;exports.detectAgent=N;exports.detectDom=C;exports.detectWebMcp=D;exports.estimateBudget=Ae;exports.estimateToolTokens=lt;exports.explainSurfacing=xe;exports.fetchWellKnownContext=H;exports.groupTools=Te;exports.highestTrust=te;exports.init=ft;exports.installDomEnforcer=ce;exports.installMemoryOverlay=K;exports.installMetaTags=U;exports.listGroupNames=sr;exports.serializeWellKnownContext=st;exports.showDenyOverlay=ae;exports.surfaceTools=Se;//# sourceMappingURL=index.cjs.map
17
17
  //# sourceMappingURL=index.cjs.map