@agentronics/sdk 0.2.0 → 0.4.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.
- package/dist/chunk-YNRQTQM4.js +17 -0
- package/dist/chunk-YNRQTQM4.js.map +1 -0
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -4
- package/dist/index.d.ts +27 -4
- package/dist/index.global.js +3 -3
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{init-only-4Tr5Ju9g.d.ts → init-only-7f8_LQAI.d.ts} +41 -3
- package/dist/{init-only-Czh_F-Dk.d.cts → init-only-Cwll8MGz.d.cts} +41 -3
- package/dist/init-only.cjs +3 -3
- package/dist/init-only.cjs.map +1 -1
- package/dist/init-only.d.cts +1 -1
- package/dist/init-only.d.ts +1 -1
- package/dist/init-only.global.js +3 -3
- package/dist/init-only.global.js.map +1 -1
- package/dist/init-only.js +1 -1
- package/package.json +4 -4
- package/dist/chunk-7CJGV4LL.js +0 -17
- package/dist/chunk-7CJGV4LL.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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=>`
|
|
1
|
+
'use strict';var protocol=require('@agentronics/protocol');var f="0.1.2";var At=()=>{if(typeof navigator>"u")return null;let e=navigator.modelContext;return e&&typeof e=="object"?e:null},O=async(e={})=>{let{pollMs:t=500}=e,r=Date.now();for(;;){let n=At();if(n)return kt(n);if(Date.now()-r>=t)return null;await new Promise(o=>setTimeout(o,50));}},kt=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 Z=[{name:"GPTBot",category:"ai",pattern:/GPTBot/i},{name:"OAI-SearchBot",category:"ai",pattern:/OAI-SearchBot/i},{name:"ChatGPT-User",category:"ai",pattern:/ChatGPT-User/i},{name:"ClaudeBot",category:"ai",pattern:/ClaudeBot/i},{name:"Claude-Web",category:"ai",pattern:/Claude-Web/i},{name:"anthropic-ai",category:"ai",pattern:/anthropic-ai/i},{name:"PerplexityBot",category:"ai",pattern:/PerplexityBot/i},{name:"Google-Extended",category:"ai",pattern:/Google-Extended/i},{name:"Applebot-Extended",category:"ai",pattern:/Applebot-Extended/i},{name:"Amazonbot",category:"ai",pattern:/Amazonbot/i},{name:"Bytespider",category:"ai",pattern:/Bytespider/i},{name:"CCBot",category:"ai",pattern:/CCBot/i},{name:"Meta-ExternalAgent",category:"ai",pattern:/Meta-ExternalAgent/i},{name:"cohere-ai",category:"ai",pattern:/cohere-ai/i},{name:"Googlebot",category:"search",pattern:/Googlebot/i},{name:"Bingbot",category:"search",pattern:/bingbot/i},{name:"DuckDuckBot",category:"search",pattern:/DuckDuckBot/i},{name:"YandexBot",category:"search",pattern:/YandexBot/i},{name:"Baiduspider",category:"search",pattern:/Baiduspider/i},{name:"Applebot",category:"search",pattern:/Applebot/i}],D=(e={})=>{let{signatures:t=Z,disable:r=false,confidence:n=.9}=e;if(r||typeof navigator>"u")return null;let o=navigator.userAgent??"";if(!o)return null;for(let a of t)if(a.pattern.test(o))return {class:"crawler",trust:"detected",confidence:n,vendor:a.name,userAgent:o,detectionVersion:f,signals:{matched:a.name,category:a.category,ua:o}};return null};var Mt=[/HeadlessChrome/i,/Headless/i,/PhantomJS/i,/SlimerJS/i],It=()=>({hit:(typeof navigator<"u"&&navigator.webdriver)===true,weight:.6,detail:"navigator.webdriver === true"}),Et=()=>{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_*"}`}},Pt=()=>{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"}},Rt=()=>{if(typeof navigator>"u")return {hit:false,weight:.7};let e=navigator.userAgent??"",t=Mt.some(r=>r.test(e));return t?{hit:t,weight:.7,detail:`headless UA: ${e}`}:{hit:t,weight:.7}},Ct=()=>{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"}},Ot=()=>{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"}},Dt={webdriver:It,chromedriver:Et,headlessUa:Rt,languages:Ct,permissions:Ot,plugins:Pt},L=(e={})=>{let{threshold:t=.4}=e,r={},n=0,o=0;for(let[s,d]of Object.entries(Dt)){let i=d();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 ee=()=>[{id:"webmcp.model-context",status:"stable",detect:()=>O({pollMs:0})},{id:"crawler.user-agent",status:"beta",detect:()=>D()},{id:"dom.automation-heuristics",status:"beta",detect:()=>L()}],B=(e=ee())=>{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 te=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 $e=({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 G=async(e={})=>{if(e.customDetectors?.length){let t=await B(e.customDetectors).detectAll(!!e.experimental);if(t)return t}if(e.webmcp!==false){let t=await O(e.webmcp??{});if(t)return t}if(e.crawler!==false){let t=D(e.crawler??{});if(t)return t}if(e.dom!==false){let t=L(e.dom??{});if(t)return t}return null};var Bt=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}}),re=()=>{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:Bt(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 Gt=({detected:e,declared:t,verified:r,linked:n})=>n?"linked":r?"verified":t?"declared":"detected",ne=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 Be=()=>({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 Ge=()=>({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 _e=()=>({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 Ue=()=>({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 _t=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}}),Ke=()=>({name:"selfDeclaration",async authenticate(e){return e.declaration?_t(protocol.IdentityClaim.parse(e.declaration)):null}});var He=()=>({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 Ve=()=>({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 Fe=()=>({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 ze=()=>({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 Kt=()=>[Ge(),Ke(),Be(),ze(),Ne(),He(),Ue(),Ve(),Fe(),_e()],Ht={detection:"detection",selfDeclaration:"declaration",bearer:"bearer",xAgentHeader:"x-agent-header",extensionToken:"extension",sessionLink:"session-link",oauth2:"oauth2",sso:"sso",spiffe:"spiffe",mtls:"mtls"},Vt=(e,t)=>e==="spiffe"&&t.signals?.googleAgent===true?"google-agent":Ht[e],oe=({methods:e=Kt(),context:t={},onTrace:r}={})=>({async authenticate(n){let o=[],a={};for(let m of e){let u=await m.authenticate(n,t);a[m.name]=!!u,u&&o.push({method:m.name,identity:u});}let s=ne(o.map(m=>m.identity)),d=s?o.find(m=>m.identity===s):void 0,i=d?Vt(d.method,d.identity):void 0,g=typeof s?.signals?.subject=="string"?s.signals.subject:void 0,p={type:s?"auth.identity_presented":"sdk.error",agent:s,outcome:s?"success":"error",metadata:{methods:a,...i?{protocol:i}:{},...g?{subject:g}:{}}};return s||(p.error="No auth method produced an identity."),r?.(p),s},methods(){return e.map(n=>n.name)}});var Ft={identity:null,source:"initial",updatedAt:null},ie=()=>{let e=Ft,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 zt=()=>{let e=new Map;return {read:t=>e.get(t)??null,write:(t,r)=>{e.set(t,r);}}},Jt=()=>typeof window>"u"||!window.localStorage?zt():{read:e=>{try{return window.localStorage.getItem(e)}catch{return null}},write:(e,t)=>{try{window.localStorage.setItem(e,t);}catch{}}},qt=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},se=(e=Jt())=>({consume(t,r,n=Date.now()){let o=`agtx:rate:${t}`,a=qt(e.read(o)),s=a&&a.resetAt>n?a.resetAt:n+r.windowSeconds*1e3,d=a&&a.resetAt>n?a.count+1:1;return e.write(o,JSON.stringify({count:d,resetAt:s})),{allowed:d<=r.max,remaining:Math.max(0,r.max-d),resetAt:s}}});var Xt=(e,t)=>e==="*"||e===t?true:e.includes("*")?new RegExp("^"+e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*")+"$").test(t):false,Yt=(e,t)=>{let r=e?protocol.TRUST_RANK[e.trust]:-1,n=protocol.TRUST_RANK[t.minTrust];return r>=n},Qt=(e,t)=>t.allowedClasses.length===0?true:e?t.allowedClasses.includes(e.class):false,Xe="review",Zt=(e,t)=>{let r=t?.class??"unknown",n=t?.vendor??"unknown",o=t?.trust??"none";return `${e}:${r}:${n}:${o}`},ae=(e=[],t={})=>{let r=e.map(o=>protocol.PolicyRule.parse(o)),n=t.rateLimiter??se();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(Xt(s.tool,o)){if(!Yt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" requires trust >= ${s.minTrust}.`};if(!Qt(a,s))return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" restricts to classes: ${s.allowedClasses.join(", ")}.`};if(s.rateLimit){let d=n.consume(Zt(o,a),s.rateLimit);if(!d.allowed)return {decision:"deny",ruleId:s.id,reason:`Rule "${s.id}" rate limit exceeded. Resets at ${new Date(d.resetAt).toISOString()}.`}}return {decision:s.decision,ruleId:s.id,reason:`Matched rule "${s.id}".`}}return {decision:Xe,ruleId:null,reason:`No rule matched tool "${o}". Falling back to "${Xe}".`}}}};var ce=({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 le=({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 pe=({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 d=s.dataset.agentronicsTool;d&&Promise.resolve(t()).then(i=>{let g=e.evaluate({tool:d,identity:i});g.decision==="deny"&&(a.preventDefault(),a.stopPropagation(),le({message:g.reason,documentRef:r}));});};return r.addEventListener("click",o,true),{uninstall:()=>r.removeEventListener("click",o,true)}};var ue=()=>{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()]}},Ye=(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}}),Qe="agtx:",Ze=()=>{let e=typeof window<"u",t=e&&typeof window.sessionStorage<"u"?Ye(window.sessionStorage,Qe+"session:"):ue(),r=e&&typeof window.localStorage<"u"?Ye(window.localStorage,Qe+"user:"):ue();return {session:t,user:r,org:ue()}};var tt=(e,t)=>e.expiresAt!==null&&e.expiresAt<=t,rt=e=>{if(!e)return null;try{let t=JSON.parse(e);return typeof t!="object"||t===null?null:t}catch{return null}},tr=e=>JSON.stringify(e),de=(e={})=>{let t=Ze(),r=i=>{e.onTrace?.(i);};return {get:(i,g={})=>{let p=g.scope??"session",m=t[p],u=rt(m.read(i));if(!u){r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:p,hit:false}});return}if(tt(u,Date.now())){m.remove(i),r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:p,hit:false,expired:true}});return}return r({type:"memory.accessed",metadata:{operation:"get",key:i,scope:p,hit:true}}),u.value},set:(i,g,p={})=>{let m=p.scope??"session",u=p.ttlSeconds??null,h=Date.now(),x={value:g,expiresAt:u===null?null:h+u*1e3,updatedAt:new Date(h).toISOString()};return t[m].write(i,tr(x)),r({type:"memory.updated",metadata:{operation:"set",key:i,scope:m,ttlSeconds:u}}),protocol.MemoryEntry.parse({key:i,value:g,scope:m,ttlSeconds:u,updatedAt:x.updatedAt})},remove:(i,g={})=>{let p=g.scope??"session";t[p].remove(i),r({type:"memory.updated",metadata:{operation:"remove",key:i,scope:p}});},list:(i={})=>{let g=i.scope??"session",p=t[g],m=Date.now(),u=[];for(let h of p.keys()){let x=rt(p.read(h));if(x){if(tt(x,m)){p.remove(h);continue}u.push(protocol.MemoryEntry.parse({key:h,value:x.value,scope:g,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:g,count:u.length}}),u},clear:(i={})=>{let g=i.scope??"session",p=t[g],m=p.keys().length;for(let u of p.keys())p.remove(u);r({type:"memory.updated",metadata:{operation:"clear",scope:g,count:m}});}}};var me=e=>protocol.SiteMemory.parse(JSON.parse(JSON.stringify(e))),N=e=>({...e,updatedAt:new Date().toISOString()}),ye=(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=me(t);r=l,n.forEach(v=>v(l));},d=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=N(v),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"provide",keys:Object.keys(l)}}),s(),p()},i=(l,v)=>{let S=l.split(".").filter(Boolean);if(S.length===0)throw new Error("siteMemory.update() requires a non-empty dot-path.");let k=JSON.parse(JSON.stringify(t)),M=k;for(let E=0;E<S.length-1;E++){let b=S[E],P=M[b];(typeof P!="object"||P===null||Array.isArray(P))&&(M[b]={}),M=M[b];}return M[S[S.length-1]]=v,t=N(protocol.SiteMemory.parse(k)),a(),o({type:"memory.updated",metadata:{kind:"site",operation:"update",path:l}}),s(),p()},g=l=>{let v=protocol.SiteMemoryPageContext.parse({path:l.path,payload:l.payload,updatedAt:new Date().toISOString()});return t=N({...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}}},p=()=>(r||(r=me(t)),r);return {provide:d,update:i,provideForPage:g,snapshot:p,get:l=>{if(o({type:"memory.accessed",metadata:{kind:"site",operation:l?"get":"snapshot",path:l??null}}),!l)return me(t);let v=l.split(".").filter(Boolean),S=t;for(let k of v){if(typeof S!="object"||S===null)return;S=S[k];}return S},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=N(protocol.SiteMemory.parse(l)),a(),s(),p()),subscribe:l=>(n.add(l),()=>{n.delete(l);})}};var ge=({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 ot=({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 d=s.split(".").filter(Boolean),i=a;for(let g of d){if(typeof i!="object"||i===null)return {content:void 0};i=i[g];}return {content:i}}});var A="agent-context-",fe="agentronics-site-context",or=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);},U=(e,t)=>{e.querySelectorAll(`meta[name="${t}"]`).forEach(r=>r.remove());},K=({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(fe);return n||(n=e.createElement("script"),n.type="application/ld+json",n.id=fe,e.head.appendChild(n)),n.textContent=or({"@context":"https://schema.org","@type":r,name:"Agentronics Site Memory",agentronics:t}),{uninstall:()=>{U(e,`${A}version`),U(e,`${A}updated-at`),U(e,`${A}flow`),U(e,`${A}workflows`),e.getElementById(fe)?.remove();}}};var it="agentronics-memory-overlay",ir=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
|
-
`,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=
|
|
15
|
+
`,st=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}`},H=({doc:e=typeof document>"u"?null:document,snapshot:t,hidden:r=false})=>{if(!e)return {uninstall:()=>{},refresh:()=>{}};let n=e.getElementById(it);return n||(n=e.createElement("div"),n.id=it,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",ir(r)),n.textContent=st(t),{uninstall:()=>{n?.remove();},refresh:o=>{n&&(n.textContent=st(o));}}};var he="/.well-known/agent-context.json",V=async({origin:e,fetcher:t=fetch,signal:r}={})=>{let n=(e?e.replace(/\/$/,""):typeof window<"u"?window.location.origin:"")+he;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)},ct=({snapshot:e})=>JSON.stringify(protocol.SiteMemory.parse(e));var ve=({evaluate:e,setPolicies:t,listPolicies:r,onTrace:n,identityResolver:o})=>{let a=new Map,s=new Set,d=i=>{if(!i.authz||!t||!r)return;let g={id:`tool:${i.name}`,tool:i.name,...i.authz,rateLimit:i.rateLimit??i.authz.rateLimit};t([...r().filter(p=>p.id!==g.id),g]);};return {register(i){return a.set(i.name,i),s.delete(i.name),d(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 g=[...a.values()];return i?g:g.filter(p=>!s.has(p.name))},get:i=>a.get(i),async execute(i,g,p){let m=p===void 0?o?.()??null:p,u=a.get(i);if(!u)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:m,policy:l,outcome:"blocked"}),new Error(l.reason)}let h=await e(i,{identity:m});if(h.decision==="deny")throw n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"blocked"}),new Error(h.reason);let x=Date.now();try{let l=await u.execute(g,{identity:m});return n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"success",durationMs:Date.now()-x}),l}catch(l){throw n?.({type:"tool.executed",tool:i,agent:m,policy:h,outcome:"error",durationMs:Date.now()-x,error:l instanceof Error?l.message:String(l)}),l}}}};var sr=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},lt=({gatewayUrl:e,siteId:t,publishableKey:r,fetcher:n=fetch})=>({async push(o){let a=o.map(sr),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 xe=(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,d)=>{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:d}}),{changed:true,from:i,to:s})};return {current:()=>n,enabledStages:()=>o(),notify(s){let i=r.get(n)?.transitions?.find(g=>g.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 ar=(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"}},cr=(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("|")}`}},lr=(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"},Se=(e,t)=>{let r=ar(e,t.identity);if(!r.ok)return {tool:e,visible:false,reason:r.reason};let n=cr(e,t.identity);if(!n.ok)return {tool:e,visible:false,reason:n.reason};let o=lr(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}},we=(e,t)=>e.filter(r=>Se(r,t).visible),Te=(e,t)=>e.map(r=>Se(r,t));var be="default",Ae=e=>{let t=new Map;for(let r of e){let n=r.group??be,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}))},pr=e=>[...new Set(e.map(t=>t.group??be))].sort();var ke=e=>e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ke).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${ke(e[r])}`).join(",")}}`,ut=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=ke(t).length;return {name:e.name,characters:r,tokens:Math.ceil(r/4)}},Me=e=>{let t=e.map(ut);return {total:t.reduce((n,o)=>n+o.tokens,0),perTool:t}};var dt=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},ur=(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},Ie=(e={})=>{let t=e.invoke??(async(n,o)=>n.execute(o,{identity:null})),r=null;return {publish(n){let o=dt(e);return o?(r?.revoke(),r=o.provideContext({tools:n.map(a=>ur(a,t))}),{revoked:true}):{revoked:false}},revoke(){r?.revoke(),r=null;},available:()=>!!dt(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 mt=(e,t)=>e===void 0?t:Math.max(0,Math.min(1,e)),Ee=(e={})=>{let t=mt(e.traceRate,1),r=mt(e.errorRate,1),n=e.random??Math.random;return {shouldKeep(o){let a=o.outcome==="error"?r:t;return n()<a}}};var dr="[REDACTED]",mr=e=>{if(e!==void 0)return JSON.parse(JSON.stringify(e))},Pe=(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)Pe(a,t);return}let o=e;if(r in o){if(n.length===0){o[r]=dr;return}Pe(o[r],n);}},Re=(e,t=[])=>{if(t.length===0)return e;let r=mr(e);for(let n of t)Pe(r,n.split(".").filter(Boolean));return r},Ce=["metadata.password","metadata.token","metadata.authorization","metadata.cookie"];var gr=()=>typeof location<"u"&&typeof location.pathname=="string"?location.pathname:void 0,yt=e=>{let t=globalThis.crypto;return t&&"randomUUID"in t?`${e}_${t.randomUUID()}`:`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`},z=({siteId:e,bufferSize:t,sessionId:r=yt("ses"),scrubPaths:n=Ce,exporters:o=[],onExporterError:a,pageProvider:s=gr,...d})=>{let i=F(t),g=Ee(d),p=()=>{try{return s()}catch{return}};return {sessionId:r,async emit(m){let u={...m.metadata};if(u.page===void 0){let x=p();x!==void 0&&(u.page=x);}let h=protocol.TraceEvent.parse(Re({id:yt("trc"),siteId:e,sessionId:r,occurredAt:new Date().toISOString(),outcome:m.outcome??"success",...m,metadata:u},n));return g.shouldKeep(h)?(i.add(h),await Promise.all(o.map(async x=>{try{await x.export([h]);}catch(l){a?.(l,x,h);}})),h):null},list:()=>i.list(),clear:()=>i.clear()}};var J=()=>({name:"console",export(e){for(let t of e)console.info("[agentronics:trace]",t.type,t);}});var q=({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 fr=e=>new Promise(t=>setTimeout(t,e)),X=({url:e,fetcher:t=fetch,maxRetries:r=2,queueLimit:n=500})=>({name:"webhook",async export(o){let s=[...hr(e),...o].slice(-n),d=0;for(;;){let i=await t(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({events:s})});if(i.ok){gt(e,[]);return}if(d>=r)throw gt(e,s),new Error(`Webhook exporter failed with status ${i.status}.`);d+=1,await fr(100*d);}}}),Oe=e=>`agtx:webhook:${e}`,hr=e=>{if(typeof window>"u"||!window.localStorage)return [];try{let t=window.localStorage.getItem(Oe(e));return t?JSON.parse(t):[]}catch{return []}},gt=(e,t)=>{if(!(typeof window>"u"||!window.localStorage))try{if(t.length===0){window.localStorage.removeItem(Oe(e));return}window.localStorage.setItem(Oe(e),JSON.stringify(t));}catch{}};var ft="/v1/sdk/events",ht=({url:e,ingestKey:t,fetcher:r=fetch})=>{let n=e.replace(/\/$/,""),o=n.endsWith(ft)?n:`${n}${ft}`;return {name:"intel",async export(a){let s={events:a},d=await r(o,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${t}`},body:JSON.stringify(s)});if(!d.ok)throw new Error(`Intel exporter failed with status ${d.status}.`)}}};var xt="https://gateway.agentronics.dev",Sr=e=>{if(e===void 0)return xt;if(e===xt)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}`)},St=e=>{let{publishableKey:t,siteId:r="default",debug:n=false,policies:o=[],trace:a={}}=e,s=Sr(e.gatewayUrl),d=protocol.classifyApiKey(t);if(d==="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(d!=="publishable")throw new protocol.AgentronicsError("invalid_api_key",`Agentronics.init() expected a key starting with "${protocol.PUBLISHABLE_KEY_PREFIX}".`);let i=a.enabled??true,g=[...n?[J()]:[],...a.gateway?[q({gatewayUrl:s,publishableKey:t})]:[],...a.webhookUrl?[X({url:a.webhookUrl})]:[],...a.exporters??[]],p={siteId:r,exporters:i?g:[],onExporterError:(c,y)=>{n&&console.warn(`[agentronics] trace exporter "${y.name}" failed`,c);}};a.bufferSize!==void 0&&(p.bufferSize=a.bufferSize),a.traceRate!==void 0&&(p.traceRate=a.traceRate),a.errorRate!==void 0&&(p.errorRate=a.errorRate),a.scrubPaths!==void 0&&(p.scrubPaths=a.scrubPaths);let m=z(p),u=c=>{i&&m.emit(c);},h=re(),x={onTrace:u};e.auth!==void 0&&(x.context=e.auth);let l=oe(x),v=ie(),S=ae(o),k=ce({gatewayUrl:s,siteId:r,publishableKey:t}),M=de({onTrace:u}),E={onTrace:u};e.siteMemory!==void 0&&(E.initial=e.siteMemory);let b=ye(E),P=ge({gatewayUrl:s,siteId:r,publishableKey:t}),wt=lt({gatewayUrl:s,siteId:r,publishableKey:t}),j=async c=>{let y=Date.now(),w=await G(c),T=h.preferOver(w);return i&&await m.emit({type:T?"agent.detected":"agent.missed",agent:T,durationMs:Date.now()-y,metadata:{detectedClass:w?.class??null,presented:h.snapshot()!==null}}),v.set(T,"detect"),T},De=async(c,y={})=>{let w=Date.now(),T=y.identity!==void 0?y.identity:await j(),Q=S.evaluate({tool:c,identity:T});return i&&await m.emit({type:"authz.evaluated",tool:c,agent:T,policy:Q,outcome:Q.decision==="deny"?"blocked":"success",durationMs:Date.now()-w}),Q},I=ve({evaluate:De,setPolicies:c=>S.set(c),listPolicies:()=>S.list(),onTrace:u,identityResolver:()=>v.snapshot().identity});for(let c of e.tools??[])I.register(c);let R=e.progression?xe(e.progression,{onTrace:u}):null,Le=c=>{let y={identity:c};return R&&(y.stage=R.current(),y.enabledStages=R.enabledStages()),y},C=c=>we(I.list(),Le(c)),We=c=>{if(!R)return;R.notify(c).changed&&W.publish(C(v.snapshot().identity));},Tt={class:"webmcp",trust:"detected",confidence:1,vendor:null,userAgent:typeof navigator<"u"?navigator.userAgent:null,detectionVersion:f,signals:{source:"navigator.modelContext"}},W=Ie({invoke:async(c,y)=>{let w=v.snapshot().identity??Tt,T=await I.execute(c.name,y,w);return We(c.name),T}});v.subscribe(c=>{W.available()&&W.publish(C(c.identity));});let Y=e.autoDetect??true,bt=Y===false?Promise.resolve(null):(async()=>{let c=Y===true?{}:Y;try{return await j(c)}catch(y){return n&&console.warn("[agentronics] autoDetect failed:",y),null}})();return Object.freeze({publishableKey:t,siteId:r,gatewayUrl:s,debug:n,memory:M,siteMemory:b,memoryCache:P,tracer:m,auth:l,agentContext:v,authz:S,policyCache:k,tools:I,progression:R,webmcp:W,ready:bt,detect:j,authenticate:async c=>{let y=await l.authenticate(c);return v.set(y,"authenticate"),y},presentIdentity:c=>{let y=h.present(c);return u({type:"auth.identity_presented",agent:y.identity,metadata:{vendor:y.identity.vendor,class:y.identity.class}}),v.set(y.identity,"declare"),y},clearIdentity:()=>{h.clear(),u({type:"auth.identity_cleared"}),v.set(null,"cleared");},presentedIdentity:()=>h.snapshot(),setPolicies:c=>{S.set(c),u({type:"authz.policies_set",metadata:{count:c.length}});},listPolicies:()=>S.list(),syncPolicies:async()=>{let c=await k.sync();return S.set(c.policies),u({type:"authz.policies_set",metadata:{count:c.policies.length,synced:true}}),c.policies},syncSiteMemory:async()=>{let c=await P.sync();return c.memory&&(b.replace(c.memory),u({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:y=false}={})=>{let w=[];return c&&w.push(K({snapshot:b.snapshot()})),y&&w.push(H({snapshot:b.snapshot()})),{uninstall:()=>{w.forEach(T=>T.uninstall());}}},fetchWellKnown:async c=>{let y={};c!==void 0&&(y.origin=c);let w=await V(y);return w&&(b.replace(w),u({type:"memory.updated",metadata:{kind:"site",operation:"wellKnown",origin:c??null}})),w},installDomEnforcer:()=>pe({policyEngine:S,getIdentity:()=>j({webmcp:{pollMs:0}})}),registerTool:c=>I.register(c),syncTools:async()=>{let c=I.list({includeDisabled:true}),y=await wt.push(c);return u({type:"tool.registered",metadata:{operation:"sync",count:y}}),y},surfaceTools:({identity:c=null}={})=>C(c),explainSurfacing:({identity:c=null}={})=>Te(I.list(),Le(c)),groupedTools:({identity:c=null}={})=>Ae(C(c)),estimateTokens:({identity:c=null}={})=>Me(C(c)),publishToWebMcp:({identity:c=null}={})=>{let y=C(c),w=W.publish(y);return y.forEach(T=>{u({type:"tool.surfaced",tool:T.name,metadata:{state:"published",trust:c?.trust??null,group:T.group??null}});}),{revoked:w.revoked,surfaced:y.length}},notifyToolInvoked:c=>We(c),evaluate:De,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 y=await c.json().catch(()=>null)??{};return {ok:!0,status:c.status,body:y}}catch(c){return {ok:false,status:0,error:c instanceof Error?c.message:String(c)}}}})};var Mi={init:St,declareAgent:te,detectAgent:G},Ii="0.1.0";
|
|
16
|
+
exports.Agentronics=Mi;exports.CRAWLER_SIGNATURES=Z;exports.DEFAULT_GROUP=be;exports.VERSION=Ii;exports.WELL_KNOWN_PATH=he;exports.bundledDetectors=ee;exports.createAgentContextStore=ie;exports.createAuthEngine=oe;exports.createConsoleExporter=J;exports.createDetectorRegistry=B;exports.createGatewayExporter=q;exports.createIdentityStore=re;exports.createIntelExporter=ht;exports.createMemoryCache=ge;exports.createMemoryStore=de;exports.createPolicyCache=ce;exports.createPolicyEngine=ae;exports.createProgressionStore=xe;exports.createRateLimiter=se;exports.createSignatureLoader=$e;exports.createSiteMemoryStore=ye;exports.createToolRegistry=ve;exports.createTraceBuffer=F;exports.createTracer=z;exports.createWebMcpAdapter=Ie;exports.createWebMcpContextTool=ot;exports.createWebhookExporter=X;exports.decideSurfacing=Se;exports.declareAgent=te;exports.deriveTrustLevel=Gt;exports.detectAgent=G;exports.detectCrawler=D;exports.detectDom=L;exports.detectWebMcp=O;exports.estimateBudget=Me;exports.estimateToolTokens=ut;exports.explainSurfacing=Te;exports.fetchWellKnownContext=V;exports.groupTools=Ae;exports.highestTrust=ne;exports.init=St;exports.installDomEnforcer=pe;exports.installMemoryOverlay=H;exports.installMetaTags=K;exports.listGroupNames=pr;exports.serializeWellKnownContext=ct;exports.showDenyOverlay=le;exports.surfaceTools=we;//# sourceMappingURL=index.cjs.map
|
|
17
17
|
//# sourceMappingURL=index.cjs.map
|