@sammy-labs/sammy-three
Version:
Sammy Agent Core: AI voice agent with screen capture, memory management, and live API integration
29 lines (25 loc) • 136 kB
JavaScript
'use strict';
var genai = require('@google/genai');
var react = require('react');
var Qo = require('eventemitter3');
var koalaWeb = require('@picovoice/koala-web');
var webVoiceProcessor = require('@picovoice/web-voice-processor');
var uuid = require('uuid');
var jsxRuntime = require('react/jsx-runtime');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var Qo__default = /*#__PURE__*/_interopDefault(Qo);
var Yt=Object.defineProperty;var Bn=(r,e,t)=>e in r?Yt(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var Jt=(r,e)=>()=>(r&&(e=r(r=0)),e);var Zt=(r,e)=>{for(var t in e)Yt(r,t,{get:e[t],enumerable:!0});};var er=(r,e,t)=>(Bn(r,typeof e!="symbol"?e+"":e,t),t);var ar={};Zt(ar,{canvasProcessorWorkerCode:()=>oo});var oo,cr=Jt(()=>{oo=`"use strict";(()=>{function R(n){let s=n.data,i=Math.max(1,Math.floor(s.length/1024)),e=0;for(let a=0;a<s.length;a+=i)e=(e<<5)-e+s[a],e=e&e;return e.toString(36)}async function y(n){try{let{id:s,bitmap:i,targetWidth:e,targetHeight:a,scale:b,jpegQuality:w,useHashing:C,lastHash:u,hashResolution:m}=n,c=new OffscreenCanvas(e,a),h=c.getContext("2d");if(!h)throw new Error("Failed to get 2d context");b<1&&(h.imageSmoothingEnabled=!0,h.imageSmoothingQuality="high"),h.drawImage(i,0,0,e,a),i.close();let g,l=!0;if(C){let r=m?.width||Math.min(320,e),t=m?.height||Math.min(180,a),o=new OffscreenCanvas(r,t).getContext("2d");if(o){o.drawImage(c,0,0,r,t);let d=o.getImageData(0,0,r,t);g=R(d),l=!u||g!==u}}let f;if(l){let r=await c.convertToBlob({type:"image/jpeg",quality:w}),t=new FileReader,p=new Promise((o,d)=>{t.onloadend=()=>{let v=t.result.split(",")[1];o(v)},t.onerror=d});t.readAsDataURL(r),f=await p}return{id:s,success:!0,data:f,hash:g,shouldSend:l}}catch(s){return{id:n.id,success:!1,error:s instanceof Error?s.message:"Unknown error"}}}self.onmessage=async n=>{let s=await y(n.data);self.postMessage(s)};})();
`;});var tn={};Zt(tn,{canvasWorkerCode:()=>No});var No,rn=Jt(()=>{No='"use strict";(()=>{var s=typeof window<"u",y=s&&"Worker"in window,T=s&&"atob"in window,h=s&&"btoa"in window,i=s?window.navigator?.userAgent:"",f=i.includes("Chrome"),g=i.includes("AppleWebKit")&&!f,E=i.includes("Firefox");var m=(...e)=>{};function x(e,t){return new Promise((r,o)=>{let n=new FileReader;n.onload=()=>r(n.result),n.onerror=()=>o(n.error),n.onabort=()=>o(new Error(`Failed read blob to ${t}`)),t==="dataUrl"?n.readAsDataURL(e):t==="arrayBuffer"&&n.readAsArrayBuffer(e)})}var d=e=>x(e,"dataUrl");function u(e){let{url:t,timeout:r,responseType:o,...n}=e,c=new AbortController,p=r?setTimeout(()=>c.abort(),r):void 0;return fetch(t,{signal:c.signal,...n}).then(a=>{if(!a.ok)throw new Error("Failed fetch, not 2xx response",{cause:a});switch(o){case"arrayBuffer":return a.arrayBuffer();case"dataUrl":return a.blob().then(d);case"text":default:return a.text()}}).finally(()=>clearTimeout(p))}var l=self;l.onmessage=async e=>{let t=e.data,r=t.rawUrl||t.url;try{let o=await u(t);l.postMessage({url:r,result:o})}catch(o){m(o),l.postMessage({url:r})}};})();\n';});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;er($e,"instance");var I=$e.getInstance();var ht=(r,e)=>({responseModalities:[genai.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:genai.StartSensitivity.START_SENSITIVITY_HIGH,endOfSpeechSensitivity:genai.EndSensitivity.END_SENSITIVITY_HIGH,prefixPaddingMs:40,silenceDurationMs:300},activityHandling:genai.ActivityHandling.START_OF_ACTIVITY_INTERRUPTS,turnCoverage:genai.TurnCoverage.TURN_INCLUDES_ONLY_ACTIVITY},tools:[{functionDeclarations:r}],systemInstruction:{parts:[{text:e}]},inputAudioTranscription:!0,outputAudioTranscription:!0,safetySettings:[{category:genai.HarmCategory.HARM_CATEGORY_HARASSMENT,threshold:genai.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:genai.HarmCategory.HARM_CATEGORY_HATE_SPEECH,threshold:genai.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:genai.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,threshold:genai.HarmBlockThreshold.BLOCK_LOW_AND_ABOVE},{category:genai.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,threshold:genai.HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE}]});var qn=(r={})=>{let{updateInterval:e=1e3,includeTitle:t=!0,includeDomain:n=!0,includePath:o=!0}=r,s=react.useRef(""),i=react.useRef(""),a=react.useRef(null),u=react.useRef(null),d=react.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=react.useCallback(h=>{u.current=h,h&&(d(),a.current&&clearInterval(a.current),a.current=setInterval(d,e));},[d,e]),p=react.useCallback(()=>{a.current&&(clearInterval(a.current),a.current=null),u.current=null;},[]);react.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=react.useCallback(h=>{u.current&&u.current.updateUserContext(h);},[]),v=react.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=jn(t);return e[n]=ee(r[t]),e},{}):r}function jn(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}var zn=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"}}},Kn=r=>async e=>{try{let t=ee(e);await r.post("/api/v1/conversations/messages",t);}catch(t){throw t}},Qn=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}}},tr=r=>({markConversationReadyToProcess:zn(r),sendMessages:Kn(r),escalateConversation:Qn(r)});var Xn=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}},Yn=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}},Jn=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}},rr=r=>({generateEphemeralToken:Xn(r),getSystemPrompt:Yn(r),instantiateSession:Jn(r)});var Zn=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}},eo=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:Zn(r),search:eo(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 to=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}},ro=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:to(r),getUserGuides:ro(r)});function yt({authConfig:r,walkthroughId:e}){let[t,n]=react.useState(null),[o,s]=react.useState([]),[i,a]=react.useState(!1),[u,d]=react.useState(!1),[c,p]=react.useState(null),[m,v]=react.useState(null),h=react.useMemo(()=>r?new Q(r):null,[r]),g=react.useMemo(()=>h?qe(h):null,[h]),l=react.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=react.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]);react.useEffect(()=>{e?l(e):n(null);},[e,l]),react.useEffect(()=>{g&&f();},[g,f]);let T=react.useCallback(()=>{e&&l(e);},[e,l]),C=react.useCallback(()=>{f();},[f]),y=react.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=react.useCallback((u,d)=>{},[n]),s=react.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=react.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=react.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 react.useEffect(()=>{if(r){let u=setTimeout(()=>{i();},100);return ()=>clearTimeout(u)}},[r,i]),react.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]=react.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=react.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=react.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 Promise.resolve().then(()=>(cr(),ar));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 lr={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 ur=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 dr=(r,e,t,n)=>!e||t>n.maxInterval?!0:r===e&&t<n.minInterval?!1:r!==e,mr=(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 so=(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},io=(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 pr=(r,e,t,n,o)=>r?io(r,e,t,n):so(e,t,n,o);var W=typeof window<"u",fr=W&&"Worker"in window,bt=W?window.navigator?.userAgent:"",St=bt.includes("Chrome"),re=bt.includes("AppleWebKit")&&!St,pe=bt.includes("Firefox"),hr=r=>r&&"__CONTEXT__"in r,vr=r=>r.constructor.name==="CSSFontFaceRule",yr=r=>r.constructor.name==="CSSImportRule",M=r=>r.nodeType===1,H=r=>typeof r.className=="object",Et=r=>r.tagName==="image",Cr=r=>r.tagName==="use",ne=r=>M(r)&&typeof r.style<"u"&&!H(r),Tr=r=>r.nodeType===8,br=r=>r.nodeType===3,V=r=>r.tagName==="IMG",ge=r=>r.tagName==="VIDEO",Sr=r=>r.tagName==="CANVAS",Er=r=>r.tagName==="TEXTAREA",xr=r=>r.tagName==="INPUT",Ar=r=>r.tagName==="STYLE",wr=r=>r.tagName==="SCRIPT",Rr=r=>r.tagName==="SELECT",kr=r=>r.tagName==="SLOT",Mr=r=>r.tagName==="IFRAME",Ir=(...r)=>{};function Pr(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 lo(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 Nr=r=>lo(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 Dr(r){return {time:t=>r&&void 0,timeEnd:t=>r&&void 0,warn:(...t)=>r&&Ir(...t)}}function Lr(r){return {cache:r?"no-cache":"force-cache"}}async function O(r,e){return hr(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:Lr(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:Dr(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:fr&&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:`${[Pr(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}=uo(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 uo(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 Ur(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}=mo(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 mo(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 Fr(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 Br(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 Gr(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 _r(r,e){return Sr(r)?et(r,e):Mr(r)?Fr(r,e):V(r)?Br(r):ge(r)?Gr(r,e):r.cloneNode(!1)}function $r(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 po=["width","height","-webkit-text-fill-color"],go=["stroke","fill"];function tt(r,e,t){let{defaultComputedStyles:n}=t,o=r.nodeName.toLowerCase(),s=H(r)&&o!=="svg",i=s?go.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=$r(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);po.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 Wr(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 Vr(r,e){(Er(r)||xr(r)||Rr(r))&&e.setAttribute("value",r.value);}var fo=[":before",":after"],ho=[":-webkit-scrollbar",":-webkit-scrollbar-button",":-webkit-scrollbar-thumb",":-webkit-scrollbar-track",":-webkit-scrollbar-track-piece",":-webkit-scrollbar-corner",":-webkit-resizer"];function Hr(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}`);}fo.forEach(d),t&&ho.forEach(d);}var qr=new Set(["symbol"]);async function jr(r,e,t,n,o){if(M(t)&&(Ar(t)||wr(t))||n.filter&&!n.filter(t))return;qr.has(e.nodeName)||qr.has(t.nodeName)?n.currentParentNodeStyle=void 0:n.currentParentNodeStyle=n.currentNodeStyle;let s=await Se(t,n,!1,o);n.isEnable("restoreScrollPosition")&&vo(r,s),e.appendChild(s);}async function zr(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(!Tr(s))if(M(s)&&kr(s)&&typeof s.assignedNodes=="function"){let i=s.assignedNodes();for(let a=0;a<i.length;a++)await jr(r,e,i[a],t,n);}else await jr(r,e,s,t,n);}function vo(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 yo(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 Co=/^[\w-:]+$/;async function Se(r,e,t=!1,n){let{ownerDocument:o,ownerWindow:s,fontFamilies:i,onCloneEachNode:a}=e;if(o&&br(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 _r(r,e);if(e.isEnable("removeAbnormalAttributes")){let g=d.getAttributeNames();for(let l=g.length,f=0;f<l;f++){let T=g[f];Co.test(T)||d.removeAttribute(T);}}let c=e.currentNodeStyle=Wr(r,d,t,e);t&&yo(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 Hr(r,d,p,e,h),Vr(r,d),ge(r)||await zr(r,d,e,h),await a?.(d),d}let u=r.cloneNode(!1);return await zr(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 To(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(Nr);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;}):To(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 bo(r,e))try{let i=await q(t,{url:s,requestType:n?"image":"text",responseType:"dataUrl"});r=r.replace(So(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 bo(r,e){let t=[];return r.replace(Mt,(n,o,s)=>(t.push([s,Qe(s,e)]),n)),t.filter(([n])=>!be(n))}function So(r){let e=r.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}var Eo=["background-image","border-image-source","-webkit-border-image","-webkit-mask-image","list-style-image"];function Kr(r,e){return Eo.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 Qr(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 Xr(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(...Qr(r,e)),Cr(r)&&t.push(...Xr(r,e))),ne(r)&&t.push(...Kr(r.style,e)),r.childNodes.forEach(n=>{It(n,e);});}async function Zr(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=Jr(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(yr(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 Ao(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=>vr(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=Jr(v,e),s.set(p.cssText,v),n.appendChild(t.createTextNode(`${v}
`));}));});}}var xo=/(\/\*[\s\S]*?\*\/)/g,Yr=/((@.*?keyframes [\s\S]*?){([\s\S]*?}\s*?)})/gi;function Ao(r){if(r==null)return [];let e=[],t=r.replace(xo,"");for(;;){let s=Yr.exec(t);if(!s)break;e.push(s[0]);}t=t.replace(Yr,"");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 wo=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ro=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Jr(r,e){let{font:t}=e,n=t?t?.preferredFormat:void 0;return n?r.replace(Ro,o=>{for(;;){let[s,,i]=wo.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 Zr(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=ko(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 ko(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 Ur(s,t)}async function en(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=pr(C,k,A,U,le);J=performance.now(),w=performance.now();let Fn=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:Fn,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&&(mr(_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 Oo=r=>{let e=r.getBoundingClientRect();return e.bottom<0||e.top>window.innerHeight||e.right<0||e.left>window.innerWidth};async function nn({captureElement:r,canvasRef:e,debugLogs:t=!1}){let n;try{let o=await Promise.resolve().then(()=>(rn(),tn));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"||Oo(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 cn({config:r,client:e,isCapturing:t}){let n=react.useRef(!1),o=react.useRef(-1),[s,i]=react.useState(!1),a=react.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=react.useCallback(d=>!r.enableAudioAdaptation||!n.current?!1:d>Y.audioSkipThreshold,[r.enableAudioAdaptation]);return react.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]),react.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 ln({client:r,onCriticalRender:e,isCapturing:t,debugLogs:n=!1}){let o=react.useRef(!1),s=react.useRef(!1),i=react.useRef(""),a=react.useRef("");return react.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.o