UNPKG

@sammy-labs/sammy-three

Version:

Sammy Agent Core: AI voice agent with screen capture, memory management, and live API integration

23 lines (22 loc) 132 kB
import { a } from './chunk-HPDHNIA3.js'; import { Behavior, Type, FunctionResponseScheduling, Modality, StartSensitivity, EndSensitivity, ActivityHandling, TurnCoverage, HarmCategory, HarmBlockThreshold, GoogleGenAI } from '@google/genai'; import { createContext, useRef, useCallback, useEffect, useState, useMemo, useContext } from 'react'; import Go, { EventEmitter } from 'eventemitter3'; import { KoalaWorker } from '@picovoice/koala-web'; import { WebVoiceProcessor } from '@picovoice/web-voice-processor'; import { v4 } from 'uuid'; import { jsx } from 'react/jsx-runtime'; var de=class{events=[];isActive=!0;debugMode=!1;maxEvents=1e3;constructor(){typeof window<"u"&&(window.audioStutterAnalyzer=this);}static getInstance(){return de.instance||(de.instance=new de),de.instance}setDebugMode(e){this.debugMode=e,e||this.clear();}addEvent(e,t,n,o={}){if(!this.isActive||!this.debugMode)return;let s={type:e,subtype:t,message:n,data:o,timestamp:Date.now()};this.events.push(s),this.events.length>this.maxEvents&&this.events.shift(),this.debugMode;}getAnalysis(){if(this.events.length===0)return;let e=this.events.filter(i=>i.subtype==="underrun");this.events.filter(i=>i.subtype==="long-capture");let n=[];e.forEach(i=>{let a=this.events.filter(u=>u.type==="render"&&Math.abs(u.timestamp-i.timestamp)<100);a.length>0&&n.push({underrun:i,nearbyRenders:a,timeDiff:Math.min(...a.map(u=>Math.abs(u.timestamp-i.timestamp)))});}),n.length>0&&n.forEach((i,a)=>{i.nearbyRenders.forEach(u=>{u.data.totalMs;});});let o=this.events.filter(i=>i.type==="render"&&i.subtype==="complete"&&i.data.audioActive===!0&&i.data.totalMs);if(o.length>0){let i=o.map(c=>parseFloat(c.data.totalMs));i.reduce((c,p)=>c+p,0)/i.length;Math.max(...i);Math.min(...i);}let s=this.events.filter(i=>i.type==="audio"&&i.subtype==="schedule-complete");if(s.length>0){let i=s.map(a=>parseFloat(a.data.bufferAhead)).filter(a=>!isNaN(a));if(i.length>0){i.reduce((d,c)=>d+c,0)/i.length;Math.min(...i);}}this.events.slice(-30).forEach(i=>{new Date(i.timestamp).toISOString().substr(11,12);i.type==="audio"?"\u{1F3B5}":"\u{1F4F8}";i.subtype==="underrun"||i.subtype==="long-capture"?"\u26A0\uFE0F ":"";});}clear(){this.events=[];}setActive(e){this.isActive=e;}getEvents(){return [...this.events]}getSummary(){let e=this.events.filter(n=>n.subtype==="underrun").length,t=this.events.filter(n=>n.subtype==="long-capture").length;return {totalEvents:this.events.length,underruns:e,longCaptures:t,isActive:this.isActive,debugMode:this.debugMode}}},$e=de;a($e,"instance");var I=$e.getInstance();var ht=(r,e)=>({responseModalities:[Modality.AUDIO],temperature:.6,topP:.85,topK:40,maxOutputTokens:1e3,seed:12345,speechConfig:{voiceConfig:{prebuiltVoiceConfig:{voiceName:"aoede"}},languageCode:"en-US"},realtimeInputConfig:{automaticActivityDetection:{disabled:!1,startOfSpeechSensitivity:StartSensitivity.START_SENSITIVITY_HIGH,endOfSpeechSensitivity:EndSensitivity.END_SENSITIVITY_HIGH,prefixPaddingMs:40,silenceDurationMs:300},activityHandling:ActivityHandling.START_OF_ACTIVITY_INTERRUPTS,turnCoverage:TurnCoverage.TURN_INCLUDES_ONLY_ACTIVITY},tools:[{functionDeclarations:r}],systemInstruction:{parts:[{text:e}]},inputAudioTranscription:!0,outputAudioTranscription:!0,safetySettings:[{category:HarmCategory.HARM_CATEGORY_HARASSMENT,threshold:HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:HarmCategory.HARM_CATEGORY_HATE_SPEECH,threshold:HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE}]});var Fn=(r={})=>{let{updateInterval:e=1e3,includeTitle:t=!0,includeDomain:n=!0,includePath:o=!0}=r,s=useRef(""),i=useRef(""),a=useRef(null),u=useRef(null),d=useCallback(()=>{let h=window.location.href,g=document.title;if((h!==s.current||g!==i.current)&&(s.current=h,i.current=g,u.current)){let l={url:h};if(t&&(l.title=g),n)try{let f=new URL(h);l.domain=f.hostname;}catch{}if(o)try{let f=new URL(h);l.path=f.pathname;}catch{}u.current.updatePageContext(l);}},[t,n,o]),c=useCallback(h=>{u.current=h,h&&(d(),a.current&&clearInterval(a.current),a.current=setInterval(d,e));},[d,e]),p=useCallback(()=>{a.current&&(clearInterval(a.current),a.current=null),u.current=null;},[]);useEffect(()=>{window.addEventListener("popstate",d);let h=window.history.pushState,g=window.history.replaceState;return window.history.pushState=function(...l){h.apply(window.history,l),setTimeout(d,100);},window.history.replaceState=function(...l){g.apply(window.history,l),setTimeout(d,100);},()=>{p(),window.removeEventListener("popstate",d),window.history.pushState=h,window.history.replaceState=g;}},[d,p]);let m=useCallback(h=>{u.current&&u.current.updateUserContext(h);},[]),v=useCallback((h,g)=>{u.current&&u.current.getContextStateManager().setCustomContext(h,g);},[]);return {startMonitoring:c,stopMonitoring:p,updateUserContext:m,setCustomContext:v}};function ee(r){return Array.isArray(r)?r.map(e=>ee(e)):r!==null&&typeof r=="object"&&!(r instanceof Date)?Object.keys(r).reduce((e,t)=>{let n=Bn(t);return e[n]=ee(r[t]),e},{}):r}function Bn(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}var Gn=r=>async e=>{try{let t=await r.patch(`/api/v1/conversations/${e}/mark-ready`,{});return {success:!0,conversationId:e,message:t.message||"Conversation marked as ready for processing"}}catch(t){return {success:!1,conversationId:e,message:t instanceof Error?t.message:"Unknown error occurred"}}},_n=r=>async e=>{try{let t=ee(e);await r.post("/api/v1/conversations/messages",t);}catch(t){throw t}},$n=r=>async e=>{try{return await r.post("/api/v1/conversations/escalate",e)}catch(t){return {success:!1,message:t instanceof Error?t.message:"Failed to escalate conversation",conversation_id:e.conversation_id}}},Jt=r=>({markConversationReadyToProcess:Gn(r),sendMessages:_n(r),escalateConversation:$n(r)});var Wn=r=>async e=>{try{return {token:(await r.post("/api/v1/sammy-three/generate-ephemeral-token-using-jwt",{live_connect_constraints:{model:e.model,config:e.config},http_options:{api_version:"v1alpha"}})).ephemeral_token}}catch(t){throw t}},Vn=r=>async e=>{try{let t=new URLSearchParams,n=ee(e);return Object.entries(n).forEach(([s,i])=>{i&&t.append(s,i);}),{systemPrompt:(await r.get(`/api/v1/sammy-three/system-prompt?${t.toString()}`)).system_prompt}}catch(t){throw t}},Hn=r=>async e=>{try{let t=ee(e);return {conversationId:(await r.post("/api/v1/sammy-three/instantiate-session",t)).conversation_id}}catch(t){throw t}},Zt=r=>({generateEphemeralToken:Wn(r),getSystemPrompt:Vn(r),instantiateSession:Hn(r)});var qn=r=>async(e,t)=>{try{let n=new URLSearchParams;e&&n.set("sammy_three_organisation_feature_id",e);let o=n.toString()?`/api/v1/memories?${n}`:"/api/v1/memories",s=await r.get(o,{retries:t?.retryOnEmpty?5:3});return t?.retryOnEmpty&&s.length,s}catch(n){throw n}},jn=r=>async(e,t)=>{if(!e)throw new Error("MemoryService.search: query is required");try{let n={query:e,...t};return await r.post("/api/v1/memories/search",n)}catch(n){throw n}},vt=r=>({getAll:qn(r),search:jn(r)});var _=class extends Error{constructor(t,n,o,s){super(t);this.code=n;this.status=o;this.details=s;this.name="ServiceError";}},te=class extends _{constructor(e="Token expired",t){super(e,"TOKEN_EXPIRED",401,t);}};var Q=class{token;baseUrl;onTokenExpired;isTokenValid=!0;constructor(e){this.token=e.token,this.baseUrl=e.baseUrl||"https://api-dev.sammylabs.com",this.onTokenExpired=e.onTokenExpired;}updateAuthConfig(e){e.token&&(this.token=e.token,this.isTokenValid=!0),e.baseUrl&&(this.baseUrl=e.baseUrl),e.onTokenExpired!==void 0&&(this.onTokenExpired=e.onTokenExpired);}async validateToken(){try{let e=await fetch(`${this.baseUrl}/validate`,{headers:{Authorization:`Bearer ${this.token}`}});if(!e.ok){if(e.status===401)throw this.isTokenValid=!1,this.onTokenExpired&&this.onTokenExpired(),new te("Token validation failed");return !1}return this.isTokenValid=!0,!0}catch(e){if(e instanceof te)throw e;return !1}}async makeRequest(e,t){let{path:n,body:o,headers:s={},timeout:i=3e4,retries:a=3,skipValidation:u=!1}=t;if(!u&&!await this.validateToken())throw new _("Invalid token - cannot make API call","AUTH_ERROR",401);let d=new URL(n,this.baseUrl).toString(),c=o instanceof FormData,p={Authorization:`Bearer ${this.token}`};Object.entries(s).forEach(([h,g])=>{h==="Content-Type"&&(c||g==="")||(p[h]=g);}),!c&&!p["Content-Type"]&&(p["Content-Type"]="application/json");let v={method:e,headers:p,body:c?o:o?JSON.stringify(o):void 0};return this.attemptRequest(e,n,d,v,i,a,0)}async attemptRequest(e,t,n,o,s,i,a){let u=new AbortController,d=setTimeout(()=>u.abort(),s);try{let c=await fetch(n,{...o,signal:u.signal});if(clearTimeout(d),!c.ok){let m=await this.getErrorDetails(c);if(c.status===401)throw this.isTokenValid=!1,this.onTokenExpired&&this.onTokenExpired(),new te("API request failed: Token expired",m);if(c.status>=400&&c.status<500&&c.status!==429)throw new _(`Failed to ${e} ${t}`,"CLIENT_ERROR",c.status,m);if(a===i)throw new _(`Failed to ${e} ${t}`,"SERVER_ERROR",c.status,m);return await this.delay(Math.pow(2,a)*1e3),this.attemptRequest(e,t,n,o,s,i,a+1)}return c.status===204||c.headers.get("content-length")==="0"?void 0:await c.json()}catch(c){if(clearTimeout(d),c instanceof te||c instanceof _)throw c;let p=c;if(a===i)throw new _(`Failed to ${e} ${t} after ${i+1} attempts`,"NETWORK_ERROR",void 0,{error:p,path:t,method:e});return await this.delay(Math.pow(2,a)*1e3),this.attemptRequest(e,t,n,o,s,i,a+1)}}async getErrorDetails(e){try{return await e.json()}catch{return {message:e.statusText}}}delay(e){return new Promise(t=>setTimeout(t,e))}async get(e,t={}){return this.makeRequest("GET",{path:e,...t})}async post(e,t,n={}){return this.makeRequest("POST",{path:e,body:t,...n})}async put(e,t,n={}){return this.makeRequest("PUT",{path:e,body:t,...n})}async patch(e,t,n={}){return this.makeRequest("PATCH",{path:e,body:t,...n})}async delete(e,t={}){return this.makeRequest("DELETE",{path:e,...t})}getTokenValidityStatus(){return this.isTokenValid}};var zn=r=>async e=>{try{let t=await r.get(`/api/v1/sammy-three/guides/${e}`);return {guideId:t.guide_id,title:t.title,prompt:t.prompt,organisationId:t.organisation_id,isCompleted:t.is_completed}}catch{return null}},Kn=r=>async()=>{try{return (await r.get("/api/v1/sammy-three/guides")).guides.map(t=>({guideId:t.guide_id,title:t.title,prompt:t.prompt,organisationId:t.organisation_id,isCompleted:t.is_completed}))}catch{return []}},qe=r=>({fetchGuide:zn(r),getUserGuides:Kn(r)});function yt({authConfig:r,walkthroughId:e}){let[t,n]=useState(null),[o,s]=useState([]),[i,a]=useState(!1),[u,d]=useState(!1),[c,p]=useState(null),[m,v]=useState(null),h=useMemo(()=>r?new Q(r):null,[r]),g=useMemo(()=>h?qe(h):null,[h]),l=useCallback(async S=>{if(!g)return null;a(!0),p(null);try{let b=await g.fetchGuide(S);return n(b),b}catch(b){let E=b instanceof Error?b:new Error("Failed to fetch guide");return p(E),n(null),null}finally{a(!1);}},[g]),f=useCallback(async()=>{if(!g)return [];d(!0),v(null);try{let S=await g.getUserGuides();return s(S),S}catch(S){let b=S instanceof Error?S:new Error("Failed to fetch user guides");return v(b),s([]),[]}finally{d(!1);}},[g]);useEffect(()=>{e?l(e):n(null);},[e,l]),useEffect(()=>{g&&f();},[g,f]);let T=useCallback(()=>{e&&l(e);},[e,l]),C=useCallback(()=>{f();},[f]),y=useCallback(S=>{n(b=>b?.guideId===S?{...b,isCompleted:!0}:b),s(b=>b.map(E=>E.guideId===S?{...E,isCompleted:!0}:E));},[]);return {currentGuide:t,userGuides:o,isLoadingGuide:i,isLoadingUserGuides:u,guideError:c,userGuidesError:m,refreshGuide:T,refreshUserGuides:C,markGuideAsCompleted:y}}var je=(n=>(n.ADMIN="ADMIN",n.SAMMY="SAMMY",n.USER="USER",n))(je||{});function Ct({checkQueryOnMount:r=!0,onGuideDetected:e,queryParamName:t="walkthrough",debug:n=!1}={}){let o=useCallback((u,d)=>{},[n]),s=useCallback(()=>{if(!(typeof window>"u"||!window.history?.replaceState))try{let u=new URLSearchParams(window.location.search);if(u.has(t)){u.delete(t);let d=window.location.pathname+(u.toString()?`?${u.toString()}`:"")+window.location.hash;window.history.replaceState({},"",d),o(`Cleaned up '${t}' parameter from URL`);}}catch{}},[t,o]),i=useCallback(async()=>{if(typeof window>"u")return !1;try{let d=new URLSearchParams(window.location.search).get(t);if(!d)return o("No guide ID found in query parameters"),!1;if(o(`Guide detected in URL: ${d}`),e){o(`Starting guide: ${d}`);try{return await e(d)?(o(`Guide started successfully: ${d}`),s(),!0):(o(`Failed to start guide: ${d}`),s(),!1)}catch{return s(),!1}}else return o("No onGuideDetected callback provided"),!1}catch{return !1}},[t,e,s,o]),a=useCallback(()=>{if(!(typeof window>"u"||!window.history?.replaceState))try{let u=new URLSearchParams(window.location.search),d=!1;if([t,"guide_id","walkthrough_id","tutorial","tour"].forEach(p=>{u.has(p)&&(u.delete(p),d=!0,o(`Removing parameter: ${p}`));}),d){let p=window.location.pathname+(u.toString()?`?${u.toString()}`:"")+window.location.hash;window.history.replaceState({},"",p),o("Cleaned up all guide-related query parameters");}}catch{}},[t,o]);return useEffect(()=>{if(r){let u=setTimeout(()=>{i();},100);return ()=>clearTimeout(u)}},[r,i]),useEffect(()=>{if(!r)return;let u=()=>{o("URL changed, checking for guide parameters"),i();};return window.addEventListener("popstate",u),()=>window.removeEventListener("popstate",u)},[r,i,o]),{checkQueryParameters:i,cleanupQueryParams:a}}function Tt({authConfig:r,autoStartFromURL:e=!1,onStartAgent:t,onWalkthroughStart:n,queryParamName:o="walkthrough",debug:s=!1,enabled:i=!1}){let[a,u]=useState(null),{currentGuide:d,userGuides:c,isLoadingGuide:p,isLoadingUserGuides:m,guideError:v,userGuidesError:h,refreshGuide:g,refreshUserGuides:l,markGuideAsCompleted:f}=yt({authConfig:i?r:void 0,walkthroughId:i&&a||void 0}),T=useCallback(async b=>{if(!i)return !1;if(u(b),n?.(b),t)try{let E=await t({agentMode:"USER",guideId:b});return E&&f(b),E}catch{return !1}return !1},[i,n,t,f]),C=useCallback(async b=>{if(!i)return !1;if(u(b),e&&(n?.(b),t))try{if(await t({agentMode:"USER",guideId:b}))return f(b),!0}catch{}return !1},[i,e,n,t,f]),{checkQueryParameters:y,cleanupQueryParams:S}=Ct({checkQueryOnMount:i,onGuideDetected:i?C:void 0,queryParamName:o,debug:i?s:!1});return i?{currentGuide:d,userGuides:c,isLoadingGuide:p,isLoadingUserGuides:m,guideError:v,userGuidesError:h,detectedWalkthroughId:a,refreshGuide:g,refreshUserGuides:l,markGuideAsCompleted:f,startWalkthrough:T,checkForGuideInUrl:y,cleanupUrlParams:S}:null}var Ke=class{worker=null;pendingRequests=new Map;requestCounter=0;isInitialized=!1;initPromise=null;debugLogs=!1;constructor(e=!1){this.debugLogs=e;}async initialize(){if(!this.isInitialized)return this.initPromise?this.initPromise:(this.initPromise=this.doInitialize(),this.initPromise)}async doInitialize(){try{let e=await import('./canvas-processor.worker.bundle-MNXLQGRH.js');if(e.canvasProcessorWorkerCode){let t=new Blob([e.canvasProcessorWorkerCode],{type:"application/javascript"}),n=URL.createObjectURL(t);this.worker=new Worker(n),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),this.isInitialized=!0,this.debugLogs,URL.revokeObjectURL(n);}else throw new Error("Canvas processor worker bundle not found")}catch(e){throw e}}handleWorkerMessage(e){let{id:t,success:n,data:o,hash:s,shouldSend:i,error:a}=e.data,u=this.pendingRequests.get(t);u&&(this.pendingRequests.delete(t),n?u.resolve({data:o,hash:s,shouldSend:i??!1}):u.reject(new Error(a||"Unknown worker error")));}handleWorkerError(e){for(let[t,{reject:n}]of this.pendingRequests)n(new Error("Worker crashed"));this.pendingRequests.clear(),this.worker=null,this.isInitialized=!1,this.initPromise=null;}async processCanvas(e){if(await this.initialize(),!this.worker)throw new Error("Worker not available");let{canvas:t,targetWidth:n,targetHeight:o,scale:s,jpegQuality:i,useHashing:a,lastHash:u,minInterval:d,maxInterval:c,timeSinceLastSent:p,hashResolution:m}=e;if(a){if(!(p>=c)){if(p<d)return {shouldSend:!1}}}else if(p<d)return {shouldSend:!1};let v=`request-${++this.requestCounter}`,h=new Promise((g,l)=>{this.pendingRequests.set(v,{resolve:g,reject:l}),setTimeout(()=>{this.pendingRequests.has(v)&&(this.pendingRequests.delete(v),l(new Error("Canvas processing timeout")));},5e3);});try{let g=await createImageBitmap(t);return this.worker.postMessage({id:v,operation:"process",bitmap:g,targetWidth:n,targetHeight:o,scale:s,jpegQuality:i,useHashing:a,lastHash:u,hashResolution:m},[g]),this.debugLogs,await h}catch(g){throw this.pendingRequests.delete(v),g}}destroy(){this.worker&&(this.worker.terminate(),this.worker=null);for(let[,{reject:e}]of this.pendingRequests)e(new Error("Manager destroyed"));this.pendingRequests.clear(),this.isInitialized=!1,this.initPromise=null;}};var or={scope:"document",checkInterval:1e3,jpegQuality:.9,maxWidth:1920,maxHeight:1080,minInterval:100,maxInterval:2e3,useHashing:!0,autoDownload:!1,domChangeDetection:{debounceMs:1e3},debugLogs:!1,enableAudioAdaptation:!0},$={audioActiveMinInterval:2e3,audioActiveMaxInterval:15e3,audioActiveDomDebounce:5e3,audioActiveScale:.4,audioActiveJpegQuality:.5,audioSkipThreshold:150,audioPauseThreshold:300,skipDomCaptureDuringAudio:!0,normalMinInterval:100,normalMaxInterval:2e3,normalDomDebounce:1e3,normalScale:1,normalJpegQuality:.9};var sr=r=>{let e=0,t=Math.max(1,Math.floor(r.data.length/1e3));for(let n=0;n<r.data.length;n+=t)e=(e<<5)-e+r.data[n]&4294967295;return e.toString()};var ir=(r,e,t,n)=>!e||t>n.maxInterval?!0:r===e&&t<n.minInterval?!1:r!==e,ar=(r,e)=>{let t=document.createElement("a");t.download=`screenshot-${new Date().toISOString().replace(/[:.]/g,"-")}.jpg`,t.href=r.toDataURL("image/jpeg",e.jpegQuality),t.click();};var Xn=(r,e,t,n)=>{if(n>=1)return r;let o=document.createElement("canvas");o.width=e,o.height=t;let s=o.getContext("2d");return s?(s.drawImage(r,0,0,e,t),o):r},Yn=(r,e,t,n)=>{let o=r.getContext("2d");if(!o)throw new Error("Canvas context not available");return r.width=t,r.height=n,o.drawImage(e,0,0,t,n),r};var cr=(r,e,t,n,o)=>r?Yn(r,e,t,n):Xn(e,t,n,o);var W=typeof window<"u",ur=W&&"Worker"in window,bt=W?window.navigator?.userAgent:"",St=bt.includes("Chrome"),re=bt.includes("AppleWebKit")&&!St,pe=bt.includes("Firefox"),dr=r=>r&&"__CONTEXT__"in r,mr=r=>r.constructor.name==="CSSFontFaceRule",pr=r=>r.constructor.name==="CSSImportRule",M=r=>r.nodeType===1,H=r=>typeof r.className=="object",Et=r=>r.tagName==="image",gr=r=>r.tagName==="use",ne=r=>M(r)&&typeof r.style<"u"&&!H(r),fr=r=>r.nodeType===8,hr=r=>r.nodeType===3,V=r=>r.tagName==="IMG",ge=r=>r.tagName==="VIDEO",vr=r=>r.tagName==="CANVAS",yr=r=>r.tagName==="TEXTAREA",Cr=r=>r.tagName==="INPUT",Tr=r=>r.tagName==="STYLE",br=r=>r.tagName==="SCRIPT",Sr=r=>r.tagName==="SELECT",Er=r=>r.tagName==="SLOT",xr=r=>r.tagName==="IFRAME",Ar=(...r)=>{};function wr(r){let e=r?.createElement?.("canvas");return e&&(e.height=e.width=1),!!e&&"toDataURL"in e&&!!e.toDataURL("image/webp").includes("image/webp")}var be=r=>r.startsWith("data:");function Qe(r,e){if(r.match(/^[a-z]+:\/\//i))return r;if(W&&r.match(/^\/\//))return window.location.protocol+r;if(r.match(/^[a-z]+:/i)||!W)return r;let t=Xe().implementation.createHTMLDocument(),n=t.createElement("base"),o=t.createElement("a");return t.head.appendChild(n),t.body.appendChild(o),e&&(n.href=e),o.href=r,o.href}function Xe(r){return (r&&M(r)?r?.ownerDocument:r)??window.document}var oe="http://www.w3.org/2000/svg";function xt(r,e,t){let n=Xe(t).createElementNS(oe,"svg");return n.setAttributeNS(null,"width",r.toString()),n.setAttributeNS(null,"height",e.toString()),n.setAttributeNS(null,"viewBox",`0 0 ${r} ${e}`),n}function At(r,e){let t=new XMLSerializer().serializeToString(r);return e&&(t=t.replace(/[\u0000-\u0008\v\f\u000E-\u001F\uD800-\uDFFF\uFFFE\uFFFF]/gu,"")),`data:image/svg+xml;charset=utf-8,${encodeURIComponent(t)}`}function eo(r,e){return new Promise((t,n)=>{let o=new FileReader;o.onload=()=>t(o.result),o.onerror=()=>n(o.error),o.onabort=()=>n(new Error(`Failed read blob to ${e}`)),e==="dataUrl"?o.readAsDataURL(r):e==="arrayBuffer"&&o.readAsArrayBuffer(r);})}var Rr=r=>eo(r,"dataUrl");function B(r,e){let t=Xe(e).createElement("img");return t.decoding="sync",t.loading="eager",t.src=r,t}function X(r,e){return new Promise(t=>{let{timeout:n,ownerDocument:o,onError:s,onWarn:i}=e??{},a=typeof r=="string"?B(r,Xe(o)):r,u=null,d=null;function c(){t(a),u&&clearTimeout(u),d?.();}if(n&&(u=setTimeout(c,n)),ge(a)){let p=a.currentSrc||a.src;if(!p)return a.poster?X(a.poster,e).then(t):c();if(a.readyState>=2)return c();let m=c,v=h=>{i?.("Failed video load",p,h),s?.(h),c();};d=()=>{a.removeEventListener("loadeddata",m),a.removeEventListener("error",v);},a.addEventListener("loadeddata",m,{once:!0}),a.addEventListener("error",v,{once:!0});}else {let p=Et(a)?a.href.baseVal:a.currentSrc||a.src;if(!p)return c();let m=async()=>{if(V(a)&&"decode"in a)try{await a.decode();}catch(h){i?.("Failed to decode image, trying to render anyway",a.dataset.originalSrc||p,h);}c();},v=h=>{i?.("Failed image load",a.dataset.originalSrc||p,h),c();};if(V(a)&&a.complete)return m();d=()=>{a.removeEventListener("load",m),a.removeEventListener("error",v);},a.addEventListener("load",m,{once:!0}),a.addEventListener("error",v,{once:!0});}})}async function wt(r,e){ne(r)&&(V(r)||ge(r)?await X(r,e):await Promise.all(["img","video"].flatMap(t=>Array.from(r.querySelectorAll(t)).map(n=>X(n,e)))));}var Ye=function(){let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return ()=>(e+=1,`u${t()}${e}`)}();function Je(r){return r?.split(",").map(e=>e.trim().replace(/"|'/g,"").toLowerCase()).filter(Boolean)}function Mr(r){return {time:t=>r&&void 0,timeEnd:t=>r&&void 0,warn:(...t)=>r&&Ar(...t)}}function Ir(r){return {cache:r?"no-cache":"force-cache"}}async function O(r,e){return dr(r)?r:Ze(r,{...e,autoDestruct:!0})}async function Ze(r,e){let{scale:t=1,workerUrl:n,workerNumber:o=1}=e||{},s=!!e?.debug,i=e?.features??!0,a=r.ownerDocument??(W?window.document:void 0),u=r.ownerDocument?.defaultView??(W?window:void 0),d=new Map,c={width:0,height:0,quality:1,type:"image/png",scale:t,backgroundColor:null,style:null,filter:null,maximumCanvasSize:0,timeout:3e4,progress:null,debug:s,fetch:{requestInit:Ir(e?.fetch?.bypassingCache),placeholderImage:"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",bypassingCache:!1,...e?.fetch},fetchFn:null,font:{},drawImageInterval:100,workerUrl:null,workerNumber:o,onCloneEachNode:null,onCloneNode:null,onEmbedNode:null,onCreateForeignObjectSvg:null,includeStyleProperties:null,autoDestruct:!1,...e,__CONTEXT__:!0,log:Mr(s),node:r,ownerDocument:a,ownerWindow:u,dpi:t===1?null:96*t,svgStyleElement:Rt(a),svgDefsElement:a?.createElementNS(oe,"defs"),svgStyles:new Map,defaultComputedStyles:new Map,workers:[...Array.from({length:ur&&n&&o?o:0})].map(()=>{try{let v=new Worker(n);return v.onmessage=async h=>{let{url:g,result:l}=h.data;l?d.get(g)?.resolve?.(l):d.get(g)?.reject?.(new Error(`Error receiving message from worker: ${g}`));},v.onmessageerror=h=>{let{url:g}=h.data;d.get(g)?.reject?.(new Error(`Error receiving message from worker: ${g}`));},v}catch(v){return c.log.warn("Failed to new Worker",v),null}}).filter(Boolean),fontFamilies:new Map,fontCssTexts:new Map,acceptOfImage:`${[wr(a)&&"image/webp","image/svg+xml","image/*","*/*"].filter(Boolean).join(",")};q=0.8`,requests:d,drawImageCount:0,tasks:[],features:i,isEnable:v=>v==="restoreScrollPosition"?typeof i=="boolean"?!1:i[v]??!1:typeof i=="boolean"?i:i[v]??!0,shadowRoots:[]};c.log.time("wait until load"),await wt(r,{timeout:c.timeout,onWarn:c.log.warn}),c.log.timeEnd("wait until load");let{width:p,height:m}=to(r,c);return c.width=p,c.height=m,c}function Rt(r){if(!r)return;let e=r.createElement("style"),t=e.ownerDocument.createTextNode(` .______background-clip--text { background-clip: text; -webkit-background-clip: text; } `);return e.appendChild(t),e}function to(r,e){let{width:t,height:n}=e;if(M(r)&&(!t||!n)){let o=r.getBoundingClientRect();t=t||o.width||Number(r.getAttribute("width"))||0,n=n||o.height||Number(r.getAttribute("height"))||0;}return {width:t,height:n}}async function Pr(r,e){let{log:t,timeout:n,drawImageCount:o,drawImageInterval:s}=e;t.time("image to canvas");let i=await X(r,{timeout:n,onWarn:e.log.warn}),{canvas:a,context2d:u}=ro(r.ownerDocument,e),d=()=>{try{u?.drawImage(i,0,0,a.width,a.height);}catch(c){e.log.warn("Failed to drawImage",c);}};if(d(),e.isEnable("fixSvgXmlDecode"))for(let c=0;c<o;c++)await new Promise(p=>{setTimeout(()=>{d(),p();},c+s);});return e.drawImageCount=0,t.timeEnd("image to canvas"),a}function ro(r,e){let{width:t,height:n,scale:o,backgroundColor:s,maximumCanvasSize:i}=e,a=r.createElement("canvas");a.width=Math.floor(t*o),a.height=Math.floor(n*o),a.style.width=`${t}px`,a.style.height=`${n}px`,i&&(a.width>i||a.height>i)&&(a.width>i&&a.height>i?a.width>a.height?(a.height*=i/a.width,a.width=i):(a.width*=i/a.height,a.height=i):a.width>i?(a.height*=i/a.width,a.width=i):(a.width*=i/a.height,a.height=i));let u=a.getContext("2d");return u&&s&&(u.fillStyle=s,u.fillRect(0,0,a.width,a.height)),{canvas:a,context2d:u}}function et(r,e){if(r.ownerDocument)try{let s=r.toDataURL();if(s!=="data:,")return B(s,r.ownerDocument)}catch(s){e.log.warn("Failed to clone canvas",s);}let t=r.cloneNode(!1),n=r.getContext("2d"),o=t.getContext("2d");try{return n&&o&&o.putImageData(n.getImageData(0,0,r.width,r.height),0,0),t}catch(s){e.log.warn("Failed to clone canvas",s);}return t}function Nr(r,e){try{if(r?.contentDocument?.body)return Se(r.contentDocument.body,e)}catch(t){e.log.warn("Failed to clone iframe",t);}return r.cloneNode(!1)}function Or(r){let e=r.cloneNode(!1);return r.currentSrc&&r.currentSrc!==r.src&&(e.src=r.currentSrc,e.srcset=""),e.loading==="lazy"&&(e.loading="eager"),e}async function Dr(r,e){if(r.ownerDocument&&!r.currentSrc&&r.poster)return B(r.poster,r.ownerDocument);let t=r.cloneNode(!1);t.crossOrigin="anonymous",r.currentSrc&&r.currentSrc!==r.src&&(t.src=r.currentSrc);let n=t.ownerDocument;if(n){let o=!0;if(await X(t,{onError:()=>o=!1,onWarn:e.log.warn}),!o)return r.poster?B(r.poster,r.ownerDocument):t;t.currentTime=r.currentTime,await new Promise(i=>{t.addEventListener("seeked",i,{once:!0});});let s=n.createElement("canvas");s.width=r.offsetWidth,s.height=r.offsetHeight;try{let i=s.getContext("2d");i&&i.drawImage(t,0,0,s.width,s.height);}catch(i){return e.log.warn("Failed to clone video",i),r.poster?B(r.poster,r.ownerDocument):t}return et(s,e)}return t}function Lr(r,e){return vr(r)?et(r,e):xr(r)?Nr(r,e):V(r)?Or(r):ge(r)?Dr(r,e):r.cloneNode(!1)}function Ur(r){let e=r.sandbox;if(!e){let{ownerDocument:t}=r;try{t&&(e=t.createElement("iframe"),e.id=`__SANDBOX__${Ye()}`,e.width="0",e.height="0",e.style.visibility="hidden",e.style.position="fixed",t.body.appendChild(e),e.srcdoc='<!DOCTYPE html><meta charset="UTF-8"><title></title><body>',r.sandbox=e);}catch(n){r.log.warn("Failed to getSandBox",n);}}return e}var no=["width","height","-webkit-text-fill-color"],oo=["stroke","fill"];function tt(r,e,t){let{defaultComputedStyles:n}=t,o=r.nodeName.toLowerCase(),s=H(r)&&o!=="svg",i=s?oo.map(g=>[g,r.getAttribute(g)]).filter(([,g])=>g!==null):[],a=[s&&"svg",o,i.map((g,l)=>`${g}=${l}`).join(","),e].filter(Boolean).join(":");if(n.has(a))return n.get(a);let d=Ur(t)?.contentWindow;if(!d)return new Map;let c=d?.document,p,m;s?(p=c.createElementNS(oe,"svg"),m=p.ownerDocument.createElementNS(p.namespaceURI,o),i.forEach(([g,l])=>{m.setAttributeNS(null,g,l);}),p.appendChild(m)):p=m=c.createElement(o),m.textContent=" ",c.body.appendChild(p);let v=d.getComputedStyle(m,e),h=new Map;for(let g=v.length,l=0;l<g;l++){let f=v.item(l);no.includes(f)||h.set(f,v.getPropertyValue(f));}return c.body.removeChild(p),n.set(a,h),h}function rt(r,e,t){let n=new Map,o=[],s=new Map;if(t)for(let a of t)i(a);else for(let a=r.length,u=0;u<a;u++){let d=r.item(u);i(d);}for(let a=o.length,u=0;u<a;u++)s.get(o[u])?.forEach((d,c)=>n.set(c,d));function i(a){let u=r.getPropertyValue(a),d=r.getPropertyPriority(a),c=a.lastIndexOf("-"),p=c>-1?a.substring(0,c):void 0;if(p){let m=s.get(p);m||(m=new Map,s.set(p,m)),m.set(a,[u,d]);}e.get(a)===u&&!d||(p?o.push(p):n.set(a,[u,d]));}return n}function Fr(r,e,t,n){let{ownerWindow:o,includeStyleProperties:s,currentParentNodeStyle:i}=n,a=e.style,u=o.getComputedStyle(r),d=tt(r,null,n);i?.forEach((p,m)=>{d.delete(m);});let c=rt(u,d,s);c.delete("transition-property"),c.delete("all"),c.delete("d"),c.delete("content"),t&&(c.delete("margin-top"),c.delete("margin-right"),c.delete("margin-bottom"),c.delete("margin-left"),c.delete("margin-block-start"),c.delete("margin-block-end"),c.delete("margin-inline-start"),c.delete("margin-inline-end"),c.set("box-sizing",["border-box",""])),c.get("background-clip")?.[0]==="text"&&e.classList.add("______background-clip--text"),St&&(c.has("font-kerning")||c.set("font-kerning",["normal",""]),(c.get("overflow-x")?.[0]==="hidden"||c.get("overflow-y")?.[0]==="hidden")&&c.get("text-overflow")?.[0]==="ellipsis"&&r.scrollWidth===r.clientWidth&&c.set("text-overflow",["clip",""]));for(let p=a.length,m=0;m<p;m++)a.removeProperty(a.item(m));return c.forEach(([p,m],v)=>{a.setProperty(v,p,m);}),c}function Br(r,e){(yr(r)||Cr(r)||Sr(r))&&e.setAttribute("value",r.value);}var so=[":before",":after"],io=[":-webkit-scrollbar",":-webkit-scrollbar-button",":-webkit-scrollbar-thumb",":-webkit-scrollbar-track",":-webkit-scrollbar-track-piece",":-webkit-scrollbar-corner",":-webkit-resizer"];function Gr(r,e,t,n,o){let{ownerWindow:s,svgStyleElement:i,svgStyles:a,currentNodeStyle:u}=n;if(!i||!s)return;function d(c){let p=s.getComputedStyle(r,c),m=p.getPropertyValue("content");if(!m||m==="none")return;o?.(m),m=m.replace(/(')|(")|(counter\(.+\))/g,"");let v=[Ye()],h=tt(r,c,n);u?.forEach((C,y)=>{h.delete(y);});let g=rt(p,h,n.includeStyleProperties);g.delete("content"),g.delete("-webkit-locale"),g.get("background-clip")?.[0]==="text"&&e.classList.add("______background-clip--text");let l=[`content: '${m}';`];if(g.forEach(([C,y],S)=>{l.push(`${S}: ${C}${y?" !important":""};`);}),l.length===1)return;try{e.className=[e.className,...v].join(" ");}catch(C){n.log.warn("Failed to copyPseudoClass",C);return}let f=l.join(` `),T=a.get(f);T||(T=[],a.set(f,T)),T.push(`.${v[0]}:${c}`);}so.forEach(d),t&&io.forEach(d);}var _r=new Set(["symbol"]);async function $r(r,e,t,n,o){if(M(t)&&(Tr(t)||br(t))||n.filter&&!n.filter(t))return;_r.has(e.nodeName)||_r.has(t.nodeName)?n.currentParentNodeStyle=void 0:n.currentParentNodeStyle=n.currentNodeStyle;let s=await Se(t,n,!1,o);n.isEnable("restoreScrollPosition")&&ao(r,s),e.appendChild(s);}async function Wr(r,e,t,n){let o=r.firstChild;M(r)&&r.shadowRoot&&(o=r.shadowRoot?.firstChild,t.shadowRoots.push(r.shadowRoot));for(let s=o;s;s=s.nextSibling)if(!fr(s))if(M(s)&&Er(s)&&typeof s.assignedNodes=="function"){let i=s.assignedNodes();for(let a=0;a<i.length;a++)await $r(r,e,i[a],t,n);}else await $r(r,e,s,t,n);}function ao(r,e){if(!ne(r)||!ne(e))return;let{scrollTop:t,scrollLeft:n}=r;if(!t&&!n)return;let{transform:o}=e.style,s=new DOMMatrix(o),{a:i,b:a,c:u,d}=s;s.a=1,s.b=0,s.c=0,s.d=1,s.translateSelf(-n,-t),s.a=i,s.b=a,s.c=u,s.d=d,e.style.transform=s.toString();}function co(r,e){let{backgroundColor:t,width:n,height:o,style:s}=e,i=r.style;if(t&&i.setProperty("background-color",t,"important"),n&&i.setProperty("width",`${n}px`,"important"),o&&i.setProperty("height",`${o}px`,"important"),s)for(let a in s)i[a]=s[a];}var lo=/^[\w-:]+$/;async function Se(r,e,t=!1,n){let{ownerDocument:o,ownerWindow:s,fontFamilies:i,onCloneEachNode:a}=e;if(o&&hr(r))return n&&/\S/.test(r.data)&&n(r.data),o.createTextNode(r.data);if(o&&s&&M(r)&&(ne(r)||H(r))){let d=await Lr(r,e);if(e.isEnable("removeAbnormalAttributes")){let g=d.getAttributeNames();for(let l=g.length,f=0;f<l;f++){let T=g[f];lo.test(T)||d.removeAttribute(T);}}let c=e.currentNodeStyle=Fr(r,d,t,e);t&&co(d,e);let p=!1;if(e.isEnable("copyScrollbar")){let g=[c.get("overflow-x")?.[0],c.get("overflow-y")?.[0]];p=g.includes("scroll")||(g.includes("auto")||g.includes("overlay"))&&(r.scrollHeight>r.clientHeight||r.scrollWidth>r.clientWidth);}let m=c.get("text-transform")?.[0],v=Je(c.get("font-family")?.[0]),h=v?g=>{m==="uppercase"?g=g.toUpperCase():m==="lowercase"?g=g.toLowerCase():m==="capitalize"&&(g=g[0].toUpperCase()+g.substring(1)),v.forEach(l=>{let f=i.get(l);f||i.set(l,f=new Set),g.split("").forEach(T=>f.add(T));});}:void 0;return Gr(r,d,p,e,h),Br(r,d),ge(r)||await Wr(r,d,e,h),await a?.(d),d}let u=r.cloneNode(!1);return await Wr(r,u,e),await a?.(u),u}function fe(r){if(r.ownerDocument=void 0,r.ownerWindow=void 0,r.svgStyleElement=void 0,r.svgDefsElement=void 0,r.svgStyles.clear(),r.defaultComputedStyles.clear(),r.sandbox){try{r.sandbox.remove();}catch(e){r.log.warn("Failed to destroyContext",e);}r.sandbox=void 0;}r.workers=[],r.fontFamilies.clear(),r.fontCssTexts.clear(),r.requests.clear(),r.tasks=[],r.shadowRoots=[];}function uo(r){let{url:e,timeout:t,responseType:n,...o}=r,s=new AbortController,i=t?setTimeout(()=>s.abort(),t):void 0;return fetch(e,{signal:s.signal,...o}).then(a=>{if(!a.ok)throw new Error("Failed fetch, not 2xx response",{cause:a});switch(n){case"arrayBuffer":return a.arrayBuffer();case"dataUrl":return a.blob().then(Rr);case"text":default:return a.text()}}).finally(()=>clearTimeout(i))}function q(r,e){let{url:t,requestType:n="text",responseType:o="text",imageDom:s}=e,i=t,{timeout:a,acceptOfImage:u,requests:d,fetchFn:c,fetch:{requestInit:p,bypassingCache:m,placeholderImage:v},font:h,workers:g,fontFamilies:l}=r;n==="image"&&(re||pe)&&r.drawImageCount++;let f=d.get(t);if(!f){m&&m instanceof RegExp&&m.test(i)&&(i+=(/\?/.test(i)?"&":"?")+new Date().getTime());let T=n.startsWith("font")&&h&&h.minify,C=new Set;T&&n.split(";")[1].split(",").forEach(E=>{l.has(E)&&l.get(E).forEach(x=>C.add(x));});let y=T&&C.size,S={url:i,timeout:a,responseType:y?"arrayBuffer":o,headers:n==="image"?{accept:u}:void 0,...p};f={type:n,resolve:void 0,reject:void 0,response:null},f.response=(async()=>{if(c&&n==="image"){let b=await c(t);if(b)return b}return !re&&t.startsWith("http")&&g.length?new Promise((b,E)=>{g[d.size&g.length-1].postMessage({rawUrl:t,...S}),f.resolve=b,f.reject=E;}):uo(S)})().catch(b=>{if(d.delete(t),n==="image"&&v)return r.log.warn("Failed to fetch image base64, trying to use placeholder image",i),typeof v=="string"?v:v(s);throw b}),d.set(t,f);}return f.response}async function nt(r,e,t,n){if(!kt(r))return r;for(let[o,s]of mo(r,e))try{let i=await q(t,{url:s,requestType:n?"image":"text",responseType:"dataUrl"});r=r.replace(po(o),`$1${i}$3`);}catch(i){t.log.warn("Failed to fetch css data url",o,i);}return r}function kt(r){return /url\((['"]?)([^'"]+?)\1\)/.test(r)}var Mt=/url\((['"]?)([^'"]+?)\1\)/g;function mo(r,e){let t=[];return r.replace(Mt,(n,o,s)=>(t.push([s,Qe(s,e)]),n)),t.filter(([n])=>!be(n))}function po(r){let e=r.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}var go=["background-image","border-image-source","-webkit-border-image","-webkit-mask-image","list-style-image"];function Vr(r,e){return go.map(t=>{let n=r.getPropertyValue(t);return !n||n==="none"?null:((re||pe)&&e.drawImageCount++,nt(n,null,e,!0).then(o=>{!o||n===o||r.setProperty(t,o,r.getPropertyPriority(t));}))}).filter(Boolean)}function Hr(r,e){if(V(r)){let t=r.currentSrc||r.src;if(!be(t))return [q(e,{url:t,imageDom:r,requestType:"image",responseType:"dataUrl"}).then(n=>{n&&(r.srcset="",r.dataset.originalSrc=t,r.src=n||"");})];(re||pe)&&e.drawImageCount++;}else if(H(r)&&!be(r.href.baseVal)){let t=r.href.baseVal;return [q(e,{url:t,imageDom:r,requestType:"image",responseType:"dataUrl"}).then(n=>{n&&(r.dataset.originalSrc=t,r.href.baseVal=n||"");})]}return []}function qr(r,e){let{ownerDocument:t,svgDefsElement:n}=e,o=r.getAttribute("href")??r.getAttribute("xlink:href");if(!o)return [];let[s,i]=o.split("#");if(i){let a=`#${i}`,u=e.shadowRoots.reduce((d,c)=>d??c.querySelector(`svg ${a}`),t?.querySelector(`svg ${a}`));if(s&&r.setAttribute("href",a),n?.querySelector(a))return [];if(u)return n?.appendChild(u.cloneNode(!0)),[];if(s)return [q(e,{url:s,responseType:"text"}).then(d=>{n?.insertAdjacentHTML("beforeend",d);})]}return []}function It(r,e){let{tasks:t}=e;M(r)&&((V(r)||Et(r))&&t.push(...Hr(r,e)),gr(r)&&t.push(...qr(r,e))),ne(r)&&t.push(...Vr(r.style,e)),r.childNodes.forEach(n=>{It(n,e);});}async function Kr(r,e){let{ownerDocument:t,svgStyleElement:n,fontFamilies:o,fontCssTexts:s,tasks:i,font:a}=e;if(!(!t||!n||!o.size))if(a&&a.cssText){let u=zr(a.cssText,e);n.appendChild(t.createTextNode(`${u} `));}else {let u=Array.from(t.styleSheets).filter(c=>{try{return "cssRules"in c&&!!c.cssRules.length}catch(p){return e.log.warn(`Error while reading CSS rules from ${c.href}`,p),!1}});await Promise.all(u.flatMap(c=>Array.from(c.cssRules).map(async(p,m)=>{if(pr(p)){let v=m+1,h=p.href,g="";try{g=await q(e,{url:h,requestType:"text",responseType:"text"});}catch(f){e.log.warn(`Error fetch remote css import from ${h}`,f);}let l=g.replace(Mt,(f,T,C)=>f.replace(C,Qe(C,h)));for(let f of ho(l))try{c.insertRule(f,f.startsWith("@import")?v+=1:c.cssRules.length);}catch(T){e.log.warn("Error inserting rule from remote css import",{rule:f,error:T});}}}))),u.flatMap(c=>Array.from(c.cssRules)).filter(c=>mr(c)&&kt(c.style.getPropertyValue("src"))&&Je(c.style.getPropertyValue("font-family"))?.some(p=>o.has(p))).forEach(c=>{let p=c,m=s.get(p.cssText);m?n.appendChild(t.createTextNode(`${m} `)):i.push(nt(p.cssText,p.parentStyleSheet?p.parentStyleSheet.href:null,e).then(v=>{v=zr(v,e),s.set(p.cssText,v),n.appendChild(t.createTextNode(`${v} `));}));});}}var fo=/(\/\*[\s\S]*?\*\/)/g,jr=/((@.*?keyframes [\s\S]*?){([\s\S]*?}\s*?)})/gi;function ho(r){if(r==null)return [];let e=[],t=r.replace(fo,"");for(;;){let s=jr.exec(t);if(!s)break;e.push(s[0]);}t=t.replace(jr,"");let n=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let s=n.exec(t);if(s)o.lastIndex=n.lastIndex;else if(s=o.exec(t),s)n.lastIndex=o.lastIndex;else break;e.push(s[0]);}return e}var vo=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,yo=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function zr(r,e){let{font:t}=e,n=t?t?.preferredFormat:void 0;return n?r.replace(yo,o=>{for(;;){let[s,,i]=vo.exec(o)||[];if(!i)return "";if(i===n)return `src: ${s};`}}):r}async function Pt(r,e){let t=await O(r,e);if(M(t.node)&&H(t.node))return t.node;let{ownerDocument:n,log:o,tasks:s,svgStyleElement:i,svgDefsElement:a,svgStyles:u,font:d,progress:c,autoDestruct:p,onCloneNode:m,onEmbedNode:v,onCreateForeignObjectSvg:h}=t;o.time("clone node");let g=await Se(t.node,t,!0);if(i&&n){let y="";u.forEach((S,b)=>{y+=`${S.join(`, `)} { ${b} } `;}),i.appendChild(n.createTextNode(y));}o.timeEnd("clone node"),await m?.(g),d!==!1&&M(g)&&(o.time("embed web font"),await Kr(g,t),o.timeEnd("embed web font")),o.time("embed node"),It(g,t);let l=s.length,f=0,T=async()=>{for(;;){let y=s.pop();if(!y)break;try{await y;}catch(S){t.log.warn("Failed to run task",S);}c?.(++f,l);}};c?.(f,l),await Promise.all([...Array.from({length:4})].map(T)),o.timeEnd("embed node"),await v?.(g);let C=Co(g,t);return a&&C.insertBefore(a,C.children[0]),i&&C.insertBefore(i,C.children[0]),p&&fe(t),await h?.(C),C}function Co(r,e){let{width:t,height:n}=e,o=xt(t,n,r.ownerDocument),s=o.ownerDocument.createElementNS(o.namespaceURI,"foreignObject");return s.setAttributeNS(null,"x","0%"),s.setAttributeNS(null,"y","0%"),s.setAttributeNS(null,"width","100%"),s.setAttributeNS(null,"height","100%"),s.append(r),o.appendChild(s),o}async function he(r,e){let t=await O(r,e),n=await Pt(t),o=At(n,t.isEnable("removeControlCharacter"));t.autoDestruct||(t.svgStyleElement=Rt(t.ownerDocument),t.svgDefsElement=t.ownerDocument?.createElementNS(oe,"defs"),t.svgStyles.clear());let s=B(o,n.ownerDocument);return await Pr(s,t)}async function Qr(r,e){let{canvasRef:t,clientRef:n,screenshotContextRef:o,canvasProcessorRef:s,lastFrameHashRef:i,lastSentTimeRef:a,lastCaptureTimeRef:u,concurrentCaptureRef:d,hasPendingCaptureRef:c,lastCaptureDurationRef:p,audioActiveRef:m,capturesPausedRef:v,slowCaptureCountRef:h}=r,{captureElement:g,mergedConfig:l,getCurrentSettings:f,criticalRender:T}=e,C=t.current,y=n.current,S=o.current,b=s.current;if(!g||!y||!S||!b)return;let E=Date.now(),x=E-u.current,{minInterval:P}=f();if(T)l.debugLogs;else if(x<P||d.current){c.current=!0,l.debugLogs;return}u.current=E;let G=performance.now(),D=0,N=0,j=0,J=0,w=0,Z=0;l.debugLogs;let ye={timestamp:E,audioActive:m.current};l.debugAudioPerformance&&I.addEvent("render","start","Capture started",ye),d.current=!0,c.current=!1;try{C&&C.setAttribute("data-sammy-ignore","true");let{scale:z,jpegQuality:gt}=f();D=performance.now();let k;if(m.current&&!T)if($.skipDomCaptureDuringAudio){D=performance.now(),k=document.createElement("canvas"),k.width=400,k.height=300;let R=k.getContext("2d");R&&(R.fillStyle="#f8f8f8",R.fillRect(0,0,400,300),R.fillStyle="#999",R.font="16px Arial",R.textAlign="center",R.fillText("\u{1F50A} Audio playing - visual paused",200,150),R.font="12px Arial",R.fillText("(Zero stuttering mode)",200,170)),N=performance.now(),p.current=N-D;}if(T&&m.current&&l.debugLogs,!k){k=await he(S).catch(Xt=>{let ue=document.createElement("canvas");ue.width=800,ue.height=600;let F=ue.getContext("2d");return F&&(F.fillStyle="#f0f0f0",F.fillRect(0,0,800,600),F.fillStyle="#666",F.font="16px Arial",F.textAlign="center",F.fillText("Screen capture unavailable",400,300)),ue}),N=performance.now();let R=N-D;if(p.current=R,m.current&&(R>$.audioSkipThreshold?h.current++:h.current=Math.max(0,h.current-1),R>$.audioPauseThreshold)){v.current=!0;return}}let A,U,le=Math.min(l.maxWidth*z/k.width,l.maxHeight*z/k.height,z);A=Math.floor(k.width*le),U=Math.floor(k.height*le),j=performance.now();let _e=cr(C,k,A,U,le);J=performance.now(),w=performance.now();let In=E-a.current,K=await b.processCanvas({canvas:_e,targetWidth:A,targetHeight:U,scale:le,jpegQuality:gt,useHashing:l.useHashing,lastHash:i.current,minInterval:f().minInterval,maxInterval:f().maxInterval,timeSinceLastSent:In,hashResolution:{width:320,height:180}});Z=performance.now();let ft=performance.now()-G,Kt={timestamp:Date.now(),totalMs:ft.toFixed(2),captureMs:(N-D).toFixed(2),renderMs:(J-j).toFixed(2),processMs:(Z-w).toFixed(2),shouldSend:K.shouldSend,audioActive:m.current};if(l.debugAudioPerformance&&I.addEvent("render","complete","Capture complete",Kt),m.current&&ft>50&&l.debugAudioPerformance){let R={totalMs:ft.toFixed(2),threshold:"50ms"};I.addEvent("render","long-capture","Long capture during audio playback",{...Kt,...R});}if(!K.shouldSend||!K.data){l.debugLogs;return}K.hash&&(i.current=K.hash),l.debugLogs;let Qt=()=>{let R=performance.now();y.sendRealtimeInput([{mimeType:"image/jpeg",data:K.data}]);let Xt=performance.now()-R,ue={timestamp:Date.now(),sendMs:Xt.toFixed(2),audioActive:m.current};if(l.debugAudioPerformance&&I.addEvent("render","sent","Frame sent",ue),a.current=E,T){let F=y;F.observability?.manager&&(F.observability.manager.trackEvent({type:"screen_capture.critical",data:{reason:T.reason,audioActive:m.current,bypassedThrottling:!0,timeSinceLastCapture:x,captureMethod:k?"dom":"placeholder",width:_e.width,height:_e.height,sizeBytes:K.data?K.data.length:0}}),l.debugLogs);}l.autoDownload&&(ar(_e,l),l.debugLogs);};"requestIdleCallback"in window&&!m.current?window.requestIdleCallback(Qt,{timeout:50}):Qt();}catch{}finally{d.current=!1,C&&C.removeAttribute("data-sammy-ignore");}}var Eo=r=>{let e=r.getBoundingClientRect();return e.bottom<0||e.top>window.innerHeight||e.right<0||e.left>window.innerWidth};async function Xr({captureElement:r,canvasRef:e,debugLogs:t=!1}){let n;try{let o=await import('./canvas.worker.bundle-IRBLC5NR.js');if(o.canvasWorkerCode){let s=new Blob([o.canvasWorkerCode],{type:"application/javascript"});n=URL.createObjectURL(s);}}catch{}try{let o=await Ze(r,{workerUrl:n,workerNumber:n?2:void 0,scale:1,timeout:0,fetch:{requestInit:{mode:"cors",credentials:"include"}},filter:s=>{try{if(s.nodeType!==Node.ELEMENT_NODE)return !0;let i=s,a=i,u=e.current;return !(i===u||a.dataset?.sammyIgnore==="true"||Eo(i)||a.offsetWidth===0&&a.offsetHeight===0||["CANVAS","IFRAME","IMG","PICTURE","SVG","VIDEO"].includes(i.tagName))}catch{return !1}}});return n&&setTimeout(()=>URL.revokeObjectURL(n),1e3),o}catch{return null}}var Y={audioActiveMinInterval:1e3,audioActiveMaxInterval:5e3,audioActiveDomDebounce:2e3,audioActiveScale:.6,audioActiveJpegQuality:.7,audioSkipThreshold:200,normalMinInterval:100,normalMaxInterval:2e3,normalDomDebounce:1e3,normalScale:1,normalJpegQuality:.9};function en({config:r,client:e,isCapturing:t}){let n=useRef(!1),o=useRef(-1),[s,i]=useState(!1),a=useCallback(()=>n.current&&r.enableAudioAdaptation?{minInterval:Y.audioActiveMinInterval,maxInterval:Y.audioActiveMaxInterval,domDebounce:Y.audioActiveDomDebounce,scale:Y.audioActiveScale,jpegQuality:Y.audioActiveJpegQuality}:{minInterval:r.minInterval??100,maxInterval:r.maxInterval??2e3,domDebounce:r.domChangeDetection?.debounceMs??1e3,scale:Y.normalScale,jpegQuality:r.jpegQuality??.9},[r]),u=useCallback(d=>!r.enableAudioAdaptation||!n.current?!1:d>Y.audioSkipThreshold,[r.enableAudioAdaptation]);return useEffect(()=>{if(!e||!t)return;let d=()=>{n.current=!0,i(!0),o.current!==-1&&clearTimeout(o.current),o.current=window.setTimeout(()=>{n.current=!1,i(!1),r.debugLogs;},1e3),r.debugLogs;};return e.on("audio",d),()=>{e.off("audio",d),o.current!==-1&&clearTimeout(o.current);}},[e,t,r.debugLogs]),useEffect(()=>()=>{n.current=!1,i(!1),o.current!==-1&&(clearTimeout(o.current),o.current=-1);},[]),{audioActive:s,audioActiveRef:n,getCurrentSettings:a,shouldSkipCapture:u,AUDIO_AWARE_CONFIG:Y}}function tn({client:r,onCriticalRender:e,isCapturing:t,debugLogs:n=!1}){let o=useRef(!1),s=useRef(!1),i=useRef(""),a=useRef("");return useEffect(()=>{if(!r||!t)return;let u=m=>{let h=i.current.length===0&&m.text.length>0,g=m.finished&&m.text.length>0;if(i.current=m.finished?"":m.text,h&&!o.current){o.current=!0;let l={reason:"user-started-speaking",timestamp:Date.now(),bypassAudioThrottling:!0};e(l);}if(g&&o.current){o.current=!1;let l={reason:"user-stopped-speaking",timestamp:Date.now(),bypassAudioThrottling:!0};e(l);}},d=m=>{let h=a.current.length===0&&m.text.length>0,g=m.finished&&m.text.length>0;if(a.current=m.finished?"":m.text,h&&!s.current){s.current=!0;let l={reason:"agent-started-speaking",timestamp:Date.now(),bypassAudioThrottling:!0};e(l);}if(g&&s.current){s.current=!1;let l={reason:"agent-stopped-speaking",timestamp:Date.now(),bypassAudioThrottling:!0};e(l);}},c=()=>{o.current=!1,s.current=!1,i.current="",a.current="";let m={reason:"turn-complete",timestamp:Date.now(),bypassAudioThrottling:!0};e(m);},p=()=>{s.current=!1,a.current="";let m={reason:"interrupted",timestamp:Date.now(),bypassAudioThrottling:!0};e(m);};return r.on("inputtranscription",u),r.on("outputtranscription",d),r.on("turncomplete",c),r.on("interrupted",p),()=>{r.off("inputtranscription",u),r.off("outputtranscription",d),r.off("turncomplete",c),r.off("interrupted",p),o.current=!1,s.current=!1,i.current="",a.current="";}},[r,t,e,n]),{userSpeaking:o.current,agentSpeaking:s.current}}var Ro={childList:!0,subtree:!0,attributes:!0,characterData:!0,attributeOldValue:!1,characterDataOldValue:!1};function nn({target:r,onDomChange:e,enabled:t,debounceMs:n,config:o=Ro}){let s=useRef(null),i=useRef(-1),a=useRef(0),u=useCallback(c=>{c.filter(m=>{let v=m.target;return !(v instanceof Element&&(v.tagName==="CANVAS"||v.closest("canvas")||v.getAttribute?.("data-sammy-ignore")==="true"))}).length!==0&&(a.current=Date.now(),i.current!==-1&&clearTimeout(i.current),i.current=window.setTimeout(()=>{e(),i.current=-1;},n));},[e,n]);return useEffect(()=>{if(!t||!r){s.current&&(s.current.disconnect(),s.current=null),i.current!==-1&&(clearTimeout(i.current),i.current=-1);return}return s.current||(s.current=new MutationObserver(u)),s.current.observe(r,o),()=>{s.current&&s.current.disconnect(),i.current!==-1&&(clearTimeout(i.current),i.current=-1);}},[t,r,o,u]),{getTimeSinceLastChange:useCallback(()=>Date.now()-a.current,[])}}function on({isCapturing:r,captureElement:e,screenshotContextRef:t,canvasProcessorRef:n,audioActiveRef:o,captureFrame:s,getCurrentSettings:i,getTimeSinceLastChange:a,lastSentTimeRef:u,lastCaptureTimeRef:d,mergedConfig:c}){let p=useRef(-1);useEffect(()=>{if(c.debugLogs,!r){p.current!==-1&&(clearInterval(p.current),p.current=-1);return}let m=()=>{if(e&&t.current&&n.current){c.debugLogs,o.current?c.debugAudioPerformance:(c.debugAudioPerformance,s());let v=()=>{p.current!==-1&&clearInterval(p.current);let g=o.current?1e3:c.checkInterval;p.current=window.setInterval(()=>{if(!e||!t.current)return;let l=Date.now()-u.current,f=Date.now()-d.current,{maxInterval:T,minInterval:C}=i();l>=T&&f>=C?(c.debugLogs,c.debugAudioPerformance,s().catch(y=>{})):c.debugLogs&&f<C;},g);};v();let h=setInterval(()=>{let g=o.current?1e3:c.checkInterval;p.current!==-1&&(o.current?g!==1e3:g!==c.checkInterval)&&v();},1e3);window.__audioCheckInterval=h;}else c.debugLogs,setTimeout(m,500);};return m(),()=>{p.current!==-1&&(clearInterval(p.current),p.current=-1),window.__audioCheckInterval&&(clearInterval(window.__audioCheckInterval),window.__audioCheckInterval=void 0);}},[r,s,c.checkInterval,c.debugLogs,a,i,e]);}function Dt({contextElementRef:r,canvasRef:e,config:t}){let n=useRef(""),o=useRef(0),s=useRef(0),i=useRef(!1),a=useRef(!1),[u,d]=useState(0),[c,p]=useState(null),[m,v]=useState(!1),h=useRef(null),g=useRef(null),l=useRef(null),f=useRef(0),T=useRef(!1),C=useRef(0);useEffect(()=>{I.setDebugMode(t.debugAudioPerformance??!1);},[t.debugAudioPerformance]);let y=useMemo(()=>({...or,...t}),[t]),{audioActive:S,audioActiveRef:b,getCurrentSettings:E}=en({config:y,client:h.current,isCapturing:m}),x=useMemo(()=>t.scope==="context"?r.c