momentic-mobile 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js CHANGED
@@ -1,49 +1,49 @@
1
1
  #!/usr/bin/env node
2
- var c_=Object.defineProperty;var We=(r,e)=>()=>(r&&(e=r(r=0)),e);var u_=(r,e)=>{for(var t in e)c_(r,t,{get:e[t],enumerable:!0})};var QE,ZE=We(()=>{"use strict";QE=typeof globalThis=="object"?globalThis:global});var eT=We(()=>{"use strict";ZE()});var tT=We(()=>{"use strict";eT()});var sn,Zm=We(()=>{"use strict";sn="1.9.0"});function iD(r){var e=new Set([r]),t=new Set,n=r.match(rT);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(rT);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var rT,nT,oT=We(()=>{"use strict";Zm();rT=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;nT=iD(sn)});function bi(r,e,t,n){var o;n===void 0&&(n=!1);var i=qa[$a]=(o=qa[$a])!==null&&o!==void 0?o:{version:sn};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==sn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+sn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+sn+"."),!0}function ln(r){var e,t,n=(e=qa[$a])===null||e===void 0?void 0:e.version;if(!(!n||!nT(n)))return(t=qa[$a])===null||t===void 0?void 0:t[r]}function Ei(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+sn+".");var t=qa[$a];t&&delete t[r]}var aD,$a,qa,Ka=We(()=>{"use strict";tT();Zm();oT();aD=sn.split(".")[0],$a=Symbol.for("opentelemetry.js.api."+aD),qa=QE});function Ya(r,e,t){var n=ln("diag");if(n)return t.unshift(e),n[r].apply(n,lD([],sD(t),!1))}var sD,lD,iT,aT=We(()=>{"use strict";Ka();sD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},lD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},iT=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ya("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ya("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ya("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ya("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Ya("verbose",this._namespace,e)},r}()});var Be,nc=We(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(Be||(Be={}))});function sT(r,e){r<Be.NONE?r=Be.NONE:r>Be.ALL&&(r=Be.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",Be.ERROR),warn:t("warn",Be.WARN),info:t("info",Be.INFO),debug:t("debug",Be.DEBUG),verbose:t("verbose",Be.VERBOSE)}}var lT=We(()=>{"use strict";nc()});var cD,uD,dD,zr,Xa=We(()=>{"use strict";aT();lT();nc();Ka();cD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},uD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},dD="diag",zr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=ln("diag");if(s)return s[o].apply(s,uD([],cD(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Be.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=ln("diag"),d=sT((s=i.logLevel)!==null&&s!==void 0?s:Be.INFO,o);if(u&&!i.suppressOverrideMessage){var m=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+m),d.warn("Current logger will overwrite one already registered from "+m)}return bi("diag",d,t,!0)};t.setLogger=n,t.disable=function(){Ei(dD,t)},t.createComponentLogger=function(o){return new iT(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var cT,uT=We(()=>{"use strict";cT=Symbol("BaggageEntryMetadata")});function ep(r){return typeof r!="string"&&(mD.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:cT,toString:function(){return r}}}var mD,dT=We(()=>{"use strict";Xa();uT();mD=zr.instance()});function tp(r){return Symbol.for(r)}var pD,rp,np=We(()=>{"use strict";pD=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),rp=new pD});function ap(){return ip}var fo,gD,oc,hD,fD,SD,yD,op,bD,ED,TD,ip,vD,AD,wD,CD,RD,xD,MD,sp=We(()=>{"use strict";fo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),gD=function(){function r(){}return r.prototype.createGauge=function(e,t){return AD},r.prototype.createHistogram=function(e,t){return wD},r.prototype.createCounter=function(e,t){return vD},r.prototype.createUpDownCounter=function(e,t){return CD},r.prototype.createObservableGauge=function(e,t){return xD},r.prototype.createObservableCounter=function(e,t){return RD},r.prototype.createObservableUpDownCounter=function(e,t){return MD},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),oc=function(){function r(){}return r}(),hD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(oc),fD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(oc),SD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(oc),yD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(oc),op=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),bD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(op),ED=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(op),TD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(op),ip=new gD,vD=new hD,AD=new SD,wD=new yD,CD=new fD,RD=new bD,xD=new ED,MD=new TD});var Kt,mT=We(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Kt||(Kt={}))});var _D,PD,pT,gT=We(()=>{"use strict";np();_D=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},PD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},pT=function(){function r(){}return r.prototype.active=function(){return rp},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,PD([n],_D(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var ID,OD,lp,LD,hT,fT=We(()=>{"use strict";gT();Ka();Xa();ID=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},OD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},lp="context",LD=new pT,hT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return bi(lp,e,zr.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,OD([e,t,n],ID(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return ln(lp)||LD},r.prototype.disable=function(){this._getContextManager().disable(),Ei(lp,zr.instance())},r}()});var Ti,ST=We(()=>{"use strict";fT();Ti=hT.getInstance()});var V,yT=We(()=>{"use strict";Xa();V=zr.instance()});var ND,bT,ET=We(()=>{"use strict";sp();ND=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return ip},r}(),bT=new ND});var cp,TT,vT=We(()=>{"use strict";ET();Ka();Xa();cp="metrics",TT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return bi(cp,e,zr.instance())},r.prototype.getMeterProvider=function(){return ln(cp)||bT},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){Ei(cp,zr.instance())},r}()});var ic,AT=We(()=>{"use strict";vT();ic=TT.getInstance()});var Le=We(()=>{"use strict";dT();np();nc();sp();mT();ST();yT();AT()});import{Argument as Qh,Command as rW,Option as nW}from"@commander-js/extra-typings";import tF from"appium";import{z as Ed}from"zod";var pW=Ed.object({input:Ed.string(),agentConfigVersion:Ed.string().optional()});import{z as lt}from"zod";var fW=lt.object({srcs:lt.array(lt.string()),urls:lt.array(lt.string()),desiredSrc:lt.string().optional(),desiredUrl:lt.string().optional()}),ef=lt.object({srcRegex:lt.string().optional(),urlRegex:lt.string().optional()}),tf=lt.object({x:lt.number(),y:lt.number(),correlation:lt.number()}),SW=lt.object({searchImageBase64String:lt.string(),pageImageBase64String:lt.string(),id:lt.string().uuid(),timeoutMs:lt.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as d_}from"zod-openapi";d_(N);var hn=(s=>(s.AI="AI",s.AI_HEALED="AI_HEALED",s.CLICK_TO_FIND="CLICK_TO_FIND",s.XY_PERCENT="XY_PERCENT",s.RECORDING="RECORDING",s.USER_CSS_SELECTOR="USER_CSS_SELECTOR",s.HEURISTIC_HEALED="HEURISTIC_HEALED",s))(hn||{}),m_=N.object({mPathSelectorTokens:N.string().array(),frameSrcRegex:N.string().optional(),frameUrlRegex:N.string().optional(),indices:N.number().array()}),ra=N.object({result:N.number(),traceId:N.string()}).array(),Zr=N.object({type:N.literal("GCS_TRACES"),traces:ra}),It=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(It||{}),rf=N.object({attributes:N.record(N.string(),N.string()).optional(),text:N.string().optional(),position:N.object({x1:N.number(),y1:N.number(),x2:N.number(),y2:N.number(),tolerance:N.nativeEnum(It)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(It)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),p_=N.object({selectors:N.string().array(),requirements:rf.optional()}),fn=N.object({id:N.number().int(),dataMomenticId:N.number().int().optional(),selector:N.string().optional(),hybridSelector:N.object({textContent:N.string().nullish(),attributes:N.record(N.string(),N.string().optional()),tagName:N.string(),expandShadowRoot:N.boolean().optional(),classNames:N.string().array(),nthChild:N.number()}).array().optional(),generatedSelectors:N.string().array().optional(),requirements:rf.optional(),additionalElements:p_.array().optional(),role:N.string().optional(),name:N.string().optional(),numChildren:N.number().optional(),content:N.string().optional(),pathFromRoot:N.string().optional(),serializedHtml:N.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:N.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:N.string().url().optional(),boundingBox:N.object({x:N.number().optional(),y:N.number().optional(),width:N.number(),height:N.number()}).describe("css pixel bounding box").optional(),frameCache:m_.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(hn).optional(),targetUpdateTime:N.string().optional(),targetUpdateLoggerTags:N.record(N.string(),N.string()).optional(),cacheResolutionUpdateSource:N.string().optional(),cacheResolutionUpdateTime:N.string().optional(),cacheResolutionUpdateLoggerTags:N.record(N.string(),N.string()).optional(),memory:Zr.optional()}).openapi({ref:"ElementTargetCache"});function qs(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var g_=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),h_=N.object({x:N.number(),y:N.number()}),f_=N.object({type:N.literal("coordinates"),pixels:h_}).openapi({ref:"CoordinatesTarget"});function Sn(r){return r.type==="description"}function Pr(r){return r.type==="coordinates"}var wt=N.discriminatedUnion("type",[g_,f_]).openapi({ref:"ElementTarget"});function Td(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function nf(r){return Zr.safeParse(r).success}import{v4 as ve}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as x_}from"zod-openapi";import{z as ue}from"zod";import{extendZodWithOpenApi as S_}from"zod-openapi";import{z as oa}from"zod";import of from"zod";var na=of.object({updatedAt:of.coerce.date().optional()});var ia=oa.object({result:oa.boolean(),traceId:oa.string()}).array(),aa=oa.object({type:oa.literal("GCS_TRACES"),traces:ia}),yn=na.extend({memory:aa.optional()});S_(ue);var af=ue.object({thoughts:ue.string(),result:ue.boolean(),relevantElements:ue.array(ue.number()).optional(),updatedMemory:ia.optional()}),Qt=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Qt||{});var y_=ue.object({type:ue.literal("ELEMENT_NAME"),negated:ue.boolean().optional(),operation:ue.nativeEnum(Qt),value:ue.string()}).openapi({ref:"ElementNameAssertion"}),b_=ue.object({type:ue.literal("ELEMENT_STYLE"),negated:ue.boolean().optional(),operation:ue.nativeEnum(Qt),property:ue.string(),value:ue.string()}).openapi({ref:"ElementStyleAssertion"}),E_=ue.object({type:ue.literal("ELEMENT_CONTENT"),negated:ue.boolean().optional(),operation:ue.nativeEnum(Qt),value:ue.string()}).openapi({ref:"ElementContentAssertion"}),T_=ue.object({type:ue.literal("ELEMENT_ATTRIBUTE"),negated:ue.boolean().optional(),operation:ue.nativeEnum(Qt),attr:ue.string(),value:ue.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ir=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Ir||{});var v_=ue.object({type:ue.literal("ELEMENT_EXISTENCE"),negated:ue.boolean().optional(),condition:ue.nativeEnum(Ir).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Ks=ue.discriminatedUnion("type",[E_,T_,v_,y_,b_]).openapi({ref:"ManualElementAssertion"});var A_=ue.object({type:ue.literal("CONTENT"),negated:ue.boolean().optional(),value:ue.string()}).openapi({ref:"PageContentAssertion"}),sf=ue.discriminatedUnion("type",[A_]).openapi({ref:"ManualPageAssertion"});import Ot from"zod";var vd=Ot.discriminatedUnion("type",[Ot.object({type:Ot.literal("SUBSTRING"),url:Ot.string()}),Ot.object({type:Ot.literal("GLOB"),glob:Ot.string()}),Ot.object({type:Ot.literal("REGEX"),regex:Ot.string()}),Ot.object({type:Ot.literal("DOMAIN"),domain:Ot.string()})]),sa=Ot.object({urlMatcher:vd,method:Ot.string().optional()});import{z as se}from"zod";var w_=se.object({type:se.literal("json"),content:se.string().describe("The JSON content to send in the request body")}),C_=se.object({type:se.literal("form-urlencoded"),content:se.record(se.string(),se.string()).describe("The form fields to send in the request body")}),R_=se.discriminatedUnion("type",[w_,C_]),Qn=se.object({url:se.string(),method:se.union([se.literal("GET"),se.literal("POST"),se.literal("PUT"),se.literal("DELETE"),se.literal("PATCH")]),headers:se.record(se.string(),se.string()).optional(),params:se.record(se.string(),se.string()).optional(),body:R_.optional(),timeout:se.number().int().optional().describe("Max seconds to wait for the request to complete")}),lf=se.object({url:se.string(),headers:se.record(se.string(),se.string()).optional(),query:se.string(),variables:se.string().optional(),timeout:se.number().int().optional().describe("Max seconds to wait for the request to complete")}),Ys=se.object({code:se.string(),fragment:se.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:se.union([se.literal("NODE"),se.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:se.number().int().max(60).optional().describe("Max seconds for the code to complete")});var nt=(Y=>(Y.AI_EXTRACT="AI_EXTRACT",Y.AI_ASSERTION="AI_ASSERTION",Y.AUTH_LOAD="AUTH_LOAD",Y.AUTH_SAVE="AUTH_SAVE",Y.BLUR="BLUR",Y.CAPTCHA="CAPTCHA",Y.CLICK="CLICK",Y.COOKIE="COOKIE",Y.COPY="COPY",Y.DIALOG="DIALOG",Y.DRAG="DRAG",Y.ELEMENT_CHECK="ELEMENT_CHECK",Y.FILE_UPLOAD="FILE_UPLOAD",Y.FOCUS="FOCUS",Y.GO_BACK="GO_BACK",Y.GO_FORWARD="GO_FORWARD",Y.HOVER="HOVER",Y.JAVASCRIPT="JAVASCRIPT",Y.LOCAL_STORAGE="LOCAL_STORAGE",Y.MOUSE_DRAG="MOUSE_DRAG",Y.NAVIGATE="NAVIGATE",Y.NEW_TAB="NEW_TAB",Y.PAGE_CHECK="PAGE_CHECK",Y.PASTE="PASTE",Y.PRESS="PRESS",Y.KEY_DOWN="KEY_DOWN",Y.KEY_UP="KEY_UP",Y.REFRESH="REFRESH",Y.REQUEST="REQUEST",Y.GRAPHQL_REQUEST="GRAPHQL_REQUEST",Y.SCROLL_DOWN="SCROLL_DOWN",Y.SCROLL_UP="SCROLL_UP",Y.SCROLL_LEFT="SCROLL_LEFT",Y.SCROLL_RIGHT="SCROLL_RIGHT",Y.SELECT_OPTION="SELECT_OPTION",Y.SWITCH_TAB="TAB",Y.TYPE="TYPE",Y.VISUAL_DIFF="VISUAL_DIFF",Y.WAIT="WAIT",Y.WAIT_FOR_URL="WAIT_FOR_URL",Y.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",Y.AWAIT_LISTENER="AWAIT_LISTENER",Y.RECORD_REQUESTS="RECORD_REQUESTS",Y.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",Y.SET_HEADER="SET_HEADER",Y.MOCK_ROUTE="MOCK_ROUTE",Y.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",Y.OFFLINE_MODE="OFFLINE_MODE",Y.SUCCESS="SUCCESS",Y))(nt||{});x_(S);var X=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),Zt=S.object({useSelector:S.boolean().optional(),force:S.boolean().optional(),disableCache:S.boolean().optional().describe("disable element caching for this step"),iframeUrl:S.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),er=na.extend({target:fn}).optional().openapi({ref:"SingleTargetCache"});function cf(r){return er.safeParse(r).success}var Xs=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),uf=X.merge(Xs).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),Js=Zt.merge(S.object({cache:er})),Zn=X.merge(Js.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),eo=X.merge(Js.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ho=X.merge(Js.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Go=X.merge(Js.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),YW=S.discriminatedUnion("type",[Zn,eo,Ho,Go]).openapi({ref:"AllScrollCommands"}),M_=X.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),df=X.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),__=S.object({caseInsensitive:S.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:S.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:S.number().int().optional().describe("Max seconds to wait for the URL to match")}),mf=X.extend({type:S.literal("WAIT_FOR_URL"),matcher:vd}).merge(__).openapi({ref:"WaitUrlCommand"}),pf=X.merge(Xs).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),gf=X.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),hf=X.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),P_=X.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),I_=X.extend({type:S.literal("AUTH_LOAD"),storageState:S.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),wd=X.merge(Zt).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),ff=X.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),Sf=X.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),yf=X.merge(Ys).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Vo=X.merge(Zt).extend({type:S.literal("CLICK"),target:wt,doubleClick:S.boolean().optional(),rightClick:S.boolean().optional(),waitForDownload:S.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:S.number().optional(),downloadTimeoutMs:S.number().optional(),cache:er,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),bf=na.extend({fromTarget:fn.optional(),toTarget:fn.optional()}),Wo=X.merge(Zt).merge(S.object({type:S.literal("DRAG"),fromTarget:wt,toTarget:wt,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:bf.optional()})).openapi({ref:"DragCommand"}),jo=X.merge(Zt).merge(S.object({type:S.literal("MOUSE_DRAG"),target:wt.optional(),deltaX:S.string().describe("pixels to move horizontally, can be template"),deltaY:S.string().describe("pixels to move vertically, can be template"),steps:S.number().optional(),cache:er})).openapi({ref:"MouseDragCommand"}),$o=X.merge(Zt).merge(S.object({type:S.literal("HOVER"),target:wt,cache:er})).openapi({ref:"HoverCommand"}),la=X.merge(Zt).merge(S.object({type:S.literal("FOCUS"),target:wt,cache:er})).openapi({ref:"FocusCommand"}),ca=X.merge(Zt).extend({type:S.literal("BLUR"),target:wt.optional(),cache:er}).openapi({ref:"BlurCommand"}),O_=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),L_=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),N_=X.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[O_,L_]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),Ef=S.discriminatedUnion("type",[S.object({type:S.literal("VALUE"),value:S.string()}),S.object({type:S.literal("LABEL"),label:S.string()}),S.object({type:S.literal("INDEX"),index:S.coerce.string()})]),qo=X.merge(Zt).extend({type:S.literal("SELECT_OPTION"),target:wt,cache:er,choice:Ef.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),Cd=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),ua=X.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:Cd.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:yn.optional()})).openapi({ref:"AIAssertionCommand"}),Lt=5,Ko=600,Yo=X.merge(Zt).extend({type:S.literal("ELEMENT_CHECK"),target:wt,assertion:Ks,cache:er.or(yn).optional(),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),Tf=X.extend({type:S.literal("PAGE_CHECK"),assertion:sf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),vf=X.merge(S.object({type:S.literal("AI_EXTRACT"),goal:S.string(),schema:S.string().optional(),envKey:S.string().optional(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional()})).openapi({ref:"AIExtractCommand"}),D_=S.object({clearContent:S.boolean().optional(),forceClearContent:S.boolean().optional(),delay:S.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:S.boolean().optional(),pressEnter:S.boolean().optional(),relativePosition:S.object({x:S.number(),y:S.number()}).optional()}),Af=25,Xo=X.merge(Zt).merge(D_).extend({type:S.literal("TYPE"),target:wt.optional(),value:S.string(),cache:er}).openapi({ref:"TypeCommand"}),wf=X.merge(S.object({type:S.literal("PRESS"),value:S.string(),repeat:S.number().optional(),convertMeta:S.boolean().optional(),delayMs:S.number().optional()})).openapi({ref:"PressCommand"}),Cf=X.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),Rf=X.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),k_=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),U_=S.object({type:S.literal("REGEX"),pattern:S.string()}),F_=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),B_=S.discriminatedUnion("type",[k_,U_,F_]),z_=X.merge(Xs).merge(S.object({type:S.literal("TAB"),action:B_})).openapi({ref:"TabCommand"}),xf=X.merge(Xs).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),H_=X.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),Mf=X.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),_f=X.extend({type:S.literal("REQUEST")}).merge(Qn).openapi({ref:"RequestCommand"}),Qs=S.object({status:S.number().optional(),headers:S.record(S.string(),S.string()),json:S.unknown().optional(),text:S.string().optional(),cookies:S.record(S.string(),S.unknown()).array().optional(),request:S.object({url:S.string(),method:S.string(),headers:S.record(S.string(),S.string()),json:S.unknown().optional()})}),Pf=X.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(lf).openapi({ref:"GraphQLRequestCommand"}),If=X.merge(S.object({type:S.literal("SUCCESS"),condition:ua.optional()})).openapi({ref:"SuccessCommand"}),Of=X.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),G_=S.object({data:S.string().describe("location at which to find a jpg"),width:S.number(),height:S.number()}),da=X.merge(Zt).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:wt.optional(),screenshot:G_.optional(),cache:er})).openapi({ref:"VisualDiffCommand"}),V_=X.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:sa,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),W_=X.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),j_=X.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:sa,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),$_=X.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),q_=X.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:sa.optional()})).openapi({ref:"SetHeaderCommand"}),K_=X.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:sa,responseGenerator:S.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:S.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:S.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),Y_=X.merge(S.object({type:S.literal("REMOVE_ROUTE_MOCK"),key:S.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),X_=X.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),J_=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],XW=[...J_,"DRAG"],Q_=S.discriminatedUnion("type",[Vo,Xo,wf,Cf,Rf,qo,uf,eo,Zn,ua,gf,$o,df]),Z_=S.discriminatedUnion("type",[...Q_.options,Wo]),eP=S.discriminatedUnion("type",[...Z_.options]),Lf=S.discriminatedUnion("type",[...eP.options,If]),Rd=S.discriminatedUnion("type",[If,Vo,Xo,wf,Cf,Rf,qo,uf,eo,Zn,ua,gf,$o,df,yf,Yo,Tf,xf,mf,vf,ff,hf,Mf,Wo,jo,Sf,pf,_f,Pf]),tP=S.discriminatedUnion("type",[vf,I_,P_,wd,H_,ff,M_,Yo,N_,hf,yf,Mf,jo,xf,Tf,Sf,pf,_f,Pf,Ho,Go,z_,da,la,ca,mf,V_,W_,j_,$_,q_,K_,Y_,X_]),Jo=S.discriminatedUnion("type",[...Lf.options,...tP.options]).openapi({ref:"Command"}),Zs=S.discriminatedUnion("type",[...Lf.options,Of]),JW=S.discriminatedUnion("type",[...Rd.options,Of]);function en(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:ve(),type:r};break;case"AUTH_LOAD":{e={id:ve(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:ve(),type:r,goal:""};break;case"DIALOG":e={id:ve(),type:r,action:"DISMISS"};break;case"DRAG":e={id:ve(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ve(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ve(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ve(),type:r,delay:1};break;case"BLUR":e={id:ve(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ve(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ve(),type:r,value:""};break;case"SELECT_OPTION":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ve(),type:r,url:""};case"TAB":e={id:ve(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ve(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ve(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ve(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:ve(),type:r,code:""};break;case"AI_ASSERTION":e={id:ve(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:ve(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:ve(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ve(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ve(),type:r,key:""};break}case"SET_HEADER":{e={id:ve(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ve(),type:r};break}case"OFFLINE_MODE":{e={id:ve(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Nf(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as rP}from"zod";var rj=rP.discriminatedUnion("type",[ca,wd,Vo,Wo,la,$o,jo,Zn,eo,Ho,Go,qo,Xo,da,Yo]);import{z as nP}from"zod";import{z as En}from"zod";function ma(r){return En.object({key:En.string(),testId:En.string().optional(),moduleId:En.string().optional(),organizationId:En.string(),value:r})}function pa(r){return ma(r).extend({uniqueKey:En.string()})}function el(r){return En.record(En.string(),pa(r))}var Nt={type:!0,cache:!0},Qo=nP.discriminatedUnion("type",[ua.pick(Nt),ca.pick(Nt),Vo.pick(Nt),Wo.pick(Nt),Yo.pick(Nt),la.pick(Nt),$o.pick(Nt),jo.pick(Nt),Zn.pick(Nt),eo.pick(Nt),Ho.pick(Nt),Go.pick(Nt),qo.pick(Nt),Xo.pick(Nt),da.pick(Nt)]),xd=Object.values(nt).filter(r=>Qo.options.some(e=>e.shape.type.safeParse(r).success));Jo.options.forEach(r=>{if("target"in r.shape&&!xd.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function Md(r){return xd.includes(r.type)}var Df=ma(Qo),kf=pa(Qo),uj=el(Qo);import{v4 as u2}from"uuid";import{z as T}from"zod";var Ff=Symbol("Let zodToJsonSchema decide on which parser to use");var Uf={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},Bf=r=>typeof r=="string"?{...Uf,name:r}:{...Uf,...r};var zf=r=>{let e=Bf(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function _d(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function he(r,e,t,n,o){r[e]=t,_d(r,e,n,o)}var tl=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as pe}from"zod";function ze(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?tl(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as oP}from"zod";function Hf(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==oP.ZodAny&&(t.items=J(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&he(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&he(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(he(t,"minItems",r.exactLength.value,r.exactLength.message,e),he(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function Gf(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?he(t,"minimum",n.value,n.message,e):he(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),he(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?he(t,"maximum",n.value,n.message,e):he(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),he(t,"maximum",n.value,n.message,e));break;case"multipleOf":he(t,"multipleOf",n.value,n.message,e);break}return t}function Vf(){return{type:"boolean"}}function rl(r,e){return J(r.type._def,e)}var Wf=(r,e)=>J(r.innerType._def,e);function Pd(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Pd(r,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return iP(r,e)}}var iP=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":he(t,"minimum",n.value,n.message,e);break;case"max":he(t,"maximum",n.value,n.message,e);break}return t};function jf(r,e){return{...J(r.innerType._def,e),default:r.defaultValue()}}function $f(r,e){return e.effectStrategy==="input"?J(r.schema._def,e):ze(e)}function qf(r){return{type:"string",enum:Array.from(r.values)}}var aP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function Kf(r,e){let t=[J(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),J(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(aP(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function Yf(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as ga}from"zod";var Id,br={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Id===void 0&&(Id=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Id),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function nl(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":he(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":he(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Er(t,"email",n.message,e);break;case"format:idn-email":Er(t,"idn-email",n.message,e);break;case"pattern:zod":Dt(t,br.email,n.message,e);break}break;case"url":Er(t,"uri",n.message,e);break;case"uuid":Er(t,"uuid",n.message,e);break;case"regex":Dt(t,n.regex,n.message,e);break;case"cuid":Dt(t,br.cuid,n.message,e);break;case"cuid2":Dt(t,br.cuid2,n.message,e);break;case"startsWith":Dt(t,RegExp(`^${Od(n.value,e)}`),n.message,e);break;case"endsWith":Dt(t,RegExp(`${Od(n.value,e)}$`),n.message,e);break;case"datetime":Er(t,"date-time",n.message,e);break;case"date":Er(t,"date",n.message,e);break;case"time":Er(t,"time",n.message,e);break;case"duration":Er(t,"duration",n.message,e);break;case"length":he(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),he(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Dt(t,RegExp(Od(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Er(t,"ipv4",n.message,e),n.version!=="v4"&&Er(t,"ipv6",n.message,e);break}case"base64url":Dt(t,br.base64url,n.message,e);break;case"jwt":Dt(t,br.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Dt(t,br.ipv4Cidr,n.message,e),n.version!=="v4"&&Dt(t,br.ipv6Cidr,n.message,e);break}case"emoji":Dt(t,br.emoji(),n.message,e);break;case"ulid":{Dt(t,br.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Er(t,"binary",n.message,e);break}case"contentEncoding:base64":{he(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Dt(t,br.base64,n.message,e);break}}break}case"nanoid":Dt(t,br.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Od(r,e){return e.patternStrategy==="escape"?lP(r):r}var sP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function lP(r){let e="";for(let t=0;t<r.length;t++)sP.has(r[t])||(e+="\\"),e+=r[t];return e}function Er(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):he(r,"format",e,t,n)}function Dt(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:Xf(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):he(r,"pattern",Xf(e,n),t,n)}function Xf(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(t.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
2
+ var h_=Object.defineProperty;var We=(r,e)=>()=>(r&&(e=r(r=0)),e);var f_=(r,e)=>{for(var t in e)h_(r,t,{get:e[t],enumerable:!0})};var nT,oT=We(()=>{"use strict";nT=typeof globalThis=="object"?globalThis:global});var iT=We(()=>{"use strict";oT()});var aT=We(()=>{"use strict";iT()});var ln,ep=We(()=>{"use strict";ln="1.9.0"});function mD(r){var e=new Set([r]),t=new Set,n=r.match(sT);if(!n)return function(){return!1};var o={major:+n[1],minor:+n[2],patch:+n[3],prerelease:n[4]};if(o.prerelease!=null)return function(c){return c===r};function i(s){return t.add(s),!1}function a(s){return e.add(s),!0}return function(c){if(e.has(c))return!0;if(t.has(c))return!1;var l=c.match(sT);if(!l)return i(c);var u={major:+l[1],minor:+l[2],patch:+l[3],prerelease:l[4]};return u.prerelease!=null||o.major!==u.major?i(c):o.major===0?o.minor===u.minor&&o.patch<=u.patch?a(c):i(c):o.minor<=u.minor?a(c):i(c)}}var sT,lT,cT=We(()=>{"use strict";ep();sT=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;lT=mD(ln)});function bi(r,e,t,n){var o;n===void 0&&(n=!1);var i=Ka[qa]=(o=Ka[qa])!==null&&o!==void 0?o:{version:ln};if(!n&&i[r]){var a=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+r);return t.error(a.stack||a.message),!1}if(i.version!==ln){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+ln);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+ln+"."),!0}function cn(r){var e,t,n=(e=Ka[qa])===null||e===void 0?void 0:e.version;if(!(!n||!lT(n)))return(t=Ka[qa])===null||t===void 0?void 0:t[r]}function Ei(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+ln+".");var t=Ka[qa];t&&delete t[r]}var pD,qa,Ka,Ya=We(()=>{"use strict";aT();ep();cT();pD=ln.split(".")[0],qa=Symbol.for("opentelemetry.js.api."+pD),Ka=nT});function Xa(r,e,t){var n=cn("diag");if(n)return t.unshift(e),n[r].apply(n,hD([],gD(t),!1))}var gD,hD,uT,dT=We(()=>{"use strict";Ya();gD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},hD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},uT=function(){function r(e){this._namespace=e.namespace||"DiagComponentLogger"}return r.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xa("verbose",this._namespace,e)},r}()});var Be,ic=We(()=>{"use strict";(function(r){r[r.NONE=0]="NONE",r[r.ERROR=30]="ERROR",r[r.WARN=50]="WARN",r[r.INFO=60]="INFO",r[r.DEBUG=70]="DEBUG",r[r.VERBOSE=80]="VERBOSE",r[r.ALL=9999]="ALL"})(Be||(Be={}))});function mT(r,e){r<Be.NONE?r=Be.NONE:r>Be.ALL&&(r=Be.ALL),e=e||{};function t(n,o){var i=e[n];return typeof i=="function"&&r>=o?i.bind(e):function(){}}return{error:t("error",Be.ERROR),warn:t("warn",Be.WARN),info:t("info",Be.INFO),debug:t("debug",Be.DEBUG),verbose:t("verbose",Be.VERBOSE)}}var pT=We(()=>{"use strict";ic()});var fD,SD,yD,Hr,Ja=We(()=>{"use strict";dT();pT();ic();Ya();fD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},SD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},yD="diag",Hr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=cn("diag");if(s)return s[o].apply(s,SD([],fD(i),!1))}}var t=this,n=function(o,i){var a,s,c;if(i===void 0&&(i={logLevel:Be.INFO}),o===t){var l=new Error("Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation");return t.error((a=l.stack)!==null&&a!==void 0?a:l.message),!1}typeof i=="number"&&(i={logLevel:i});var u=cn("diag"),d=mT((s=i.logLevel)!==null&&s!==void 0?s:Be.INFO,o);if(u&&!i.suppressOverrideMessage){var m=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+m),d.warn("Current logger will overwrite one already registered from "+m)}return bi("diag",d,t,!0)};t.setLogger=n,t.disable=function(){Ei(yD,t)},t.createComponentLogger=function(o){return new uT(o)},t.verbose=e("verbose"),t.debug=e("debug"),t.info=e("info"),t.warn=e("warn"),t.error=e("error")}return r.instance=function(){return this._instance||(this._instance=new r),this._instance},r}()});var gT,hT=We(()=>{"use strict";gT=Symbol("BaggageEntryMetadata")});function tp(r){return typeof r!="string"&&(bD.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:gT,toString:function(){return r}}}var bD,fT=We(()=>{"use strict";Ja();hT();bD=Hr.instance()});function rp(r){return Symbol.for(r)}var ED,np,op=We(()=>{"use strict";ED=function(){function r(e){var t=this;t._currentContext=e?new Map(e):new Map,t.getValue=function(n){return t._currentContext.get(n)},t.setValue=function(n,o){var i=new r(t._currentContext);return i._currentContext.set(n,o),i},t.deleteValue=function(n){var o=new r(t._currentContext);return o._currentContext.delete(n),o}}return r}(),np=new ED});function sp(){return ap}var fo,TD,ac,vD,AD,wD,CD,ip,RD,xD,MD,ap,_D,PD,ID,OD,LD,ND,DD,lp=We(()=>{"use strict";fo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),TD=function(){function r(){}return r.prototype.createGauge=function(e,t){return PD},r.prototype.createHistogram=function(e,t){return ID},r.prototype.createCounter=function(e,t){return _D},r.prototype.createUpDownCounter=function(e,t){return OD},r.prototype.createObservableGauge=function(e,t){return ND},r.prototype.createObservableCounter=function(e,t){return LD},r.prototype.createObservableUpDownCounter=function(e,t){return DD},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),ac=function(){function r(){}return r}(),vD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(ac),AD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(ac),wD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(ac),CD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(ac),ip=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),RD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),xD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),MD=function(r){fo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(ip),ap=new TD,_D=new vD,PD=new wD,ID=new CD,OD=new AD,LD=new RD,ND=new xD,DD=new MD});var Kt,ST=We(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Kt||(Kt={}))});var kD,UD,yT,bT=We(()=>{"use strict";op();kD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},UD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},yT=function(){function r(){}return r.prototype.active=function(){return np},r.prototype.with=function(e,t,n){for(var o=[],i=3;i<arguments.length;i++)o[i-3]=arguments[i];return t.call.apply(t,UD([n],kD(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var FD,BD,cp,zD,ET,TT=We(()=>{"use strict";bT();Ya();Ja();FD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BD=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},cp="context",zD=new yT,ET=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return bi(cp,e,Hr.instance())},r.prototype.active=function(){return this._getContextManager().active()},r.prototype.with=function(e,t,n){for(var o,i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a];return(o=this._getContextManager()).with.apply(o,BD([e,t,n],FD(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return cn(cp)||zD},r.prototype.disable=function(){this._getContextManager().disable(),Ei(cp,Hr.instance())},r}()});var Ti,vT=We(()=>{"use strict";TT();Ti=ET.getInstance()});var V,AT=We(()=>{"use strict";Ja();V=Hr.instance()});var HD,wT,CT=We(()=>{"use strict";lp();HD=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return ap},r}(),wT=new HD});var up,RT,xT=We(()=>{"use strict";CT();Ya();Ja();up="metrics",RT=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return bi(up,e,Hr.instance())},r.prototype.getMeterProvider=function(){return cn(up)||wT},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){Ei(up,Hr.instance())},r}()});var sc,MT=We(()=>{"use strict";xT();sc=RT.getInstance()});var Le=We(()=>{"use strict";fT();op();ic();lp();ST();vT();AT();MT()});import{Argument as Zh,Command as cW,Option as uW}from"@commander-js/extra-typings";import lF from"appium";import{z as vd}from"zod";var EW=vd.object({input:vd.string(),agentConfigVersion:vd.string().optional()});import{z as ct}from"zod";var AW=ct.object({srcs:ct.array(ct.string()),urls:ct.array(ct.string()),desiredSrc:ct.string().optional(),desiredUrl:ct.string().optional()}),tf=ct.object({srcRegex:ct.string().optional(),urlRegex:ct.string().optional()}),rf=ct.object({x:ct.number(),y:ct.number(),correlation:ct.number()}),wW=ct.object({searchImageBase64String:ct.string(),pageImageBase64String:ct.string(),id:ct.string().uuid(),timeoutMs:ct.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as S_}from"zod-openapi";S_(N);var fn=(s=>(s.AI="AI",s.AI_HEALED="AI_HEALED",s.CLICK_TO_FIND="CLICK_TO_FIND",s.XY_PERCENT="XY_PERCENT",s.RECORDING="RECORDING",s.USER_CSS_SELECTOR="USER_CSS_SELECTOR",s.HEURISTIC_HEALED="HEURISTIC_HEALED",s))(fn||{}),y_=N.object({mPathSelectorTokens:N.string().array(),frameSrcRegex:N.string().optional(),frameUrlRegex:N.string().optional(),indices:N.number().array()}),ta=N.object({result:N.number(),traceId:N.string()}).array(),en=N.object({type:N.literal("GCS_TRACES"),traces:ta}),It=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(It||{}),nf=N.object({attributes:N.record(N.string(),N.string()).optional(),text:N.string().optional(),position:N.object({x1:N.number(),y1:N.number(),x2:N.number(),y2:N.number(),tolerance:N.nativeEnum(It)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(It)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),b_=N.object({selectors:N.string().array(),requirements:nf.optional()}),Sn=N.object({id:N.number().int(),dataMomenticId:N.number().int().optional(),selector:N.string().optional(),hybridSelector:N.object({textContent:N.string().nullish(),attributes:N.record(N.string(),N.string().optional()),tagName:N.string(),expandShadowRoot:N.boolean().optional(),classNames:N.string().array(),nthChild:N.number()}).array().optional(),generatedSelectors:N.string().array().optional(),requirements:nf.optional(),additionalElements:b_.array().optional(),role:N.string().optional(),name:N.string().optional(),numChildren:N.number().optional(),content:N.string().optional(),pathFromRoot:N.string().optional(),serializedHtml:N.string().optional().describe("pruned html including 1 neighbor and 1 layer of children. value for text inputs pruned."),nodeOnlySerializedHtml:N.string().optional().describe("outerHtml of the element without any children. value for text inputs pruned."),screenshotUrl:N.string().url().optional(),boundingBox:N.object({x:N.number().optional(),y:N.number().optional(),width:N.number(),height:N.number()}).describe("css pixel bounding box").optional(),frameCache:y_.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(fn).optional(),targetUpdateTime:N.string().optional(),targetUpdateLoggerTags:N.record(N.string(),N.string()).optional(),cacheResolutionUpdateSource:N.string().optional(),cacheResolutionUpdateTime:N.string().optional(),cacheResolutionUpdateLoggerTags:N.record(N.string(),N.string()).optional(),memory:en.optional()}).openapi({ref:"ElementTargetCache"});function Ks(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var E_=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),T_=N.object({x:N.number(),y:N.number()}),v_=N.object({type:N.literal("coordinates"),pixels:T_}).openapi({ref:"CoordinatesTarget"});function yn(r){return r.type==="description"}function Ir(r){return r.type==="coordinates"}var wt=N.discriminatedUnion("type",[E_,v_]).openapi({ref:"ElementTarget"});function Ad(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function of(r){return en.safeParse(r).success}import{v4 as ve}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as L_}from"zod-openapi";import{z as de}from"zod";import{extendZodWithOpenApi as A_}from"zod-openapi";import{z as na}from"zod";import af from"zod";var ra=af.object({updatedAt:af.coerce.date().optional()});var oa=na.object({result:na.boolean(),traceId:na.string()}).array(),ia=na.object({type:na.literal("GCS_TRACES"),traces:oa}),bn=ra.extend({memory:ia.optional()});A_(de);var sf=de.object({thoughts:de.string(),result:de.boolean(),relevantElements:de.array(de.number()).optional(),updatedMemory:oa.optional()}),Qt=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(Qt||{});var w_=de.object({type:de.literal("ELEMENT_NAME"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),value:de.string()}).openapi({ref:"ElementNameAssertion"}),C_=de.object({type:de.literal("ELEMENT_STYLE"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),property:de.string(),value:de.string()}).openapi({ref:"ElementStyleAssertion"}),R_=de.object({type:de.literal("ELEMENT_CONTENT"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),value:de.string()}).openapi({ref:"ElementContentAssertion"}),x_=de.object({type:de.literal("ELEMENT_ATTRIBUTE"),negated:de.boolean().optional(),operation:de.nativeEnum(Qt),attr:de.string(),value:de.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Or=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Or||{});var M_=de.object({type:de.literal("ELEMENT_EXISTENCE"),negated:de.boolean().optional(),condition:de.nativeEnum(Or).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Ys=de.discriminatedUnion("type",[R_,x_,M_,w_,C_]).openapi({ref:"ManualElementAssertion"});var __=de.object({type:de.literal("CONTENT"),negated:de.boolean().optional(),value:de.string()}).openapi({ref:"PageContentAssertion"}),lf=de.discriminatedUnion("type",[__]).openapi({ref:"ManualPageAssertion"});import Ot from"zod";var wd=Ot.discriminatedUnion("type",[Ot.object({type:Ot.literal("SUBSTRING"),url:Ot.string()}),Ot.object({type:Ot.literal("GLOB"),glob:Ot.string()}),Ot.object({type:Ot.literal("REGEX"),regex:Ot.string()}),Ot.object({type:Ot.literal("DOMAIN"),domain:Ot.string()})]),aa=Ot.object({urlMatcher:wd,method:Ot.string().optional()});import{z as le}from"zod";var P_=le.object({type:le.literal("json"),content:le.string().describe("The JSON content to send in the request body")}),I_=le.object({type:le.literal("form-urlencoded"),content:le.record(le.string(),le.string()).describe("The form fields to send in the request body")}),O_=le.discriminatedUnion("type",[P_,I_]),Qn=le.object({url:le.string(),method:le.union([le.literal("GET"),le.literal("POST"),le.literal("PUT"),le.literal("DELETE"),le.literal("PATCH")]),headers:le.record(le.string(),le.string()).optional(),params:le.record(le.string(),le.string()).optional(),body:O_.optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),cf=le.object({url:le.string(),headers:le.record(le.string(),le.string()).optional(),query:le.string(),variables:le.string().optional(),timeout:le.number().int().optional().describe("Max seconds to wait for the request to complete")}),Xs=le.object({code:le.string(),fragment:le.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:le.union([le.literal("NODE"),le.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:le.number().int().max(60).optional().describe("Max seconds for the code to complete")});var nt=(Y=>(Y.AI_EXTRACT="AI_EXTRACT",Y.AI_ASSERTION="AI_ASSERTION",Y.AUTH_LOAD="AUTH_LOAD",Y.AUTH_SAVE="AUTH_SAVE",Y.BLUR="BLUR",Y.CAPTCHA="CAPTCHA",Y.CLICK="CLICK",Y.COOKIE="COOKIE",Y.COPY="COPY",Y.DIALOG="DIALOG",Y.DRAG="DRAG",Y.ELEMENT_CHECK="ELEMENT_CHECK",Y.FILE_UPLOAD="FILE_UPLOAD",Y.FOCUS="FOCUS",Y.GO_BACK="GO_BACK",Y.GO_FORWARD="GO_FORWARD",Y.HOVER="HOVER",Y.JAVASCRIPT="JAVASCRIPT",Y.LOCAL_STORAGE="LOCAL_STORAGE",Y.MOUSE_DRAG="MOUSE_DRAG",Y.NAVIGATE="NAVIGATE",Y.NEW_TAB="NEW_TAB",Y.PAGE_CHECK="PAGE_CHECK",Y.PASTE="PASTE",Y.PRESS="PRESS",Y.KEY_DOWN="KEY_DOWN",Y.KEY_UP="KEY_UP",Y.REFRESH="REFRESH",Y.REQUEST="REQUEST",Y.GRAPHQL_REQUEST="GRAPHQL_REQUEST",Y.SCROLL_DOWN="SCROLL_DOWN",Y.SCROLL_UP="SCROLL_UP",Y.SCROLL_LEFT="SCROLL_LEFT",Y.SCROLL_RIGHT="SCROLL_RIGHT",Y.SELECT_OPTION="SELECT_OPTION",Y.SWITCH_TAB="TAB",Y.TYPE="TYPE",Y.VISUAL_DIFF="VISUAL_DIFF",Y.WAIT="WAIT",Y.WAIT_FOR_URL="WAIT_FOR_URL",Y.REGISTER_REQUEST_LISTENER="REGISTER_REQUEST_LISTENER",Y.AWAIT_LISTENER="AWAIT_LISTENER",Y.RECORD_REQUESTS="RECORD_REQUESTS",Y.GET_RECORDED_REQUESTS="GET_RECORDED_REQUESTS",Y.SET_HEADER="SET_HEADER",Y.MOCK_ROUTE="MOCK_ROUTE",Y.REMOVE_ROUTE_MOCK="REMOVE_ROUTE_MOCK",Y.OFFLINE_MODE="OFFLINE_MODE",Y.SUCCESS="SUCCESS",Y))(nt||{});L_(S);var X=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),Zt=S.object({useSelector:S.boolean().optional(),force:S.boolean().optional(),disableCache:S.boolean().optional().describe("disable element caching for this step"),iframeUrl:S.string().optional().describe("url or url regex for the iframe")}).openapi({ref:"CommonTargetingOptions"}),er=ra.extend({target:Sn}).optional().openapi({ref:"SingleTargetCache"});function uf(r){return er.safeParse(r).success}var Js=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),df=X.merge(Js).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),Qs=Zt.merge(S.object({cache:er})),Zn=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),eo=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),Ho=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),Go=X.merge(Qs.merge(S.object({target:wt.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),rj=S.discriminatedUnion("type",[Zn,eo,Ho,Go]).openapi({ref:"AllScrollCommands"}),N_=X.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),mf=X.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),D_=S.object({caseInsensitive:S.boolean().optional().describe("Whether to ignore case when matching the URL"),negated:S.boolean().optional().describe("Wait for the URL to NOT match the provided matcher instead."),timeout:S.number().int().optional().describe("Max seconds to wait for the URL to match")}),pf=X.extend({type:S.literal("WAIT_FOR_URL"),matcher:wd}).merge(D_).openapi({ref:"WaitUrlCommand"}),gf=X.merge(Js).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),hf=X.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),ff=X.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),k_=X.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),U_=X.extend({type:S.literal("AUTH_LOAD"),storageState:S.string().describe("JSON string auth state. Leave blank or set to the empty string to clear all existing authentication.")}).openapi({ref:"AuthLoadCommand"}),Rd=X.merge(Zt).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Sf=X.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),yf=X.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),bf=X.merge(Xs).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),Vo=X.merge(Zt).extend({type:S.literal("CLICK"),target:wt,doubleClick:S.boolean().optional(),rightClick:S.boolean().optional(),waitForDownload:S.boolean().optional().describe("Wait for the click to trigger a file download and for the file download to complete."),delayMs:S.number().optional(),downloadTimeoutMs:S.number().optional(),cache:er,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),Ef=ra.extend({fromTarget:Sn.optional(),toTarget:Sn.optional()}),Wo=X.merge(Zt).merge(S.object({type:S.literal("DRAG"),fromTarget:wt,toTarget:wt,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:Ef.optional()})).openapi({ref:"DragCommand"}),jo=X.merge(Zt).merge(S.object({type:S.literal("MOUSE_DRAG"),target:wt.optional(),deltaX:S.string().describe("pixels to move horizontally, can be template"),deltaY:S.string().describe("pixels to move vertically, can be template"),steps:S.number().optional(),cache:er})).openapi({ref:"MouseDragCommand"}),$o=X.merge(Zt).merge(S.object({type:S.literal("HOVER"),target:wt,cache:er})).openapi({ref:"HoverCommand"}),sa=X.merge(Zt).merge(S.object({type:S.literal("FOCUS"),target:wt,cache:er})).openapi({ref:"FocusCommand"}),la=X.merge(Zt).extend({type:S.literal("BLUR"),target:wt.optional(),cache:er}).openapi({ref:"BlurCommand"}),F_=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),B_=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),z_=X.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[F_,B_]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),Tf=S.discriminatedUnion("type",[S.object({type:S.literal("VALUE"),value:S.string()}),S.object({type:S.literal("LABEL"),label:S.string()}),S.object({type:S.literal("INDEX"),index:S.coerce.string()})]),qo=X.merge(Zt).extend({type:S.literal("SELECT_OPTION"),target:wt,cache:er,choice:Tf.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),xd=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),ca=X.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:xd.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:bn.optional()})).openapi({ref:"AIAssertionCommand"}),Lt=5,Ko=600,Yo=X.merge(Zt).extend({type:S.literal("ELEMENT_CHECK"),target:wt,assertion:Ys,cache:er.or(bn).optional(),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),vf=X.extend({type:S.literal("PAGE_CHECK"),assertion:lf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),Af=X.merge(S.object({type:S.literal("AI_EXTRACT"),goal:S.string(),schema:S.string().optional(),envKey:S.string().optional(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional()})).openapi({ref:"AIExtractCommand"}),H_=S.object({clearContent:S.boolean().optional(),forceClearContent:S.boolean().optional(),delay:S.number().min(0).max(1e3).optional().describe("Delay between each press in milliseconds."),force:S.boolean().optional(),pressEnter:S.boolean().optional(),relativePosition:S.object({x:S.number(),y:S.number()}).optional()}),wf=25,Xo=X.merge(Zt).merge(H_).extend({type:S.literal("TYPE"),target:wt.optional(),value:S.string(),cache:er}).openapi({ref:"TypeCommand"}),Cf=X.merge(S.object({type:S.literal("PRESS"),value:S.string(),repeat:S.number().optional(),convertMeta:S.boolean().optional(),delayMs:S.number().optional()})).openapi({ref:"PressCommand"}),Rf=X.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),xf=X.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),G_=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),V_=S.object({type:S.literal("REGEX"),pattern:S.string()}),W_=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),j_=S.discriminatedUnion("type",[G_,V_,W_]),$_=X.merge(Js).merge(S.object({type:S.literal("TAB"),action:j_})).openapi({ref:"TabCommand"}),Mf=X.merge(Js).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),q_=X.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),_f=X.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),Pf=X.extend({type:S.literal("REQUEST")}).merge(Qn).openapi({ref:"RequestCommand"}),Zs=S.object({status:S.number().optional(),headers:S.record(S.string(),S.string()),json:S.unknown().optional(),text:S.string().optional(),cookies:S.record(S.string(),S.unknown()).array().optional(),request:S.object({url:S.string(),method:S.string(),headers:S.record(S.string(),S.string()),json:S.unknown().optional()})}),If=X.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(cf).openapi({ref:"GraphQLRequestCommand"}),Of=X.merge(S.object({type:S.literal("SUCCESS"),condition:ca.optional()})).openapi({ref:"SuccessCommand"}),Lf=X.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),K_=S.object({data:S.string().describe("location at which to find a jpg"),width:S.number(),height:S.number()}),ua=X.merge(Zt).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:wt.optional(),screenshot:K_.optional(),cache:er})).openapi({ref:"VisualDiffCommand"}),Y_=X.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:aa,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),X_=X.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),J_=X.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:aa,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),Q_=X.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),Z_=X.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:aa.optional()})).openapi({ref:"SetHeaderCommand"}),eP=X.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:aa,responseGenerator:S.string().describe("JavaScript code to generate a response"),fetchOriginalResponse:S.boolean().optional().describe("Whether to fetch the real response and pass it to the response generator. If enabled, the original response will be available as `response` in the code."),key:S.string().optional().describe("Key to reference this mock. This only needs to be set if you plan to remove the mock later in the test.")}).openapi({ref:"MockRouteCommandOptions"})),tP=X.merge(S.object({type:S.literal("REMOVE_ROUTE_MOCK"),key:S.string().optional().describe("Key of the mock to remove. If not set, all route mocks will be removed.")}).openapi({ref:"RemoveRouteMockCommandOptions"})),rP=X.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),nP=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],nj=[...nP,"DRAG"],oP=S.discriminatedUnion("type",[Vo,Xo,Cf,Rf,xf,qo,df,eo,Zn,ca,hf,$o,mf]),iP=S.discriminatedUnion("type",[...oP.options,Wo]),aP=S.discriminatedUnion("type",[...iP.options]),Nf=S.discriminatedUnion("type",[...aP.options,Of]),Md=S.discriminatedUnion("type",[Of,Vo,Xo,Cf,Rf,xf,qo,df,eo,Zn,ca,hf,$o,mf,bf,Yo,vf,Mf,pf,Af,Sf,ff,_f,Wo,jo,yf,gf,Pf,If]),sP=S.discriminatedUnion("type",[Af,U_,k_,Rd,q_,Sf,N_,Yo,z_,ff,bf,_f,jo,Mf,vf,yf,gf,Pf,If,Ho,Go,$_,ua,sa,la,pf,Y_,X_,J_,Q_,Z_,eP,tP,rP]),Jo=S.discriminatedUnion("type",[...Nf.options,...sP.options]).openapi({ref:"Command"}),el=S.discriminatedUnion("type",[...Nf.options,Lf]),oj=S.discriminatedUnion("type",[...Md.options,Lf]);function tn(r){let e;switch(r){case"PASTE":case"AUTH_SAVE":case"VISUAL_DIFF":case"SUCCESS":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"CAPTCHA":case"GO_BACK":case"GO_FORWARD":case"REFRESH":e={id:ve(),type:r};break;case"AUTH_LOAD":{e={id:ve(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:ve(),type:r,goal:""};break;case"DIALOG":e={id:ve(),type:r,action:"DISMISS"};break;case"DRAG":e={id:ve(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:ve(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:ve(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:ve(),type:r,delay:1};break;case"BLUR":e={id:ve(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:ve(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:ve(),type:r,value:""};break;case"SELECT_OPTION":e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:ve(),type:r,url:""};case"TAB":e={id:ve(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:ve(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:ve(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:ve(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:ve(),type:r,code:""};break;case"AI_ASSERTION":e={id:ve(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:ve(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:ve(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:ve(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:ve(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:ve(),type:r,key:""};break}case"SET_HEADER":{e={id:ve(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:ve(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:ve(),type:r};break}case"OFFLINE_MODE":{e={id:ve(),type:r,enable:!0};break}default:return(n=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}return e}function Df(r){switch(r.type){case"BLUR":case"CLICK":case"DRAG":case"FOCUS":case"HOVER":case"MOUSE_DRAG":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"SCROLL_DOWN":case"SCROLL_UP":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"TYPE":return!0;case"AUTH_LOAD":case"AUTH_SAVE":case"AWAIT_LISTENER":case"SUCCESS":case"AI_ASSERTION":case"AI_EXTRACT":case"CAPTCHA":case"COOKIE":case"COPY":case"DIALOG":case"ELEMENT_CHECK":case"FILE_UPLOAD":case"GET_RECORDED_REQUESTS":case"GO_BACK":case"GO_FORWARD":case"GRAPHQL_REQUEST":case"JAVASCRIPT":case"LOCAL_STORAGE":case"NAVIGATE":case"NEW_TAB":case"PASTE":case"PAGE_CHECK":case"RECORD_REQUESTS":case"REGISTER_REQUEST_LISTENER":case"REFRESH":case"REQUEST":case"SELECT_OPTION":case"SET_HEADER":case"TAB":case"VISUAL_DIFF":case"WAIT":case"WAIT_FOR_URL":case"OFFLINE_MODE":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":return!1;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}import{z as lP}from"zod";var cj=lP.discriminatedUnion("type",[la,Rd,Vo,Wo,sa,$o,jo,Zn,eo,Ho,Go,qo,Xo,ua,Yo]);import{z as cP}from"zod";import{z as Tn}from"zod";function da(r){return Tn.object({key:Tn.string(),testId:Tn.string().optional(),moduleId:Tn.string().optional(),organizationId:Tn.string(),value:r})}function ma(r){return da(r).extend({uniqueKey:Tn.string()})}function tl(r){return Tn.record(Tn.string(),ma(r))}var Nt={type:!0,cache:!0},Qo=cP.discriminatedUnion("type",[ca.pick(Nt),la.pick(Nt),Vo.pick(Nt),Wo.pick(Nt),Yo.pick(Nt),sa.pick(Nt),$o.pick(Nt),jo.pick(Nt),Zn.pick(Nt),eo.pick(Nt),Ho.pick(Nt),Go.pick(Nt),qo.pick(Nt),Xo.pick(Nt),ua.pick(Nt)]),_d=Object.values(nt).filter(r=>Qo.options.some(e=>e.shape.type.safeParse(r).success));Jo.options.forEach(r=>{if("target"in r.shape&&!_d.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function Pd(r){return _d.includes(r.type)}var kf=da(Qo),Uf=ma(Qo),Sj=tl(Qo);import{v4 as S2}from"uuid";import{z as T}from"zod";var Bf=Symbol("Let zodToJsonSchema decide on which parser to use");var Ff={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"},zf=r=>typeof r=="string"?{...Ff,name:r}:{...Ff,...r};var Hf=r=>{let e=zf(r),t=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:t,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...e.basePath,e.definitionPath,n],jsonSchema:void 0}]))}};function Id(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function fe(r,e,t,n,o){r[e]=t,Id(r,e,n,o)}var rl=(r,e)=>{let t=0;for(;t<r.length&&t<e.length&&r[t]===e[t];t++);return[(r.length-t).toString(),...e.slice(t)].join("/")};import{ZodFirstPartyTypeKind as ge}from"zod";function ze(r){if(r.target!=="openAi")return{};let e=[...r.basePath,r.definitionPath,r.openAiAnyTypeName];return r.flags.hasReferencedOpenAiAnyType=!0,{$ref:r.$refStrategy==="relative"?rl(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as uP}from"zod";function Gf(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==uP.ZodAny&&(t.items=J(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&fe(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&fe(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(fe(t,"minItems",r.exactLength.value,r.exactLength.message,e),fe(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function Vf(r,e){let t={type:"integer",format:"int64"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"min":e.target==="jsonSchema7"?n.inclusive?fe(t,"minimum",n.value,n.message,e):fe(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),fe(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?fe(t,"maximum",n.value,n.message,e):fe(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),fe(t,"maximum",n.value,n.message,e));break;case"multipleOf":fe(t,"multipleOf",n.value,n.message,e);break}return t}function Wf(){return{type:"boolean"}}function nl(r,e){return J(r.type._def,e)}var jf=(r,e)=>J(r.innerType._def,e);function Od(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>Od(r,e,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return dP(r,e)}}var dP=(r,e)=>{let t={type:"integer",format:"unix-time"};if(e.target==="openApi3")return t;for(let n of r.checks)switch(n.kind){case"min":fe(t,"minimum",n.value,n.message,e);break;case"max":fe(t,"maximum",n.value,n.message,e);break}return t};function $f(r,e){return{...J(r.innerType._def,e),default:r.defaultValue()}}function qf(r,e){return e.effectStrategy==="input"?J(r.schema._def,e):ze(e)}function Kf(r){return{type:"string",enum:Array.from(r.values)}}var mP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function Yf(r,e){let t=[J(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),J(r.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter(i=>!!i),n=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return t.forEach(i=>{if(mP(i))o.push(...i.allOf),i.unevaluatedProperties===void 0&&(n=void 0);else{let a=i;if("additionalProperties"in i&&i.additionalProperties===!1){let{additionalProperties:s,...c}=i;a=c}else n=void 0;o.push(a)}}),o.length?{allOf:o,...n}:void 0}function Xf(r,e){let t=typeof r.value;return t!=="bigint"&&t!=="number"&&t!=="boolean"&&t!=="string"?{type:Array.isArray(r.value)?"array":"object"}:e.target==="openApi3"?{type:t==="bigint"?"integer":t,enum:[r.value]}:{type:t==="bigint"?"integer":t,const:r.value}}import{ZodFirstPartyTypeKind as pa}from"zod";var Ld,br={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>(Ld===void 0&&(Ld=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),Ld),uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};function ol(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":fe(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":fe(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"email":switch(e.emailStrategy){case"format:email":Er(t,"email",n.message,e);break;case"format:idn-email":Er(t,"idn-email",n.message,e);break;case"pattern:zod":Dt(t,br.email,n.message,e);break}break;case"url":Er(t,"uri",n.message,e);break;case"uuid":Er(t,"uuid",n.message,e);break;case"regex":Dt(t,n.regex,n.message,e);break;case"cuid":Dt(t,br.cuid,n.message,e);break;case"cuid2":Dt(t,br.cuid2,n.message,e);break;case"startsWith":Dt(t,RegExp(`^${Nd(n.value,e)}`),n.message,e);break;case"endsWith":Dt(t,RegExp(`${Nd(n.value,e)}$`),n.message,e);break;case"datetime":Er(t,"date-time",n.message,e);break;case"date":Er(t,"date",n.message,e);break;case"time":Er(t,"time",n.message,e);break;case"duration":Er(t,"duration",n.message,e);break;case"length":fe(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),fe(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Dt(t,RegExp(Nd(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Er(t,"ipv4",n.message,e),n.version!=="v4"&&Er(t,"ipv6",n.message,e);break}case"base64url":Dt(t,br.base64url,n.message,e);break;case"jwt":Dt(t,br.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Dt(t,br.ipv4Cidr,n.message,e),n.version!=="v4"&&Dt(t,br.ipv6Cidr,n.message,e);break}case"emoji":Dt(t,br.emoji(),n.message,e);break;case"ulid":{Dt(t,br.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Er(t,"binary",n.message,e);break}case"contentEncoding:base64":{fe(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Dt(t,br.base64,n.message,e);break}}break}case"nanoid":Dt(t,br.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function Nd(r,e){return e.patternStrategy==="escape"?gP(r):r}var pP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function gP(r){let e="";for(let t=0;t<r.length;t++)pP.has(r[t])||(e+="\\"),e+=r[t];return e}function Er(r,e,t,n){r.format||r.anyOf?.some(o=>o.format)?(r.anyOf||(r.anyOf=[]),r.format&&(r.anyOf.push({format:r.format,...r.errorMessage&&n.errorMessages&&{errorMessage:{format:r.errorMessage.format}}}),delete r.format,r.errorMessage&&(delete r.errorMessage.format,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.anyOf.push({format:e,...t&&n.errorMessages&&{errorMessage:{format:t}}})):fe(r,"format",e,t,n)}function Dt(r,e,t,n){r.pattern||r.allOf?.some(o=>o.pattern)?(r.allOf||(r.allOf=[]),r.pattern&&(r.allOf.push({pattern:r.pattern,...r.errorMessage&&n.errorMessages&&{errorMessage:{pattern:r.errorMessage.pattern}}}),delete r.pattern,r.errorMessage&&(delete r.errorMessage.pattern,Object.keys(r.errorMessage).length===0&&delete r.errorMessage)),r.allOf.push({pattern:Jf(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):fe(r,"pattern",Jf(e,n),t,n)}function Jf(r,e){if(!e.applyRegexFlags||!r.flags)return r.source;let t={i:r.flags.includes("i"),m:r.flags.includes("m"),s:r.flags.includes("s")},n=t.i?r.source.toLowerCase():r.source,o="",i=!1,a=!1,s=!1;for(let c=0;c<n.length;c++){if(i){o+=n[c],i=!1;continue}if(t.i){if(a){if(n[c].match(/[a-z]/)){s?(o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),s=!1):n[c+1]==="-"&&n[c+2]?.match(/[a-z]/)?(o+=n[c],s=!0):o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(t.m){if(n[c]==="^"){o+=`(^|(?<=[\r
3
3
  ]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
4
4
  ]))`;continue}}if(t.s&&n[c]==="."){o+=a?`${n[c]}\r
5
5
  `:`[${n[c]}\r
6
- ]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return o}function ol(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===ga.ZodEnum)return{type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((n,o)=>({...n,[o]:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??ze(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===ga.ZodString&&r.keyType._def.checks?.length){let{type:n,...o}=nl(r.keyType._def,e);return{...t,propertyNames:o}}else{if(r.keyType?._def.typeName===ga.ZodEnum)return{...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===ga.ZodBranded&&r.keyType._def.type._def.typeName===ga.ZodString&&r.keyType._def.type._def.checks?.length){let{type:n,...o}=rl(r.keyType._def,e);return{...t,propertyNames:o}}}return t}function Jf(r,e){if(e.mapStrategy==="record")return ol(r,e);let t=J(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||ze(e),n=J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||ze(e);return{type:"array",maxItems:125,items:{type:"array",items:[t,n],minItems:2,maxItems:2}}}function Qf(r){let e=r.values,n=Object.keys(r.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function Zf(r){return r.target==="openAi"?void 0:{not:ze({...r,currentPath:[...r.currentPath,"not"]})}}function eS(r){return r.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var ha={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function rS(r,e){if(e.target==="openApi3")return tS(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(n=>n._def.typeName in ha&&(!n._def.checks||!n._def.checks.length))){let n=t.reduce((o,i)=>{let a=ha[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(t.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=t.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===t.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:t.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(t.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return tS(r,e)}var tS=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((n,o)=>J(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return t.length?{anyOf:t}:void 0};function nS(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:ha[r.innerType._def.typeName],nullable:!0}:{type:[ha[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=J(r.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function oS(r,e){let t={type:"number"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"int":t.type="integer",_d(t,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?he(t,"minimum",n.value,n.message,e):he(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),he(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?he(t,"maximum",n.value,n.message,e):he(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),he(t,"maximum",n.value,n.message,e));break;case"multipleOf":he(t,"multipleOf",n.value,n.message,e);break}return t}function iS(r,e){let t=e.target==="openAi",n={type:"object",properties:{}},o=[],i=r.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=uP(c);l&&t&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=J(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=cP(r,e);return a!==void 0&&(n.additionalProperties=a),n}function cP(r,e){if(r.catchall._def.typeName!=="ZodNever")return J(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function uP(r){try{return r.isOptional()}catch{return!0}}var aS=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return J(r.innerType._def,e);let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:ze(e)},t]}:ze(e)};var sS=(r,e)=>{if(e.pipeStrategy==="input")return J(r.in._def,e);if(e.pipeStrategy==="output")return J(r.out._def,e);let t=J(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=J(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,n].filter(o=>o!==void 0)}};function lS(r,e){return J(r.type._def,e)}function cS(r,e){let n={type:"array",uniqueItems:!0,items:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&he(n,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&he(n,"maxItems",r.maxSize.value,r.maxSize.message,e),n}function uS(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[]),additionalItems:J(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[])}}function dS(r){return{not:ze(r)}}function mS(r){return ze(r)}var pS=(r,e)=>J(r.innerType._def,e);var gS=(r,e,t)=>{switch(e){case pe.ZodString:return nl(r,t);case pe.ZodNumber:return oS(r,t);case pe.ZodObject:return iS(r,t);case pe.ZodBigInt:return Gf(r,t);case pe.ZodBoolean:return Vf();case pe.ZodDate:return Pd(r,t);case pe.ZodUndefined:return dS(t);case pe.ZodNull:return eS(t);case pe.ZodArray:return Hf(r,t);case pe.ZodUnion:case pe.ZodDiscriminatedUnion:return rS(r,t);case pe.ZodIntersection:return Kf(r,t);case pe.ZodTuple:return uS(r,t);case pe.ZodRecord:return ol(r,t);case pe.ZodLiteral:return Yf(r,t);case pe.ZodEnum:return qf(r);case pe.ZodNativeEnum:return Qf(r);case pe.ZodNullable:return nS(r,t);case pe.ZodOptional:return aS(r,t);case pe.ZodMap:return Jf(r,t);case pe.ZodSet:return cS(r,t);case pe.ZodLazy:return()=>r.getter()._def;case pe.ZodPromise:return lS(r,t);case pe.ZodNaN:case pe.ZodNever:return Zf(t);case pe.ZodEffects:return $f(r,t);case pe.ZodAny:return ze(t);case pe.ZodUnknown:return mS(t);case pe.ZodDefault:return jf(r,t);case pe.ZodBranded:return rl(r,t);case pe.ZodReadonly:return pS(r,t);case pe.ZodCatch:return Wf(r,t);case pe.ZodPipeline:return sS(r,t);case pe.ZodFunction:case pe.ZodVoid:case pe.ZodSymbol:return;default:return(n=>{})(e)}};function J(r,e,t=!1){let n=e.seen.get(r);if(e.override){let s=e.override?.(r,e,n,t);if(s!==Ff)return s}if(n&&!t){let s=dP(n,e);if(s!==void 0)return s}let o={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,o);let i=gS(r,r.typeName,e),a=typeof i=="function"?J(i(),e):i;if(a&&mP(r,e,a),e.postProcess){let s=e.postProcess(a,r,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var dP=(r,e)=>{switch(e.$refStrategy){case"root":return{$ref:r.path.join("/")};case"relative":return{$ref:tl(e.currentPath,r.path)};case"none":case"seen":return r.path.length<e.currentPath.length&&r.path.every((t,n)=>e.currentPath[n]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),ze(e)):e.$refStrategy==="seen"?ze(e):void 0}},mP=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);var fa=(r,e)=>{let t=zf(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:J(u._def,{...t,currentPath:[...t.basePath,t.definitionPath,l]},!0)??ze(t)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=J(r._def,o===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,o]},!1)??ze(t),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),t.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[t.openAiAnyTypeName]||(n[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[t.definitionPath]:n}:i:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,o].join("/"),[t.definitionPath]:{...n,[o]:i}};return t.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as Or}from"zod";import{extendZodWithOpenApi as pP}from"zod-openapi";pP(Or);var Re=(m=>(m.AI_PROVIDER="AIProviderError",m.USER_INFRA="UserInfrastructureError",m.ACTION_FAILURE="ActionFailureError",m.ASSERTION_FAILURE="AssertionFailureError",m.CONFIG_ERROR="UserConfigurationError",m.SETUP_FAILURE="SetupFailureError",m.TEARDOWN_FAILURE="TeardownFailureError",m.WEB_AGENT_PLATFORM="InternalWebAgentError",m.UNKNOWN_PLATFORM="InternalPlatformError",m.JOB_TIMEOUT="JobTimeoutError",m.CONCURRENCY_ERROR="ConcurrencyError",m.UNKNOWN="UnknownError",m))(Re||{});var Ld=Or.object({reason:Or.nativeEnum(Re),previousStepsDescription:Or.array(Or.string()).optional(),summary:Or.string(),rootCause:Or.string().optional()}).openapi({ref:"TestResultClassification"}),il=Or.object({errorMessage:Or.string(),errorStack:Or.string().optional(),classification:Ld.optional()}).openapi({ref:"TestFailureDetails"});var al=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var Sa=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var x=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(Re))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message}}},Tn=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},vn=class extends Error{constructor(e,t={}){super(e,t),this.name="NoMatchingElementError"}},Lr=class extends Error{decisions;cacheMissReason;constructor(e,t,n,o={}){super(e,o),this.decisions=t,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
6
+ ]`;continue}o+=n[c],n[c]==="\\"?i=!0:a&&n[c]==="]"?a=!1:!a&&n[c]==="["&&(a=!0)}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),r.source}return o}function il(r,e){if(e.target==="openAi"&&console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead."),e.target==="openApi3"&&r.keyType?._def.typeName===pa.ZodEnum)return{type:"object",required:r.keyType._def.values,properties:r.keyType._def.values.reduce((n,o)=>({...n,[o]:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"properties",o]})??ze(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let t={type:"object",additionalProperties:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return t;if(r.keyType?._def.typeName===pa.ZodString&&r.keyType._def.checks?.length){let{type:n,...o}=ol(r.keyType._def,e);return{...t,propertyNames:o}}else{if(r.keyType?._def.typeName===pa.ZodEnum)return{...t,propertyNames:{enum:r.keyType._def.values}};if(r.keyType?._def.typeName===pa.ZodBranded&&r.keyType._def.type._def.typeName===pa.ZodString&&r.keyType._def.type._def.checks?.length){let{type:n,...o}=nl(r.keyType._def,e);return{...t,propertyNames:o}}}return t}function Qf(r,e){if(e.mapStrategy==="record")return il(r,e);let t=J(r.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||ze(e),n=J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||ze(e);return{type:"array",maxItems:125,items:{type:"array",items:[t,n],minItems:2,maxItems:2}}}function Zf(r){let e=r.values,n=Object.keys(r.values).filter(i=>typeof e[e[i]]!="number").map(i=>e[i]),o=Array.from(new Set(n.map(i=>typeof i)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function eS(r){return r.target==="openAi"?void 0:{not:ze({...r,currentPath:[...r.currentPath,"not"]})}}function tS(r){return r.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var ga={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function nS(r,e){if(e.target==="openApi3")return rS(r,e);let t=r.options instanceof Map?Array.from(r.options.values()):r.options;if(t.every(n=>n._def.typeName in ga&&(!n._def.checks||!n._def.checks.length))){let n=t.reduce((o,i)=>{let a=ga[i._def.typeName];return a&&!o.includes(a)?[...o,a]:o},[]);return{type:n.length>1?n:n[0]}}else if(t.every(n=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=t.reduce((o,i)=>{let a=typeof i._def.value;switch(a){case"string":case"number":case"boolean":return[...o,a];case"bigint":return[...o,"integer"];case"object":if(i._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===t.length){let o=n.filter((i,a,s)=>s.indexOf(i)===a);return{type:o.length>1?o:o[0],enum:t.reduce((i,a)=>i.includes(a._def.value)?i:[...i,a._def.value],[])}}}else if(t.every(n=>n._def.typeName==="ZodEnum"))return{type:"string",enum:t.reduce((n,o)=>[...n,...o._def.values.filter(i=>!n.includes(i))],[])};return rS(r,e)}var rS=(r,e)=>{let t=(r.options instanceof Map?Array.from(r.options.values()):r.options).map((n,o)=>J(n._def,{...e,currentPath:[...e.currentPath,"anyOf",`${o}`]})).filter(n=>!!n&&(!e.strictUnions||typeof n=="object"&&Object.keys(n).length>0));return t.length?{anyOf:t}:void 0};function oS(r,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(r.innerType._def.typeName)&&(!r.innerType._def.checks||!r.innerType._def.checks.length))return e.target==="openApi3"?{type:ga[r.innerType._def.typeName],nullable:!0}:{type:[ga[r.innerType._def.typeName],"null"]};if(e.target==="openApi3"){let n=J(r.innerType._def,{...e,currentPath:[...e.currentPath]});return n&&"$ref"in n?{allOf:[n],nullable:!0}:n&&{...n,nullable:!0}}let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return t&&{anyOf:[t,{type:"null"}]}}function iS(r,e){let t={type:"number"};if(!r.checks)return t;for(let n of r.checks)switch(n.kind){case"int":t.type="integer",Id(t,"type",n.message,e);break;case"min":e.target==="jsonSchema7"?n.inclusive?fe(t,"minimum",n.value,n.message,e):fe(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),fe(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?fe(t,"maximum",n.value,n.message,e):fe(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),fe(t,"maximum",n.value,n.message,e));break;case"multipleOf":fe(t,"multipleOf",n.value,n.message,e);break}return t}function aS(r,e){let t=e.target==="openAi",n={type:"object",properties:{}},o=[],i=r.shape();for(let s in i){let c=i[s];if(c===void 0||c._def===void 0)continue;let l=fP(c);l&&t&&(c._def.typeName==="ZodOptional"&&(c=c._def.innerType),c.isNullable()||(c=c.nullable()),l=!1);let u=J(c._def,{...e,currentPath:[...e.currentPath,"properties",s],propertyPath:[...e.currentPath,"properties",s]});u!==void 0&&(n.properties[s]=u,l||o.push(s))}o.length&&(n.required=o);let a=hP(r,e);return a!==void 0&&(n.additionalProperties=a),n}function hP(r,e){if(r.catchall._def.typeName!=="ZodNever")return J(r.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(r.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function fP(r){try{return r.isOptional()}catch{return!0}}var sS=(r,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return J(r.innerType._def,e);let t=J(r.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return t?{anyOf:[{not:ze(e)},t]}:ze(e)};var lS=(r,e)=>{if(e.pipeStrategy==="input")return J(r.in._def,e);if(e.pipeStrategy==="output")return J(r.out._def,e);let t=J(r.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),n=J(r.out._def,{...e,currentPath:[...e.currentPath,"allOf",t?"1":"0"]});return{allOf:[t,n].filter(o=>o!==void 0)}};function cS(r,e){return J(r.type._def,e)}function uS(r,e){let n={type:"array",uniqueItems:!0,items:J(r.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};return r.minSize&&fe(n,"minItems",r.minSize.value,r.minSize.message,e),r.maxSize&&fe(n,"maxItems",r.maxSize.value,r.maxSize.message,e),n}function dS(r,e){return r.rest?{type:"array",minItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[]),additionalItems:J(r.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})}:{type:"array",minItems:r.items.length,maxItems:r.items.length,items:r.items.map((t,n)=>J(t._def,{...e,currentPath:[...e.currentPath,"items",`${n}`]})).reduce((t,n)=>n===void 0?t:[...t,n],[])}}function mS(r){return{not:ze(r)}}function pS(r){return ze(r)}var gS=(r,e)=>J(r.innerType._def,e);var hS=(r,e,t)=>{switch(e){case ge.ZodString:return ol(r,t);case ge.ZodNumber:return iS(r,t);case ge.ZodObject:return aS(r,t);case ge.ZodBigInt:return Vf(r,t);case ge.ZodBoolean:return Wf();case ge.ZodDate:return Od(r,t);case ge.ZodUndefined:return mS(t);case ge.ZodNull:return tS(t);case ge.ZodArray:return Gf(r,t);case ge.ZodUnion:case ge.ZodDiscriminatedUnion:return nS(r,t);case ge.ZodIntersection:return Yf(r,t);case ge.ZodTuple:return dS(r,t);case ge.ZodRecord:return il(r,t);case ge.ZodLiteral:return Xf(r,t);case ge.ZodEnum:return Kf(r);case ge.ZodNativeEnum:return Zf(r);case ge.ZodNullable:return oS(r,t);case ge.ZodOptional:return sS(r,t);case ge.ZodMap:return Qf(r,t);case ge.ZodSet:return uS(r,t);case ge.ZodLazy:return()=>r.getter()._def;case ge.ZodPromise:return cS(r,t);case ge.ZodNaN:case ge.ZodNever:return eS(t);case ge.ZodEffects:return qf(r,t);case ge.ZodAny:return ze(t);case ge.ZodUnknown:return pS(t);case ge.ZodDefault:return $f(r,t);case ge.ZodBranded:return nl(r,t);case ge.ZodReadonly:return gS(r,t);case ge.ZodCatch:return jf(r,t);case ge.ZodPipeline:return lS(r,t);case ge.ZodFunction:case ge.ZodVoid:case ge.ZodSymbol:return;default:return(n=>{})(e)}};function J(r,e,t=!1){let n=e.seen.get(r);if(e.override){let s=e.override?.(r,e,n,t);if(s!==Bf)return s}if(n&&!t){let s=SP(n,e);if(s!==void 0)return s}let o={def:r,path:e.currentPath,jsonSchema:void 0};e.seen.set(r,o);let i=hS(r,r.typeName,e),a=typeof i=="function"?J(i(),e):i;if(a&&yP(r,e,a),e.postProcess){let s=e.postProcess(a,r,e);return o.jsonSchema=a,s}return o.jsonSchema=a,a}var SP=(r,e)=>{switch(e.$refStrategy){case"root":return{$ref:r.path.join("/")};case"relative":return{$ref:rl(e.currentPath,r.path)};case"none":case"seen":return r.path.length<e.currentPath.length&&r.path.every((t,n)=>e.currentPath[n]===t)?(console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),ze(e)):e.$refStrategy==="seen"?ze(e):void 0}},yP=(r,e,t)=>(r.description&&(t.description=r.description,e.markdownDescription&&(t.markdownDescription=r.description)),t);var ha=(r,e)=>{let t=Hf(e),n=typeof e=="object"&&e.definitions?Object.entries(e.definitions).reduce((c,[l,u])=>({...c,[l]:J(u._def,{...t,currentPath:[...t.basePath,t.definitionPath,l]},!0)??ze(t)}),{}):void 0,o=typeof e=="string"?e:e?.nameStrategy==="title"?void 0:e?.name,i=J(r._def,o===void 0?t:{...t,currentPath:[...t.basePath,t.definitionPath,o]},!1)??ze(t),a=typeof e=="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;a!==void 0&&(i.title=a),t.flags.hasReferencedOpenAiAnyType&&(n||(n={}),n[t.openAiAnyTypeName]||(n[t.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:t.$refStrategy==="relative"?"1":[...t.basePath,t.definitionPath,t.openAiAnyTypeName].join("/")}}));let s=o===void 0?n?{...i,[t.definitionPath]:n}:i:{$ref:[...t.$refStrategy==="relative"?[]:t.basePath,t.definitionPath,o].join("/"),[t.definitionPath]:{...n,[o]:i}};return t.target==="jsonSchema7"?s.$schema="http://json-schema.org/draft-07/schema#":(t.target==="jsonSchema2019-09"||t.target==="openAi")&&(s.$schema="https://json-schema.org/draft/2019-09/schema#"),t.target==="openAi"&&("anyOf"in s||"oneOf"in s||"allOf"in s||"type"in s&&Array.isArray(s.type))&&console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property."),s};import{z as Lr}from"zod";import{extendZodWithOpenApi as bP}from"zod-openapi";bP(Lr);var Re=(m=>(m.AI_PROVIDER="AIProviderError",m.USER_INFRA="UserInfrastructureError",m.ACTION_FAILURE="ActionFailureError",m.ASSERTION_FAILURE="AssertionFailureError",m.CONFIG_ERROR="UserConfigurationError",m.SETUP_FAILURE="SetupFailureError",m.TEARDOWN_FAILURE="TeardownFailureError",m.WEB_AGENT_PLATFORM="InternalWebAgentError",m.UNKNOWN_PLATFORM="InternalPlatformError",m.JOB_TIMEOUT="JobTimeoutError",m.CONCURRENCY_ERROR="ConcurrencyError",m.UNKNOWN="UnknownError",m))(Re||{});var Dd=Lr.object({reason:Lr.nativeEnum(Re),previousStepsDescription:Lr.array(Lr.string()).optional(),summary:Lr.string(),rootCause:Lr.string().optional()}).openapi({ref:"TestResultClassification"}),al=Lr.object({errorMessage:Lr.string(),errorStack:Lr.string().optional(),classification:Dd.optional()}).openapi({ref:"TestFailureDetails"});var sl=class extends Error{constructor(e,t={}){super(e,t),this.name="ValidationError"}};var fa=class extends Error{constructor(e,t,n,o={}){super(`The ${n} with id ${t} is invalid: ${e}`,o),this.name="InvalidEntityError"}};var x=class extends Error{reason;constructor(e,t,n){let o=!1;for(let i of Object.values(Re))if(t.startsWith(i)){o=!0,e=i;break}if(n?.errOptions?.cause)super(o?t:`${e}: ${t}`,n?.errOptions);else{let i=o?t:`${e}${t?`: ${t}`:""}`;super(i,n?.errOptions)}this.name="TestFailureError",this.stack=this.stack?.slice(this.name.length+2),this.reason=e}toString(){return this.message}toJSON(){return{message:this.message}}},vn=class extends Error{updatedLocatorMemory;constructor(e,t,n={}){super(e,n),this.updatedLocatorMemory=t,this.name="NoElementsFoundUsingAIError"}},An=class extends Error{constructor(e,t={}){super(e,t),this.name="NoMatchingElementError"}},Nr=class extends Error{decisions;cacheMissReason;constructor(e,t,n,o={}){super(e,o),this.decisions=t,this.name="NoElementsFoundUsingCacheError",this.cacheMissReason=n}toString(){return`${this.message}
7
7
  Decisions:
8
8
  ${this.decisions.map(e=>e.toString()).join(`
9
- `)}`}};function hS(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function Nd(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var Nr=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},sl=class extends Nr{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},ll=class extends Nr{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function Dd(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var kd="Element to be clicked has no bounding box";function fS(r){return r instanceof Error?r.message.startsWith(kd):!1}function Ud(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function Fd(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var ya=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};function cl(r){return r instanceof Error?r.message:String(r)}var gP={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};Rd.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!gP[e])throw new Error(`Command type ${e} is missing a description`)});var SS=T.object({type:T.literal("CLICK"),description:T.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:T.boolean().or(T.null()),rightClick:T.boolean().or(T.null())}),yS=T.object({type:T.literal("TYPE"),description:T.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:T.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:T.boolean().or(T.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:T.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),bS=T.object({type:T.literal("GO_BACK")}),hP=T.object({type:T.literal("GO_FORWARD")}),fP=T.object({type:T.literal("LOCAL_STORAGE"),key:T.string().describe("The localStorage key to set or get."),value:T.string().describe("The value to store in localStorage. If reading, this can be empty.")}),ES=T.object({type:T.literal("PRESS"),keys:T.array(T.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),TS=T.object({type:T.literal("SELECT_OPTION"),description:T.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:T.discriminatedUnion("type",[T.object({type:T.literal("VALUE"),value:T.string()}),T.object({type:T.literal("LABEL"),label:T.string()}),T.object({type:T.literal("INDEX"),index:T.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),vS=T.object({type:T.literal("NAVIGATE"),url:T.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),AS=T.object({type:T.literal("SCROLL"),y:T.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),wS=T.object({type:T.literal("WAIT"),timeout:T.number().describe("The number of seconds to wait.")}),CS=T.object({type:T.literal("AI_ASSERTION"),assertion:T.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:T.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),RS=T.object({type:T.literal("HOVER"),description:T.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),SP=T.object({type:T.literal("COPY"),value:T.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),yP=T.object({type:T.literal("PASTE")}),bP=T.object({type:T.literal("REFRESH")}),EP=T.object({type:T.literal("REQUEST"),url:T.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:T.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:T.record(T.string(),T.string()).or(T.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:T.string().or(T.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),TP=T.object({type:T.literal("GRAPHQL_REQUEST"),url:T.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:T.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:T.string().or(T.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),xS=T.object({type:T.literal("DRAG"),fromDescription:T.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:T.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:T.number().positive().or(T.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),vP=T.object({type:T.literal("MOUSE_DRAG"),description:T.string().or(T.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:T.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:T.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),AP=T.object({type:T.literal("JAVASCRIPT"),code:T.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:T.union([T.literal("NODE"),T.literal("BROWSER")]).or(T.null()).describe("Execution environment. Default is NODE."),timeout:T.number().or(T.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),wP=T.object({type:T.literal("AI_EXTRACT"),goal:T.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:T.string().or(T.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:T.string().or(T.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:T.string().or(T.null()).describe("URL or URL regex for the iframe to extract data from.")}),CP=T.object({type:T.literal("ELEMENT_CHECK"),description:T.string().describe("Description of the element to check."),assertionType:T.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:T.string().or(T.null()).describe("The value to check against (required for CONTENT assertions)."),negated:T.boolean().or(T.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),RP=T.object({type:T.literal("PAGE_CHECK"),value:T.string().describe("The text content to check for on the page."),negated:T.boolean().or(T.null()).describe("If true, checks that the content is NOT present."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),xP=T.object({type:T.literal("NEW_TAB"),url:T.string().describe("The URL to open in the new tab.")}),MP=T.object({type:T.literal("WAIT_FOR_URL"),matcher:T.discriminatedUnion("type",[T.object({type:T.literal("SUBSTRING"),url:T.string()}),T.object({type:T.literal("GLOB"),glob:T.string()}),T.object({type:T.literal("REGEX"),regex:T.string()}),T.object({type:T.literal("DOMAIN"),domain:T.string()})]).describe("How to match the URL."),caseInsensitive:T.boolean().or(T.null()),negated:T.boolean().or(T.null()).describe("Wait for the URL to NOT match instead."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the URL.")}),Bd=T.object({type:T.literal("SUCCESS")}),zd=T.object({type:T.literal("FAILURE")}),MS=T.discriminatedUnion("type",[SS,yS,ES,TS,vS,AS,wS,CS,RS,bS]),_P=T.discriminatedUnion("type",[...MS.options,xS]),dl=T.discriminatedUnion("type",[SS,yS,ES,TS,vS,AS,wS,CS,RS,bS,xS,AP,CP,RP,xP,MP,wP,SP,hP,fP,vP,yP,bP,EP,TP]),b2=fa(dl),E2=T.discriminatedUnion("type",[...dl.options,Bd,zd]),T2=fa(T.discriminatedUnion("type",[...MS.options,Bd,zd])),v2=fa(T.discriminatedUnion("type",[..._P.options,Bd,zd])),A2=T.object({command:T.unknown(),thoughts:T.string()});import{z as Hd}from"zod";import{extendZodWithOpenApi as OP}from"zod-openapi";import{z as _S}from"zod";import{extendZodWithOpenApi as PP}from"zod-openapi";import{z as An}from"zod";var tr=An.object({index:An.number().optional().describe("global index within a test (in-order traversal)"),id:An.string(),skipped:An.boolean().optional(),comment:An.string().optional(),envKey:An.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:An.boolean().optional(),retries:An.number().optional()});PP(_S);var IP=tr.extend({type:_S.literal("PRESET_ACTION")}),rr=IP.extend({command:Jo}).openapi({ref:"PresetAction"});OP(Hd);var to=tr.extend({type:Hd.literal("AI_ACTION"),text:Hd.string(),steps:rr.array().optional()}).openapi({ref:"AIAction"});import{z as kt}from"zod";import{z as ml}from"zod";import{extendZodWithOpenApi as LP}from"zod-openapi";LP(ml);var Zo=tr.extend({type:ml.literal("AI_ACTION_DYNAMIC"),text:ml.string(),retries:ml.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as PS}from"zod";var Gd=tr.extend({type:PS.literal("CONDITIONAL"),skipped:PS.boolean().optional()});import{z as fe}from"zod";var NP=fe.object({cacheKey:fe.string(),cacheExpiryMs:fe.number()}),Vd=tr.extend({id:fe.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:fe.record(fe.string()).optional(),cacheConfig:NP.optional()}),tn=Vd.extend({type:fe.literal("MODULE"),moduleId:fe.string().uuid()}),DP=fe.union([tn.pick({type:!0,moduleId:!0}),fe.record(fe.unknown())]),kP=fe.object({type:fe.literal("URL_REGEX"),regex:fe.string()}),UP=fe.object({type:fe.literal("PAGE_CHECK"),substring:fe.string()}),Wd=fe.object({cacheInvalidation:fe.discriminatedUnion("type",[UP,kP]).optional()}),nr=fe.object({moduleId:fe.string().uuid(),name:fe.string(),description:fe.string().nullish(),enabled:fe.boolean().nullish(),parameters:fe.string().array().nullish(),defaultParameters:fe.record(fe.string(),fe.string()).nullish(),parameterEnums:fe.record(fe.string(),fe.string().array()).nullish(),defaultCacheKey:fe.string().nullish(),defaultCacheTtl:fe.number().nullish(),defaultCacheAllInvocations:fe.boolean().nullish(),autoAuth:fe.boolean().nullish(),advanced:Wd.nullish()});import{z as or}from"zod";var IS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(IS||{});var FP=or.discriminatedUnion("type",[or.object({type:or.literal("NAVIGATE_URL"),url:or.string().url()}),or.object({type:or.literal("GO_TO_SECTION_START")})]),BP=or.object({trigger:or.nativeEnum(IS).optional(),attempts:or.number().int().optional(),restartBehavior:FP}),ba=tr.extend({type:or.literal("SECTION"),description:or.string().describe("user provided goal of what the section should accomplish"),plan:or.string().array().optional(),autohealingConfig:BP.optional()});var OS=nr.merge(Vd).extend({type:kt.literal("RESOLVED_MODULE"),steps:kt.lazy(()=>ct.array())}),jd=nr.extend({steps:kt.lazy(()=>ct.array())}),$d=ba.extend({steps:kt.lazy(()=>Ut.array())}),zP=ba.extend({steps:kt.lazy(()=>ct.array())}),ei=Gd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>Ut.array())}).array(),elseSteps:kt.lazy(()=>Ut.array().optional())}),HP=Gd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>ct.array())}).array(),elseSteps:kt.lazy(()=>ct.array().optional())}),Ut=kt.discriminatedUnion("type",[rr,to,Zo,tn,ei,$d]),ct=kt.discriminatedUnion("type",[rr,to,Zo,OS,HP,zP]);import{z as ir}from"zod";var GP=ir.object({steps:Ut.array(),beforeSteps:Ut.array().nullish(),afterSteps:Ut.array().nullish()}),ro=ir.object({steps:ct.array(),beforeSteps:ct.array().nullish(),afterSteps:ct.array().nullish()}),no=ir.object({steps:ir.record(ir.string(),ir.unknown()).array(),beforeSteps:ir.record(ir.string(),ir.unknown()).array().nullish(),afterSteps:ir.record(ir.string(),ir.unknown()).array().nullish()});var wn="1.0.22",oo="0.0.2";import{z as Ct}from"zod";import{z as io}from"zod";var VP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,rn=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ti=io.string().min(1).max(255).superRefine((r,e)=>{try{Ea(r)}catch(t){return e.addIssue({code:io.ZodIssueCode.custom,message:t.message,fatal:!0}),io.NEVER}});function Ea(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(VP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var pl=io.preprocess(r=>r===null?"":r,io.union([io.string().url(),io.literal("")])).optional();var WP=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],jP=Ct.object({id:Ct.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:ti.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:Ct.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),$P=Ct.object({selector:jP,inputs:Ct.record(Ct.string()).or(Ct.null())}),BK=Ct.object({type:Ct.literal("PRESET_ACTION"),action:dl,envKey:Ct.string().or(Ct.null()).describe(`key in the environment to save the result of this step to. Only use this for ${WP.join(" or ")} steps.`)}),zK=Ct.object({type:Ct.literal("MODULE"),module:$P}),HK=Ct.object({type:Ct.literal("AI_ACTION_DYNAMIC"),text:Ct.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});var LS=_.object({phrase:_.string()}),qd=_.object({thoughts:_.string().optional(),result:_.union([_.literal("NOT_FOUND"),_.string(),_.number(),_.array(_.unknown()),_.record(_.unknown(),_.unknown()),_.unknown()])}),vY=_.object({text:_.string()}),qP=_.boolean().or(_.nativeEnum(It)).transform(r=>!(!r||r==="irrelevant")),NS=_.object({attributes:_.array(_.string()).nullish(),text:qP.nullish(),position:_.nativeEnum(It).nullish(),shape:_.nativeEnum(It).nullish()}),KP=_.object({id:_.number().int(),requirements:NS}),YP=KP.array(),DS=_.object({thoughts:_.string(),review:_.string().optional(),id:_.number().int(),updatedMemory:ra.optional(),requirements:NS.nullish().transform(r=>{if(r!==null)return r}),additionalElements:YP.nullish().transform(r=>{if(r!==null)return r})});var Kd=(g=>(g.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",g.FEW_WORDS="FEW_WORDS",g.STYLE_TAG="STYLE_TAG",g.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",g.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",g.NONE="NONE",g.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",g.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",g.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",g.PREFER_ASSERTION="PREFER_ASSERTION",g.HTML_ELEMENTS="HTML_ELEMENTS",g.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",g.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",g))(Kd||{}),kS=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(kS||{});var US=_.object({thoughts:_.string(),category:_.nativeEnum(Kd)}),FS=_.object({thoughts:_.string(),category:_.nativeEnum(kS)}),BS=_.object({anyUntestedSteps:_.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:_.object({error:_.string(),solutionFound:_.object({description:_.string(),passedSuccessfully:_.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:_.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:_.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),zS=_.object({summary:_.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:_.array(_.object({error:_.string(),workAround:_.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:_.array(_.string()).default([]).describe("Steps added/discussed but not validated.")}),XP=_.discriminatedUnion("op",[_.object({op:_.literal("replace"),path:_.string(),value:_.string()}),_.object({op:_.literal("add"),path:_.string(),value:_.string()}),_.object({op:_.literal("remove"),path:_.string()})]),AY=_.object({thoughts:_.string(),patches:XP.array()}),JP=[_.literal("add"),_.literal("replace"),_.literal("remove")],QP=_.object({op:_.union(JP),path:_.string(),value:ct.optional()}),HS=_.object({patches:QP.array(),thoughts:_.string()}),GS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(GS||{}),VS=_.object({thoughts:_.string(),scenario:_.nativeEnum(GS),instructions:_.string().nullish()}),WS=_.object({reasoning:_.string(),scenario:_.string(),patch:_.null().optional()}),wY=_.object({thoughts:_.string(),evaluation:_.number().min(0).max(10)}),CY=_.object({observations:_.string(),reasoning:_.string(),command:Zs});var Yd=_.object({summary:_.string(),reasoning:_.string(),evaluation:_.discriminatedUnion("type",[_.object({type:_.literal("DONE")}),_.object({type:_.literal("RIGHT_TRACK")}),_.object({type:_.literal("WRONG_TRACK"),feedback:_.string()}),_.object({type:_.literal("IMPOSSIBLE")})])}),ZP=_.object({startId:_.number().int(),endId:_.number().int()}),jS=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))(jS||{}),$S=_.object({categoryThoughts:_.string(),category:_.nativeEnum(jS),relevantSections:ZP.array()}),nn=_.boolean().nullish().transform(r=>r??!1),qS=_.object({thoughts:_.string().optional(),isPageReady:nn,descriptionLabels:_.object({usesTextContent:nn,usesAppearance:nn,usesPosition:nn,usesRelativeElements:nn,usesSingleQuotes:nn,isAmbiguous:nn,targetDoesNotExist:nn,usesIcon:nn}).optional()});import{z as O}from"zod";import*as oe from"zod";var IY=oe.object({thoughts:oe.string().optional().describe("only provided if a description was provided"),target:fn.optional().describe("only provided if a description was provided"),pageState:oe.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:oe.object({label:oe.string(),value:oe.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:oe.object({data:oe.string(),height:oe.number().int(),width:oe.number().int()}).optional().describe("only provided if returnScreenshot is true")}),KS=oe.union([oe.literal("ELEMENT_CHECK"),oe.literal("NEGATED_CHECK"),oe.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),oe.literal("SELECT_OPTION"),oe.literal("TYPE")]);function Ta(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var va=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(va||{}),ri=oe.object({matched:oe.boolean(),reason:oe.string().optional().describe("Human understandable description"),logs:oe.string().array().optional().describe("Logs for debugging")}),eI=ri.extend({type:oe.literal("USER_SELECTOR")}),tI=ri.extend({type:oe.literal("CSS_SELECTOR"),selectors:oe.string().array()}),rI=ri.extend({type:oe.literal("HYBRID_SELECTOR")}),nI=ri.extend({type:oe.literal("HTML_DISTANCE"),distance:oe.number().optional(),closestElement:oe.string().optional(),savedElement:oe.string().optional()}),oI=ri.extend({type:oe.literal("TEMPLATE_MATCHING"),elementImageUrl:oe.string().url()}),iI=ri.extend({type:oe.literal("AUTO_FRAME"),logs:oe.string().array().optional()}),YS=oe.discriminatedUnion("type",[eI,tI,rI,nI,oI,iI]);import{z as xa}from"zod";import{z as fI}from"zod";import*as q from"zod";import{extendZodWithOpenApi as lI}from"zod-openapi";import{cloneDeep as GY}from"lodash-es";import WY from"truncate-json";import*as lo from"zod";import{extendZodWithOpenApi as sI}from"zod-openapi";import{z as Rt}from"zod";import{z as re}from"zod";var Xd=re.object({autoFollowNewTabs:re.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:re.union([re.boolean(),re.literal("inputs-only")]).optional(),ignoreHrefForCaching:re.boolean().optional(),disableSecondaryCacheResolution:re.boolean().optional(),hybridSelectorMode:re.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:re.union([re.boolean(),re.literal("always")]).optional(),visualActions:re.boolean().optional(),autoExpandIframes:re.boolean().optional(),disableHtmlSnapshots:re.boolean().optional(),importantAttributes:re.string().array().optional(),importantClasses:re.string().array().optional(),importantStyles:re.string().array().optional()});var XS=1e4,JS=6e4,aI=re.object({server:re.string(),username:re.string().optional(),password:re.string().optional()}),ao=Xd.extend({pageLoadTimeoutMs:re.number().optional().refine(r=>r===void 0||r<=JS&&r>=-1,{message:`Page load timeout must be between 0 and ${JS/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:re.number().optional().refine(r=>r===void 0||r<=XS&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${XS/1e3} seconds`}),localChromeExtensionPaths:re.string().array().optional(),extraHeaders:re.record(re.string(),re.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:re.record(re.string(),re.record(re.string(),re.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:re.string().optional(),disableGpu:re.boolean().optional(),disableBrowserMonitoring:re.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:re.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:re.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:re.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:re.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:re.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:aI.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:re.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory.")});var Jd="BASE_URL";var so="ENV_NAME",ni="TEST_NAME",UY={[Jd]:"https://www.google.com"},QS=Rt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),ZS=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.string().describe("variable value"))}),ey=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value")),browser:ao.optional()});var FY=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value"))});sI(lo);var Qd=lo.object({env:lo.record(lo.unknown())}).openapi({ref:"TestContextSnapshot"});var Ke=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ke||{}),Zd=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(Zd||{});lI(q);var em=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),cI=em.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(Zd),message:q.string().optional(),elementInteracted:q.string().optional()}),co=em.extend({status:q.nativeEnum(Ke),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:Qd.optional(),afterTestContext:Qd.optional(),failureReason:q.nativeEnum(Re).optional(),details:q.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),ty=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(ty||{}),gl=co.merge(rr).extend({results:cI.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>pt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(ty),message:q.string()}).optional()}),uI=co.merge(to).extend({results:q.lazy(()=>gl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),dI=co.merge(Zo).extend({results:q.lazy(()=>gl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),mI=co.merge(tn).extend({moduleName:q.string().optional(),results:q.lazy(()=>pt.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),pI=co.merge(ei).extend({assertionResult:gl.optional(),results:q.lazy(()=>pt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>pt.array()).optional()}),gI=co.merge(ba).extend({results:q.lazy(()=>pt.array()),healingAttempts:q.lazy(()=>pt.array().array()).optional(),previousAttempts:q.lazy(()=>pt.array()).optional()}),pt=q.discriminatedUnion("type",[uI,dI,gl,mI,pI,gI]),aX=co.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),hI=em.extend({index:q.number().optional(),userFacingStepReference:q.string().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),hl=hI.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var tm=fI.object({results:pt.array().describe("main results"),beforeResults:pt.array().optional(),afterResults:pt.array().optional()}),Aa=tm.partial();import{z as H}from"zod";import{extendZodWithOpenApi as AI}from"zod-openapi";var oi=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(oi||{});import{isValidCron as SI}from"cron-validator";import{z as le}from"zod";import{z as rm}from"zod";var Cn=(n=>(n.CHROMIUM="Chromium",n.GOOGLE_CHROME="Google Chrome",n.CHROME_FOR_TESTING="Chrome for Testing",n))(Cn||{});var fl=rm.object({width:rm.number().min(200).max(1e4),height:rm.number().min(200).max(1e4)}),ry={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},pX=Object.keys(ry);var Rn=ry["Desktop Large"],ny="en-us",oy="America/Los_Angeles";var Sl={latitude:37.7749,longitude:-122.4194};var iy=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var ay=1e4,yI=ao.extend({browserType:le.nativeEnum(Cn).optional(),slowMoMs:le.number().optional().refine(r=>r===void 0||r<=ay&&r>=-1,{message:`Slow motion must be between 0 and ${ay} milliseconds`}),basicAuthorization:le.object({username:le.string().optional(),password:le.string().optional()}).optional(),geolocation:le.object({latitude:le.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:le.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:le.boolean().optional(),locale:le.string().optional(),timezone:le.enum(iy).optional(),colorScheme:le.enum(["light","dark"]).optional()});var wa=le.object({useMemory:le.boolean().optional(),failureRecovery:le.boolean().optional().describe("undefined means inherit org settings")}),bI=wa.extend({disableAICaching:le.boolean().optional(),failureRecoveryInstructions:le.string().optional()}),EI=le.object({viewport:fl.optional()}),Ca=EI.merge(bI).merge(yI),ii=le.object({cron:le.string().refine(r=>SI(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:le.boolean().default(!1),env:le.string().optional(),timeZone:le.string().default("America/Los_Angeles"),jobKey:le.string().optional()}),ai=le.object({onSuccess:le.boolean().default(!1),failureMessage:le.string().optional(),onFailure:le.boolean().default(!0),successMessage:le.string().optional()}),TI=le.object({name:le.string(),required:le.boolean().optional(),defaultValue:le.string().describe("this is not optional because we need a value when the editor is first loaded")}),yl=TI.array(),vI=le.object({name:le.string(),value:le.string()}),sy=vI.array(),bl=le.object({name:le.string(),default:le.boolean().optional(),fixtures:QS.array().optional()});AI(H);var ar={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},xe=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(xe||{}),El=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(El||{});var ot=H.string().pipe(H.coerce.date()).or(H.date()),Ra=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),executionType:H.nativeEnum(oi).optional().default("WEB"),createdAt:ot,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ot.or(H.null()),startedAt:ot.or(H.null()),updatedAt:ot.nullish(),finishedAt:ot.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),gitBranchName:H.string().nullish(),githubRepository:H.string().nullish(),gitlabProjectPath:H.string().nullish(),labels:H.array(H.string()).optional(),gitOriginUrl:H.string().nullish(),gitCommitSha:H.string().nullish(),gitCommitShaShort:H.string().nullish(),gitCommitAuthorName:H.string().nullish(),cliVersion:H.string().nullish(),section:H.nativeEnum(El).nullish(),status:H.nativeEnum(xe),trigger:H.nativeEnum(ar),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(xe),startedAt:ot.or(H.null()),finishedAt:ot.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(Re).nullish(),failureDetails:il.nullish(),failureRecoveryDetails:H.object({attempts:H.number()}).nullish(),pipelineId:H.string().nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),quarantined:H.boolean().nullish().default(!1),quarantinedReason:H.string().nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),description:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),wI={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Tl=Ra.pick({...wI,test:!0}),ly=Ra.omit({failureReason:!0,failureDetails:!0,test:!0}),nm=Ra.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:Ca.nullish()}).nullish()}).merge(tm);var CI=xa.object({id:xa.string().uuid(),startedAt:ot.or(xa.null()),finishedAt:ot.or(xa.null()),status:xa.nativeEnum(xe)}).merge(Aa),DX=CI.array();import{z as it}from"zod";var RI=it.object({id:it.string(),status:it.nativeEnum(xe),trigger:it.nativeEnum(ar),createdAt:ot,startedAt:ot.nullish(),finishedAt:ot.nullish(),gitCommitSha:it.string().nullish(),gitCommitShaShort:it.string().nullish(),gitCommitTimestamp:ot.nullish(),gitBranchName:it.string().nullish(),gitOriginUrl:it.string().nullish(),gitCommitMessage:it.string().nullish(),gitCommitAuthorName:it.string().nullish(),githubRepository:it.string().nullish(),gitlabProjectPath:it.string().nullish(),pipelineId:it.string().nullish(),cliVersion:it.string().nullish(),labels:it.string().array().optional(),suite:it.object({id:it.string(),name:it.string()}).nullish(),runs:it.object({status:it.nativeEnum(xe)}).array()}).openapi({ref:"RunGroup"}),cy=RI.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Tl.array()});import{z as gt}from"zod";var xI=gt.object({type:gt.literal("TARGETING"),name:gt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:YS.array(),pageState:gt.string().optional(),targetSource:gt.nativeEnum(hn).optional(),targetUpdateTime:gt.string().optional()}),MI=gt.object({type:gt.literal("AI_LOCATION"),matched:gt.boolean(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional(),thoughts:gt.string().optional()}),_I=gt.object({type:gt.literal("ASSERTION"),relevantElementsSerialized:gt.string().array().optional(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional()}),PI=gt.discriminatedUnion("type",[xI,MI,_I]);import{z as Qe}from"zod";var II=Qe.object({id:Qe.string(),name:Qe.string()}),YX=II.merge(Qe.object({createdAt:ot,createdBy:Qe.string(),schedule:ii,notification:ai,environment:Qe.object({name:Qe.string()}).nullish(),beforeTests:Qe.object({id:Qe.string()}).array().nullish(),afterTests:Qe.object({id:Qe.string()}).array().nullish()})),uy=Qe.object({id:Qe.string().uuid(),orgId:Qe.string(),createdAt:ot,startedAt:ot.or(Qe.null()),finishedAt:ot.or(Qe.null()),status:Qe.nativeEnum(xe),trigger:Qe.nativeEnum(ar),suite:Qe.object({id:Qe.string(),name:Qe.string()}).nullish(),runs:Ra.array()}),XX=uy.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),dy=uy.extend({runs:Tl.array()});import{z as sr}from"zod";import{cloneDeep as ZX}from"lodash-es";import{z as Ae}from"zod";var i5=Ae.object({thoughts:Ae.string(),subGoals:Ae.object({instruction:Ae.string()}).array()}),a5=Ae.object({thoughts:Ae.string(),newPlanMarkdown:Ae.string()}),s5=Ae.object({thoughts:Ae.string(),correct:Ae.boolean(),failedActionIndex:Ae.number().optional()}),OI=Ae.object({type:Ae.literal("PLANNING"),beforePlan:Ae.string(),goalDecision:Ae.string(),thoughts:Ae.string()}),LI=Ae.object({type:Ae.literal("RUNNING"),stepDisplayName:Ae.string(),status:Ae.nativeEnum(Ke),results:pt.array()}),NI=Ae.object({type:Ae.literal("REVISING"),beforePlan:Ae.string(),afterPlan:Ae.string(),errString:Ae.string(),diffs:Ae.string(),thoughts:Ae.string()}),DI=Ae.object({type:Ae.literal("SYSTEM"),message:Ae.string()}),kI=Ae.discriminatedUnion("type",[OI,LI,NI,DI]),my=kI.array();var m5=sr.object({id:sr.string(),scheduledAt:sr.coerce.date().nullable(),startedAt:sr.coerce.date().nullable(),finishedAt:sr.coerce.date().nullable(),status:sr.nativeEnum(xe),history:my.nullable(),testPlan:sr.object({id:sr.string(),name:sr.string()}).nullable(),test:sr.object({id:sr.string(),name:sr.string()}).nullable()});import{z as Ft}from"zod";var om=Ft.object({content:Ft.string(),ids:Ft.string().array(),tokenLength:Ft.number()}),UI=Ft.object({chunks:om.array()}),_5=Ft.object({ids:Ft.string().array(),score:Ft.number(),tokenLength:Ft.number()}),P5=UI.extend({description:Ft.string().describe("Input to pass to RAG engine"),tokenLimit:Ft.number()}),py=Ft.object({ids:Ft.number().array()}),gy=Ft.object({indices:Ft.number().array()});var ut=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),F5=ut.extend({chunks:om.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),FI=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),hy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:KS.optional().catch(void 0),memory:O.discriminatedUnion("type",[Zr,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),fy=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),Sy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),BI=O.literal("NEGATED_CHECK"),yy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:Cd.optional(),memory:O.discriminatedUnion("type",[aa,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:BI.optional()}),by=O.object({command:Jo}),Ey=O.object({message:O.string()}),Ty=O.object({messagesAndToolCalls:O.array(O.string())}),vy=O.object({messagesAndToolCalls:O.array(O.string()).describe("Chat history to condense for summarization")}),im=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:FI.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),Ay=O.object({results:hl.array(),errorMessage:O.string(),errorStack:O.string().optional()}),wy=O.object({results:hl.array(),goal:O.string(),errorMessage:O.string()}),Cy=O.object({failedResults:hl.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),B5=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),Ry=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),xy=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as Ma}from"zod";var G5=Ma.object({goal:Ma.string()}),My=Ma.object({keywords:Ma.array(Ma.string())});import{z as am}from"zod";var vl=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(vl||{}),j5=am.nativeEnum(vl),zI=am.enum(["v1","v2","v3"]),$5=zI.or(am.string().describe("for people with special configurations"));var _y={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as ye}from"zod";var Py=ye.object({attributesRequired:ye.array(ye.string()).optional(),textRequired:ye.boolean().optional(),boundsRequired:ye.boolean().optional(),positionSpecificity:ye.nativeEnum(It).optional(),shapeSpecificity:ye.nativeEnum(It).optional()}),Iy=ye.object({id:ye.number(),thoughts:ye.string(),updatedMemory:ra.optional(),inWebview:ye.boolean().optional(),requirements:Py.optional(),additionalElements:ye.object({id:ye.number(),requirements:Py}).array().optional()}),Oy=ye.object({description:ye.string(),screenXml:ye.string(),screenshot:ye.string(),memory:ye.discriminatedUnion("type",[Zr,ye.object({type:ye.literal("RESOLVED_TRACES"),traces:ye.unknown().array()})]).optional()}),Ly=ye.object({assertion:ye.string(),screenXml:ye.string(),screenshot:ye.string(),memory:ye.discriminatedUnion("type",[aa,ye.object({type:ye.literal("RESOLVED_TRACES"),traces:ye.unknown().array()})]).optional()}),Ny=ye.object({thoughts:ye.string(),result:ye.boolean(),relevantElements:ye.array(ye.number()).optional(),updatedMemory:ia.optional()});import{z as uo}from"zod";var Dy=uo.object({id:uo.string().uuid(),skipped:uo.boolean().optional(),envKey:uo.string().optional().describe("key in the environment to save the result of this step to")}),sm=Dy.merge(Qn).extend({type:uo.literal("REQUEST")}),lm=Dy.merge(Ys).extend({type:uo.literal("JAVASCRIPT")}),cm=uo.discriminatedUnion("type",[lm,sm]);import{z as lr}from"zod";var ky=lr.object({id:lr.string(),name:ti,description:lr.string().optional().nullish(),baseUrl:pl.nullish(),schemaVersion:lr.string(),advanced:lr.unknown().optional(),retries:lr.number(),envs:lr.array(bl).nullish(),parameters:yl.nullish()}),HI=lr.object({createdAt:lr.coerce.date(),updatedAt:lr.coerce.date(),schedule:ii.nullish(),notification:ai.nullish(),createdBy:lr.string(),organizationId:lr.string()}),GI=ky.merge(HI),S3=GI.extend({steps:cm.array()}),y3=ky.extend({steps:cm.array()});import{z as Vt}from"zod";var Uy=Vt.object({startedAt:Vt.coerce.date(),finishedAt:Vt.coerce.date(),status:Vt.nativeEnum(Ke),message:Vt.string().optional(),data:Vt.unknown().optional()}),VI=Uy.merge(lm).extend({type:Vt.literal("JAVASCRIPT")}),WI=Uy.merge(sm).extend({type:Vt.literal("REQUEST")}),jI=Vt.discriminatedUnion("type",[VI,WI]),Fy=Vt.object({startedAt:Vt.coerce.date(),finishedAt:Vt.coerce.date().nullish(),status:Vt.nativeEnum(xe),results:jI.array(),failureReason:Vt.string().nullish(),failureDetails:il.nullish()});import{z as Wt}from"zod";var $I=Wt.object({id:Wt.string(),organizationId:Wt.string(),createdAt:Wt.coerce.date(),updatedAt:Wt.coerce.date(),createdBy:Wt.string(),scheduledAt:Wt.coerce.date().nullish(),startedAt:Wt.coerce.date().nullish(),finishedAt:Wt.coerce.date().nullish(),status:Wt.nativeEnum(xe),trigger:Wt.nativeEnum(ar),results:Fy.array().nullish(),apiTestName:Wt.string().nullish(),apiTestPath:Wt.string().nullish(),apiTestId:Wt.string().nullish()}),M3=$I.pick({status:!0,startedAt:!0,finishedAt:!0});var _a=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(_a||{}),By=3;function qI(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function um(r){if(!qI(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function dm(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return By;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Al=class{trackStepExecution(){}async flush(){}};import{parseString as KI,splitCookiesString as YI}from"set-cookie-parser";import{z as we}from"zod";var mm=we.object({name:we.string(),value:we.string(),url:we.string().optional(),domain:we.string().optional(),path:we.string().optional(),expires:we.number().default(Date.now()/1e3+60*60*24*365),httpOnly:we.boolean().optional(),secure:we.boolean().default(!0),sameSite:we.union([we.literal("Strict"),we.literal("Lax"),we.literal("None")]).default("None")});function wl(r,e){let t=[],n=YI(r);for(let o of n){let i=KI(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=mm.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,m]=u.split("=");if(!d||!m)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:m})}}return t}var XI=we.object({origin:we.string(),localStorage:we.array(we.object({name:we.string(),value:we.string()}))}),JI=we.object({entries:we.record(we.string(),we.array(we.tuple([we.unknown(),we.unknown()]))),version:we.number().optional()}),zy=we.object({cookies:mm.array().optional(),origins:XI.array().optional(),idb:we.record(we.string(),JI).optional().describe("key is db name")});function Cl(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=mm.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}import{v4 as ci}from"uuid";import de from"zod";import{v4 as J3}from"uuid";import{z as B}from"zod";import*as U from"zod";var Hy=U.discriminatedUnion("type",[U.object({type:U.literal("SCREEN")}),U.object({type:U.literal("OPEN_APP")}),U.object({type:U.literal("OPEN_WEBVIEW")})]),mo=U.object({type:U.literal("description"),description:U.string()}),Gy=U.object({type:U.literal("CUSTOM_COORDINATES"),startX:U.number().describe("Starting X coordinate in pixels"),startY:U.number().describe("Starting Y coordinate in pixels"),deltaPixels:U.number().describe("Number of pixels to scroll in the specified direction")}),pm=U.discriminatedUnion("type",[...Hy.options,U.object({type:U.literal("CUSTOM"),target:mo}),Gy]);var QI=U.object({type:U.literal("coordinates"),xPercent:U.number(),yPercent:U.number()}),Rl=U.discriminatedUnion("type",[mo,QI]),Vy=U.object({requiredText:U.string().optional(),requiredAttributes:U.record(U.string(),U.string()).optional(),requiredBounds:U.boolean().optional(),position:U.object({x1:U.number(),y1:U.number(),x2:U.number(),y2:U.number(),tolerance:U.nativeEnum(It),preciseTolerance:U.boolean().optional()}).optional(),shape:U.object({width:U.number(),height:U.number(),tolerance:U.nativeEnum(It),preciseTolerance:U.boolean().optional()}).optional()}),ZI=U.object({xPath:U.string(),requirements:Vy.optional()}),eO=U.object({type:U.literal("CUSTOM"),target:mo,cache:U.lazy(()=>Wy).optional()}),tO=U.object({pixelDelta:U.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:U.union([Hy,eO,Gy]),direction:U.enum(["up","down"])}),Wy=U.object({type:U.literal("NATIVE"),bounds:U.number().array(),resolvedDescription:U.string(),xPath:U.string(),elementOnlySerializedXml:U.string(),scrollDetails:tO.optional(),requirements:Vy.optional(),requiredRelatedElements:ZI.array().optional(),memory:Zr.optional()}),rO=U.object({type:U.literal("WEBVIEW"),resolvedDescription:U.string(),xPath:U.string(),browserCache:fn.optional(),memory:Zr.optional()}),si=U.union([Wy,rO]);var on=(M=>(M.AI_CHECK="AI_CHECK",M.TAP="TAP",M.TYPE="TYPE",M.PRESS="PRESS",M.PRESS_KEYBOARD="PRESS_KEYBOARD",M.OPEN_APP="OPEN_APP",M.KILL_APP="KILL_APP",M.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",M.SWIPE="SWIPE",M.SCROLL_TO="SCROLL_TO",M.SCREEN_CHECK="SCREEN_CHECK",M.ELEMENT_CHECK="ELEMENT_CHECK",M.DRAG_AND_DROP="DRAG_AND_DROP",M.JAVASCRIPT="JAVASCRIPT",M.REQUEST="REQUEST",M.WAIT="WAIT",M.ADD_FILE="ADD_FILE",M.INSTALL_APP="INSTALL_APP",M.UNINSTALL_APP="UNINSTALL_APP",M.TOGGLE_SETTINGS="TOGGLE_SETTINGS",M.ADB="ADB",M.STATE="STATE",M))(on||{}),Pa=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(Pa||{}),hm=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(hm||{}),xl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(xl||{}),jy=B.object({updatedAt:B.coerce.date().optional()}),Ye=B.object({id:B.string().uuid(),disableCache:B.boolean().optional()}),nO=Ye.extend({type:B.literal("STATE")}),oO=Ye.extend({type:B.literal("KILL_APP")}),xn=jy.extend({target:si}),Ml=jy.extend({fromTarget:si,toTarget:si}),fm=Ye.extend({type:B.literal("AI_CHECK"),assertion:B.string(),timeoutSecs:B.number().optional(),cache:yn.optional()}),Sm=Ye.extend({type:B.literal("TAP"),target:Rl,cache:xn.optional(),longPress:B.boolean().optional(),longPressDurationMs:B.number().optional(),doubleTap:B.boolean().optional(),doubleTapDelayMs:B.number().optional(),relativePosition:B.object({x:B.number(),y:B.number()}).optional()}),ym=Ye.extend({type:B.literal("TYPE"),target:Rl.optional(),cache:xn.optional(),keyPressDelayMs:B.number().optional(),text:B.string(),clearContent:B.boolean().optional(),forceClearContent:B.boolean().optional()});var iO=Ye.extend({type:B.literal("PRESS"),key:B.nativeEnum(Pa),longPress:B.boolean().optional()}),aO=Ye.extend({type:B.literal("PRESS_KEYBOARD"),key:B.nativeEnum(hm)}),sO=Ye.extend({type:B.literal("OPEN_APP"),packageName:B.string(),activityName:B.string().optional(),intentExtras:B.string().optional()}),lO=Ye.extend({type:B.literal("OPEN_NOTIFICATION_DRAWER")}),bm=Ye.extend({type:B.literal("SWIPE"),direction:B.enum(["up","down","left","right"]),scrollableElement:pm,cache:xn.optional(),viewportPercent:B.number().optional(),durationMs:B.number().optional()}),Em=Ye.extend({type:B.literal("SCROLL_TO"),target:mo,direction:B.enum(["down","up"]),scrollableElement:pm,scrollStepPercent:B.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:xn.optional()});var cO=B.object({type:B.literal("CONTENT"),negated:B.boolean().optional(),value:B.string()}),uO=Ye.extend({type:B.literal("SCREEN_CHECK"),assertion:cO,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),Tm=Ye.extend({type:B.literal("ELEMENT_CHECK"),target:Rl,cache:xn.optional(),assertion:Ks,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),vm=Ye.extend({type:B.literal("DRAG_AND_DROP"),fromTarget:mo,toTarget:mo,cache:Ml.optional(),hoverDuration:B.number().optional(),dragDuration:B.number().optional()}),dO=Ye.extend({type:B.literal("JAVASCRIPT"),code:B.string(),timeout:B.number().int().max(60).optional().describe("Max seconds for the code to complete")}),mO=Ye.extend({type:B.literal("REQUEST")}).merge(Qn),pO=Ye.extend({type:B.literal("WAIT"),timeoutSecs:B.number()}),gO=Ye.extend({type:B.literal("ADB"),command:B.string(),jsonArgs:B.string().optional()}),hO=Ye.extend({type:B.literal("ADD_FILE"),file:B.string(),storageLocation:B.string()}),fO=B.string().trim(),SO=Ye.extend({type:B.literal("INSTALL_APP"),uri:fO}),yO=Ye.extend({type:B.literal("UNINSTALL_APP"),packageName:B.string()}),bO=Ye.extend({type:B.literal("TOGGLE_SETTINGS"),settingsType:B.nativeEnum(xl)}),$y=B.discriminatedUnion("type",[fm,Sm,ym,iO,sO,lO,aO,bm,Em,uO,Tm,vm,dO,mO,pO,hO,SO,yO,bO,oO,gO,nO]);var li=r=>{switch(r.type){case"description":return r.description;case"coordinates":return`${r.xPercent}%, ${r.yPercent}%`}};var EO=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],Ky=de.object({type:de.enum(EO).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:de.string().or(de.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),TO=de.object({type:de.literal("TAP"),description:de.string().describe("Description of the element to tap."),longPress:de.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:de.boolean().describe("Whether to tap twice in quick succession."),relativePosition:de.null().or(de.object({x:de.number(),y:de.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
9
+ `)}`}};function fS(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator"):!1}function kd(r){return!(r instanceof Error)||r.message.includes("locator resolved to visible")?!1:!!(r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("body >")||r.message.includes("Element is not attached to the DOM"))}var Dr=class extends Error{retryableWithAI;constructor(e,t,n={}){super(e,n),this.name="CacheAttributesDisqualifyElementError",this.retryableWithAI=t}},ll=class extends Dr{constructor(e,t={}){super(e,!0,t),this.name="BoundingBoxMovedError"}},cl=class extends Dr{constructor(e,t={}){super(e,!1,t),this.name="ZeroOpacityError"}};function Ud(r){return r instanceof Error?r.message.includes("Could not find attribute data-momentic-id for object"):!1}var Fd="Element to be clicked has no bounding box";function SS(r){return r instanceof Error?r.message.startsWith(Fd):!1}function Bd(r){return r instanceof Error?r.message.includes("Timeout")&&r.message.includes("exceeded")&&r.message.includes("waiting for locator")&&r.message.includes("data-momentic-id")&&!r.message.includes("locator resolved")&&!r.message.includes("waiting for element to be"):!1}function zd(r){return r instanceof Error?r.message.includes("Protocol error (DOM.resolveNode): No node with given id found")||r.message.includes("Could not resolve backend node"):!1}var Sa=class extends Error{constructor(e,t={}){super(e,t),this.name="InsufficientCacheDataError"}};function ul(r){return r instanceof Error?r.message:String(r)}var EP={CLICK:"Click on an element on the page.",TYPE:"Focus the element then type the specified text into an input on the page.",PRESS:"Press one or more keyboard keys.",KEY_DOWN:"Hold down one or more keyboard keys.",KEY_UP:"Release one or more keyboard keys.",SELECT_OPTION:"Choose an option from a native <select> component. Never use this command for non <select> elements. Instead, use a series of CLICK commands for those.",NAVIGATE:"Go to the specified fully qualified URL.",SCROLL_UP:"Scroll up.",SCROLL_DOWN:"Scroll down.",GO_BACK:"Go back to the previous page.",HOVER:"Hover over an element.",AI_ASSERTION:"Verify a statement about the current page, retrying until it is true. Only generate an assertion if the goal includes language like 'check that', 'verify that', etc..",WAIT:"Wait a fixed amount of seconds.",DRAG:"Drag an element from one location and drop it onto another element.",JAVASCRIPT:"Execute JavaScript code in NODE or BROWSER environment.",ELEMENT_CHECK:"Perform a manual assertion on a specific element.",PAGE_CHECK:"Perform a manual case sensitive assertion on the page's html.",NEW_TAB:"Open a new browser tab with the specified URL.",WAIT_FOR_URL:"Wait for the URL to match a pattern.",AI_EXTRACT:"Extract data from the page and optionally store it in an environment variable.",COPY:"Copy the specified text value to the browser clipboard.",GO_FORWARD:"Navigate forward to the next page in the browser history (if available). Only use this after having navigated back with GO_BACK. Do not use this to navigate to a different page - use NAVIGATE instead.",LOCAL_STORAGE:"Set or get a value in the browser's localStorage. Use this to store data that persists across page reloads or to read stored values.",MOUSE_DRAG:"Drag the mouse from a starting point (or element) in a specific direction by pixel amounts. Prefer using DRAG (drag and drop between elements) instead unless the user explicitly requests dragging in a direction or by pixels. Use this when dragging needs to move a specific distance rather than to a target element.",PASTE:"Paste the contents of the browser clipboard into the currently focused element. Use this after copying text with COPY or when pasting content that was previously copied.",REFRESH:"Reload the current page. Use this to refresh the page content or retry a failed operation.",REQUEST:"Make an HTTP API request to a specified URL. Use this to interact with REST APIs, send data to a server, or retrieve data from an endpoint. Supports GET, POST, PUT, DELETE, and PATCH methods with custom headers, query parameters, and request body.",GRAPHQL_REQUEST:"Make a GraphQL request to a specified URL. Provide the GraphQL query (or mutation), optional variables JSON, and any required headers. Use this for GraphQL APIs instead of REQUEST."};Md.options.forEach(r=>{let e=r.shape.type.value;if(e!=="SUCCESS"&&!EP[e])throw new Error(`Command type ${e} is missing a description`)});var yS=T.object({type:T.literal("CLICK"),description:T.string().describe("Description of the element to click in the Current Page. Never click on <select> elements, see SELECT_OPTION."),doubleClick:T.boolean().or(T.null()),rightClick:T.boolean().or(T.null())}),bS=T.object({type:T.literal("TYPE"),description:T.string().describe("Description of the element to type into, which must be an <input>, <textarea>, or contenteditable element."),text:T.string().describe("The text to enter, truncated to 500 characters. If the PM provided text in the goals, use it exactly without modification."),pressEnter:T.boolean().or(T.null()).describe("Press enter after typing (useful for form submissions)."),clearContent:T.boolean().describe("Clear existing content before typing. Disable to append to the existing text.")}),ES=T.object({type:T.literal("GO_BACK")}),TP=T.object({type:T.literal("GO_FORWARD")}),vP=T.object({type:T.literal("LOCAL_STORAGE"),key:T.string().describe("The localStorage key to set or get."),value:T.string().describe("The value to store in localStorage. If reading, this can be empty.")}),TS=T.object({type:T.literal("PRESS"),keys:T.array(T.string()).describe('The keys to press. Only use key names supported by the Playwright press method, such as "a", "ArrowLeft", "Meta", "Control", and "Enter". Multiple keys will be pressed together. Do not suggest platform-specific key combinations, such as CTRL+C.')}),vS=T.object({type:T.literal("SELECT_OPTION"),description:T.string().describe("Description of the <select> element to choose from. Only use this command to interact with native HTML <select> elements. You must use CLICK to select from any other HTML element, such as <input>, <div>, or custom elements."),option:T.discriminatedUnion("type",[T.object({type:T.literal("VALUE"),value:T.string()}),T.object({type:T.literal("LABEL"),label:T.string()}),T.object({type:T.literal("INDEX"),index:T.string().describe("Zero-based index of the option within the select.")})]).describe("Which option to select. Choose 1 of 3 strategies for selecting. By value is exactly matching the 'value' attribute. By label is exactly matching the 'label' attribute. By index is using the zero-based index of the option within the select.")}),AS=T.object({type:T.literal("NAVIGATE"),url:T.string().describe("The URL to navigate to. Only navigate to URLs relevant to the user goal.")}),wS=T.object({type:T.literal("SCROLL"),y:T.number().describe("Scroll up or down by the specified pixels. Positive values scroll down.")}),CS=T.object({type:T.literal("WAIT"),timeout:T.number().describe("The number of seconds to wait.")}),RS=T.object({type:T.literal("AI_ASSERTION"),assertion:T.string().describe("The assertion to verify. This should be a statement verifiable based on the current page HTML or screenshot. Be specific enough that the assertion is not ambiguous or open to interpretation. Make sure the assertion aligns with what the user intends to verify."),timeout:T.number().describe("The max amount of seconds to wait for the assertion to be true. Respect user wishes but allow no more than 60. If unspecified, choose 5 for quick checks like form status, 10 for page loads, and 30 for actions that explicitly trigger a long time, like image generation.")}),xS=T.object({type:T.literal("HOVER"),description:T.string().describe("Description of the element to hover over. Prefer elements that have visible bounding boxes according to the screenshot, element class attribute, or child contents.")}),AP=T.object({type:T.literal("COPY"),value:T.string().describe("The text value to copy to the browser clipboard. This should be the exact text that needs to be copied.")}),wP=T.object({type:T.literal("PASTE")}),CP=T.object({type:T.literal("REFRESH")}),RP=T.object({type:T.literal("REQUEST"),url:T.string().describe("The URL to send the HTTP request to. Can be a full URL or relative path."),method:T.enum(["GET","POST","PUT","DELETE","PATCH"]).describe("The HTTP method to use. GET for retrieving data, POST for creating resources, PUT for updating resources, DELETE for removing resources, PATCH for partial updates."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),params:T.record(T.string(),T.string()).or(T.null()).describe("Optional URL query parameters as key-value pairs. These will be appended to the URL as ?key1=value1&key2=value2."),body:T.string().or(T.null()).describe("Optional request body as a string. For JSON data, stringify the object. Typically used with POST, PUT, or PATCH requests."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),xP=T.object({type:T.literal("GRAPHQL_REQUEST"),url:T.string().describe("The URL of the GraphQL endpoint. Can be a full URL or relative path."),headers:T.record(T.string(),T.string()).or(T.null()).describe("Optional HTTP headers as key-value pairs. Common headers include 'Content-Type', 'Authorization', 'Accept', etc."),query:T.string().describe("The GraphQL query or mutation string. Include any required fields and arguments."),variables:T.string().or(T.null()).describe("Optional JSON string of variables to pass with the GraphQL request."),timeout:T.number().int().or(T.null()).describe("Optional maximum number of seconds to wait for the request to complete. Defaults to 30 seconds if not specified.")}),MS=T.object({type:T.literal("DRAG"),fromDescription:T.string().describe("Description of the element to drag. Prefer precise identifiers or text that clearly distinguishes the element."),toDescription:T.string().describe("Description of the element to drop onto. Ensure the drop target is interactable and visible."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag. Do not use this unless the user tells you to."),hoverSeconds:T.number().positive().or(T.null()).describe("Optional seconds to hover over the destination before releasing the drag.")}),MP=T.object({type:T.literal("MOUSE_DRAG"),description:T.string().or(T.null()).describe("Optional description of the element to start the drag from. If not provided, starts from current mouse position."),deltaX:T.number().describe("Number of pixels to move horizontally (positive = right, negative = left)."),deltaY:T.number().describe("Number of pixels to move vertically (positive = down, negative = up)."),steps:T.number().int().positive().or(T.null()).describe("Optional number of intermediate mouse move steps during the drag.")}),_P=T.object({type:T.literal("JAVASCRIPT"),code:T.string().describe("JavaScript code to execute. Defaults to NODE environment unless BROWSER is specified."),environment:T.union([T.literal("NODE"),T.literal("BROWSER")]).or(T.null()).describe("Execution environment. Default is NODE."),timeout:T.number().or(T.null()).describe("Max seconds for the code to complete. Max 60 seconds.")}),PP=T.object({type:T.literal("AI_EXTRACT"),goal:T.string().describe("Description of what data to extract from the page. Be specific about what you want to extract and where to find it."),schema:T.string().or(T.null()).describe("JSON schema defining the expected structure of the extracted data."),envKey:T.string().or(T.null()).describe("Environment variable name to store the extracted result in. If provided, the result will be stored and can be referenced later."),iframeUrl:T.string().or(T.null()).describe("URL or URL regex for the iframe to extract data from.")}),IP=T.object({type:T.literal("ELEMENT_CHECK"),description:T.string().describe("Description of the element to check."),assertionType:T.enum(["EXISTS","VISIBLE","CONTENT_CONTAINS","CONTENT_EQUALS"]).describe("The type of assertion. EXISTS checks if element exists, VISIBLE checks if visible, CONTENT_CONTAINS checks if text contains value, CONTENT_EQUALS checks if text equals value."),value:T.string().or(T.null()).describe("The value to check against (required for CONTENT assertions)."),negated:T.boolean().or(T.null()).describe("If true, asserts the opposite (e.g., does NOT exist)."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),OP=T.object({type:T.literal("PAGE_CHECK"),value:T.string().describe("The text content to check for on the page."),negated:T.boolean().or(T.null()).describe("If true, checks that the content is NOT present."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the assertion to be true.")}),LP=T.object({type:T.literal("NEW_TAB"),url:T.string().describe("The URL to open in the new tab.")}),NP=T.object({type:T.literal("WAIT_FOR_URL"),matcher:T.discriminatedUnion("type",[T.object({type:T.literal("SUBSTRING"),url:T.string()}),T.object({type:T.literal("GLOB"),glob:T.string()}),T.object({type:T.literal("REGEX"),regex:T.string()}),T.object({type:T.literal("DOMAIN"),domain:T.string()})]).describe("How to match the URL."),caseInsensitive:T.boolean().or(T.null()),negated:T.boolean().or(T.null()).describe("Wait for the URL to NOT match instead."),timeout:T.number().or(T.null()).describe("Max seconds to wait for the URL.")}),Hd=T.object({type:T.literal("SUCCESS")}),Gd=T.object({type:T.literal("FAILURE")}),_S=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES]),DP=T.discriminatedUnion("type",[..._S.options,MS]),ml=T.discriminatedUnion("type",[yS,bS,TS,vS,AS,wS,CS,RS,xS,ES,MS,_P,IP,OP,LP,NP,PP,AP,TP,vP,MP,wP,CP,RP,xP]),R2=ha(ml),x2=T.discriminatedUnion("type",[...ml.options,Hd,Gd]),M2=ha(T.discriminatedUnion("type",[..._S.options,Hd,Gd])),_2=ha(T.discriminatedUnion("type",[...DP.options,Hd,Gd])),P2=T.object({command:T.unknown(),thoughts:T.string()});import{z as Vd}from"zod";import{extendZodWithOpenApi as FP}from"zod-openapi";import{z as PS}from"zod";import{extendZodWithOpenApi as kP}from"zod-openapi";import{z as wn}from"zod";var tr=wn.object({index:wn.number().optional().describe("global index within a test (in-order traversal)"),id:wn.string(),skipped:wn.boolean().optional(),comment:wn.string().optional(),envKey:wn.string().optional().describe("key in the environment to save the result of this step to"),aiSuggested:wn.boolean().optional(),retries:wn.number().optional()});kP(PS);var UP=tr.extend({type:PS.literal("PRESET_ACTION")}),rr=UP.extend({command:Jo}).openapi({ref:"PresetAction"});FP(Vd);var to=tr.extend({type:Vd.literal("AI_ACTION"),text:Vd.string(),steps:rr.array().optional()}).openapi({ref:"AIAction"});import{z as kt}from"zod";import{z as pl}from"zod";import{extendZodWithOpenApi as BP}from"zod-openapi";BP(pl);var Zo=tr.extend({type:pl.literal("AI_ACTION_DYNAMIC"),text:pl.string(),retries:pl.number().optional()}).openapi({ref:"AIActionDynamic"});import{z as IS}from"zod";var Wd=tr.extend({type:IS.literal("CONDITIONAL"),skipped:IS.boolean().optional()});import{z as Se}from"zod";var zP=Se.object({cacheKey:Se.string(),cacheExpiryMs:Se.number()}),jd=tr.extend({id:Se.string().uuid().describe("ID of the module step itself. Used to 'namespace' step cache entries."),inputs:Se.record(Se.string()).optional(),cacheConfig:zP.optional()}),rn=jd.extend({type:Se.literal("MODULE"),moduleId:Se.string().uuid()}),HP=Se.union([rn.pick({type:!0,moduleId:!0}),Se.record(Se.unknown())]),GP=Se.object({type:Se.literal("URL_REGEX"),regex:Se.string()}),VP=Se.object({type:Se.literal("PAGE_CHECK"),substring:Se.string()}),$d=Se.object({cacheInvalidation:Se.discriminatedUnion("type",[VP,GP]).optional()}),nr=Se.object({moduleId:Se.string().uuid(),name:Se.string(),description:Se.string().nullish(),enabled:Se.boolean().nullish(),parameters:Se.string().array().nullish(),defaultParameters:Se.record(Se.string(),Se.string()).nullish(),parameterEnums:Se.record(Se.string(),Se.string().array()).nullish(),defaultCacheKey:Se.string().nullish(),defaultCacheTtl:Se.number().nullish(),defaultCacheAllInvocations:Se.boolean().nullish(),autoAuth:Se.boolean().nullish(),advanced:$d.nullish()});import{z as or}from"zod";var OS=(n=>(n.ALWAYS="ALWAYS",n.ON_FAILURE="ON_FAILURE",n.ON_ACTION_FAILURE="ON_ACTION_FAILURE",n))(OS||{});var WP=or.discriminatedUnion("type",[or.object({type:or.literal("NAVIGATE_URL"),url:or.string().url()}),or.object({type:or.literal("GO_TO_SECTION_START")})]),jP=or.object({trigger:or.nativeEnum(OS).optional(),attempts:or.number().int().optional(),restartBehavior:WP}),ya=tr.extend({type:or.literal("SECTION"),description:or.string().describe("user provided goal of what the section should accomplish"),plan:or.string().array().optional(),autohealingConfig:jP.optional()});var LS=nr.merge(jd).extend({type:kt.literal("RESOLVED_MODULE"),steps:kt.lazy(()=>ut.array())}),qd=nr.extend({steps:kt.lazy(()=>ut.array())}),Kd=ya.extend({steps:kt.lazy(()=>Ut.array())}),$P=ya.extend({steps:kt.lazy(()=>ut.array())}),ei=Wd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>Ut.array())}).array(),elseSteps:kt.lazy(()=>Ut.array().optional())}),qP=Wd.extend({blocks:kt.object({assertion:kt.lazy(()=>rr),steps:kt.lazy(()=>ut.array())}).array(),elseSteps:kt.lazy(()=>ut.array().optional())}),Ut=kt.discriminatedUnion("type",[rr,to,Zo,rn,ei,Kd]),ut=kt.discriminatedUnion("type",[rr,to,Zo,LS,qP,$P]);import{z as ir}from"zod";var KP=ir.object({steps:Ut.array(),beforeSteps:Ut.array().nullish(),afterSteps:Ut.array().nullish()}),ro=ir.object({steps:ut.array(),beforeSteps:ut.array().nullish(),afterSteps:ut.array().nullish()}),no=ir.object({steps:ir.record(ir.string(),ir.unknown()).array(),beforeSteps:ir.record(ir.string(),ir.unknown()).array().nullish(),afterSteps:ir.record(ir.string(),ir.unknown()).array().nullish()});var Cn="1.0.22",oo="0.0.2";import{z as Ct}from"zod";import{z as io}from"zod";var YP=/^[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}$/,nn=r=>{let e=r.trim().toLowerCase().replace(/[^a-z0-9]/g,"-");for(;e.includes("--");)e=e.replaceAll("--","-");return e.startsWith("-")&&(e=e.slice(1)),e.endsWith("-")&&(e=e.slice(0,e.length-1)),e};var ti=io.string().min(1).max(255).superRefine((r,e)=>{try{ba(r)}catch(t){return e.addIssue({code:io.ZodIssueCode.custom,message:t.message,fatal:!0}),io.NEVER}});function ba(r){if(r=r.toLowerCase().trim(),r.length===0||r.length>255)throw new Error("Name must be between 1 and 255 characters long");if(/[<>:"/\\|?*]/.test(r))throw new Error('Name contains one of the following invalid characters: <>:"/\\|?*');if(r.endsWith("-")||r.startsWith("-"))throw new Error("Name cannot start or end with a dash.");if(r.includes("\0"))throw new Error("Name cannot contain null characters");if(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i.test(r))throw new Error(`"${r}" is a reserved name on Windows and cannot be used as a filename.`);if(/^\.+$/.test(r)||/^\s|\s$/.test(r))throw new Error("Name cannot start or end with a space or dot.");if(r.endsWith(".yaml"))throw new Error('Name cannot end with ".yaml".');if(r==="none")throw new Error("Name cannot be 'none'.");if(r.match(YP))throw new Error("Name cannot be a UUID. Please choose a different name.")}var gl=io.preprocess(r=>r===null?"":r,io.union([io.string().url(),io.literal("")])).optional();var XP=["AI_EXTRACT","JAVASCRIPT","REQUEST","GRAPHQL_REQUEST","AUTH_SAVE","COPY"],JP=Ct.object({id:Ct.string().optional().describe("Recommended way of selecting an entity. The id of the entity to resolve."),name:ti.optional().describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),path:Ct.string().optional().describe("The path of the entity to resolve.")}).describe("A selector for a single entity. Exactly one of id, name, or path must be provided. Id is recommended.").refine(r=>[r.id,r.name,r.path].filter(Boolean).length===1,"Exactly one of id, name, or path must be provided."),QP=Ct.object({selector:JP,inputs:Ct.record(Ct.string()).or(Ct.null())}),$K=Ct.object({type:Ct.literal("PRESET_ACTION"),action:ml,envKey:Ct.string().or(Ct.null()).describe(`key in the environment to save the result of this step to. Only use this for ${XP.join(" or ")} steps.`)}),qK=Ct.object({type:Ct.literal("MODULE"),module:QP}),KK=Ct.object({type:Ct.literal("AI_ACTION_DYNAMIC"),text:Ct.string().describe("The goal description for the AI action. Supports handlebars templates like {{env.VARIABLE_NAME}}.")});var NS=_.object({phrase:_.string()}),Yd=_.object({thoughts:_.string().optional(),result:_.union([_.literal("NOT_FOUND"),_.string(),_.number(),_.array(_.unknown()),_.record(_.unknown(),_.unknown()),_.unknown()])}),_Y=_.object({text:_.string()}),ZP=_.boolean().or(_.nativeEnum(It)).transform(r=>!(!r||r==="irrelevant")),DS=_.object({attributes:_.array(_.string()).nullish(),text:ZP.nullish(),position:_.nativeEnum(It).nullish(),shape:_.nativeEnum(It).nullish()}),eI=_.object({id:_.number().int(),requirements:DS}),tI=eI.array(),kS=_.object({thoughts:_.string(),review:_.string().optional(),id:_.number().int(),updatedMemory:ta.optional(),requirements:DS.nullish().transform(r=>{if(r!==null)return r}),additionalElements:tI.nullish().transform(r=>{if(r!==null)return r})});var Xd=(p=>(p.NO_DESCRIPTION_PROVIDED="NO_DESCRIPTION_PROVIDED",p.FEW_WORDS="FEW_WORDS",p.STYLE_TAG="STYLE_TAG",p.TYPE_IN_DESCRIPTION="TYPE_IN_DESCRIPTION",p.HARDCODED_ATTRIBUTE="HARDCODED_ATTRIBUTE",p.NONE="NONE",p.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",p.AMBIGUOUS_ASSERTION="AMBIGUOUS_ASSERTION",p.PREFER_PAGE_CHECK="PREFER_PAGE_CHECK",p.PREFER_ASSERTION="PREFER_ASSERTION",p.HTML_ELEMENTS="HTML_ELEMENTS",p.MULTIPLE_ELEMENTS_DESCRIPTION="MULTIPLE_ELEMENTS_DESCRIPTION",p.NEEDS_DATE_VARIABLE="NEEDS_DATE_VARIABLE",p))(Xd||{}),US=(o=>(o.NONE="NONE",o.AMBIGUOUS_DESCRIPTION="AMBIGUOUS_DESCRIPTION",o.COPILOT_MISUSE="COPILOT_MISUSE",o.IRRELEVANT_MESSAGE="IRRELEVANT_MESSAGE",o))(US||{});var FS=_.object({thoughts:_.string(),category:_.nativeEnum(Xd)}),BS=_.object({thoughts:_.string(),category:_.nativeEnum(US)}),zS=_.object({anyUntestedSteps:_.boolean().describe("True if any steps (especially new/edited) were not fully run (preview + add) or if their immediately following step, if any, was not run."),possibleErrors:_.object({error:_.string(),solutionFound:_.object({description:_.string(),passedSuccessfully:_.boolean().describe("Whether the solution passed successfully")})}).array().describe("Information about any errors we encountered and how we solved them"),safeToContinue:_.boolean().describe("Whether it is safe to continue or if we are stuck and need intervention"),finalReport:_.string().describe("A final summary report of the session, are we stuck, can we go forward, do we need help, or are we good to go?")}),HS=_.object({summary:_.string().describe("Single large block of text summary of the full chat thread; high-signal only."),errorsRanInto:_.array(_.object({error:_.string(),workAround:_.string()})).default([]).describe("List of encountered errors and mitigations."),untestedSteps:_.array(_.string()).default([]).describe("Steps added/discussed but not validated.")}),rI=_.discriminatedUnion("op",[_.object({op:_.literal("replace"),path:_.string(),value:_.string()}),_.object({op:_.literal("add"),path:_.string(),value:_.string()}),_.object({op:_.literal("remove"),path:_.string()})]),PY=_.object({thoughts:_.string(),patches:rI.array()}),nI=[_.literal("add"),_.literal("replace"),_.literal("remove")],oI=_.object({op:_.union(nI),path:_.string(),value:ut.optional()}),GS=_.object({patches:oI.array(),thoughts:_.string()}),VS=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(VS||{}),WS=_.object({thoughts:_.string(),scenario:_.nativeEnum(VS),instructions:_.string().nullish()}),jS=_.object({reasoning:_.string(),scenario:_.string(),patch:_.null().optional()}),IY=_.object({thoughts:_.string(),evaluation:_.number().min(0).max(10)}),OY=_.object({observations:_.string(),reasoning:_.string(),command:el});var Jd=_.object({summary:_.string(),reasoning:_.string(),evaluation:_.discriminatedUnion("type",[_.object({type:_.literal("DONE")}),_.object({type:_.literal("RIGHT_TRACK")}),_.object({type:_.literal("WRONG_TRACK"),feedback:_.string()}),_.object({type:_.literal("IMPOSSIBLE")})])}),iI=_.object({startId:_.number().int(),endId:_.number().int()}),$S=(n=>(n.SIMPLE_CONTENT_BASED_LOCATOR="SIMPLE_CONTENT_BASED_LOCATOR",n.SIMPLE_CONTENT_BASED_ASSERTION="SIMPLE_CONTENT_BASED_ASSERTION",n.OTHER="OTHER",n))($S||{}),qS=_.object({categoryThoughts:_.string(),category:_.nativeEnum($S),relevantSections:iI.array()}),on=_.boolean().nullish().transform(r=>r??!1),KS=_.object({thoughts:_.string().optional(),isPageReady:on,descriptionLabels:_.object({usesTextContent:on,usesAppearance:on,usesPosition:on,usesRelativeElements:on,usesSingleQuotes:on,isAmbiguous:on,targetDoesNotExist:on,usesIcon:on}).optional()});import{z as O}from"zod";import*as ie from"zod";var FY=ie.object({thoughts:ie.string().optional().describe("only provided if a description was provided"),target:Sn.optional().describe("only provided if a description was provided"),pageState:ie.string().optional().describe("serialized a11y tree, only provided if a description was provided"),options:ie.object({label:ie.string(),value:ie.string()}).array().optional().describe("list of options, provided for <select> elements only"),screenshot:ie.object({data:ie.string(),height:ie.number().int(),width:ie.number().int()}).optional().describe("only provided if returnScreenshot is true")}),YS=ie.union([ie.literal("ELEMENT_CHECK"),ie.literal("NEGATED_CHECK"),ie.literal("NEGATED_ELEMENT_VISIBLE_CHECK"),ie.literal("SELECT_OPTION"),ie.literal("TYPE")]);function Ea(r){if(!("useSelector"in r&&r.useSelector)){if(r.type==="SELECT_OPTION")return"SELECT_OPTION";if(r.type==="TYPE")return"TYPE";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="EXISTS"&&r.assertion.negated)return"NEGATED_CHECK";if(r.type==="ELEMENT_CHECK"&&r.assertion.type==="ELEMENT_EXISTENCE"&&r.assertion.condition==="VISIBLE"&&r.assertion.negated)return"NEGATED_ELEMENT_VISIBLE_CHECK";if(r.type==="ELEMENT_CHECK")return"ELEMENT_CHECK"}}var Ta=(a=>(a.USER_SELECTOR="USER_SELECTOR",a.CSS_SELECTOR="CSS_SELECTOR",a.HYBRID_SELECTOR="HYBRID_SELECTOR",a.HTML_DISTANCE="HTML_DISTANCE",a.TEMPLATE_MATCHING="TEMPLATE_MATCHING",a.AUTO_FRAME="AUTO_FRAME",a))(Ta||{}),ri=ie.object({matched:ie.boolean(),reason:ie.string().optional().describe("Human understandable description"),logs:ie.string().array().optional().describe("Logs for debugging")}),aI=ri.extend({type:ie.literal("USER_SELECTOR")}),sI=ri.extend({type:ie.literal("CSS_SELECTOR"),selectors:ie.string().array()}),lI=ri.extend({type:ie.literal("HYBRID_SELECTOR")}),cI=ri.extend({type:ie.literal("HTML_DISTANCE"),distance:ie.number().optional(),closestElement:ie.string().optional(),savedElement:ie.string().optional()}),uI=ri.extend({type:ie.literal("TEMPLATE_MATCHING"),elementImageUrl:ie.string().url()}),dI=ri.extend({type:ie.literal("AUTO_FRAME"),logs:ie.string().array().optional()}),XS=ie.discriminatedUnion("type",[aI,sI,lI,cI,uI,dI]);import{z as Ra}from"zod";import{z as vI}from"zod";import*as q from"zod";import{extendZodWithOpenApi as gI}from"zod-openapi";import{cloneDeep as tX}from"lodash-es";import nX from"truncate-json";import*as lo from"zod";import{extendZodWithOpenApi as pI}from"zod-openapi";import{z as Rt}from"zod";import{z as te}from"zod";import{z as Qd}from"zod";var kr=(o=>(o.CHROMIUM="Chromium",o.GOOGLE_CHROME="Google Chrome",o.CHROME_FOR_TESTING="Chrome for Testing",o.ORG_DEFAULT="Org Default",o))(kr||{});var hl=Qd.object({width:Qd.number().min(200).max(1e4),height:Qd.number().min(200).max(1e4)}),JS={"Desktop Large":{width:1920,height:1080},"Desktop Small":{width:1280,height:800},iPad:{width:768,height:1024},"Pixel 8":{width:448,height:998},"iPhone 15":{width:393,height:852}},HY=Object.keys(JS);var Rn=JS["Desktop Large"],QS="en-us",ZS="America/Los_Angeles";var fl={latitude:37.7749,longitude:-122.4194};var Sl=(a=>(a.ClipboardRead="clipboard-read",a.ClipboardWrite="clipboard-write",a.Microphone="microphone",a.Camera="camera",a.Geolocation="geolocation",a.LocalNetworkAccess="local-network-access",a))(Sl||{});var Zd=te.object({autoFollowNewTabs:te.boolean().optional().describe("Deprecated: Auto-follow new tabs that are opened."),showZeroOpacityElements:te.union([te.boolean(),te.literal("inputs-only")]).optional(),ignoreHrefForCaching:te.boolean().optional(),disableSecondaryCacheResolution:te.boolean().optional(),hybridSelectorMode:te.enum(["off","test","prefer"]).optional(),globalLocatorRedirect:te.union([te.boolean(),te.literal("always")]).optional(),visualActions:te.boolean().optional(),autoExpandIframes:te.boolean().optional(),disableHtmlSnapshots:te.boolean().optional(),defaultBrowserType:te.nativeEnum(kr).optional(),importantAttributes:te.string().array().optional(),importantClasses:te.string().array().optional(),importantStyles:te.string().array().optional()});var ey=1e4,ty=6e4,mI=te.object({server:te.string(),username:te.string().optional(),password:te.string().optional()}),ao=Zd.extend({pageLoadTimeoutMs:te.number().optional().refine(r=>r===void 0||r<=ty&&r>=-1,{message:`Page load timeout must be between 0 and ${ty/1e3} seconds`}).describe("global page load timeout default for all tests in ms, can still be overridden by individual tests"),smartWaitingTimeoutMs:te.number().optional().refine(r=>r===void 0||r<=ey&&r>=-1,{message:`Smart waiting timeout must be between 0 and ${ey/1e3} seconds`}),localChromeExtensionPaths:te.string().array().optional(),extraHeaders:te.record(te.string(),te.string()).optional().describe("HTTP headers to be sent on every request"),initialLocalStorage:te.record(te.string(),te.record(te.string(),te.string())).optional().describe("Initial local storage key-value pairs to set per domain on browser startup"),userAgent:te.string().optional(),disableGpu:te.boolean().optional(),disableBrowserMonitoring:te.boolean().optional().describe("Disable console logs and network request recording, which power the console and network tab in the run viewer"),disableConsoleLogs:te.boolean().optional().describe("Disable console log recording in the run viewer."),disableNetworkLogs:te.boolean().optional().describe("Disable network request recording in the run viewer."),bustCacheOnBoundingBoxChange:te.boolean().optional().describe("This setting is deprecated. Bust the cache if no elements are matched that have the same bounding box and location as the original element. This will improve accuracy on sites that use many same components, at the expense of stability and speed."),allowPartialAccessibilityTree:te.boolean().optional().describe("Allow fetching the partial accessibility tree if fetching the full tree takes too long."),ignoreHttpsErrors:te.boolean().optional().describe("Ignore HTTPS errors, such as self-signed certificates and certificate errors. This can be useful for testing sites that use self-signed certificates or certificate errors."),proxy:mI.optional().describe("HTTP proxy server to use for the entire browser. This can dramatically increase network latency."),disableFullStory:te.boolean().optional().describe("Disable FullStory, a third-party analytics tool that can significantly impact browser performance. This can be useful for testing sites that use FullStory."),grantedPermissions:te.nativeEnum(Sl).array().optional().describe("List of permissions to grant to sites. If not provided, all permissions are granted.")});var em="BASE_URL";var so="ENV_NAME",ni="TEST_NAME",XY={[em]:"https://www.google.com"},ry=Rt.string().describe("Name of the fixture (must be available locally in the fixtures directory)."),ny=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.string().describe("variable value"))}),oy=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value")),browser:ao.optional()});var JY=Rt.object({name:Rt.string(),variables:Rt.record(Rt.string().describe("variable name"),Rt.unknown().describe("variable value"))});pI(lo);var tm=lo.object({env:lo.record(lo.unknown())}).openapi({ref:"TestContextSnapshot"});var Ke=(i=>(i.SUCCESS="SUCCESS",i.FAILED="FAILED",i.RUNNING="RUNNING",i.IDLE="IDLE",i.CANCELLED="CANCELLED",i))(Ke||{}),rm=(n=>(n.SUCCESS="SUCCESS",n.FAILED="FAILED",n.CANCELLED="CANCELLED",n))(rm||{});gI(q);var nm=q.object({beforeUrl:q.string().optional(),afterUrl:q.string().optional(),message:q.string().optional(),beforeSnapshot:q.string().optional(),afterSnapshot:q.string().optional(),startedAt:q.coerce.date(),finishedAt:q.coerce.date()}),hI=nm.extend({viewport:q.object({height:q.number(),width:q.number()}).nullish(),status:q.nativeEnum(rm),message:q.string().optional(),elementInteracted:q.string().optional()}),co=nm.extend({status:q.nativeEnum(Ke),message:q.string().optional(),data:q.unknown().optional(),beforeTestContext:tm.optional(),afterTestContext:tm.optional(),failureReason:q.nativeEnum(Re).optional(),details:q.unknown().describe("Parse using StepExecutionLogSchema.array() to get type safety. We don't explicitly type it because it's non-critical information.")}).openapi({ref:"StepResultMetadata"}),iy=(t=>(t.NOT_ELIGIBLE="NOT_ELIGIBLE",t.ATTEMPTED="ATTEMPTED",t))(iy||{}),yl=co.merge(rr).extend({results:hI.array().describe("Command that was executed. Array is just for consistency with other result types. There should only ever be one item."),previousAttempts:q.lazy(()=>pt.array()).optional(),failureRecoveryStatus:q.object({type:q.nativeEnum(iy),message:q.string()}).optional()}),fI=co.merge(to).extend({results:q.lazy(()=>yl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),SI=co.merge(Zo).extend({results:q.lazy(()=>yl.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),yI=co.merge(rn).extend({moduleName:q.string().optional(),results:q.lazy(()=>pt.array()),previousAttempts:q.lazy(()=>pt.array()).optional()}),bI=co.merge(ei).extend({assertionResult:yl.optional(),results:q.lazy(()=>pt.array()).describe("results for the block actually executed"),previousAttempts:q.lazy(()=>pt.array()).optional()}),EI=co.merge(ya).extend({results:q.lazy(()=>pt.array()),healingAttempts:q.lazy(()=>pt.array().array()).optional(),previousAttempts:q.lazy(()=>pt.array()).optional()}),pt=q.discriminatedUnion("type",[fI,SI,yl,yI,bI,EI]),bX=co.pick({startedAt:!0,finishedAt:!0,status:!0,message:!0,data:!0}),TI=nm.extend({index:q.number().optional(),userFacingStepReference:q.string().optional(),description:q.string(),pageState:q.string().optional(),elementInteracted:q.string().optional(),startedAt:q.coerce.date().or(q.string()).optional().catch(void 0),finishedAt:q.coerce.date().or(q.string()).optional().catch(void 0)}),bl=TI.extend({beforeScreenshot:q.string().optional(),afterScreenshot:q.string().optional()});var om=vI.object({results:pt.array().describe("main results"),beforeResults:pt.array().optional(),afterResults:pt.array().optional()}),va=om.partial();import{z as H}from"zod";import{extendZodWithOpenApi as _I}from"zod-openapi";var oi=(t=>(t.WEB="WEB",t.ANDROID="ANDROID",t))(oi||{});import{isValidCron as AI}from"cron-validator";import{z as ce}from"zod";var ay=["Africa/Abidjan","Africa/Accra","Africa/Algiers","Africa/Bissau","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/El_Aaiun","Africa/Johannesburg","Africa/Juba","Africa/Khartoum","Africa/Lagos","Africa/Maputo","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Argentina/Buenos_Aires","America/Argentina/Catamarca","America/Argentina/Cordoba","America/Argentina/Jujuy","America/Argentina/La_Rioja","America/Argentina/Mendoza","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Araguaina","America/Asuncion","America/Atikokan","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Cayenne","America/Chicago","America/Chihuahua","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Indianapolis","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Inuvik","America/Iqaluit","America/Jamaica","America/Juneau","America/Kentucky/Louisville","America/Kentucky/Monticello","America/La_Paz","America/Lima","America/Los_Angeles","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nipigon","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Pangnirtung","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Thunder_Bay","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","America/Yellowknife","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Chita","Asia/Choibalsan","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Kathmandu","Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Riyadh","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Currie","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zaporozhye","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Chuuk","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Pohnpei","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Wake","Pacific/Wallis"];var sy=1e4,wI=ao.extend({browserType:ce.nativeEnum(kr).optional(),slowMoMs:ce.number().optional().refine(r=>r===void 0||r<=sy&&r>=-1,{message:`Slow motion must be between 0 and ${sy} milliseconds`}),basicAuthorization:ce.object({username:ce.string().optional(),password:ce.string().optional()}).optional(),geolocation:ce.object({latitude:ce.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:ce.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional(),disableJavaScript:ce.boolean().optional(),locale:ce.string().optional(),timezone:ce.enum(ay).optional(),colorScheme:ce.enum(["light","dark"]).optional()});var Aa=ce.object({useMemory:ce.boolean().optional(),failureRecovery:ce.boolean().optional().describe("undefined means inherit org settings")}),CI=Aa.extend({disableAICaching:ce.boolean().optional(),failureRecoveryInstructions:ce.string().optional()}),RI=ce.object({viewport:hl.optional()}),wa=RI.merge(CI).merge(wI),ii=ce.object({cron:ce.string().refine(r=>AI(r),{message:"Invalid cron expression."}).default("0 0 */1 * *"),enabled:ce.boolean().default(!1),env:ce.string().optional(),timeZone:ce.string().default("America/Los_Angeles"),jobKey:ce.string().optional()}),ai=ce.object({onSuccess:ce.boolean().default(!1),failureMessage:ce.string().optional(),onFailure:ce.boolean().default(!0),successMessage:ce.string().optional()}),xI=ce.object({name:ce.string(),required:ce.boolean().optional(),defaultValue:ce.string().describe("this is not optional because we need a value when the editor is first loaded")}),El=xI.array(),MI=ce.object({name:ce.string(),value:ce.string()}),ly=MI.array(),Tl=ce.object({name:ce.string(),default:ce.boolean().optional(),fixtures:ry.array().optional()});_I(H);var ar={WEBHOOK:"WEBHOOK",CRON:"CRON",MANUAL:"MANUAL",CLI:"CLI"},xe=(s=>(s.PENDING="PENDING",s.RUNNING="RUNNING",s.PASSED="PASSED",s.FAILED="FAILED",s.CANCELLED="CANCELLED",s.RETRYING="RETRYING",s.WAITING_FOR_USER="WAITING_FOR_USER",s))(xe||{}),vl=(t=>(t.BEFORE_ALL="BEFORE_ALL",t.AFTER_ALL="AFTER_ALL",t))(vl||{});var ot=H.string().pipe(H.coerce.date()).or(H.date()),Ca=H.object({id:H.string(),runKey:H.string(),organizationId:H.string(),executionType:H.nativeEnum(oi).optional().default("WEB"),createdAt:ot,createdBy:H.string(),flake:H.boolean().nullish(),scheduledAt:ot.or(H.null()),startedAt:ot.or(H.null()),updatedAt:ot.nullish(),finishedAt:ot.or(H.null()),resolvedBaseUrl:H.string().nullish(),environmentName:H.string().nullish(),gitBranchName:H.string().nullish(),githubRepository:H.string().nullish(),gitlabProjectPath:H.string().nullish(),labels:H.array(H.string()).optional(),gitOriginUrl:H.string().nullish(),gitCommitSha:H.string().nullish(),gitCommitShaShort:H.string().nullish(),gitCommitAuthorName:H.string().nullish(),cliVersion:H.string().nullish(),section:H.nativeEnum(vl).nullish(),status:H.nativeEnum(xe),trigger:H.nativeEnum(ar),attempts:H.number(),runAttempts:H.array(H.object({id:H.string(),status:H.nativeEnum(xe),startedAt:ot.or(H.null()),finishedAt:ot.or(H.null())})).optional(),videos:H.array(H.string()).optional(),failureReason:H.nativeEnum(Re).nullish(),failureDetails:al.nullish(),failureRecoveryDetails:H.object({attempts:H.number()}).nullish(),pipelineId:H.string().nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),quarantined:H.boolean().nullish().default(!1),quarantinedReason:H.string().nullish(),localTestId:H.string().nullish(),testId:H.string().nullish(),testName:H.string().nullish(),description:H.string().nullish(),test:H.object({name:H.string(),id:H.string()}).nullish().default(null),suiteId:H.string().nullish()}).openapi({ref:"RunMetadata"}),PI={id:!0,status:!0,testName:!0,localTestId:!0,testId:!0,test:{select:{name:!0,id:!0}},finishedAt:!0,failureReason:!0,failureDetails:!0},Al=Ca.pick({...PI,test:!0}),cy=Ca.omit({failureReason:!0,failureDetails:!0,test:!0}),im=Ca.extend({stepsSnapshot:H.array(H.record(H.unknown())).nullish(),resolvedInputs:H.record(H.string(),H.string()).nullish(),test:H.object({name:H.string(),id:H.string(),description:H.string().nullish(),baseUrl:H.string().nullish(),advanced:wa.nullish()}).nullish()}).merge(om);var II=Ra.object({id:Ra.string().uuid(),startedAt:ot.or(Ra.null()),finishedAt:ot.or(Ra.null()),status:Ra.nativeEnum(xe)}).merge(va),jX=II.array();import{z as it}from"zod";var OI=it.object({id:it.string(),status:it.nativeEnum(xe),trigger:it.nativeEnum(ar),createdAt:ot,startedAt:ot.nullish(),finishedAt:ot.nullish(),gitCommitSha:it.string().nullish(),gitCommitShaShort:it.string().nullish(),gitCommitTimestamp:ot.nullish(),gitBranchName:it.string().nullish(),gitOriginUrl:it.string().nullish(),gitCommitMessage:it.string().nullish(),gitCommitAuthorName:it.string().nullish(),githubRepository:it.string().nullish(),gitlabProjectPath:it.string().nullish(),pipelineId:it.string().nullish(),cliVersion:it.string().nullish(),labels:it.string().array().optional(),suite:it.object({id:it.string(),name:it.string()}).nullish(),runs:it.object({status:it.nativeEnum(xe)}).array()}).openapi({ref:"RunGroup"}),uy=OI.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}).extend({runs:Al.array()});import{z as gt}from"zod";var LI=gt.object({type:gt.literal("TARGETING"),name:gt.string().optional().describe("Target name to disambiguate for steps with multiple targets"),elementLocationDecisions:XS.array(),pageState:gt.string().optional(),targetSource:gt.nativeEnum(fn).optional(),targetUpdateTime:gt.string().optional()}),NI=gt.object({type:gt.literal("AI_LOCATION"),matched:gt.boolean(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional(),thoughts:gt.string().optional()}),DI=gt.object({type:gt.literal("ASSERTION"),relevantElementsSerialized:gt.string().array().optional(),pageState:gt.string().optional(),ragUsed:gt.boolean().optional()}),kI=gt.discriminatedUnion("type",[LI,NI,DI]);import{z as Qe}from"zod";var UI=Qe.object({id:Qe.string(),name:Qe.string()}),i5=UI.merge(Qe.object({createdAt:ot,createdBy:Qe.string(),schedule:ii,notification:ai,environment:Qe.object({name:Qe.string()}).nullish(),beforeTests:Qe.object({id:Qe.string()}).array().nullish(),afterTests:Qe.object({id:Qe.string()}).array().nullish()})),dy=Qe.object({id:Qe.string().uuid(),orgId:Qe.string(),createdAt:ot,startedAt:ot.or(Qe.null()),finishedAt:ot.or(Qe.null()),status:Qe.nativeEnum(xe),trigger:Qe.nativeEnum(ar),suite:Qe.object({id:Qe.string(),name:Qe.string()}).nullish(),runs:Ca.array()}),a5=dy.pick({id:!0,createdAt:!0,startedAt:!0,finishedAt:!0,status:!0,trigger:!0,suite:!0}),my=dy.extend({runs:Al.array()});import{z as sr}from"zod";import{cloneDeep as c5}from"lodash-es";import{z as Ae}from"zod";var h5=Ae.object({thoughts:Ae.string(),subGoals:Ae.object({instruction:Ae.string()}).array()}),f5=Ae.object({thoughts:Ae.string(),newPlanMarkdown:Ae.string()}),S5=Ae.object({thoughts:Ae.string(),correct:Ae.boolean(),failedActionIndex:Ae.number().optional()}),FI=Ae.object({type:Ae.literal("PLANNING"),beforePlan:Ae.string(),goalDecision:Ae.string(),thoughts:Ae.string()}),BI=Ae.object({type:Ae.literal("RUNNING"),stepDisplayName:Ae.string(),status:Ae.nativeEnum(Ke),results:pt.array()}),zI=Ae.object({type:Ae.literal("REVISING"),beforePlan:Ae.string(),afterPlan:Ae.string(),errString:Ae.string(),diffs:Ae.string(),thoughts:Ae.string()}),HI=Ae.object({type:Ae.literal("SYSTEM"),message:Ae.string()}),GI=Ae.discriminatedUnion("type",[FI,BI,zI,HI]),py=GI.array();var v5=sr.object({id:sr.string(),scheduledAt:sr.coerce.date().nullable(),startedAt:sr.coerce.date().nullable(),finishedAt:sr.coerce.date().nullable(),status:sr.nativeEnum(xe),history:py.nullable(),testPlan:sr.object({id:sr.string(),name:sr.string()}).nullable(),test:sr.object({id:sr.string(),name:sr.string()}).nullable()});import{z as Ft}from"zod";var am=Ft.object({content:Ft.string(),ids:Ft.string().array(),tokenLength:Ft.number()}),VI=Ft.object({chunks:am.array()}),B5=Ft.object({ids:Ft.string().array(),score:Ft.number(),tokenLength:Ft.number()}),z5=VI.extend({description:Ft.string().describe("Input to pass to RAG engine"),tokenLimit:Ft.number()}),gy=Ft.object({ids:Ft.number().array()}),hy=Ft.object({indices:Ft.number().array()});var at=O.object({disableCache:O.boolean().optional(),useMemory:O.boolean().optional(),clientMode:O.enum(["interactive","runner"]).optional(),loggerTags:O.record(O.string(),O.string()).optional(),langfuseSessionId:O.string().optional(),agentConfigVersion:O.string().optional()}),K5=at.extend({chunks:am.array(),description:O.string().describe("Input to pass to AI"),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),softTokenLimit:O.number(),hardTokenLimit:O.number(),callId:O.string().optional()}),WI=O.object({screenshotBase64AfterCommand:O.string(),urlAfterCommand:O.string(),serializedCommand:O.string(),elementInteracted:O.string().optional(),thoughts:O.string().optional()}),fy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),source:YS.optional().catch(void 0),memory:O.discriminatedUnion("type",[en,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional()}),Sy=O.object({target:O.string().or(O.number()),browserState:O.string().optional(),screenshot:O.string().optional(),boundingBox:O.object({x:O.number(),y:O.number(),height:O.number(),width:O.number()}).optional()}),yy=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string().optional(),returnSchema:O.string().optional()}),jI=O.literal("NEGATED_CHECK"),by=O.object({goal:O.string(),browserState:O.string(),screenshot:O.string(),url:O.string(),contextChoice:xd.optional(),memory:O.discriminatedUnion("type",[ia,O.object({type:O.literal("RESOLVED_TRACES"),traces:O.unknown().array()})]).optional(),source:jI.optional()}),Ey=O.object({command:Jo}),Ty=O.object({message:O.string()}),vy=O.object({messagesAndToolCalls:O.array(O.string())}),Ay=O.object({messagesAndToolCalls:O.array(O.string()).describe("Chat history to condense for summarization")}),sm=O.object({goal:O.string(),browserState:O.string(),startingScreenshot:O.string().optional(),screenshot:O.string(),url:O.string(),history:WI.array(),actionHint:O.string().optional(),lastError:O.string().optional()}),wy=O.object({results:bl.array(),errorMessage:O.string(),errorStack:O.string().optional()}),Cy=O.object({results:bl.array(),goal:O.string(),errorMessage:O.string()}),Ry=O.object({failedResults:bl.array(),nextStepsSerialized:O.string().array(),currentUrl:O.string(),currentPageState:O.string(),currentScreenshot:O.string(),customInstructions:O.string().optional(),testDescription:O.string().optional()}),Y5=O.object({description:O.string(),type:O.union([O.literal("locator"),O.literal("assertion"),O.literal("ai-action")]),excerpt:O.string()}),xy=O.object({type:O.string(),browserContext:O.string(),currentStep:O.string(),screenshot:O.string()}),My=O.object({description:O.string(),browserState:O.string(),screenshot:O.string()});import{z as xa}from"zod";var Q5=xa.object({goal:xa.string()}),_y=xa.object({keywords:xa.array(xa.string())});import{z as lm}from"zod";var wl=(o=>(o.LOCATOR="locator",o.ASSERTION="assertion",o.VISUAL_ASSERTION="visual-assertion",o.TEXT_EXTRACTION="text-extraction",o))(wl||{}),t3=lm.nativeEnum(wl),$I=lm.enum(["v1","v2","v3"]),r3=$I.or(lm.string().describe("for people with special configurations"));var Py={locator:"v3",assertion:"v3","visual-assertion":"v3","text-extraction":"v3"};import{z as Z}from"zod";import{v4 as ci}from"uuid";import me from"zod";import{v4 as l3}from"uuid";import{z as B}from"zod";import*as F from"zod";var Iy=F.discriminatedUnion("type",[F.object({type:F.literal("SCREEN")}),F.object({type:F.literal("OPEN_APP")}),F.object({type:F.literal("OPEN_WEBVIEW")})]),uo=F.object({type:F.literal("description"),description:F.string()}),Oy=F.object({type:F.literal("CUSTOM_COORDINATES"),startX:F.number().describe("Starting X coordinate in pixels"),startY:F.number().describe("Starting Y coordinate in pixels"),deltaPixels:F.number().describe("Number of pixels to scroll in the specified direction")}),cm=F.discriminatedUnion("type",[...Iy.options,F.object({type:F.literal("CUSTOM"),target:uo}),Oy]);var qI=F.object({type:F.literal("coordinates"),xPercent:F.number(),yPercent:F.number()}),Cl=F.discriminatedUnion("type",[uo,qI]),Ly=F.object({requiredText:F.string().optional(),requiredAttributes:F.record(F.string(),F.string()).optional(),requiredBounds:F.boolean().optional(),position:F.object({x1:F.number(),y1:F.number(),x2:F.number(),y2:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional(),shape:F.object({width:F.number(),height:F.number(),tolerance:F.nativeEnum(It),preciseTolerance:F.boolean().optional()}).optional()}),KI=F.object({xPath:F.string(),requirements:Ly.optional()}),YI=F.object({type:F.literal("CUSTOM"),target:uo,cache:F.lazy(()=>Ny).optional()}),XI=F.object({pixelDelta:F.number().describe("Number of pixels to scroll in the specified direction"),scrollableElement:F.union([Iy,YI,Oy]),direction:F.enum(["up","down"])}),Ny=F.object({type:F.literal("NATIVE"),bounds:F.number().array(),resolvedDescription:F.string(),xPath:F.string(),elementOnlySerializedXml:F.string(),scrollDetails:XI.optional(),requirements:Ly.optional(),requiredRelatedElements:KI.array().optional(),memory:en.optional()}),JI=F.object({type:F.literal("WEBVIEW"),resolvedDescription:F.string(),xPath:F.string(),browserCache:Sn.optional(),memory:en.optional()}),si=F.union([Ny,JI]);var an=(M=>(M.AI_CHECK="AI_CHECK",M.TAP="TAP",M.TYPE="TYPE",M.PRESS="PRESS",M.PRESS_KEYBOARD="PRESS_KEYBOARD",M.OPEN_APP="OPEN_APP",M.KILL_APP="KILL_APP",M.OPEN_NOTIFICATION_DRAWER="OPEN_NOTIFICATION_DRAWER",M.SWIPE="SWIPE",M.SCROLL_TO="SCROLL_TO",M.SCREEN_CHECK="SCREEN_CHECK",M.ELEMENT_CHECK="ELEMENT_CHECK",M.DRAG_AND_DROP="DRAG_AND_DROP",M.JAVASCRIPT="JAVASCRIPT",M.REQUEST="REQUEST",M.WAIT="WAIT",M.ADD_FILE="ADD_FILE",M.INSTALL_APP="INSTALL_APP",M.UNINSTALL_APP="UNINSTALL_APP",M.TOGGLE_SETTINGS="TOGGLE_SETTINGS",M.ADB="ADB",M.STATE="STATE",M))(an||{}),Ma=(c=>(c.BACK="BACK",c.HOME="HOME",c.APP_SWITCHER="APP_SWITCHER",c.POWER="POWER",c.SEARCH="SEARCH",c.VOLUME_UP="VOLUME_UP",c.VOLUME_DOWN="VOLUME_DOWN",c.VOLUME_MUTE="VOLUME_MUTE",c))(Ma||{}),dm=(n=>(n.CLOSE_KEYBOARD="CLOSE_KEYBOARD",n.ENTER="ENTER",n.BACKSPACE="BACKSPACE",n))(dm||{}),Rl=(o=>(o.AIRPLANE_MODE="AIRPLANE_MODE",o.DATA="DATA",o.WIFI="WIFI",o.LOCATION="LOCATION",o))(Rl||{}),Dy=B.object({updatedAt:B.coerce.date().optional()}),Ye=B.object({id:B.string().uuid(),disableCache:B.boolean().optional()}),QI=Ye.extend({type:B.literal("STATE")}),ZI=Ye.extend({type:B.literal("KILL_APP")}),xn=Dy.extend({target:si}),xl=Dy.extend({fromTarget:si,toTarget:si}),mm=Ye.extend({type:B.literal("AI_CHECK"),assertion:B.string(),timeoutSecs:B.number().optional(),cache:bn.optional()}),pm=Ye.extend({type:B.literal("TAP"),target:Cl,cache:xn.optional(),longPress:B.boolean().optional(),longPressDurationMs:B.number().optional(),doubleTap:B.boolean().optional(),doubleTapDelayMs:B.number().optional(),relativePosition:B.object({x:B.number(),y:B.number()}).optional()}),gm=Ye.extend({type:B.literal("TYPE"),target:Cl.optional(),cache:xn.optional(),keyPressDelayMs:B.number().optional(),text:B.string(),clearContent:B.boolean().optional(),forceClearContent:B.boolean().optional()});var eO=Ye.extend({type:B.literal("PRESS"),key:B.nativeEnum(Ma),longPress:B.boolean().optional()}),tO=Ye.extend({type:B.literal("PRESS_KEYBOARD"),key:B.nativeEnum(dm)}),rO=Ye.extend({type:B.literal("OPEN_APP"),packageName:B.string(),activityName:B.string().optional(),intentExtras:B.string().optional()}),nO=Ye.extend({type:B.literal("OPEN_NOTIFICATION_DRAWER")}),hm=Ye.extend({type:B.literal("SWIPE"),direction:B.enum(["up","down","left","right"]),scrollableElement:cm,cache:xn.optional(),viewportPercent:B.number().optional(),durationMs:B.number().optional()}),fm=Ye.extend({type:B.literal("SCROLL_TO"),target:uo,direction:B.enum(["down","up"]),scrollableElement:cm,scrollStepPercent:B.number().min(.1).max(1).optional().describe("How much of the container height to scroll at each step (0.1 to 1.0). Default is 0.8 (80%)."),cache:xn.optional()});var oO=B.object({type:B.literal("CONTENT"),negated:B.boolean().optional(),value:B.string()}),iO=Ye.extend({type:B.literal("SCREEN_CHECK"),assertion:oO,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),Sm=Ye.extend({type:B.literal("ELEMENT_CHECK"),target:Cl,cache:xn.optional(),assertion:Ys,timeout:B.number().int().min(0).max(Ko).optional().describe("max seconds to wait for the assertion to be true")}),ym=Ye.extend({type:B.literal("DRAG_AND_DROP"),fromTarget:uo,toTarget:uo,cache:xl.optional(),hoverDuration:B.number().optional(),dragDuration:B.number().optional()}),aO=Ye.extend({type:B.literal("JAVASCRIPT"),code:B.string(),timeout:B.number().int().max(60).optional().describe("Max seconds for the code to complete")}),sO=Ye.extend({type:B.literal("REQUEST")}).merge(Qn),lO=Ye.extend({type:B.literal("WAIT"),timeoutSecs:B.number()}),cO=Ye.extend({type:B.literal("ADB"),command:B.string(),jsonArgs:B.string().optional()}),uO=Ye.extend({type:B.literal("ADD_FILE"),file:B.string(),storageLocation:B.string()}),dO=B.string().trim(),mO=Ye.extend({type:B.literal("INSTALL_APP"),uri:dO}),pO=Ye.extend({type:B.literal("UNINSTALL_APP"),packageName:B.string()}),gO=Ye.extend({type:B.literal("TOGGLE_SETTINGS"),settingsType:B.nativeEnum(Rl)}),ky=B.discriminatedUnion("type",[mm,pm,gm,eO,rO,nO,tO,hm,fm,iO,Sm,ym,aO,sO,lO,uO,mO,pO,gO,ZI,cO,QI]);var li=r=>{switch(r.type){case"description":return r.description;case"coordinates":return`${r.xPercent}%, ${r.yPercent}%`}};var hO=["SCREEN","OPEN_APP","OPEN_WEBVIEW","CUSTOM"],Fy=me.object({type:me.enum(hO).describe("Where to interact. SCREEN = entire device (use for system surfaces like the notification bar or quick settings), OPEN_APP = current foreground app, OPEN_WEBVIEW = active webview (only if a webview is present and there is high confidence that the element is inside it), CUSTOM = explicitly describe the container if and only if NONE of the above fit."),description:me.string().or(me.null()).describe("Description of the container to interact with. This is only used if the container type is CUSTOM.")}),fO=me.object({type:me.literal("TAP"),description:me.string().describe("Description of the element to tap."),longPress:me.boolean().describe("Whether to hold the tap down before releasing. Useful for triggering context menus."),doubleTap:me.boolean().describe("Whether to tap twice in quick succession."),relativePosition:me.null().or(me.object({x:me.number(),y:me.number()})).describe("Specific position to tap within the bounding box of the element, specified in pixels. E.g. 0,0 is the top left corner.")}).describe(`
10
10
  Tap on an element on the screen.
11
- `),vO=de.object({type:de.literal("PRESS"),key:de.nativeEnum(Pa)}).describe(`
11
+ `),SO=me.object({type:me.literal("PRESS"),key:me.nativeEnum(Ma)}).describe(`
12
12
  Press a button on the device. Some buttons are physical (volume) while others are virtual (Back/Home/App Switcher).
13
- `),AO=de.object({type:de.literal("AI_CHECK"),assertion:de.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:de.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe(`
13
+ `),yO=me.object({type:me.literal("AI_CHECK"),assertion:me.string().describe("A natural language assertion to validate. On each attempt, Momentic's AI agents will evaluate the assertion by analyzing the current emulator XML and screenshot. Thus, the assertion must be verifiable based on a single point in time. The assertion will be automatically retried until it is true or the timeout is reached."),timeoutSecs:me.number().describe("Maximum number of seconds to wait for the assertion to be true.")}).describe(`
14
14
  Use AI to verify a statement about the current state of the emulator or wait until a statement is true.
15
- `),wO=de.object({type:de.literal("TYPE"),text:de.string().describe("Exact type to text, which will be passed to appium's driver.keys() method."),keyPressDelayMs:de.number().or(de.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:de.boolean().or(de.null()).describe("Clear the content of the input before typing. Do not set to true if the input is already empty.")}),CO=de.object({type:de.literal("SWIPE"),direction:de.enum(["up","down","left","right"]).describe("Direction to swipe within the container. Swiping up will scroll down, and vice versa."),container:Ky,viewportPercent:de.number().min(.1).max(1).nullish().describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Defaults to 0.8 when omitted."),durationMs:de.number().int().positive().nullish().describe("Optional swipe duration in milliseconds. Leave null for default.")}).describe(`
15
+ `),bO=me.object({type:me.literal("TYPE"),text:me.string().describe("Exact type to text, which will be passed to appium's driver.keys() method."),keyPressDelayMs:me.number().or(me.null()).describe("Milliseconds to wait between each key press. Useful for triggering auto-complete and other event listeners."),clearContent:me.boolean().or(me.null()).describe("Clear the content of the input before typing. Do not set to true if the input is already empty.")}),EO=me.object({type:me.literal("SWIPE"),direction:me.enum(["up","down","left","right"]).describe("Direction to swipe within the container. Swiping up will scroll down, and vice versa."),container:Fy,viewportPercent:me.number().min(.1).max(1).nullish().describe("How much of the container height/width to swipe each time as a decimal (0.1 - 1). Defaults to 0.8 when omitted."),durationMs:me.number().int().positive().nullish().describe("Optional swipe duration in milliseconds. Leave null for default.")}).describe(`
16
16
  Swipe in a direction within a container (screen/app/webview).
17
- `),RO=de.object({type:de.literal("SCROLL_TO"),targetDescription:de.string().describe("Description of the element or text to scroll to inside the container. Scrolling up will bring you up in the page, and vice versa."),direction:de.enum(["down","up"]).describe("Direction to scroll while searching for the target."),container:Ky,scrollStepPercent:de.number().min(.1).max(1).nullish().describe("How much of the container height to scroll at each step (0.1 - 1). Defaults to 0.8 when omitted.")}).describe(`
17
+ `),TO=me.object({type:me.literal("SCROLL_TO"),targetDescription:me.string().describe("Description of the element or text to scroll to inside the container. Scrolling up will bring you up in the page, and vice versa."),direction:me.enum(["down","up"]).describe("Direction to scroll while searching for the target."),container:Fy,scrollStepPercent:me.number().min(.1).max(1).nullish().describe("How much of the container height to scroll at each step (0.1 - 1). Defaults to 0.8 when omitted.")}).describe(`
18
18
  Scroll within a container until the described target is visible. Scrolling up or down will scroll until it finds it or can't scroll anymore. There is no need to repeat the same scroll to command in the same direction multiple times in a row. If a scroll fails, we do not restore the position automatically.
19
- `),Am=de.discriminatedUnion("type",[TO,vO,AO,wO,CO,RO]),qy=r=>{switch(r.type){case"SCREEN":return{type:"SCREEN"};case"OPEN_APP":return{type:"OPEN_APP"};case"OPEN_WEBVIEW":return{type:"OPEN_WEBVIEW"};case"CUSTOM":if(!r.description)throw new al("Description is required when container type is CUSTOM.");return{type:"CUSTOM",target:{type:"description",description:r.description}};default:{let e=r;throw new Error("Unreachable")}}},Yy=r=>{let e=Am.parse(r);switch(e.type){case"TAP":return{id:ci(),type:"TAP",target:{type:"description",description:e.description},longPress:e.longPress??void 0,doubleTap:e.doubleTap??void 0,relativePosition:e.relativePosition??void 0};case"PRESS":return{id:ci(),...e};case"AI_CHECK":return{id:ci(),...e};case"TYPE":return{id:ci(),type:"TYPE",text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0};case"SWIPE":return{id:ci(),type:"SWIPE",direction:e.direction,scrollableElement:qy(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case"SCROLL_TO":return{id:ci(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:qy(e.container),scrollStepPercent:e.scrollStepPercent??void 0};default:{let t=e;throw new Error("Unreachable")}}};import xO from"zod";var po={type:!0,cache:!0},Mn=xO.discriminatedUnion("type",[fm.pick(po),Tm.pick(po),Sm.pick(po),ym.pick(po),bm.pick(po),Em.pick(po),vm.pick(po)]),MO=Object.values(on).filter(r=>Mn.options.some(e=>e.shape.type.safeParse(r).success));function _l(r){return MO.includes(r.type)}var Xy=ma(Mn),Jy=pa(Mn),b4=el(Mn);import Qy from"zod";var Pl=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(Pl||{}),Il=(e=>(e.LOCAL="local",e))(Il||{}),Zy=Qy.nativeEnum(Pl).or(Qy.nativeEnum(Il)),Ia=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(Ia||{});var eb="14";import{cloneDeep as Oa}from"lodash-es";import tb from"truncate-json";var _O="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",PO=[so,ni],rb=[so,ni],ui=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[so],o=e.env[ni],i={};for(let[s,c]of Object.entries(e.env))rb.includes(s)||(t??{})[s]===void 0&&(i[s]=c);return new r({dynamicVariables:i,envName:n,testName:o,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Oa(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){PO.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[so]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Oa(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>rb.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,_O]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=tb(JSON.stringify(o),1e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=tb(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=Oa(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(so,e.envName),e.testName&&this.setMomenticSystemVariable(ni,e.testName)}getDynamicVariablesCopy(){return Oa(this.env)}getVariablesFromEnvironmentCopy(){return Oa(this.varsFromMomenticEnvironment)}};import Ze from"zod";import{z as vr}from"zod";import{z as He}from"zod";var Tr=He.object({id:He.string(),name:ti,baseUrl:pl,description:He.string().optional().nullish(),schemaVersion:He.string(),advanced:Ca,retries:He.number(),envs:He.array(bl).nullish(),parameters:yl.nullish(),disabled:He.boolean().optional(),labels:He.array(He.string()).optional().catch([])}),I4=He.enum(["INHERIT","ENABLED","DISABLED"]);var IO=Ca.extend({failureRecovery:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var O4=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:IO}),L4=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),OO=He.object({labels:He.array(He.string()).optional(),outputs:sy.nullish()}),di=Tr.merge(OO),LO=He.object({createdAt:He.coerce.date(),updatedAt:He.coerce.date(),updatedBy:He.string().nullable(),schedule:ii,notification:ai,createdBy:He.string(),organizationId:He.string(),folderId:He.string().nullable().optional()}),NO=Tr.merge(LO),N4=NO.merge(ro),Ol=Tr.merge(ro),D4=Tr.merge(no);var DO="test",kO="module",UO="mobile-test",FO="mobile-module";var De=(o=>(o.TEST=`momentic/${DO}`,o.MODULE=`momentic/${kO}`,o.MOBILE_TEST=`momentic/${UO}`,o.MOBILE_MODULE=`momentic/${FO}`,o))(De||{}),G4=Tr.merge(no),nb=nr.extend({steps:vr.array(vr.record(vr.string(),vr.unknown())),schemaVersion:vr.string()}),V4=nb.extend({fileType:vr.literal(De.MODULE)}),W4=vr.object({test:vr.string().describe("YAML for the test, including metadata and steps"),modules:vr.record(vr.string(),vr.string()).describe("Map of module name to YAML for the module")});function mi(r){if(r===void 0)return"__undefined__";if(r===null)return null;if(typeof r!="object")return r;if(Array.isArray(r))return r.map(mi);let e={};for(let[t,n]of Object.entries(r))e[t]=mi(n);return e}import yt from"zod";var Bt=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Bt||{}),La=yt.object({id:yt.string().uuid(),envKey:yt.string().optional(),skipped:yt.boolean().optional(),retries:yt.number().optional()}),Na=La.extend({type:yt.literal("MOBILE_PRESET_STEP"),command:$y,keyPressDelayMs:yt.number().optional()}),Ll=yt.object({moduleId:yt.string(),inputs:yt.record(yt.string(),yt.string()).optional()}),Da=La.merge(Ll.extend({type:yt.literal("MOBILE_MODULE_STEP")})),K4=Ll.extend({steps:yt.lazy(()=>jt.array())}),ka=La.extend({type:yt.literal("MOBILE_AI_ACTION_STEP"),text:yt.string()}),jt=yt.discriminatedUnion("type",[Na,Da,ka]);var wm=Ze.object({parameterNames:Ze.string().array(),defaultParameters:Ze.record(Ze.string(),Ze.string()).optional(),parameterEnums:Ze.record(Ze.string(),Ze.string().array()).optional()}),ob=Ze.object({moduleId:Ze.string().uuid(),name:Ze.string(),description:Ze.string().nullish(),parameters:wm.optional(),enabled:Ze.boolean().nullish(),schemaVersion:Ze.string()}),Ua=ob.omit({name:!0}),Nl=Ua.extend({steps:Ze.array(Ze.record(Ze.string(),Ze.unknown()))}),ib=Ze.object({fileType:Ze.literal(De.MOBILE_MODULE)}).merge(Nl),ab=ob.omit({schemaVersion:!0}).extend({steps:Ze.array(jt)});import Oe from"zod";import Fa from"zod";var an=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(an||{}),Cm=Ll.extend({steps:Fa.lazy(()=>pi.array()),description:Fa.string().optional(),name:Fa.string().describe("name of the module"),parameters:wm.optional()}),BO=La.merge(Cm).extend({type:Fa.literal("RESOLVED_MOBILE_MODULE")}),pi=Fa.discriminatedUnion("type",[BO,Na,ka]);function sb(r){return Object.values(an).includes(r)||Object.values(Bt).includes(r)}var zO=Oe.object({disableMomenticAccessibilityTree:Oe.boolean().optional(),autoGrantPermissions:Oe.boolean().optional()}),Rm=zO.extend({region:Zy.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Oe.object({androidVersion:Oe.nativeEnum(Ia).optional()}).optional(),localEmulatorSettings:Oe.object({avdId:Oe.string()}).optional(),geolocation:Oe.object({latitude:Oe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Oe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),Ba=Oe.object({retries:Oe.number().optional().describe("number of retries to run"),defaultChannel:Oe.string().optional().describe("default channel to use"),defaultTag:Oe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Oe.string().optional(),defaultApkFilePath:Oe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:Rm.optional(),ai:wa.optional()}),Ar=Oe.object({id:Oe.string().uuid(),description:Oe.string(),schemaVersion:Oe.string(),settings:Ba.optional()}),xm=Oe.object({fileType:Oe.literal(De.MOBILE_TEST)}).merge(Ar),HO=Ar.merge(Oe.object({steps:Oe.array(jt)})),SJ=xm.merge(HO),yJ=Oe.object({name:Oe.string(),steps:Oe.array(jt).optional(),settings:Ba.optional()}),GO=Ar.extend({steps:pi.array()});import me from"zod";var Dr=me.object({startTime:me.number(),endTime:me.number().optional(),durationMs:me.number().optional(),error:me.string().optional(),result:me.unknown().optional(),attributes:me.record(me.string(),me.unknown())});var VO=Dr.extend({type:me.literal("SECTION"),name:me.string(),subSpans:me.lazy(()=>Mm.array())}),WO=Dr.extend({type:me.literal("AI_LOCATOR_CALL"),result:me.object({id:me.number(),thoughts:me.string()}).optional()}),jO=Dr.extend({type:me.literal("AI_ASSERTION_CALL"),result:me.object({thoughts:me.string(),result:me.boolean()}).optional()}),$O=Dr.extend({type:me.literal("TARGET_RESOLUTION"),result:me.object({serializedElement:me.string()}).optional()}),qO=Dr.extend({type:me.literal("EMULATOR_INTERACTION"),name:me.string(),withinWebview:me.boolean().optional()}),KO=Dr.extend({type:me.literal("EMULATOR_READ_STATE"),name:me.string()}),YO=Dr.extend({type:me.literal("ELEMENT_ASSERTION"),name:me.string(),result:me.object({success:me.boolean(),message:me.string().optional()}).optional()}),XO=Dr.extend({type:me.literal("CACHE_RESOLUTION")}),JO=Dr.extend({type:me.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),QO=Dr.extend({type:me.literal("GENERIC"),name:me.string()}),Mm=me.discriminatedUnion("type",[VO,WO,jO,$O,qO,KO,YO,XO,JO,QO]);import xt from"zod";var _m=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(Ke),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step")}),ZO=_m.merge(Na).extend({previousAttempts:xt.lazy(()=>zt.array()).optional()}),eL=_m.merge(Da).extend({steps:xt.lazy(()=>zt.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>zt.array()).optional()}),tL=_m.merge(ka).extend({steps:xt.lazy(()=>zt.array()),previousAttempts:xt.lazy(()=>zt.array()).optional()}),zt=xt.discriminatedUnion("type",[ZO,eL,tL]);import{parse as PJ}from"date-fns";var ZJ=new Set(Object.values(nt));var rL={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},e8={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},t8={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},r8={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ADB:"ADB command",STATE:"Debug state"},n8={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import nL from"semver";import{z as oL}from"zod";var s8=oL.string().refine(r=>nL.valid(r),{message:"must be a valid semver string"});import{Faker as u8,en as d8}from"@faker-js/faker";import{z as D}from"zod";var p8=D.object({body:D.string(),to:D.string(),from:D.string()}),g8=D.object({from:D.string().optional(),to:D.string(),timeout:D.number().optional(),beforeDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional()}),h8=D.object({to:D.string().email(),from:D.string(),subject:D.string(),body:D.string(),html:D.string().optional()}),f8=D.object({inbox:D.string().transform(r=>r.toLowerCase()),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),timeout:D.number().optional(),trimWhitespace:D.boolean().optional()}),S8=D.object({inbox:D.string(),limit:D.number().optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),trimWhitespace:D.boolean().optional()});var Dl=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(Dl||{}),lb=D.object({body:D.string().nullish(),status:D.number().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}),iL=D.object({url:D.string(),options:D.object({method:D.string(),body:D.string().nullish(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),aL=D.object({body:D.string().nullish(),options:D.object({status:D.number(),statusText:D.string().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),cb=D.object({result:D.unknown(),variableUpdates:D.record(D.string(),D.unknown()).optional(),persistentVariableUpdates:D.record(D.string(),D.unknown()).optional(),error:D.string().optional(),success:D.boolean()}),y8=D.object({id:D.string().optional(),orgId:D.string(),momenticLambdaAuthHash:D.string(),code:D.string(),fragment:D.boolean(),state:D.object({env:D.record(D.string(),D.unknown()),request:iL,response:aL,additionalBindings:D.record(D.string(),D.unknown()).optional()}),timeoutMs:D.number().optional(),disallowVariableUpdates:D.boolean().optional(),responseSerialization:D.nativeEnum(Dl).optional()}),_n=15e3;import*as Mt from"zod";import{extendZodWithOpenApi as sL}from"zod-openapi";sL(Mt);var lL=Mt.object({url:Mt.string(),lineNumber:Mt.number(),columnNumber:Mt.number()}).openapi({ref:"CodeLocation"}),kl=Mt.object({timestamp:Mt.number(),text:Mt.string(),type:Mt.string(),tabIndex:Mt.number(),args:Mt.unknown().array().optional(),url:Mt.string().optional(),location:lL.optional()}).openapi({ref:"ConsoleLog"}),ub=kl.array(),db=ub.array();import*as Pm from"zod";import{extendZodWithOpenApi as cL}from"zod-openapi";cL(Pm);var uL=Pm.object({logsPerPage:kl.array().array()}).openapi({ref:"DebugData"});import{z as P}from"zod";var dL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),mL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),pL=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Ul=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:pL,comment:P.string().optional()}),gL=P.array(Ul),hL=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),pb=P.array(hL),fL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),gb=P.array(fL),SL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),yL=P.array(SL),bL=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),EL=P.array(bL),TL=P.object({mimeType:P.string(),params:EL,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),vL=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:pb,headers:gb,queryString:yL,postData:TL.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),AL=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),wL=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:pb,headers:gb,content:AL,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),mb=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),CL=P.object({beforeRequest:mb.optional(),afterRequest:mb.optional(),comment:P.string().optional()}),RL=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),Fl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:vL,response:wL.optional(),cache:CL.optional(),timings:RL,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),xL=P.array(Fl),ML=P.object({version:P.string().default("1.1"),creator:dL.optional(),browser:mL.optional(),pages:gL.optional(),entries:xL,comment:P.string().optional()}),_L=P.object({log:ML}),I8=P.record(P.string(),Ul),O8=P.record(P.string(),Fl);import{cloneDeep as IL}from"lodash-es";import{z as kr}from"zod";var fb=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(fb||{});var hb=kr.union([kr.string(),kr.number(),kr.boolean(),kr.null(),kr.record(kr.string(),kr.lazy(()=>hb)),kr.array(kr.lazy(()=>hb))]),Bl=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=IL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(fb).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},V8=new Bl({},{});var Im={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},Sb=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],j8=Object.keys(Im);import*as yb from"zod";var q8=yb.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as Pn}from"zod";var X8=Pn.object({id:Pn.string(),name:Pn.string(),createdAt:Pn.coerce.date(),createdBy:Pn.string(),updatedAt:Pn.coerce.date(),updatedBy:Pn.string().nullable(),organizationId:Pn.string()});import{z as L}from"zod";import In from"zod";var gi=In.object({platformSep:In.string(),fullPathSegments:In.string().array(),relativePathSegments:In.string().array(),relativePath:In.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:In.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:In.coerce.date(),createdAt:In.coerce.date()});var OL=L.array(gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),LL=gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:jd}),NL=L.array(LL),c6=L.object({tests:OL,modules:NL,labels:L.string().array()}),u6=Ol.merge(di),d6=L.object({schemaVersion:L.string(),stepLists:ro}),m6=di.partial().merge(Tr.pick({id:!0})),DL={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:L.nativeEnum(Cn).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:fl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},p6=L.object(DL),g6=Ol.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),h6=L.object({name:L.string()}),f6=L.object({relativeFilePath:L.string()}),S6=L.object({name:L.string()}),y6=L.object({relativeFilePath:L.string()}),b6=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>ct.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),E6=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var T6=L.array(ey),v6=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),A6=L.object({configFilePath:L.string().describe("full path on disk")}),w6=L.string().array(),C6=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),Om=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),bb=L.object({pathSegments:L.array(L.string())}),R6=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(Om)}),Eb=L.object({pathSegments:L.array(L.string())}),Tb=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),vb=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),x6=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()}),M6=L.object({gitBranch:L.string(),fileMtime:L.coerce.date(),gitCommitSha:L.string()});var zl=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],Hl=zl.map(r=>`**/${r}/**`),Ab=!0,Ur=!1;import Fr from"chalk";import kL from"safe-stable-stringify";import UL from"truncate-json";import FL from"zod";var go=kL.configure({deterministic:!1});function wb(r){let e=go(r),{jsonString:t}=UL(e,5e4);return t}var BL=["app","version","env","namespace","host"];function be(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!BL.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var Vl=FL.enum(["debug","info","warn","error"]);var za={debug:20,info:30,warn:40,error:50},Cb={20:"debug",30:"info",40:"warn",50:"error"},Lm=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=za[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
19
+ `),bm=me.discriminatedUnion("type",[fO,SO,yO,bO,EO,TO]),Uy=r=>{switch(r.type){case"SCREEN":return{type:"SCREEN"};case"OPEN_APP":return{type:"OPEN_APP"};case"OPEN_WEBVIEW":return{type:"OPEN_WEBVIEW"};case"CUSTOM":if(!r.description)throw new sl("Description is required when container type is CUSTOM.");return{type:"CUSTOM",target:{type:"description",description:r.description}};default:{let e=r;throw new Error("Unreachable")}}},By=r=>{let e=bm.parse(r);switch(e.type){case"TAP":return{id:ci(),type:"TAP",target:{type:"description",description:e.description},longPress:e.longPress??void 0,doubleTap:e.doubleTap??void 0,relativePosition:e.relativePosition??void 0};case"PRESS":return{id:ci(),...e};case"AI_CHECK":return{id:ci(),...e};case"TYPE":return{id:ci(),type:"TYPE",text:e.text,keyPressDelayMs:e.keyPressDelayMs??void 0,clearContent:e.clearContent??void 0};case"SWIPE":return{id:ci(),type:"SWIPE",direction:e.direction,scrollableElement:Uy(e.container),viewportPercent:e.viewportPercent??void 0,durationMs:e.durationMs??void 0};case"SCROLL_TO":return{id:ci(),type:"SCROLL_TO",target:{type:"description",description:e.targetDescription},direction:e.direction,scrollableElement:Uy(e.container),scrollStepPercent:e.scrollStepPercent??void 0};default:{let t=e;throw new Error("Unreachable")}}},C3={TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a button on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Kill an app on the device.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in the emulator.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install an app on the device.",UNINSTALL_APP:"Uninstall an app on the device.",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Use AI to verify a statement about the current state of the emulator or wait until a statement is true."};var R3=["TAP","TYPE","PRESS","PRESS_KEYBOARD","SWIPE","SCREEN_CHECK","SCROLL_TO","DRAG_AND_DROP","KILL_APP","OPEN_NOTIFICATION_DRAWER","WAIT","TOGGLE_SETTINGS","AI_CHECK"];import vO from"zod";var mo={type:!0,cache:!0},Mn=vO.discriminatedUnion("type",[mm.pick(mo),Sm.pick(mo),pm.pick(mo),gm.pick(mo),hm.pick(mo),fm.pick(mo),ym.pick(mo)]),AO=Object.values(an).filter(r=>Mn.options.some(e=>e.shape.type.safeParse(r).success));function Ml(r){return AO.includes(r.type)}var zy=da(Mn),Hy=ma(Mn),O3=tl(Mn);import Gy from"zod";var _l=(t=>(t.US_WEST_1="us-west1",t.EU_NORTH_1="eu-north1",t))(_l||{}),Pl=(e=>(e.LOCAL="local",e))(Pl||{}),Vy=Gy.nativeEnum(_l).or(Gy.nativeEnum(Pl)),_a=(t=>(t.ANDROID_14="14",t.ANDROID_15="15",t))(_a||{});var Wy="14";import{cloneDeep as Pa}from"lodash-es";import jy from"truncate-json";var wO="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",CO=[so,ni],$y=[so,ni],ui=class r{env={};varsFromMomenticEnvironment={};constructor(e){this.reset(e)}static dummyContext(e=void 0,t=void 0,n={}){return new r({testName:e,envName:t,variablesFromEnvironment:n})}static fromSnapshot({snapshot:e,environmentVariables:t}){let n=e.env[so],o=e.env[ni],i={};for(let[s,c]of Object.entries(e.env))$y.includes(s)||(t??{})[s]===void 0&&(i[s]=c);return new r({dynamicVariables:i,envName:n,testName:o,variablesFromEnvironment:t??{}})}setEnvVariables(e){let t=Pa(e);this.env=Object.assign(this.env,t)}setInputs(e){e&&this.setEnvVariables(e)}setMomenticSystemVariable(e,t){this.varsFromMomenticEnvironment[e]=t}getVariable(e){return this.env[e]}setVariable(e,t){CO.includes(e)||(this.env[e]=t)}getEnvName(){return this.env[so]}toObjectCopy(){let e={env:Object.assign({},this.env,this.varsFromMomenticEnvironment)};return Pa(e)}toEditorDisplayCopy(){return this.toObjectCopy()}toRedactedDisplayCopy(){let e=this.toObjectCopy();e.env=Object.fromEntries(Object.entries(e.env).map(([n,o])=>$y.includes(n)||this.varsFromMomenticEnvironment[n]===void 0?[n,o]:[n,wO]));for(let[n,o]of Object.entries(e.env)){if(!o){e.env[n]=o;continue}let{jsonString:i}=jy(JSON.stringify(o),1e3);try{e.env[n]=JSON.parse(i)}catch{e.env[n]=void 0}}let{jsonString:t}=jy(JSON.stringify(e.env),5e3);try{e.env=JSON.parse(t)}catch{e.env={}}return e}reset(e){this.env={},this.varsFromMomenticEnvironment={},this.setEnvVariables(e.dynamicVariables??{}),this.varsFromMomenticEnvironment=Pa(e.variablesFromEnvironment),e.envName&&this.setMomenticSystemVariable(so,e.envName),e.testName&&this.setMomenticSystemVariable(ni,e.testName)}getDynamicVariablesCopy(){return Pa(this.env)}getVariablesFromEnvironmentCopy(){return Pa(this.varsFromMomenticEnvironment)}};import Ze from"zod";import{z as vr}from"zod";import{z as He}from"zod";var Tr=He.object({id:He.string(),name:ti,baseUrl:gl,description:He.string().optional().nullish(),schemaVersion:He.string(),advanced:wa,retries:He.number(),envs:He.array(Tl).nullish(),parameters:El.nullish(),disabled:He.boolean().optional(),labels:He.array(He.string()).optional().catch([])}),W3=He.enum(["INHERIT","ENABLED","DISABLED"]);var RO=wa.extend({failureRecovery:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED"),useMemory:He.boolean().or(He.string()).optional().transform(r=>typeof r=="string"?r:r===void 0?"INHERIT":r?"ENABLED":"DISABLED")});var j3=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,parameters:!0}).extend({advanced:RO}),$3=Tr.pick({name:!0,description:!0,baseUrl:!0,retries:!0,disabled:!0,advanced:!0,parameters:!0}),xO=He.object({labels:He.array(He.string()).optional(),outputs:ly.nullish()}),di=Tr.merge(xO),MO=He.object({createdAt:He.coerce.date(),updatedAt:He.coerce.date(),updatedBy:He.string().nullable(),schedule:ii,notification:ai,createdBy:He.string(),organizationId:He.string(),folderId:He.string().nullable().optional()}),_O=Tr.merge(MO),q3=_O.merge(ro),Il=Tr.merge(ro),K3=Tr.merge(no);var PO="test",IO="module",OO="mobile-test",LO="mobile-module";var De=(o=>(o.TEST=`momentic/${PO}`,o.MODULE=`momentic/${IO}`,o.MOBILE_TEST=`momentic/${OO}`,o.MOBILE_MODULE=`momentic/${LO}`,o))(De||{}),t4=Tr.merge(no),qy=nr.extend({steps:vr.array(vr.record(vr.string(),vr.unknown())),schemaVersion:vr.string()}),r4=qy.extend({fileType:vr.literal(De.MODULE)}),n4=vr.object({test:vr.string().describe("YAML for the test, including metadata and steps"),modules:vr.record(vr.string(),vr.string()).describe("Map of module name to YAML for the module")});function mi(r){if(r===void 0)return"__undefined__";if(r===null)return null;if(typeof r!="object")return r;if(Array.isArray(r))return r.map(mi);let e={};for(let[t,n]of Object.entries(r))e[t]=mi(n);return e}import yt from"zod";var Bt=(n=>(n.PRESET="MOBILE_PRESET_STEP",n.MODULE="MOBILE_MODULE_STEP",n.AI_ACTION="MOBILE_AI_ACTION_STEP",n))(Bt||{}),Ia=yt.object({id:yt.string().uuid(),envKey:yt.string().optional(),skipped:yt.boolean().optional(),retries:yt.number().optional()}),Oa=Ia.extend({type:yt.literal("MOBILE_PRESET_STEP"),command:ky,keyPressDelayMs:yt.number().optional()}),Ol=yt.object({moduleId:yt.string(),inputs:yt.record(yt.string(),yt.string()).optional()}),La=Ia.merge(Ol.extend({type:yt.literal("MOBILE_MODULE_STEP")})),s4=Ol.extend({steps:yt.lazy(()=>Vt.array())}),Na=Ia.extend({type:yt.literal("MOBILE_AI_ACTION_STEP"),text:yt.string()}),Vt=yt.discriminatedUnion("type",[Oa,La,Na]);var Em=Ze.object({parameterNames:Ze.string().array(),defaultParameters:Ze.record(Ze.string(),Ze.string()).optional(),parameterEnums:Ze.record(Ze.string(),Ze.string().array()).optional()}),Ky=Ze.object({moduleId:Ze.string().uuid(),name:Ze.string(),description:Ze.string().nullish(),parameters:Em.optional(),enabled:Ze.boolean().nullish(),schemaVersion:Ze.string()}),Da=Ky.omit({name:!0}),Ll=Da.extend({steps:Ze.array(Ze.record(Ze.string(),Ze.unknown()))}),Yy=Ze.object({fileType:Ze.literal(De.MOBILE_MODULE)}).merge(Ll),Xy=Ky.omit({schemaVersion:!0}).extend({steps:Ze.array(Vt)});import Oe from"zod";import ka from"zod";var sn=(e=>(e.MODULE="RESOLVED_MOBILE_MODULE",e))(sn||{}),Tm=Ol.extend({steps:ka.lazy(()=>pi.array()),description:ka.string().optional(),name:ka.string().describe("name of the module"),parameters:Em.optional()}),NO=Ia.merge(Tm).extend({type:ka.literal("RESOLVED_MOBILE_MODULE")}),pi=ka.discriminatedUnion("type",[NO,Oa,Na]);function Jy(r){return Object.values(sn).includes(r)||Object.values(Bt).includes(r)}var DO=Oe.object({disableMomenticAccessibilityTree:Oe.boolean().optional(),autoGrantPermissions:Oe.boolean().optional()}),vm=DO.extend({region:Vy.optional().describe("Do you want local or Limbar?"),remoteEmulatorSettings:Oe.object({androidVersion:Oe.nativeEnum(_a).optional()}).optional(),localEmulatorSettings:Oe.object({avdId:Oe.string()}).optional(),geolocation:Oe.object({latitude:Oe.coerce.number().refine(r=>r>=-90&&r<=90,{message:"Latitude must be between -90 and 90 degrees"}),longitude:Oe.coerce.number().refine(r=>r>=-180&&r<=180,{message:"Longitude must be between -180 and 180 degrees"})}).optional()}),Ua=Oe.object({retries:Oe.number().optional().describe("number of retries to run"),defaultChannel:Oe.string().optional().describe("default channel to use"),defaultTag:Oe.string().optional().describe("default tag to use, if not set uses latest"),defaultEnv:Oe.string().optional(),defaultApkFilePath:Oe.string().trim().min(1,"APK file path must not be empty.").optional().describe("APK to install when using the emulator in the local region."),emulator:vm.optional(),ai:Aa.optional()}),Ar=Oe.object({id:Oe.string().uuid(),description:Oe.string(),schemaVersion:Oe.string(),settings:Ua.optional()}),Am=Oe.object({fileType:Oe.literal(De.MOBILE_TEST)}).merge(Ar),kO=Ar.merge(Oe.object({steps:Oe.array(Vt)})),P4=Am.merge(kO),I4=Oe.object({name:Oe.string(),steps:Oe.array(Vt).optional(),settings:Ua.optional()}),UO=Ar.extend({steps:pi.array()});import pe from"zod";var Ur=pe.object({startTime:pe.number(),endTime:pe.number().optional(),durationMs:pe.number().optional(),error:pe.string().optional(),result:pe.unknown().optional(),attributes:pe.record(pe.string(),pe.unknown())});var FO=Ur.extend({type:pe.literal("SECTION"),name:pe.string(),subSpans:pe.lazy(()=>wm.array())}),BO=Ur.extend({type:pe.literal("AI_LOCATOR_CALL"),result:pe.object({id:pe.number(),thoughts:pe.string()}).optional()}),zO=Ur.extend({type:pe.literal("AI_ASSERTION_CALL"),result:pe.object({thoughts:pe.string(),result:pe.boolean()}).optional()}),HO=Ur.extend({type:pe.literal("TARGET_RESOLUTION"),result:pe.object({serializedElement:pe.string()}).optional()}),GO=Ur.extend({type:pe.literal("EMULATOR_INTERACTION"),name:pe.string(),withinWebview:pe.boolean().optional()}),VO=Ur.extend({type:pe.literal("EMULATOR_READ_STATE"),name:pe.string()}),WO=Ur.extend({type:pe.literal("ELEMENT_ASSERTION"),name:pe.string(),result:pe.object({success:pe.boolean(),message:pe.string().optional()}).optional()}),jO=Ur.extend({type:pe.literal("CACHE_RESOLUTION")}),$O=Ur.extend({type:pe.literal("WAIT_FOR_SCREENSHOT_STABILITY")}),qO=Ur.extend({type:pe.literal("GENERIC"),name:pe.string()}),wm=pe.discriminatedUnion("type",[FO,BO,zO,HO,GO,VO,WO,jO,$O,qO]);import xt from"zod";var Fa=xt.object({message:xt.string().optional(),startTime:xt.number(),endTime:xt.number(),status:xt.nativeEnum(Ke),trace:xt.unknown(),beforeSnapshot:xt.string().optional(),afterSnapshot:xt.string().optional(),data:xt.unknown().optional().describe("output data from the step")}),KO=Fa.merge(Oa).extend({previousAttempts:xt.lazy(()=>zt.array()).optional()}),YO=Fa.merge(La).extend({steps:xt.lazy(()=>zt.array()),name:xt.string().optional(),previousAttempts:xt.lazy(()=>zt.array()).optional()}),XO=Fa.merge(Na).extend({steps:xt.lazy(()=>zt.array()),previousAttempts:xt.lazy(()=>zt.array()).optional()}),zt=xt.discriminatedUnion("type",[KO,YO,XO]);import{parse as V4}from"date-fns";import Ba from"zod";var JO=Fa.extend({index:Ba.number().optional(),userFacingStepReference:Ba.string().optional(),description:Ba.string()}),Qy=JO.extend({beforeScreenshot:Ba.string().optional(),afterScreenshot:Ba.string().optional()});var Zy=Z.object({attributesRequired:Z.array(Z.string()).optional(),textRequired:Z.boolean().optional(),boundsRequired:Z.boolean().optional(),positionSpecificity:Z.nativeEnum(It).optional(),shapeSpecificity:Z.nativeEnum(It).optional()}),eb=Z.object({id:Z.number(),thoughts:Z.string(),updatedMemory:ta.optional(),inWebview:Z.boolean().optional(),requirements:Zy.optional(),additionalElements:Z.object({id:Z.number(),requirements:Zy}).array().optional()}),tb=Z.object({description:Z.string(),screenXml:Z.string(),screenshot:Z.string(),memory:Z.discriminatedUnion("type",[en,Z.object({type:Z.literal("RESOLVED_TRACES"),traces:Z.unknown().array()})]).optional()}),rb=Z.object({assertion:Z.string(),screenXml:Z.string(),screenshot:Z.string(),memory:Z.discriminatedUnion("type",[ia,Z.object({type:Z.literal("RESOLVED_TRACES"),traces:Z.unknown().array()})]).optional()}),nb=Z.object({thoughts:Z.string(),result:Z.boolean(),relevantElements:Z.array(Z.number()).optional(),updatedMemory:oa.optional()}),ob=Z.object({failedResults:Qy.array(),nextStepsSerialized:Z.string().array(),currentScreenXml:Z.string(),currentScreenshot:Z.string(),customInstructions:Z.string().optional(),testDescription:Z.string()}),ib=(n=>(n.LEGITIMATE="LEGITIMATE",n.RECOVERABLE="RECOVERABLE",n.INELIGIBLE="INELIGIBLE",n))(ib||{}),ab=Z.object({thoughts:Z.string(),scenario:Z.nativeEnum(ib),instructions:Z.string().nullish()});import{z as po}from"zod";var sb=po.object({id:po.string().uuid(),skipped:po.boolean().optional(),envKey:po.string().optional().describe("key in the environment to save the result of this step to")}),Cm=sb.merge(Qn).extend({type:po.literal("REQUEST")}),Rm=sb.merge(Xs).extend({type:po.literal("JAVASCRIPT")}),xm=po.discriminatedUnion("type",[Rm,Cm]);import{z as lr}from"zod";var lb=lr.object({id:lr.string(),name:ti,description:lr.string().optional().nullish(),baseUrl:gl.nullish(),schemaVersion:lr.string(),advanced:lr.unknown().optional(),retries:lr.number(),envs:lr.array(Tl).nullish(),parameters:El.nullish()}),QO=lr.object({createdAt:lr.coerce.date(),updatedAt:lr.coerce.date(),schedule:ii.nullish(),notification:ai.nullish(),createdBy:lr.string(),organizationId:lr.string()}),ZO=lb.merge(QO),NJ=ZO.extend({steps:xm.array()}),DJ=lb.extend({steps:xm.array()});import{z as Wt}from"zod";var cb=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date(),status:Wt.nativeEnum(Ke),message:Wt.string().optional(),data:Wt.unknown().optional()}),eL=cb.merge(Rm).extend({type:Wt.literal("JAVASCRIPT")}),tL=cb.merge(Cm).extend({type:Wt.literal("REQUEST")}),rL=Wt.discriminatedUnion("type",[eL,tL]),ub=Wt.object({startedAt:Wt.coerce.date(),finishedAt:Wt.coerce.date().nullish(),status:Wt.nativeEnum(xe),results:rL.array(),failureReason:Wt.string().nullish(),failureDetails:al.nullish()});import{z as jt}from"zod";var nL=jt.object({id:jt.string(),organizationId:jt.string(),createdAt:jt.coerce.date(),updatedAt:jt.coerce.date(),createdBy:jt.string(),scheduledAt:jt.coerce.date().nullish(),startedAt:jt.coerce.date().nullish(),finishedAt:jt.coerce.date().nullish(),status:jt.nativeEnum(xe),trigger:jt.nativeEnum(ar),results:ub.array().nullish(),apiTestName:jt.string().nullish(),apiTestPath:jt.string().nullish(),apiTestId:jt.string().nullish()}),jJ=nL.pick({status:!0,startedAt:!0,finishedAt:!0});var za=(o=>(o.TestRun="test-run",o.MobileTestRun="mobile-test-run",o.CreditsUsed="credits-used",o.CreditsUsedV2="credits-used-v2",o))(za||{}),db=3;function oL(r){return r==="MODULE"||r==="CONDITIONAL"||r==="SECTION"||r==="RESOLVED_MODULE"}function Mm(r){if(!oL(r))switch(r){case"PRESET_ACTION":return 0;case"AI_ACTION":return 3;case"AI_ACTION_DYNAMIC":return 5;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function _m(r){switch(r.type){case"AI_EXTRACT":case"AI_ASSERTION":return db;case"CAPTCHA":return 3;case"CLICK":case"TYPE":case"SELECT_OPTION":case"HOVER":case"ELEMENT_CHECK":case"FOCUS":case"BLUR":case"SCROLL_DOWN":case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_UP":case"MOUSE_DRAG":return r.useSelector||!r.target||r.target.type!=="description"?0:1;case"DRAG":return r.useSelector?0:1;case"VISUAL_DIFF":case"TAB":case"JAVASCRIPT":case"NAVIGATE":case"WAIT":case"SUCCESS":case"AUTH_LOAD":case"AUTH_SAVE":case"COOKIE":case"DIALOG":case"FILE_UPLOAD":case"GO_BACK":case"GO_FORWARD":case"LOCAL_STORAGE":case"NEW_TAB":case"PAGE_CHECK":case"PRESS":case"KEY_DOWN":case"KEY_UP":case"COPY":case"PASTE":case"REFRESH":case"REQUEST":case"GRAPHQL_REQUEST":case"WAIT_FOR_URL":case"REGISTER_REQUEST_LISTENER":case"AWAIT_LISTENER":case"RECORD_REQUESTS":case"GET_RECORDED_REQUESTS":case"SET_HEADER":case"MOCK_ROUTE":case"REMOVE_ROUTE_MOCK":case"OFFLINE_MODE":return 0;default:(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Nl=class{trackStepExecution(){}async flush(){}};import{parseString as iL,splitCookiesString as aL}from"set-cookie-parser";import{z as we}from"zod";var Pm=we.object({name:we.string(),value:we.string(),url:we.string().optional(),domain:we.string().optional(),path:we.string().optional(),expires:we.number().default(Date.now()/1e3+60*60*24*365),httpOnly:we.boolean().optional(),secure:we.boolean().default(!0),sameSite:we.union([we.literal("Strict"),we.literal("Lax"),we.literal("None")]).default("None")});function Dl(r,e){let t=[],n=aL(r);for(let o of n){let i=iL(o,{decodeValues:!1});if(!i.name)throw new Error("Name missing from cookie");if(!i.value)continue;let a;if(i.sameSite){let u=i.sameSite.trim().toLowerCase();if(u==="strict")a="Strict";else if(u==="lax")a="Lax";else if(u==="none")a="None";else throw new Error(`Invalid sameSite setting in cookie: ${u}`)}i.httpOnly===void 0&&(i.httpOnly=!1),!i.path&&i.domain&&(i.path="/"),!i.domain&&e&&(i.domain=e);let s=Pm.parse({...i,expires:i.expires?i.expires.getTime()/1e3:void 0,sameSite:a});t.push(s);let c=[s.name,...Object.keys(s)].map(u=>u.toLowerCase()),l=o.match(/\b(\S+)=([^;]*)/g);if(l)for(let u of l){let[d,m]=u.split("=");if(!d||!m)throw new Error(`Invalid key-value pair in cookie: ${u}`);c.includes(d.toLowerCase())||t.push({...s,name:d,value:m})}}return t}var sL=we.object({origin:we.string(),localStorage:we.array(we.object({name:we.string(),value:we.string()}))}),lL=we.object({entries:we.record(we.string(),we.array(we.tuple([we.unknown(),we.unknown()]))),version:we.number().optional()}),mb=we.object({cookies:Pm.array().optional(),origins:sL.array().optional(),idb:we.record(we.string(),lL).optional().describe("key is db name")});function kl(r,e){let t=[];return r.cloneSync()?.serializeSync()?.cookies.forEach(n=>{let o=Pm.safeParse({name:n.key,...n});if(!o.success)return;let i=o.data;!i.domain&&!i.url&&(i.domain=e),t.push(i)}),t}var f8=new Set(Object.values(nt));var cL={AI_ACTION:"AI action",AI_ACTION_DYNAMIC:"AI action",CONDITIONAL:"Conditional",RESOLVED_MODULE:"Module",AI_ASSERTION:"AI check",AI_EXTRACT:"AI extract",CLICK:"Click",TYPE:"Type",JAVASCRIPT:"JavaScript",SELECT_OPTION:"Select",PRESS:"Press",KEY_DOWN:"Key down",KEY_UP:"Key up",NAVIGATE:"Navigate",SCROLL_UP:"Scroll up",SCROLL_DOWN:"Scroll down",SCROLL_LEFT:"Scroll left",SCROLL_RIGHT:"Scroll right",HOVER:"Hover",BLUR:"Blur",FILE_UPLOAD:"File upload",FOCUS:"Focus",GO_BACK:"Go back",GO_FORWARD:"Go forward",WAIT:"Wait",REFRESH:"Refresh",TAB:"Switch tab",NEW_TAB:"New tab",COOKIE:"Cookie",LOCAL_STORAGE:"localStorage",REQUEST:"API request",GRAPHQL_REQUEST:"GraphQL request",CAPTCHA:"CAPTCHA",DRAG:"Drag & drop",VISUAL_DIFF:"Visual diff",DIALOG:"Dialog",MOUSE_DRAG:"Mouse drag",AUTH_LOAD:"Load auth state",AUTH_SAVE:"Save auth state",ELEMENT_CHECK:"Element check",PAGE_CHECK:"Page check",WAIT_FOR_URL:"Wait for URL",COPY:"Copy",PASTE:"Paste",REGISTER_REQUEST_LISTENER:"Register request listener",AWAIT_LISTENER:"Await listener",RECORD_REQUESTS:"Record requests",GET_RECORDED_REQUESTS:"Get recorded requests",SET_HEADER:"Set header",MOCK_ROUTE:"Mock route",REMOVE_ROUTE_MOCK:"Remove route mock",OFFLINE_MODE:"Offline mode",SUCCESS:"Done"},S8={AI_ACTION:["ai","action","agent"],AI_ACTION_DYNAMIC:["ai","action","dynamic","agent"],CONDITIONAL:["conditional","if","else","elif","branch"],RESOLVED_MODULE:[],AI_ASSERTION:["ai","check","assert","make sure","ensure"],AI_EXTRACT:["ai","extract","data"],CLICK:["click","press"],TYPE:["type","input","write","press"],JAVASCRIPT:["js","javascript","code","execute"],SELECT_OPTION:["select","option","choose"],PRESS:["keyboard","type","key"],KEY_DOWN:["keyboard","type","key","down","press"],KEY_UP:["keyboard","type","key","up","press"],NAVIGATE:["go to","visit"],SCROLL_UP:[],SCROLL_DOWN:[],SCROLL_LEFT:[],SCROLL_RIGHT:[],HOVER:["scroll into view","go to"],BLUR:[],FILE_UPLOAD:[],FOCUS:[],GO_BACK:[],GO_FORWARD:[],WAIT:[],REFRESH:[],TAB:[],NEW_TAB:[],COOKIE:[],LOCAL_STORAGE:[],REQUEST:[],GRAPHQL_REQUEST:[],CAPTCHA:[],DRAG:[],VISUAL_DIFF:[],DIALOG:[],MOUSE_DRAG:[],AUTH_LOAD:[],AUTH_SAVE:[],ELEMENT_CHECK:[],PAGE_CHECK:[],WAIT_FOR_URL:[],COPY:[],PASTE:[],REGISTER_REQUEST_LISTENER:[],AWAIT_LISTENER:[],RECORD_REQUESTS:[],GET_RECORDED_REQUESTS:[],SET_HEADER:[],MOCK_ROUTE:[],REMOVE_ROUTE_MOCK:[],OFFLINE_MODE:[],SUCCESS:[]},y8={AI_ACTION:"Ask AI achieve a specific goal. Saves the steps for reuse. Please use Dynamic AI action instead.",AI_ACTION_DYNAMIC:"Ask AI achieve a specific goal. Fully dynamic and does not save the steps for reuse. Our most capable AI agent.",CONDITIONAL:"Execute steps based on the outcome of an AI Check",RESOLVED_MODULE:"A list of steps that can be reused in multiple tests.",AI_ASSERTION:"Ask AI to verify whether something is true on the page.",CLICK:"Click on an element on the page.",DIALOG:"Specify how native browser dialogs should be handled.",AI_EXTRACT:"Ask AI to extract data from the page.",HOVER:"Hover over an element on the page.",FILE_UPLOAD:"Automatically upload a file when the native file upload dialog is activated.",FOCUS:"Focus an element on the page.",BLUR:"Remove focus from an element on the page.",SELECT_OPTION:"Select an option from an HTML Select <select> element.",TYPE:"Type the specified text into an element.",PRESS:"Press the specified keys using the keyboard. (e.g. Control+A)",KEY_DOWN:"Hold down the specified keys on the keyboard. (e.g. Control+A)",KEY_UP:"Release the specified keys on the keyboard. (e.g. Control+A)",NAVIGATE:"Navigate to the specified URL.",SCROLL_UP:"Scroll up by a specified height.",SCROLL_DOWN:"Scroll down by a specified height.",SCROLL_LEFT:"Scroll left by a specified width.",SCROLL_RIGHT:"Scroll right by a specified width.",GO_BACK:"Go back in browser history.",GO_FORWARD:"Go forward in browser history.",WAIT:"Wait for the specified number of seconds.",REFRESH:"Refresh the page. This will not clear cookies or session data.",TAB:"Switch to different tab in the browser.",NEW_TAB:"Create and switch to a new tab in the browser.",COOKIE:"Set a cookie that will persist throughout the browser session.",LOCAL_STORAGE:"Set a localStorage value that will persist throughout the browser session",CAPTCHA:"Solve CAPTCHAs on the page. This feature is only available on Momentic Cloud and may take up to 60 seconds. Disabling CAPTCHAs in non-production environments is strongly advised.",REQUEST:"Make an API request to a URL.",GRAPHQL_REQUEST:"Make a GraphQL request to a URL.",JAVASCRIPT:"Run JavaScript code in the browser or a Node.js environment.",DRAG:"Click and drag an element to another location.",VISUAL_DIFF:"Compare a screenshot of the page or a specific element to a baseline image.",MOUSE_DRAG:"Click and drag the mouse by a specified distance.",AUTH_LOAD:"Load or clear session state using a JavaScript object including cookies, localStorage, and IndexDB entries.",AUTH_SAVE:"Save authentication state (cookies, localStorage) into a JavaScript object.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",PAGE_CHECK:"Assert on the active page's contents using pre-built conditions.",WAIT_FOR_URL:"Wait for the active page's URL to match a target value or pattern.",COPY:"Copy the specified value to the browser clipboard.",PASTE:"Paste the browser clipboard contents.",REGISTER_REQUEST_LISTENER:"Register a listener for network requests.",AWAIT_LISTENER:"Wait for a listener to fire, and return the response data.",RECORD_REQUESTS:"Record network requests that match a given pattern.",GET_RECORDED_REQUESTS:"Get recorded requests that matched the pattern.",SET_HEADER:"Set a header.",MOCK_ROUTE:"Mock network requests to a specific URL.",REMOVE_ROUTE_MOCK:"Remove a previously set route mock.",OFFLINE_MODE:"Configure offline mode.",SUCCESS:"Indicate the entire AI action has succeeded, optionally based on a condition."},b8={AI_CHECK:"AI check",RESOLVED_MOBILE_MODULE:"Module",MOBILE_AI_ACTION_STEP:"AI action",TAP:"Tap",TYPE:"Type",PRESS:"Press button",PRESS_KEYBOARD:"Press keyboard",SWIPE:"Swipe",SCROLL_TO:"Scroll to",DRAG_AND_DROP:"Drag & drop",SCREEN_CHECK:"Screen check",ELEMENT_CHECK:"Element check",OPEN_APP:"Open app",KILL_APP:"Kill app",OPEN_NOTIFICATION_DRAWER:"Open notification drawer",JAVASCRIPT:"JavaScript",REQUEST:"API request",WAIT:"Wait",ADD_FILE:"Add file",INSTALL_APP:"Install app",UNINSTALL_APP:"Uninstall app",TOGGLE_SETTINGS:"Toggle settings",ADB:"ADB command",STATE:"Debug state"},E8={MOBILE_AI_ACTION_STEP:"Ask AI to accomplish a high-level goal by generating other steps.",RESOLVED_MOBILE_MODULE:"A list of steps that can be reused in multiple tests.",TAP:"Tap on an element on the screen.",TYPE:"Type the specified text into an element.",PRESS:"Press a physical button on the device.",PRESS_KEYBOARD:"Press a special key on the keyboard.",SWIPE:"Swipe on the screen.",SCREEN_CHECK:"Assert on the screen content using pre-built conditions.",SCROLL_TO:"Scroll until an element is visible.",DRAG_AND_DROP:"Drag an element onto another element in the same context.",ELEMENT_CHECK:"Assert on an element's state using pre-built conditions, including content, visibility, attribute value checks.",OPEN_APP:"Open an app on the device.",KILL_APP:"Terminate the currently active app and remove it from recents.",OPEN_NOTIFICATION_DRAWER:"Open the notification drawer.",JAVASCRIPT:"Execute JavaScript code in a NodeJS context.",REQUEST:"Make an HTTP request to a URL.",WAIT:"Wait for a specified amount of time.",ADD_FILE:"Add a file to the device's disk.",INSTALL_APP:"Install one or more APKs onto the connected emulator (local emulator only).",UNINSTALL_APP:"Uninstall an APK from the connected emulator (local emulator only).",TOGGLE_SETTINGS:"Toggle device settings.",ADB:"Execute an ADB command on the device.",STATE:"Capture and return emulator state details.",AI_CHECK:"Ask AI to verify whether something is true on the screen."};import uL from"semver";import{z as dL}from"zod";var w8=dL.string().refine(r=>uL.valid(r),{message:"must be a valid semver string"});import{Faker as x8,en as M8}from"@faker-js/faker";import{z as D}from"zod";var P8=D.object({body:D.string(),to:D.string(),from:D.string()}),I8=D.object({from:D.string().optional(),to:D.string(),timeout:D.number().optional(),beforeDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional()}),O8=D.object({to:D.string().email(),from:D.string(),subject:D.string(),body:D.string(),html:D.string().optional()}),L8=D.object({inbox:D.string().transform(r=>r.toLowerCase()),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),timeout:D.number().optional(),trimWhitespace:D.boolean().optional()}),N8=D.object({inbox:D.string(),limit:D.number().optional(),afterDate:D.string().pipe(D.coerce.date()).or(D.date()).optional(),trimWhitespace:D.boolean().optional()});var Ul=(t=>(t.RAW="RAW",t.RESPONSE="RESPONSE",t))(Ul||{}),pb=D.object({body:D.string().nullish(),status:D.number().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}),mL=D.object({url:D.string(),options:D.object({method:D.string(),body:D.string().nullish(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),pL=D.object({body:D.string().nullish(),options:D.object({status:D.number(),statusText:D.string().optional(),headers:D.array(D.tuple([D.string(),D.string()])).optional()}).optional()}).optional(),gb=D.object({result:D.unknown(),variableUpdates:D.record(D.string(),D.unknown()).optional(),persistentVariableUpdates:D.record(D.string(),D.unknown()).optional(),error:D.string().optional(),success:D.boolean()}),D8=D.object({id:D.string().optional(),orgId:D.string(),momenticLambdaAuthHash:D.string(),code:D.string(),fragment:D.boolean(),state:D.object({env:D.record(D.string(),D.unknown()),request:mL,response:pL,additionalBindings:D.record(D.string(),D.unknown()).optional()}),timeoutMs:D.number().optional(),disallowVariableUpdates:D.boolean().optional(),responseSerialization:D.nativeEnum(Ul).optional()}),_n=15e3;import*as Mt from"zod";import{extendZodWithOpenApi as gL}from"zod-openapi";gL(Mt);var hL=Mt.object({url:Mt.string(),lineNumber:Mt.number(),columnNumber:Mt.number()}).openapi({ref:"CodeLocation"}),Fl=Mt.object({timestamp:Mt.number(),text:Mt.string(),type:Mt.string(),tabIndex:Mt.number(),args:Mt.unknown().array().optional(),url:Mt.string().optional(),location:hL.optional()}).openapi({ref:"ConsoleLog"}),hb=Fl.array(),fb=hb.array();import*as Im from"zod";import{extendZodWithOpenApi as fL}from"zod-openapi";fL(Im);var SL=Im.object({logsPerPage:Fl.array().array()}).openapi({ref:"DebugData"});import{z as P}from"zod";var yL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),bL=P.object({name:P.string(),version:P.string(),comment:P.string().optional()}),EL=P.object({onContentLoad:P.number().optional(),onLoad:P.number().optional(),comment:P.string().optional()}),Bl=P.object({startedDateTime:P.string(),id:P.string(),title:P.string().optional(),pageTimings:EL,comment:P.string().optional()}),TL=P.array(Bl),vL=P.object({name:P.string(),value:P.string(),path:P.string().optional(),domain:P.string().optional(),expires:P.string().optional(),httpOnly:P.boolean().optional(),secure:P.boolean().optional(),comment:P.string().optional()}),yb=P.array(vL),AL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),bb=P.array(AL),wL=P.object({name:P.string(),value:P.string(),comment:P.string().optional()}),CL=P.array(wL),RL=P.object({name:P.string(),value:P.string().optional(),fileName:P.string().optional(),contentType:P.string().optional(),comment:P.string().optional()}),xL=P.array(RL),ML=P.object({mimeType:P.string(),params:xL,text:P.string(),comment:P.string().optional(),_redactedReason:P.string().optional()}),_L=P.object({method:P.string(),url:P.string(),httpVersion:P.string().optional(),cookies:yb,headers:bb,queryString:CL,postData:ML.optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional()}),PL=P.object({size:P.number().optional(),compression:P.number().optional(),mimeType:P.string().optional(),text:P.string().optional(),encoding:P.string().optional(),comment:P.string().optional(),_redactedReason:P.string().optional()}),IL=P.object({status:P.number(),statusText:P.string(),httpVersion:P.string().optional(),cookies:yb,headers:bb,content:PL,redirectURL:P.string().optional(),headersSize:P.number().optional(),bodySize:P.number().optional(),comment:P.string().optional(),_mocked:P.boolean().optional()}),Sb=P.object({expires:P.string().optional(),lastAccess:P.string(),eTag:P.string(),hitCount:P.number(),comment:P.string().optional()}),OL=P.object({beforeRequest:Sb.optional(),afterRequest:Sb.optional(),comment:P.string().optional()}),LL=P.object({blocked:P.number().optional(),dns:P.number().optional(),connect:P.number().optional(),send:P.number(),wait:P.number(),receive:P.number(),ssl:P.number().optional(),comment:P.string().optional()}),zl=P.object({pageref:P.string().optional(),startedDateTime:P.string(),time:P.number().optional(),request:_L,response:IL.optional(),cache:OL.optional(),timings:LL,serverIPAddress:P.string().optional(),connection:P.string().optional(),comment:P.string().optional(),_resourceType:P.string().optional()}),NL=P.array(zl),DL=P.object({version:P.string().default("1.1"),creator:yL.optional(),browser:bL.optional(),pages:TL.optional(),entries:NL,comment:P.string().optional()}),kL=P.object({log:DL}),K8=P.record(P.string(),Bl),Y8=P.record(P.string(),zl);import{cloneDeep as FL}from"lodash-es";import{z as Fr}from"zod";var Tb=(c=>(c.DisableClickhouseCaches="disable_clickhouse_caches",c.ShowZeroOpacityElements="show_zero_opacity_elements",c.VisualActions="visual_actions",c.RagV2="rag_v2",c.DisableSecondaryCacheResolution="disable_secondary_cache_resolution",c.GlobalLocatorRedirect="global_locator_redirect",c.FakerConstantSeed="faker_constant_seed",c.AutoExpandIframes="auto_expand_iframes",c))(Tb||{});var Eb=Fr.union([Fr.string(),Fr.number(),Fr.boolean(),Fr.null(),Fr.record(Fr.string(),Fr.lazy(()=>Eb)),Fr.array(Fr.lazy(()=>Eb))]),Hl=class{flags;payloads;constructor(e,t){this.flags=e,this.payloads=t}isBooleanFlagEnabled(e){return process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="true"?!0:process.env&&process.env[`MOMENTIC_FLAG_OVERRIDE_${e.toUpperCase()}`]==="false"?!1:this.flags[e]===!0}getAllFlags(){let e=FL(this.flags);return Object.entries(e).forEach(([t,n])=>{typeof n=="boolean"&&Object.values(Tb).includes(t)&&(e[t]=this.isBooleanFlagEnabled(t))}),e}getFlagPayload(e){let t=this.payloads[e];if(t!==void 0){if(typeof t=="string")try{return JSON.parse(t)}catch{return t}return t}}refresh(){throw new Error("Not implemented")}},a6=new Hl({},{});var Om={".123":"application/vnd.lotus-1-2-3",".3dml":"text/vnd.in3d.3dml",".3g2":"video/3gpp2",".3gp":"video/3gpp",".a":"application/octet-stream",".aab":"application/x-authorware-bin",".aac":"audio/x-aac",".aam":"application/x-authorware-map",".aas":"application/x-authorware-seg",".abw":"application/x-abiword",".acc":"application/vnd.americandynamics.acc",".ace":"application/x-ace-compressed",".acu":"application/vnd.acucobol",".acutc":"application/vnd.acucorp",".adp":"audio/adpcm",".aep":"application/vnd.audiograph",".afm":"application/x-font-type1",".afp":"application/vnd.ibm.modcap",".ai":"application/postscript",".aif":"audio/x-aiff",".aifc":"audio/x-aiff",".aiff":"audio/x-aiff",".air":"application/vnd.adobe.air-application-installer-package+zip",".ami":"application/vnd.amiga.ami",".apk":"application/vnd.android.package-archive",".application":"application/x-ms-application",".apr":"application/vnd.lotus-approach",".asc":"application/pgp-signature",".asf":"video/x-ms-asf",".asm":"text/x-asm",".aso":"application/vnd.accpac.simply.aso",".asx":"video/x-ms-asf",".atc":"application/vnd.acucorp",".atom":"application/atom+xml",".atomcat":"application/atomcat+xml",".atomsvc":"application/atomsvc+xml",".atx":"application/vnd.antix.game-component",".au":"audio/basic",".avi":"video/x-msvideo",".aw":"application/applixware",".azf":"application/vnd.airzip.filesecure.azf",".azs":"application/vnd.airzip.filesecure.azs",".azw":"application/vnd.amazon.ebook",".bat":"application/x-msdownload",".bcpio":"application/x-bcpio",".bdf":"application/x-font-bdf",".bdm":"application/vnd.syncml.dm+wbxml",".bh2":"application/vnd.fujitsu.oasysprs",".bin":"application/octet-stream",".bmi":"application/vnd.bmi",".bmp":"image/bmp",".book":"application/vnd.framemaker",".box":"application/vnd.previewsystems.box",".boz":"application/x-bzip2",".bpk":"application/octet-stream",".btif":"image/prs.btif",".bz":"application/x-bzip",".bz2":"application/x-bzip2",".c":"text/x-c",".c4d":"application/vnd.clonk.c4group",".c4f":"application/vnd.clonk.c4group",".c4g":"application/vnd.clonk.c4group",".c4p":"application/vnd.clonk.c4group",".c4u":"application/vnd.clonk.c4group",".cab":"application/vnd.ms-cab-compressed",".car":"application/vnd.curl.car",".cat":"application/vnd.ms-pki.seccat",".cc":"text/x-c",".cct":"application/x-director",".ccxml":"application/ccxml+xml",".cdbcmsg":"application/vnd.contact.cmsg",".cdf":"application/x-netcdf",".cdkey":"application/vnd.mediastation.cdkey",".cdx":"chemical/x-cdx",".cdxml":"application/vnd.chemdraw+xml",".cdy":"application/vnd.cinderella",".cer":"application/pkix-cert",".cgm":"image/cgm",".chat":"application/x-chat",".chm":"application/vnd.ms-htmlhelp",".chrt":"application/vnd.kde.kchart",".cif":"chemical/x-cif",".cii":"application/vnd.anser-web-certificate-issue-initiation",".cil":"application/vnd.ms-artgalry",".cla":"application/vnd.claymore",".class":"application/java-vm",".clkk":"application/vnd.crick.clicker.keyboard",".clkp":"application/vnd.crick.clicker.palette",".clkt":"application/vnd.crick.clicker.template",".clkw":"application/vnd.crick.clicker.wordbank",".clkx":"application/vnd.crick.clicker",".clp":"application/x-msclip",".cmc":"application/vnd.cosmocaller",".cmdf":"chemical/x-cmdf",".cml":"chemical/x-cml",".cmp":"application/vnd.yellowriver-custom-menu",".cmx":"image/x-cmx",".cod":"application/vnd.rim.cod",".com":"application/x-msdownload",".conf":"text/plain",".cpio":"application/x-cpio",".cpp":"text/x-c",".cpt":"application/mac-compactpro",".crd":"application/x-mscardfile",".crl":"application/pkix-crl",".crt":"application/x-x509-ca-cert",".csh":"application/x-csh",".csml":"chemical/x-csml",".csp":"application/vnd.commonspace",".css":"text/css",".cst":"application/x-director",".csv":"text/csv",".cu":"application/cu-seeme",".curl":"text/vnd.curl",".cww":"application/prs.cww",".cxt":"application/x-director",".cxx":"text/x-c",".daf":"application/vnd.mobius.daf",".dataless":"application/vnd.fdsn.seed",".davmount":"application/davmount+xml",".dcr":"application/x-director",".dcurl":"text/vnd.curl.dcurl",".dd2":"application/vnd.oma.dd2+xml",".ddd":"application/vnd.fujixerox.ddd",".deb":"application/x-debian-package",".def":"text/plain",".deploy":"application/octet-stream",".der":"application/x-x509-ca-cert",".dfac":"application/vnd.dreamfactory",".dic":"text/x-c",".diff":"text/plain",".dir":"application/x-director",".dis":"application/vnd.mobius.dis",".dist":"application/octet-stream",".distz":"application/octet-stream",".djv":"image/vnd.djvu",".djvu":"image/vnd.djvu",".dll":"application/x-msdownload",".dmg":"application/octet-stream",".dms":"application/octet-stream",".dna":"application/vnd.dna",".doc":"application/msword",".docm":"application/vnd.ms-word.document.macroenabled.12",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".dot":"application/msword",".dotm":"application/vnd.ms-word.template.macroenabled.12",".dotx":"application/vnd.openxmlformats-officedocument.wordprocessingml.template",".dp":"application/vnd.osgi.dp",".dpg":"application/vnd.dpgraph",".dsc":"text/prs.lines.tag",".dtb":"application/x-dtbook+xml",".dtd":"application/xml-dtd",".dts":"audio/vnd.dts",".dtshd":"audio/vnd.dts.hd",".dump":"application/octet-stream",".dvi":"application/x-dvi",".dwf":"model/vnd.dwf",".dwg":"image/vnd.dwg",".dxf":"image/vnd.dxf",".dxp":"application/vnd.spotfire.dxp",".dxr":"application/x-director",".ecelp4800":"audio/vnd.nuera.ecelp4800",".ecelp7470":"audio/vnd.nuera.ecelp7470",".ecelp9600":"audio/vnd.nuera.ecelp9600",".ecma":"application/ecmascript",".edm":"application/vnd.novadigm.edm",".edx":"application/vnd.novadigm.edx",".efif":"application/vnd.picsel",".ei6":"application/vnd.pg.osasli",".elc":"application/octet-stream",".eml":"message/rfc822",".emma":"application/emma+xml",".eol":"audio/vnd.digital-winds",".eot":"application/vnd.ms-fontobject",".eps":"application/postscript",".epub":"application/epub+zip",".es3":"application/vnd.eszigno3+xml",".esf":"application/vnd.epson.esf",".et3":"application/vnd.eszigno3+xml",".etx":"text/x-setext",".exe":"application/x-msdownload",".ext":"application/vnd.novadigm.ext",".ez":"application/andrew-inset",".ez2":"application/vnd.ezpix-album",".ez3":"application/vnd.ezpix-package",".f":"text/x-fortran",".f4v":"video/x-f4v",".f77":"text/x-fortran",".f90":"text/x-fortran",".fbs":"image/vnd.fastbidsheet",".fdf":"application/vnd.fdf",".fe_launch":"application/vnd.denovo.fcselayout-link",".fg5":"application/vnd.fujitsu.oasysgp",".fgd":"application/x-director",".fh":"image/x-freehand",".fh4":"image/x-freehand",".fh5":"image/x-freehand",".fh7":"image/x-freehand",".fhc":"image/x-freehand",".fig":"application/x-xfig",".fli":"video/x-fli",".flo":"application/vnd.micrografx.flo",".flv":"video/x-flv",".flw":"application/vnd.kde.kivio",".flx":"text/vnd.fmi.flexstor",".fly":"text/vnd.fly",".fm":"application/vnd.framemaker",".fnc":"application/vnd.frogans.fnc",".for":"text/x-fortran",".fpx":"image/vnd.fpx",".frame":"application/vnd.framemaker",".fsc":"application/vnd.fsc.weblaunch",".fst":"image/vnd.fst",".ftc":"application/vnd.fluxtime.clip",".fti":"application/vnd.anser-web-funds-transfer-initiation",".fvt":"video/vnd.fvt",".fzs":"application/vnd.fuzzysheet",".g3":"image/g3fax",".gac":"application/vnd.groove-account",".gdl":"model/vnd.gdl",".geo":"application/vnd.dynageo",".gex":"application/vnd.geometry-explorer",".ggb":"application/vnd.geogebra.file",".ggt":"application/vnd.geogebra.tool",".ghf":"application/vnd.groove-help",".gif":"image/gif",".gim":"application/vnd.groove-identity-message",".gmx":"application/vnd.gmx",".gnumeric":"application/x-gnumeric",".gph":"application/vnd.flographit",".gqf":"application/vnd.grafeq",".gqs":"application/vnd.grafeq",".gram":"application/srgs",".gre":"application/vnd.geometry-explorer",".grv":"application/vnd.groove-injector",".grxml":"application/srgs+xml",".gsf":"application/x-font-ghostscript",".gtar":"application/x-gtar",".gtm":"application/vnd.groove-tool-message",".gtw":"model/vnd.gtw",".gv":"text/vnd.graphviz",".gz":"application/x-gzip",".h":"text/x-c",".h261":"video/h261",".h263":"video/h263",".h264":"video/h264",".hbci":"application/vnd.hbci",".hdf":"application/x-hdf",".hh":"text/x-c",".hlp":"application/winhlp",".hpgl":"application/vnd.hp-hpgl",".hpid":"application/vnd.hp-hpid",".hps":"application/vnd.hp-hps",".hqx":"application/mac-binhex40",".htke":"application/vnd.kenameaapp",".htm":"text/html",".html":"text/html",".hvd":"application/vnd.yamaha.hv-dic",".hvp":"application/vnd.yamaha.hv-voice",".hvs":"application/vnd.yamaha.hv-script",".icc":"application/vnd.iccprofile",".ice":"x-conference/x-cooltalk",".icm":"application/vnd.iccprofile",".ico":"image/x-icon",".ics":"text/calendar",".ief":"image/ief",".ifb":"text/calendar",".ifm":"application/vnd.shana.informed.formdata",".iges":"model/iges",".igl":"application/vnd.igloader",".igs":"model/iges",".igx":"application/vnd.micrografx.igx",".iif":"application/vnd.shana.informed.interchange",".imp":"application/vnd.accpac.simply.imp",".ims":"application/vnd.ms-ims",".in":"text/plain",".ipk":"application/vnd.shana.informed.package",".irm":"application/vnd.ibm.rights-management",".irp":"application/vnd.irepository.package+xml",".iso":"application/octet-stream",".itp":"application/vnd.shana.informed.formtemplate",".ivp":"application/vnd.immervision-ivp",".ivu":"application/vnd.immervision-ivu",".jad":"text/vnd.sun.j2me.app-descriptor",".jam":"application/vnd.jam",".jar":"application/java-archive",".java":"text/x-java-source",".jisp":"application/vnd.jisp",".jlt":"application/vnd.hp-jlyt",".jnlp":"application/x-java-jnlp-file",".joda":"application/vnd.joost.joda-archive",".jpe":"image/jpeg",".jpeg":"image/jpeg",".jpg":"image/jpeg",".jpgm":"video/jpm",".jpgv":"video/jpeg",".jpm":"video/jpm",".js":"application/javascript",".json":"application/json",".kar":"audio/midi",".karbon":"application/vnd.kde.karbon",".kfo":"application/vnd.kde.kformula",".kia":"application/vnd.kidspiration",".kil":"application/x-killustrator",".kml":"application/vnd.google-earth.kml+xml",".kmz":"application/vnd.google-earth.kmz",".kne":"application/vnd.kinar",".knp":"application/vnd.kinar",".kon":"application/vnd.kde.kontour",".kpr":"application/vnd.kde.kpresenter",".kpt":"application/vnd.kde.kpresenter",".ksh":"text/plain",".ksp":"application/vnd.kde.kspread",".ktr":"application/vnd.kahootz",".ktz":"application/vnd.kahootz",".kwd":"application/vnd.kde.kword",".kwt":"application/vnd.kde.kword",".latex":"application/x-latex",".lbd":"application/vnd.llamagraphics.life-balance.desktop",".lbe":"application/vnd.llamagraphics.life-balance.exchange+xml",".les":"application/vnd.hhe.lesson-player",".lha":"application/octet-stream",".link66":"application/vnd.route66.link66+xml",".list":"text/plain",".list3820":"application/vnd.ibm.modcap",".listafp":"application/vnd.ibm.modcap",".log":"text/plain",".lostxml":"application/lost+xml",".lrf":"application/octet-stream",".lrm":"application/vnd.ms-lrm",".ltf":"application/vnd.frogans.ltf",".lvp":"audio/vnd.lucent.voice",".lwp":"application/vnd.lotus-wordpro",".lzh":"application/octet-stream",".m13":"application/x-msmediaview",".m14":"application/x-msmediaview",".m1v":"video/mpeg",".m2a":"audio/mpeg",".m2v":"video/mpeg",".m3a":"audio/mpeg",".m3u":"audio/x-mpegurl",".m4u":"video/vnd.mpegurl",".m4v":"video/x-m4v",".ma":"application/mathematica",".mag":"application/vnd.ecowin.chart",".maker":"application/vnd.framemaker",".man":"text/troff",".mathml":"application/mathml+xml",".mb":"application/mathematica",".mbk":"application/vnd.mobius.mbk",".mbox":"application/mbox",".mc1":"application/vnd.medcalcdata",".mcd":"application/vnd.mcd",".mcurl":"text/vnd.curl.mcurl",".mdb":"application/x-msaccess",".mdi":"image/vnd.ms-modi",".me":"text/troff",".mesh":"model/mesh",".mfm":"application/vnd.mfmp",".mgz":"application/vnd.proteus.magazine",".mht":"message/rfc822",".mhtml":"message/rfc822",".mid":"audio/midi",".midi":"audio/midi",".mif":"application/vnd.mif",".mime":"message/rfc822",".mj2":"video/mj2",".mjp2":"video/mj2",".mkv":"video/x-matroska",".mlp":"application/vnd.dolby.mlp",".mmd":"application/vnd.chipnuts.karaoke-mmd",".mmf":"application/vnd.smaf",".mmr":"image/vnd.fujixerox.edmics-mmr",".mny":"application/x-msmoney",".mobi":"application/x-mobipocket-ebook",".mov":"video/quicktime",".movie":"video/x-sgi-movie",".mp2":"audio/mpeg",".mp2a":"audio/mpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".mp4a":"audio/mp4",".mp4s":"application/mp4",".mp4v":"video/mp4",".mpa":"video/mpeg",".mpc":"application/vnd.mophun.certificate",".mpe":"video/mpeg",".mpeg":"video/mpeg",".mpg":"video/mpeg",".mpg4":"video/mp4",".mpga":"audio/mpeg",".mpkg":"application/vnd.apple.installer+xml",".mpm":"application/vnd.blueice.multipass",".mpn":"application/vnd.mophun.application",".mpp":"application/vnd.ms-project",".mpt":"application/vnd.ms-project",".mpy":"application/vnd.ibm.minipay",".mqy":"application/vnd.mobius.mqy",".mrc":"application/marc",".ms":"text/troff",".mscml":"application/mediaservercontrol+xml",".mseed":"application/vnd.fdsn.mseed",".mseq":"application/vnd.mseq",".msf":"application/vnd.epson.msf",".msh":"model/mesh",".msi":"application/x-msdownload",".msl":"application/vnd.mobius.msl",".msty":"application/vnd.muvee.style",".mts":"model/vnd.mts",".mus":"application/vnd.musician",".musicxml":"application/vnd.recordare.musicxml+xml",".mvb":"application/x-msmediaview",".mwf":"application/vnd.mfer",".mxf":"application/mxf",".mxl":"application/vnd.recordare.musicxml",".mxml":"application/xv+xml",".mxs":"application/vnd.triscape.mxs",".mxu":"video/vnd.mpegurl",".n-gage":"application/vnd.nokia.n-gage.symbian.install",".nb":"application/mathematica",".nc":"application/x-netcdf",".ncx":"application/x-dtbncx+xml",".ngdat":"application/vnd.nokia.n-gage.data",".nlu":"application/vnd.neurolanguage.nlu",".nml":"application/vnd.enliven",".nnd":"application/vnd.noblenet-directory",".nns":"application/vnd.noblenet-sealer",".nnw":"application/vnd.noblenet-web",".npx":"image/vnd.net-fpx",".nsf":"application/vnd.lotus-notes",".nws":"message/rfc822",".o":"application/octet-stream",".oa2":"application/vnd.fujitsu.oasys2",".oa3":"application/vnd.fujitsu.oasys3",".oas":"application/vnd.fujitsu.oasys",".obd":"application/x-msbinder",".obj":"application/octet-stream",".oda":"application/oda",".odb":"application/vnd.oasis.opendocument.database",".odc":"application/vnd.oasis.opendocument.chart",".odf":"application/vnd.oasis.opendocument.formula",".odft":"application/vnd.oasis.opendocument.formula-template",".odg":"application/vnd.oasis.opendocument.graphics",".odi":"application/vnd.oasis.opendocument.image",".odp":"application/vnd.oasis.opendocument.presentation",".ods":"application/vnd.oasis.opendocument.spreadsheet",".odt":"application/vnd.oasis.opendocument.text",".oga":"audio/ogg",".ogg":"audio/ogg",".ogv":"video/ogg",".ogx":"application/ogg",".onepkg":"application/onenote",".onetmp":"application/onenote",".onetoc":"application/onenote",".onetoc2":"application/onenote",".opf":"application/oebps-package+xml",".oprc":"application/vnd.palm",".org":"application/vnd.lotus-organizer",".osf":"application/vnd.yamaha.openscoreformat",".osfpvg":"application/vnd.yamaha.openscoreformat.osfpvg+xml",".otc":"application/vnd.oasis.opendocument.chart-template",".otf":"application/x-font-otf",".otg":"application/vnd.oasis.opendocument.graphics-template",".oth":"application/vnd.oasis.opendocument.text-web",".oti":"application/vnd.oasis.opendocument.image-template",".otm":"application/vnd.oasis.opendocument.text-master",".otp":"application/vnd.oasis.opendocument.presentation-template",".ots":"application/vnd.oasis.opendocument.spreadsheet-template",".ott":"application/vnd.oasis.opendocument.text-template",".oxt":"application/vnd.openofficeorg.extension",".p":"text/x-pascal",".p10":"application/pkcs10",".p12":"application/x-pkcs12",".p7b":"application/x-pkcs7-certificates",".p7c":"application/pkcs7-mime",".p7m":"application/pkcs7-mime",".p7r":"application/x-pkcs7-certreqresp",".p7s":"application/pkcs7-signature",".pas":"text/x-pascal",".pbd":"application/vnd.powerbuilder6",".pbm":"image/x-portable-bitmap",".pcf":"application/x-font-pcf",".pcl":"application/vnd.hp-pcl",".pclxl":"application/vnd.hp-pclxl",".pct":"image/x-pict",".pcurl":"application/vnd.curl.pcurl",".pcx":"image/x-pcx",".pdb":"application/vnd.palm",".pdf":"application/pdf",".pfa":"application/x-font-type1",".pfb":"application/x-font-type1",".pfm":"application/x-font-type1",".pfr":"application/font-tdpfr",".pfx":"application/x-pkcs12",".pgm":"image/x-portable-graymap",".pgn":"application/x-chess-pgn",".pgp":"application/pgp-encrypted",".pic":"image/x-pict",".pkg":"application/octet-stream",".pki":"application/pkixcmp",".pkipath":"application/pkix-pkipath",".pl":"text/plain",".plb":"application/vnd.3gpp.pic-bw-large",".plc":"application/vnd.mobius.plc",".plf":"application/vnd.pocketlearn",".pls":"application/pls+xml",".pml":"application/vnd.ctc-posml",".png":"image/png",".pnm":"image/x-portable-anymap",".portpkg":"application/vnd.macports.portpkg",".pot":"application/vnd.ms-powerpoint",".potm":"application/vnd.ms-powerpoint.template.macroenabled.12",".potx":"application/vnd.openxmlformats-officedocument.presentationml.template",".ppa":"application/vnd.ms-powerpoint",".ppam":"application/vnd.ms-powerpoint.addin.macroenabled.12",".ppd":"application/vnd.cups-ppd",".ppm":"image/x-portable-pixmap",".pps":"application/vnd.ms-powerpoint",".ppsm":"application/vnd.ms-powerpoint.slideshow.macroenabled.12",".ppsx":"application/vnd.openxmlformats-officedocument.presentationml.slideshow",".ppt":"application/vnd.ms-powerpoint",".pptm":"application/vnd.ms-powerpoint.presentation.macroenabled.12",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".pqa":"application/vnd.palm",".prc":"application/x-mobipocket-ebook",".pre":"application/vnd.lotus-freelance",".prf":"application/pics-rules",".ps":"application/postscript",".psb":"application/vnd.3gpp.pic-bw-small",".psd":"image/vnd.adobe.photoshop",".psf":"application/x-font-linux-psf",".ptid":"application/vnd.pvi.ptid1",".pub":"application/x-mspublisher",".pvb":"application/vnd.3gpp.pic-bw-var",".pwn":"application/vnd.3m.post-it-notes",".pwz":"application/vnd.ms-powerpoint",".py":"text/x-python",".pya":"audio/vnd.ms-playready.media.pya",".pyc":"application/x-python-code",".pyo":"application/x-python-code",".pyv":"video/vnd.ms-playready.media.pyv",".qam":"application/vnd.epson.quickanime",".qbo":"application/vnd.intu.qbo",".qfx":"application/vnd.intu.qfx",".qps":"application/vnd.publishare-delta-tree",".qt":"video/quicktime",".qwd":"application/vnd.quark.quarkxpress",".qwt":"application/vnd.quark.quarkxpress",".qxb":"application/vnd.quark.quarkxpress",".qxd":"application/vnd.quark.quarkxpress",".qxl":"application/vnd.quark.quarkxpress",".qxt":"application/vnd.quark.quarkxpress",".ra":"audio/x-pn-realaudio",".ram":"audio/x-pn-realaudio",".rar":"application/x-rar-compressed",".ras":"image/x-cmu-raster",".rcprofile":"application/vnd.ipunplugged.rcprofile",".rdf":"application/rdf+xml",".rdz":"application/vnd.data-vision.rdz",".rep":"application/vnd.businessobjects",".res":"application/x-dtbresource+xml",".rgb":"image/x-rgb",".rif":"application/reginfo+xml",".rl":"application/resource-lists+xml",".rlc":"image/vnd.fujixerox.edmics-rlc",".rld":"application/resource-lists-diff+xml",".rm":"application/vnd.rn-realmedia",".rmi":"audio/midi",".rmp":"audio/x-pn-realaudio-plugin",".rms":"application/vnd.jcp.javame.midlet-rms",".rnc":"application/relax-ng-compact-syntax",".roff":"text/troff",".rpm":"application/x-rpm",".rpss":"application/vnd.nokia.radio-presets",".rpst":"application/vnd.nokia.radio-preset",".rq":"application/sparql-query",".rs":"application/rls-services+xml",".rsd":"application/rsd+xml",".rss":"application/rss+xml",".rtf":"application/rtf",".rtx":"text/richtext",".s":"text/x-asm",".saf":"application/vnd.yamaha.smaf-audio",".sbml":"application/sbml+xml",".sc":"application/vnd.ibm.secure-container",".scd":"application/x-msschedule",".scm":"application/vnd.lotus-screencam",".scq":"application/scvp-cv-request",".scs":"application/scvp-cv-response",".scurl":"text/vnd.curl.scurl",".sda":"application/vnd.stardivision.draw",".sdc":"application/vnd.stardivision.calc",".sdd":"application/vnd.stardivision.impress",".sdkd":"application/vnd.solent.sdkm+xml",".sdkm":"application/vnd.solent.sdkm+xml",".sdp":"application/sdp",".sdw":"application/vnd.stardivision.writer",".see":"application/vnd.seemail",".seed":"application/vnd.fdsn.seed",".sema":"application/vnd.sema",".semd":"application/vnd.semd",".semf":"application/vnd.semf",".ser":"application/java-serialized-object",".setpay":"application/set-payment-initiation",".setreg":"application/set-registration-initiation",".sfd-hdstx":"application/vnd.hydrostatix.sof-data",".sfs":"application/vnd.spotfire.sfs",".sgl":"application/vnd.stardivision.writer-global",".sgm":"text/sgml",".sgml":"text/sgml",".sh":"application/x-sh",".shar":"application/x-shar",".shf":"application/shf+xml",".si":"text/vnd.wap.si",".sic":"application/vnd.wap.sic",".sig":"application/pgp-signature",".silo":"model/mesh",".sis":"application/vnd.symbian.install",".sisx":"application/vnd.symbian.install",".sit":"application/x-stuffit",".sitx":"application/x-stuffitx",".skd":"application/vnd.koan",".skm":"application/vnd.koan",".skp":"application/vnd.koan",".skt":"application/vnd.koan",".sl":"text/vnd.wap.sl",".slc":"application/vnd.wap.slc",".sldm":"application/vnd.ms-powerpoint.slide.macroenabled.12",".sldx":"application/vnd.openxmlformats-officedocument.presentationml.slide",".slt":"application/vnd.epson.salt",".smf":"application/vnd.stardivision.math",".smi":"application/smil+xml",".smil":"application/smil+xml",".snd":"audio/basic",".snf":"application/x-font-snf",".so":"application/octet-stream",".spc":"application/x-pkcs7-certificates",".spf":"application/vnd.yamaha.smaf-phrase",".spl":"application/x-futuresplash",".spot":"text/vnd.in3d.spot",".spp":"application/scvp-vp-response",".spq":"application/scvp-vp-request",".spx":"audio/ogg",".src":"application/x-wais-source",".srx":"application/sparql-results+xml",".sse":"application/vnd.kodak-descriptor",".ssf":"application/vnd.epson.ssf",".ssml":"application/ssml+xml",".stc":"application/vnd.sun.xml.calc.template",".std":"application/vnd.sun.xml.draw.template",".stf":"application/vnd.wt.stf",".sti":"application/vnd.sun.xml.impress.template",".stk":"application/hyperstudio",".stl":"application/vnd.ms-pki.stl",".str":"application/vnd.pg.format",".stw":"application/vnd.sun.xml.writer.template",".sus":"application/vnd.sus-calendar",".susp":"application/vnd.sus-calendar",".sv4cpio":"application/x-sv4cpio",".sv4crc":"application/x-sv4crc",".svd":"application/vnd.svd",".svg":"image/svg+xml",".svgz":"image/svg+xml",".swa":"application/x-director",".swf":"application/x-shockwave-flash",".swi":"application/vnd.arastra.swi",".sxc":"application/vnd.sun.xml.calc",".sxd":"application/vnd.sun.xml.draw",".sxg":"application/vnd.sun.xml.writer.global",".sxi":"application/vnd.sun.xml.impress",".sxm":"application/vnd.sun.xml.math",".sxw":"application/vnd.sun.xml.writer",".t":"text/troff",".tao":"application/vnd.tao.intent-module-archive",".tar":"application/x-tar",".tcap":"application/vnd.3gpp2.tcap",".tcl":"application/x-tcl",".teacher":"application/vnd.smart.teacher",".tex":"application/x-tex",".texi":"application/x-texinfo",".texinfo":"application/x-texinfo",".text":"text/plain",".tfm":"application/x-tex-tfm",".tgz":"application/x-gzip",".tif":"image/tiff",".tiff":"image/tiff",".tmo":"application/vnd.tmobile-livetv",".torrent":"application/x-bittorrent",".tpl":"application/vnd.groove-tool-template",".tpt":"application/vnd.trid.tpt",".tr":"text/troff",".tra":"application/vnd.trueapp",".trm":"application/x-msterminal",".tsv":"text/tab-separated-values",".ttc":"application/x-font-ttf",".ttf":"application/x-font-ttf",".twd":"application/vnd.simtech-mindmapper",".twds":"application/vnd.simtech-mindmapper",".txd":"application/vnd.genomatix.tuxedo",".txf":"application/vnd.mobius.txf",".txt":"text/plain",".u32":"application/x-authorware-bin",".udeb":"application/x-debian-package",".ufd":"application/vnd.ufdl",".ufdl":"application/vnd.ufdl",".umj":"application/vnd.umajin",".unityweb":"application/vnd.unity",".uoml":"application/vnd.uoml+xml",".uri":"text/uri-list",".uris":"text/uri-list",".urls":"text/uri-list",".ustar":"application/x-ustar",".utz":"application/vnd.uiq.theme",".uu":"text/x-uuencode",".vcd":"application/x-cdlink",".vcf":"text/x-vcard",".vcg":"application/vnd.groove-vcard",".vcs":"text/x-vcalendar",".vcx":"application/vnd.vcx",".vis":"application/vnd.visionary",".viv":"video/vnd.vivo",".vor":"application/vnd.stardivision.writer",".vox":"application/x-authorware-bin",".vrml":"model/vrml",".vsd":"application/vnd.visio",".vsf":"application/vnd.vsf",".vss":"application/vnd.visio",".vst":"application/vnd.visio",".vsw":"application/vnd.visio",".vtu":"model/vnd.vtu",".vxml":"application/voicexml+xml",".w3d":"application/x-director",".webm":"video/webm",".wad":"application/x-doom",".wav":"audio/x-wav",".wax":"audio/x-ms-wax",".wbmp":"image/vnd.wap.wbmp",".wbs":"application/vnd.criticaltools.wbs+xml",".wbxml":"application/vnd.wap.wbxml",".wcm":"application/vnd.ms-works",".wdb":"application/vnd.ms-works",".wiz":"application/msword",".wks":"application/vnd.ms-works",".wm":"video/x-ms-wm",".wma":"audio/x-ms-wma",".wmd":"application/x-ms-wmd",".wmf":"application/x-msmetafile",".wml":"text/vnd.wap.wml",".wmlc":"application/vnd.wap.wmlc",".wmls":"text/vnd.wap.wmlscript",".wmlsc":"application/vnd.wap.wmlscriptc",".wmv":"video/x-ms-wmv",".wmx":"video/x-ms-wmx",".wmz":"application/x-ms-wmz",".wpd":"application/vnd.wordperfect",".wpl":"application/vnd.ms-wpl",".wps":"application/vnd.ms-works",".wqd":"application/vnd.wqd",".wri":"application/x-mswrite",".wrl":"model/vrml",".wsdl":"application/wsdl+xml",".wspolicy":"application/wspolicy+xml",".wtb":"application/vnd.webturbo",".wvx":"video/x-ms-wvx",".x32":"application/x-authorware-bin",".x3d":"application/vnd.hzn-3d-crossword",".xap":"application/x-silverlight-app",".xar":"application/vnd.xara",".xbap":"application/x-ms-xbap",".xbd":"application/vnd.fujixerox.docuworks.binder",".xbm":"image/x-xbitmap",".xdm":"application/vnd.syncml.dm+xml",".xdp":"application/vnd.adobe.xdp+xml",".xdw":"application/vnd.fujixerox.docuworks",".xenc":"application/xenc+xml",".xer":"application/patch-ops-error+xml",".xfdf":"application/vnd.adobe.xfdf",".xfdl":"application/vnd.xfdl",".xht":"application/xhtml+xml",".xhtml":"application/xhtml+xml",".xhvml":"application/xv+xml",".xif":"image/vnd.xiff",".xla":"application/vnd.ms-excel",".xlam":"application/vnd.ms-excel.addin.macroenabled.12",".xlb":"application/vnd.ms-excel",".xlc":"application/vnd.ms-excel",".xlm":"application/vnd.ms-excel",".xls":"application/vnd.ms-excel",".xlsb":"application/vnd.ms-excel.sheet.binary.macroenabled.12",".xlsm":"application/vnd.ms-excel.sheet.macroenabled.12",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".xlt":"application/vnd.ms-excel",".xltm":"application/vnd.ms-excel.template.macroenabled.12",".xltx":"application/vnd.openxmlformats-officedocument.spreadsheetml.template",".xlw":"application/vnd.ms-excel",".xml":"application/xml",".xo":"application/vnd.olpc-sugar",".xop":"application/xop+xml",".xpdl":"application/xml",".xpi":"application/x-xpinstall",".xpm":"image/x-xpixmap",".xpr":"application/vnd.is-xpr",".xps":"application/vnd.ms-xpsdocument",".xpw":"application/vnd.intercon.formnet",".xpx":"application/vnd.intercon.formnet",".xsl":"application/xml",".xslt":"application/xslt+xml",".xsm":"application/vnd.syncml+xml",".xspf":"application/xspf+xml",".xul":"application/vnd.mozilla.xul+xml",".xvm":"application/xv+xml",".xvml":"application/xv+xml",".xwd":"image/x-xwindowdump",".xyz":"chemical/x-xyz",".zaz":"application/vnd.zzazz.deck+xml",".zip":"application/zip",".zir":"application/vnd.zul",".zirz":"application/vnd.zul",".zmm":"application/vnd.handheld-entertainment+xml"},vb=[".sh",".exe",".app",".bat",".cmd",".msi",".apk",".jar",".py",".js",".cron",".php",".asp"],l6=Object.keys(Om);import*as Ab from"zod";var u6=Ab.custom().refine(r=>r&&r.length>0).refine(r=>r&&r[0]instanceof File,{message:"Please upload a valid file."});import{z as Pn}from"zod";var p6=Pn.object({id:Pn.string(),name:Pn.string(),createdAt:Pn.coerce.date(),createdBy:Pn.string(),updatedAt:Pn.coerce.date(),updatedBy:Pn.string().nullable(),organizationId:Pn.string()});import{z as L}from"zod";import In from"zod";var gi=In.object({platformSep:In.string(),fullPathSegments:In.string().array(),relativePathSegments:In.string().array(),relativePath:In.string().describe("path relative to the root test directory, i.e. my-folder/my-test.yaml"),fileName:In.string().describe("base name of the file including the extension, e.g. my-module.module.yaml"),lastModified:In.coerce.date(),createdAt:In.coerce.date()});var BL=L.array(gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),labels:L.string().array().optional()})),zL=gi.extend({id:L.string(),name:L.string(),description:L.string().optional(),content:qd}),HL=L.array(zL),R6=L.object({tests:BL,modules:HL,labels:L.string().array()}),x6=Il.merge(di),M6=L.object({schemaVersion:L.string(),stepLists:ro}),_6=di.partial().merge(Tr.pick({id:!0})),GL={name:L.string().min(1).max(255).describe("1-255 chars; Only letters/numbers/dashes. Cannot start/end with '-'. Not '.yaml', 'none', or UUID."),description:L.string().optional(),baseUrl:L.string().url().optional().describe("For LLM: Ask the user for the base URL if they don't provide it."),environment:L.string().optional().describe("For LLM: Do not include the variable unless the user explicitly asks for it and use the environment lookup tool to get the correct one before passing here."),browserType:L.nativeEnum(kr).optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),viewport:hl.optional().describe("For LLM: Never assign this variable unless the user explicitly asks for it."),pathSegments:L.string().array().optional().describe("For LLM: Only use if explicitly called for by the user. Used to create the test in the correct folder.")},P6=L.object(GL),I6=Il.merge(L.object({relativeFilePath:L.string().describe("relative to project root")})),O6=L.object({name:L.string()}),L6=L.object({relativeFilePath:L.string()}),N6=L.object({name:L.string()}),D6=L.object({relativeFilePath:L.string()}),k6=L.object({name:L.string(),description:L.string(),enabled:L.boolean(),steps:L.lazy(()=>ut.array()),testFilePath:L.string().describe("relative to the project root"),folderPath:L.string().optional().describe("user selected folder path")}),U6=L.object({name:L.string(),description:L.string(),enabled:L.boolean()}).partial();var F6=L.array(oy),B6=L.object({defaultEnv:L.string().optional().describe("name of the default env, or undefined to unset")}),z6=L.object({configFilePath:L.string().describe("full path on disk")}),H6=L.string().array(),G6=L.object({message:L.string(),newRelativeTestPath:L.string().optional()}),Lm=L.object({name:L.string(),absolutePath:L.string(),relativePath:L.string(),pathSegments:L.array(L.string()),isDirectory:L.boolean(),size:L.number(),createdAt:L.coerce.date(),modifiedAt:L.coerce.date(),accessedAt:L.coerce.date()}),wb=L.object({pathSegments:L.array(L.string())}),V6=L.object({absolutePath:L.string(),pathSegments:L.array(L.string()),contents:L.array(Lm)}),Cb=L.object({pathSegments:L.array(L.string())}),Rb=L.object({pathSegments:L.array(L.string()),newPathSegments:L.array(L.string())}),xb=L.object({pathSegments:L.array(L.string()),recursive:L.boolean().optional()}),W6=L.object({success:L.boolean(),message:L.string(),pathSegments:L.array(L.string()).optional()}),j6=L.object({gitBranch:L.string(),fileMtime:L.coerce.date(),gitCommitSha:L.string()});var Gl=["node_modules","dist","bin",".git",".npm",".next","out",".yarn","__pycache__","build",".env",".venv","venv","env","wheels"],Vl=Gl.map(r=>`**/${r}/**`),Mb=!0,wr=!1;import Br from"chalk";import VL from"safe-stable-stringify";import WL from"truncate-json";import jL from"zod";var go=VL.configure({deterministic:!1});function _b(r){let e=go(r),{jsonString:t}=WL(e,5e4);return t}var $L=["app","version","env","namespace","host"];function be(r){let e=r.bindings()??{},t={};for(let n of Object.keys(e)){let o=e[n];!$L.includes(n)&&typeof o=="string"&&(t[n]=o)}return t}var jl=jL.enum(["debug","info","warn","error"]);var Ha={debug:20,info:30,warn:40,error:50},Pb={20:"debug",30:"info",40:"warn",50:"error"},Nm=class r{minLogLevel;logBindings;constructor(e,t){typeof e=="string"?this.minLogLevel=Ha[e]:this.minLogLevel=e,this.logBindings=t}logWithLevel(e,t,...n){try{this.logWithLevelHelper(e,t,...n)}catch(o){console.error(`Failed to log to console: ${o}`)}}indentMultiline(e,t=" "){return e.split(`
20
20
  `).map((n,o)=>o>0?`${t}${n}`:n).join(`
21
- `)}logWithLevelHelper(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(t(` ${s}:`,l)),console.log(t(" stack:",c.stack));let d=Object.entries(c).filter(([m])=>m!=="message"&&m!=="stack");for(let[m,g]of d){if(g instanceof Error){console.log(t(` ${s}.${m}:`,g.message)),g.stack&&console.log(t(` ${s}.${m}.stack:`,g.stack));continue}if(typeof g=="object"&&g!==null){let p=this.indentMultiline(go(g,void 0,2)," ");console.log(t(` ${s}.${m}:`,p));continue}console.log(t(` ${s}.${m}:`,g))}}else typeof c=="object"?(l=go(c,void 0,2),l=this.indentMultiline(l),console.log(t(` ${s}:`,l))):console.log(t(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=go(a,void 0,2),s=s.split(`
21
+ `)}logWithLevelHelper(e,t,...n){if(e<this.minLogLevel)return;let o;Array.isArray(n[0])?(o=n[0],n=n.slice(1)):typeof n[0]=="object"&&!(n[0]instanceof Error)&&Object.entries(n[0]).length&&(o={...n[0],...this.logBindings},n=n.slice(1));let i=[];if(i.push(...n),console.log(t(...i)),o&&!Array.isArray(o)){let a=Object.entries(o);for(let[s,c]of a){let l=c;if(c instanceof Error){l=c.message,console.log(t(` ${s}:`,l)),console.log(t(" stack:",c.stack));let d=Object.entries(c).filter(([m])=>m!=="message"&&m!=="stack");for(let[m,p]of d){if(p instanceof Error){console.log(t(` ${s}.${m}:`,p.message)),p.stack&&console.log(t(` ${s}.${m}.stack:`,p.stack));continue}if(typeof p=="object"&&p!==null){let g=this.indentMultiline(go(p,void 0,2)," ");console.log(t(` ${s}.${m}:`,g));continue}console.log(t(` ${s}.${m}:`,p))}}else typeof c=="object"?(l=go(c,void 0,2),l=this.indentMultiline(l),console.log(t(` ${s}:`,l))):console.log(t(` ${s}:`,l))}}else if(o)for(let a of o){let s=a;typeof a=="object"&&(s=go(a,void 0,2),s=s.split(`
22
22
  `).map((c,l)=>l>0?` ${c}`:c).join(`
23
- `)),console.log(" ",t(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=za[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Fr.reset,...e)}info(...e){this.logWithLevel(30,Fr.white,...e)}debug(...e){this.logWithLevel(20,Fr.dim,...e)}warn(...e){this.logWithLevel(40,Fr.yellow,...e)}error(...e){this.logWithLevel(50,Fr.red,...e)}success(...e){this.logWithLevel(1/0,Fr.green,...e)}dimmed(...e){this.logWithLevel(30,Fr.dim,...e)}underline(...e){this.logWithLevel(40,Fr.underline,...e)}bold(...e){this.logWithLevel(40,Fr.bold,...e)}grey(...e){this.logWithLevel(20,Fr.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},Nm=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},k6=new Nm,zL=typeof window>"u"&&typeof process<"u"&&Vl.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?Vl.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,C=new Lm(zL,{}),On={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>On,flush:async()=>{},bindings:()=>({})},Gl={},Wl=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let s=Gl[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Gl[e]=s),s.totalCount++,s.count<t&&(s.count++,r.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=Gl[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete Gl[e]},n)};import{z as ie}from"zod";var HL=ie.array(gi.extend({id:ie.string(),name:ie.string(),description:ie.string().optional(),labels:ie.string().array().optional()})),GL=ie.array(gi.extend({id:ie.string(),name:ie.string(),description:ie.string().optional(),content:Cm})),Rb=ie.object({name:ie.string(),description:ie.string().optional(),settings:Ba.optional(),pathSegments:ie.string().array(),defaultEnv:ie.string().optional()}),H6=ie.object({id:ie.string(),fileName:ie.string(),fullPath:ie.string(),relativeFilePath:ie.string().describe("relative to project root")});var xb=ie.object({steps:pi.array().optional(),settings:Ba.optional()}),G6=ie.object({message:ie.literal("ok")}),Mb=ie.object({tag:ie.string(),channel:ie.string(),filePath:ie.string()}),V6=ie.object({tests:HL,modules:GL,labels:ie.string().array()}),_b=ie.object({name:ie.string(),description:ie.string(),enabled:ie.boolean()}).partial(),Pb=ie.object({name:ie.string(),description:ie.string(),enabled:ie.boolean(),steps:pi.array(),testFilePath:ie.string().describe("relative to the project root"),folderPath:ie.string().optional().describe("user selected folder path")}),W6=ie.object({packages:ie.string().array()});import{z as et}from"zod";var Ib=et.object({id:et.string(),createdAt:et.coerce.date(),createdBy:et.string(),organizationId:et.string(),name:et.string(),description:et.string().nullish(),enabled:et.boolean(),schemaVersion:et.string().describe("Schema version for steps"),parameters:et.string().array().nullish().describe("Parameter list"),parameterEnums:et.record(et.string(),et.string().array()).nullish(),defaultParameters:et.record(et.string(),et.string()).nullish(),defaultCacheKey:et.string().nullish(),defaultCacheTtl:et.number().nullish(),defaultCacheAllInvocations:et.boolean().nullish(),autoAuth:et.boolean().nullish(),advanced:Wd.nullish()}),Z6=Ib.extend({steps:et.lazy(()=>Ut.array())}),e9=5*60*1e3,VL=nr.merge(Ib.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as n9}from"date-fns-tz";import{z as Pe}from"zod";var Dm=wa.extend({aiAction:Pe.boolean().optional(),stepLintSuggestions:Pe.boolean().optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional(),aiFailureAnalysis:Pe.boolean().optional(),aiPageFiltering:Pe.boolean().optional().describe("rag v2 feature flag")}),WL=Pe.object({cliOnly:Pe.boolean().optional()}),km=Pe.object({fakerConstantSeed:Pe.boolean().optional()}),c9=Pe.object({ai:Dm.optional(),githubAppInstallationId:Pe.number().nullish(),githubAppSummaryMessageEnabled:Pe.boolean().nullish(),githubReleaseAppInstallationId:Pe.number().nullish(),gitlabAppAccessToken:Pe.string().nullish(),gitlabAppBaseUrl:Pe.string().nullish(),qaseAccessToken:Pe.string().nullish(),testSuggestionsEnabled:Pe.boolean().nullish(),browser:Xd.optional(),internal:WL.optional(),advanced:km.optional()}),u9=Pe.object({globalOverrides:Pe.record(Pe.string()).optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional()}),d9=Pe.record(Pe.string(),Pe.string()).nullish();import*as y from"zod";import{z as Xe}from"zod";var Um=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(Um||{});var jL=Xe.object({type:Xe.literal("DESCRIPTION_UPDATE"),thoughts:Xe.string()}),jl=Xe.discriminatedUnion("type",[jL]),$L=Xe.object({testId:Xe.string(),name:Xe.string(),orgId:Xe.string(),runId:Xe.string(),steps:ct.array(),purpose:Xe.nativeEnum(Um),details:jl.or(jl.array()).optional()});var h9=$L.pick({name:!0,orgId:!0}),qL=Xe.object({id:Xe.string(),name:Xe.string().nullish(),createdAt:Xe.string().pipe(Xe.coerce.date()).or(Xe.date()),organizationId:Xe.string(),schemaVersion:Xe.string(),runId:Xe.string().nullish(),purpose:Xe.nativeEnum(Um),details:jl.or(jl.array()).optional(),applied:Xe.boolean().nullish(),appliedAt:Xe.coerce.date().nullish()}),Ob=qL.extend({steps:ct.array()});var $l="x-momentic-cli-version",Lb="x-momentic-client-mode",Nb="x-momentic-cli-type",Db="x-momentic-logger-tags",KL="x-momentic-main-branch-name",YL="x-momentic-branch-name",XL="x-momentic-commit-timestamp",JL="x-momentic-last-commit-on-main",QL="x-momentic-last-commit-on-main-timestamp",ZL="x-momentic-merged-branch-name",kb="x-momentic-session-id",N9=y.object({error:y.boolean(),reason:y.string(),message:y.string()}),D9=ut.merge(im),Ub=Zs,k9=ut.merge(im);var U9=ut.merge(yy).extend({useConsensus:y.boolean().optional(),attemptNumber:y.number().optional()}),Fm=af,F9=ut.merge(Ey),Fb=FS,B9=ut.merge(Ty),Bb=BS,z9=ut.merge(vy),zb=zS,H9=ut.merge(by),Hb=US,G9=ut.merge(hy),Gb=DS,V9=ut.merge(fy),Vb=LS,W9=ut.merge(Sy);var j9=ut.merge(Ry),$9=ut.merge(xy),q9=y.object({testPaths:y.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:y.string().optional(),all:y.boolean().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional(),testInputMatrix:y.record(y.string(),y.string()).array().optional()}),Wb=y.object({queuedTests:y.unknown().array(),runIds:y.string().uuid().array(),runGroupId:y.string().optional()});var K9=y.string().array(),Y9=y.union([y.object({paths:y.string().array().describe("run specific test paths (e.g. todo-test)"),all:y.boolean().describe("run all tests").optional()}),y.object({path:y.string().describe("deprecated; present for backcompat")})]),jb=y.object({tests:y.record(y.string().describe("Test name"),y.string().describe("Test YAML")),modules:y.record(y.string().describe("Module name"),y.string().describe("Module YAML"))}),eN=y.object({test:y.string().describe("test YAML"),modules:y.record(y.string().describe("moduleId"),y.string().describe("module YAML"))}),X9=eN.array(),J9=y.object({testId:y.string(),schemaVersion:y.string()}).merge(no);function Bm(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[KL]=encodeURIComponent(e)),t&&(a[YL]=encodeURIComponent(t)),n&&(a[XL]=n.toISOString()),o&&(a[JL]=encodeURIComponent(o)),i&&(a[QL]=i.toISOString()),r.mergedGitBranchName&&(a[ZL]=encodeURIComponent(r.mergedGitBranchName)),a}var Q9=y.object({entries:y.array(Df),testId:y.string()}),Z9=y.object({entries:y.array(Xy),testId:y.string()}),eQ=y.object({testId:y.string()});function $b(r){return y.record(y.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var qb=$b(kf),Kb=$b(Jy),Yb=y.object({trigger:y.nativeEnum(ar),status:y.nativeEnum(xe),startedAt:y.coerce.date().optional(),gitCommitSha:y.string().optional(),gitCommitShaShort:y.string().optional(),gitCommitTimestamp:y.coerce.date().optional(),gitBranchName:y.string().optional(),gitOriginUrl:y.string().optional(),gitCommitMessage:y.string().optional(),gitCommitAuthorName:y.string().optional(),githubRepository:y.string().optional(),gitlabProjectPath:y.string().optional(),pipelineId:y.string().optional(),cliVersion:y.string().optional()}),tQ=y.object({id:y.string()}),Xb=y.object({status:y.nativeEnum(xe),updatedAt:y.coerce.date().optional(),finishedAt:y.coerce.date().optional()}),Jb=y.object({stepsSnapshot:y.array(y.record(y.unknown())).optional(),runGroupId:y.string().optional(),testId:y.string(),testName:y.string(),resolvedBaseUrl:y.string().optional(),environmentName:y.string().optional(),labels:y.array(y.string()).optional(),cliVersion:y.string().optional(),trigger:y.nativeEnum(ar),schemaVersion:y.string().optional(),section:y.nativeEnum(El).optional(),resolvedInputs:y.record(y.string(),y.string()).optional(),quarantined:y.boolean().optional().default(!1),quarantinedReason:y.string().optional()}),rQ=y.object({id:y.string()}),tN=nm.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),Qb=tN.array(),Zb=nm.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),nQ=y.object({id:y.string()}),eE=y.object({status:y.nativeEnum(xe),finishedAt:y.coerce.date().optional(),schemaVersion:y.string().optional().default("1.0.19"),results:y.record(y.string(),y.unknown()).array().optional(),beforeResults:y.record(y.string(),y.unknown()).array().optional(),afterResults:y.record(y.string(),y.unknown()).array().optional()}),oQ=y.object({screenshot:y.string()}),tE=y.object({key:y.string()}),rE=y.object({orgId:y.string(),userId:y.string()}),nE=y.array(ZS),iQ=y.record(y.string(),y.union([y.string(),y.boolean()])),aQ=y.object({paths:y.string().array(),env:y.string().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional()}),oE=y.object({suiteRunIds:y.string().array(),runGroupIds:y.string().array()}),sQ=y.object({suiteRunIds:y.string().array()}),lQ=dy.array(),cQ=y.object({runGroupIds:y.string().array()}),rN=y.object({uploadUrl:y.string()}),uQ=ut.merge(Ay),dQ=ut.merge(Cy),mQ=ut.merge(wy),nN=y.object({testId:y.string().optional().default(""),testName:y.string().optional().default(""),suiteId:y.string().optional().default(""),suiteName:y.string().optional().default(""),creditsUsed:y.number().optional()}),oN=y.object({transactionId:y.string(),timestamp:y.string(),event:y.nativeEnum(_a),properties:nN}),pQ=oN.array(),iE=Ob.omit({steps:!0}).extend({steps:y.array(y.record(y.string(),y.unknown())).describe("unparsed ResolvedStep[]")}),gQ=y.object({limit:y.number().max(10).optional(),afterTime:y.number().optional()}),aE=ly.array(),hQ=y.object({applied:y.boolean().optional(),appliedAt:y.coerce.date().optional()}),sE=rN.extend({id:y.string()}),fQ=y.object({runGroupId:y.string().uuid().optional()}),lE=y.object({runGroupId:y.string().uuid()}),cE=y.object({quarantined:y.object({testId:y.string().uuid(),quarantinedAt:y.coerce.date(),quarantinedBy:y.string().optional(),quarantinedReason:y.string()}).array()}),SQ=y.object({testId:y.string().uuid(),testName:y.string().optional(),reason:y.string(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),yQ=y.object({testName:y.string().optional(),reason:y.string().optional(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),bQ=ut.merge(Oy),EQ=ut.merge(Ly),TQ=y.object({apkToInstall:y.object({channel:y.string(),tag:y.string().optional()}).optional(),hostname:y.string().optional(),region:y.nativeEnum(Pl).optional(),osVersion:y.nativeEnum(Ia).optional(),sessionId:y.string().optional()}),uE=y.object({name:y.string(),webRtcUrl:y.string(),adbUrl:y.string(),token:y.string(),apkDownloadUrl:y.string().optional(),playwrightServerUrl:y.string().optional(),region:y.string().optional()}),vQ=y.object({channel:y.string(),tag:y.string(),md5:y.string()}),dE=y.object({id:y.string(),uploadUrl:y.string().optional(),downloadUrl:y.string(),md5:y.string().optional()}),mE=y.object({assets:y.array(y.object({channel:y.string(),tag:y.string(),md5:y.string(),createdAt:y.number().describe("Unix timestamp in milliseconds")}))});import{z as Q}from"zod";var pE=7,iN=3,CQ=Q.object({localTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()}).or(Q.object({cloudTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()})),gE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(gE||{});var zm=Q.object({name:Q.string(),description:Q.string().nullish(),effect:Q.nativeEnum(gE),labels:Q.array(Q.string()).nullish(),githubRepository:Q.string().nullish(),gitlabProjectPath:Q.string().nullish(),gitBranchName:Q.string().nullish(),slackNotificationChannel:Q.string().nullish()}),aN=Q.object({type:Q.literal("LAST_N_RUNS"),lastN:Q.number().min(iN)}),sN=Q.object({type:Q.literal("LAST_N_HOURS"),lastN:Q.number().min(1).max(pE*24)}),lN=Q.object({type:Q.literal("LAST_N_DAYS"),lastN:Q.number().min(1).max(pE)}),Hm=Q.discriminatedUnion("type",[aN,sN,lN]),cN=Q.object({flakeRateThreshold:Q.number().min(1).max(100),evaluationWindow:Hm}),uN=zm.extend({type:Q.literal("FLAKE_RATE"),config:cN}),dN=Q.object({passRateThreshold:Q.number().min(1).max(100),evaluationWindow:Hm}),mN=zm.extend({type:Q.literal("PASS_RATE"),config:dN}),pN=Q.object({failureCountThreshold:Q.number().min(0),evaluationWindow:Hm}),gN=zm.extend({type:Q.literal("FAILURE_COUNT"),config:pN}),RQ=Q.discriminatedUnion("type",[uN,mN,gN]);import{z as tt}from"zod";var _Q=tt.object({repositoriesIndexed:tt.boolean(),indexingInProgress:tt.boolean(),indexesOutdated:tt.boolean()}),hE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(hE||{}),fE=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(fE||{}),PQ=tt.object({name:tt.string(),status:tt.nativeEnum(hE),conclusion:tt.nativeEnum(fE).nullable()}),Ha=tt.object({sha:tt.string(),message:tt.string(),author:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()}),committer:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()})}),Gm=tt.object({mergedBranch:tt.string().optional()});import{z as Ge}from"zod";var SE=Ge.object({orgId:Ge.string(),cacheKeys:Ge.string().array()}),LQ=Ge.object({keyParams:SE,clientMetadata:Ge.string(),lockAcquisitionTimeoutMs:Ge.number().optional()}),yE=Ge.object({acquired:Ge.boolean(),acquiredByMetadata:Ge.string(),keyPrefix:Ge.string()}),NQ=Ge.object({keyPrefix:Ge.string(),result:Ge.string(),ttlMs:Ge.number()}),DQ=Ge.union([Ge.object({keyPrefix:Ge.string()}),SE]),hN=Ge.object({remainingTtlMs:Ge.number(),value:Ge.string().nullish()}),kQ=Ge.object({results:Ge.record(Ge.string(),hN),activeLocks:Ge.string().array()});var UQ=5*60*1e3;var HQ=90*24*60*60*1e3,GQ=7*24*60*60*1e3;import{z as bE}from"zod";var jQ=bE.object({quarantineNotifications:bE.string().nullish()});import{z as bt}from"zod";var fN=bt.object({version:bt.string(),json:bt.record(bt.unknown()),hash:bt.string()}),EE=bt.record(bt.unknown()),YQ=bt.object({newSvgs:bt.array(fN),metadata:EE.optional()}),SN=bt.object({version:bt.string(),json:bt.record(bt.unknown()).nullish(),hash:bt.string(),description:bt.string().nullish(),metadata:EE.nullish()}),TE=bt.record(bt.string().describe("icon hash"),SN);import{z as je}from"zod";var Vm=je.object({assertion:je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),yN=je.object({instruction:je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Vm.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),vE=yN.extend({subSteps:je.lazy(()=>vE.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),AE=je.object({name:je.string().describe("Short name describing the test plan"),description:je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),wE=AE.extend({id:je.string(),createdAt:je.coerce.date(),updatedAt:je.coerce.date(),updatedBy:je.string(),createdBy:je.string(),test:je.object({id:je.string(),name:je.string()}).nullish().transform(r=>r??void 0)}),ZQ=wE.extend({testGenRuns:je.tuple([]).or(je.tuple([je.object({id:je.string(),startedAt:je.coerce.date(),status:je.nativeEnum(xe)})]))}),CE=je.object({preConditions:Vm.array().nullish().transform(r=>r??[]),postConditions:Vm.array().nullish().transform(r=>r??[]),steps:vE.array().nullish().transform(r=>r??[])}),eZ=wE.extend({plan:CE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),bN=AE.extend({plan:CE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),tZ=bN.array().nullish().transform(r=>r??[]);import{validator as EN}from"@exodus/schemasafe";function RE(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{EN(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var xE=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};var ql=class{async prepareGoldenScreenshotForComparison(e,t,n){return n}};import{z as yZ}from"zod";var Kl=class{async resolveEntries(){}async saveEntries(){}};import{z as Wm}from"zod";var ME=Wm.object({parentStepIdChain:Wm.array(Wm.string()),result:zt});import{z as K}from"zod";var Ga="assets",TN=K.object({step:ct,status:K.nativeEnum(Ke),startedAt:K.coerce.date(),finishedAt:K.coerce.date().optional(),healMetadata:K.object({healType:K.nativeEnum(va).or(K.literal("AI")),healedAt:K.coerce.date()}).optional(),beforeSnapshotId:K.string().uuid().optional(),afterSnapshotId:K.string().uuid().optional(),message:K.string().optional()}),vN=TN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),kZ=vN.extend({step:K.unknown()}),jm=K.object({avdId:K.string().optional(),channel:K.string().optional(),tag:K.string().optional()}),_E="1.0.0",$m=eE.extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),runAttemptSchemaVersion:K.string().optional(),schemaVersion:K.string().optional().default("1.0.19"),results:K.record(K.string(),K.unknown()).array().optional(),beforeResults:K.record(K.string(),K.unknown()).array().optional(),afterResults:K.record(K.string(),K.unknown()).array().optional(),assetDetails:jm.optional(),activeVideos:K.array(K.object({videoName:K.string(),timestamp:K.coerce.date()})).optional()}),PE=$m.extend({assetDetails:jm.optional(),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),UZ=$m.merge(Aa),FZ=PE.merge(Aa),IE=K.object({results:K.array(zt),beforeResults:K.array(zt).optional(),afterResults:K.array(zt).optional()}),BZ=$m.merge(IE),zZ=PE.merge(IE),OE=Zb.merge(Jb).extend({executionType:K.nativeEnum(oi).optional().default("WEB"),testId:K.string().uuid(),testDescription:K.string().optional(),runGroupId:K.string().uuid(),status:K.nativeEnum(xe),startedAt:K.coerce.date(),attempts:K.number(),failureRecoveryDetails:K.object({attempts:K.number()}).optional()}),AN=OE.merge(jm),HZ=OE.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),GZ=AN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),wN=Yb.merge(Xb).extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),cliVersion:K.string(),labels:K.string().array().optional().default([])}),Yl=wN.extend({updatedAt:K.coerce.date().optional().transform(r=>r??new Date),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)});import{confirm as CN,input as RN}from"@inquirer/prompts";import{existsSync as hee,mkdirSync as fee,statSync as xN}from"fs";var ho=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var MN=!1,LE=(()=>{try{return xN("/.dockerenv"),!0}catch{return!1}})();async function Xl(r){return ho||MN||LE?!0:(await C.flush(),await new Promise(t=>setTimeout(t,100)),await CN({message:r}))}async function NE(r,e){return ho||LE?e:(await RN({message:r,default:e})).trim()||e}import Si,{supportsColor as BN}from"chalk";import{Console as DE}from"console";import{format as Va}from"util";var qm=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},Jl=class r extends DE{_buffer=[];_groupDepth=0;Console=DE;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new qm(void 0,r.write).stack;if(!i)return e;let a=i.split(`
23
+ `)),console.log(" ",t(s))}}setMinLevel(e){typeof e=="string"?this.minLogLevel=Ha[e]:this.minLogLevel=e}log(...e){this.logWithLevel(30,Br.reset,...e)}info(...e){this.logWithLevel(30,Br.white,...e)}debug(...e){this.logWithLevel(20,Br.dim,...e)}warn(...e){this.logWithLevel(40,Br.yellow,...e)}error(...e){this.logWithLevel(50,Br.red,...e)}success(...e){this.logWithLevel(1/0,Br.green,...e)}dimmed(...e){this.logWithLevel(30,Br.dim,...e)}underline(...e){this.logWithLevel(40,Br.underline,...e)}bold(...e){this.logWithLevel(40,Br.bold,...e)}grey(...e){this.logWithLevel(20,Br.grey,...e)}child(e){return new r(this.minLogLevel,{...this.logBindings,...e})}async flush(){}bindings(){return this.logBindings}},Dm=class{debug(){}info(){}warn(){}error(){}success(){}dimmed(){}underline(){}bold(){}grey(){}child(){return this}async flush(){}bindings(){return{}}},Z6=new Dm,qL=typeof window>"u"&&typeof process<"u"&&jl.safeParse(process?.env?.MOMENTIC_DEV_LOG_LEVEL).success?jl.parse(process.env.MOMENTIC_DEV_LOG_LEVEL):30,w=new Nm(qL,{}),On={info:()=>{},error:()=>{},debug:()=>{},warn:()=>{},child:()=>On,flush:async()=>{},bindings:()=>({})},Wl={},$l=({logger:r,logKey:e,maxCount:t,intervalMs:n},o,i,...a)=>{let s=Wl[e];s?clearTimeout(s.timer):(s={count:0,totalCount:0},Wl[e]=s),s.totalCount++,s.count<t&&(s.count++,r.debug(o,i,...a)),s.timer=setTimeout(()=>{let c=Wl[e];c?.totalCount!==c?.count&&r.debug({logKey:e,totalCount:c?.totalCount,count:c?.count},`Debug logs were rate-limited for ${e}`),delete Wl[e]},n)};import{z as ae}from"zod";var KL=ae.array(gi.extend({id:ae.string(),name:ae.string(),description:ae.string().optional(),labels:ae.string().array().optional()})),YL=ae.array(gi.extend({id:ae.string(),name:ae.string(),description:ae.string().optional(),content:Tm})),Ib=ae.object({name:ae.string(),description:ae.string().optional(),settings:Ua.optional(),pathSegments:ae.string().array(),defaultEnv:ae.string().optional()}),o9=ae.object({id:ae.string(),fileName:ae.string(),fullPath:ae.string(),relativeFilePath:ae.string().describe("relative to project root")});var Ob=ae.object({steps:pi.array().optional(),settings:Ua.optional()}),i9=ae.object({message:ae.literal("ok")}),Lb=ae.object({tag:ae.string(),channel:ae.string(),filePath:ae.string()}),a9=ae.object({tests:KL,modules:YL,labels:ae.string().array()}),Nb=ae.object({name:ae.string(),description:ae.string(),enabled:ae.boolean()}).partial(),Db=ae.object({name:ae.string(),description:ae.string(),enabled:ae.boolean(),steps:pi.array(),testFilePath:ae.string().describe("relative to the project root"),folderPath:ae.string().optional().describe("user selected folder path")}),s9=ae.object({packages:ae.string().array()});import{z as et}from"zod";var kb=et.object({id:et.string(),createdAt:et.coerce.date(),createdBy:et.string(),organizationId:et.string(),name:et.string(),description:et.string().nullish(),enabled:et.boolean(),schemaVersion:et.string().describe("Schema version for steps"),parameters:et.string().array().nullish().describe("Parameter list"),parameterEnums:et.record(et.string(),et.string().array()).nullish(),defaultParameters:et.record(et.string(),et.string()).nullish(),defaultCacheKey:et.string().nullish(),defaultCacheTtl:et.number().nullish(),defaultCacheAllInvocations:et.boolean().nullish(),autoAuth:et.boolean().nullish(),advanced:$d.nullish()}),f9=kb.extend({steps:et.lazy(()=>Ut.array())}),S9=5*60*1e3,XL=nr.merge(kb.omit({id:!0,createdAt:!0,createdBy:!0,organizationId:!0,enabled:!0}));import{formatInTimeZone as E9}from"date-fns-tz";import{z as Pe}from"zod";var km=Aa.extend({aiAction:Pe.boolean().optional(),stepLintSuggestions:Pe.boolean().optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional(),aiFailureAnalysis:Pe.boolean().optional(),aiPageFiltering:Pe.boolean().optional().describe("rag v2 feature flag")}),JL=Pe.object({cliOnly:Pe.boolean().optional()}),Um=Pe.object({fakerConstantSeed:Pe.boolean().optional()}),R9=Pe.object({ai:km.optional(),githubAppInstallationId:Pe.number().nullish(),githubAppSummaryMessageEnabled:Pe.boolean().nullish(),githubReleaseAppInstallationId:Pe.number().nullish(),gitlabAppAccessToken:Pe.string().nullish(),gitlabAppBaseUrl:Pe.string().nullish(),qaseAccessToken:Pe.string().nullish(),testSuggestionsEnabled:Pe.boolean().nullish(),browser:Zd.optional(),internal:JL.optional(),advanced:Um.optional()}),x9=Pe.object({globalOverrides:Pe.record(Pe.string()).optional(),agentConfig:Pe.record(Pe.string(),Pe.string()).optional()}),M9=Pe.record(Pe.string(),Pe.string()).nullish();import*as y from"zod";import{z as Xe}from"zod";var Fm=(e=>(e.TEST_REVIEW="TEST_REVIEW",e))(Fm||{});var QL=Xe.object({type:Xe.literal("DESCRIPTION_UPDATE"),thoughts:Xe.string()}),ql=Xe.discriminatedUnion("type",[QL]),ZL=Xe.object({testId:Xe.string(),name:Xe.string(),orgId:Xe.string(),runId:Xe.string(),steps:ut.array(),purpose:Xe.nativeEnum(Fm),details:ql.or(ql.array()).optional()});var O9=ZL.pick({name:!0,orgId:!0}),eN=Xe.object({id:Xe.string(),name:Xe.string().nullish(),createdAt:Xe.string().pipe(Xe.coerce.date()).or(Xe.date()),organizationId:Xe.string(),schemaVersion:Xe.string(),runId:Xe.string().nullish(),purpose:Xe.nativeEnum(Fm),details:ql.or(ql.array()).optional(),applied:Xe.boolean().nullish(),appliedAt:Xe.coerce.date().nullish()}),Ub=eN.extend({steps:ut.array()});var Kl="x-momentic-cli-version",Fb="x-momentic-client-mode",Bb="x-momentic-cli-type",zb="x-momentic-logger-tags",tN="x-momentic-main-branch-name",rN="x-momentic-branch-name",nN="x-momentic-commit-timestamp",oN="x-momentic-last-commit-on-main",iN="x-momentic-last-commit-on-main-timestamp",aN="x-momentic-merged-branch-name",Hb="x-momentic-session-id",J9=y.object({error:y.boolean(),reason:y.string(),message:y.string()}),Q9=at.merge(sm),Gb=el,Z9=at.merge(sm);var eQ=at.merge(by).extend({useConsensus:y.boolean().optional(),attemptNumber:y.number().optional()}),Bm=sf,tQ=at.merge(Ty),Vb=BS,rQ=at.merge(vy),Wb=zS,nQ=at.merge(Ay),jb=HS,oQ=at.merge(Ey),$b=FS,iQ=at.merge(fy),qb=kS,aQ=at.merge(Sy),Kb=NS,sQ=at.merge(yy);var lQ=at.merge(xy),cQ=at.merge(My),uQ=y.object({testPaths:y.string().array().describe("can be either hyphenated, lowercase test names or UUIDs"),env:y.string().optional(),all:y.boolean().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional(),testInputMatrix:y.record(y.string(),y.string()).array().optional()}),Yb=y.object({queuedTests:y.unknown().array(),runIds:y.string().uuid().array(),runGroupId:y.string().optional()});var dQ=y.string().array(),mQ=y.union([y.object({paths:y.string().array().describe("run specific test paths (e.g. todo-test)"),all:y.boolean().describe("run all tests").optional()}),y.object({path:y.string().describe("deprecated; present for backcompat")})]),Xb=y.object({tests:y.record(y.string().describe("Test name"),y.string().describe("Test YAML")),modules:y.record(y.string().describe("Module name"),y.string().describe("Module YAML"))}),sN=y.object({test:y.string().describe("test YAML"),modules:y.record(y.string().describe("moduleId"),y.string().describe("module YAML"))}),pQ=sN.array(),gQ=y.object({testId:y.string(),schemaVersion:y.string()}).merge(no);function zm(r){let{gitMainBranch:e,gitBranchName:t,gitCommitTimestamp:n,lastCommitOnMainSha:o,lastCommitOnMainTimestamp:i}=r,a={};return e&&(a[tN]=encodeURIComponent(e)),t&&(a[rN]=encodeURIComponent(t)),n&&(a[nN]=n.toISOString()),o&&(a[oN]=encodeURIComponent(o)),i&&(a[iN]=i.toISOString()),r.mergedGitBranchName&&(a[aN]=encodeURIComponent(r.mergedGitBranchName)),a}var hQ=y.object({entries:y.array(kf),testId:y.string()}),fQ=y.object({entries:y.array(zy),testId:y.string()}),SQ=y.object({testId:y.string()});function Jb(r){return y.record(y.unknown()).transform(e=>{let t={};for(let[n,o]of Object.entries(e)){let i=r.safeParse(o);i.success&&(t[n]=i.data)}return t})}var Qb=Jb(Uf),Zb=Jb(Hy),eE=y.object({trigger:y.nativeEnum(ar),status:y.nativeEnum(xe),startedAt:y.coerce.date().optional(),gitCommitSha:y.string().optional(),gitCommitShaShort:y.string().optional(),gitCommitTimestamp:y.coerce.date().optional(),gitBranchName:y.string().optional(),gitOriginUrl:y.string().optional(),gitCommitMessage:y.string().optional(),gitCommitAuthorName:y.string().optional(),githubRepository:y.string().optional(),gitlabProjectPath:y.string().optional(),pipelineId:y.string().optional(),cliVersion:y.string().optional()}),yQ=y.object({id:y.string()}),tE=y.object({status:y.nativeEnum(xe),updatedAt:y.coerce.date().optional(),finishedAt:y.coerce.date().optional()}),rE=y.object({stepsSnapshot:y.array(y.record(y.unknown())).optional(),runGroupId:y.string().optional(),testId:y.string(),testName:y.string(),resolvedBaseUrl:y.string().optional(),environmentName:y.string().optional(),labels:y.array(y.string()).optional(),cliVersion:y.string().optional(),trigger:y.nativeEnum(ar),schemaVersion:y.string().optional(),section:y.nativeEnum(vl).optional(),resolvedInputs:y.record(y.string(),y.string()).optional(),quarantined:y.boolean().optional().default(!1),quarantinedReason:y.string().optional()}),bQ=y.object({id:y.string()}),lN=im.pick({id:!0,status:!0,testName:!0,testId:!0,test:!0,failureReason:!0,failureDetails:!0}),nE=lN.array(),oE=im.pick({startedAt:!0,finishedAt:!0,updatedAt:!0,results:!0,beforeResults:!0,afterResults:!0,status:!0,failureDetails:!0,failureReason:!0,resolvedBaseUrl:!0,environmentName:!0,labels:!0,cliVersion:!0,resolvedInputs:!0,attempts:!0,flake:!0}).partial(),EQ=y.object({id:y.string()}),iE=y.object({status:y.nativeEnum(xe),finishedAt:y.coerce.date().optional(),schemaVersion:y.string().optional().default("1.0.19"),results:y.record(y.string(),y.unknown()).array().optional(),beforeResults:y.record(y.string(),y.unknown()).array().optional(),afterResults:y.record(y.string(),y.unknown()).array().optional()}),TQ=y.object({screenshot:y.string()}),aE=y.object({key:y.string()}),sE=y.object({orgId:y.string(),userId:y.string()}),lE=y.array(ny),vQ=y.record(y.string(),y.union([y.string(),y.boolean()])),AQ=y.object({paths:y.string().array(),env:y.string().optional(),urlOverride:y.string().optional(),customHeaders:y.record(y.string(),y.string()).optional()}),cE=y.object({suiteRunIds:y.string().array(),runGroupIds:y.string().array()}),wQ=y.object({suiteRunIds:y.string().array()}),CQ=my.array(),RQ=y.object({runGroupIds:y.string().array()}),cN=y.object({uploadUrl:y.string()}),xQ=at.merge(wy),MQ=at.merge(Ry),_Q=at.merge(Cy),uN=y.object({testId:y.string().optional().default(""),testName:y.string().optional().default(""),suiteId:y.string().optional().default(""),suiteName:y.string().optional().default(""),creditsUsed:y.number().optional()}),dN=y.object({transactionId:y.string(),timestamp:y.string(),event:y.nativeEnum(za),properties:uN}),PQ=dN.array(),uE=Ub.omit({steps:!0}).extend({steps:y.array(y.record(y.string(),y.unknown())).describe("unparsed ResolvedStep[]")}),IQ=y.object({limit:y.number().max(10).optional(),afterTime:y.number().optional()}),dE=cy.array(),OQ=y.object({applied:y.boolean().optional(),appliedAt:y.coerce.date().optional()}),mE=cN.extend({id:y.string()}),LQ=y.object({runGroupId:y.string().uuid().optional()}),pE=y.object({runGroupId:y.string().uuid()}),gE=y.object({quarantined:y.object({testId:y.string().uuid(),quarantinedAt:y.coerce.date(),quarantinedBy:y.string().optional(),quarantinedReason:y.string()}).array()}),NQ=y.object({testId:y.string().uuid(),testName:y.string().optional(),reason:y.string(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),DQ=y.object({testName:y.string().optional(),reason:y.string().optional(),gitLocalUsername:y.string().optional(),gitLocalEmail:y.string().optional(),gitLocalName:y.string().optional()}),kQ=at.merge(tb),UQ=at.merge(rb),FQ=at.merge(ob),BQ=y.object({apkToInstall:y.object({channel:y.string(),tag:y.string().optional()}).optional(),hostname:y.string().optional(),region:y.nativeEnum(_l).optional(),osVersion:y.nativeEnum(_a).optional(),sessionId:y.string().optional()}),hE=y.object({name:y.string(),webRtcUrl:y.string(),adbUrl:y.string(),token:y.string(),apkDownloadUrl:y.string().optional(),playwrightServerUrl:y.string().optional(),region:y.string().optional()}),zQ=y.object({channel:y.string(),tag:y.string(),md5:y.string()}),fE=y.object({id:y.string(),uploadUrl:y.string().optional(),downloadUrl:y.string(),md5:y.string().optional()}),SE=y.object({assets:y.array(y.object({channel:y.string(),tag:y.string(),md5:y.string(),createdAt:y.number().describe("Unix timestamp in milliseconds")}))});import{z as Q}from"zod";var yE=7,mN=3,VQ=Q.object({localTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()}).or(Q.object({cloudTestId:Q.string(),quarantinedAt:Q.date(),quarantinedBy:Q.string().optional(),quarantinedReason:Q.string(),quarantinedByGitEmail:Q.string().optional(),quarantinedByGitName:Q.string().optional(),quarantinedByGitUsername:Q.string().optional()})),bE=(t=>(t.QUARANTINE="QUARANTINE",t.UNQUARANTINE="UNQUARANTINE",t))(bE||{});var Hm=Q.object({name:Q.string(),description:Q.string().nullish(),effect:Q.nativeEnum(bE),labels:Q.array(Q.string()).nullish(),githubRepository:Q.string().nullish(),gitlabProjectPath:Q.string().nullish(),gitBranchName:Q.string().nullish(),slackNotificationChannel:Q.string().nullish()}),pN=Q.object({type:Q.literal("LAST_N_RUNS"),lastN:Q.number().min(mN)}),gN=Q.object({type:Q.literal("LAST_N_HOURS"),lastN:Q.number().min(1).max(yE*24)}),hN=Q.object({type:Q.literal("LAST_N_DAYS"),lastN:Q.number().min(1).max(yE)}),Gm=Q.discriminatedUnion("type",[pN,gN,hN]),fN=Q.object({flakeRateThreshold:Q.number().min(1).max(100),evaluationWindow:Gm}),SN=Hm.extend({type:Q.literal("FLAKE_RATE"),config:fN}),yN=Q.object({passRateThreshold:Q.number().min(1).max(100),evaluationWindow:Gm}),bN=Hm.extend({type:Q.literal("PASS_RATE"),config:yN}),EN=Q.object({failureCountThreshold:Q.number().min(0),evaluationWindow:Gm}),TN=Hm.extend({type:Q.literal("FAILURE_COUNT"),config:EN}),WQ=Q.discriminatedUnion("type",[SN,bN,TN]);import{z as tt}from"zod";var qQ=tt.object({repositoriesIndexed:tt.boolean(),indexingInProgress:tt.boolean(),indexesOutdated:tt.boolean()}),EE=(a=>(a.Queued="queued",a.InProgress="in_progress",a.Completed="completed",a.Waiting="waiting",a.Requested="requested",a.Pending="pending",a))(EE||{}),TE=(s=>(s.Success="success",s.Failure="failure",s.Neutral="neutral",s.Cancelled="cancelled",s.Skipped="skipped",s.TimedOut="timed_out",s.ActionRequired="action_required",s))(TE||{}),KQ=tt.object({name:tt.string(),status:tt.nativeEnum(EE),conclusion:tt.nativeEnum(TE).nullable()}),Ga=tt.object({sha:tt.string(),message:tt.string(),author:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()}),committer:tt.object({name:tt.string().optional(),email:tt.string().optional(),date:tt.coerce.date().optional()})}),Vm=tt.object({mergedBranch:tt.string().optional()});import{z as Ge}from"zod";var vE=Ge.object({orgId:Ge.string(),cacheKeys:Ge.string().array()}),JQ=Ge.object({keyParams:vE,clientMetadata:Ge.string(),lockAcquisitionTimeoutMs:Ge.number().optional()}),AE=Ge.object({acquired:Ge.boolean(),acquiredByMetadata:Ge.string(),keyPrefix:Ge.string()}),QQ=Ge.object({keyPrefix:Ge.string(),result:Ge.string(),ttlMs:Ge.number()}),ZQ=Ge.union([Ge.object({keyPrefix:Ge.string()}),vE]),vN=Ge.object({remainingTtlMs:Ge.number(),value:Ge.string().nullish()}),eZ=Ge.object({results:Ge.record(Ge.string(),vN),activeLocks:Ge.string().array()});var tZ=5*60*1e3;var iZ=90*24*60*60*1e3,aZ=7*24*60*60*1e3;import{z as wE}from"zod";var cZ=wE.object({quarantineNotifications:wE.string().nullish()});import{z as bt}from"zod";var AN=bt.object({version:bt.string(),json:bt.record(bt.unknown()),hash:bt.string()}),CE=bt.record(bt.unknown()),pZ=bt.object({newSvgs:bt.array(AN),metadata:CE.optional()}),wN=bt.object({version:bt.string(),json:bt.record(bt.unknown()).nullish(),hash:bt.string(),description:bt.string().nullish(),metadata:CE.nullish()}),RE=bt.record(bt.string().describe("icon hash"),wN);import{z as je}from"zod";var Wm=je.object({assertion:je.string().describe("A human readable assertion that evaluates to either true or false depending on the state of the system.")}),CN=je.object({instruction:je.string().describe("Human readable instruction to execute the step. Instructions should only describe concrete actions that need to be taken. Any checks or assertions should be described in the preConditions, postConditions, or expectedResults."),expectedResults:Wm.array().optional().describe("Human readable description of the expected results after the step is executed. Each expected result should contain a single assertion that evaluates to true or false.")}),xE=CN.extend({subSteps:je.lazy(()=>xE.array().optional()).describe("More granular steps to be take to achieve the current step's higher level objective.")}),ME=je.object({name:je.string().describe("Short name describing the test plan"),description:je.string().nullish().transform(r=>r??void 0).describe("Longer form description of the high level goal of the test plan")}),_E=ME.extend({id:je.string(),createdAt:je.coerce.date(),updatedAt:je.coerce.date(),updatedBy:je.string(),createdBy:je.string(),test:je.object({id:je.string(),name:je.string()}).nullish().transform(r=>r??void 0)}),SZ=_E.extend({testGenRuns:je.tuple([]).or(je.tuple([je.object({id:je.string(),startedAt:je.coerce.date(),status:je.nativeEnum(xe)})]))}),PE=je.object({preConditions:Wm.array().nullish().transform(r=>r??[]),postConditions:Wm.array().nullish().transform(r=>r??[]),steps:xE.array().nullish().transform(r=>r??[])}),yZ=_E.extend({plan:PE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),RN=ME.extend({plan:PE.nullish().transform(r=>r??{preConditions:[],postConditions:[],steps:[]})}),bZ=RN.array().nullish().transform(r=>r??[]);import{validator as xN}from"@exodus/schemasafe";function IE(r){let e;try{e=JSON.parse(r)}catch(t){return`The schema is not valid JSON. ${t}`}try{xN(e)}catch(t){return`The schema is not a valid JSON schema. ${t}`}}var OE=r=>{r.extraHeaders&&(r.extraHeaders=Object.fromEntries(Object.entries(r.extraHeaders).filter(([e,t])=>e.trim()&&t.trim())))};var Yl=class{async prepareGoldenScreenshotForComparison(e,t,n){return n}};import{z as kZ}from"zod";var Xl=class{async resolveEntries(){}async saveEntries(){}};import{z as jm}from"zod";var LE=jm.object({parentStepIdChain:jm.array(jm.string()),result:zt});import{z as K}from"zod";var Va="assets",MN=K.object({step:ut,status:K.nativeEnum(Ke),startedAt:K.coerce.date(),finishedAt:K.coerce.date().optional(),healMetadata:K.object({healType:K.nativeEnum(Ta).or(K.literal("AI")),healedAt:K.coerce.date()}).optional(),beforeSnapshotId:K.string().uuid().optional(),afterSnapshotId:K.string().uuid().optional(),message:K.string().optional()}),_N=MN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),e7=_N.extend({step:K.unknown()}),$m=K.object({avdId:K.string().optional(),channel:K.string().optional(),tag:K.string().optional()}),NE="1.0.0",qm=iE.extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),runAttemptSchemaVersion:K.string().optional(),schemaVersion:K.string().optional().default("1.0.19"),results:K.record(K.string(),K.unknown()).array().optional(),beforeResults:K.record(K.string(),K.unknown()).array().optional(),afterResults:K.record(K.string(),K.unknown()).array().optional(),assetDetails:$m.optional(),activeVideos:K.array(K.object({videoName:K.string(),timestamp:K.coerce.date()})).optional()}),DE=qm.extend({assetDetails:$m.optional(),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),t7=qm.merge(va),r7=DE.merge(va),kE=K.object({results:K.array(zt),beforeResults:K.array(zt).optional(),afterResults:K.array(zt).optional()}),n7=qm.merge(kE),o7=DE.merge(kE),UE=oE.merge(rE).extend({executionType:K.nativeEnum(oi).optional().default("WEB"),testId:K.string().uuid(),testDescription:K.string().optional(),runGroupId:K.string().uuid(),status:K.nativeEnum(xe),startedAt:K.coerce.date(),attempts:K.number(),failureRecoveryDetails:K.object({attempts:K.number()}).optional()}),PN=UE.merge($m),i7=UE.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),a7=PN.extend({finishedAt:K.coerce.date().optional().transform(r=>r??new Date)}),IN=eE.merge(tE).extend({id:K.string().uuid().optional(),startedAt:K.coerce.date(),cliVersion:K.string(),labels:K.string().array().optional().default([])}),Jl=IN.extend({updatedAt:K.coerce.date().optional().transform(r=>r??new Date),finishedAt:K.coerce.date().optional().transform(r=>r??new Date)});import{confirm as ON,input as LN}from"@inquirer/prompts";import{existsSync as Nee,mkdirSync as Dee,statSync as NN}from"fs";var ho=!!process.env.CI||!!process.env.GITHUB_ACTIONS||!!process.env.GITHUB_RUN_ID||!!process.env.GITLAB_CI||!!process.env.CI_COMMIT_SHA||!!process.env.JENKINS_URL||!!process.env.BUILD_NUMBER||!!process.env.JENKINS_HOME||!!process.env.CIRCLECI||!!process.env.CIRCLE_BUILD_NUM||!!process.env.TRAVIS||!!process.env.TRAVIS_BUILD_NUMBER||!!process.env.BITBUCKET_BUILD_NUMBER||!!process.env.BITBUCKET_COMMIT||!!process.env.CODEBUILD_BUILD_ID||!!process.env.TF_BUILD||!!process.env.BUILD_BUILDID||!!process.env.AGENT_ID||!!process.env.BUILDER_SA_EMAIL||!!process.env.HEROKU_TEST_RUN_ID||!!process.env.CI_NODE_INDEX||!!process.env.TEAMCITY_VERSION||!!process.env.BUILD_VCS_NUMBER||!!process.env.BUILDKITE||!!process.env.BUILDKITE_BUILD_NUMBER||!!process.env.APPVEYOR||!!process.env.APPVEYOR_BUILD_NUMBER||!!process.env.DRONE||!!process.env.DRONE_BUILD_NUMBER||!!process.env.SHIPPABLE||!!process.env.BUILD_URL||!!process.env.SEMAPHORE||!!process.env.SEMAPHORE_EXECUTABLE_UUID||!!process.env.WOODPECKER||!!process.env.CI_BUILD_NUMBER||!!process.env.WERCKER_MAIN_PIPELINE_STARTED||!!process.env.BUDDY_EXECUTION_ID;var DN=!1,FE=(()=>{try{return NN("/.dockerenv"),!0}catch{return!1}})();async function Ql(r){return ho||DN||FE?!0:(await w.flush(),await new Promise(t=>setTimeout(t,100)),await ON({message:r}))}async function BE(r,e){return ho||FE?e:(await LN({message:r,default:e})).trim()||e}import Si,{supportsColor as $N}from"chalk";import{Console as zE}from"console";import{format as Wa}from"util";var Km=class extends Error{constructor(e,t,n){let o=Error.stackTraceLimit;n&&(Error.stackTraceLimit=Math.max(n,o||10)),super(e),Error.captureStackTrace&&Error.captureStackTrace(this,t),Error.stackTraceLimit=o}},Zl=class r extends zE{_buffer=[];_groupDepth=0;Console=zE;constructor(){super({write:e=>(r.write(this._buffer,"log",e),!0)})}static write(e,t,n,o=2){let i=new Km(void 0,r.write).stack;if(!i)return e;let a=i.split(`
24
24
  `).slice(o).filter(Boolean).join(`
25
- `);return e.push({message:n,origin:a,type:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Va(e,...t))}error(e,...t){this._log("error",Va(e,...t))}info(e,...t){this._log("info",Va(e,...t))}log(e,...t){this._log("log",Va(e,...t))}warn(e,...t){this._log("warn",Va(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function kE(r){let e=globalThis.console,t=new Jl;globalThis.console=t;try{r()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
25
+ `);return e.push({message:n,origin:a,type:t}),e}_log(e,t){r.write(this._buffer,e," ".repeat(this._groupDepth)+t,3)}debug(e,...t){this._log("debug",Wa(e,...t))}error(e,...t){this._log("error",Wa(e,...t))}info(e,...t){this._log("info",Wa(e,...t))}log(e,...t){this._log("log",Wa(e,...t))}warn(e,...t){this._log("warn",Wa(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function HE(r){let e=globalThis.console,t=new Zl;globalThis.console=t;try{r()}finally{let o=t.getBuffer()?.map(i=>i.message).join(`
26
26
  `);process.stderr.write(`${o}
27
- `),globalThis.console=e}}var Km=" ".repeat(6);import _N from"fetch-retry";import PN from"os";import UE,{multistream as IN}from"pino";import ON from"pino-pretty";import LN from"pino-std-serializers";var hi=new Map,NN=!0,FE="Log throttle exceeded",DN=100,kN=5e3,UN=_N(global.fetch,{retries:2,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),Ym=class r{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=!1;lastWindowStart=Date.now();site="https://ingest.us.signoz.cloud:443/logs/json";flushIntervalMs;maxBatchSize;buffer=[];flushTimer;constructor({bindings:e,hostname:t,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=t??PN.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10;let a={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=NN?UE(a):UE(a,IN([{stream:ON({colorize:!0})}]))}child(e){return new r({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}async flush(){await this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushBuffer()},this.flushIntervalMs))}async flushBuffer(){if(this.buffer.length===0)return;let e=this.buffer;this.buffer=[];try{let t=await UN(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:go(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===FE)return!0;let t=Date.now();return t-this.lastWindowStart>kN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,FE),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<DN?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,t,n,...o){try{this.logHelper(e,t,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,t,n,...o){if(za[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof t=="string"&&!n&&(t={message:t}),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error&&(t.err=LN.err(t.err));let i={...this.bindingAttributes,...t&&typeof t=="object"?t:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env};this.disableConsoleLogs||this.consoleLogger[e](i,n,...o);let s={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:wb({message:n||"",...i})};this.buffer.push(s),this.buffer.length>=this.maxBatchSize?(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flushBuffer()):this.scheduleFlush()}setApp(e){let t=this.bindingAttributes.app;this.bindingAttributes.app=e,hi.set("app",this),hi.delete(t)}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=Cb[e]):(this.minLevelValue=za[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},fi=({app:r,hostname:e,disableConsoleLogs:t})=>(hi.has(r)||hi.set(r,new Ym({bindings:{app:r},hostname:e,disableConsoleLogs:t})),hi.get(r));async function BE(){await Promise.all([...hi.values()].map(r=>r.flush()))}import{hostname as FN}from"os";var cr=fi({app:"cli",hostname:FN(),disableConsoleLogs:!0}).child({cliVersion:"0.13.1"});function Xm(r){if(!r)return;r=r.toLowerCase();let e=Vl.safeParse(r);if(e.success)return C.setMinLevel(e.data),e.data}function zE({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return kE(()=>{if(c.forEach(u=>{C.log(""),o(u)}),c.length){C.log("");let u=c.length===1?"":"s";C.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{C.dimmed(n(d))})}if(l.length){C.log("");let u=l.length===1?"":"s";C.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{C.dimmed(n(d))})}if(a.length){C.log("");let u=a.length===1?"":"s";C.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{C.dimmed(n(d))})}if(s.length){C.log("");let u=s.length===1?"":"s";C.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{C.dimmed(n(d))})}if(i.length){C.log("");let u=i.length===1?"":"s";C.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{C.dimmed(n(d))})}C.log(""),C.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var Wa=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Si.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Si.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Si.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Si.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Si.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Si.bgMagenta.white("RUNNING"),a=0):(C.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),BN||(i=`${i}`),C.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import zN from"fs";import{tmpdir as HN}from"os";import GN from"path";import{registry as ja}from"playwright-core/lib/server";import HE from"proper-lockfile";var GE=GN.join(HN(),"momenticBrowserInstallation");var Jm=["chrome","chromium","chrome-for-testing","ffmpeg"],VN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},VE={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function WE(r){let e=VE[VN[r]??""]??"",t=ja.findExecutable(e);return!t||t.installType==="none"?!1:Qm(t)}function Qm(r){let e=r.executablePath();return zN.existsSync(e)}function WN(r,e){let t=VE[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=ja.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Qm(n)))return n}async function jN({browser:r,force:e}){let t=WN(r,e);if(!t){C.info(`Browser '${r}' is already installed, skipping...`);return}C.info(`Installing browser '${r}'...`);try{await ja.installDeps([t],!1),await ja.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){C.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=ja.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Qm(o);)C.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Ql({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Jm:Array.from(new Set(r));try{await HE.lock(GE,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){C.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await jN({browser:i,force:e})}catch(a){o=a,C.error(`Failed to install the ${i} browser: ${a}`)}}finally{await HE.unlock(GE,{realpath:!1})}if(o)throw o}import{createServer as $N}from"http";async function Zl(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await ec(o))return o}C.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function ec(r){return new Promise((e,t)=>{let n=$N();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(C.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import Tte from"blocked-at";import Ate from"why-is-node-running";function jE(r){let e=r?.shardIndex??1,t=r?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(t<1)throw new Error("Shard count must be greater than 0.");if(e>t)throw new Error("Shard index cannot be greater than shard count")}function qN(r,e,t,n){if(t>r.length&&(C.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function $E(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?qN(e,t,n,o):e}import rF from"fs";import{tmpdir as nF,totalmem as oF}from"os";import iF from"path";import{execFile as KN}from"child_process";import YN from"path";function XN(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return YN.join(r,"platform-tools",e)}async function ht(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=XN(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{KN(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as EU}from"@limrun/api";import{execSync as TU}from"child_process";import zte,{multistream as Gte}from"pino";import Wte from"pino-pretty";var qte=5*1024,JN="...[truncated]",Kte=Buffer.byteLength(JN,"utf8");import{PostHog as ore}from"posthog-node";var Ln=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var qE=r=>{let e=r.reason===void 0?new DOMException("This operation was aborted.","AbortError"):r.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function z(r,e){let{milliseconds:t,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((s,c)=>{let l;if(e.signal){let{signal:m}=e;if(m.aborted)return c(qE(m));l=()=>c(qE(m)),m.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(m){c(m)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let m=o instanceof Error?o:new Ln(o??`Promise timed out after ${t}ms`);c(m)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(m=>{d(),s(m)}).catch(m=>{d(),c(m)})})}import{PostHog as pre}from"posthog-node";import{execSync as QN}from"child_process";import yi from"os";import ZN from"v8";var KE,Br,XE=yi.platform(),eD=yi.cpus().map(r=>({model:r.model,speed:r.speed})).reduce((r,e)=>(r[e.model]={speed:e.speed},r.totalCores=(r.totalCores??0)+1,r),{}),YE=r=>{try{let e={},t=!1,n=tD(),o=rD(),i=`${Math.round(n.freePercentage*100)}%`;n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),t=!0);let a=`${o?Math.round(o.idle):"unknown"}%`;o&&o?.total>80&&(t=!0);let s=ZN.getHeapStatistics(),c=s.used_heap_size,l=s.heap_size_limit;c/l>.9&&(t=!0),t?(r.warn({memory:n,cpu:o,heapStats:s,...e},"Critical resource usage metrics detected"),ho&&C.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function JE(r){if(!Ur)return YE(r),{interval:setInterval(()=>YE(r),2e4),cpuMetadata:eD,platform:XE}}function tD(){let r=yi.totalmem(),e=XE==="darwin"?nD():(()=>{let n=yi.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function rD(){let r=yi.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!Br)return Br=t,null;let n={user:t.user-Br.user,nice:t.nice-Br.nice,sys:t.sys-Br.sys,idle:t.idle-Br.idle,irq:t.irq-Br.irq,total:t.total-Br.total};return KE={measurementTime:e,intervalMs:e-Br.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},Br=t,KE}function nD(){try{let r=QN("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),t=r.match(/page size of (\d+) bytes/)?.[1],n=t?Number.parseInt(t,10):4096,o=u=>{let m=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?Number.parseInt(m,10):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),c=i*n,l=(a+s)*n;return{availableMemory:c+l,rawFreeMemory:c,cachedMemory:l}}catch{let e=yi.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var tc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function oD(r){if(!r||r.length===0)return{};let e={};for(let t of r){let n=t.indexOf(":");if(n>-1){let o=t.slice(0,n).trim(),i=t.slice(n+1).trim();o&&(e[o]=i);continue}e[t]=!0}return e}function rc(r,e){let t=oD(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var wT="=",ac=";",up=",";var CT=8192;var vi={};u_(vi,{getKeyPairs:()=>UD,parseKeyPairsIntoRecord:()=>FD,parsePairKeyValue:()=>RT,serializeKeyPairs:()=>kD});Le();var DD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function kD(r){return r.reduce(function(e,t){var n=""+e+(e!==""?up:"")+t;return n.length>CT?e:n},"")}function UD(r){return r.getAllEntries().map(function(e){var t=DD(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=ac+o.metadata.toString()),i})}function RT(r){var e=r.split(ac);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(wT);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=ep(e.join(ac))),{key:o,value:i,metadata:a}}}}}function FD(r){return typeof r!="string"||r.length===0?{}:r.split(up).map(function(e){return RT(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Le();var sc;(function(r){r.AlwaysOff="always_off",r.AlwaysOn="always_on",r.ParentBasedAlwaysOff="parentbased_always_off",r.ParentBasedAlwaysOn="parentbased_always_on",r.ParentBasedTraceIdRatio="parentbased_traceidratio",r.TraceIdRatio="traceidratio"})(sc||(sc={}));var BD=",",zD=["OTEL_SDK_DISABLED"];function HD(r){return zD.indexOf(r)>-1}var GD=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function VD(r){return GD.indexOf(r)>-1}var WD=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function jD(r){return WD.indexOf(r)>-1}var dp=1/0,mp=128,$D=128,qD=128,pp={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:Be.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:dp,OTEL_ATTRIBUTE_COUNT_LIMIT:mp,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:dp,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:mp,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:dp,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:mp,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:$D,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:qD,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:sc.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative"};function KD(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function YD(r,e,t,n,o){if(n===void 0&&(n=-1/0),o===void 0&&(o=1/0),typeof t[r]<"u"){var i=Number(t[r]);isNaN(i)||(i<n?e[r]=n:i>o?e[r]=o:e[r]=i)}}function XD(r,e,t,n){n===void 0&&(n=BD);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var JD={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function QD(r,e,t){var n=t[r];if(typeof n=="string"){var o=JD[n.toUpperCase()];o!=null&&(e[r]=o)}}function xT(r){var e={};for(var t in pp){var n=t;switch(n){case"OTEL_LOG_LEVEL":QD(n,e,r);break;default:if(HD(n))KD(n,e,r);else if(VD(n))YD(n,e,r);else if(jD(n))XD(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Et(){var r=xT(process.env);return Object.assign({},pp,r)}function MT(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function lc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=MT(r.charCodeAt(n)),i=MT(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var _T="1.25.1";var ZD="deployment.environment";var e0="process.runtime.name";var t0="service.name";var r0="service.instance.id";var n0="telemetry.sdk.name",o0="telemetry.sdk.language",i0="telemetry.sdk.version";var PT=ZD;var IT=e0;var cc=t0;var OT=r0;var Qa=n0,Za=o0,es=i0;var a0="nodejs";var LT=a0;var Ai,uc=(Ai={},Ai[Qa]="opentelemetry",Ai[IT]="node",Ai[Za]=LT,Ai[es]=_T,Ai);var s0=9,l0=6,c0=Math.pow(10,l0),u0=Math.pow(10,s0);function NT(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*c0);return[t,n]}function DT(r){return r[0]*u0+r[1]}function ts(r){return r[0]*1e6+r[1]/1e3}var So;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(So||(So={}));var kT=function(){function r(){var e=this;this._promise=new Promise(function(t,n){e._resolve=t,e._reject=n})}return Object.defineProperty(r.prototype,"promise",{get:function(){return this._promise},enumerable:!1,configurable:!0}),r.prototype.resolve=function(e){this._resolve(e)},r.prototype.reject=function(e){this._reject(e)},r}();var d0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},m0=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},UT=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new kT}return Object.defineProperty(r.prototype,"isCalled",{get:function(){return this._isCalled},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"promise",{get:function(){return this._deferred.promise},enumerable:!1,configurable:!0}),r.prototype.call=function(){for(var e,t=this,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(!this._isCalled){this._isCalled=!0;try{Promise.resolve((e=this._callback).call.apply(e,m0([this._that],d0(n),!1))).then(function(i){return t._deferred.resolve(i)},function(i){return t._deferred.reject(i)})}catch(i){this._deferred.reject(i)}}return this._deferred.promise},r}();var ur;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(ur||(ur={}));var _t;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(_t||(_t={}));var p0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}();var Uoe=function(r){p0(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function FT(r,e){for(var t=0,n=r.length-1;n-t>1;){var o=Math.trunc((n+t)/2);r[o]<=e?t=o:n=o-1}return r[n]<=e?n:r[t]<=e?t:-1}Le();var dr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(dr||(dr={}));var BT=function(){function r(){this.kind=dr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var ce;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ce||(ce={}));var g0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function h0(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var gp=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=h0(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=FT(this._boundaries,e);this._current.buckets.counts[t+1]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var hp=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=dr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new gp(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new gp(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new gp(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.HISTOGRAM,dataPoints:n.map(function(i){var a=g0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ce.GAUGE||e.type===ce.UP_DOWN_COUNTER||e.type===ce.OBSERVABLE_GAUGE||e.type===ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var fp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Sp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},yp=function(){function r(e,t,n,o){e===void 0&&(e=new f0),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var f0=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,Sp([n,this._counts.length-t],fp(this._counts.slice(t)),!1)),o.splice.apply(o,Sp([0,t],fp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(Sp([],fp(this._counts),!1))},r}();var zT=52,S0=2146435072,y0=1048575,bp=1023,dc=-bp+1,mc=bp,rs=Math.pow(2,-1022);function pc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&S0)>>20;return n-bp}function gc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&y0)*Math.pow(2,32);return o+n}function ns(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function GT(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var b0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Nn=function(r){b0(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var WT=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<rs)return this._minNormalLowerBoundaryIndex();var t=pc(e),n=this._rightShift(gc(e)-1,zT);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Nn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Nn("overflow: "+e+" is > maximum lower boundary: "+n);return ns(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=dc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return mc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var jT=function(){function r(e){this._scale=e,this._scaleFactor=ns(Math.LOG2E,e),this._inverseFactor=ns(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=rs)return this._minNormalLowerBoundaryIndex()-1;if(gc(e)===0){var t=pc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Nn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return rs;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Nn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return dc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(mc+1<<this._scale)-1},r}();var $T=-10,qT=20,E0=Array.from({length:31},function(r,e){return e>10?new jT(e-10):new WT(e-10)});function Ep(r){if(r>qT||r<$T)throw new Nn("expected scale >= "+$T+" && <= "+qT+", got: "+r);return E0[r+10]}var T0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},hc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),v0=20,A0=160,Tp=2,w0=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=A0),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new yp),u===void 0&&(u=new yp),d===void 0&&(d=Ep(v0)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Tp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Tp),this._maxSize=Tp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=GT(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Ep(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=hc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=hc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new hc(0,-1);var o=t-n;return new hc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var KT=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=dr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new w0(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=T0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ce.GAUGE||e.type===ce.UP_DOWN_COUNTER||e.type===ce.OBSERVABLE_GAUGE||e.type===ce.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var C0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},vp=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=NT(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var YT=function(){function r(){this.kind=dr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new vp(e)},r.prototype.merge=function(e,t){var n=ts(t.sampleTime)>=ts(e.sampleTime)?t:e;return new vp(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=ts(t.sampleTime)>=ts(e.sampleTime)?t:e;return new vp(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.GAUGE,dataPoints:n.map(function(i){var a=C0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var R0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},os=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ap=function(){function r(e){this.monotonic=e,this.kind=dr.SUM}return r.prototype.createAccumulation=function(e){return new os(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new os(t.startTime,this.monotonic,o,t.reset):new os(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new os(t.startTime,this.monotonic,o,!0):new os(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.SUM,dataPoints:n.map(function(i){var a=R0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var yo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Hr=function(){function r(){}return r.Drop=function(){return nv},r.Sum=function(){return ov},r.LastValue=function(){return iv},r.Histogram=function(){return av},r.ExponentialHistogram=function(){return x0},r.Default=function(){return M0},r}();var XT=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new BT,e}(Hr);var JT=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ce.COUNTER:case ce.OBSERVABLE_COUNTER:case ce.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Ap(!0),e.NON_MONOTONIC_INSTANCE=new Ap(!1),e}(Hr);var QT=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new YT,e}(Hr);var ZT=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new hp([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Hr);var ev=function(r){yo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new hp(this._boundaries,this._recordMinMax)},e}(Hr);var tv=function(r){yo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new KT(this._maxSize,this._recordMinMax)},e}(Hr);var rv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ce.COUNTER:case ce.UP_DOWN_COUNTER:case ce.OBSERVABLE_COUNTER:case ce.OBSERVABLE_UP_DOWN_COUNTER:return ov;case ce.GAUGE:case ce.OBSERVABLE_GAUGE:return iv;case ce.HISTOGRAM:return t.advice.explicitBucketBoundaries?new ev(t.advice.explicitBucketBoundaries):av}return V.warn("Unable to recognize instrument type: "+t.type),nv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Hr);var nv=new XT,ov=new JT,iv=new QT,av=new ZT,x0=new tv,M0=new rv;Le();function fc(){return"unknown_service:"+process.argv0}var Dn=function(){return Dn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Dn.apply(this,arguments)},_0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},P0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},I0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},wp=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[cc]=fc(),e[Za]=uc[Za],e[Qa]=uc[Qa],e[es]=uc[es],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return _0(this,void 0,void 0,function(){return P0(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Dn(Dn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=I0(a,2),l=c[0],u=c[1];return Dn(Dn(Dn(Dn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var bo;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(bo||(bo={}));Le();var O0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},L0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Cp=function(){return ur.CUMULATIVE},sv=function(r){switch(r){case ce.COUNTER:case ce.OBSERVABLE_COUNTER:case ce.GAUGE:case ce.HISTOGRAM:case ce.OBSERVABLE_GAUGE:return ur.DELTA;case ce.UP_DOWN_COUNTER:case ce.OBSERVABLE_UP_DOWN_COUNTER:return ur.CUMULATIVE}},lv=function(r){switch(r){case ce.COUNTER:case ce.HISTOGRAM:return ur.DELTA;case ce.GAUGE:case ce.UP_DOWN_COUNTER:case ce.OBSERVABLE_UP_DOWN_COUNTER:case ce.OBSERVABLE_COUNTER:case ce.OBSERVABLE_GAUGE:return ur.CUMULATIVE}};function N0(){var r=Et(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Cp:e==="delta"?sv:e==="lowmemory"?lv:(V.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),Cp)}function D0(r){return r!=null?r===bo.DELTA?sv:r===bo.LOWMEMORY?lv:Cp:N0()}function k0(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Hr.Default()}}var cv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=k0(t),this._aggregationTemporalitySelector=D0(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return O0(this,void 0,void 0,function(){return L0(this,function(e){switch(e.label){case 0:return[4,this._otlpExporter.shutdown()];case 1:return e.sent(),[2]}})})},r.prototype.forceFlush=function(){return Promise.resolve()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r}();Le();Le();var U0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},uv=1e4,dv=5,mv=1e3,pv=5e3,gv=1.5;function is(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=U0(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):V.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function Rp(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function xp(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return V.warn("Could not parse export URL: '"+r+"'"),r}}function Mp(r){return typeof r=="number"?r<=0?_p(r,uv):r:F0()}function F0(){var r,e=Number((r=Et().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Et().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?_p(e,uv):e}function _p(r,e){return V.warn("Timeout must be greater than 0",r),e}function hv(r){var e=[429,502,503,504];return e.includes(r)}function fv(r){if(r==null)return-1;var e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;var t=new Date(r).getTime()-Date.now();return t>=0?t:0}var Sv=function(){function r(e){e===void 0&&(e={}),this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname=="string"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new UT(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=Mp(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:So.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:So.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:So.SUCCESS})}).catch(function(n){t({code:So.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{V.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return V.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Le();import*as Pp from"url";import*as yc from"http";import*as bc from"https";import*as yv from"zlib";import{Readable as z0}from"stream";var kn;(function(r){r.NONE="none",r.GZIP="gzip"})(kn||(kn={}));var B0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),wi=function(r){B0(e,r);function e(t,n,o){var i=r.call(this,t)||this;return i.name="OTLPExporterError",i.data=o,i.code=n,i}return e}(Error);var Sc=function(){return Sc=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Sc.apply(this,arguments)};function Ip(r,e,t,n,o){var i=r.timeoutMillis,a=new Pp.URL(r.url),s=Number(process.versions.node.split(".")[0]),c,l,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,l.destroyed){var h=new wi("Request Timeout");o(h)}else s>=14?l.destroy():l.abort()},i),m={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:Sc({"Content-Type":t},r.headers),agent:r.agent},g=a.protocol==="http:"?yc.request:bc.request,p=function(h,f){switch(h===void 0&&(h=dv),f===void 0&&(f=mv),l=g(m,function(b){var w="";b.on("data",function(R){return w+=R}),b.on("aborted",function(){if(u){var R=new wi("Request Timeout");o(R)}}),b.on("end",function(){if(u===!1)if(b.statusCode&&b.statusCode<299)V.debug("statusCode: "+b.statusCode,w),n(),clearTimeout(d),clearTimeout(c);else if(b.statusCode&&hv(b.statusCode)&&h>0){var R=void 0;f=gv*f,b.headers["retry-after"]?R=fv(b.headers["retry-after"]):R=Math.round(Math.random()*(pv-f)+f),c=setTimeout(function(){p(h-1,f)},R)}else{var v=new wi(b.statusMessage,b.statusCode,w);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(b){if(u){var w=new wi("Request Timeout",b.code);o(w)}else o(b);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var b=new wi("Request Timeout");o(b)}clearTimeout(d),clearTimeout(c)}),r.compression){case kn.GZIP:{l.setHeader("Content-Encoding","gzip");var E=H0(e);E.on("error",o).pipe(yv.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};p()}function H0(r){var e=new z0;return e.push(r),e.push(null),e}function Op(r){if(r.httpAgentOptions&&r.keepAlive===!1){V.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Pp.URL(r.url),t=e.protocol==="http:"?yc.Agent:bc.Agent;return new t(Sc({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function Lp(r){if(r)return r;var e=Et().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Et().OTEL_EXPORTER_OTLP_COMPRESSION;return e===kn.GZIP?kn.GZIP:kn.NONE}Le();var G0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ec=function(r){G0(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&V.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,is(t.headers),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=Op(t),i.compression=Lp(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){V.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;Ip(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,l)}).then(n,o);this._sendingPromises.push(a);var s=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(s,s)},e.prototype.onShutdown=function(){},e}(Sv);function Ev(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function V0(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function Tv(r){var e=Ev(r);return V0(e)}function W0(r){var e=Ev(r);return e.toString()}var j0=typeof BigInt<"u"?W0:DT;function bv(r){return r}function vv(r){if(r!==void 0)return lc(r)}var $0={encodeHrTime:Tv,encodeSpanContext:lc,encodeOptionalSpanContext:vv};function Av(r){var e,t;if(r===void 0)return $0;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?Tv:j0,encodeSpanContext:o?bv:lc,encodeOptionalSpanContext:o?bv:vv}}var q0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function wv(r){return{name:r.name,version:r.version}}function Ci(r){return Object.keys(r).map(function(e){return Cv(e,r[e])})}function Cv(r,e){return{key:r,value:Rv(e)}}function Rv(r){var e=typeof r;return e==="string"?{stringValue:r}:e==="number"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e==="boolean"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(Rv)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=q0(t,2),o=n[0],i=n[1];return Cv(o,i)})}}:{}}function xv(r){return{attributes:Ci(r.attributes),droppedAttributesCount:0}}Le();function _v(r,e){var t=Av(e);return{resource:xv(r.resource),schemaUrl:void 0,scopeMetrics:K0(r.scopeMetrics,t)}}function K0(r,e){return Array.from(r.map(function(t){return{scope:wv(t.scope),metrics:t.metrics.map(function(n){return Y0(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function Y0(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=Z0(r.aggregationTemporality);switch(r.dataPointType){case _t.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:Mv(r,e)};break;case _t.GAUGE:t.gauge={dataPoints:Mv(r,e)};break;case _t.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:J0(r,e)};break;case _t.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:Q0(r,e)};break}return t}function X0(r,e,t){var n={attributes:Ci(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Kt.INT:n.asInt=r.value;break;case Kt.DOUBLE:n.asDouble=r.value;break}return n}function Mv(r,e){return r.dataPoints.map(function(t){return X0(t,r.descriptor.valueType,e)})}function J0(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function Q0(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function Z0(r){switch(r){case ur.DELTA:return 1;case ur.CUMULATIVE:return 2}}function Pv(r,e){return{resourceMetrics:r.map(function(t){return _v(t,e)})}}var Np={serializeRequest:function(r){var e=Pv(r,{useLongBits:!1}),t=new TextEncoder;return t.encode(JSON.stringify(e))},deserializeResponse:function(r){var e=new TextDecoder;return JSON.parse(e.decode(r))}};var Iv="0.52.1";var Ov=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ri=function(){return Ri=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Ri.apply(this,arguments)},Lv="v1/metrics",ek="http://localhost:4318/"+Lv,tk={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+Iv},rk=function(r){Ov(e,r);function e(t){var n=r.call(this,t,Np,"application/json")||this;return n.headers=Ri(Ri(Ri(Ri({},n.headers),tk),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),is(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?xp(Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Et().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?Rp(Et().OTEL_EXPORTER_OTLP_ENDPOINT,Lv):ek},e}(Ec),Nv=function(r){Ov(e,r);function e(t){return r.call(this,new rk(t),t)||this}return e}(cv);var xi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(xi||(xi={}));var Gr;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Gr||(Gr={}));Le();var nk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Dv=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},kv=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},ok=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},ik=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},ak=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Uv(r){return r!=null}function Tc(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function Fv(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Dp=function(r){nk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Un(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Dp("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function Bv(r){return Dv(this,void 0,void 0,function(){var e=this;return kv(this,function(t){return[2,Promise.all(r.map(function(n){return Dv(e,void 0,void 0,function(){var o,i;return kv(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return[2]}})})}))]})})}function zv(r){return r.status==="rejected"}function kp(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,ik([],ok(e(n)),!1))}),t}function Hv(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=ak(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(s){t={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function Gv(r,e){for(var t=0,n=r.length-1,o=r.length;n>=t;){var i=t+Math.trunc((n-t)/2);r[i]<e?t=i+1:(o=i,n=i-1)}return o}function Vv(r,e){return r.toLowerCase()===e.toLowerCase()}Le();var mr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(mr||(mr={}));var Up=function(){function r(){this.kind=mr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();Le();var Se;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(Se||(Se={}));function Vr(r,e,t){var n,o,i,a;return lk(r)||V.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:Kt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Wv(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function jv(r,e){return Vv(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var sk=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function lk(r){return r.match(sk)!=null}var ck=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function uk(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var vc=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=uk(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=Gv(this._boundaries,e);this._current.buckets.counts[t]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ac=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=mr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new vc(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new vc(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new vc(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Gr.HISTOGRAM,dataPoints:n.map(function(i){var a=ck(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Se.GAUGE||e.type===Se.UP_DOWN_COUNTER||e.type===Se.OBSERVABLE_GAUGE||e.type===Se.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var Fp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Bp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},zp=function(){function r(e,t,n,o){e===void 0&&(e=new dk),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var dk=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,Bp([n,this._counts.length-t],Fp(this._counts.slice(t)),!1)),o.splice.apply(o,Bp([0,t],Fp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(Bp([],Fp(this._counts),!1))},r}();var $v=52,mk=2146435072,pk=1048575,Hp=1023,wc=-Hp+1,Cc=Hp,as=Math.pow(2,-1022);function Rc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&mk)>>20;return n-Hp}function xc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&pk)*Math.pow(2,32);return o+n}function ss(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Kv(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var gk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fn=function(r){gk(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Xv=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<as)return this._minNormalLowerBoundaryIndex();var t=Rc(e),n=this._rightShift(xc(e)-1,$v);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Fn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Fn("overflow: "+e+" is > maximum lower boundary: "+n);return ss(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=wc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Cc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var Jv=function(){function r(e){this._scale=e,this._scaleFactor=ss(Math.LOG2E,e),this._inverseFactor=ss(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=as)return this._minNormalLowerBoundaryIndex()-1;if(xc(e)===0){var t=Rc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Fn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return as;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Fn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return wc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Cc+1<<this._scale)-1},r}();var Qv=-10,Zv=20,hk=Array.from({length:31},function(r,e){return e>10?new Jv(e-10):new Xv(e-10)});function Gp(r){if(r>Zv||r<Qv)throw new Fn("expected scale >= "+Qv+" && <= "+Zv+", got: "+r);return hk[r+10]}var fk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Mc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),Sk=20,yk=160,Vp=2,eA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=yk),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new zp),u===void 0&&(u=new zp),d===void 0&&(d=Gp(Sk)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Vp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Vp),this._maxSize=Vp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=Kv(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Gp(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Mc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Mc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Mc(0,-1);var o=t-n;return new Mc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var Wp=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=mr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new eA(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Gr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=fk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Se.GAUGE||e.type===Se.UP_DOWN_COUNTER||e.type===Se.OBSERVABLE_GAUGE||e.type===Se.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();Le();var bk=tp("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function tA(r){return r.setValue(bk,!0)}Le();function rA(){return function(r){V.error(Ek(r))}}function Ek(r){return typeof r=="string"?r:JSON.stringify(Tk(r))}function Tk(r){for(var e={},t=r;t!==null;)Object.getOwnPropertyNames(t).forEach(function(n){if(!e[n]){var o=t[n];o&&(e[n]=String(o))}}),t=Object.getPrototypeOf(t);return e}var vk=rA();function _c(r){try{vk(r)}catch{}}var nA="1.30.1";var Ak="process.runtime.name";var wk="service.name";var Ck="telemetry.sdk.name",Rk="telemetry.sdk.language",xk="telemetry.sdk.version";var oA=Ak;var iA=wk;var ls=Ck,cs=Rk,us=xk;var Mk="nodejs";var aA=Mk;var Mi,Eo=(Mi={},Mi[ls]="opentelemetry",Mi[oA]="node",Mi[cs]=aA,Mi[us]=nA,Mi);function ds(r){r.unref()}var Dk=9,kk=6,Uk=Math.pow(10,kk),Hse=Math.pow(10,Dk);function To(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Uk);return[t,n]}function _i(r){return r[0]*1e6+r[1]/1e3}var ms;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ms||(ms={}));Le();function sA(r,e){return new Promise(function(t){Ti.with(tA(Ti.active()),function(){r.export(e,function(n){t(n)})})})}var lA={_export:sA};var Fk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pc=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=To(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var jp=function(){function r(){this.kind=mr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Pc(e)},r.prototype.merge=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Pc(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Pc(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Gr.GAUGE,dataPoints:n.map(function(i){var a=Fk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var Bk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pi=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Ic=function(){function r(e){this.monotonic=e,this.kind=mr.SUM}return r.prototype.createAccumulation=function(e){return new Pi(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Pi(t.startTime,this.monotonic,o,t.reset):new Pi(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Pi(t.startTime,this.monotonic,o,!0):new Pi(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Gr.SUM,dataPoints:n.map(function(i){var a=Bk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var vo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),pr=function(){function r(){}return r.Drop=function(){return hA},r.Sum=function(){return fA},r.LastValue=function(){return SA},r.Histogram=function(){return yA},r.ExponentialHistogram=function(){return zk},r.Default=function(){return Hk},r}();var cA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Up,e}(pr);var uA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Se.COUNTER:case Se.OBSERVABLE_COUNTER:case Se.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Ic(!0),e.NON_MONOTONIC_INSTANCE=new Ic(!1),e}(pr);var dA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new jp,e}(pr);var mA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Ac([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(pr);var ps=function(r){vo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new Ac(this._boundaries,this._recordMinMax)},e}(pr);var pA=function(r){vo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new Wp(this._maxSize,this._recordMinMax)},e}(pr);var gA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Se.COUNTER:case Se.UP_DOWN_COUNTER:case Se.OBSERVABLE_COUNTER:case Se.OBSERVABLE_UP_DOWN_COUNTER:return fA;case Se.GAUGE:case Se.OBSERVABLE_GAUGE:return SA;case Se.HISTOGRAM:return t.advice.explicitBucketBoundaries?new ps(t.advice.explicitBucketBoundaries):yA}return V.warn("Unable to recognize instrument type: "+t.type),hA},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(pr);var hA=new cA,fA=new uA,SA=new dA,yA=new mA,zk=new pA,Hk=new gA;var bA=function(r){return pr.Default()},EA=function(r){return xi.CUMULATIVE};var $p=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},qp=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},TA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Gk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},vA=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:bA,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:EA,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector}return r.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},r.prototype.onInitialized=function(){},r.prototype.collect=function(e){return $p(this,void 0,void 0,function(){var t,n,o,i,a,s;return qp(this,function(c){switch(c.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return[4,Promise.all(Gk([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],TA(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=TA.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(kp(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(kp(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return $p(this,void 0,void 0,function(){return qp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,Un(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return $p(this,void 0,void 0,function(){return qp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,Un(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Le();var Vk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Oc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Lc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Wk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},jk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Kp=function(r){Vk(e,r);function e(t){var n,o,i,a,s=r.call(this,{aggregationSelector:(n=t.exporter.selectAggregation)===null||n===void 0?void 0:n.bind(t.exporter),aggregationTemporalitySelector:(o=t.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(t.exporter),metricProducers:t.metricProducers})||this;if(t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<t.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=t.exporter,s}return e.prototype._runOnce=function(){return Oc(this,void 0,void 0,function(){var t;return Lc(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Un(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Dp?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(_c(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Oc(this,void 0,void 0,function(){var o,i,a,s,c,l;return Lc(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=V).error.apply(l,jk(["PeriodicExportingMetricReader: metrics collection errors"],Wk(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),V.debug("Error while resolving async portion of resource: ",s),_c(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,lA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==ms.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+c.error+")");return[2]}})})},e.prototype.onInitialized=function(){var t=this;this._interval=setInterval(function(){t._runOnce()},this._exportInterval),ds(this._interval)},e.prototype.onForceFlush=function(){return Oc(this,void 0,void 0,function(){return Lc(this,function(t){switch(t.label){case 0:return[4,this._runOnce()];case 1:return t.sent(),[4,this._exporter.forceFlush()];case 2:return t.sent(),[2]}})})},e.prototype.onShutdown=function(){return Oc(this,void 0,void 0,function(){return Lc(this,function(t){switch(t.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return t.sent(),[4,this._exporter.shutdown()];case 2:return t.sent(),[2]}})})},e}(vA);Le();Le();function Nc(){return"unknown_service:"+process.argv0}var Bn=function(){return Bn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Bn.apply(this,arguments)},$k=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},qk=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Kk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Dc=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[iA]=Nc(),e[cs]=Eo[cs],e[ls]=Eo[ls],e[us]=Eo[us],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return $k(this,void 0,void 0,function(){return qk(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Bn(Bn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=Kk(a,2),l=c[0],u=c[1];return Bn(Bn(Bn(Bn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var AA=function(){function r(){this._registeredViews=[]}return r.prototype.addView=function(e){this._registeredViews.push(e)},r.prototype.findViews=function(e,t){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,e)&&n._matchMeter(i.meterSelector,t)});return o},r.prototype._matchInstrument=function(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)},r.prototype._matchMeter=function(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))},r}();Le();var Ao=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),kc=function(){function r(e,t){this._writableMetricStorage=e,this._descriptor=t}return r.prototype._record=function(e,t,n){if(t===void 0&&(t={}),n===void 0&&(n=Ti.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,To(Date.now()))},r}();var wA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){this._record(t,n,o)},e}(kc);var CA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){V.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(kc);var RA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){this._record(t,n,o)},e}(kc);var xA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){V.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(kc);var Uc=function(){function r(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}return r.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this)},r.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this)},r}();var MA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Uc);var _A=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Uc);var PA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Uc);function gs(r){return r instanceof Uc}var IA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=Vr(e,Se.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new RA(o,n)},r.prototype.createHistogram=function(e,t){var n=Vr(e,Se.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new xA(o,n)},r.prototype.createCounter=function(e,t){var n=Vr(e,Se.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new CA(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=Vr(e,Se.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new wA(o,n)},r.prototype.createObservableGauge=function(e,t){var n=Vr(e,Se.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new _A(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=Vr(e,Se.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new MA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=Vr(e,Se.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new PA(n,o,this._meterSharedState.observableRegistry)},r.prototype.addBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)},r.prototype.removeBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)},r}();var Fc=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=Vr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var Yk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),OA=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Xk=function(){function r(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}return r.prototype.get=function(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)},r.prototype.getOrDefault=function(e,t){var n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);var o=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o),o},r.prototype.set=function(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)},r.prototype.has=function(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)},r.prototype.keys=function(){var e,t;return OA(this,function(n){switch(n.label){case 0:e=this._keyMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},r.prototype.entries=function(){var e,t;return OA(this,function(n){switch(n.label){case 0:e=this._valueMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[this._keyMap.get(t.value[0]),t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},Object.defineProperty(r.prototype,"size",{get:function(){return this._valueMap.size},enumerable:!1,configurable:!0}),r}();var wr=function(r){Yk(e,r);function e(){return r.call(this,Tc)||this}return e}(Xk);var Jk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Bc=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new wr,this._cumulativeMemoStorage=new wr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Tc(this._overflowAttributes)}return r.prototype.record=function(e,t,n,o){var i=this,a=this._activeCollectionStorage.get(t);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(t,a)}a?.record(e)},r.prototype.batchCumulate=function(e,t){var n=this;Array.from(e.entries()).forEach(function(o){var i=Jk(o,3),a=i[0],s=i[1],c=i[2],l=n._aggregator.createAccumulation(t);l?.record(s);var u=l;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}else if(n._cumulativeMemoStorage.size>=n._cardinalityLimit&&(a=n._overflowAttributes,c=n._overflowHashCode,n._cumulativeMemoStorage.has(a,c))){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}if(n._activeCollectionStorage.has(a,c)){var m=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(m,u)}n._cumulativeMemoStorage.set(a,l,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new wr,e},r}();var Yp=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},LA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zc=function(){function r(e,t){var n=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return r.prototype.buildMetrics=function(e,t,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),l=c.collectionTime;s=c.aggregationTemporality,s===xi.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,l)}else s=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=Qk(a);if(u.length!==0)return this._aggregator.toMetricData(t,s,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=Yp(o),a=i.next();!a.done;a=i.next()){var s=a.value,c=this._unreportedAccumulations.get(s);c===void 0&&(c=[],this._unreportedAccumulations.set(s,c)),c.push(e)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}},r.prototype._getMergedUnreportedAccumulations=function(e){var t,n,o=new wr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Yp(i),s=a.next();!s.done;s=a.next()){var c=s.value;o=r.merge(o,c,this._aggregator)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return o},r.merge=function(e,t,n){for(var o=e,i=t.entries(),a=i.next();a.done!==!0;){var s=LA(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),m=n.merge(d,l);o.set(c,m,u)}else o.set(c,l,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=Yp(e.keys()),s=a.next();!s.done;s=a.next()){var c=LA(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(m){o={error:m}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function Qk(r){return Array.from(r.entries())}var Zk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),eU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},NA=function(r){Zk(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Bc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new zc(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new wr;Array.from(t.entries()).forEach(function(a){var s=eU(a,2),c=s[0],l=s[1];i.set(o._attributesProcessor.process(c),l)}),this._deltaMetricStorage.batchCumulate(i,n)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Fc);Le();function Xp(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
27
+ `),globalThis.console=e}}var Ym=" ".repeat(6);import kN from"fetch-retry";import UN from"os";import GE,{multistream as FN}from"pino";import BN from"pino-pretty";import zN from"pino-std-serializers";var hi=new Map,HN=!0,VE="Log throttle exceeded",GN=100,VN=5e3,WN=kN(global.fetch,{retries:2,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),Xm=class r{consoleLogger;hostname;bindingAttributes;disableConsoleLogs;minLevelValue=20;logsInCurrentWindow=0;droppedLogsInWindow=!1;lastWindowStart=Date.now();site="https://ingest.us.signoz.cloud:443/logs/json";flushIntervalMs;maxBatchSize;buffer=[];flushTimer;constructor({bindings:e,hostname:t,disableConsoleLogs:n,flushIntervalMs:o,maxBatchSize:i}){this.hostname=t??UN.hostname(),this.disableConsoleLogs=n,this.bindingAttributes={...e,env:"production"},this.flushIntervalMs=o??5e3,this.maxBatchSize=i??10;let a={base:this.bindingAttributes,errorKey:"err",level:"debug"};this.consoleLogger=HN?GE(a):GE(a,FN([{stream:BN({colorize:!0})}]))}child(e){return new r({bindings:{...this.bindingAttributes,...e},hostname:this.hostname,disableConsoleLogs:this.disableConsoleLogs,flushIntervalMs:this.flushIntervalMs,maxBatchSize:this.maxBatchSize})}async flush(){await this.flushBuffer(),this.disableConsoleLogs||this.consoleLogger.flush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushBuffer()},this.flushIntervalMs))}async flushBuffer(){if(this.buffer.length===0)return;let e=this.buffer;this.buffer=[];try{let t=await WN(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:go(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===VE)return!0;let t=Date.now();return t-this.lastWindowStart>VN&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,VE),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<GN?(this.logsInCurrentWindow++,!0):(this.droppedLogsInWindow=!0,!1)}log(e,t,n,...o){try{this.logHelper(e,t,n,...o)}catch(i){this.consoleLogger.warn(`Failed to log to Signoz: ${i}`)}}logHelper(e,t,n,...o){if(Ha[e]<this.minLevelValue||!this.shouldAllowLog(n))return;typeof t=="string"&&!n&&(t={message:t}),typeof t=="object"&&t&&"err"in t&&t.err instanceof Error&&(t.err=zN.err(t.err));let i={...this.bindingAttributes,...t&&typeof t=="object"?t:{},...o.length>0?{args:o}:{}},a={host:this.hostname,env:this.bindingAttributes.env};this.disableConsoleLogs||this.consoleLogger[e](i,n,...o);let s={timestamp:Math.round(Date.now()*1e6),severity_text:e.toUpperCase(),resources:a,attributes:{},body:_b({message:n||"",...i})};this.buffer.push(s),this.buffer.length>=this.maxBatchSize?(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.flushBuffer()):this.scheduleFlush()}setApp(e){let t=this.bindingAttributes.app;this.bindingAttributes.app=e,hi.set("app",this),hi.delete(t)}debug(e,t,...n){this.log("debug",e,t,...n)}info(e,t,...n){this.log("info",e,t,...n)}warn(e,t,...n){this.log("warn",e,t,...n)}error(e,t,...n){this.log("error",e,t,...n)}bindings(){return this.bindingAttributes}addBinding(e,t){this.bindingAttributes[e]=t}setMinLevel(e){typeof e=="number"?(this.minLevelValue=e,this.consoleLogger.level=Pb[e]):(this.minLevelValue=Ha[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},fi=({app:r,hostname:e,disableConsoleLogs:t})=>(hi.has(r)||hi.set(r,new Xm({bindings:{app:r},hostname:e,disableConsoleLogs:t})),hi.get(r));async function WE(){await Promise.all([...hi.values()].map(r=>r.flush()))}import{hostname as jN}from"os";var cr=fi({app:"cli",hostname:jN(),disableConsoleLogs:!0}).child({cliVersion:"0.13.2"});function Jm(r){if(!r)return;r=r.toLowerCase();let e=jl.safeParse(r);if(e.success)return w.setMinLevel(e.data),e.data}function jE({results:r,startTime:e,entity:t,getDisplayLine:n,onFailed:o}){let i=r.filter(u=>u.status==="PASSED"&&u.quarantined),a=r.filter(u=>u.status==="PASSED"&&!u.quarantined),s=r.filter(u=>u.status==="FAILED"&&u.quarantined),c=r.filter(u=>u.status==="FAILED"&&!u.quarantined),l=r.filter(u=>u.status==="CANCELLED");return HE(()=>{if(c.forEach(u=>{w.log(""),o(u)}),c.length){w.log("");let u=c.length===1?"":"s";w.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{w.dimmed(n(d))})}if(l.length){w.log("");let u=l.length===1?"":"s";w.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{w.dimmed(n(d))})}if(a.length){w.log("");let u=a.length===1?"":"s";w.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{w.dimmed(n(d))})}if(s.length){w.log("");let u=s.length===1?"":"s";w.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{w.dimmed(n(d))})}if(i.length){w.log("");let u=i.length===1?"":"s";w.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{w.dimmed(n(d))})}w.log(""),w.dimmed(`Total time: ${Math.round((Date.now()-e)/1e3)}s`)}),{quarantinedPassed:i.length,passed:a.length,quarantinedFailed:s.length,failed:c.length,cancelled:l.length}}var ja=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Si.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Si.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Si.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Si.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Si.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Si.bgMagenta.white("RUNNING"),a=0):(w.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),$N||(i=`${i}`),w.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import qN from"fs";import{tmpdir as KN}from"os";import YN from"path";import{registry as $a}from"playwright-core/lib/server";import $E from"proper-lockfile";var qE=YN.join(KN(),"momenticBrowserInstallation");var Qm=["chrome","chromium","chrome-for-testing","ffmpeg"],XN={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},KE={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function YE(r){if(r==="Org Default")return!1;let e=KE[XN[r]??""]??"",t=$a.findExecutable(e);return!t||t.installType==="none"?!1:Zm(t)}function Zm(r){let e=r.executablePath();return qN.existsSync(e)}function JN(r,e){let t=KE[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=$a.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Zm(n)))return n}async function QN({browser:r,force:e}){let t=JN(r,e);if(!t){w.info(`Browser '${r}' is already installed, skipping...`);return}w.info(`Installing browser '${r}'...`);try{await $a.installDeps([t],!1),await $a.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){w.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=$a.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Zm(o);)w.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function ec({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Qm:Array.from(new Set(r));try{await $E.lock(qE,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){w.warn(`Failed to acquire lock to install browsers. Please ensure that any other process installing browsers completes within 5 minutes: ${i}. Continuing without installation...`);return}let o;try{for(let i of n)try{await QN({browser:i,force:e})}catch(a){o=a,w.error(`Failed to install the ${i} browser: ${a}`)}}finally{await $E.unlock(qE,{realpath:!1})}if(o)throw o}import{createServer as ZN}from"http";async function tc(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await rc(o))return o}w.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function rc(r){return new Promise((e,t)=>{let n=ZN();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(w.warn({err:o},"Unexpected error checking for open ports, continuing..."),n.close(),e(!0))}),n.once("listening",()=>{n.close(()=>{e(!0)})}),n.listen(r)})}import zte from"blocked-at";import Gte from"why-is-node-running";function XE(r){let e=r?.shardIndex??1,t=r?.shardCount??1;if(e<1)throw new Error("Shard index must be greater than 0.");if(t<1)throw new Error("Shard count must be greater than 0.");if(e>t)throw new Error("Shard index cannot be greater than shard count")}function eD(r,e,t,n){if(t>r.length&&(w.warn(`Shard count ${t} is greater than the number of tests ${r.length}! Some workers won't have any tests to run.`),t=Math.max(t,r.length),e>t))return[];let o=Math.floor((e-1)*(r.length/t)),i=Math.floor(e*(r.length/t));return(n?[...r].sort((s,c)=>n(s).localeCompare(n(c))):[...r].sort()).filter((s,c)=>c>=o&&c<i)}function JE(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?eD(e,t,n,o):e}import cF from"fs";import{tmpdir as uF,totalmem as dF}from"os";import mF from"path";import{execFile as tD}from"child_process";import rD from"path";function nD(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return rD.join(r,"platform-tools",e)}async function ht(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=nD(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{tD(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as xU}from"@limrun/api";import{execSync as MU}from"child_process";import ire,{multistream as sre}from"pino";import cre from"pino-pretty";var mre=5*1024,oD="...[truncated]",pre=Buffer.byteLength(oD,"utf8");import{PostHog as Are}from"posthog-node";var Ln=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var QE=r=>{let e=r.reason===void 0?new DOMException("This operation was aborted.","AbortError"):r.reason;return e instanceof Error?e:new DOMException(e,"AbortError")};function z(r,e){let{milliseconds:t,fallback:n,message:o,customTimers:i={setTimeout,clearTimeout}}=e,a;if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);return new Promise((s,c)=>{let l;if(e.signal){let{signal:m}=e;if(m.aborted)return c(QE(m));l=()=>c(QE(m)),m.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(m){c(m)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let m=o instanceof Error?o:new Ln(o??`Promise timed out after ${t}ms`);c(m)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(m=>{d(),s(m)}).catch(m=>{d(),c(m)})})}import{PostHog as Ore}from"posthog-node";import{execSync as iD}from"child_process";import yi from"os";import aD from"v8";var ZE,zr,tT=yi.platform(),sD=yi.cpus().map(r=>({model:r.model,speed:r.speed})).reduce((r,e)=>(r[e.model]={speed:e.speed},r.totalCores=(r.totalCores??0)+1,r),{}),eT=r=>{try{let e={},t=!1,n=lD(),o=cD(),i=`${Math.round(n.freePercentage*100)}%`;n.freePercentage<.05&&(Object.assign(e,process.memoryUsage()),t=!0);let a=`${o?Math.round(o.idle):"unknown"}%`;o&&o?.total>80&&(t=!0);let s=aD.getHeapStatistics(),c=s.used_heap_size,l=s.heap_size_limit;c/l>.9&&(t=!0),t?(r.warn({memory:n,cpu:o,heapStats:s,...e},"Critical resource usage metrics detected"),ho&&w.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function rT(r){if(!wr)return eT(r),{interval:setInterval(()=>eT(r),2e4),cpuMetadata:sD,platform:tT}}function lD(){let r=yi.totalmem(),e=tT==="darwin"?uD():(()=>{let n=yi.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function cD(){let r=yi.cpus(),e=Date.now(),t={measurementTime:e,user:0,nice:0,sys:0,idle:0,irq:0,total:0};for(let o of r)t.user+=o.times.user,t.nice+=o.times.nice,t.sys+=o.times.sys,t.idle+=o.times.idle,t.irq+=o.times.irq;if(t.total=t.user+t.nice+t.sys+t.idle+t.irq,!zr)return zr=t,null;let n={user:t.user-zr.user,nice:t.nice-zr.nice,sys:t.sys-zr.sys,idle:t.idle-zr.idle,irq:t.irq-zr.irq,total:t.total-zr.total};return ZE={measurementTime:e,intervalMs:e-zr.measurementTime,user:n.user/n.total*100,nice:n.nice/n.total*100,sys:n.sys/n.total*100,idle:n.idle/n.total*100,irq:n.irq/n.total*100,total:100-n.idle/n.total*100},zr=t,ZE}function uD(){try{let r=iD("/usr/bin/vm_stat",{encoding:"utf8",stdio:["pipe","pipe","ignore"]}),t=r.match(/page size of (\d+) bytes/)?.[1],n=t?Number.parseInt(t,10):4096,o=u=>{let m=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return m?Number.parseInt(m,10):0},i=o("Pages free"),a=o("Pages inactive"),s=o("Pages speculative"),c=i*n,l=(a+s)*n;return{availableMemory:c+l,rawFreeMemory:c,cachedMemory:l}}catch{let e=yi.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var nc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function dD(r){if(!r||r.length===0)return{};let e={};for(let t of r){let n=t.indexOf(":");if(n>-1){let o=t.slice(0,n).trim(),i=t.slice(n+1).trim();o&&(e[o]=i);continue}e[t]=!0}return e}function oc(r,e){let t=dD(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var _T="=",lc=";",dp=",";var PT=8192;var vi={};f_(vi,{getKeyPairs:()=>WD,parseKeyPairsIntoRecord:()=>jD,parsePairKeyValue:()=>IT,serializeKeyPairs:()=>VD});Le();var GD=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function VD(r){return r.reduce(function(e,t){var n=""+e+(e!==""?dp:"")+t;return n.length>PT?e:n},"")}function WD(r){return r.getAllEntries().map(function(e){var t=GD(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=lc+o.metadata.toString()),i})}function IT(r){var e=r.split(lc);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(_T);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=tp(e.join(lc))),{key:o,value:i,metadata:a}}}}}function jD(r){return typeof r!="string"||r.length===0?{}:r.split(dp).map(function(e){return IT(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Le();var cc;(function(r){r.AlwaysOff="always_off",r.AlwaysOn="always_on",r.ParentBasedAlwaysOff="parentbased_always_off",r.ParentBasedAlwaysOn="parentbased_always_on",r.ParentBasedTraceIdRatio="parentbased_traceidratio",r.TraceIdRatio="traceidratio"})(cc||(cc={}));var $D=",",qD=["OTEL_SDK_DISABLED"];function KD(r){return qD.indexOf(r)>-1}var YD=["OTEL_BSP_EXPORT_TIMEOUT","OTEL_BSP_MAX_EXPORT_BATCH_SIZE","OTEL_BSP_MAX_QUEUE_SIZE","OTEL_BSP_SCHEDULE_DELAY","OTEL_BLRP_EXPORT_TIMEOUT","OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","OTEL_BLRP_MAX_QUEUE_SIZE","OTEL_BLRP_SCHEDULE_DELAY","OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_SPAN_LINK_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_EXPORTER_OTLP_TIMEOUT","OTEL_EXPORTER_OTLP_TRACES_TIMEOUT","OTEL_EXPORTER_OTLP_METRICS_TIMEOUT","OTEL_EXPORTER_OTLP_LOGS_TIMEOUT","OTEL_EXPORTER_JAEGER_AGENT_PORT"];function XD(r){return YD.indexOf(r)>-1}var JD=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function QD(r){return JD.indexOf(r)>-1}var mp=1/0,pp=128,ZD=128,e0=128,gp={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:"",ECS_CONTAINER_METADATA_URI_V4:"",ECS_CONTAINER_METADATA_URI:"",HOSTNAME:"",KUBERNETES_SERVICE_HOST:"",NAMESPACE:"",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:"",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:"",OTEL_EXPORTER_JAEGER_PASSWORD:"",OTEL_EXPORTER_JAEGER_USER:"",OTEL_EXPORTER_OTLP_ENDPOINT:"",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:"",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:"",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:"",OTEL_EXPORTER_OTLP_HEADERS:"",OTEL_EXPORTER_OTLP_TRACES_HEADERS:"",OTEL_EXPORTER_OTLP_METRICS_HEADERS:"",OTEL_EXPORTER_OTLP_LOGS_HEADERS:"",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:"http://localhost:9411/api/v2/spans",OTEL_LOG_LEVEL:Be.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:["tracecontext","baggage"],OTEL_RESOURCE_ATTRIBUTES:"",OTEL_SERVICE_NAME:"",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:mp,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:pp,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:ZD,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:e0,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:cc.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:"",OTEL_LOGS_EXPORTER:"",OTEL_EXPORTER_OTLP_INSECURE:"",OTEL_EXPORTER_OTLP_TRACES_INSECURE:"",OTEL_EXPORTER_OTLP_METRICS_INSECURE:"",OTEL_EXPORTER_OTLP_LOGS_INSECURE:"",OTEL_EXPORTER_OTLP_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:"",OTEL_EXPORTER_OTLP_COMPRESSION:"",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:"",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:"",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:"",OTEL_EXPORTER_OTLP_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:"",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:"",OTEL_EXPORTER_OTLP_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:"http/protobuf",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:"cumulative"};function t0(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function r0(r,e,t,n,o){if(n===void 0&&(n=-1/0),o===void 0&&(o=1/0),typeof t[r]<"u"){var i=Number(t[r]);isNaN(i)||(i<n?e[r]=n:i>o?e[r]=o:e[r]=i)}}function n0(r,e,t,n){n===void 0&&(n=$D);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var o0={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function i0(r,e,t){var n=t[r];if(typeof n=="string"){var o=o0[n.toUpperCase()];o!=null&&(e[r]=o)}}function OT(r){var e={};for(var t in gp){var n=t;switch(n){case"OTEL_LOG_LEVEL":i0(n,e,r);break;default:if(KD(n))t0(n,e,r);else if(XD(n))r0(n,e,r);else if(QD(n))n0(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function Et(){var r=OT(process.env);return Object.assign({},gp,r)}function LT(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function uc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=LT(r.charCodeAt(n)),i=LT(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var NT="1.25.1";var a0="deployment.environment";var s0="process.runtime.name";var l0="service.name";var c0="service.instance.id";var u0="telemetry.sdk.name",d0="telemetry.sdk.language",m0="telemetry.sdk.version";var DT=a0;var kT=s0;var dc=l0;var UT=c0;var Za=u0,es=d0,ts=m0;var p0="nodejs";var FT=p0;var Ai,mc=(Ai={},Ai[Za]="opentelemetry",Ai[kT]="node",Ai[es]=FT,Ai[ts]=NT,Ai);var g0=9,h0=6,f0=Math.pow(10,h0),S0=Math.pow(10,g0);function BT(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*f0);return[t,n]}function zT(r){return r[0]*S0+r[1]}function rs(r){return r[0]*1e6+r[1]/1e3}var So;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(So||(So={}));var HT=function(){function r(){var e=this;this._promise=new Promise(function(t,n){e._resolve=t,e._reject=n})}return Object.defineProperty(r.prototype,"promise",{get:function(){return this._promise},enumerable:!1,configurable:!0}),r.prototype.resolve=function(e){this._resolve(e)},r.prototype.reject=function(e){this._reject(e)},r}();var y0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},b0=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},GT=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new HT}return Object.defineProperty(r.prototype,"isCalled",{get:function(){return this._isCalled},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"promise",{get:function(){return this._deferred.promise},enumerable:!1,configurable:!0}),r.prototype.call=function(){for(var e,t=this,n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];if(!this._isCalled){this._isCalled=!0;try{Promise.resolve((e=this._callback).call.apply(e,b0([this._that],y0(n),!1))).then(function(i){return t._deferred.resolve(i)},function(i){return t._deferred.reject(i)})}catch(i){this._deferred.reject(i)}}return this._deferred.promise},r}();var ur;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(ur||(ur={}));var _t;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(_t||(_t={}));var E0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}();var rie=function(r){E0(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function VT(r,e){for(var t=0,n=r.length-1;n-t>1;){var o=Math.trunc((n+t)/2);r[o]<=e?t=o:n=o-1}return r[n]<=e?n:r[t]<=e?t:-1}Le();var dr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(dr||(dr={}));var WT=function(){function r(){this.kind=dr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();var ue;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ue||(ue={}));var T0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function v0(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var hp=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=v0(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=VT(this._boundaries,e);this._current.buckets.counts[t+1]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var fp=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=dr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new hp(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new hp(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new hp(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.HISTOGRAM,dataPoints:n.map(function(i){var a=T0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var Sp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},yp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},bp=function(){function r(e,t,n,o){e===void 0&&(e=new A0),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var A0=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,yp([n,this._counts.length-t],Sp(this._counts.slice(t)),!1)),o.splice.apply(o,yp([0,t],Sp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(yp([],Sp(this._counts),!1))},r}();var jT=52,w0=2146435072,C0=1048575,Ep=1023,pc=-Ep+1,gc=Ep,ns=Math.pow(2,-1022);function hc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&w0)>>20;return n-Ep}function fc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&C0)*Math.pow(2,32);return o+n}function os(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function qT(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var R0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Nn=function(r){R0(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var YT=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ns)return this._minNormalLowerBoundaryIndex();var t=hc(e),n=this._rightShift(fc(e)-1,jT);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Nn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Nn("overflow: "+e+" is > maximum lower boundary: "+n);return os(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=pc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return gc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var XT=function(){function r(e){this._scale=e,this._scaleFactor=os(Math.LOG2E,e),this._inverseFactor=os(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=ns)return this._minNormalLowerBoundaryIndex()-1;if(fc(e)===0){var t=hc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Nn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ns;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Nn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return pc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(gc+1<<this._scale)-1},r}();var JT=-10,QT=20,x0=Array.from({length:31},function(r,e){return e>10?new XT(e-10):new YT(e-10)});function Tp(r){if(r>QT||r<JT)throw new Nn("expected scale >= "+JT+" && <= "+QT+", got: "+r);return x0[r+10]}var M0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Sc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),_0=20,P0=160,vp=2,I0=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=P0),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new bp),u===void 0&&(u=new bp),d===void 0&&(d=Tp(_0)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<vp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+vp),this._maxSize=vp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=qT(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Tp(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Sc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Sc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Sc(0,-1);var o=t-n;return new Sc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var ZT=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=dr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new I0(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=M0(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ue.GAUGE||e.type===ue.UP_DOWN_COUNTER||e.type===ue.OBSERVABLE_GAUGE||e.type===ue.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();var O0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Ap=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=BT(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var ev=function(){function r(){this.kind=dr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Ap(e)},r.prototype.merge=function(e,t){var n=rs(t.sampleTime)>=rs(e.sampleTime)?t:e;return new Ap(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=rs(t.sampleTime)>=rs(e.sampleTime)?t:e;return new Ap(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.GAUGE,dataPoints:n.map(function(i){var a=O0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var L0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},is=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var wp=function(){function r(e){this.monotonic=e,this.kind=dr.SUM}return r.prototype.createAccumulation=function(e){return new is(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new is(t.startTime,this.monotonic,o,t.reset):new is(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new is(t.startTime,this.monotonic,o,!0):new is(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:_t.SUM,dataPoints:n.map(function(i){var a=L0(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var yo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Gr=function(){function r(){}return r.Drop=function(){return lv},r.Sum=function(){return cv},r.LastValue=function(){return uv},r.Histogram=function(){return dv},r.ExponentialHistogram=function(){return N0},r.Default=function(){return D0},r}();var tv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new WT,e}(Gr);var rv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new wp(!0),e.NON_MONOTONIC_INSTANCE=new wp(!1),e}(Gr);var nv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new ev,e}(Gr);var ov=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new fp([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Gr);var iv=function(r){yo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new fp(this._boundaries,this._recordMinMax)},e}(Gr);var av=function(r){yo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new ZT(this._maxSize,this._recordMinMax)},e}(Gr);var sv=function(r){yo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ue.COUNTER:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return cv;case ue.GAUGE:case ue.OBSERVABLE_GAUGE:return uv;case ue.HISTOGRAM:return t.advice.explicitBucketBoundaries?new iv(t.advice.explicitBucketBoundaries):dv}return V.warn("Unable to recognize instrument type: "+t.type),lv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Gr);var lv=new tv,cv=new rv,uv=new nv,dv=new ov,N0=new av,D0=new sv;Le();function yc(){return"unknown_service:"+process.argv0}var Dn=function(){return Dn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Dn.apply(this,arguments)},k0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},U0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},F0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Cp=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[dc]=yc(),e[es]=mc[es],e[Za]=mc[Za],e[ts]=mc[ts],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return k0(this,void 0,void 0,function(){return U0(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Dn(Dn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=F0(a,2),l=c[0],u=c[1];return Dn(Dn(Dn(Dn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var bo;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(bo||(bo={}));Le();var B0=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},z0=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Rp=function(){return ur.CUMULATIVE},mv=function(r){switch(r){case ue.COUNTER:case ue.OBSERVABLE_COUNTER:case ue.GAUGE:case ue.HISTOGRAM:case ue.OBSERVABLE_GAUGE:return ur.DELTA;case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:return ur.CUMULATIVE}},pv=function(r){switch(r){case ue.COUNTER:case ue.HISTOGRAM:return ur.DELTA;case ue.GAUGE:case ue.UP_DOWN_COUNTER:case ue.OBSERVABLE_UP_DOWN_COUNTER:case ue.OBSERVABLE_COUNTER:case ue.OBSERVABLE_GAUGE:return ur.CUMULATIVE}};function H0(){var r=Et(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?Rp:e==="delta"?mv:e==="lowmemory"?pv:(V.warn("OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE is set to '"+r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE+"', but only 'cumulative' and 'delta' are allowed. Using default ('cumulative') instead."),Rp)}function G0(r){return r!=null?r===bo.DELTA?mv:r===bo.LOWMEMORY?pv:Rp:H0()}function V0(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Gr.Default()}}var gv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=V0(t),this._aggregationTemporalitySelector=G0(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return B0(this,void 0,void 0,function(){return z0(this,function(e){switch(e.label){case 0:return[4,this._otlpExporter.shutdown()];case 1:return e.sent(),[2]}})})},r.prototype.forceFlush=function(){return Promise.resolve()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r}();Le();Le();var W0=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},hv=1e4,fv=5,Sv=1e3,yv=5e3,bv=1.5;function as(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=W0(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):V.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function xp(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function Mp(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return V.warn("Could not parse export URL: '"+r+"'"),r}}function _p(r){return typeof r=="number"?r<=0?Pp(r,hv):r:j0()}function j0(){var r,e=Number((r=Et().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:Et().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?Pp(e,hv):e}function Pp(r,e){return V.warn("Timeout must be greater than 0",r),e}function Ev(r){var e=[429,502,503,504];return e.includes(r)}function Tv(r){if(r==null)return-1;var e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;var t=new Date(r).getTime()-Date.now();return t>=0?t:0}var vv=function(){function r(e){e===void 0&&(e={}),this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname=="string"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new GT(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=_p(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:So.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:So.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:So.SUCCESS})}).catch(function(n){t({code:So.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{V.debug("items to be sent",e),t.send(e,n,o)}catch(i){o(i)}})},r.prototype.shutdown=function(){return this._shutdownOnce.call()},r.prototype.forceFlush=function(){return Promise.all(this._sendingPromises).then(function(){})},r.prototype._shutdown=function(){return V.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Le();import*as Ip from"url";import*as Ec from"http";import*as Tc from"https";import*as Av from"zlib";import{Readable as q0}from"stream";var kn;(function(r){r.NONE="none",r.GZIP="gzip"})(kn||(kn={}));var $0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),wi=function(r){$0(e,r);function e(t,n,o){var i=r.call(this,t)||this;return i.name="OTLPExporterError",i.data=o,i.code=n,i}return e}(Error);var bc=function(){return bc=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},bc.apply(this,arguments)};function Op(r,e,t,n,o){var i=r.timeoutMillis,a=new Ip.URL(r.url),s=Number(process.versions.node.split(".")[0]),c,l,u=!1,d=setTimeout(function(){if(clearTimeout(c),u=!0,l.destroyed){var h=new wi("Request Timeout");o(h)}else s>=14?l.destroy():l.abort()},i),m={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:bc({"Content-Type":t},r.headers),agent:r.agent},p=a.protocol==="http:"?Ec.request:Tc.request,g=function(h,f){switch(h===void 0&&(h=fv),f===void 0&&(f=Sv),l=p(m,function(b){var C="";b.on("data",function(R){return C+=R}),b.on("aborted",function(){if(u){var R=new wi("Request Timeout");o(R)}}),b.on("end",function(){if(u===!1)if(b.statusCode&&b.statusCode<299)V.debug("statusCode: "+b.statusCode,C),n(),clearTimeout(d),clearTimeout(c);else if(b.statusCode&&Ev(b.statusCode)&&h>0){var R=void 0;f=bv*f,b.headers["retry-after"]?R=Tv(b.headers["retry-after"]):R=Math.round(Math.random()*(yv-f)+f),c=setTimeout(function(){g(h-1,f)},R)}else{var v=new wi(b.statusMessage,b.statusCode,C);o(v),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(b){if(u){var C=new wi("Request Timeout",b.code);o(C)}else o(b);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var b=new wi("Request Timeout");o(b)}clearTimeout(d),clearTimeout(c)}),r.compression){case kn.GZIP:{l.setHeader("Content-Encoding","gzip");var E=K0(e);E.on("error",o).pipe(Av.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function K0(r){var e=new q0;return e.push(r),e.push(null),e}function Lp(r){if(r.httpAgentOptions&&r.keepAlive===!1){V.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new Ip.URL(r.url),t=e.protocol==="http:"?Ec.Agent:Tc.Agent;return new t(bc({keepAlive:!0},r.httpAgentOptions))}catch(n){V.error("collector exporter failed to create http agent. err: "+n.message);return}}function Np(r){if(r)return r;var e=Et().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||Et().OTEL_EXPORTER_OTLP_COMPRESSION;return e===kn.GZIP?kn.GZIP:kn.NONE}Le();var Y0=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),vc=function(r){Y0(e,r);function e(t,n,o){t===void 0&&(t={});var i=r.call(this,t)||this;return i.DEFAULT_HEADERS={},i._contentType=o,t.metadata&&V.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,as(t.headers),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=Lp(t),i.compression=Np(t.compression),i._serializer=n,i}return e.prototype.onInit=function(t){},e.prototype.send=function(t,n,o){var i=this;if(this._shutdownOnce.isCalled){V.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;Op(i,(u=i._serializer.serializeRequest(t))!==null&&u!==void 0?u:new Uint8Array,i._contentType,c,l)}).then(n,o);this._sendingPromises.push(a);var s=function(){var c=i._sendingPromises.indexOf(a);i._sendingPromises.splice(c,1)};a.then(s,s)},e.prototype.onShutdown=function(){},e}(vv);function Cv(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function X0(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function Rv(r){var e=Cv(r);return X0(e)}function J0(r){var e=Cv(r);return e.toString()}var Q0=typeof BigInt<"u"?J0:zT;function wv(r){return r}function xv(r){if(r!==void 0)return uc(r)}var Z0={encodeHrTime:Rv,encodeSpanContext:uc,encodeOptionalSpanContext:xv};function Mv(r){var e,t;if(r===void 0)return Z0;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?Rv:Q0,encodeSpanContext:o?wv:uc,encodeOptionalSpanContext:o?wv:xv}}var ek=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function _v(r){return{name:r.name,version:r.version}}function Ci(r){return Object.keys(r).map(function(e){return Pv(e,r[e])})}function Pv(r,e){return{key:r,value:Iv(e)}}function Iv(r){var e=typeof r;return e==="string"?{stringValue:r}:e==="number"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e==="boolean"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(Iv)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=ek(t,2),o=n[0],i=n[1];return Pv(o,i)})}}:{}}function Ov(r){return{attributes:Ci(r.attributes),droppedAttributesCount:0}}Le();function Nv(r,e){var t=Mv(e);return{resource:Ov(r.resource),schemaUrl:void 0,scopeMetrics:tk(r.scopeMetrics,t)}}function tk(r,e){return Array.from(r.map(function(t){return{scope:_v(t.scope),metrics:t.metrics.map(function(n){return rk(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function rk(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=ak(r.aggregationTemporality);switch(r.dataPointType){case _t.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:Lv(r,e)};break;case _t.GAUGE:t.gauge={dataPoints:Lv(r,e)};break;case _t.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:ok(r,e)};break;case _t.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:ik(r,e)};break}return t}function nk(r,e,t){var n={attributes:Ci(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Kt.INT:n.asInt=r.value;break;case Kt.DOUBLE:n.asDouble=r.value;break}return n}function Lv(r,e){return r.dataPoints.map(function(t){return nk(t,r.descriptor.valueType,e)})}function ok(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function ik(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Ci(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function ak(r){switch(r){case ur.DELTA:return 1;case ur.CUMULATIVE:return 2}}function Dv(r,e){return{resourceMetrics:r.map(function(t){return Nv(t,e)})}}var Dp={serializeRequest:function(r){var e=Dv(r,{useLongBits:!1}),t=new TextEncoder;return t.encode(JSON.stringify(e))},deserializeResponse:function(r){var e=new TextDecoder;return JSON.parse(e.decode(r))}};var kv="0.52.1";var Uv=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ri=function(){return Ri=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Ri.apply(this,arguments)},Fv="v1/metrics",sk="http://localhost:4318/"+Fv,lk={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+kv},ck=function(r){Uv(e,r);function e(t){var n=r.call(this,t,Dp,"application/json")||this;return n.headers=Ri(Ri(Ri(Ri({},n.headers),lk),vi.parseKeyPairsIntoRecord(Et().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),as(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?Mp(Et().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):Et().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?xp(Et().OTEL_EXPORTER_OTLP_ENDPOINT,Fv):sk},e}(vc),Bv=function(r){Uv(e,r);function e(t){return r.call(this,new ck(t),t)||this}return e}(gv);var xi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(xi||(xi={}));var Vr;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Vr||(Vr={}));Le();var uk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),zv=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Hv=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},dk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},mk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},pk=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function Gv(r){return r!=null}function Ac(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function Vv(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var kp=function(r){uk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Un(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new kp("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function Wv(r){return zv(this,void 0,void 0,function(){var e=this;return Hv(this,function(t){return[2,Promise.all(r.map(function(n){return zv(e,void 0,void 0,function(){var o,i;return Hv(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:"fulfilled",value:o}];case 2:return i=a.sent(),[2,{status:"rejected",reason:i}];case 3:return[2]}})})}))]})})}function jv(r){return r.status==="rejected"}function Up(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,mk([],dk(e(n)),!1))}),t}function $v(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=pk(r),i=o.next();!i.done;i=o.next()){var a=i.value;if(!e.has(a))return!1}}catch(s){t={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0}function qv(r,e){for(var t=0,n=r.length-1,o=r.length;n>=t;){var i=t+Math.trunc((n-t)/2);r[i]<e?t=i+1:(o=i,n=i-1)}return o}function Kv(r,e){return r.toLowerCase()===e.toLowerCase()}Le();var mr;(function(r){r[r.DROP=0]="DROP",r[r.SUM=1]="SUM",r[r.LAST_VALUE=2]="LAST_VALUE",r[r.HISTOGRAM=3]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=4]="EXPONENTIAL_HISTOGRAM"})(mr||(mr={}));var Fp=function(){function r(){this.kind=mr.DROP}return r.prototype.createAccumulation=function(){},r.prototype.merge=function(e,t){},r.prototype.diff=function(e,t){},r.prototype.toMetricData=function(e,t,n,o){},r}();Le();var ye;(function(r){r.COUNTER="COUNTER",r.GAUGE="GAUGE",r.HISTOGRAM="HISTOGRAM",r.UP_DOWN_COUNTER="UP_DOWN_COUNTER",r.OBSERVABLE_COUNTER="OBSERVABLE_COUNTER",r.OBSERVABLE_GAUGE="OBSERVABLE_GAUGE",r.OBSERVABLE_UP_DOWN_COUNTER="OBSERVABLE_UP_DOWN_COUNTER"})(ye||(ye={}));function Wr(r,e,t){var n,o,i,a;return hk(r)||V.warn('Invalid metric name: "'+r+'". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:"",unit:(o=t?.unit)!==null&&o!==void 0?o:"",valueType:(i=t?.valueType)!==null&&i!==void 0?i:Kt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function Yv(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}function Xv(r,e){return Kv(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var gk=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function hk(r){return r.match(gk)!=null}var fk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i};function Sk(r){var e=r.map(function(){return 0});return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var wc=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=Sk(t)),this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=o}return r.prototype.record=function(e){if(!Number.isNaN(e)){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);var t=qv(this._boundaries,e);this._current.buckets.counts[t]+=1}},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Cc=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=mr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new wc(e,this._boundaries,this._recordMinMax)},r.prototype.merge=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=i[c]+a[c];var l=1/0,u=-1/0;return this._recordMinMax&&(n.hasMinMax&&o.hasMinMax?(l=Math.min(n.min,o.min),u=Math.max(n.max,o.max)):n.hasMinMax?(l=n.min,u=n.max):o.hasMinMax&&(l=o.min,u=o.max)),new wc(e.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:n.count+o.count,sum:n.sum+o.sum,hasMinMax:this._recordMinMax&&(n.hasMinMax||o.hasMinMax),min:l,max:u})},r.prototype.diff=function(e,t){for(var n=e.toPointValue(),o=t.toPointValue(),i=n.buckets.counts,a=o.buckets.counts,s=new Array(i.length),c=0;c<i.length;c++)s[c]=a[c]-i[c];return new wc(t.startTime,n.buckets.boundaries,this._recordMinMax,{buckets:{boundaries:n.buckets.boundaries,counts:s},count:o.count-n.count,sum:o.sum-n.sum,hasMinMax:!1,min:1/0,max:-1/0})},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.HISTOGRAM,dataPoints:n.map(function(i){var a=fk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ye.GAUGE||e.type===ye.UP_DOWN_COUNTER||e.type===ye.OBSERVABLE_GAUGE||e.type===ye.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,buckets:l.buckets,count:l.count}}})}},r}();Le();var Bp=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zp=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Hp=function(){function r(e,t,n,o){e===void 0&&(e=new yk),t===void 0&&(t=0),n===void 0&&(n=0),o===void 0&&(o=0),this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=o}return Object.defineProperty(r.prototype,"offset",{get:function(){return this.indexStart},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"length",{get:function(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1},enumerable:!1,configurable:!0}),r.prototype.counts=function(){var e=this;return Array.from({length:this.length},function(t,n){return e.at(n)})},r.prototype.at=function(e){var t=this.indexBase-this.indexStart;return e<t&&(e+=this.backing.length),e-=t,this.backing.countAt(e)},r.prototype.incrementBucket=function(e,t){this.backing.increment(e,t)},r.prototype.decrementBucket=function(e,t){this.backing.decrement(e,t)},r.prototype.trim=function(){for(var e=0;e<this.length;e++)if(this.at(e)!==0){this.indexStart+=e;break}else if(e===this.length-1){this.indexStart=this.indexEnd=this.indexBase=0;return}for(var e=this.length-1;e>=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()},r.prototype.downscale=function(e){this._rotate();for(var t=1+this.indexEnd-this.indexStart,n=1<<e,o=0,i=0,a=this.indexStart;a<=this.indexEnd;){var s=a%n;s<0&&(s+=n);for(var c=s;c<n&&o<t;c++)this._relocateBucket(i,o),o++,a++;i++}this.indexStart>>=e,this.indexEnd>>=e,this.indexBase=this.indexStart},r.prototype.clone=function(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)},r.prototype._rotate=function(){var e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)},r.prototype._relocateBucket=function(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))},r}();var yk=function(){function r(e){e===void 0&&(e=[0]),this._counts=e}return Object.defineProperty(r.prototype,"length",{get:function(){return this._counts.length},enumerable:!1,configurable:!0}),r.prototype.countAt=function(e){return this._counts[e]},r.prototype.growTo=function(e,t,n){var o=new Array(e).fill(0);o.splice.apply(o,zp([n,this._counts.length-t],Bp(this._counts.slice(t)),!1)),o.splice.apply(o,zp([0,t],Bp(this._counts.slice(0,t)),!1)),this._counts=o},r.prototype.reverse=function(e,t){for(var n=Math.floor((e+t)/2)-e,o=0;o<n;o++){var i=this._counts[e+o];this._counts[e+o]=this._counts[t-o-1],this._counts[t-o-1]=i}},r.prototype.emptyBucket=function(e){var t=this._counts[e];return this._counts[e]=0,t},r.prototype.increment=function(e,t){this._counts[e]+=t},r.prototype.decrement=function(e,t){this._counts[e]>=t?this._counts[e]-=t:this._counts[e]=0},r.prototype.clone=function(){return new r(zp([],Bp(this._counts),!1))},r}();var Jv=52,bk=2146435072,Ek=1048575,Gp=1023,Rc=-Gp+1,xc=Gp,ss=Math.pow(2,-1022);function Mc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&bk)>>20;return n-Gp}function _c(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&Ek)*Math.pow(2,32);return o+n}function ls(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Zv(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var Tk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fn=function(r){Tk(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var tA=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<ss)return this._minNormalLowerBoundaryIndex();var t=Mc(e),n=this._rightShift(_c(e)-1,Jv);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Fn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Fn("overflow: "+e+" is > maximum lower boundary: "+n);return ls(1,e<<this._shift)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._shift===0?0:-this._shift},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){var e=Rc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return xc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var rA=function(){function r(e){this._scale=e,this._scaleFactor=ls(Math.LOG2E,e),this._inverseFactor=ls(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=ss)return this._minNormalLowerBoundaryIndex()-1;if(_c(e)===0){var t=Mc(e);return(t<<this._scale)-1}var n=Math.floor(Math.log(e)*this._scaleFactor),o=this._maxNormalLowerBoundaryIndex();return n>=o?o:n},r.prototype.lowerBoundary=function(e){var t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1<<this._scale))/this._scaleFactor);throw new Fn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return ss;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Fn("overflow: "+e+" is < minimum lower boundary: "+n)}return Math.exp(e*this._inverseFactor)},Object.defineProperty(r.prototype,"scale",{get:function(){return this._scale},enumerable:!1,configurable:!0}),r.prototype._minNormalLowerBoundaryIndex=function(){return Rc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(xc+1<<this._scale)-1},r}();var nA=-10,oA=20,vk=Array.from({length:31},function(r,e){return e>10?new rA(e-10):new tA(e-10)});function Vp(r){if(r>oA||r<nA)throw new Fn("expected scale >= "+nA+" && <= "+oA+", got: "+r);return vk[r+10]}var Ak=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pc=function(){function r(e,t){this.low=e,this.high=t}return r.combine=function(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))},r}(),wk=20,Ck=160,Wp=2,iA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=Ck),n===void 0&&(n=!0),o===void 0&&(o=0),i===void 0&&(i=0),a===void 0&&(a=0),s===void 0&&(s=Number.POSITIVE_INFINITY),c===void 0&&(c=Number.NEGATIVE_INFINITY),l===void 0&&(l=new Hp),u===void 0&&(u=new Hp),d===void 0&&(d=Vp(wk)),this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=o,this._count=i,this._zeroCount=a,this._min=s,this._max=c,this._positive=l,this._negative=u,this._mapping=d,this._maxSize<Wp&&(V.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+Wp),this._maxSize=Wp)}return r.prototype.record=function(e){this.updateByIncrement(e,1)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return{hasMinMax:this._recordMinMax,min:this.min,max:this.max,sum:this.sum,positive:{offset:this.positive.offset,bucketCounts:this.positive.counts()},negative:{offset:this.negative.offset,bucketCounts:this.negative.counts()},count:this.count,scale:this.scale,zeroCount:this.zeroCount}},Object.defineProperty(r.prototype,"sum",{get:function(){return this._sum},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"min",{get:function(){return this._min},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"max",{get:function(){return this._max},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"count",{get:function(){return this._count},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"zeroCount",{get:function(){return this._zeroCount},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"scale",{get:function(){return this._count===this._zeroCount?0:this._mapping.scale},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"positive",{get:function(){return this._positive},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"negative",{get:function(){return this._negative},enumerable:!1,configurable:!0}),r.prototype.updateByIncrement=function(e,t){if(!Number.isNaN(e)){if(e>this._max&&(this._max=e),e<this._min&&(this._min=e),this._count+=t,e===0){this._zeroCount+=t;return}this._sum+=e*t,e>0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}},r.prototype.merge=function(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.min<this.min&&(this._min=e.min),e.max>this.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)},r.prototype.diff=function(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;var t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)},r.prototype.clone=function(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)},r.prototype._updateBuckets=function(e,t,n){var o=this._mapping.mapToIndex(t),i=!1,a=0,s=0;if(e.length===0?(e.indexStart=o,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):o<e.indexStart&&e.indexEnd-o>=this._maxSize?(i=!0,s=o,a=e.indexEnd):o>e.indexEnd&&o-e.indexStart>=this._maxSize&&(i=!0,s=e.indexStart,a=o),i){var c=this._changeScale(a,s);this._downscale(c),o=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,o,n)},r.prototype._incrementIndexBy=function(e,t,n){if(n!==0){if(e.length===0&&(e.indexStart=e.indexEnd=e.indexBase=t),t<e.indexStart){var o=e.indexEnd-t;o>=e.backing.length&&this._grow(e,o+1),e.indexStart=t}else if(t>e.indexEnd){var o=t-e.indexStart;o>=e.backing.length&&this._grow(e,o+1),e.indexEnd=t}var i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}},r.prototype._grow=function(e,t){var n=e.backing.length,o=e.indexBase-e.indexStart,i=n-o,a=Zv(t);a>this._maxSize&&(a=this._maxSize);var s=a-o;e.backing.growTo(a,i,s)},r.prototype._changeScale=function(e,t){for(var n=0;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n},r.prototype._downscale=function(e){if(e!==0){if(e<0)throw new Error("impossible change of scale: "+this.scale);var t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=Vp(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=Pc.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=Pc.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(o.high,o.low))},r.prototype._highLowAtScale=function(e,t,n){if(e.length===0)return new Pc(0,-1);var o=t-n;return new Pc(e.indexStart>>o,e.indexEnd>>o)},r.prototype._mergeBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++)this._incrementIndexBy(e,i+s>>a,n.at(s))},r.prototype._diffBuckets=function(e,t,n,o){for(var i=n.offset,a=t.scale-o,s=0;s<n.length;s++){var c=i+s>>a,l=c-e.indexBase;l<0&&(l+=e.backing.length),e.decrementBucket(l,n.at(s))}e.trim()},r}();var jp=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=mr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new iA(e,this._maxSize,this._recordMinMax)},r.prototype.merge=function(e,t){var n=t.clone();return n.merge(e),n},r.prototype.diff=function(e,t){var n=t.clone();return n.diff(e),n},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Ak(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===ye.GAUGE||e.type===ye.UP_DOWN_COUNTER||e.type===ye.OBSERVABLE_GAUGE||e.type===ye.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:c.startTime,endTime:o,value:{min:l.hasMinMax?l.min:void 0,max:l.hasMinMax?l.max:void 0,sum:u?void 0:l.sum,positive:{offset:l.positive.offset,bucketCounts:l.positive.bucketCounts},negative:{offset:l.negative.offset,bucketCounts:l.negative.bucketCounts},count:l.count,scale:l.scale,zeroCount:l.zeroCount}}})}},r}();Le();var Rk=rp("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function aA(r){return r.setValue(Rk,!0)}Le();function sA(){return function(r){V.error(xk(r))}}function xk(r){return typeof r=="string"?r:JSON.stringify(Mk(r))}function Mk(r){for(var e={},t=r;t!==null;)Object.getOwnPropertyNames(t).forEach(function(n){if(!e[n]){var o=t[n];o&&(e[n]=String(o))}}),t=Object.getPrototypeOf(t);return e}var _k=sA();function Ic(r){try{_k(r)}catch{}}var lA="1.30.1";var Pk="process.runtime.name";var Ik="service.name";var Ok="telemetry.sdk.name",Lk="telemetry.sdk.language",Nk="telemetry.sdk.version";var cA=Pk;var uA=Ik;var cs=Ok,us=Lk,ds=Nk;var Dk="nodejs";var dA=Dk;var Mi,Eo=(Mi={},Mi[cs]="opentelemetry",Mi[cA]="node",Mi[us]=dA,Mi[ds]=lA,Mi);function ms(r){r.unref()}var Gk=9,Vk=6,Wk=Math.pow(10,Vk),ale=Math.pow(10,Gk);function To(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*Wk);return[t,n]}function _i(r){return r[0]*1e6+r[1]/1e3}var ps;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(ps||(ps={}));Le();function mA(r,e){return new Promise(function(t){Ti.with(aA(Ti.active()),function(){r.export(e,function(n){t(n)})})})}var pA={_export:mA};var jk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Oc=function(){function r(e,t,n){t===void 0&&(t=0),n===void 0&&(n=[0,0]),this.startTime=e,this._current=t,this.sampleTime=n}return r.prototype.record=function(e){this._current=e,this.sampleTime=To(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var $p=function(){function r(){this.kind=mr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new Oc(e)},r.prototype.merge=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Oc(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=_i(t.sampleTime)>=_i(e.sampleTime)?t:e;return new Oc(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.GAUGE,dataPoints:n.map(function(i){var a=jk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var $k=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Pi=function(){function r(e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1),this.startTime=e,this.monotonic=t,this._current=n,this.reset=o}return r.prototype.record=function(e){this.monotonic&&e<0||(this._current+=e)},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Lc=function(){function r(e){this.monotonic=e,this.kind=mr.SUM}return r.prototype.createAccumulation=function(e){return new Pi(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new Pi(t.startTime,this.monotonic,o,t.reset):new Pi(e.startTime,this.monotonic,n+o)},r.prototype.diff=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return this.monotonic&&n>o?new Pi(t.startTime,this.monotonic,o,!0):new Pi(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Vr.SUM,dataPoints:n.map(function(i){var a=$k(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var vo=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),pr=function(){function r(){}return r.Drop=function(){return EA},r.Sum=function(){return TA},r.LastValue=function(){return vA},r.Histogram=function(){return AA},r.ExponentialHistogram=function(){return qk},r.Default=function(){return Kk},r}();var gA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Fp,e}(pr);var hA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case ye.COUNTER:case ye.OBSERVABLE_COUNTER:case ye.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new Lc(!0),e.NON_MONOTONIC_INSTANCE=new Lc(!1),e}(pr);var fA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new $p,e}(pr);var SA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){return e.DEFAULT_INSTANCE},e.DEFAULT_INSTANCE=new Cc([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(pr);var gs=function(r){vo(e,r);function e(t,n){n===void 0&&(n=!0);var o=r.call(this)||this;if(o._recordMinMax=n,t==null)throw new Error("ExplicitBucketHistogramAggregation should be created with explicit boundaries, if a single bucket histogram is required, please pass an empty array");t=t.concat(),t=t.sort(function(s,c){return s-c});var i=t.lastIndexOf(-1/0),a=t.indexOf(1/0);return a===-1&&(a=void 0),o._boundaries=t.slice(i+1,a),o}return e.prototype.createAggregator=function(t){return new Cc(this._boundaries,this._recordMinMax)},e}(pr);var yA=function(r){vo(e,r);function e(t,n){t===void 0&&(t=160),n===void 0&&(n=!0);var o=r.call(this)||this;return o._maxSize=t,o._recordMinMax=n,o}return e.prototype.createAggregator=function(t){return new jp(this._maxSize,this._recordMinMax)},e}(pr);var bA=function(r){vo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case ye.COUNTER:case ye.UP_DOWN_COUNTER:case ye.OBSERVABLE_COUNTER:case ye.OBSERVABLE_UP_DOWN_COUNTER:return TA;case ye.GAUGE:case ye.OBSERVABLE_GAUGE:return vA;case ye.HISTOGRAM:return t.advice.explicitBucketBoundaries?new gs(t.advice.explicitBucketBoundaries):AA}return V.warn("Unable to recognize instrument type: "+t.type),EA},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(pr);var EA=new gA,TA=new hA,vA=new fA,AA=new SA,qk=new yA,Kk=new bA;var wA=function(r){return pr.Default()},CA=function(r){return xi.CUMULATIVE};var qp=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Kp=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},RA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Yk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},xA=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:wA,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:CA,this._metricProducers=(o=e?.metricProducers)!==null&&o!==void 0?o:[],this._cardinalitySelector=e?.cardinalitySelector}return r.prototype.setMetricProducer=function(e){if(this._sdkMetricProducer)throw new Error("MetricReader can not be bound to a MeterProvider again.");this._sdkMetricProducer=e,this.onInitialized()},r.prototype.selectAggregation=function(e){return this._aggregationSelector(e)},r.prototype.selectAggregationTemporality=function(e){return this._aggregationTemporalitySelector(e)},r.prototype.selectCardinalityLimit=function(e){return this._cardinalitySelector?this._cardinalitySelector(e):2e3},r.prototype.onInitialized=function(){},r.prototype.collect=function(e){return qp(this,void 0,void 0,function(){var t,n,o,i,a,s;return Kp(this,function(c){switch(c.label){case 0:if(this._sdkMetricProducer===void 0)throw new Error("MetricReader is not bound to a MetricProducer");if(this._shutdown)throw new Error("MetricReader is shutdown");return[4,Promise.all(Yk([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],RA(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=RA.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(Up(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(Up(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return qp(this,void 0,void 0,function(){return Kp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.error("Cannot call shutdown twice."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onShutdown()];case 1:return t.sent(),[3,4];case 2:return[4,Un(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return qp(this,void 0,void 0,function(){return Kp(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("Cannot forceFlush on already shutdown MetricReader."),[2]):e?.timeoutMillis!=null?[3,2]:[4,this.onForceFlush()];case 1:return t.sent(),[2];case 2:return[4,Un(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Le();var Xk=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Nc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Dc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},Jk=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Qk=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},Yp=function(r){Xk(e,r);function e(t){var n,o,i,a,s=r.call(this,{aggregationSelector:(n=t.exporter.selectAggregation)===null||n===void 0?void 0:n.bind(t.exporter),aggregationTemporalitySelector:(o=t.exporter.selectAggregationTemporality)===null||o===void 0?void 0:o.bind(t.exporter),metricProducers:t.metricProducers})||this;if(t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<=0)throw Error("exportIntervalMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportTimeoutMillis<=0)throw Error("exportTimeoutMillis must be greater than 0");if(t.exportTimeoutMillis!==void 0&&t.exportIntervalMillis!==void 0&&t.exportIntervalMillis<t.exportTimeoutMillis)throw Error("exportIntervalMillis must be greater than or equal to exportTimeoutMillis");return s._exportInterval=(i=t.exportIntervalMillis)!==null&&i!==void 0?i:6e4,s._exportTimeout=(a=t.exportTimeoutMillis)!==null&&a!==void 0?a:3e4,s._exporter=t.exporter,s}return e.prototype._runOnce=function(){return Nc(this,void 0,void 0,function(){var t;return Dc(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,Un(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof kp?(V.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(Ic(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return Nc(this,void 0,void 0,function(){var o,i,a,s,c,l;return Dc(this,function(u){switch(u.label){case 0:return[4,this.collect({timeoutMillis:this._exportTimeout})];case 1:if(o=u.sent(),i=o.resourceMetrics,a=o.errors,a.length>0&&(l=V).error.apply(l,Qk(["PeriodicExportingMetricReader: metrics collection errors"],Jk(a),!1)),!i.resource.asyncAttributesPending)return[3,5];u.label=2;case 2:return u.trys.push([2,4,,5]),[4,(n=(t=i.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t)];case 3:return u.sent(),[3,5];case 4:return s=u.sent(),V.debug("Error while resolving async portion of resource: ",s),Ic(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,pA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==ps.SUCCESS)throw new Error("PeriodicExportingMetricReader: metrics export failed (error "+c.error+")");return[2]}})})},e.prototype.onInitialized=function(){var t=this;this._interval=setInterval(function(){t._runOnce()},this._exportInterval),ms(this._interval)},e.prototype.onForceFlush=function(){return Nc(this,void 0,void 0,function(){return Dc(this,function(t){switch(t.label){case 0:return[4,this._runOnce()];case 1:return t.sent(),[4,this._exporter.forceFlush()];case 2:return t.sent(),[2]}})})},e.prototype.onShutdown=function(){return Nc(this,void 0,void 0,function(){return Dc(this,function(t){switch(t.label){case 0:return this._interval&&clearInterval(this._interval),[4,this.onForceFlush()];case 1:return t.sent(),[4,this._exporter.shutdown()];case 2:return t.sent(),[2]}})})},e}(xA);Le();Le();function kc(){return"unknown_service:"+process.argv0}var Bn=function(){return Bn=Object.assign||function(r){for(var e,t=1,n=arguments.length;t<n;t++){e=arguments[t];for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o])}return r},Bn.apply(this,arguments)},Zk=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},eU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},tU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Uc=function(){function r(e,t){var n=this,o;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=t?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return V.debug("a resource's async attributes promise rejected: %s",i),n.asyncAttributesPending=!1,{}})}return r.empty=function(){return r.EMPTY},r.default=function(){var e;return new r((e={},e[uA]=kc(),e[us]=Eo[us],e[cs]=Eo[cs],e[ds]=Eo[ds],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&V.error("Accessing resource attributes before async attributes settled"),(e=this._attributes)!==null&&e!==void 0?e:{}},enumerable:!1,configurable:!0}),r.prototype.waitForAsyncAttributes=function(){return Zk(this,void 0,void 0,function(){return eU(this,function(e){switch(e.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})})},r.prototype.merge=function(e){var t=this,n;if(!e)return this;var o=Bn(Bn({},this._syncAttributes),(n=e._syncAttributes)!==null&&n!==void 0?n:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(o);var i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(function(a){var s,c=tU(a,2),l=c[0],u=c[1];return Bn(Bn(Bn(Bn({},t._syncAttributes),l),(s=e._syncAttributes)!==null&&s!==void 0?s:e.attributes),u)});return new r(o,i)},r.EMPTY=new r({}),r}();var MA=function(){function r(){this._registeredViews=[]}return r.prototype.addView=function(e){this._registeredViews.push(e)},r.prototype.findViews=function(e,t){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,e)&&n._matchMeter(i.meterSelector,t)});return o},r.prototype._matchInstrument=function(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)},r.prototype._matchMeter=function(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))},r}();Le();var Ao=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Fc=function(){function r(e,t){this._writableMetricStorage=e,this._descriptor=t}return r.prototype._record=function(e,t,n){if(t===void 0&&(t={}),n===void 0&&(n=Ti.active()),typeof e!="number"){V.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._descriptor.name+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,To(Date.now()))},r}();var _A=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){this._record(t,n,o)},e}(Fc);var PA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){V.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Fc);var IA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){this._record(t,n,o)},e}(Fc);var OA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){V.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(Fc);var Bc=function(){function r(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}return r.prototype.addCallback=function(e){this._observableRegistry.addCallback(e,this)},r.prototype.removeCallback=function(e){this._observableRegistry.removeCallback(e,this)},r}();var LA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);var NA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);var DA=function(r){Ao(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Bc);function hs(r){return r instanceof Bc}var kA=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=Wr(e,ye.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new IA(o,n)},r.prototype.createHistogram=function(e,t){var n=Wr(e,ye.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new OA(o,n)},r.prototype.createCounter=function(e,t){var n=Wr(e,ye.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new PA(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=Wr(e,ye.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new _A(o,n)},r.prototype.createObservableGauge=function(e,t){var n=Wr(e,ye.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new NA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=Wr(e,ye.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new LA(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=Wr(e,ye.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new DA(n,o,this._meterSharedState.observableRegistry)},r.prototype.addBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)},r.prototype.removeBatchObservableCallback=function(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)},r}();var zc=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=Wr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var rU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),UA=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},nU=function(){function r(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}return r.prototype.get=function(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)},r.prototype.getOrDefault=function(e,t){var n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);var o=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,o),o},r.prototype.set=function(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)},r.prototype.has=function(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)},r.prototype.keys=function(){var e,t;return UA(this,function(n){switch(n.label){case 0:e=this._keyMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},r.prototype.entries=function(){var e,t;return UA(this,function(n){switch(n.label){case 0:e=this._valueMap.entries(),t=e.next(),n.label=1;case 1:return t.done===!0?[3,3]:[4,[this._keyMap.get(t.value[0]),t.value[1],t.value[0]]];case 2:return n.sent(),t=e.next(),[3,1];case 3:return[2]}})},Object.defineProperty(r.prototype,"size",{get:function(){return this._valueMap.size},enumerable:!1,configurable:!0}),r}();var Cr=function(r){rU(e,r);function e(){return r.call(this,Ac)||this}return e}(nU);var oU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Hc=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Cr,this._cumulativeMemoStorage=new Cr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=Ac(this._overflowAttributes)}return r.prototype.record=function(e,t,n,o){var i=this,a=this._activeCollectionStorage.get(t);if(!a){if(this._activeCollectionStorage.size>=this._cardinalityLimit){var s=this._activeCollectionStorage.getOrDefault(this._overflowAttributes,function(){return i._aggregator.createAccumulation(o)});s?.record(e);return}a=this._aggregator.createAccumulation(o),this._activeCollectionStorage.set(t,a)}a?.record(e)},r.prototype.batchCumulate=function(e,t){var n=this;Array.from(e.entries()).forEach(function(o){var i=oU(o,3),a=i[0],s=i[1],c=i[2],l=n._aggregator.createAccumulation(t);l?.record(s);var u=l;if(n._cumulativeMemoStorage.has(a,c)){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}else if(n._cumulativeMemoStorage.size>=n._cardinalityLimit&&(a=n._overflowAttributes,c=n._overflowHashCode,n._cumulativeMemoStorage.has(a,c))){var d=n._cumulativeMemoStorage.get(a,c);u=n._aggregator.diff(d,l)}if(n._activeCollectionStorage.has(a,c)){var m=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(m,u)}n._cumulativeMemoStorage.set(a,l,c),n._activeCollectionStorage.set(a,u,c)})},r.prototype.collect=function(){var e=this._activeCollectionStorage;return this._activeCollectionStorage=new Cr,e},r}();var Xp=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},FA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},Gc=function(){function r(e,t){var n=this;this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return r.prototype.buildMetrics=function(e,t,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(e),a=i,s;if(this._reportHistory.has(e)){var c=this._reportHistory.get(e),l=c.collectionTime;s=c.aggregationTemporality,s===xi.CUMULATIVE?a=r.merge(c.accumulations,i,this._aggregator):a=r.calibrateStartTime(c.accumulations,i,l)}else s=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:a,collectionTime:o,aggregationTemporality:s});var u=iU(a);if(u.length!==0)return this._aggregator.toMetricData(t,s,u,o)},r.prototype._stashAccumulations=function(e){var t,n,o=this._unreportedAccumulations.keys();try{for(var i=Xp(o),a=i.next();!a.done;a=i.next()){var s=a.value,c=this._unreportedAccumulations.get(s);c===void 0&&(c=[],this._unreportedAccumulations.set(s,c)),c.push(e)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}},r.prototype._getMergedUnreportedAccumulations=function(e){var t,n,o=new Cr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Xp(i),s=a.next();!s.done;s=a.next()){var c=s.value;o=r.merge(o,c,this._aggregator)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(t)throw t.error}}return o},r.merge=function(e,t,n){for(var o=e,i=t.entries(),a=i.next();a.done!==!0;){var s=FA(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),m=n.merge(d,l);o.set(c,m,u)}else o.set(c,l,u);a=i.next()}return o},r.calibrateStartTime=function(e,t,n){var o,i;try{for(var a=Xp(e.keys()),s=a.next();!s.done;s=a.next()){var c=FA(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(m){o={error:m}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function iU(r){return Array.from(r.entries())}var aU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),sU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},BA=function(r){aU(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Hc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Gc(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new Cr;Array.from(t.entries()).forEach(function(a){var s=sU(a,2),c=s[0],l=s[1];i.set(o._attributesProcessor.process(c),l)}),this._deltaMetricStorage.batchCumulate(i,n)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(zc);Le();function Jp(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
28
28
  `),r.type!==e.type&&(t+=" - Type '"+r.type+"' does not match '"+e.type+`'
29
29
  `),r.valueType!==e.valueType&&(t+=" - Value Type '"+r.valueType+"' does not match '"+e.valueType+`'
30
30
  `),r.description!==e.description&&(t+=" - Description '"+r.description+"' does not match '"+e.description+`'
31
- `),t}function tU(r,e){return" - use valueType '"+r.valueType+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function rU(r,e){return" - use unit '"+r.unit+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function nU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+"'"}function oU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+`'
31
+ `),t}function lU(r,e){return" - use valueType '"+r.valueType+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function cU(r,e){return" - use unit '"+r.unit+"' on instrument creation or use an instrument name other than '"+e.name+"'"}function uU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+"'"}function dU(r,e){var t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return" - create a new view with a name other than '"+r.name+"' and InstrumentSelector '"+n+`'
32
32
  - OR - create a new view with the name `+r.name+" and description '"+r.description+"' and InstrumentSelector "+n+`
33
- - OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function Jp(r,e){return r.valueType!==e.valueType?tU(r,e):r.unit!==e.unit?rU(r,e):r.type!==e.type?nU(r,e):r.description!==e.description?oU(r,e):""}var Qp=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},DA=function(){function r(){this._sharedRegistry=new Map,this._perCollectorRegistry=new Map}return r.create=function(){return new r},r.prototype.getStorages=function(e){var t,n,o,i,a=[];try{for(var s=Qp(this._sharedRegistry.values()),c=s.next();!c.done;c=s.next()){var l=c.value;a=a.concat(l)}}catch(g){t={error:g}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}var u=this._perCollectorRegistry.get(e);if(u!=null)try{for(var d=Qp(u.values()),m=d.next();!m.done;m=d.next()){var l=m.value;a=a.concat(l)}}catch(g){o={error:g}}finally{try{m&&!m.done&&(i=d.return)&&i.call(d)}finally{if(o)throw o.error}}return a},r.prototype.register=function(e){this._registerStorage(e,this._sharedRegistry)},r.prototype.registerForCollector=function(e,t){var n=this._perCollectorRegistry.get(e);n==null&&(n=new Map,this._perCollectorRegistry.set(e,n)),this._registerStorage(t,n)},r.prototype.findOrUpdateCompatibleStorage=function(e){var t=this._sharedRegistry.get(e.name);return t===void 0?null:this._findOrUpdateCompatibleStorage(e,t)},r.prototype.findOrUpdateCompatibleCollectorStorage=function(e,t){var n=this._perCollectorRegistry.get(e);if(n===void 0)return null;var o=n.get(t.name);return o===void 0?null:this._findOrUpdateCompatibleStorage(t,o)},r.prototype._registerStorage=function(e,t){var n=e.getInstrumentDescriptor(),o=t.get(n.name);if(o===void 0){t.set(n.name,[e]);return}o.push(e)},r.prototype._findOrUpdateCompatibleStorage=function(e,t){var n,o,i=null;try{for(var a=Qp(t),s=a.next();!s.done;s=a.next()){var c=s.value,l=c.getInstrumentDescriptor();jv(l,e)?(l.description!==e.description&&(e.description.length>l.description.length&&c.updateDescription(e.description),V.warn("A view or instrument with the name ",e.name,` has already been registered, but has a different description and is incompatible with another registered view.
33
+ - OR - create a new view with the name `+e.name+" and description '"+r.description+"' and InstrumentSelector "+n}function Qp(r,e){return r.valueType!==e.valueType?lU(r,e):r.unit!==e.unit?cU(r,e):r.type!==e.type?uU(r,e):r.description!==e.description?dU(r,e):""}var Zp=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},zA=function(){function r(){this._sharedRegistry=new Map,this._perCollectorRegistry=new Map}return r.create=function(){return new r},r.prototype.getStorages=function(e){var t,n,o,i,a=[];try{for(var s=Zp(this._sharedRegistry.values()),c=s.next();!c.done;c=s.next()){var l=c.value;a=a.concat(l)}}catch(p){t={error:p}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}var u=this._perCollectorRegistry.get(e);if(u!=null)try{for(var d=Zp(u.values()),m=d.next();!m.done;m=d.next()){var l=m.value;a=a.concat(l)}}catch(p){o={error:p}}finally{try{m&&!m.done&&(i=d.return)&&i.call(d)}finally{if(o)throw o.error}}return a},r.prototype.register=function(e){this._registerStorage(e,this._sharedRegistry)},r.prototype.registerForCollector=function(e,t){var n=this._perCollectorRegistry.get(e);n==null&&(n=new Map,this._perCollectorRegistry.set(e,n)),this._registerStorage(t,n)},r.prototype.findOrUpdateCompatibleStorage=function(e){var t=this._sharedRegistry.get(e.name);return t===void 0?null:this._findOrUpdateCompatibleStorage(e,t)},r.prototype.findOrUpdateCompatibleCollectorStorage=function(e,t){var n=this._perCollectorRegistry.get(e);if(n===void 0)return null;var o=n.get(t.name);return o===void 0?null:this._findOrUpdateCompatibleStorage(t,o)},r.prototype._registerStorage=function(e,t){var n=e.getInstrumentDescriptor(),o=t.get(n.name);if(o===void 0){t.set(n.name,[e]);return}o.push(e)},r.prototype._findOrUpdateCompatibleStorage=function(e,t){var n,o,i=null;try{for(var a=Zp(t),s=a.next();!s.done;s=a.next()){var c=s.value,l=c.getInstrumentDescriptor();Xv(l,e)?(l.description!==e.description&&(e.description.length>l.description.length&&c.updateDescription(e.description),V.warn("A view or instrument with the name ",e.name,` has already been registered, but has a different description and is incompatible with another registered view.
34
34
  `,`Details:
35
- `,Xp(l,e),`The longer description will be used.
36
- To resolve the conflict:`,Jp(l,e))),i=c):V.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
35
+ `,Jp(l,e),`The longer description will be used.
36
+ To resolve the conflict:`,Qp(l,e))),i=c):V.warn("A view or instrument with the name ",e.name,` has already been registered and is incompatible with another registered view.
37
37
  `,`Details:
38
- `,Xp(l,e),`To resolve the conflict:
39
- `,Jp(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},r}();var kA=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();Le();Le();var UA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new wr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){V.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var FA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!gs(e)){var o=this._buffer.get(e);if(o==null&&(o=new wr,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Kt.INT&&!Number.isInteger(t)&&(V.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var Zp=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},eg=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},BA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},zA=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},HA=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(gs));if(n.size===0){V.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(gs)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return Zp(this,void 0,void 0,function(){var n,o,i,a;return eg(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,Bv(zA(zA([],BA(n),!1),BA(o),!1))];case 1:return i=s.sent(),a=i.filter(zv).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return Zp(n,void 0,void 0,function(){var s,c;return eg(this,function(l){switch(l.label){case 0:return s=new UA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return Zp(n,void 0,void 0,function(){var s,c;return eg(this,function(l){switch(l.label){case 0:return s=new FA,c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(m){m.record(d,e)})}),[2]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&Hv(n.instruments,t)})},r}();var iU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),GA=function(r){iU(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Bc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new zc(n,i),s}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(Fc);var VA=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ii=function(){function r(){}return r.Noop=function(){return sU},r}();var aU=function(r){VA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ii);var WA=function(r){VA(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Ii);var sU=new aU;var lU=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},cU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},uU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},jA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new DA,this.observableRegistry=new HA,this.meter=new IA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,GA);return t.length===1?t[0]:new kA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,NA);return t},r.prototype.collect=function(e,t,n){return lU(this,void 0,void 0,function(){var o,i,a;return cU(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(t,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,t)}).filter(Uv),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=Wv(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),m=new t(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(m),m});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=uU(c,2),u=l[0],d=l[1],m=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(m!=null)return m;var g=d.createAggregator(e),p=u.selectCardinalityLimit(e.type),h=new t(e,g,Ii.Noop(),[u],p);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var dU=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},$A=function(){function r(e){this.resource=e,this.viewRegistry=new AA,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=Fv(e),n=this.meterSharedStates.get(t);return n==null&&(n=new jA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=dU(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var Hc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Gc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},mU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},pU=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},qA=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Hc(this,void 0,void 0,function(){var t,n,o,i,a=this;return Gc(this,function(s){switch(s.label){case 0:return t=To(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Hc(a,void 0,void 0,function(){var l;return Gc(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,pU([],mU(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return Hc(this,void 0,void 0,function(){return Gc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return Hc(this,void 0,void 0,function(){return Gc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var KA=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},YA=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},XA=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function gU(r,e){var t=e??Dc.empty();return r?Dc.default().merge(t):t}var tg=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new $A(gU((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=XA(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(g){t={error:g}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=XA(e.readers),d=u.next();!d.done;d=u.next()){var m=d.value;this.addMetricReader(m)}}catch(g){o={error:g}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(V.warn("A shutdown MeterProvider cannot provide a Meter"),ap()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new qA(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return KA(this,void 0,void 0,function(){return YA(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return KA(this,void 0,void 0,function(){return YA(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var hU=/[\^$\\.+?()[\]{}|]/g,Vc=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(hU,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Oi=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var JA=function(){function r(e){var t;this._nameFilter=new Vc((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Oi(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var QA=function(){function r(e){this._nameFilter=new Oi(e?.name),this._versionFilter=new Oi(e?.version),this._schemaUrlFilter=new Oi(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function fU(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Wc=function(){function r(e){var t;if(fU(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||Vc.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new WA(e.attributeKeys):this.attributesProcessor=Ii.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:pr.Default(),this.instrumentSelector=new JA({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new QA({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var vue=process.env.APP||"unknown";Le();import{v4 as SU}from"uuid";function yU(){return new Nv({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:bo.DELTA})}var bU=[new Wc({instrumentName:"test_event_duration",instrumentType:Se.HISTOGRAM,aggregation:new ps([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new Wc({instrumentName:"test_step_duration",instrumentType:Se.HISTOGRAM,aggregation:new ps([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],$c=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let t=typeof process<"u"?"production":"unknown",n=new wp({[cc]:e.serviceName,[PT]:t,[OT]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:SU()}),o=yU(),i=new Kp({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new tg({resource:n,readers:[i],views:bU}),ic.setGlobalMeterProvider(this.provider),this.meter=ic.getMeter("momentic-serverless")}increment(e,t,n){try{let o=rc(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=rc(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var Tt=new tc;function ZA(r){r.disabled||(Tt=new $c(r))}import{hostname as vU}from"os";import AU from"path";import{_android as wU}from"playwright";async function ew(r){let{apiClient:e,logger:t,creationOpts:n,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s}=r,{token:c,webRtcUrl:l,adbUrl:u,name:d,apkDownloadUrl:m,region:g,playwrightServerUrl:p}=await e.createAndroidEmulator({...n,hostname:vU(),sessionId:s}),h;try{TU("adb --version"),h="adb"}catch{if(process.env.ANDROID_HOME)h=AU.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new Error("The adb binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:d,apkToInstall:n.apkToInstall,region:g,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:p},"Android instance creation ok");let f=await Tt.recordDuration({fn:async()=>await EU({adbUrl:u,endpointUrl:l,token:c,logLevel:i,adbPath:h}),name:"test_event_duration",tags:["name:limbar-client-creation",`orgId:${a}`]}),E=["https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-v7.6.2.apk","https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-debug-androidTest.apk","https://github.com/appium/io.appium.settings/releases/download/v5.14.15/settings_apk-debug.apk"];m&&E.push(m);let b=n.apkToInstall?.channel,w=n.apkToInstall?.tag;o(`Installing APK${b?` with channel ${b}`:""}${w?` and tag ${w}`:""}`),await Promise.all(E.map(A=>f.sendAsset(A))),o("Starting ADB tunnel");let R=await Tt.recordDuration({fn:async()=>await f.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),v=()=>{R.close(),f.disconnect()},M;return p&&(o("Opening Playwright connection"),M=await Tt.recordDuration({fn:async()=>await wU.connect(p),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:R.address.port,close:v,limbarToken:c,limbarUrl:l,emulatorName:d,playwrightDevice:M,client:f}}import jU from"fs";function ft(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var cn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},un={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},rg={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},ng={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function rw(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?un[r.operation]:cn[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?un[r.operation]:cn[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?un[r.operation]:cn[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?un[r.operation]:cn[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?ng[r.condition]:rg[r.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var bde={CONTENT:"The page"};function nw(r){switch(r.type){case"SUBSTRING":return`match substring '${r.url}'`;case"REGEX":return`match regex '${r.regex}'`;case"GLOB":return`match glob '${r.glob}'`;case"DOMAIN":return`match domain '${r.domain}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function og(r){return`${r.negated?un.CONTAINS:cn.CONTAINS} '${r.value}'`}function ow(r){switch(r.type){case"CONTENT":return og(r);default:return r.type,""}}function CU(r){return typeof r=="object"&&r!==null}function wo(r){if(Array.isArray(r))return r.map(wo);if(CU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=wo(n))}),e}return r}function Wr(r,e,t,n){let{negated:o,ignoreCase:i}=n,a=r.trim(),s=e.trim();i&&(a=a.toLowerCase(),s=s.toLowerCase());let c;switch(t){case"CONTAINS":{c=a.includes(s);break}case"EQUALS":{c=a===s;break}case"STARTS_WITH":{c=a.startsWith(s);break}case"EXISTS":{c=a.length>0;break}default:throw new Error(`Unrecognized content assertion type: ${t}`)}return o?!c:c}function qc(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function gr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?rg[r.condition]:ng[r.condition]:r.negated?cn[r.operation]:un[r.operation]}import{diff as RU}from"deep-object-diff";import{cloneDeep as Vde}from"lodash-es";function Kc(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(RU(r,e)).length>0}function ig({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(m,g)=>{try{let p=Mn.parse(g.value);if(p.type!==m.type){o.warn({parsedCacheEntry:p,command:m},"Not using step cache due to type mismatch"),s.push(g.key);return}m.cache=p.cache,a.push(g.key),c.push(g.uniqueKey)}catch(p){s.push(g.key),o.error({err:p,cacheEntry:g},"Not using step cache due to parsing error")}},d=(m,g)=>{let p=MU(m.id,g),h=p.find(f=>!!n[f]);if(h)u(m,n[h]);else{if(m.type==="AI_CHECK")return;s.push(p[0])}};for(let m of r)switch(m.type){case"MOBILE_PRESET_STEP":{if(!_l(m.command)||m.command.type==="TYPE"&&!m.command.target||"cache"in m.command&&m.command.cache)continue;l++,d(m.command,i);break}case"RESOLVED_MOBILE_MODULE":{l+=m.steps.length;let{cacheKeysHit:g,cacheKeysMissed:p,uniqueKeysHit:h}=ig({...t,steps:m.steps,keyPrefix:i?`${i}:${m.id}`:m.id,topLevel:!1});a.push(...g),s.push(...p),c.push(...h);break}case"MOBILE_AI_ACTION_STEP":{l++;break}default:{let g=m}}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(m=>m.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function xU(r,e){return e?`${e}:${r}`:r}function MU(r,e){let t=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),r];t.push(i.join(":"))}return t.reverse(),t}function ag(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
40
- ${JSON.stringify(t)}`);let n=[];return n.push({key:xU(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Yc({cmd:r,newTarget:e,key:t,logger:n,updatedWithAI:o}){if(r.type==="DRAG")if(t!=="fromTarget"&&t!=="toTarget")n.error({cmd:r,newTarget:e,key:t},"Attempted to apply invalid cache to DRAG command");else{let i=r.cache?.updatedAt;r.cache={...r.cache,[t]:e,updatedAt:i&&!o?i:new Date}}else if(t==="target"&&Md(r)){let i=r.cache?.updatedAt;r.cache={...r.cache,target:e,updatedAt:i&&!o?i:new Date}}else n.error({cmd:r,newTarget:e,key:t},"Invalid target cache application")}function hs(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;Kc(n,e)&&(t.info({updatedTraces:e,oldCmd:r},"Wrote new memory to assertion command"),r.cache={...r.cache,memory:{type:"GCS_TRACES",traces:e},updatedAt:new Date})}function sg(r){return{...r,serializedHtml:void 0,nodeOnlySerializedHtml:void 0,screenshotUrl:void 0,boundingBox:void 0,selector:void 0,hybridSelector:void 0,generatedSelectors:void 0,id:-1}}function aw(r,e){return r?Kc(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:sg(e.target),updatedAt:e.updatedAt}}function _U(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${li(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${li(r.target)}`:""}`;case"PRESS":return`Press the ${r.key} button`;case"PRESS_KEYBOARD":return`Press the ${r.key} key`;case"SWIPE":return r.scrollableElement.type==="CUSTOM"?`Swipe ${r.direction} in container: ${r.scrollableElement.target.description}`:`Swipe ${r.direction} in the ${r.scrollableElement.type.toLowerCase()}`;case"SCROLL_TO":{let e=r.scrollStepPercent?` (${Math.round(r.scrollStepPercent*100)}% per step)`:"";return`Scroll ${r.direction} to find: ${r.target.description}${e}`}case"DRAG_AND_DROP":return`Drag ${li(r.fromTarget)} to ${li(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${ow(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${li(r.target)} ${rw(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"JAVASCRIPT":return`Execute JavaScript: ${r.code}`;case"REQUEST":return`Make API request to ${r.url}`;case"WAIT":return`Wait ${r.timeoutSecs} seconds`;case"ADD_FILE":return`Add file: ${r.file} to ${r.storageLocation}`;case"INSTALL_APP":return`Install app: ${r.uri}`;case"UNINSTALL_APP":return`Uninstall app: ${r.packageName}`;case"TOGGLE_SETTINGS":{let e;switch(r.settingsType){case"AIRPLANE_MODE":e="airplane mode";break;case"DATA":e="data connection";break;case"WIFI":e="Wi-Fi";break;case"LOCATION":e="location services";break;default:{let t=r.settingsType;e=String(r.settingsType)}}return`Toggle ${e}`}case"ADB":return`ADB command: ${r.command}`;case"KILL_APP":return"Kill active app";case"STATE":return"Send debug state to Momentic";default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}function lg(r){switch(r.type){case"MOBILE_PRESET_STEP":return _U(r.command);case"MOBILE_MODULE_STEP":return`Module ${r.moduleId}`;case"RESOLVED_MOBILE_MODULE":return`Module ${r.name}`;case"MOBILE_AI_ACTION_STEP":return`AI action: ${r.text}`;default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}import{cloneDeep as kw}from"lodash-es";import cg from"semver";function Xc(r,e){if(r!=="0.0.1"&&r!==e[e.length-1].toVersion)throw new Error("Please bump latestSchemaVersion in types package after adding a migration");e.forEach((t,n)=>{if(!cg.valid(t.toVersion)||!cg.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!cg.gt(t.toVersion,t.fromVersion))throw new Error(`Migration '${t.name}' has toVersion <= fromVersion`);if(n===0)return;if(e[n-1].toVersion!==t.fromVersion)throw new Error(`Migration '${t.name}' at index ${n} is not contiguous with previous migration`)})}import PU from"diff-lines";import IU,{gte as OU}from"semver";function LU(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function ug({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>IU.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&OU(l,n)){t.debug("Stopping migration early because toVersion was reached");break}let m=o[d],g={id:s,migration:m.name,toVersion:m.toVersion};try{i=await sw(i,m),l=m.toVersion}catch(p){throw t.error({err:p,...g},"Migration failed"),new Error(`Step migration ${m.name} failed: ${p}`)}}let u=PU(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&t.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function sw(r,e){let t=await e.execute(r);for(let n of t)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||LU(i)&&(n[o]=await sw(i,e))}return t}var lw={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var cw=[lw];Xc(oo,cw);async function dg({metadata:r,steps:e,logger:t,toVersion:n}){return await ug({metadata:r,steps:e,logger:t,toVersion:n,migrations:cw})}var uw={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>(r=r.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),r=r.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),r)};var dw={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,n=t[t.length-1];return n&&n.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var NU=["target","fromTarget","toTarget"];function mw(r){for(let e of NU){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var pw={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":return mw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])mw(n);return e}default:return e}})};import{v4 as DU}from"uuid";var gw={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=DU()),e;default:return e}})};import{v4 as hw}from"uuid";var fw={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??hw(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??hw()}})),delete e.commands),e;default:return e}})};var Sw={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as kU}from"uuid";var yw={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>("id"in e&&typeof e.id=="string"||(e.id=kU()),e))};import{v4 as bw}from"uuid";var Ew={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=bw())}return e.id=bw(),e})};var Tw={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as UU}from"uuid";var vw={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=UU()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var Aw={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var ww={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Cw(t),e})};function Cw(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){Cw(r[e]);return}if(typeof r[e]!="string")return;let t=r[e];e==="code"?r[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(r[e]=t.replace(/inputs\./g,"env."))})}var Rw={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var xw={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var Mw={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var _w={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t)return e;if(t.type==="SELECT_OPTION"){if(t.option===void 0)return e;t.choice={type:"VALUE",value:t.option},t.option=void 0}else if(t.type==="TAB"){if(t.url===void 0)return e;t.action={type:"SUBSTRING",substring:t.url},t.url=void 0}else if(t.type==="WAIT_FOR_URL"){if(t.url===void 0)return e;t.matcher={type:"GLOB",glob:t.url},t.url=void 0}else t.type==="AI_WAIT"&&(t.type="AI_ASSERTION",t.timeout||(t.timeout=10));return e})};var Pw={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="MOCK_ROUTE"&&t.type!=="SET_HEADER"&&t.type!=="RECORD_REQUESTS"&&t.type!=="REGISTER_REQUEST_LISTENER"||(t.type==="REGISTER_REQUEST_LISTENER"||t.type==="RECORD_REQUESTS"?t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.pattern}}:(t.type==="SET_HEADER"||t.type==="MOCK_ROUTE")&&t.urlPattern&&(t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.urlPattern}})),e})};var Iw={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var Ow={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async r=>r.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Jc=new Set(["CLICK","TYPE","SELECT_OPTION"]),Lw={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type,o=t?.elementDescriptor;return(o!==void 0||Jc.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Jc.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Jc.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let m=d?.elementDescriptor,g=d?.type;(m!==void 0||Jc.has(g))&&(d.target={elementDescriptor:m??""})})}),e}),stopOnFailure:!0};var Nw={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var Dw={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type;return n?.startsWith("PRESET_")&&(t.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var FU=[Ow,Nw,Dw,Lw,uw,dw,pw,gw,fw,Sw,yw,Ew,Tw,vw,Aw,ww,Rw,xw,Mw,_w,Pw,Iw];Xc(wn,FU);async function Uw(r){let e={},{resolvedSteps:t,newSchemaVersion:n}=await Qc({rawSteps:r.rawStepLists.steps,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e}),o={steps:t};for(let i of["beforeSteps","afterSteps"]){let a=r.rawStepLists[i];if(!a)continue;let{resolvedSteps:s}=await Qc({rawSteps:a,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e});o[i]=s}return{resolvedStepLists:o,moduleIds:Array.from(Object.keys(e))}}async function zU(r,e,t){let{newVersion:n,steps:o}=await dg({metadata:r,steps:e,logger:t});try{return{steps:jt.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new Sa(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function Qc({rawSteps:r,onFetchModule:e,logger:t,metadata:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await zU(n,r,t),s=[];for(let c of a)s.push(await Fw({rawStep:jt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function Fw({rawStep:r,onFetchModule:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"MOBILE_MODULE_STEP":{let o=r.moduleId,i=n[o];if(i)return{...kw(i),...r,type:"RESOLVED_MOBILE_MODULE"};let a=await e(o);if(!a)throw new Error(`Could not find module with id ${o}`);let s;try{s=jt.array().parse(a.steps)}catch(u){throw t.error({err:u,steps:a.steps,moduleId:o},"Module failed to parse (mobile)"),u}let c=await Promise.all(s.map(u=>Fw({rawStep:u,onFetchModule:e,logger:t,resolvedModuleCache:n}))),l={...a,description:a.description||void 0,steps:c};return n[o]=kw(l),{...l,...r,type:"RESOLVED_MOBILE_MODULE"}}case"MOBILE_AI_ACTION_STEP":case"MOBILE_PRESET_STEP":return r}}import{diff as Bw}from"deep-object-diff";import{cloneDeep as zw}from"lodash-es";import{v4 as mg}from"uuid";async function jr(r){let e=new Map,t=new Set,n=zw(r.steps),o=await Gw({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function HU({newEntries:r,originalCachesMap:e}){let t=[];for(let n of r){let o=e[n.key],i=n.value.cache;if(!i)continue;if(!o||!o.cache){t.push(n);continue}if(n.value.type!==o.type){t.push(n);continue}let a=yn.safeParse(i),s=yn.safeParse(o);if(a.success&&s.success&&a.data.memory){let m=s.data.memory,g=a.data.memory;Kc(m,g)&&(n.value.cache={...s.data,memory:g,updatedAt:a.data.updatedAt},t.push(n));continue}let c=xn.safeParse(i),l=xn.safeParse(o);if(c.success&&l.success){let m=fs({originalCache:l.data,newCache:c.data,targetGetter:g=>g.target});m.changed&&(n.value.cache=m.result,t.push(n));continue}let u=Ml.safeParse(i),d=Ml.safeParse(o);if(u.success&&d.success){let m=fs({originalCache:d.data,newCache:u.data,targetGetter:p=>p.fromTarget}),g=fs({originalCache:{...d.data,fromTarget:m.result.fromTarget},newCache:u.data,targetGetter:p=>p.toTarget});(m.changed||g.changed)&&(n.value.cache=g.result,t.push(n));continue}}return t}async function Hw({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await jr({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await jr({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=HU({newEntries:c,originalCachesMap:s});if(l.length){r.debug({prunedCaches:l},"Saving pruned mobile memory post-failure");try{await e.saveEntries({logger:r,testId:n,entries:l})}catch(u){r.error({err:u},"Failed to save mobile memory post-failure. This is not critical, but can impact future performance.")}}}async function Gw({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:c}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(u.id=c?mg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?mg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(ag({id:d.id,orgId:n.orgId,testId:n.testId,value:Mn.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?mg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:g,stepsToSave:p,moduleUpdates:h}=await Gw({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,d],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(h),l.cachesToSave=l.cachesToSave.concat(g),t.has(m)||(t.add(m),l.moduleUpdates.push({...ab.parse(u),steps:jt.array().parse(p),moduleId:m}));let f=Da.parse({...u,type:"MOBILE_MODULE_STEP",moduleId:m,inputs:u.inputs,id:d});l.stepsToSave.push(f);break}case"MOBILE_AI_ACTION_STEP":{l.stepsToSave.push(u);break}default:{let d=u}}return l}function fs({originalCache:r,newCache:e,targetGetter:t}){let n=t(r),o=t(e),i=zw(r),a=t(i),s=!1;if(o.memory){let c=n.memory,l=Object.keys(Bw(c??{},o.memory??{}));Object.keys(l).length>0&&(a.memory=o.memory,i.updatedAt=new Date,s=!0)}if(a.type==="WEBVIEW"&&o.type==="WEBVIEW"&&a.browserCache){let c=o.browserCache?.memory,l=n.type==="WEBVIEW"?n.browserCache?.memory:void 0;if(c){let u=Object.keys(Bw(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function GU(r){let e={parentChain:[]};return Vw(r,e),e}function Vw(r,e){let{onPreset:t,onModule:n,earlyStop:o}=r;for(let i of r.steps){if(i.type==="RESOLVED_MOBILE_MODULE"){if(n?.(i,e)&&o||(e.parentChain.push(i),Vw({...r,steps:i.steps},e)&&o))return!0;e.parentChain.pop();continue}if(t(i,e)&&o)return!0}return!1}function VU(r,e,t=[]){let n,o=[],i=(a,s)=>{let c=JSON.stringify(s.parentChain.map(u=>u.id)),l=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&l?(n=a,o=s.parentChain,!0):!1};return GU({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function Ww({currentStep:r,currentParentChain:e,desiredStepId:t,desiredStepParentChain:n}){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==n[s])return!1;i.shift()}return!!VU([r],t,i).result}function jw(r){let e=r[0],t=r[0],n=!1;for(;!n&&t;)switch(t.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!t.steps.length){e=t,n=!0;break}t=t.steps[0];break;case"MOBILE_PRESET_STEP":e=t,n=!0;break;default:{let s=t}}let o=r[r.length-1],i=r[r.length-1],a=!1;for(;!a&&i;)switch(i.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!i.steps.length){o=i,a=!0;break}i=i.steps[i.steps.length-1];break;case"MOBILE_PRESET_STEP":o=i,a=!0;break;default:{let s=i}}return{firstMetadata:e,lastMetadata:o}}function $w({result:r,firstMetadata:e,lastMetadata:t}){e&&(r.beforeSnapshot=e.beforeSnapshot),t&&(r.data=t.data,r.afterSnapshot=t.afterSnapshot,t.status!=="SUCCESS"&&(r.message=t.message))}import{cloneDeep as qge}from"lodash-es";import Yge from"truncate-json";import{v4 as ohe}from"uuid";import{cloneDeep as Uge,unset as Fge}from"lodash-es";import{cloneDeep as che}from"lodash-es";import{diff as Khe}from"deep-object-diff";import{diff as xhe}from"deep-object-diff";import{cloneDeep as _he}from"lodash-es";import{v4 as Whe}from"uuid";import{cloneDeep as efe}from"lodash-es";import{cloneDeep as ffe}from"lodash-es";import{stringify as Mfe}from"yaml";async function W(r,e){if(!(r<=0))return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function gg({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,c)=>{function l(){clearInterval(a),e?.removeEventListener("abort",l),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",l,{once:!0}),(async()=>{try{s(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",l)}})()})}async function Ss({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",s),!i&&a.abort()},e);o?.addEventListener("abort",s,{once:!0});try{return await gg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function Zc(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}import WU from"picomatch";var eu=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||WU(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}case"DOMAIN":{let o=t?.caseInsensitive?e.domain.toLowerCase():e.domain;n=new URL(r).hostname===o;break}}return t?.negated?!n:n},tu=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Li=r=>{try{return new URL(r),!0}catch{return!1}},qw=r=>!r.toLowerCase().startsWith("http"),Ni=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Co(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}import{v4 as Kw}from"uuid";function hg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var ru=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:hg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(sb(e.type)){this.creditsUsedV2+=1;return}let t=um(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=dm(e.command);this.creditsUsedV1+=n??0}}async flush(e){this.creditsUsedV1>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:Kw(),properties:hg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:Kw(),properties:hg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as cSe}from"lodash-es";import{remote as $U}from"webdriverio";var qU=["If you see 'device offline' in ADB output, the emulator likely reset or crashed. Please start a new editor session by refreshing the page.","If Appium /status does not respond, the Appium server may not have started correctly. Please inspect the log output above for errors."];async function KU(r,e){try{let t=await jU.promises.open(r,"r");try{let{size:n}=await t.stat(),o=Math.max(0,n-e),i=Buffer.alloc(n-o);return await t.read(i,0,i.length,o),i.toString("utf8")}finally{await t.close()}}catch{return}}async function YU(r){try{let e=await fetch(`http://localhost:${r}/status`,{method:"GET",signal:AbortSignal.timeout(5e3)}),t=await e.text();return{ok:!0,statusCode:e.status,body:t}}catch(e){return{ok:!1,error:cl(e)}}}function XU(r){let e=cl(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function Yw(r,e){if(!r||!e)return;let t=r.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0);for(let n of t){if(n.startsWith("List of devices attached")||!n.startsWith(e))continue;let i=n.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function JU(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function QU(r){let e=(r??"").toLowerCase();return{deviceOffline:e.includes("device offline"),instrumentationCrashed:e.includes("instrumentation process has been unexpectedly terminated"),uiAutomatorCrashed:e.includes("uiautomator2")&&(e.includes("instrumentation")||e.includes("not running")||e.includes("socket hang up"))}}async function ZU(r){return{adbSerial:r,devices:await ht(["devices","-l"],{timeoutMs:2500}),state:r?await ht(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await ht(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function eF({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=Yw(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?JU(e):void 0;if(r.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await ht(["start-server"],{timeoutMs:5e3}),await W(500),await ht(["disconnect",s],{timeoutMs:5e3}),await W(500),await ht(["connect",s],{timeoutMs:5e3}),await W(500)):(await ht(["kill-server"],{timeoutMs:5e3}),await W(500),await ht(["start-server"],{timeoutMs:5e3}),await W(500),await ht(["reconnect","offline"],{timeoutMs:5e3}),await W(500)),e){let c=await ht(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await ht(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await ht(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function Xw({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o;for(let d=1;d<=2;d++)try{return d>1&&e("Retrying Appium session creation..."),{driver:await $U(t),appiumLogFile:u,appiumServerClose:l}}catch(m){let g=await YU(n),p=await ZU(s),h=await KU(u,64*1024),f=QU(h),E=Yw(p.devices,s);if(r.error({err:m,appiumPort:n,appiumLogFile:u,appiumStatus:g,adbSnapshot:p,adbDeviceState:E,appiumLogHints:f,appiumLogTail:h},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${cl(m)}`),!(d===1&&(XU(m)||E==="offline"||f.instrumentationCrashed||f.deviceOffline)))throw C.error(`Failed to create Appium WebDriver session. Troubleshooting:
41
- - ${qU.join(`
42
- - `)}`),m;try{await eF({logger:r,adbSerial:s,adbSnapshot:p,appiumLogHints:f,transportMode:c})}catch(w){r.warn({err:w},"Android transport recovery failed")}try{await l()}catch(w){r.warn({err:w},"Failed to close Appium server after session start failure")}({close:l,logFile:u}=await a())}throw new Error("Failed to create Appium WebDriver session")}async function nu({onStatusUpdate:r,creationOpts:e,apiClient:t,logger:n,driverLogLevel:o,appiumPort:i,socket:a,orgId:s,sessionId:c}){let l=Date.now();n.info("Starting android driver creation");let u=[],d;if("avdId"in e)d=e;else{d=await ew({apiClient:t,logger:n,creationOpts:e,onStatusUpdate:r,orgId:s,sessionId:c});let p=d.emulatorName;u.push(()=>t.deleteAndroidEmulator(p),d.close)}let m=async()=>{for(let p=u.length-1;p>=0;p-=1)try{await u[p]()}catch(h){if(h instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(f=>h.message.includes(f)))continue;n.warn({err:h},"Error running cleanup task")}},g=async()=>{if(a&&!a.connected)throw await m(),new Error("Client disconnected before Appium driver could be started, cleaning up...")};await g();try{let p=await aF({logger:n,driverLogLevel:o,appiumPort:i,emulatorStart:l,emulatorCreationParams:d,apiClient:t,onStatusUpdate:r,creationOpts:e,orgId:s,sessionId:c});return u.push(p.appiumClose),u.push(async()=>p.driver.deleteSession()),await g(),{...d,...p,cleanup:m,appiumPort:i}}catch(p){throw await m(),new Error(`Failed to start Appium driver: ${p}`)}}async function aF({logger:r,driverLogLevel:e="warn",emulatorStart:t,appiumPort:n,emulatorCreationParams:o,onStatusUpdate:i,creationOpts:a}){let s=[],{adbPort:c,emulatorName:l}=o,u,d="tunneled";if(!c){d="local";let I=0;for(;I<10;){let k=5555+Math.floor(Math.random()*30);if(k%2!==0&&(k=Math.min(k+1,5584)),await ec(k)&&await ec(k+1)){u=k,c=k+1;break}I+=1}if(!c)throw new Error(`Failed to find an available ADB port after ${I} attempts`)}l||(l=`emulator-${u}`,i("Killing existing emulators..."),await Qw(r),s.push(()=>Qw(r)),i("Starting new emulator..."));let m=Date.now(),{close:g,logFile:p}=await Jw({logger:r,logLevel:e,appiumPort:n}),h={platformName:"Android","appium:automationName":"UiAutomator2","appium:deviceName":"Android","appium:udid":`127.0.0.1:${c}`,"appium:adbExecTimeout":3e4,"appium:newCommandTimeout":3600,"appium:skipDeviceInitialization":!0,"appium:skipServerInstallation":!0,"appium:androidInstallTimeout":6e4,"appium:autoWebview":!1,"appium:autoWebviewTimeout":0,"appium:clearDeviceLogsOnStart":!0,"appium:ensureWebviewsHavePages":!0},f={hostname:"localhost",port:n,logLevel:e,capabilities:h,connectionRetryTimeout:15e3,connectionRetryCount:2};if("avdId"in o){h["appium:avd"]=o.avdId,h["appium:avdLaunchTimeout"]=18e4,h["appium:avdReadyTimeout"]=18e4,h["appium:skipDeviceInitialization"]=!1,h["appium:skipServerInstallation"]=!1,h["appium:udid"]=void 0;let I=sF();h["appium:avdArgs"]=`-port ${u} -memory ${I} -no-snapshot-save -no-boot-anim -noaudio`,f.connectionRetryTimeout=12e4,f.connectionRetryCount=3}let E="avdId"in o?l:`127.0.0.1:${c}`,b=Date.now(),{driver:w,appiumLogFile:R,appiumServerClose:v}=await Xw({logger:r,onStatusUpdate:i,wdOpts:f,appiumPort:n,appiumLogFile:p,appiumServerClose:g,transportMode:d,startAppiumServer:async()=>await Jw({logger:r,logLevel:e,appiumPort:n}),adbSerial:E});if(p=R,g=v,await w.updateSettings({enableMultiWindows:!0}),"avdId"in a){let I=a.apkFilePath?.trim();if(I){let k=iF.resolve(I);if(!rF.existsSync(k))throw new Error(`APK not found at path: ${k}`);i("Installing local APK...");let j=Date.now();try{await w.installApp(k),r.info({apkFilePath:k,installDurationMs:Date.now()-j},"Installed local APK")}catch(ne){throw r.error({err:ne,apkFilePath:k},"Failed to install local APK"),new Error(`Failed to install APK from ${k}: ${ne.message}`)}}}let M=new Map;return w.on("command",I=>{M.set(I.command,Date.now())}),w.on("result",I=>{let k=M.get(I.command);if(!k)return;let j=Date.now()-k;I.result instanceof Error?r.warn({err:I.result,command:I.command,args:I.body,durationMs:j},"Appium cmd failed"):j>1e4&&r.warn({command:I.command,args:I.body,durationMs:j},"Appium cmd took very long"),M.delete(I.command)}),r.info({timings:{emulatorDuration:m-t,appiumDuration:b-m,wdioDuration:Date.now()-b},capabilities:h,emulatorName:l},"Started Appium driver"),{driver:w,appiumClose:async()=>{await g(),await Promise.all(s.map(I=>I()))},appiumPort:n,appiumLogFile:p,emulatorName:l,adbPort:c}}async function Jw({logger:r,logLevel:e,appiumPort:t}){let n=`${nF()}/appium-port-${Date.now()}.log`,o=await tF.main({port:t,address:"localhost",relaxedSecurityEnabled:!0,longStacktrace:e==="debug",logFormat:"json",loglevel:e,logFile:n});return{logFile:n,close:async()=>{await o.close()}}}async function Qw(r){let n=(await ht(["devices"],{timeoutMs:5e3})??"").split(`
43
- `).map(o=>o.trim().split(/\s+/)[0]).filter(o=>!!o?.startsWith("emulator-"));await Promise.all(n.map(async o=>{r.info({emulatorName:o},"Killing emulator");let i=await ht(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function sF(){let r=Math.floor(oF()/1024/1024),e=Math.floor(r/4);return Math.max(2048,Math.min(8192,Math.floor(e/256)*256))}import Zw from"crypto";import lF from"fs";async function ou({tag:r,channel:e,filePath:t,apiClient:n,logger:o}){let i=await lF.promises.readFile(t),a=Zw.createHash("md5").update(i).digest("base64"),s=Zw.createHash("md5").update(i).digest("hex"),c=await n.generateAndroidAssetUrls({channel:e,tag:r??"latest",md5:a});if(c.md5&&(c.md5===a||c.md5===s)){o.info({channel:e,tag:r,md5:a,md5Hex:s},`Asset ${t} already exists on emulator platform`);return}if(c.uploadUrl){o.info({channel:e,tag:r,md5:a,uploadUrl:c.uploadUrl},`Uploading asset ${t} to emulator platform...`);try{let l=await fetch(c.uploadUrl,{headers:{"Content-Length":i.length.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:i});if(l.status!==200)throw new Error(`Got error response from emulator platform: ${l.status} ${await l.text()}`);o.info({channel:e,tag:r,md5:a},`Asset ${t} was uploaded successfully!`);return}catch(l){try{await n.deleteAndroidAsset(e,r??"latest")}catch(u){o.warn({err:u,tag:r,channel:e},"Failed to cleanup asset metadata for failed upload. Please contact Momentic support.")}throw o.error({err:l},"Failed to upload asset"),l}}throw new Error(`No upload URL was given for asset ${t}`)}import{execSync as eC}from"child_process";import{existsSync as cF}from"fs";import{platform as tC}from"os";import{dirname as uF,join as dF,resolve as mF}from"path";import{fileURLToPath as pF}from"url";var rC,gF=pF(import.meta.url),hF=uF(gF);rC=mF(hF,"..");var ys=rC;C.info(`Setting APPIUM_HOME to ${ys}`);process.env.APPIUM_HOME=ys;var fF="If you do not have Java installed, please download the JDK 24 from https://www.oracle.com/java/technologies/downloads/, move it to your home directory, and then set the JAVA_HOME environment variable in your shell profile to the JDK path.",SF="If you do not have Android Studio installed, please download it first from https://developer.android.com/studio and then follow all setup instructions in the Android Studio app.",yF="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",nC="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",oC="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function bF(){if(!process.env.JAVA_HOME)C.warn("JAVA_HOME is not set. Some Appium drivers and Android tools may not work as expected.");else{process.platform==="darwin"&&/\.jdk\/?$/.test(process.env.JAVA_HOME)&&C.warn("JAVA_HOME appears to point at a *.jdk bundle, which is incorrect. The correct path should be formatted like '<bundle>/Contents/Home'.");let e=((t,n)=>dF(t,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");cF(e)||C.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`)}try{eC("java --version",{stdio:"pipe",encoding:"utf-8"})||(C.error(`Could not find a Java installation. ${fF}`),process.exit(1))}catch(r){C.error(`Got error while checking if the Java JDK is installed: ${r}`),process.exit(1)}}function EF(){process.env.ANDROID_HOME||(C.error(`The ANDROID_HOME environment variable is not set. ${yF} ${tC()==="darwin"?nC:oC}`),process.exit(1))}function TF(){let r=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{eC(`${r} version`,{stdio:"pipe",encoding:"utf-8"})||(C.error(`Could not find the Android Debug Bridge (ADB) tool locally. This tool is included with Android Studio. ${SF} Finally, ensure that the 'adb' command is available in your shell. ${tC()==="darwin"?nC:oC}`),process.exit(1))}catch(e){C.error(`Got error while checking if ADB is installed: ${e}`),process.exit(1)}}function iC(){bF(),EF(),TF()}import{create as vF,windowedFiniteBatchScheduler as AF}from"@yornaath/batshit";import wF from"ws";var CF=100,RF=2500,aC=4e3,xF="\u2026";async function iu({driver:r,onLogs:e}){await r.execute("mobile: startLogsBroadcast");let t=vF({fetcher:async l=>{e(l)},resolver:()=>{},scheduler:AF({windowMs:RF,maxBatchSize:CF})}),{hostname:n="localhost",port:o=4723,protocol:i="http"}=r.options,s=`${i==="https"?"wss":"ws"}://${n}:${o}/ws/session/${r.sessionId}/appium/device/logcat`,c=new wF(s);return c.on("message",l=>{let u=l.toString().trim();u.length!==0&&(u.length>aC&&(u=u.slice(0,aC)+xF),t.fetch(u).catch(()=>{}))}),async()=>{try{c.close()}catch{}try{await r.execute("mobile: stopLogsBroadcast")}catch{}try{t.next()}catch{}}}import{Server as XH}from"socket.io";import vH from"path";import{randomUUID as FF}from"crypto";import{faker as MF}from"@faker-js/faker";import _F from"assert";import PF from"axios";import*as IF from"child_process";import OF from"moment";import*as LF from"otpauth";import NF from"pg";async function sC(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=wl(n,e);t.push(...o)}),t}function DF(r,e){if(!r&&!e)return;let t;if(r){let{url:o,options:i}=r;t=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:t,response:n}}async function kF(r,e){switch(r){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let t=[];return e.headers.forEach((o,i)=>{t.push([i,o])}),{status:e.status,headers:t,body:await e.text()}}else throw new Error("Result is not a Response object")}}var UF=Object.getPrototypeOf(async function(){}).constructor;async function lC(r,e,t){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(w,R)=>{o[w]=R,l[w]=R},d={},m=(w,R)=>{o[w]=R,d[w]=R},g;n.includes("Octokit")&&(g=(await import("@octokit/rest")).Octokit);let p;n.includes("createAppAuth")&&(p=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new UF("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(PF,OF,c.fakerInstance??MF,_F,NF,g,p,LF,IF,sC,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:m,R=>c.sms.send(R),R=>c.sms.fetchLatest(R),c.email,c.sms,c.ai,DF(a,s),...Object.values(i??{}))),f=!0,E,b;try{let w=await z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});E=await kF(e.options.responseSerialization??"RAW",w)}catch(w){t.error({err:w,env:o,evalCode:n},`[${r}] Error executing code: ${w}`),f=!1,w instanceof Ln?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=w instanceof Error?w.message:`${w}`}return{result:E,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function cC({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=_n,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=FF(),m=await lC(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return C.debug(`[${d}] Got execution result: ${JSON.stringify(m)}`),m}import{createHmac as BF,randomUUID as zF}from"crypto";import HF from"fetch-retry";var GF=HF(global.fetch,{retries:3,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),uC=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,dC=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function mC({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=_n,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!uC)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let m,g,p=0;if(!dC)throw new Error("Missing lambda auth secret.");let h=BF("sha256",dC).update(r).digest("hex");for(;p<=i;){p++,a?.throwIfAborted();let E={id:zF(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(m=await z(GF(uC,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!m)throw new Error("Got empty response from code evaluation server");if(!m.ok)throw new Error(`Code evaluation server returned error code ${m.status}`);g=void 0;break}catch(b){g=b}}if(g)throw s.error({err:g},"Failed to evaluate code remotely"),g;if(!m)throw new Error(`An unexpected code evaluation error occurred${g?`: ${g}`:""}`);let f;try{f=cb.parse(await m.json())}catch(E){throw new Error(`Code evaluation server returned invalid response: ${E}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function $r(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await mC(r);else if(r.localTools)e=await cC({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
38
+ `,Jp(l,e),`To resolve the conflict:
39
+ `,Qp(l,e))}}catch(u){n={error:u}}finally{try{s&&!s.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},r}();var HA=function(){function r(e){this._backingStorages=e}return r.prototype.record=function(e,t,n,o){this._backingStorages.forEach(function(i){i.record(e,t,n,o)})},r}();Le();Le();var GA=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Cr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){V.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Kt.INT&&!Number.isInteger(e)&&(V.warn("INT value type cannot accept a floating-point value for "+this._instrumentName+", ignoring the fractional digits."),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)},r}();var VA=function(){function r(){this._buffer=new Map}return r.prototype.observe=function(e,t,n){if(n===void 0&&(n={}),!!hs(e)){var o=this._buffer.get(e);if(o==null&&(o=new Cr,this._buffer.set(e,o)),typeof t!="number"){V.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Kt.INT&&!Number.isInteger(t)&&(V.warn("INT value type cannot accept a floating-point value for "+e._descriptor.name+", ignoring the fractional digits."),t=Math.trunc(t),!Number.isInteger(t))||o.set(n,t)}},r}();var eg=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},tg=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},WA=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},jA=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},$A=function(){function r(){this._callbacks=[],this._batchCallbacks=[]}return r.prototype.addCallback=function(e,t){var n=this._findCallback(e,t);n>=0||this._callbacks.push({callback:e,instrument:t})},r.prototype.removeCallback=function(e,t){var n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)},r.prototype.addBatchCallback=function(e,t){var n=new Set(t.filter(hs));if(n.size===0){V.error("BatchObservableCallback is not associated with valid instruments",t);return}var o=this._findBatchCallback(e,n);o>=0||this._batchCallbacks.push({callback:e,instruments:n})},r.prototype.removeBatchCallback=function(e,t){var n=new Set(t.filter(hs)),o=this._findBatchCallback(e,n);o<0||this._batchCallbacks.splice(o,1)},r.prototype.observe=function(e,t){return eg(this,void 0,void 0,function(){var n,o,i,a;return tg(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,Wv(jA(jA([],WA(n),!1),WA(o),!1))];case 1:return i=s.sent(),a=i.filter(jv).map(function(c){return c.reason}),[2,a]}})})},r.prototype._observeCallbacks=function(e,t){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return eg(n,void 0,void 0,function(){var s,c;return tg(this,function(l){switch(l.label){case 0:return s=new GA(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a._metricStorages.forEach(function(u){u.record(s._buffer,e)}),[2]}})})})},r.prototype._observeBatchCallbacks=function(e,t){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return eg(n,void 0,void 0,function(){var s,c;return tg(this,function(l){switch(l.label){case 0:return s=new VA,c=Promise.resolve(i(s)),t!=null&&(c=Un(c,t)),[4,c];case 1:return l.sent(),a.forEach(function(u){var d=s._buffer.get(u);d!=null&&u._metricStorages.forEach(function(m){m.record(d,e)})}),[2]}})})})},r.prototype._findCallback=function(e,t){return this._callbacks.findIndex(function(n){return n.callback===e&&n.instrument===t})},r.prototype._findBatchCallback=function(e,t){return this._batchCallbacks.findIndex(function(n){return n.callback===e&&$v(n.instruments,t)})},r}();var mU=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),qA=function(r){mU(e,r);function e(t,n,o,i,a){var s=r.call(this,t)||this;return s._attributesProcessor=o,s._aggregationCardinalityLimit=a,s._deltaMetricStorage=new Hc(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new Gc(n,i),s}return e.prototype.record=function(t,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(t,n,o,i)},e.prototype.collect=function(t,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(t,this._instrumentDescriptor,o,n)},e}(zc);var KA=function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},r(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");r(e,t);function n(){this.constructor=e}e.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),Ii=function(){function r(){}return r.Noop=function(){return gU},r}();var pU=function(r){KA(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(Ii);var YA=function(r){KA(e,r);function e(t){var n=r.call(this)||this;return n._allowedAttributeNames=t,n}return e.prototype.process=function(t,n){var o=this,i={};return Object.keys(t).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=t[a]}),i},e}(Ii);var gU=new pU;var hU=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},fU=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},SU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},XA=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new zA,this.observableRegistry=new $A,this.meter=new kA(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,qA);return t.length===1?t[0]:new HA(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,BA);return t},r.prototype.collect=function(e,t,n){return hU(this,void 0,void 0,function(){var o,i,a;return fU(this,function(s){switch(s.label){case 0:return[4,this.observableRegistry.observe(t,n?.timeoutMillis)];case 1:return o=s.sent(),i=this.metricStorageRegistry.getStorages(e),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(e,t)}).filter(Gv),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},r.prototype._registerMetricStorage=function(e,t){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope),i=o.map(function(c){var l=Yv(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),m=new t(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(m),m});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=SU(c,2),u=l[0],d=l[1],m=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(m!=null)return m;var p=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new t(e,p,Ii.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var yU=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},JA=function(){function r(e){this.resource=e,this.viewRegistry=new MA,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=Vv(e),n=this.meterSharedStates.get(t);return n==null&&(n=new XA(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=yU(this.metricCollectors),a=i.next();!a.done;a=i.next()){var s=a.value;o.push([s,s.selectAggregation(e)])}}catch(c){t={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(t)throw t.error}}return o},r}();var Vc=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},Wc=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},bU=function(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,i=[],a;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(a)throw a.error}}return i},EU=function(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,i;n<o;n++)(i||!(n in e))&&(i||(i=Array.prototype.slice.call(e,0,n)),i[n]=e[n]);return r.concat(i||Array.prototype.slice.call(e))},QA=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return Vc(this,void 0,void 0,function(){var t,n,o,i,a=this;return Wc(this,function(s){switch(s.label){case 0:return t=To(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return Vc(a,void 0,void 0,function(){var l;return Wc(this,function(u){switch(u.label){case 0:return[4,c.collect(this,t,e)];case 1:return l=u.sent(),l?.scopeMetrics!=null&&n.push(l.scopeMetrics),l?.errors!=null&&o.push.apply(o,EU([],bU(l.errors),!1)),[2]}})})}),[4,Promise.all(i)];case 1:return s.sent(),[2,{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:o}]}})})},r.prototype.forceFlush=function(e){return Vc(this,void 0,void 0,function(){return Wc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.forceFlush(e)];case 1:return t.sent(),[2]}})})},r.prototype.shutdown=function(e){return Vc(this,void 0,void 0,function(){return Wc(this,function(t){switch(t.label){case 0:return[4,this._metricReader.shutdown(e)];case 1:return t.sent(),[2]}})})},r.prototype.selectAggregationTemporality=function(e){return this._metricReader.selectAggregationTemporality(e)},r.prototype.selectAggregation=function(e){return this._metricReader.selectAggregation(e)},r.prototype.selectCardinalityLimit=function(e){var t,n,o;return(o=(n=(t=this._metricReader).selectCardinalityLimit)===null||n===void 0?void 0:n.call(t,e))!==null&&o!==void 0?o:2e3},r}();var ZA=function(r,e,t,n){function o(i){return i instanceof t?i:new t(function(a){a(i)})}return new(t||(t=Promise))(function(i,a){function s(u){try{l(n.next(u))}catch(d){a(d)}}function c(u){try{l(n.throw(u))}catch(d){a(d)}}function l(u){u.done?i(u.value):o(u.value).then(s,c)}l((n=n.apply(r,e||[])).next())})},ew=function(r,e){var t={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function s(l){return function(u){return c([l,u])}}function c(l){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,o&&(i=l[0]&2?o.return:l[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,l[1])).done)return i;switch(o=0,i&&(l=[l[0]&2,i.value]),l[0]){case 0:case 1:i=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,o=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(i=t.trys,!(i=i.length>0&&i[i.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!i||l[1]>i[0]&&l[1]<i[3])){t.label=l[1];break}if(l[0]===6&&t.label<i[1]){t.label=i[1],i=l;break}if(i&&t.label<i[2]){t.label=i[2],t.ops.push(l);break}i[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(r,t)}catch(u){l=[6,u],o=0}finally{n=i=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},tw=function(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};function TU(r,e){var t=e??Uc.empty();return r?Uc.default().merge(t):t}var rg=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new JA(TU((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=tw(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(p){t={error:p}}finally{try{c&&!c.done&&(n=s.return)&&n.call(s)}finally{if(t)throw t.error}}if(e?.readers!=null&&e.readers.length>0)try{for(var u=tw(e.readers),d=u.next();!d.done;d=u.next()){var m=d.value;this.addMetricReader(m)}}catch(p){o={error:p}}finally{try{d&&!d.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}}return r.prototype.getMeter=function(e,t,n){return t===void 0&&(t=""),n===void 0&&(n={}),this._shutdown?(V.warn("A shutdown MeterProvider cannot provide a Meter"),sp()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new QA(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return ZA(this,void 0,void 0,function(){return ew(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("shutdown may only be called once per MeterProvider"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(e)}))]);case 1:return t.sent(),[2]}})})},r.prototype.forceFlush=function(e){return ZA(this,void 0,void 0,function(){return ew(this,function(t){switch(t.label){case 0:return this._shutdown?(V.warn("invalid attempt to force flush after MeterProvider shutdown"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(e)}))];case 1:return t.sent(),[2]}})})},r}();var vU=/[\^$\\.+?()[\]{}|]/g,jc=function(){function r(e){e==="*"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}return r.prototype.match=function(e){return this._matchAll?!0:this._regexp.test(e)},r.escapePattern=function(e){return"^"+e.replace(vU,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Oi=function(){function r(e){this._matchAll=e===void 0,this._pattern=e}return r.prototype.match=function(e){return!!(this._matchAll||e===this._pattern)},r}();var rw=function(){function r(e){var t;this._nameFilter=new jc((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Oi(e?.unit)}return r.prototype.getType=function(){return this._type},r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getUnitFilter=function(){return this._unitFilter},r}();var nw=function(){function r(e){this._nameFilter=new Oi(e?.name),this._versionFilter=new Oi(e?.version),this._schemaUrlFilter=new Oi(e?.schemaUrl)}return r.prototype.getNameFilter=function(){return this._nameFilter},r.prototype.getVersionFilter=function(){return this._versionFilter},r.prototype.getSchemaUrlFilter=function(){return this._schemaUrlFilter},r}();function AU(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var $c=function(){function r(e){var t;if(AU(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||jc.hasWildcard(e.instrumentName)))throw new Error("Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.");e.attributeKeys!=null?this.attributesProcessor=new YA(e.attributeKeys):this.attributesProcessor=Ii.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:pr.Default(),this.instrumentSelector=new rw({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new nw({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var Hue=process.env.APP||"unknown";Le();import{v4 as wU}from"uuid";function CU(){return new Bv({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:bo.DELTA})}var RU=[new $c({instrumentName:"test_event_duration",instrumentType:ye.HISTOGRAM,aggregation:new gs([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new $c({instrumentName:"test_step_duration",instrumentType:ye.HISTOGRAM,aggregation:new gs([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],Kc=class{globalAttributes;provider;meter;counterCache=new Map;histogramCache=new Map;observableGaugeCache=new Map;gaugeValues=new Map;getCounter(e){let t=this.counterCache.get(e);if(t)return t;let n=this.meter.createCounter(e);return this.counterCache.set(e,n),n}getHistogram(e){let t=this.histogramCache.get(e);if(t)return t;let n=this.meter.createHistogram(e);return this.histogramCache.set(e,n),n}ensureObservableGauge(e){let t=this.observableGaugeCache.get(e);if(t)return t;let n=this.meter.createObservableGauge(e);return n.addCallback(o=>{let i=this.gaugeValues.get(e);i!==void 0&&o.observe(i,this.globalAttributes)}),this.observableGaugeCache.set(e,n),n}constructor(e){this.globalAttributes={...e.globalAttributes??{}};let t=typeof process<"u"?"production":"unknown",n=new Cp({[dc]:e.serviceName,[DT]:t,[UT]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:wU()}),o=CU(),i=new Yp({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new rg({resource:n,readers:[i],views:RU}),sc.setGlobalMeterProvider(this.provider),this.meter=sc.getMeter("momentic-serverless")}increment(e,t,n){try{let o=oc(n,this.globalAttributes);this.getCounter(e).add(typeof t=="number"?t:1,o)}catch{}}gauge(e,t){try{this.ensureObservableGauge(e),this.gaugeValues.set(e,t)}catch{}}distribution(e,t,n){try{let o=oc(n,this.globalAttributes);this.getHistogram(e).record(t,o)}catch{}}async flush(){try{await this.provider.forceFlush()}catch{}}async recordDuration({fn:e,name:t,tags:n}){let o=Date.now();try{return await Promise.resolve(e())}finally{this.distribution(t,Date.now()-o,n)}}};var Tt=new nc;function ow(r){r.disabled||(Tt=new Kc(r))}import{hostname as _U}from"os";import PU from"path";import{_android as IU}from"playwright";async function iw(r){let{apiClient:e,logger:t,creationOpts:n,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s}=r,{token:c,webRtcUrl:l,adbUrl:u,name:d,apkDownloadUrl:m,region:p,playwrightServerUrl:g}=await e.createAndroidEmulator({...n,hostname:_U(),sessionId:s}),h;try{MU("adb --version"),h="adb"}catch{if(process.env.ANDROID_HOME)h=PU.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new Error("The adb binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:d,apkToInstall:n.apkToInstall,region:p,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:g},"Android instance creation ok");let f=await Tt.recordDuration({fn:async()=>await xU({adbUrl:u,endpointUrl:l,token:c,logLevel:i,adbPath:h}),name:"test_event_duration",tags:["name:limbar-client-creation",`orgId:${a}`]}),E=["https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-v7.6.2.apk","https://github.com/appium/appium-uiautomator2-server/releases/download/v7.6.2/appium-uiautomator2-server-debug-androidTest.apk","https://github.com/appium/io.appium.settings/releases/download/v5.14.15/settings_apk-debug.apk"];m&&E.push(m);let b=n.apkToInstall?.channel,C=n.apkToInstall?.tag;o(`Installing APK${b?` with channel ${b}`:""}${C?` and tag ${C}`:""}`),await Promise.all(E.map(A=>f.sendAsset(A))),o("Starting ADB tunnel");let R=await Tt.recordDuration({fn:async()=>await f.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),v=()=>{R.close(),f.disconnect()},M;return g&&(o("Opening Playwright connection"),M=await Tt.recordDuration({fn:async()=>await IU.connect(g),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:R.address.port,close:v,limbarToken:c,limbarUrl:l,emulatorName:d,playwrightDevice:M,client:f}}import QU from"fs";function ft(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var un={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},dn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},ng={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},og={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function sw(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?dn[r.operation]:un[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?dn[r.operation]:un[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?og[r.condition]:ng[r.condition];default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}var Fde={CONTENT:"The page"};function lw(r){switch(r.type){case"SUBSTRING":return`match substring '${r.url}'`;case"REGEX":return`match regex '${r.regex}'`;case"GLOB":return`match glob '${r.glob}'`;case"DOMAIN":return`match domain '${r.domain}'`;default:return(t=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function ig(r){return`${r.negated?dn.CONTAINS:un.CONTAINS} '${r.value}'`}function cw(r){switch(r.type){case"CONTENT":return ig(r);default:return r.type,""}}function OU(r){return typeof r=="object"&&r!==null}function wo(r){if(Array.isArray(r))return r.map(wo);if(OU(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=wo(n))}),e}return r}function jr(r,e,t,n){let{negated:o,ignoreCase:i}=n,a=r.trim(),s=e.trim();i&&(a=a.toLowerCase(),s=s.toLowerCase());let c;switch(t){case"CONTAINS":{c=a.includes(s);break}case"EQUALS":{c=a===s;break}case"STARTS_WITH":{c=a.startsWith(s);break}case"EXISTS":{c=a.length>0;break}default:throw new Error(`Unrecognized content assertion type: ${t}`)}return o?!c:c}function Yc(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function gr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?ng[r.condition]:og[r.condition]:r.negated?un[r.operation]:dn[r.operation]}import{diff as LU}from"deep-object-diff";import{cloneDeep as lme}from"lodash-es";function Xc(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(LU(r,e)).length>0}function ag({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(m,p)=>{try{let g=Mn.parse(p.value);if(g.type!==m.type){o.warn({parsedCacheEntry:g,command:m},"Not using step cache due to type mismatch"),s.push(p.key);return}m.cache=g.cache,a.push(p.key),c.push(p.uniqueKey)}catch(g){s.push(p.key),o.error({err:g,cacheEntry:p},"Not using step cache due to parsing error")}},d=(m,p)=>{let g=DU(m.id,p),h=g.find(f=>!!n[f]);if(h)u(m,n[h]);else{if(m.type==="AI_CHECK")return;s.push(g[0])}};for(let m of r)switch(m.type){case"MOBILE_PRESET_STEP":{if(!Ml(m.command)||m.command.type==="TYPE"&&!m.command.target||"cache"in m.command&&m.command.cache)continue;l++,d(m.command,i);break}case"RESOLVED_MOBILE_MODULE":{l+=m.steps.length;let{cacheKeysHit:p,cacheKeysMissed:g,uniqueKeysHit:h}=ag({...t,steps:m.steps,keyPrefix:i?`${i}:${m.id}`:m.id,topLevel:!1});a.push(...p),s.push(...g),c.push(...h);break}case"MOBILE_AI_ACTION_STEP":{l++;break}default:{let p=m}}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(m=>m.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function NU(r,e){return e?`${e}:${r}`:r}function DU(r,e){let t=[],n=e?.split(":")??[];for(let o=n.length;o>=0;o--){let i=[...n.slice(o),r];t.push(i.join(":"))}return t.reverse(),t}function sg(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
40
+ ${JSON.stringify(t)}`);let n=[];return n.push({key:NU(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Jc({cmd:r,newTarget:e,key:t,logger:n,updatedWithAI:o}){if(r.type==="DRAG")if(t!=="fromTarget"&&t!=="toTarget")n.error({cmd:r,newTarget:e,key:t},"Attempted to apply invalid cache to DRAG command");else{let i=r.cache?.updatedAt;r.cache={...r.cache,[t]:e,updatedAt:i&&!o?i:new Date}}else if(t==="target"&&Pd(r)){let i=r.cache?.updatedAt;r.cache={...r.cache,target:e,updatedAt:i&&!o?i:new Date}}else n.error({cmd:r,newTarget:e,key:t},"Invalid target cache application")}function fs(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;Xc(n,e)&&(t.info({updatedTraces:e,oldCmd:r},"Wrote new memory to assertion command"),r.cache={...r.cache,memory:{type:"GCS_TRACES",traces:e},updatedAt:new Date})}function lg(r){return{...r,serializedHtml:void 0,nodeOnlySerializedHtml:void 0,screenshotUrl:void 0,boundingBox:void 0,selector:void 0,hybridSelector:void 0,generatedSelectors:void 0,id:-1}}function dw(r,e){return r?Xc(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:lg(e.target),updatedAt:e.updatedAt}}function kU(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${li(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${li(r.target)}`:""}`;case"PRESS":return`Press the ${r.key} button`;case"PRESS_KEYBOARD":return`Press the ${r.key} key`;case"SWIPE":return r.scrollableElement.type==="CUSTOM"?`Swipe ${r.direction} in container: ${r.scrollableElement.target.description}`:`Swipe ${r.direction} in the ${r.scrollableElement.type.toLowerCase()}`;case"SCROLL_TO":{let e=r.scrollStepPercent?` (${Math.round(r.scrollStepPercent*100)}% per step)`:"";return`Scroll ${r.direction} to find: ${r.target.description}${e}`}case"DRAG_AND_DROP":return`Drag ${li(r.fromTarget)} to ${li(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${cw(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${li(r.target)} ${sw(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"JAVASCRIPT":return`Execute JavaScript: ${r.code}`;case"REQUEST":return`Make API request to ${r.url}`;case"WAIT":return`Wait ${r.timeoutSecs} seconds`;case"ADD_FILE":return`Add file: ${r.file} to ${r.storageLocation}`;case"INSTALL_APP":return`Install app: ${r.uri}`;case"UNINSTALL_APP":return`Uninstall app: ${r.packageName}`;case"TOGGLE_SETTINGS":{let e;switch(r.settingsType){case"AIRPLANE_MODE":e="airplane mode";break;case"DATA":e="data connection";break;case"WIFI":e="Wi-Fi";break;case"LOCATION":e="location services";break;default:{let t=r.settingsType;e=String(r.settingsType)}}return`Toggle ${e}`}case"ADB":return`ADB command: ${r.command}`;case"KILL_APP":return"Kill active app";case"STATE":return"Send debug state to Momentic";default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}function cg(r){switch(r.type){case"MOBILE_PRESET_STEP":return kU(r.command);case"MOBILE_MODULE_STEP":return`Module ${r.moduleId}`;case"RESOLVED_MOBILE_MODULE":return`Module ${r.name}`;case"MOBILE_AI_ACTION_STEP":return`AI action: ${r.text}`;default:{let e=r;throw new Error("If Typescript complains about the line above, you missed a case or break in the switch above")}}}import{cloneDeep as Hw}from"lodash-es";import ug from"semver";function Qc(r,e){if(r!=="0.0.1"&&r!==e[e.length-1].toVersion)throw new Error("Please bump latestSchemaVersion in types package after adding a migration");e.forEach((t,n)=>{if(!ug.valid(t.toVersion)||!ug.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!ug.gt(t.toVersion,t.fromVersion))throw new Error(`Migration '${t.name}' has toVersion <= fromVersion`);if(n===0)return;if(e[n-1].toVersion!==t.fromVersion)throw new Error(`Migration '${t.name}' at index ${n} is not contiguous with previous migration`)})}import UU from"diff-lines";import FU,{gte as BU}from"semver";function zU(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function dg({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>FU.gt(d.toVersion,a));if(c===-1)return{steps:i,newVersion:a};let l=a;for(let d=c;d<o.length;d++){if(n&&BU(l,n)){t.debug("Stopping migration early because toVersion was reached");break}let m=o[d],p={id:s,migration:m.name,toVersion:m.toVersion};try{i=await mw(i,m),l=m.toVersion}catch(g){throw t.error({err:g,...p},"Migration failed"),new Error(`Step migration ${m.name} failed: ${g}`)}}let u=UU(JSON.stringify(e,void 0,2),JSON.stringify(i,void 0,2),{n_surrounding:1});return u.trim()&&t.debug({diffs:u,id:s},"Migration diffs"),{newVersion:l,steps:i}}async function mw(r,e){let t=await e.execute(r);for(let n of t)for(let o of Object.keys(n)){if(!e.recursiveKeys.has(o))continue;let i=n[o];!i||!Array.isArray(i)||zU(i)&&(n[o]=await mw(i,e))}return t}var pw={name:"Migrate API request body types",fromVersion:"0.0.1",toVersion:"0.0.2",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="MOBILE_PRESET_STEP")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var gw=[pw];Qc(oo,gw);async function mg({metadata:r,steps:e,logger:t,toVersion:n}){return await dg({metadata:r,steps:e,logger:t,toVersion:n,migrations:gw})}var hw={name:"Migrate to ai step v2",fromVersion:"1.0.4",toVersion:"1.0.5",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>(r=r.filter(e=>!(e.status!==void 0&&e.type==="AI_ACTION")),r=r.map(e=>(e.status===void 0||e.type==="PRESET_ACTION"&&(e.results=e.commands??e.results??[]),e)),r)};var fw={name:"Make sure ai step v2 has done command",fromVersion:"1.0.5",toVersion:"1.0.6",recursiveKeys:new Set(["results","commands"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="AI_ACTION"||e.status!==void 0||!e.commands||!e.commands.length)return e;let t=e.commands,n=t[t.length-1];return n&&n.type!=="SUCCESS"&&t.push({type:"SUCCESS"}),e})};var HU=["target","fromTarget","toTarget"];function Sw(r){for(let e of HU){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var yw={name:"Migrate element target to discriminated union",fromVersion:"1.0.6",toVersion:"1.0.7",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":return Sw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])Sw(n);return e}default:return e}})};import{v4 as GU}from"uuid";var bw={name:"Ensure module steps have ids",fromVersion:"1.0.7",toVersion:"1.0.8",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"MODULE":return e.id||(e.id=GU()),e;default:return e}})};import{v4 as Ew}from"uuid";var Tw={name:"Ensure module steps have ids",fromVersion:"1.0.8",toVersion:"1.0.9",recursiveKeys:new Set(["results","steps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return t.id=t.id??Ew(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??Ew()}})),delete e.commands),e;default:return e}})};var vw={name:"Migrate ai waits to checks",fromVersion:"1.0.9",toVersion:"1.0.10",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{switch(e.type){case"PRESET_ACTION":{if(!e.command)return e;let t=e.command;return typeof t.type!="string"||t.type!=="AI_WAIT"||(t.type="AI_ASSERTION",t.timeout||(t.timeout=10)),e}default:return e}})};import{v4 as VU}from"uuid";var Aw={name:"Add ids to all steps",fromVersion:"1.0.10",toVersion:"1.0.11",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>("id"in e&&typeof e.id=="string"||(e.id=VU()),e))};import{v4 as ww}from"uuid";var Cw={name:"Add ids to all steps",fromVersion:"1.0.11",toVersion:"1.0.12",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if("id"in e&&typeof e.id=="string")return e;if("condition"in e&&typeof e.condition=="object"&&e.condition){let t=e.condition;t.id||(t.id=ww())}return e.id=ww(),e})};var Rw={name:"Move env key to steps",fromVersion:"1.0.12",toVersion:"1.0.13",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};import{v4 as WU}from"uuid";var xw={name:"Redo last two migrations",fromVersion:"1.0.13",toVersion:"1.0.14",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if((!("id"in e)||typeof e.id!="string")&&(e.id=WU()),e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||typeof t.envKey!="string"||(e.envKey=t.envKey,delete t.envKey),e})};var Mw={name:"Migrate select choice",fromVersion:"1.0.14",toVersion:"1.0.15",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="SELECT_OPTION"||e.option===void 0||(e.choice={type:"VALUE",value:t.option},e.option=void 0),e})};var _w={name:"Migrate select choice",fromVersion:"1.0.15",toVersion:"1.0.16",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return t&&Pw(t),e})};function Pw(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){Pw(r[e]);return}if(typeof r[e]!="string")return;let t=r[e];e==="code"?r[e]=t.replace(/inputs\./g,"env."):t.includes("{{")&&t.includes("}}")&&(r[e]=t.replace(/inputs\./g,"env."))})}var Iw={name:"Migrate switch tab choice",fromVersion:"1.0.16",toVersion:"1.0.17",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TAB"||t.url===void 0||(t.action={type:"SUBSTRING",substring:t.url},t.url=void 0),e})};var Ow={name:"Remove press keys sequentially",fromVersion:"1.0.17",toVersion:"1.0.18",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="TYPE"?e:t.pressKeysSequentially===void 0?(t.delay=0,e):(t.pressKeysSequentially&&(t.pressKeysSequentially=void 0,t.delay=50),e)})};var Lw={name:"Migrate wait for URL to matcher",fromVersion:"1.0.18",toVersion:"1.0.19",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="WAIT_FOR_URL"||t.url===void 0||(t.matcher={type:"GLOB",glob:t.url},t.url=void 0),e})};var Nw={name:"Migrate select choice round 2",fromVersion:"1.0.19",toVersion:"1.0.20",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!0,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t)return e;if(t.type==="SELECT_OPTION"){if(t.option===void 0)return e;t.choice={type:"VALUE",value:t.option},t.option=void 0}else if(t.type==="TAB"){if(t.url===void 0)return e;t.action={type:"SUBSTRING",substring:t.url},t.url=void 0}else if(t.type==="WAIT_FOR_URL"){if(t.url===void 0)return e;t.matcher={type:"GLOB",glob:t.url},t.url=void 0}else t.type==="AI_WAIT"&&(t.type="AI_ASSERTION",t.timeout||(t.timeout=10));return e})};var Dw={name:"Migrate ",fromVersion:"1.0.20",toVersion:"1.0.21",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;return!t||t.type!=="MOCK_ROUTE"&&t.type!=="SET_HEADER"&&t.type!=="RECORD_REQUESTS"&&t.type!=="REGISTER_REQUEST_LISTENER"||(t.type==="REGISTER_REQUEST_LISTENER"||t.type==="RECORD_REQUESTS"?t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.pattern}}:(t.type==="SET_HEADER"||t.type==="MOCK_ROUTE")&&t.urlPattern&&(t.requestMatcher={urlMatcher:{type:"REGEX",regex:t.urlPattern}})),e})};var kw={name:"Migrate API request body types",fromVersion:"1.0.21",toVersion:"1.0.22",recursiveKeys:new Set(["results","steps","blocks","elseSteps"]),stopOnFailure:!1,execute:async r=>r.map(e=>{if(e.type!=="PRESET_ACTION")return e;let t=e.command;if(!t||t.type!=="REQUEST")return e;let n=typeof t.body=="string"&&t.body.length>0?{type:"json",content:t.body}:void 0;return t.body=n,e})};var Uw={name:"Migrate AI checks to preset actions",fromVersion:"1.0.0",toVersion:"1.0.1",recursiveKeys:new Set,execute:async r=>r.map(e=>{if(e.type!=="AI_ASSERTION")return e;let n={type:"PRESET_ACTION",command:{type:"AI_ASSERTION",assertion:e.text,useVision:!1,disableCache:!0}},o={...e,...n};return delete o.text,o}),stopOnFailure:!0};var Zc=new Set(["CLICK","TYPE","SELECT_OPTION"]),Fw={name:"Migrate element descriptor to live in a target object",fromVersion:"1.0.3",toVersion:"1.0.4",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type,o=t?.elementDescriptor;return(o!==void 0||Zc.has(n))&&(t.target={elementDescriptor:o??""}),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(a=>{let s=a?.elementDescriptor,c=a?.type;(s!==void 0||Zc.has(c))&&(a.target={elementDescriptor:s??""})}),e.results&&Array.isArray(e.results)&&e.results.forEach(a=>{let s=a.command,c=s?.elementDescriptor,l=s?.type;(c!==void 0||Zc.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let m=d?.elementDescriptor,p=d?.type;(m!==void 0||Zc.has(p))&&(d.target={elementDescriptor:m??""})})}),e}),stopOnFailure:!0};var Bw={name:"Migrate FAILURE status to FAILED",fromVersion:"1.0.1",toVersion:"1.0.2",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e;return t.status==="FAILURE"&&(t.status="FAILED"),typeof t.commands=="object"&&Array.isArray(t.commands)&&t.commands.forEach(n=>{if(n&&typeof n=="object"){let o=n;o?.status==="FAILURE"&&(o.status="FAILED")}}),t}),stopOnFailure:!0};var zw={name:"Migrate preset step types to use the same",fromVersion:"1.0.2",toVersion:"1.0.3",recursiveKeys:new Set,execute:async r=>r.map(e=>{let t=e.command,n=t?.type;return n?.startsWith("PRESET_")&&(t.type=n.slice(7)),e.commands&&Array.isArray(e.commands)&&e.commands.forEach(i=>{let a=i.type;a?.startsWith("PRESET_")&&(i.type=a.slice(7))}),e.results&&Array.isArray(e.results)&&e.results.forEach(i=>{let a=i.command,s=a?.type;s?.startsWith("PRESET_")&&(a.type=s.slice(7)),i.commands&&Array.isArray(i.commands)&&i.commands.forEach(l=>{let u=l.type;u?.startsWith("PRESET_")&&(l.type=u.slice(7))})}),e}),stopOnFailure:!0};var jU=[Uw,Bw,zw,Fw,hw,fw,yw,bw,Tw,vw,Aw,Cw,Rw,xw,Mw,_w,Iw,Ow,Lw,Nw,Dw,kw];Qc(Cn,jU);async function Gw(r){let e={},{resolvedSteps:t,newSchemaVersion:n}=await eu({rawSteps:r.rawStepLists.steps,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e}),o={steps:t};for(let i of["beforeSteps","afterSteps"]){let a=r.rawStepLists[i];if(!a)continue;let{resolvedSteps:s}=await eu({rawSteps:a,onFetchModule:r.onFetchModule,logger:r.logger,metadata:r.testMetadata,resolvedModuleCache:e});o[i]=s}return{resolvedStepLists:o,moduleIds:Array.from(Object.keys(e))}}async function qU(r,e,t){let{newVersion:n,steps:o}=await mg({metadata:r,steps:e,logger:t});try{return{steps:Vt.array().parse(o),newVersion:n}}catch(i){throw t.error({type:"zod",err:i,newVersion:n,id:r.id,steps:o},"Failed to parse test steps while migrating test"),new fa(`Failed to parse test steps while migrating test: ${i}`,r.id,"entity",{cause:i})}}async function eu({rawSteps:r,onFetchModule:e,logger:t,metadata:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await qU(n,r,t),s=[];for(let c of a)s.push(await Vw({rawStep:Vt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function Vw({rawStep:r,onFetchModule:e,logger:t,resolvedModuleCache:n}){switch(r.type){case"MOBILE_MODULE_STEP":{let o=r.moduleId,i=n[o];if(i)return{...Hw(i),...r,type:"RESOLVED_MOBILE_MODULE"};let a=await e(o);if(!a)throw new Error(`Could not find module with id ${o}`);let s;try{s=Vt.array().parse(a.steps)}catch(u){throw t.error({err:u,steps:a.steps,moduleId:o},"Module failed to parse (mobile)"),u}let c=await Promise.all(s.map(u=>Vw({rawStep:u,onFetchModule:e,logger:t,resolvedModuleCache:n}))),l={...a,description:a.description||void 0,steps:c};return n[o]=Hw(l),{...l,...r,type:"RESOLVED_MOBILE_MODULE"}}case"MOBILE_AI_ACTION_STEP":case"MOBILE_PRESET_STEP":return r}}import{diff as Ww}from"deep-object-diff";import{cloneDeep as jw}from"lodash-es";import{v4 as pg}from"uuid";async function $r(r){let e=new Map,t=new Set,n=jw(r.steps),o=await qw({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function KU({newEntries:r,originalCachesMap:e}){let t=[];for(let n of r){let o=e[n.key],i=n.value.cache;if(!i)continue;if(!o||!o.cache){t.push(n);continue}if(n.value.type!==o.type){t.push(n);continue}let a=bn.safeParse(i),s=bn.safeParse(o);if(a.success&&s.success&&a.data.memory){let m=s.data.memory,p=a.data.memory;Xc(m,p)&&(n.value.cache={...s.data,memory:p,updatedAt:a.data.updatedAt},t.push(n));continue}let c=xn.safeParse(i),l=xn.safeParse(o);if(c.success&&l.success){let m=Ss({originalCache:l.data,newCache:c.data,targetGetter:p=>p.target});m.changed&&(n.value.cache=m.result,t.push(n));continue}let u=xl.safeParse(i),d=xl.safeParse(o);if(u.success&&d.success){let m=Ss({originalCache:d.data,newCache:u.data,targetGetter:g=>g.fromTarget}),p=Ss({originalCache:{...d.data,fromTarget:m.result.fromTarget},newCache:u.data,targetGetter:g=>g.toTarget});(m.changed||p.changed)&&(n.value.cache=p.result,t.push(n));continue}}return t}async function $w({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await $r({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await $r({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=KU({newEntries:c,originalCachesMap:s});if(l.length){r.debug({prunedCaches:l},"Saving pruned mobile memory post-failure");try{await e.saveEntries({logger:r,testId:n,entries:l})}catch(u){r.error({err:u},"Failed to save mobile memory post-failure. This is not critical, but can impact future performance.")}}}async function qw({steps:r,...e}){let{seenModules:t,cacheCreationParams:n,moduleIdParents:o,moduleStepParents:i,moduleIdReplacements:a,shouldCreateNewModuleId:s,createNewCacheIds:c}=e,l={cachesToSave:[],stepsToSave:[],moduleUpdates:[]};for(let u of r)switch(u.id=c?pg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?pg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(sg({id:d.id,orgId:n.orgId,testId:n.testId,value:Mn.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?pg():u.id,m=u.moduleId;a.has(m)?m=a.get(m):s!==void 0&&(m=await s(u),a.set(u.moduleId,m));let{cachesToSave:p,stepsToSave:g,moduleUpdates:h}=await qw({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,d],moduleIdParents:[...o,m],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(h),l.cachesToSave=l.cachesToSave.concat(p),t.has(m)||(t.add(m),l.moduleUpdates.push({...Xy.parse(u),steps:Vt.array().parse(g),moduleId:m}));let f=La.parse({...u,type:"MOBILE_MODULE_STEP",moduleId:m,inputs:u.inputs,id:d});l.stepsToSave.push(f);break}case"MOBILE_AI_ACTION_STEP":{l.stepsToSave.push(u);break}default:{let d=u}}return l}function Ss({originalCache:r,newCache:e,targetGetter:t}){let n=t(r),o=t(e),i=jw(r),a=t(i),s=!1;if(o.memory){let c=n.memory,l=Object.keys(Ww(c??{},o.memory??{}));Object.keys(l).length>0&&(a.memory=o.memory,i.updatedAt=new Date,s=!0)}if(a.type==="WEBVIEW"&&o.type==="WEBVIEW"&&a.browserCache){let c=o.browserCache?.memory,l=n.type==="WEBVIEW"?n.browserCache?.memory:void 0;if(c){let u=Object.keys(Ww(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function YU(r){let e={parentChain:[]};return Kw(r,e),e}function Kw(r,e){let{onPreset:t,onModule:n,earlyStop:o}=r;for(let i of r.steps){if(i.type==="RESOLVED_MOBILE_MODULE"){if(n?.(i,e)&&o||(e.parentChain.push(i),Kw({...r,steps:i.steps},e)&&o))return!0;e.parentChain.pop();continue}if(t(i,e)&&o)return!0}return!1}function XU(r,e,t=[]){let n,o=[],i=(a,s)=>{let c=JSON.stringify(s.parentChain.map(u=>u.id)),l=t.length===0?!0:JSON.stringify(t)===c;return a.id===e&&l?(n=a,o=s.parentChain,!0):!1};return YU({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function Yw({currentStep:r,currentParentChain:e,desiredStepId:t,desiredStepParentChain:n}){let o=Array.from(e),i=Array.from(n);for(let s=0;s<o.length;s++){if(o[s]!==n[s])return!1;i.shift()}return!!XU([r],t,i).result}function Xw(r){let e=r[0],t=r[0],n=!1;for(;!n&&t;)switch(t.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!t.steps.length){e=t,n=!0;break}t=t.steps[0];break;case"MOBILE_PRESET_STEP":e=t,n=!0;break;default:{let s=t}}let o=r[r.length-1],i=r[r.length-1],a=!1;for(;!a&&i;)switch(i.type){case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":if(!i.steps.length){o=i,a=!0;break}i=i.steps[i.steps.length-1];break;case"MOBILE_PRESET_STEP":o=i,a=!0;break;default:{let s=i}}return{firstMetadata:e,lastMetadata:o}}function Jw({result:r,firstMetadata:e,lastMetadata:t}){e&&(r.beforeSnapshot=e.beforeSnapshot),t&&(r.data=t.data,r.afterSnapshot=t.afterSnapshot,t.status!=="SUCCESS"&&(r.message=t.message))}import{cloneDeep as mhe}from"lodash-es";import ghe from"truncate-json";import{v4 as Ahe}from"uuid";import{cloneDeep as rhe,unset as nhe}from"lodash-es";import{cloneDeep as Mhe}from"lodash-es";import{diff as pfe}from"deep-object-diff";import{diff as $he}from"deep-object-diff";import{cloneDeep as Khe}from"lodash-es";import{v4 as cfe}from"uuid";import{cloneDeep as bfe}from"lodash-es";import{cloneDeep as Dfe}from"lodash-es";import{stringify as qfe}from"yaml";async function j(r,e){if(!(r<=0))return new Promise((t,n)=>{if(e?.aborted){n(e.reason);return}e?.addEventListener("abort",i,{once:!0});let o=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r);function i(){clearTimeout(o),e?.removeEventListener("abort",i),n(e?.reason)}})}async function hg({promiseGenerator:r,signal:e,codePath:t,logger:n}){let i=Date.now(),a=setInterval(()=>{if(e?.aborted){clearInterval(a);return}n?.warn({codePath:t,startTime:i,elapsedMilliseconds:Date.now()-i},`Asynchronous operation is taking a long time (${t})`)},5e3);return new Promise((s,c)=>{function l(){clearInterval(a),e?.removeEventListener("abort",l),c(e?.reason)}if(e?.aborted){c(e?.reason),clearInterval(a);return}e?.addEventListener("abort",l,{once:!0}),(async()=>{try{s(await r())}catch(u){c(u)}finally{clearInterval(a),e?.removeEventListener("abort",l)}})()})}async function ys({promiseGenerator:r,timeoutMs:e,codePath:t,logger:n,signal:o}){let i=!1,a=new AbortController,s=()=>{a.abort()},c=setTimeout(()=>{o?.removeEventListener("abort",s),!i&&a.abort()},e);o?.addEventListener("abort",s,{once:!0});try{return await hg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function tu(r){let e;return r>10*60*1e3?e=2*60*1e3:r>60*1e3?e=20*1e3:r>10*1e3?e=2*1e3:e=1e3,e}import JU from"picomatch";var ru=(r,e,t)=>{t?.caseInsensitive&&(r=r.toLowerCase());let n;switch(e.type){case"SUBSTRING":{let o=t?.caseInsensitive?e.url.toLowerCase():e.url;n=r.includes(o);break}case"GLOB":{let o=t?.caseInsensitive?e.glob.toLowerCase():e.glob;n=r===e.glob||JU(o)(r);break}case"REGEX":{n=new RegExp(e.regex).test(r);break}case"DOMAIN":{let o=t?.caseInsensitive?e.domain.toLowerCase():e.domain;n=new URL(r).hostname===o;break}}return t?.negated?!n:n},nu=(r,e)=>{try{let{hostname:t,pathname:n}=new URL(r),{hostname:o,pathname:i}=new URL(e);return t!==o||n!==i}catch{return!1}},Li=r=>{try{return new URL(r),!0}catch{return!1}},Qw=r=>!r.toLowerCase().startsWith("http"),Ni=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Co(r,e){try{return!!new URL(r).origin.trim()}catch(t){return e?.error({url:r,err:t},"Invalid URL in check"),!1}}import{v4 as Zw}from"uuid";function fg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var ou=class{reporter;asyncWork;metadata;creditsUsedV1=0;creditsUsedV2=0;constructor({logger:e,reporter:t,runType:n,runId:o,testMetadata:i,suiteMetadata:a}){this.reporter=t,this.metadata={testId:i.id,testName:i.name,suiteId:a?.id,suiteName:a?.name},this.asyncWork=[t.reportBillableEvents(e,[{event:n,timestamp:new Date().toISOString(),transactionId:o,properties:fg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(Jy(e.type)){this.creditsUsedV2+=1;return}let t=Mm(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=_m(e.command);this.creditsUsedV1+=n??0}}async flush(e){this.creditsUsedV1>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used",timestamp:new Date().toISOString(),transactionId:Zw(),properties:fg({creditsUsed:this.creditsUsedV1},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),this.creditsUsedV2>0&&this.asyncWork.push(this.reporter.reportBillableEvents(e,[{event:"credits-used-v2",timestamp:new Date().toISOString(),transactionId:Zw(),properties:fg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as MSe}from"lodash-es";import{remote as ZU}from"webdriverio";var eF=["If you see 'device offline' in ADB output, the emulator likely reset or crashed. Please start a new editor session by refreshing the page.","If Appium /status does not respond, the Appium server may not have started correctly. Please inspect the log output above for errors."];async function tF(r,e){try{let t=await QU.promises.open(r,"r");try{let{size:n}=await t.stat(),o=Math.max(0,n-e),i=Buffer.alloc(n-o);return await t.read(i,0,i.length,o),i.toString("utf8")}finally{await t.close()}}catch{return}}async function rF(r){try{let e=await fetch(`http://localhost:${r}/status`,{method:"GET",signal:AbortSignal.timeout(5e3)}),t=await e.text();return{ok:!0,statusCode:e.status,body:t}}catch(e){return{ok:!1,error:ul(e)}}}function nF(r){let e=ul(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function eC(r,e){if(!r||!e)return;let t=r.split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0);for(let n of t){if(n.startsWith("List of devices attached")||!n.startsWith(e))continue;let i=n.split(/\s+/)[1]?.toLowerCase();return i==="device"?"device":i==="offline"?"offline":i==="unauthorized"?"unauthorized":"unknown"}}function oF(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function iF(r){let e=(r??"").toLowerCase();return{deviceOffline:e.includes("device offline"),instrumentationCrashed:e.includes("instrumentation process has been unexpectedly terminated"),uiAutomatorCrashed:e.includes("uiautomator2")&&(e.includes("instrumentation")||e.includes("not running")||e.includes("socket hang up"))}}async function aF(r){return{adbSerial:r,devices:await ht(["devices","-l"],{timeoutMs:2500}),state:r?await ht(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await ht(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function sF({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=eC(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?oF(e):void 0;if(r.warn({adbSerial:e,deviceState:i,appiumLogHints:n,transportMode:o},"Attempting best-effort recovery of Android transport"),o==="tunneled"&&s?(await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["disconnect",s],{timeoutMs:5e3}),await j(500),await ht(["connect",s],{timeoutMs:5e3}),await j(500)):(await ht(["kill-server"],{timeoutMs:5e3}),await j(500),await ht(["start-server"],{timeoutMs:5e3}),await j(500),await ht(["reconnect","offline"],{timeoutMs:5e3}),await j(500)),e){let c=await ht(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await ht(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await ht(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function tC({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o;for(let d=1;d<=2;d++)try{return d>1&&e("Retrying Appium session creation..."),{driver:await ZU(t),appiumLogFile:u,appiumServerClose:l}}catch(m){let p=await rF(n),g=await aF(s),h=await tF(u,64*1024),f=iF(h),E=eC(g.devices,s);if(r.error({err:m,appiumPort:n,appiumLogFile:u,appiumStatus:p,adbSnapshot:g,adbDeviceState:E,appiumLogHints:f,appiumLogTail:h},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${ul(m)}`),!(d===1&&(nF(m)||E==="offline"||f.instrumentationCrashed||f.deviceOffline)))throw w.error(`Failed to create Appium WebDriver session. Troubleshooting:
41
+ - ${eF.join(`
42
+ - `)}`),m;try{await sF({logger:r,adbSerial:s,adbSnapshot:g,appiumLogHints:f,transportMode:c})}catch(C){r.warn({err:C},"Android transport recovery failed")}try{await l()}catch(C){r.warn({err:C},"Failed to close Appium server after session start failure")}({close:l,logFile:u}=await a())}throw new Error("Failed to create Appium WebDriver session")}async function iu({onStatusUpdate:r,creationOpts:e,apiClient:t,logger:n,driverLogLevel:o,appiumPort:i,socket:a,orgId:s,sessionId:c}){let l=Date.now();n.info("Starting android driver creation");let u=[],d;if("avdId"in e)d=e;else{d=await iw({apiClient:t,logger:n,creationOpts:e,onStatusUpdate:r,orgId:s,sessionId:c});let g=d.emulatorName;u.push(()=>t.deleteAndroidEmulator(g),d.close)}let m=async()=>{for(let g=u.length-1;g>=0;g-=1)try{await u[g]()}catch(h){if(h instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(f=>h.message.includes(f)))continue;n.warn({err:h},"Error running cleanup task")}},p=async()=>{if(a&&!a.connected)throw await m(),new Error("Client disconnected before Appium driver could be started, cleaning up...")};await p();try{let g=await pF({logger:n,driverLogLevel:o,appiumPort:i,emulatorStart:l,emulatorCreationParams:d,apiClient:t,onStatusUpdate:r,creationOpts:e,orgId:s,sessionId:c});return u.push(g.appiumClose),u.push(async()=>g.driver.deleteSession()),await p(),{...d,...g,cleanup:m,appiumPort:i}}catch(g){throw await m(),new Error(`Failed to start Appium driver: ${g}`)}}async function pF({logger:r,driverLogLevel:e="warn",emulatorStart:t,appiumPort:n,emulatorCreationParams:o,onStatusUpdate:i,creationOpts:a}){let s=[],{adbPort:c,emulatorName:l}=o,u,d="tunneled";if(!c){d="local";let I=0;for(;I<10;){let k=5555+Math.floor(Math.random()*30);if(k%2!==0&&(k=Math.min(k+1,5584)),await rc(k)&&await rc(k+1)){u=k,c=k+1;break}I+=1}if(!c)throw new Error(`Failed to find an available ADB port after ${I} attempts`)}l||(l=`emulator-${u}`,i("Killing existing emulators..."),await nC(r),s.push(()=>nC(r)),i("Starting new emulator..."));let m=Date.now(),{close:p,logFile:g}=await rC({logger:r,logLevel:e,appiumPort:n}),h={platformName:"Android","appium:automationName":"UiAutomator2","appium:deviceName":"Android","appium:udid":`127.0.0.1:${c}`,"appium:adbExecTimeout":3e4,"appium:newCommandTimeout":3600,"appium:skipDeviceInitialization":!0,"appium:skipServerInstallation":!0,"appium:androidInstallTimeout":6e4,"appium:autoWebview":!1,"appium:autoWebviewTimeout":0,"appium:clearDeviceLogsOnStart":!0,"appium:ensureWebviewsHavePages":!0},f={hostname:"localhost",port:n,logLevel:e,capabilities:h,connectionRetryTimeout:15e3,connectionRetryCount:2};if("avdId"in o){h["appium:avd"]=o.avdId,h["appium:avdLaunchTimeout"]=18e4,h["appium:avdReadyTimeout"]=18e4,h["appium:skipDeviceInitialization"]=!1,h["appium:skipServerInstallation"]=!1,h["appium:udid"]=void 0;let I=gF();h["appium:avdArgs"]=`-port ${u} -memory ${I} -no-snapshot-save -no-boot-anim -noaudio`,f.connectionRetryTimeout=12e4,f.connectionRetryCount=3}let E="avdId"in o?l:`127.0.0.1:${c}`,b=Date.now(),{driver:C,appiumLogFile:R,appiumServerClose:v}=await tC({logger:r,onStatusUpdate:i,wdOpts:f,appiumPort:n,appiumLogFile:g,appiumServerClose:p,transportMode:d,startAppiumServer:async()=>await rC({logger:r,logLevel:e,appiumPort:n}),adbSerial:E});if(g=R,p=v,await C.updateSettings({enableMultiWindows:!0}),"avdId"in a){let I=a.apkFilePath?.trim();if(I){let k=mF.resolve(I);if(!cF.existsSync(k))throw new Error(`APK not found at path: ${k}`);i("Installing local APK...");let W=Date.now();try{await C.installApp(k),r.info({apkFilePath:k,installDurationMs:Date.now()-W},"Installed local APK")}catch(oe){throw r.error({err:oe,apkFilePath:k},"Failed to install local APK"),new Error(`Failed to install APK from ${k}: ${oe.message}`)}}}let M=new Map;return C.on("command",I=>{M.set(I.command,Date.now())}),C.on("result",I=>{let k=M.get(I.command);if(!k)return;let W=Date.now()-k;I.result instanceof Error?r.warn({err:I.result,command:I.command,args:I.body,durationMs:W},"Appium cmd failed"):W>1e4&&r.warn({command:I.command,args:I.body,durationMs:W},"Appium cmd took very long"),M.delete(I.command)}),r.info({timings:{emulatorDuration:m-t,appiumDuration:b-m,wdioDuration:Date.now()-b},capabilities:h,emulatorName:l},"Started Appium driver"),{driver:C,appiumClose:async()=>{await p(),await Promise.all(s.map(I=>I()))},appiumPort:n,appiumLogFile:g,emulatorName:l,adbPort:c}}async function rC({logger:r,logLevel:e,appiumPort:t}){let n=`${uF()}/appium-port-${Date.now()}.log`,o=await lF.main({port:t,address:"localhost",relaxedSecurityEnabled:!0,longStacktrace:e==="debug",logFormat:"json",loglevel:e,logFile:n});return{logFile:n,close:async()=>{await o.close()}}}async function nC(r){let n=(await ht(["devices"],{timeoutMs:5e3})??"").split(`
43
+ `).map(o=>o.trim().split(/\s+/)[0]).filter(o=>!!o?.startsWith("emulator-"));await Promise.all(n.map(async o=>{r.info({emulatorName:o},"Killing emulator");let i=await ht(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function gF(){let r=Math.floor(dF()/1024/1024),e=Math.floor(r/4);return Math.max(2048,Math.min(8192,Math.floor(e/256)*256))}import oC from"crypto";import hF from"fs";async function au({tag:r,channel:e,filePath:t,apiClient:n,logger:o}){let i=await hF.promises.readFile(t),a=oC.createHash("md5").update(i).digest("base64"),s=oC.createHash("md5").update(i).digest("hex"),c=await n.generateAndroidAssetUrls({channel:e,tag:r??"latest",md5:a});if(c.md5&&(c.md5===a||c.md5===s)){o.info({channel:e,tag:r,md5:a,md5Hex:s},`Asset ${t} already exists on emulator platform`);return}if(c.uploadUrl){o.info({channel:e,tag:r,md5:a,uploadUrl:c.uploadUrl},`Uploading asset ${t} to emulator platform...`);try{let l=await fetch(c.uploadUrl,{headers:{"Content-Length":i.length.toString(),"Content-Type":"application/octet-stream"},method:"PUT",body:i});if(l.status!==200)throw new Error(`Got error response from emulator platform: ${l.status} ${await l.text()}`);o.info({channel:e,tag:r,md5:a},`Asset ${t} was uploaded successfully!`);return}catch(l){try{await n.deleteAndroidAsset(e,r??"latest")}catch(u){o.warn({err:u,tag:r,channel:e},"Failed to cleanup asset metadata for failed upload. Please contact Momentic support.")}throw o.error({err:l},"Failed to upload asset"),l}}throw new Error(`No upload URL was given for asset ${t}`)}import{execSync as iC}from"child_process";import{existsSync as fF}from"fs";import{platform as aC}from"os";import{dirname as SF,join as yF,resolve as bF}from"path";import{fileURLToPath as EF}from"url";var sC,TF=EF(import.meta.url),vF=SF(TF);sC=bF(vF,"..");var bs=sC;w.info(`Setting APPIUM_HOME to ${bs}`);process.env.APPIUM_HOME=bs;var AF="If you do not have Java installed, please download the JDK 24 from https://www.oracle.com/java/technologies/downloads/, move it to your home directory, and then set the JAVA_HOME environment variable in your shell profile to the JDK path.",wF="If you do not have Android Studio installed, please download it first from https://developer.android.com/studio and then follow all setup instructions in the Android Studio app.",CF="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",lC="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",cC="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function RF(){if(!process.env.JAVA_HOME)w.warn("JAVA_HOME is not set. Some Appium drivers and Android tools may not work as expected.");else{process.platform==="darwin"&&/\.jdk\/?$/.test(process.env.JAVA_HOME)&&w.warn("JAVA_HOME appears to point at a *.jdk bundle, which is incorrect. The correct path should be formatted like '<bundle>/Contents/Home'.");let e=((t,n)=>yF(t,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");fF(e)||w.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`)}try{iC("java --version",{stdio:"pipe",encoding:"utf-8"})||(w.error(`Could not find a Java installation. ${AF}`),process.exit(1))}catch(r){w.error(`Got error while checking if the Java JDK is installed: ${r}`),process.exit(1)}}function xF(){process.env.ANDROID_HOME||(w.error(`The ANDROID_HOME environment variable is not set. ${CF} ${aC()==="darwin"?lC:cC}`),process.exit(1))}function MF(){let r=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{iC(`${r} version`,{stdio:"pipe",encoding:"utf-8"})||(w.error(`Could not find the Android Debug Bridge (ADB) tool locally. This tool is included with Android Studio. ${wF} Finally, ensure that the 'adb' command is available in your shell. ${aC()==="darwin"?lC:cC}`),process.exit(1))}catch(e){w.error(`Got error while checking if ADB is installed: ${e}`),process.exit(1)}}function uC(){RF(),xF(),MF()}import{create as _F,windowedFiniteBatchScheduler as PF}from"@yornaath/batshit";import IF from"ws";var OF=100,LF=2500,dC=4e3,NF="\u2026";async function su({driver:r,onLogs:e}){await r.execute("mobile: startLogsBroadcast");let t=_F({fetcher:async l=>{e(l)},resolver:()=>{},scheduler:PF({windowMs:LF,maxBatchSize:OF})}),{hostname:n="localhost",port:o=4723,protocol:i="http"}=r.options,s=`${i==="https"?"wss":"ws"}://${n}:${o}/ws/session/${r.sessionId}/appium/device/logcat`,c=new IF(s);return c.on("message",l=>{let u=l.toString().trim();u.length!==0&&(u.length>dC&&(u=u.slice(0,dC)+NF),t.fetch(u).catch(()=>{}))}),async()=>{try{c.close()}catch{}try{await r.execute("mobile: stopLogsBroadcast")}catch{}try{t.next()}catch{}}}import{Server as nG}from"socket.io";import _H from"path";import{randomUUID as jF}from"crypto";import{faker as DF}from"@faker-js/faker";import kF from"assert";import UF from"axios";import*as FF from"child_process";import BF from"moment";import*as zF from"otpauth";import HF from"pg";async function mC(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=Dl(n,e);t.push(...o)}),t}function GF(r,e){if(!r&&!e)return;let t;if(r){let{url:o,options:i}=r;t=new Request(o,i)}let n;if(e){let{body:o,options:i}=e;n=new Response(o??null,i)}return{request:t,response:n}}async function VF(r,e){switch(r){case"RAW":return e;case"RESPONSE":if(e instanceof Response){let t=[];return e.headers.forEach((o,i)=>{t.push([i,o])}),{status:e.status,headers:t,body:await e.text()}}else throw new Error("Result is not a Response object")}}var WF=Object.getPrototypeOf(async function(){}).constructor;async function pC(r,e,t){let n=e.code;e.options.fragment&&(n=`return ${e.code}`);let{env:o,additionalBindings:i,request:a,response:s}=e.bindings,c=e.tools,l={},u=(C,R)=>{o[C]=R,l[C]=R},d={},m=(C,R)=>{o[C]=R,d[C]=R},p;n.includes("Octokit")&&(p=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new WF("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(UF,BF,c.fakerInstance??DF,kF,HF,p,g,zF,FF,mC,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:m,R=>c.sms.send(R),R=>c.sms.fetchLatest(R),c.email,c.sms,c.ai,GF(a,s),...Object.values(i??{}))),f=!0,E,b;try{let C=await z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});E=await VF(e.options.responseSerialization??"RAW",C)}catch(C){t.error({err:C,env:o,evalCode:n},`[${r}] Error executing code: ${C}`),f=!1,C instanceof Ln?b=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:b=C instanceof Error?C.message:`${C}`}return{result:E,variableUpdates:l,persistentVariableUpdates:d,success:f,error:b}}async function gC({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=_n,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=jF(),m=await pC(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return w.debug(`[${d}] Got execution result: ${JSON.stringify(m)}`),m}import{createHmac as $F,randomUUID as qF}from"crypto";import KF from"fetch-retry";var YF=KF(global.fetch,{retries:3,retryOn:function(r,e,t){return!!(e!==null||t&&t.status>=500)},retryDelay:function(r){return Math.pow(2,r)*500}}),hC=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,fC=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function SC({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=_n,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!hC)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let m,p,g=0;if(!fC)throw new Error("Missing lambda auth secret.");let h=$F("sha256",fC).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let E={id:qF(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(m=await z(YF(hC,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(E)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!m)throw new Error("Got empty response from code evaluation server");if(!m.ok)throw new Error(`Code evaluation server returned error code ${m.status}`);p=void 0;break}catch(b){p=b}}if(p)throw s.error({err:p},"Failed to evaluate code remotely"),p;if(!m)throw new Error(`An unexpected code evaluation error occurred${p?`: ${p}`:""}`);let f;try{f=gb.parse(await m.json())}catch(E){throw new Error(`Code evaluation server returned invalid response: ${E}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function qr(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await SC(r);else if(r.localTools)e=await gC({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
44
44
  ${e.error}
45
45
  Code received:
46
- ${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as VF}from"lodash-es";async function bs(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=_n,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let m of u){if(m.length<2)continue;let g=m[1].trim(),p;try{p=await $r({orgId:e,code:g,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:r.localTools,signal:i})}catch(f){throw o.error({err:f,value:t},"Error evaluating template string"),f}if(p===void 0&&!c)throw new x("UserConfigurationError",`Template fragment '${g}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let h=typeof p=="string"?p:`${p}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(m[0],h)}return d}async function au(r){return pC(r)}async function pC({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in r){if(e.includes(s))continue;let c=!1;if(t)if(t.includes(s))c=!0;else continue;let l=r[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await bs({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),r[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await pC({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function su(r,e){for(let{path:t,original:n}of e)VF(r,t,n)}import WF from"fetch-retry";var vbe=process.env.MAILINATOR_API_KEY,Abe=WF(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import bH from"fetch-cookie";import EH from"path";import{CookieJar as TH}from"tough-cookie";var fg={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
46
+ ${r.code}`;throw r.logger.error({err:e.error,code:r.code,env:r.context.toObjectCopy()},t),new Error(t)}if(e.variableUpdates)for(let[t,n]of Object.entries(e.variableUpdates))r.context.setVariable(t,n);if(e.persistentVariableUpdates&&Object.keys(e.persistentVariableUpdates).length>0){await r.callbacks?.onPersistentVariableUpdates?.(e.persistentVariableUpdates);for(let[t,n]of Object.entries(e.persistentVariableUpdates))r.context.setVariable(t,n)}return e.result}import{set as XF}from"lodash-es";async function Es(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=_n,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let m of u){if(m.length<2)continue;let p=m[1].trim(),g;try{g=await qr({orgId:e,code:p,fragment:!0,context:n,timeoutMs:s,logger:o,retries:a,localTools:r.localTools,signal:i})}catch(f){throw o.error({err:f,value:t},"Error evaluating template string"),f}if(g===void 0&&!c)throw new x("UserConfigurationError",`Template fragment '${p}' evaluated to undefined. Please ensure that the variable name is spelled correctly and it is only referenced after being assigned a value.`);let h=typeof g=="string"?g:`${g}`;h=h.replaceAll(/\$/g,"$$$$"),d=d.replace(m[0],h)}return d}async function lu(r){return yC(r)}async function yC({obj:r,bannedKeys:e,allowList:t,context:n,prefixPath:o=[],replacements:i=[],...a}){for(let s in r){if(e.includes(s))continue;let c=!1;if(t)if(t.includes(s))c=!0;else continue;let l=r[s],u=[...o,s];if(typeof l=="string"&&l.includes("{{")){let d=await Es({s:l,context:n,...a});if(l===d)continue;i.push({path:u,original:l}),r[s]=d}else typeof l=="object"&&l!==null&&!Array.isArray(l)&&await yC({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function cu(r,e){for(let{path:t,original:n}of e)XF(r,t,n)}import JF from"fetch-retry";var Hbe=process.env.MAILINATOR_API_KEY,Gbe=JF(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import RH from"fetch-cookie";import xH from"path";import{CookieJar as MH}from"tough-cookie";var Sg={vimiumJs:'var D=Object.defineProperty;var P=(t,e,n)=>e in t?D(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>(P(t,typeof e!="symbol"?e+"":e,n),n);var y=t=>function(e){return e&&e.isTrusted?t.apply(this,arguments):!0};globalThis.forTrusted==null&&(globalThis.forTrusted=y);var E={create(t,e,n,o){return{bottom:o,top:e,left:t,right:n,width:n-t,height:o-e}},copy(t){return{bottom:t.bottom,top:t.top,left:t.left,right:t.right,width:t.width,height:t.height}},translate(t,e,n){return e==null&&(e=0),n==null&&(n=0),{bottom:t.bottom+n,top:t.top+n,left:t.left+e,right:t.right+e,width:t.width,height:t.height}},subtract(t,e){return e=this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom)),e.width<0||e.height<0?[E.copy(t)]:[this.create(t.left,t.top,e.left,e.top),this.create(e.left,t.top,e.right,e.top),this.create(e.right,t.top,t.right,e.top),this.create(t.left,e.top,e.left,e.bottom),this.create(e.right,e.top,t.right,e.bottom),this.create(t.left,e.bottom,e.left,t.bottom),this.create(e.left,e.bottom,e.right,t.bottom),this.create(e.right,e.bottom,t.right,t.bottom)].filter(o=>o.height>0&&o.width>0)},intersects(t,e){return t.right>e.left&&t.left<e.right&&t.bottom>e.top&&t.top<e.bottom},intersectsStrict(t,e){return t.right>=e.left&&t.left<=e.right&&t.bottom>=e.top&&t.top<=e.bottom},equals(t,e){for(let n of["top","bottom","left","right","width","height"])if(t[n]!==e[n])return!1;return!0},intersect(t,e){return this.create(Math.max(t.left,e.left),Math.max(t.top,e.top),Math.min(t.right,e.right),Math.min(t.bottom,e.bottom))}};var T={_browserInfoLoaded:!0,_firefoxVersion:null,_isFirefox:!1,isFirefox(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._isFirefox},firefoxVersion(){if(!this._browserInfoLoaded)throw Error("browserInfo has not yet loaded.");return this._firefoxVersion},isString(t){return typeof t=="string"||t instanceof String}};var f={isReady(){return document.readyState!=="loading"},documentReady:function(){let t=document.readyState!=="loading",e=[];if(!t){let n;globalThis.addEventListener("DOMContentLoaded",n=y(function(){globalThis.removeEventListener("DOMContentLoaded",n,!0),t=!0;for(let o of e)o();e=null}),!0)}return function(n){if(t)return n();e.push(n)}}(),documentComplete:function(){let t=document.readyState==="complete",e=[];if(!t){let n;globalThis.addEventListener("load",n=y(function(o){if(o.target===document){globalThis.removeEventListener("load",n,!0),t=!0;for(let r of e)r();e=null}}),!0)}return function(n){t?n():e.push(n)}}(),createElement(t){let e=document.createElement(t);return e instanceof HTMLElement?(this.createElement=n=>document.createElement(n),e):(this.createElement=n=>document.createElementNS("http://www.w3.org/1999/xhtml",n),this.createElement(t))},addElementsToPage(t,e){let n=this.createElement("div");e.id!=null&&(n.id=e.id),e.className!=null&&(n.className=e.className);for(let o of t)n.appendChild(o);return document.body.appendChild(n),n},removeElement(t){return t.parentNode.removeChild(t)},isTopFrame(){return globalThis.top===globalThis.self},makeXPath(t){let e=[];for(let n of t)e.push(".//"+n,".//xhtml:"+n);return e.join(" | ")},evaluateXPath(t,e){let n=document.webkitIsFullScreen?document.webkitFullscreenElement:document.documentElement,o=function(r){return r==="xhtml"?"http://www.w3.org/1999/xhtml":null};return document.evaluate(t,n,o,e,null)},getVisibleClientRect(t,e){let n;e==null&&(e=!1);let o=(()=>{let i=[];for(n of t.getClientRects())i.push(E.copy(n));return i})(),r=function(){let i=window.getComputedStyle(t,null),h=i.getPropertyValue("display").indexOf("inline")===0&&i.getPropertyValue("font-size")==="0px";return r=()=>h,h};for(n of o){let i;if((n.width===0||n.height===0)&&e)for(let h of Array.from(t.children)){i=window.getComputedStyle(h,null);let m=i.getPropertyValue("position");if(i.getPropertyValue("float")==="none"&&!["absolute","fixed"].includes(m)&&!(n.height===0&&r()&&i.getPropertyValue("display").indexOf("inline")===0))continue;let s=this.getVisibleClientRect(h,!0);if(!(s===null||s.width<3||s.height<3))return s}else{if(n=this.cropRectToVisible(n),n===null||n.width<3||n.height<3||(i=window.getComputedStyle(t,null),i.getPropertyValue("visibility")!=="visible"))continue;return n}}return null},cropRectToVisible(t){let e=E.create(Math.max(t.left,0),Math.max(t.top,0),t.right,t.bottom);return e.top>=window.innerHeight-4||e.left>=window.innerWidth-4?null:e},getClientRectsForAreas(t,e){let n=[];for(let o of e){let r,i,h,m,s=o.coords.split(",").map(l=>parseInt(l,10)),a=o.shape.toLowerCase();if(["rect","rectangle"].includes(a))s.length==4&&([r,h,i,m]=s);else if(["circle","circ"].includes(a)){if(s.length==3){let[l,c,d]=s,p=d/Math.sqrt(2);r=l-p,i=l+p,h=c-p,m=c+p}}else a==="default"?s.length==2&&([r,h,i,m]=[0,0,t.width,t.height]):s.length>=4&&([r,h,i,m]=s);let u=E.translate(E.create(r,h,i,m),t.left,t.top);u=this.cropRectToVisible(u),u&&!isNaN(u.top)&&!isNaN(u.left)&&!isNaN(u.width)&&!isNaN(u.height)&&n.push({element:o,rect:u})}return n},isSelectable(t){if(!(t instanceof Element))return!1;let e=["button","checkbox","color","file","hidden","image","radio","reset","submit"];return t.nodeName.toLowerCase()==="input"&&e.indexOf(t.type)===-1||t.nodeName.toLowerCase()==="textarea"||t.isContentEditable},isEditable(t){return this.isSelectable(t)||(t.nodeName!=null?t.nodeName.toLowerCase():void 0)==="select"},isEmbed(t){let e=t.nodeName!=null?t.nodeName.toLowerCase():null;return["embed","object"].includes(e)},isFocusable(t){return t&&(this.isEditable(t)||this.isEmbed(t))},isDOMDescendant(t,e){let n=e;for(;n!==null;){if(n===t)return!0;n=n.parentNode}return!1},isSelected(t){let e=document.getSelection();if(t.isContentEditable){let n=e.anchorNode;return n&&this.isDOMDescendant(t,n)}else if(f.getSelectionType(e)==="Range"&&e.isCollapsed){let n=e.anchorNode.childNodes[e.anchorOffset];return t===n}else return!1},simulateSelect(t){if(t===document.activeElement&&f.isEditable(document.activeElement))return handlerStack.bubbleEvent("click",{target:t});if(t.focus(),t.tagName.toLowerCase()!=="textarea"||t.value.indexOf(`\n`)<0)try{if(t.selectionStart===0&&t.selectionEnd===0)return t.setSelectionRange(t.value.length,t.value.length)}catch{}},simulateClick(t,e){e==null&&(e={});let n=["mouseover","mousedown","mouseup","click"],o=[];for(let r of n){let i=this.simulateMouseEvent(r,t,e);o.push(i)}return o},simulateMouseEvent(t,e,n){if(n==null&&(n={}),t==="mouseout"){if(e==null&&(e=this.lastHoveredElement),this.lastHoveredElement=void 0,e==null)return}else t==="mouseover"&&(this.simulateMouseEvent("mouseout",void 0,n),this.lastHoveredElement=e);let o=new MouseEvent(t,{bubbles:!0,cancelable:!0,composed:!0,view:window,detail:1,ctrlKey:n.ctrlKey,altKey:n.altKey,shiftKey:n.shiftKey,metaKey:n.metaKey});return e.dispatchEvent(o)},simulateClickDefaultAction(t,e){let n;if(e==null&&(e={}),(t.tagName!=null?t.tagName.toLowerCase():void 0)!=="a"||!t.href)return;let{ctrlKey:o,shiftKey:r,metaKey:i,altKey:h}=e;KeyboardUtils.platform==="Mac"?n=i===!0&&o===!1:n=i===!1&&o===!0,n?chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:r===!0}):r===!0&&i===!1&&o===!1&&h===!1?chrome.runtime.sendMessage({handler:"openUrlInNewWindow",url:t.href}):t.target==="_blank"&&chrome.runtime.sendMessage({handler:"openUrlInNewTab",url:t.href,active:!0})},simulateHover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseover",t,e)},simulateUnhover(t,e){return e==null&&(e={}),this.simulateMouseEvent("mouseout",t,e)},addFlashRect(t){let e=this.createElement("div");return e.classList.add("vimiumReset"),e.classList.add("vimiumFlash"),e.style.left=t.left+"px",e.style.top=t.top+"px",e.style.width=t.width+"px",e.style.height=t.height+"px",document.documentElement.appendChild(e),e},getViewportTopLeft(){let t=document.documentElement,e=getComputedStyle(t),n=t.getBoundingClientRect();if(e.position==="static"&&!/content|paint|strict/.test(e.contain||"")){let o=parseInt(e.marginTop),r=parseInt(e.marginLeft);return{top:-n.top+o,left:-n.left+r}}else{let o,r;return T.isFirefox()?(r=parseInt(e.borderTopWidth),o=parseInt(e.borderLeftWidth)):{clientTop:r,clientLeft:o}=t,{top:-n.top-r,left:-n.left-o}}},suppressPropagation(t){t.stopImmediatePropagation()},suppressEvent(t){t.preventDefault(),this.suppressPropagation(t)},consumeKeyup:function(){let t=null;return function(e,n=null,o){if(!e.repeat){t!=null&&handlerStack.remove(t);let{code:r}=e;t=handlerStack.push({_name:"dom_utils/consumeKeyup",keyup(i){return i.code!==r||(this.remove(),o?f.suppressPropagation(i):f.suppressEvent(i)),handlerStack.continueBubbling},blur(i){return i.target===window&&this.remove(),handlerStack.continueBubbling}})}return typeof n=="function"&&n(),o?(f.suppressPropagation(e),handlerStack.suppressPropagation):(f.suppressEvent(e),handlerStack.suppressEvent)}}(),getSelectionType(t){return t==null&&(t=document.getSelection()),t.type?t.type:t.rangeCount===0?"None":t.isCollapsed?"Caret":"Range"},getElementWithFocus(t,e){let n,o=n=t.getRangeAt(0);f.getSelectionType(t)==="Range"&&(o=n.cloneRange(),o.collapse(e)),n=o.startContainer,n.nodeType===1&&(n=n.childNodes[o.startOffset]);let r=n;for(;r&&r.nodeType!==1;)r=r.previousSibling;return n=r||n?.parentNode,n},getSelectionFocusElement(){let t=window.getSelection(),e=t.focusNode;return e==null?null:(e===t.anchorNode&&t.focusOffset===t.anchorOffset&&(e=e.childNodes[t.focusOffset]||e),e.nodeType!==Node.ELEMENT_NODE?e.parentElement:e)},getContainingElement(t){return(typeof t.getDestinationInsertionPoints=="function"?t.getDestinationInsertionPoints()[0]:void 0)||t.parentElement},windowIsTooSmall(){return window.innerWidth<3||window.innerHeight<3},injectUserCss(){let t=document.createElement("style");t.type="text/css",t.textContent=Settings.get("userDefinedLinkHintCss"),document.head.appendChild(t)}};var R={MAX_CONTENT_LENGTH:1e3,MAX_ATTRIBUTE_LENGTH:500,MAX_NUM_DATA_ATTRIBUTES:10,commonAttributes:["id","className","title","aria-label","aria-labelledby"],attributeNamesMapping:new Map([["a",["href","title","rel","target"]],["label",["for"]],["input",["type","name","placeholder","checked","maximumLength"]],["textarea",["placeholder","maximumLength"]],["button",["type"]],["select",["name","multiple"]],["div",["role"]],["iframe",["src"]],["img",["src","alt"]]]),describe(t){let e={};this.addAttributes(t,this.commonAttributes,e);let n=t.tagName.toLowerCase?.()||"";this.attributeNamesMapping.has(n)&&this.addAttributes(t,this.attributeNamesMapping.get(n),e),this.addDataAttrs(t,e);let o=this.getContent(t);return this.additionalHandling(t,{tag:n,attributes:e,...o&&{content:o}})},getContent(t){let e=t.tagName.toLowerCase?.()||"";return["input","textarea"].includes(e)?t.value:["div","iframe","img","body"].includes(e)?null:(["a","button","select","label"].includes(e),t.innerText)},additionalHandling(t,e){if((t.tagName.toLowerCase?.()||"")=="label"&&t.hasAttribute("for")){let o=t.getAttribute("for"),r=document.getElementById(o);r&&(e.target=this.describe(r))}return e},addAttributes(t,e,n){n||(n={});for(let o of e)t.hasAttribute(o)&&(n[o]=t.getAttribute(o).substring(0,this.MAX_ATTRIBUTE_LENGTH));return n},addDataAttrs(t,e){let n=0;for(let o in t.dataset)if(e[`data-${o}`]=t.dataset[o].substring(0,this.MAX_ATTRIBUTE_LENGTH),n++,n>this.MAX_NUM_DATA_ATTRIBUTES)return e;return e}};var C=null,k=()=>j()||document.scrollingElement||document.body,_=function(t){return t?t<0?-1:1:0},F={x:{axisName:"scrollLeft",max:"scrollWidth",viewSize:"clientWidth"},y:{axisName:"scrollTop",max:"scrollHeight",viewSize:"clientHeight"}},O=function(t,e,n){if(T.isString(n)){let o=n;return o==="viewSize"&&t===k()?e==="x"?window.innerWidth:window.innerHeight:t[F[e][o]]}else return n},I=function(t,e,n){let o=F[e].axisName,r=t[o];if(t.scrollBy){let i={behavior:"instant"};i[e==="x"?"left":"top"]=n,t.scrollBy(i)}else t[o]+=n;return t[o]!==r},V=function(t,e){let n=window.getComputedStyle(t);return!(n.getPropertyValue(`overflow-${e}`)==="hidden"||["hidden","collapse"].includes(n.getPropertyValue("visibility"))||n.getPropertyValue("display")==="none")},v=function(t,e,n,o){let r=o*O(t,e,n)||-1;return r=_(r),I(t,e,r)&&I(t,e,-r)},U=function(t,e,n,o){return e==null&&(e="y"),n==null&&(n=1),o==null&&(o=1),v(t,e,n,o)&&V(t,e)},H=function(t=null){let e;if(!t){let n=k();if(v(n,"y",1,1)||v(n,"y",-1,1))return n;t=document.body||k()}if(v(t,"y",1,1)||v(t,"y",-1,1))return t;{let n=Array.from(t.children).map(o=>({element:o,rect:f.getVisibleClientRect(o)})).filter(o=>o.rect);n.map(o=>o.area=o.rect.width*o.rect.height);for(e of n.sort((o,r)=>r.area-o.area)){let o=H(e.element);if(o)return o}return null}},M={init(){C=null},isScrollableElement(t){return C||(C=k()&&H()||k()),t!==C&&U(t)}},j=function(){let t=K[window.location.host];if(t)return document.querySelector(t)},K={"twitter.com":"div.permalink-container div.permalink[role=main]","reddit.com":"#overlayScrollContainer","new.reddit.com":"#overlayScrollContainer","www.reddit.com":"#overlayScrollContainer","web.telegram.org":".MessageList"};window.Scroller=M;var x=function(){let t=null;return f.documentReady(()=>t=document.hasFocus()),globalThis.addEventListener("focus",y(function(e){return e.target===window&&(t=!0),!0}),!0),globalThis.addEventListener("blur",y(function(e){return e.target===window&&(t=!1),!0}),!0),()=>t}();Object.assign(globalThis,{windowIsFocused:x});var L=class{constructor(e){b(this,"element");b(this,"image");b(this,"rect");b(this,"linkText");b(this,"showLinkText");b(this,"reason");b(this,"secondClassCitizen");b(this,"possibleFalsePositive");Object.seal(this),e&&Object.assign(this,e)}},S={getLocalHintsForElement(t){let e=t.tagName.toLowerCase?.()||"",n=!1,o=!1,r=!1,i=[],h=[],m=null;if(e==="img"){let l=t.getAttribute("usemap");if(l){let c=t.getClientRects();l=l.replace(/^#/,"").replace(\'"\',\'\\\\"\');let d=document.querySelector(`map[name="${l}"]`);if(d&&c.length>0){n=!0;let p=d.getElementsByTagName("area"),g=f.getClientRectsForAreas(c[0],p);g=g.map(N=>Object.assign(N,{image:t})),h.push(...g)}}}let s=t.getAttribute("aria-disabled");if(s&&["","true"].includes(s.toLowerCase()))return[];if(this.checkForAngularJs||(this.checkForAngularJs=function(){if(document.getElementsByClassName("ng-scope").length===0)return()=>!1;{let c=[];for(let d of["","data-","x-"])for(let p of["-",":","_"])c.push(`${d}ng${p}click`);return function(d){for(let p of c)if(d.hasAttribute(p))return!0;return!1}}}()),n||(n=this.checkForAngularJs(t)),t.hasAttribute("onclick"))n=!0;else{let l=t.getAttribute("role"),c=["button","tab","link","checkbox","menuitem","menuitemcheckbox","menuitemradio","radio"];if(l!=null&&c.includes(l.toLowerCase()))n=!0;else{let d=t.getAttribute("contentEditable");d!=null&&["","contenteditable","true","plaintext-only"].includes(d.toLowerCase())&&(n=!0)}}if(!n&&t.hasAttribute("jsaction")){let l=t.getAttribute("jsaction").split(";");for(let c of l){let d=c.trim().split(":");if(d.length>=1&&d.length<=2){let[p,g,N]=d.length===1?["click",...d[0].trim().split("."),"_"]:[d[0],...d[1].trim().split("."),"_"];n||(n=p==="click"&&g!=="none"&&N!=="_")}}}switch(e){case"a":n=!0;break;case"textarea":n||=!t.disabled&&!t.readOnly;break;case"input":n||=!(t.getAttribute("type")?.toLowerCase()=="hidden"||t.disabled||t.readOnly&&f.isSelectable(t));break;case"button":case"select":n||=!t.disabled;break;case"object":case"embed":n=!0;break;case"label":n||=t.control!=null&&!t.control.disabled&&this.getLocalHintsForElement(t.control).length===0;break;case"body":n||=t===document.body&&!x()&&window.innerWidth>3&&window.innerHeight>3&&(document.body!=null?document.body.tagName.toLowerCase():void 0)!=="frameset"?m="Frame.":void 0,n||=t===document.body&&x()&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"img":n||=["zoom-in","zoom-out"].includes(t.style.cursor);break;case"div":case"ol":case"ul":n||=t.clientHeight<t.scrollHeight&&M.isScrollableElement(t)?m="Scroll.":void 0;break;case"details":n=!0,m="Open.";break}let a=t.getAttribute("class");!n&&a?.toLowerCase().includes("button")&&(n=!0,r=!0);let u=t.getAttribute("tabindex"),w=u?parseInt(u):-1;if(!n&&!(w<0)&&!isNaN(w)&&(n=!0,o=!0),n)if(h.length>0){let l=h.map(c=>new L({element:c.element,image:t,rect:c.rect,secondClassCitizen:o,possibleFalsePositive:r,reason:m}));i.push(...l)}else{let l=f.getVisibleClientRect(t,!0);if(l!==null){let c=new L({element:t,rect:l,secondClassCitizen:o,possibleFalsePositive:r,reason:m});i.push(c)}}return i},getElementFromPoint(t,e,n,o){n==null&&(n=document),o==null&&(o=[]);let r=n.elementsFromPoint?n.elementsFromPoint(t,e)[0]:n.elementFromPoint(t,e);return o.includes(r)?r:(o.push(r),r&&r.shadowRoot?S.getElementFromPoint(t,e,r.shadowRoot,o):r)},getLocalHints(t){if(!document.body)return[];let e=(s,a)=>{a==null&&(a=[]);for(let u of Array.from(s.querySelectorAll("*")))a.push(u),u.shadowRoot&&e(u.shadowRoot,a);return a},n=e(document.body),o=[];for(let s of Array.from(n))if(!t||s.href){let a=this.getLocalHintsForElement(s);o.push(...a)}o=o.reverse();let r=[1,2,3];o=o.filter((s,a)=>{if(!s.possibleFalsePositive)return!0;let w=Math.max(0,a-6);for(;w<a;){let l=o[w].element;for(let c of r)if(l=l?.parentElement,l===s.element)return!1;w+=1}return!0});let i=o.filter(s=>{if(s.secondClassCitizen)return!1;let a=s.rect,u=S.getElementFromPoint(a.left+a.width*.5,a.top+a.height*.5);if(u&&(s.element.contains(u)||u.contains(s.element))||s.element.localName=="area"&&u==s.image)return!0;let l=[a.top+.1,a.bottom-.1],c=[a.left+.1,a.right-.1];for(let d of l)for(let p of c){let g=S.getElementFromPoint(p,d);if(g&&(s.element.contains(g)||g.contains(s.element)))return!0}});i.reverse();let{top:h,left:m}=f.getViewportTopLeft();for(let s of i)s.rect.top+=h,s.rect.left+=m;return i}};var A=class{constructor(){this.hints=null;this.hintMarkers=null;this.markersDiv=null;this.enrichedMarkers=null}reset(){this.removeMarkers(),this.hints=null,this.hintMarkers=null,this.markersDiv=null}async capture(){this.reset(),this.createMarkers(),this.displayMarkers()}createMarkers(){this.hints=S.getLocalHints(),this.hintMarkers=new Map,this.hints.forEach((e,n)=>{let o=f.createElement("div"),r=e.element.attributes["data-momentic-id"]?.value??void 0;if(!r){console.warn(`[MOMENTIC] No data-momentic-id found for interactive element ${e.element.outerHTML}`);return}o.style.left=e.rect.left+"px",o.style.top=e.rect.top+"px",o.style.zIndex=214e7+n,o.className="vimiumReset internalVimiumHintMarker vimiumHintMarker",z(o,r),this.hintMarkers.set(r,{hint:e,marker:o})})}enrichMarkers(){if(this.hintMarkers){this.enrichedMarkers=[];for(let[e,n]of this.hintMarkers)this.enrichedMarkers.push(Object.assign(R.describe(n.hint.element),{hintString:e}))}}displayMarkers(){this.hintMarkers&&(this.markersDiv||(this.markersDiv=f.addElementsToPage(Array.from(this.hintMarkers.values()).map(e=>e.marker),{id:"vimiumHintMarkerContainer",className:"vimiumReset"})))}removeMarkers(){this.markersDiv&&(f.removeElement(this.markersDiv),this.markersDiv=null)}toggleMarkers(){this.markersDiv?this.removeMarkers():this.displayMarkers()}},z=(t,e)=>{for(let n of e){let o=document.createElement("span");o.className="vimiumReset",o.textContent=n,t.appendChild(o)}};window.HintManager=A;\n',vimiumCss:'.vimiumReset,a.vimiumReset,a:hover.vimiumReset,a:link.vimiumReset,a:visited.vimiumReset,div.vimiumReset,span.vimiumReset,table.vimiumReset,td.vimiumReset,tr.vimiumReset{background:none;border:none;bottom:auto;box-shadow:none;color:#000;cursor:auto;display:inline;float:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:inherit;font-style:normal;font-variant:normal;font-weight:400;height:auto;left:auto;letter-spacing:0;line-height:100%;margin:0;max-height:none;max-width:none;min-height:0;min-width:0;opacity:1;padding:0;position:static;right:auto;text-align:left;text-decoration:none;text-indent:0;text-shadow:none;text-transform:none;top:auto;vertical-align:baseline;white-space:normal;width:auto;z-index:2140000000}tbody.vimiumReset,thead.vimiumReset{display:table-header-group}tbody.vimiumReset{display:table-row-group}div.internalVimiumHintMarker{background:linear-gradient(180deg,#fff785 0,#ffc542);border:1px solid #c38a22;border-radius:3px;box-shadow:0 3px 7px 0 rgba(0,0,0,.3);display:block;font-size:11px;left:-1px;overflow:hidden;padding:1px 3px 0;position:absolute;top:-1px;white-space:nowrap}div.internalVimiumHintMarker span{color:#302505;font-family:Helvetica,Arial,sans-serif;font-size:11px;font-weight:700;text-shadow:0 1px 0 hsla(0,0%,100%,.6)}div.internalVimiumHintMarker>.matchingCharacter{color:#d4ac3a}div>.vimiumActiveHintMarker span{color:#a07555!important}div.internalVimiumInputHint{background-color:rgba(255,247,133,.3);border:1px solid #c38a22;display:block;pointer-events:none;position:absolute}div.internalVimiumSelectedInputHint{background-color:hsla(0,100%,70%,.3);border:1px solid #933!important}div.internalVimiumSelectedInputHint span{color:#fff!important}div.vimiumHighlightedFrame{border:5px solid #ff0;box-sizing:border-box;margin:0;pointer-events:none}div.vimiumHighlightedFrame,iframe.vimiumHelpDialogFrame{height:100%;left:0;padding:0;position:fixed;top:0;width:100%}iframe.vimiumHelpDialogFrame{background-color:hsla(0,0%,4%,.6);border:none;display:block;z-index:2139999997}div#vimiumHelpDialogContainer{background-color:#fff;border:2px solid #b3b3b3;border-radius:6px;margin:50px auto;max-height:calc(100% - 100px);max-width:calc(100% - 100px);opacity:1;overflow-x:auto;overflow-y:auto;width:840px}div#vimiumHelpDialog{min-width:600px;padding:8px 12px}span#vimiumTitle,span#vimiumTitle *,span#vimiumTitle span{font-size:20px}#vimiumTitle{display:block;line-height:130%;white-space:nowrap}td.vimiumHelpDialogTopButtons{text-align:right;width:100%}#helpDialogOptionsPage,#helpDialogWikiPage{font-size:14px;padding-left:5px;padding-right:5px}div.vimiumColumn{float:left;font-size:11px;line-height:130%;width:50%}div.vimiumColumn tr{display:table-row}div.vimiumColumn td{display:table-cell;font-size:11px;line-height:130%}div.vimiumColumn table,div.vimiumColumn td,div.vimiumColumn tr{margin:0;padding:0}div.vimiumColumn table{table-layout:auto;width:100%}div.vimiumColumn td{padding:1px;vertical-align:top}div#vimiumHelpDialog div.vimiumColumn tr>td:first-of-type{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;text-align:right;white-space:nowrap}span.vimiumHelpDialogKey{background-color:#f3f3f3;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;color:#212121;font-family:monospace;font-size:11px;margin-left:2px;padding:1px 4px}div#vimiumHelpDialog div.vimiumColumn tr>td:nth-of-type(3){width:100%}div#vimiumHelpDialog div.vimiumDivider{background-color:#9a9a9a;display:block;height:1px;margin:10px auto;width:100%}div#vimiumHelpDialog td.vimiumHelpSectionTitle{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:16px;font-weight:700;padding-top:3px}div#vimiumHelpDialog td.vimiumHelpDescription{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px}div#vimiumHelpDialog span.vimiumCopyCommandNameName{cursor:pointer;font-size:12px;font-style:italic}div#vimiumHelpDialog tr.advanced{display:none}div#vimiumHelpDialog.showAdvanced tr.advanced{display:table-row}div#vimiumHelpDialog div.advanced td:nth-of-type(3){color:#555}div#vimiumHelpDialog a.closeButton{color:#555;cursor:pointer;font-family:courier new;font-size:24px;font-weight:700;padding-left:5px;position:relative;text-decoration:none;top:3px}div#vimiumHelpDialog a{text-decoration:underline}div#vimiumHelpDialog a.closeButton:hover{color:#000;-webkit-user-select:none}div#vimiumHelpDialogFooter{display:block;margin-bottom:37px;position:relative}table.helpDialogBottom{width:100%}td.helpDialogBottomRight{float:right;text-align:right;width:100%}td.helpDialogBottomLeft,td.helpDialogBottomRight{padding:0}div#vimiumHelpDialogFooter *{font-size:10px}a#toggleAdvancedCommands,span#help-dialog-tip{font-size:10px;position:relative;top:19px;white-space:nowrap}a#toggleAdvancedCommands,a:active.vimiumHelDialogLink,a:hover.vimiumHelDialogLink,a:link.vimiumHelDialogLink,a:visited.vimiumHelDialogLink{color:#2f508e;cursor:pointer;text-decoration:underline}div.vimiumHUD{background:#f1f1f1;border:1px solid #aaa;border-radius:4px;bottom:8px;box-shadow:0 2px 10px rgba(0,0,0,.8);display:block;left:8px;position:fixed;text-align:left;width:calc(100% - 20px);z-index:2139999999}iframe.vimiumHUDFrame{background-color:transparent;border:none;bottom:-14px;display:block;height:58px;margin:0 0 0 -40%;min-width:300px;opacity:0;overflow:hidden;padding:0;position:fixed;right:20px;width:20%;z-index:2139999998}div.vimiumHUD .vimiumHUDSearchArea{background-color:#f1f1f1;border-radius:4px 4px 0 0;display:block;padding:3px}div.vimiumHUD .vimiumHUDSearchAreaInner{border-radius:3px;box-sizing:border-box;color:#777;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;height:30px;line-height:20px;margin-bottom:0;outline:none;padding:2px 4px;width:100%}div.vimiumHUD .hud-find{background:#fff;border:1px solid #ccc}div.vimiumHUD span#hud-find-input,div.vimiumHUD span#hud-match-count{color:#000;display:inline;outline:none;overflow-y:hidden;white-space:nowrap}div.vimiumHUD span#hud-find-input:before{content:"/"}div.vimiumHUD span#hud-match-count{color:#aaa;font-size:12px}div.vimiumHUD span#hud-find-input br{display:none}div.vimiumHUD span#hud-find-input *{display:inline;white-space:nowrap}body.vimiumFindMode ::selection{background:#ff9632}iframe.vomnibarFrame{background-color:transparent;border:none;display:block;font-family:sans-serif;height:calc(100% - 70px);left:50%;margin:0 0 0 -40%;min-width:400px;overflow:hidden;padding:0;position:fixed;top:70px;width:calc(80% + 20px);z-index:2139999998}div.vimiumFlash{background-color:transparent;box-shadow:0 0 4px 2px #4183c4;padding:1px;position:absolute;z-index:2140000000}iframe.vimiumUIComponentHidden{display:none}iframe.vimiumUIComponentVisible{color-scheme:light dark;display:block}iframe.vimiumUIComponentReactivated{border:5px solid #ff0}iframe.vimiumNonClickable{pointer-events:none}@media (prefers-color-scheme:dark){iframe.reverseDarkReaderFilter{-webkit-filter:invert(100%) hue-rotate(180deg)!important;filter:invert(100%) hue-rotate(180deg)!important}body.vimiumBody{background-color:#292a2d;color:#fff}body.vimiumBody a,body.vimiumBody a:visited{color:#8ab4f8}body.vimiumBody input,body.vimiumBody textarea{background-color:#1d1d1f;border-color:#1d1d1f;color:#e8eaed}body.vimiumBody div.example{color:#9aa0a6}body.vimiumBody div#footer,body.vimiumBody div#state,div#vimiumHelpDialogContainer{background-color:#202124;border-color:hsla(0,0%,100%,.1)}div#vimiumHelpDialog{background-color:#292a2d;color:#fff}div#vimiumHelpDialog td.vimiumHelpDescription{color:#c9cccf}div#vimiumHelpDialog td.vimiumHelpSectionTitle,span#vimiumTitle{color:#fff}#vimiumTitle>span:first-child{color:#8ab4f8!important}div#vimiumHelpDialog a{color:#8ab4f8}div#vimiumHelpDialog div.vimiumDivider{background-color:hsla(0,0%,100%,.1)}span.vimiumHelpDialogKey{background-color:#1d1d1f;border:1px solid #000;box-shadow:none;color:#fff}}',htmlUtilsLibJs:`// src/html/constants.ts
47
47
  var momenticConstants = {
48
48
  bannedClassSubstrings: [
49
49
  "relative",
@@ -4308,15 +4308,15 @@ function registerAllMomenticListeners() {
4308
4308
 
4309
4309
  // src/html/index.ts
4310
4310
  registerAllMomenticListeners();
4311
- `};var hr={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-qa","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-sticky-stack-name","data-popup-origin","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-index","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-labelledby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["data-test-id","data-testid","id","name","href","aria-describedby","aria-labelledby","aria-description","data-row","data-col","data-index","data-row-index","data-col-index","for","title","alt","aria-label","aria-modal"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"],bannedAiRequiredCacheAttributes:["id","data-momentic-id","href","name","x","y","width","height","aria-keyshortcuts","data-ved","aria-controls","d"],ineligibleElementAttribute:"momentic-ineligible",serializedElementForCachingTruncateLength:500,serializedElementForLoggingTruncateLength:150};var gC="BoundingBoxMovedError",hC="ZeroOpacityError",lu="visual_actions",dn="data-momentic-id";function fC(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
4311
+ `};var hr={bannedClassSubstrings:["relative","flex","center","justify","auto","sticky","absolute","top","right","left","bottom","items-center","notion-selectable","notion-page-block","notion-collection-item","MuiSvgIcon","css-","rt-"],nonDynamicInputTypes:["button","file","hidden","image","radio","reset","submit"],generalStateAttributes:["aria-expanded","aria-haspopup","aria-checked","aria-pressed","aria-selected","aria-invalid","checked","open","aria-busy"],bannedElementTagNames:["html","head","meta","script","style","path","br","::marker","noscript","polygon","defs"],bannedElementAttributes:["data-momentic-id","aria-keyshortcuts","data-ved","aria-controls","d"],relevantElementAttributes:["name","id","value","type","class","height","width","target","title","href","src","alt","role","headers","scope","checked","required","action","tooltip","min","max","minlength","maxlength","multiple","pattern","placeholder","accept","contenteditable","data-value","data-testid","data-cy","data-pw","data-test-id","data-test","data-role","data-type","data-key","data-action","data-qa","data-aria-hidden","data-hidden","data-automation-id","data-overlay","data-content-editable-leaf","data-wf-icon","data-tns","data-sticky-stack-name","data-popup-origin","data-handleid","data-handlepos","data-col-index","data-row-index","data-row","data-index","data-col","col-index","row-index","row","col","data-momentic-description","aria-label","aria-role","aria-selected","aria-disabled","aria-hidden","aria-describedby","aria-labelledby","aria-valuenow","aria-valuemin","aria-valuemax"],alwaysUsefulAttributesForCssSelectorGeneration:["src","href","aria-describedby","aria-labelledby","aria-label"],stronglyIdentifyingAttributes:["data-test-id","data-testid","id","name","href","aria-describedby","aria-labelledby","aria-description","data-row","data-col","data-index","data-row-index","data-col-index","for","title","alt","aria-label","aria-modal"],alwaysInterestingClassNames:["cm-line","cm-activeLine","cm-content"],alwaysInterestingClassPrefixes:["notion-",".w-"],alwaysInterestingTruthyPropertyNames:["contenteditable"],visualAttributesForSvgSerialization:["fill","stroke","color","patternContentUnits","xlink:href","transform","path","d","points","viewBox","preserveAspectRatio","r","rx","ry","cx","cy","x1","y1","x2","y2","font","text-anchor","dominant-baseline","gradient","pattern","stop-color"],bannedAiRequiredCacheAttributes:["id","data-momentic-id","href","name","x","y","width","height","aria-keyshortcuts","data-ved","aria-controls","d"],ineligibleElementAttribute:"momentic-ineligible",serializedElementForCachingTruncateLength:500,serializedElementForLoggingTruncateLength:150};var bC="BoundingBoxMovedError",EC="ZeroOpacityError",uu="visual_actions",mn="data-momentic-id";function TC(r,e,t){if(r.length<t)return r;let n=r.indexOf(e);if(n===-1)return r;let o=Math.max(0,n-t/3),i=Math.min(n+t/3,r.length),a=r.indexOf(`
4312
4312
  `,o);a>0&&a<n&&(o=a);let s=i,c=0;for(;c<1e3&&s>n&&r[s]!==`
4313
4313
  `;)c++,s--;return s>n&&r[s]===`
4314
- `&&(i=s),r.slice(o,i)}function Cr(r){let e=typeof r=="string"?r:r.toString();return`[${dn}="${e}"]`}import{execSync as Bz}from"child_process";import{randomUUID as Qg}from"crypto";import{diff as Zg}from"deep-object-diff";import{existsSync as Tu,readFileSync as zz,readdirSync as Hz,statSync as OR,writeFileSync as Gz}from"fs";import{Jimp as LR}from"jimp";import Vz from"js-beautify";import{cloneDeep as Bi}from"lodash-es";import Wz from"mime";import{platform as jz}from"os";import{basename as NR,extname as $z,join as qz}from"path";import{v4 as Kz}from"uuid";import{rmSync as QC}from"fs";import{basename as zB,join as HB}from"path";import{errors as GB}from"playwright-core";import{devices as $F}from"playwright-core";var SC=2,Di=8e3;var Ro=250,dt=500;var yC=5e3,bC=250,ee=3e3,Ee=2e3,te=1e3,Sg=3e4,cu=8e3,EC=10,yg=.05;var TC=6e4,vC=new Set(["about:blank","chrome-error://chromewebdata/"]);var bg=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Eg=1e4,Es=500,uu=$F["Desktop Chrome"].userAgent,ki=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as qF,rmSync as AC,statSync as KF}from"fs";import*as wg from"node:fs";import YF from"nodejs-file-downloader";import{tmpdir as XF}from"os";import zn,{basename as JF,dirname as QF}from"path";var Cg="file://",Ag=zn.join(XF(),"momentic","downloads"),vg=1e4,ZF=50*1024*1024;async function wC(r){let{uri:e}=r;if(e.startsWith(Cg))return tB(r);if(e.startsWith("http"))return nB(r);if(Ab)return rB(r);throw new x("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function eB(r,e){let t=zn.join(Ag,r,e.slice(Cg.length)),n=zn.join(Ag,r),o=t.startsWith(n);if(!wg.existsSync(t)||!o)throw new x("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function tB({uri:r,orgId:e}){let t=eB(e,r);return{filePath:t,cleanup:()=>{AC(QF(t),{recursive:!0,force:!0})}}}async function rB({uri:r}){let e=zn.resolve(r);if(!wg.existsSync(e))throw new x("UserConfigurationError",`The referenced file (${r}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function nB({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=JF(n.href),i=xg(o),a=zn.extname(i);if(Sb.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=Rg(t),c,l;for(let p=1;p<=3;p++){let h=new YF({url:r,fileName:i,directory:s,maxAttempts:1,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:vg});try{let{downloadStatus:f,filePath:E}=await z(h.download(),{milliseconds:vg,message:`Download timed out after ${vg}ms`});if(f!=="COMPLETE"||!E)throw new Error(`Download ended in non-success status: ${f}`);c=E;break}catch(f){l=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${l instanceof Error?l.message:l}`);let u=c,m=KF(u).size;if(m>ZF)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:m,filePath:u,fileName:i},"Downloaded file to disk");let g;return{filePath:u,cleanup:()=>{clearTimeout(g),g=setTimeout(()=>AC(s,{recursive:!0,force:!0}),10*60*1e3)}}}function CC(r,e){return`${Cg}${r}/${e}`}function Rg(r){let e=Math.random().toString(36).substring(4),t=zn.join(Ag,r,e);return qF(t,{recursive:!0}),t}function xg(r){let e=zn.extname(r),t=zn.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function Rr(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:te})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}var Hn=3.1783027;function oB(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function xr(r){return Math.ceil(Mg(r)/Hn)}function Mg(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
4315
- `,""),t=t.replaceAll(" ","");let n=oB(t);return t.length-n+Hn*n}if(typeof r>"u"||r===null)return 0;if(typeof r=="number")return String(r).length;if(Array.isArray(r))return r.forEach(t=>{e+=Mg(t)}),e;if(typeof r=="object"){let t=r;return t.type==="image"||t.type==="media"&&"data"in t&&"mediaType"in t&&typeof t.mediaType=="string"&&t.mediaType.includes("jpeg")?1600:(Object.keys(t).forEach(n=>{e+=String(n).length,n==="image_url"?(t[n]??{}).detail==="high"?e+=1105*Hn:e+=85*Hn:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Hn:e+=Mg(t[n])}),e)}if(typeof r=="boolean")return r?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof r}': ${r}`)}var du=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};async function RC(r,e){let t=r.evaluate(async()=>{let i=window,a={};try{let s=await indexedDB.databases();for(let c of s){if(!c.name)continue;let l=await i.exportIdbToObject?.(c.name,c.version);l&&(a[c.name]=l)}return[a,void 0]}catch(s){return[void 0,s.message]}}),[n,o]=await z(t,{milliseconds:ee});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function xC(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await z(n,{milliseconds:ee})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function MC(r,e){try{let t=r.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(n=>{n.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await z(t,{milliseconds:ee})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function _C(r,e,t,n,o){try{await iB(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function iB(r,e,t,n){let o=n.text();o.length>Es&&(o=o.slice(0,Es)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Es?i.push(c.slice(0,Es)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}_g(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function _g(r,e,t,n){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>Eg&&(i[t]=i[t].slice(Math.floor(Eg/2)),i[t]?.push({url:r.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...n,tabIndex:t,timestamp:o})}async function fr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await gg({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import aB from"truncate-json";var sB="[redacted due to size]",lB=5e3,cB=1e6,IC=1e3;function OC(r,e,t,n){try{t?.({id:e,startedDateTime:new Date().toISOString(),title:void 0,pageTimings:{}})}catch(o){r.warn({err:o},"Unexpected error in onHarPage callback")}}async function Pg(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await NC(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:DC(t).timings}}async function LC(r,e,t,n,o){let i={},s=((await t.headerValue("content-type"))?.toLowerCase()??void 0)?.split(";")[0]??void 0;if(n)try{i=await fB({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await NC(t),status:t.status(),statusText:t.statusText(),content:i,redirectURL:t.headers().location,_mocked:!1};r.response=c,r.response&&n&&(r.response.bodySize=n.responseBodySize,r.response.headersSize=n.responseHeadersSize,r.response.content.size=n.responseBodySize);let l=e.timing();r.startedDateTime=new Date(l.startTime).toISOString();let{timings:u,total:d}=DC(l);r.time=d,r.timings=u}function PC(r){try{return new Date(r).toISOString()}catch{return}}function uB(r){let e={name:"",value:""},t=!0;for(let n of r.split(/; */)){let o=n.indexOf("="),i=o!==-1?n.substring(0,o).trim():n.trim(),a=o!==-1?n.substring(o+1,n.length).trim():"";if(t){t=!1,e.name=qr(i,!1),e.value=qr(a,!1);continue}i==="Domain"&&(e.domain=qr(a,!1)),i==="Expires"&&(e.expires=PC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=PC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=qr(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function NC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(uB)??[];return{headers:Object.entries(e).map(([n,o])=>({name:qr(n,!1),value:qr(o,!1)})),cookies:t}}async function mu(r,e,t,n){let o=await r.headerValue("content-type")??"application/octet-stream";if(t&&(e.request.bodySize=t.requestBodySize,e.request.headersSize=t.requestHeadersSize),!n&&t&&t.requestBodySize>IC){e.request.postData={mimeType:o,text:"",params:[],_redactedReason:"Request body redacted due to size"};return}let i=r.postData();if(!i)return;let a={mimeType:o,text:qr(i,n),params:[]};if(o==="application/x-www-form-urlencoded"){let s=new URLSearchParams(i.toString());for(let[c,l]of s.entries())a.params.push({name:qr(c,n),value:l?qr(l,n):void 0})}e.request.postData=a}var dB=["image","font","video","audio"],mB=["javascript"],pB=["text"],gB=["json","xml","html"];function hB(r){let[e,t]=r.split("/");return e&&dB.includes(e)||t&&mB.some(n=>t.includes(n))?!1:!!(e&&pB.includes(e)||t&&gB.some(n=>t.includes(n)))}async function fB({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!hB(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=IC?o._redactedReason="Response body redacted due to size":o.text=qr(await r.text(),n),o}function qr(r,e){let t=e?cB:lB;try{let n=JSON.parse(r),{jsonString:o}=aB(r,t);return o}catch{return r.length>t?r.slice(0,t)+sB:r}}function xo(r){return r<0?0:r}function DC(r){return{timings:{blocked:xo(r.domainLookupStart),dns:xo(r.domainLookupEnd-r.domainLookupStart),connect:xo(r.connectEnd-r.connectStart),send:xo(r.responseStart-r.requestStart),wait:0,receive:xo(r.responseEnd-r.responseStart),ssl:xo(r.connectEnd-r.secureConnectionStart)},total:xo(r.responseEnd)}}function kC(){return async r=>{let{fragment:e,code:t,context:n}=r,{env:o}=n||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function at({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await z(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}import{errors as SB}from"playwright-core";async function Mo({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await r(i)}catch(c){if(c instanceof SB.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await yB(c,i.locator,n,t);else throw c}throw s instanceof x?s:new x("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function yB(r,e,t,n){return r.message.includes("attempt #")?bB(r,e,t,n):EB(r)}async function bB(r,e,t,n){let o=r.message.split(/- retrying \w+ action, attempt #\d+/).filter(c=>c.length>0);if(!o.length)return n.warn({err:r},"Failed to parse Playwright error message for translation, returning raw message"),r;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
4316
- `,";").replace(/\s+/g," ");let a="",s=await Rr(e,n,150);if(s&&(a=`Target element HTML: ${ft(s,100,!0)}`),i.includes("element is not enabled"))return new x("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}});if(i.includes("intercepts pointer events")){let c="",l=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(l){let u=(await t.state.getRoot()).locator(Cr(l)),d=await Rr(u,n,150);d&&(c=`Covering element HTML: ${ft(d,100,!0)}`)}return new x("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${a}
4317
- ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:ee});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new x("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new x("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function EB(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new x("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as xB}from"child_process";import HC from"dedent";import{existsSync as vs,mkdirSync as kg,readdirSync as MB,rmSync as GC}from"fs";import{homedir as VC}from"os";import{basename as _B,join as Vn,resolve as PB}from"path";import{chromium as WC}from"playwright-core";import{addExtra as IB}from"playwright-extra";import OB from"puppeteer-extra-plugin-recaptcha";function UC(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:s}of r)(!s||s.matches({url:n.url(),method:n.method()}))&&(o[i]=a);await t.fallback({headers:o})}catch(o){e.warn({err:o},"Failed to apply custom headers to request, continuing")}}}import{randomUUID as vB}from"crypto";function FC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function BC(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await mu(i,n,void 0,!0);let u={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(h=>[h.name,h.value]),body:n.request.postData?.text}},d;if(t.fetchOriginalResponse){let h=await e.fetch();d={body:await h.text(),options:{status:h.status(),statusText:h.statusText(),headers:Object.entries(await h.headers())}}}let m=await TB(t,u,d),g={};m.headers.forEach((h,f)=>{g[f]=h});let p={body:await m.text(),contentType:m.headers.get("content-type")||"text/plain",headers:g,status:m.status};await e.fulfill(p);try{n.response={status:p.status,statusText:m.statusText,headers:Object.entries(p.headers).map(([h,f])=>({name:h,value:f})),cookies:[],content:{mimeType:p.contentType,text:p.body},_mocked:!0},o?.(a,n);for(let h of Object.values(s))h.matches(n)&&h.onRequestComplete(a,n)}catch(h){!h.message.includes("has been closed")&&!l&&c.warn({err:h},"Failed to add response to HAR")}}async function TB(r,e,t){try{return await r.generateResponse(e,t)}catch(n){let o=n instanceof Error?n.message:`${n}`;return new Response(o,{status:500,headers:{"Content-Type":"text/plain"}})}}async function Ig(r){try{await AB(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function AB(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=vB(),u=!1,d=await Pg(e,n);try{o?.(l,d);for(let g of Object.values(a))g.matches(d)&&(u=!0,g.onRequestStart(l,d))}catch(g){c()||i.warn({err:g},"Failed to add request to HAR")}let m=FC(n,s);m?await BC({logger:i,route:t,mock:m,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await wB({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function wB({route:r,request:e,onHarEntry:t,logger:n,requestRecorders:o,entry:i,requestId:a,neverRedact:s,isBrowserClosed:c}){await r.continue();try{let l=await e.response(),u;try{await l?.finished()}catch{}try{u=await e.sizes()}catch{}if(i&&await mu(e,i,u,s),!l||!i)return;await LC(i,e,l,u,s),t?.(a,i);for(let d of Object.values(o))d.matches(i)&&d.onRequestComplete(a,i)}catch(l){!l.message.includes("has been closed")&&!c()&&n.warn({err:l},"Failed to add response to HAR")}}async function CB(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function RB(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}function pu(r){return{request:{url:r.request.url,method:r.request.method,headers:r.request.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.request.postData?r.request.postData.mimeType.includes("json")?{json:JSON.parse(r.request.postData.text)}:{text:r.request.postData.text}:{}},response:r.response?{status:r.response.status,headers:r.response.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.response.content?r.response.content.mimeType?.includes("json")&&r.response.content.text?{json:JSON.parse(r.response.content.text)}:{text:r.response.content.text}:{}}:void 0}}async function Og(r){let e=r.request(),t=r.status(),n=r.headers(),o=await RB(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await CB(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Gn=class{requestMatcher;constructor(e){this.requestMatcher=e}matches(e){let{url:t,method:n}=e;return this.requestMatcher.method&&this.requestMatcher.method.toLowerCase()!==n.toLowerCase()?!1:eu(t,this.requestMatcher.urlMatcher)}};function Ts(r){let e=new URL(r.request().url());if(/^127\./.test(e.hostname)||/^192\.168\./.test(e.hostname)||/^10\./.test(e.hostname)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(e.hostname)||e.hostname==="localhost"||e.hostname==="0.0.0.0")return r.abort();if(e.hostname.startsWith("[")&&e.hostname.endsWith("]")){let t=e.hostname.slice(1,-1).toLowerCase();if(t==="::1"||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd"))return r.abort()}return r.fallback()}import{homedir as Lg,platform as Ng}from"os";import{join as Dg}from"path";function gu(){let r=[];if(Ng()==="linux"){let e=Lg();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Dg(e,".config",t,"Crash Reports"))})}else if(Ng()==="darwin"){let e=Lg();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Dg(e,"Library","Application Support",t,"Crashpad"))})}else if(Ng()==="win32"){let e=Lg();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Dg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function zC(){return[{name:"fs_optout",value:"1",domain:".fullstory.com",path:"/",expires:Date.now()/1e3+365*24*60*60,httpOnly:!1,secure:!0,sameSite:"None"}]}var Ug=Vn(VC(),"momentic","chromium"),jC=IB(WC);jC.use(OB({provider:{id:"2captcha",token:ki},visualFeedback:!0}));var LB=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],NB=["--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],DB=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-webgl2","--disable-audio-input","--disable-audio-output"];async function $C({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,iconKnowledgeBase:a,callbacks:s,videoOptions:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let l;switch(o.browserType){case"Google Chrome":l="chrome";break;case"Chrome for Testing":l=void 0;break;case"Chromium":l="chromium";break;default:l="chromium";break}let u=[...NB];!Ur&&UB()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},m={...i??{},geolocation:i?.geolocation||Sl,locale:i?.locale||ny,timezoneId:i?.timezoneId||oy,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??uu,viewport:i?.viewport??Rn,serviceWorkers:"block",storageState:{cookies:[...zC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(m.storageState.origins=Object.entries(o.initialLocalStorage).map(([b,w])=>({origin:b,localStorage:Object.entries(w).map(([R,v])=>({name:R,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let g=null,p,h,f={systemDevicePixelRatio:i?.deviceScaleFactor,isNewHeadless:!1};(l==="chrome"||l==="chromium")&&(f.isNewHeadless=!0,d.headless&&u.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&u.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`);try{let b=gu();b.forEach(w=>{if(!vs(w))return;["new","pending","completed"].forEach(v=>{let M=Vn(w,v);if(!vs(M))return;let A=MB(M);for(let I=0;I<A.length;I++){let k=Vn(M,A[I]);GC(k,{force:!0})}})}),b.forEach(w=>{vs(w)||kg(w,{recursive:!0});let R=Vn(w,`write-test-${Date.now()}`);kg(R,{recursive:!0}),GC(R,{recursive:!0,force:!0})}),u.push(...LB)}catch(b){e.warn({err:b},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...DB);let E=o.localChromeExtensionPaths?.map(b=>b.startsWith("~")?Vn(VC(),b.slice(1)):b);if(E?.length){if(l===void 0)throw new x("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of E){let M=Vn(v,"manifest.json");if(!vs(M))throw new x("UserConfigurationError",`Chrome extension path ${M} does not exist.`)}if(Ur)throw new x("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let b=Vn(Ug,`momentic-session-${Date.now()}`);if(!vs(b))try{kg(b,{recursive:!0})}catch(v){throw new x("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Ug} folder: ${v}`)}let w=[...u],R=E.map(v=>PB(v)).join(",");w.push(`--disable-extensions-except=${R}`),m?.deviceScaleFactor&&w.push(`--force-device-scale-factor=${m.deviceScaleFactor}`,`--device-scale-factor=${m.deviceScaleFactor}`),m.viewport&&w.push(`--window-size=${m.viewport.width},${m.viewport.height}`),p=await WC.launchPersistentContext(Vn(Ug,`momentic-session-${Date.now()}`),{...d,...m,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:w,baseURL:r}),e.info({sharedContextOptions:m,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:w,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),h=p.pages()[0]}else{g=await jC.launch({...d,args:u});let b={...m,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};p=await g.newContext(b),e.info({contextArgs:b,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await p.newPage()}if(c){let b=await h.video()?.path();if(b){let w=_B(b);c.onVideoPageChange({videoName:w})}}Ur&&await p.route("**",Ts);try{let b=g?.version();e.info({browserVersion:b},"Got browser version")}catch(b){e.warn({err:b},"Could not get browser version string")}return{browser:g,context:p,page:h,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:m.viewport||Rn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function kB(){if(process.platform!=="linux")return null;try{let e=xB("df -k /dev/shm",{encoding:"utf8"}).trim().split(/\r?\n/),n=e[e.length-1]?.trim().split(/\s+/)??[];if(!n||n.length<2)return null;let o=parseInt(n[1],10);return Number.isNaN(o)||o<=0?null:o/1024}catch{return null}}function UB(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=kB();return t==null?!1:t<128}function Fg(r,e=!1){let t=HC`window._MOMENTIC_BROWSER = true;
4314
+ `&&(i=s),r.slice(o,i)}function Rr(r){let e=typeof r=="string"?r:r.toString();return`[${mn}="${e}"]`}import{execSync as $z}from"child_process";import{randomUUID as Zg}from"crypto";import{diff as eh}from"deep-object-diff";import{existsSync as Au,readFileSync as qz,readdirSync as Kz,statSync as FR,writeFileSync as Yz}from"fs";import{Jimp as BR}from"jimp";import Xz from"js-beautify";import{cloneDeep as Fi}from"lodash-es";import Jz from"mime";import{platform as Qz}from"os";import{basename as zR,extname as Zz,join as e1}from"path";import{v4 as t1}from"uuid";import{rmSync as oR}from"fs";import{basename as qB,join as KB}from"path";import{errors as YB}from"playwright-core";import{devices as ZF}from"playwright-core";var vC=2,Di=8e3;var Ro=250,dt=500;var AC=5e3,wC=250,re=3e3,Ee=2e3,ne=1e3,yg=3e4,du=8e3,CC=10,bg=.05;var RC=new Set(["about:blank","chrome-error://chromewebdata/"]);var Eg=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],Tg=1e4,Ts=500,mu=ZF["Desktop Chrome"].userAgent,xC=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as eB,rmSync as MC,statSync as tB}from"fs";import*as Cg from"node:fs";import rB from"nodejs-file-downloader";import{tmpdir as nB}from"os";import zn,{basename as oB,dirname as iB}from"path";var Rg="file://",wg=zn.join(nB(),"momentic","downloads"),Ag=1e4,aB=50*1024*1024;async function _C(r){let{uri:e}=r;if(e.startsWith(Rg))return lB(r);if(e.startsWith("http"))return uB(r);if(Mb)return cB(r);throw new x("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function sB(r,e){let t=zn.join(wg,r,e.slice(Rg.length)),n=zn.join(wg,r),o=t.startsWith(n);if(!Cg.existsSync(t)||!o)throw new x("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function lB({uri:r,orgId:e}){let t=sB(e,r);return{filePath:t,cleanup:()=>{MC(iB(t),{recursive:!0,force:!0})}}}async function cB({uri:r}){let e=zn.resolve(r);if(!Cg.existsSync(e))throw new x("UserConfigurationError",`The referenced file (${r}) does not exist on disk. Please make sure that it has been downloaded successfully.`);return{filePath:e,cleanup:()=>{}}}async function uB({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=oB(n.href),i=Mg(o),a=zn.extname(i);if(vb.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=xg(t),c,l;for(let g=1;g<=3;g++){let h=new rB({url:r,fileName:i,directory:s,maxAttempts:1,headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"},timeout:Ag});try{let{downloadStatus:f,filePath:E}=await z(h.download(),{milliseconds:Ag,message:`Download timed out after ${Ag}ms`});if(f!=="COMPLETE"||!E)throw new Error(`Download ended in non-success status: ${f}`);c=E;break}catch(f){l=f}}if(!c)throw new Error(`Download failed after 3 attempts. Last error: ${l instanceof Error?l.message:l}`);let u=c,m=tB(u).size;if(m>aB)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:m,filePath:u,fileName:i},"Downloaded file to disk");let p;return{filePath:u,cleanup:()=>{clearTimeout(p),p=setTimeout(()=>MC(s,{recursive:!0,force:!0}),10*60*1e3)}}}function PC(r,e){return`${Rg}${r}/${e}`}function xg(r){let e=Math.random().toString(36).substring(4),t=zn.join(wg,r,e);return eB(t,{recursive:!0}),t}function Mg(r){let e=zn.extname(r),t=zn.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function xr(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:ne})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}var Hn=3.1783027;function dB(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);!(n>=48&&n<=57)&&!(n>=65&&n<=90)&&!(n>=97&&n<=122)&&e++}return e}function Mr(r){return Math.ceil(_g(r)/Hn)}function _g(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
4315
+ `,""),t=t.replaceAll(" ","");let n=dB(t);return t.length-n+Hn*n}if(typeof r>"u"||r===null)return 0;if(typeof r=="number")return String(r).length;if(Array.isArray(r))return r.forEach(t=>{e+=_g(t)}),e;if(typeof r=="object"){let t=r;return t.type==="image"||t.type==="media"&&"data"in t&&"mediaType"in t&&typeof t.mediaType=="string"&&t.mediaType.includes("jpeg")?1600:(Object.keys(t).forEach(n=>{e+=String(n).length,n==="image_url"?(t[n]??{}).detail==="high"?e+=1105*Hn:e+=85*Hn:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Hn:e+=_g(t[n])}),e)}if(typeof r=="boolean")return r?4:5;throw new Error(`Unsupported type passed to token length calculator '${typeof r}': ${r}`)}var pu=class{limit;windowMs;userActions;constructor(e,t){this.limit=e,this.windowMs=t,this.userActions=new Map}_cleanup(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;if(this.userActions.has(o)){let a=this.userActions.get(o)?.filter(s=>n-s<=this.windowMs)??[];a.length>0?this.userActions.set(o,a):this.userActions.delete(o)}}increment(e,t="DEFAULT_USER"){let n=Date.now(),o=`${t}:${e}`;this._cleanup(t,e),this.userActions.has(o)||this.userActions.set(o,[]);let i=this.userActions.get(o);return i.length>=this.limit?!0:(i.push(n),!1)}};async function IC(r,e){let t=r.evaluate(async()=>{let i=window,a={};try{let s=await indexedDB.databases();for(let c of s){if(!c.name)continue;let l=await i.exportIdbToObject?.(c.name,c.version);l&&(a[c.name]=l)}return[a,void 0]}catch(s){return[void 0,s.message]}}),[n,o]=await z(t,{milliseconds:re});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function OC(r,e,t){if(e){t.debug("Importing indexedDB data");try{let n=r.evaluate(async o=>{let i=window;for(let[a,s]of Object.entries(o))await i.importObjectToIdb?.(a,s)},e);await z(n,{milliseconds:re})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function LC(r,e){try{let t=r.evaluate(async()=>{window.localStorage.clear(),window.sessionStorage.clear(),await indexedDB.databases().then(n=>{n.forEach(o=>{o.name&&indexedDB.deleteDatabase(o.name)})})});await z(t,{milliseconds:re})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function NC(r,e,t,n,o){try{await mB(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function mB(r,e,t,n){let o=n.text();o.length>Ts&&(o=o.slice(0,Ts)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Ts?i.push(c.slice(0,Ts)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}Pg(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function Pg(r,e,t,n){let o=Date.now(),i=e.logsPerPage;if(i.length<=t||i[t]===void 0){i[t]=[];for(let a=0;a<t;a++)i[a]===void 0&&(i[a]=[])}i[t].length>Tg&&(i[t]=i[t].slice(Math.floor(Tg/2)),i[t]?.push({url:r.url(),timestamp:o,type:"warning",text:"[MOMENTIC] Truncated console logs due to buffer overflow",tabIndex:t})),i[t].push({...n,tabIndex:t,timestamp:o})}async function fr({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await hg({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import pB from"truncate-json";var gB="[redacted due to size]",hB=5e3,fB=1e6,kC=1e3;function UC(r,e,t,n){try{t?.({id:e,startedDateTime:new Date().toISOString(),title:void 0,pageTimings:{}})}catch(o){r.warn({err:o},"Unexpected error in onHarPage callback")}}async function Ig(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await BC(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:zC(t).timings}}async function FC(r,e,t,n,o){let i={},s=((await t.headerValue("content-type"))?.toLowerCase()??void 0)?.split(";")[0]??void 0;if(n)try{i=await AB({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await BC(t),status:t.status(),statusText:t.statusText(),content:i,redirectURL:t.headers().location,_mocked:!1};r.response=c,r.response&&n&&(r.response.bodySize=n.responseBodySize,r.response.headersSize=n.responseHeadersSize,r.response.content.size=n.responseBodySize);let l=e.timing();r.startedDateTime=new Date(l.startTime).toISOString();let{timings:u,total:d}=zC(l);r.time=d,r.timings=u}function DC(r){try{return new Date(r).toISOString()}catch{return}}function SB(r){let e={name:"",value:""},t=!0;for(let n of r.split(/; */)){let o=n.indexOf("="),i=o!==-1?n.substring(0,o).trim():n.trim(),a=o!==-1?n.substring(o+1,n.length).trim():"";if(t){t=!1,e.name=Kr(i,!1),e.value=Kr(a,!1);continue}i==="Domain"&&(e.domain=Kr(a,!1)),i==="Expires"&&(e.expires=DC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=DC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=Kr(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function BC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(SB)??[];return{headers:Object.entries(e).map(([n,o])=>({name:Kr(n,!1),value:Kr(o,!1)})),cookies:t}}async function gu(r,e,t,n){let o=await r.headerValue("content-type")??"application/octet-stream";if(t&&(e.request.bodySize=t.requestBodySize,e.request.headersSize=t.requestHeadersSize),!n&&t&&t.requestBodySize>kC){e.request.postData={mimeType:o,text:"",params:[],_redactedReason:"Request body redacted due to size"};return}let i=r.postData();if(!i)return;let a={mimeType:o,text:Kr(i,n),params:[]};if(o==="application/x-www-form-urlencoded"){let s=new URLSearchParams(i.toString());for(let[c,l]of s.entries())a.params.push({name:Kr(c,n),value:l?Kr(l,n):void 0})}e.request.postData=a}var yB=["image","font","video","audio"],bB=["javascript"],EB=["text"],TB=["json","xml","html"];function vB(r){let[e,t]=r.split("/");return e&&yB.includes(e)||t&&bB.some(n=>t.includes(n))?!1:!!(e&&EB.includes(e)||t&&TB.some(n=>t.includes(n)))}async function AB({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!vB(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=kC?o._redactedReason="Response body redacted due to size":o.text=Kr(await r.text(),n),o}function Kr(r,e){let t=e?fB:hB;try{let n=JSON.parse(r),{jsonString:o}=pB(r,t);return o}catch{return r.length>t?r.slice(0,t)+gB:r}}function xo(r){return r<0?0:r}function zC(r){return{timings:{blocked:xo(r.domainLookupStart),dns:xo(r.domainLookupEnd-r.domainLookupStart),connect:xo(r.connectEnd-r.connectStart),send:xo(r.responseStart-r.requestStart),wait:0,receive:xo(r.responseEnd-r.responseStart),ssl:xo(r.connectEnd-r.secureConnectionStart)},total:xo(r.responseEnd)}}function HC(){return async r=>{let{fragment:e,code:t,context:n}=r,{env:o}=n||{},i=Object.getPrototypeOf(async function(){}).constructor;return{result:await Promise.resolve(new i("env",e?`return ${t}`:t)(o))}}}async function st({root:r,fn:e,arg:t,timeout:n,waitForPageLoad:o,codePath:i}){return await o(),await z(r.evaluate(e,t),{milliseconds:n,message:`Timed out ${i} after ${n}ms. This indicates that either the page is unresponsive or your machine is severely resource constrained.`})}import{errors as wB}from"playwright-core";async function Mo({func:r,action:e,logger:t,callbacks:n,retryTimeoutMs:o,targetingResult:i}){let a=Date.now(),s;for(;Date.now()-a<o;)try{return await r(i)}catch(c){if(c instanceof wB.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await CB(c,i.locator,n,t);else throw c}throw s instanceof x?s:new x("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function CB(r,e,t,n){return r.message.includes("attempt #")?RB(r,e,t,n):xB(r)}async function RB(r,e,t,n){let o=r.message.split(/- retrying \w+ action, attempt #\d+/).filter(c=>c.length>0);if(!o.length)return n.warn({err:r},"Failed to parse Playwright error message for translation, returning raw message"),r;let i=o.length>2?o[o.length-2]:o[0];i=i.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"").replaceAll(" - ","").trim().replaceAll(`
4316
+ `,";").replace(/\s+/g," ");let a="",s=await xr(e,n,150);if(s&&(a=`Target element HTML: ${ft(s,100,!0)}`),i.includes("element is not enabled"))return new x("ActionFailureError",`The element you attempted to interact with was disabled for the entire timeout duration. Please explicitly wait for the element to be enabled, change the element description to target an interactive element, or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}});if(i.includes("intercepts pointer events")){let c="",l=i.match(/<.*?data-momentic-id="(\d+)".*?intercepts pointer events/)?.[1];if(l){let u=(await t.state.getRoot()).locator(Rr(l)),d=await xr(u,n,150);d&&(c=`Covering element HTML: ${ft(d,100,!0)}`)}return new x("ActionFailureError",`The element you attempted to interact with was covered by another element such as dropdown, popup, or dialog for the entire timeout duration. Please add a step to hide the covering element or turn on the 'disable stability checks' option. ${a}
4317
+ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="The element you attempted to interact with has no bounding box or is explicitly hidden.";try{let l=await e.boundingBox({timeout:re});l?l.height===0?c="The element you attempted to interact with has zero height.":l.width===0&&(c="The element you attempted to interact with has zero width."):c="The element you attempted to interact with has no bounding box."}catch{}return new x("ActionFailureError",`${c} Please explicitly wait for the element to be visible or turn on the 'disable stability checks' option. ${a}`,{errOptions:{cause:r}})}return i.includes("element is outside of the viewport")?new x("ActionFailureError",`The element requested was outside of the browser viewport for the entire duration of the action. Please ensure you are not using non-standard zoom settings and the element is visible on the page. ${a}`):r}function xB(r){let e=r.message;if(e.includes("waiting for locator")&&e.includes("data-momentic-id")&&!e.match(/attempting \w+ action/)&&!e.includes("locator.evaluate"))throw new x("ActionFailureError",`Interacting with the element timed out. This is usually caused by the web page itself performing too many CPU-intensive operations or a lack of resources on your machine. Error: ${e}`,{errOptions:{cause:r}});return r}import{execSync as NB}from"child_process";import $C from"dedent";import{existsSync as As,mkdirSync as Ug,readdirSync as DB,rmSync as qC}from"fs";import{homedir as YC}from"os";import{basename as kB,join as Vn,resolve as UB}from"path";import{chromium as KC}from"playwright-core";function GC(r,e){return async(t,n)=>{try{let o=await n.allHeaders();for(let{key:i,value:a,matcher:s}of r)(!s||s.matches({url:n.url(),method:n.method()}))&&(o[i]=a);await t.fallback({headers:o})}catch(o){e.warn({err:o},"Failed to apply custom headers to request, continuing")}}}import{randomUUID as _B}from"crypto";function VC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function WC(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await gu(i,n,void 0,!0);let u={url:n.request.url,options:{method:n.request.method,headers:n.request.headers.map(h=>[h.name,h.value]),body:n.request.postData?.text}},d;if(t.fetchOriginalResponse){let h=await e.fetch();d={body:await h.text(),options:{status:h.status(),statusText:h.statusText(),headers:Object.entries(await h.headers())}}}let m=await MB(t,u,d),p={};m.headers.forEach((h,f)=>{p[f]=h});let g={body:await m.text(),contentType:m.headers.get("content-type")||"text/plain",headers:p,status:m.status};await e.fulfill(g);try{n.response={status:g.status,statusText:m.statusText,headers:Object.entries(g.headers).map(([h,f])=>({name:h,value:f})),cookies:[],content:{mimeType:g.contentType,text:g.body},_mocked:!0},o?.(a,n);for(let h of Object.values(s))h.matches(n)&&h.onRequestComplete(a,n)}catch(h){!h.message.includes("has been closed")&&!l&&c.warn({err:h},"Failed to add response to HAR")}}async function MB(r,e,t){try{return await r.generateResponse(e,t)}catch(n){let o=n instanceof Error?n.message:`${n}`;return new Response(o,{status:500,headers:{"Content-Type":"text/plain"}})}}async function Og(r){try{await PB(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function PB(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=_B(),u=!1,d=await Ig(e,n);try{o?.(l,d);for(let p of Object.values(a))p.matches(d)&&(u=!0,p.onRequestStart(l,d))}catch(p){c()||i.warn({err:p},"Failed to add request to HAR")}let m=VC(n,s);m?await WC({logger:i,route:t,mock:m,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await IB({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function IB({route:r,request:e,onHarEntry:t,logger:n,requestRecorders:o,entry:i,requestId:a,neverRedact:s,isBrowserClosed:c}){await r.continue();try{let l=await e.response(),u;try{await l?.finished()}catch{}try{u=await e.sizes()}catch{}if(i&&await gu(e,i,u,s),!l||!i)return;await FC(i,e,l,u,s),t?.(a,i);for(let d of Object.values(o))d.matches(i)&&d.onRequestComplete(a,i)}catch(l){!l.message.includes("has been closed")&&!c()&&n.warn({err:l},"Failed to add response to HAR")}}async function OB(r){let e=r.postData();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:r.postDataJSON()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}async function LB(r){let e=await r.text();if(e){if((await r.headerValue("content-type"))?.includes("json"))try{return{json:await r.json()}}catch{return{}}else if((await r.headerValue("content-type"))?.includes("text"))return{text:e}}return{}}function hu(r){return{request:{url:r.request.url,method:r.request.method,headers:r.request.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.request.postData?r.request.postData.mimeType.includes("json")?{json:JSON.parse(r.request.postData.text)}:{text:r.request.postData.text}:{}},response:r.response?{status:r.response.status,headers:r.response.headers.reduce((e,t)=>({...e,[t.name]:t.value}),{}),...r.response.content?r.response.content.mimeType?.includes("json")&&r.response.content.text?{json:JSON.parse(r.response.content.text)}:{text:r.response.content.text}:{}}:void 0}}async function Lg(r){let e=r.request(),t=r.status(),n=r.headers(),o=await LB(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await OB(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Gn=class{requestMatcher;constructor(e){this.requestMatcher=e}matches(e){let{url:t,method:n}=e;return this.requestMatcher.method&&this.requestMatcher.method.toLowerCase()!==n.toLowerCase()?!1:ru(t,this.requestMatcher.urlMatcher)}};function vs(r){let e=new URL(r.request().url());if(/^127\./.test(e.hostname)||/^192\.168\./.test(e.hostname)||/^10\./.test(e.hostname)||/^172\.(1[6-9]|2\d|3[0-1])\./.test(e.hostname)||e.hostname==="localhost"||e.hostname==="0.0.0.0")return r.abort();if(e.hostname.startsWith("[")&&e.hostname.endsWith("]")){let t=e.hostname.slice(1,-1).toLowerCase();if(t==="::1"||t.startsWith("fe80:")||t.startsWith("fc")||t.startsWith("fd"))return r.abort()}return r.fallback()}import{homedir as Ng,platform as Dg}from"os";import{join as kg}from"path";function fu(){let r=[];if(Dg()==="linux"){let e=Ng();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(kg(e,".config",t,"Crash Reports"))})}else if(Dg()==="darwin"){let e=Ng();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(kg(e,"Library","Application Support",t,"Crashpad"))})}else if(Dg()==="win32"){let e=Ng();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(kg(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function jC(){return[{name:"fs_optout",value:"1",domain:".fullstory.com",path:"/",expires:Date.now()/1e3+365*24*60*60,httpOnly:!1,secure:!0,sameSite:"None"}]}var Fg=Vn(YC(),"momentic","chromium"),FB=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],BB=["--no-first-run","--renderer-process-limit=3","--browser-test","--disable-site-isolation-for-policy","--disable-site-isolation-trials","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--disable-renderer-backgrounding","--autoplay-policy=user-gesture-required","--disable-add-to-shelf","--disable-desktop-notifications","--use-fake-device-for-media-stream","--use-fake-ui-for-media-stream","--enable-logging=stderr","--log-level=2"],zB=["--disable-3d-apis","--disable-gpu","--disable-software-rasterizer","--disable-accelerated-2d-canvas","--disable-accelerated-mjpeg-decode","--disable-accelerated-video-decode","--disable-accelerated-video-encode","--disable-gl-drawing-for-tests","--disable-webgl","--disable-webgl2","--disable-audio-input","--disable-audio-output"];async function XC({baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,contextArgs:i,iconKnowledgeBase:a,callbacks:s,videoOptions:c}){process.env.PW_TEST_SCREENSHOT_NO_FONTS_READY="1";let l;switch(o.browserType){case"Google Chrome":l="chrome";break;case"Chrome for Testing":l=void 0;break;case"Chromium":l="chromium";break;default:l="chromium";break}let u=[...BB];!wr&&GB()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},m={...i??{},geolocation:i?.geolocation||fl,locale:i?.locale||QS,timezoneId:i?.timezoneId||ZS,colorScheme:i?.colorScheme,httpCredentials:o.basicAuthorization?{username:o.basicAuthorization.username??"",password:o.basicAuthorization.password??""}:void 0,javaScriptEnabled:o.disableJavaScript?!1:void 0,ignoreHTTPSErrors:o.ignoreHttpsErrors??!1,userAgent:o.userAgent??mu,viewport:i?.viewport??Rn,serviceWorkers:"block",storageState:{cookies:[...jC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(m.storageState.origins=Object.entries(o.initialLocalStorage).map(([b,C])=>({origin:b,localStorage:Object.entries(C).map(([R,v])=>({name:R,value:v}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let p=null,g,h,f={systemDevicePixelRatio:i?.deviceScaleFactor,isNewHeadless:!1};(l==="chrome"||l==="chromium")&&(f.isNewHeadless=!0,d.headless&&u.push("--headless=new")),process.env.BROWSER_MEMORY_MB&&u.push(`--js-flags=--max_old_space_size=${process.env.BROWSER_MEMORY_MB}`);try{let b=fu();b.forEach(C=>{if(!As(C))return;["new","pending","completed"].forEach(v=>{let M=Vn(C,v);if(!As(M))return;let A=DB(M);for(let I=0;I<A.length;I++){let k=Vn(M,A[I]);qC(k,{force:!0})}})}),b.forEach(C=>{As(C)||Ug(C,{recursive:!0});let R=Vn(C,`write-test-${Date.now()}`);Ug(R,{recursive:!0}),qC(R,{recursive:!0,force:!0})}),u.push(...FB)}catch(b){e.warn({err:b},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...zB);let E=o.localChromeExtensionPaths?.map(b=>b.startsWith("~")?Vn(YC(),b.slice(1)):b);if(E?.length){if(l===void 0)throw new x("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let v of E){let M=Vn(v,"manifest.json");if(!As(M))throw new x("UserConfigurationError",`Chrome extension path ${M} does not exist.`)}if(wr)throw new x("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let b=Vn(Fg,`momentic-session-${Date.now()}`);if(!As(b))try{Ug(b,{recursive:!0})}catch(v){throw new x("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${Fg} folder: ${v}`)}let C=[...u],R=E.map(v=>UB(v)).join(",");C.push(`--disable-extensions-except=${R}`),m?.deviceScaleFactor&&C.push(`--force-device-scale-factor=${m.deviceScaleFactor}`,`--device-scale-factor=${m.deviceScaleFactor}`),m.viewport&&C.push(`--window-size=${m.viewport.width},${m.viewport.height}`),g=await KC.launchPersistentContext(Vn(Fg,`momentic-session-${Date.now()}`),{...d,...m,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:C,baseURL:r}),e.info({sharedContextOptions:m,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:C,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),h=g.pages()[0]}else{p=await KC.launch({...d,args:u});let b={...m,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};g=await p.newContext(b),e.info({contextArgs:b,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await g.newPage()}if(c){let b=await h.video()?.path();if(b){let C=kB(b);c.onVideoPageChange({videoName:C})}}wr&&await g.route("**",vs);try{let b=p?.version();e.info({browserVersion:b},"Got browser version")}catch(b){e.warn({err:b},"Could not get browser version string")}return{browser:p,context:g,page:h,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:m.viewport||Rn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function HB(){if(process.platform!=="linux")return null;try{let e=NB("df -k /dev/shm",{encoding:"utf8"}).trim().split(/\r?\n/),n=e[e.length-1]?.trim().split(/\s+/)??[];if(!n||n.length<2)return null;let o=parseInt(n[1],10);return Number.isNaN(o)||o<=0?null:o/1024}catch{return null}}function GB(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=HB();return t==null?!1:t<128}function Bg(r,e=!1){let t=$C`window._MOMENTIC_BROWSER = true;
4318
4318
  window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(r)};
4319
- window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t+=HC`
4319
+ window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t+=$C`
4320
4320
  window._fs_namespace = window._fs_namespace || 'FS';
4321
4321
  function FSNoop() {}
4322
4322
  FSNoop.q = [];
@@ -4325,33 +4325,33 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4325
4325
  writable: false,
4326
4326
  configurable: false,
4327
4327
  });`),`${t}
4328
- //# sourceURL=momentic-injected/extra-scripts.js`}async function qC(r){try{return await FB(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function FB({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:te}),o=await Rr(r,e,500),i=await r.boundingBox({timeout:te});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5||n!=="input")return;if(t)try{let c=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await c.waitFor({state:"visible",timeout:te}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let l=window,u=c.parentElement;if(!u)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.getBoundingClientRect(),m=u.getBoundingClientRect();if(m.width===0||m.height===0)return{type:"error",error:"Parent element has no width or height"};let g={x:Math.min(Math.max(1,d.left-m.left),m.width-1),y:Math.min(Math.max(1,d.top-m.top),m.height-1)},p=l._MOMENTIC_FEATURE_FLAGS?.[lu],h=c.getAttribute(dn),f=!p&&h?Cr(h):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:g,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:te});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:te}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var YC=["date","datetime-local","month","time","week"],KC={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function XC(r){try{await z(BB(r),{milliseconds:ee})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function BB({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await at({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:te,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!KC[i])return;KC[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as $t}from"zod";var JC=$t.object({doubleClick:$t.boolean().optional(),rightClick:$t.boolean().optional(),force:$t.boolean().optional(),waitForDownload:$t.boolean().optional(),delayMs:$t.number().optional(),downloadTimeoutMs:$t.number().optional(),relativePosition:$t.object({x:$t.number(),y:$t.number()}).optional()}),GTe=$t.object({repeat:$t.number().optional(),convertMeta:$t.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:$t.number().optional()});async function hu({locator:r,callbacks:e,logger:t,timeoutMs:n=te}){try{await Bg(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let g=window.getComputedStyle(d,null).getPropertyValue("display");if(g==="none"||g==="contents")return!1;let p=d.getBoundingClientRect();return!(!p.height||!p.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let c=i.style.getPropertyValue("outline"),l=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let u=`momentic${Math.floor(Math.random()*1e7)}`;a[u]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",c,l),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[u](),a.removeHighlightFunctions?.[u]&&delete a.removeHighlightFunctions[u]},5e3)),a.removeHighlightFunctions[u]=a[u]},void 0,{timeout:n});return await z(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Bg(r,e=te){let t=await r.state.getRoot();await at({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function zg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Mo({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>ZC({...r,targetingResult:t,useVisualClick:e})})}async function VB(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await WB(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function WB(r,e){let{logger:t,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:te});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:te}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),ZC({...e,targetingResult:{locator:a},redirectionAttempts:n+1})}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function jB(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=JC.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await KB({targetingResult:t,position:n,options:o,logger:e,isAndroid:r.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function $B(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await qC({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;s&&!a&&t.hints?.relativeXYToLocator&&(a=t.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:ee,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:ee,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(XB(u))o.warn({err:u},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:u},"Error clicking on locator, attempting to recover..."),VB(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function ZC(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??Sg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof GB.TimeoutError?new x("ActionFailureError",`Download did not complete in ${u}ms`):new x("ActionFailureError",`Download failed: ${d.message}`)}})());try{await hu({locator:a.locator,callbacks:n,logger:t,timeoutMs:te})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await jB(r):l=(await $B(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new x("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await z(s,{milliseconds:e.downloadTimeoutMs??Sg});if(u instanceof Error)throw u;return{downloadedFile:await YB(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function qB(r,e){let t=await r.locator.boundingBox({timeout:ee});if(!t){let i=await Rr(r.locator,e,500);throw new x("ActionFailureError",`${kd}${i?`: ${i}`:""}`)}if(r.hints?.relativeXYToLocator){let i=t.x+r.hints.relativeXYToLocator.x,a=t.y+r.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function KB({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:ee}),d=r.relativePosition.x,m=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(m=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+m,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:ee});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await qB(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=r?.rightClick?"right":"left",l=r?.delayMs??25;return r?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l}),{clickX:o,clickY:i,reason:a}}async function YB(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=xg(r.suggestedFilename()),i=e();await r.saveAs(HB(i,o)),QC(n,{force:!0}),setTimeout(()=>{QC(i,{recursive:!0,force:!0})},5*60*1e3);let a=CC(zB(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function XB(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as JB}from"os";var QB={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function ZB(){let r=JB();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function eR(r){return JSON.stringify(r.split("+").sort())}function fu(r,e){let t=ZB(),n=eR(r);for(let o of Object.values(QB))if(Object.values(o).some(i=>eR(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Hg({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await at({root:r,fn:([d,m,g,p])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*g,window.scrollY+(m??window.innerHeight)*p),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"scrolling page"});else{let d=e.viewportSize()||Rn,m=await at({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing page height"}),[g,p,h]=await at({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let E=f.getBoundingClientRect();return[f.scrollTop,E.x,E.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<Ee;){a?.throwIfAborted();let E=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:te}),[b,w,R]=await z(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let M=v.getBoundingClientRect();return[v.scrollTop,M.x,M.y]}),{milliseconds:te});if(E===m&&b===g&&w===p&&R===h)break;m=E,g=b,p=w,h=R,await W(dt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Gg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await W(dt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function tR(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await ez(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await W(s??Ro),await e.mouse.up()}async function rR(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await W(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,cu):500),await r.mouse.up()}async function ez(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:m,endX:g,endY:p,stepCount:h,delayMs:f})=>{let E=document.elementFromPoint(d,m)??document.body??document.documentElement,w=window._momenticMobileUtilities.dispatchTouch;w(E,"touchstart",d,m);for(let R=1;R<=h;R+=1){let v=d+(g-d)*R/h,M=m+(p-m)*R/h;w(E,"touchmove",v,M),await new Promise(A=>setTimeout(A,Math.floor((f??500)/h)))}w(E,"touchend",g,p)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as lz}from"crypto";import{cloneDeep as jg}from"lodash-es";function Wn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as tz}from"crypto";var rz="v1";function Vg(r,e){if(r.tagName.toLowerCase()==="svg"&&!oz(r))try{let t=nR(r,e),n=nz(JSON.stringify(t));return{version:rz,json:t,hash:n}}catch{return}}function nz(r){return tz("md5").update(r).digest("hex")}function nR(r,e){let t=r.tagName.toLowerCase(),n=iz(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=nR(a,e);s&&o.children.push(s)}}return o}function oz(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function iz(r){let e={},t=r.attributes;for(let n of Object.keys(t))hr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var _o={r:147,g:196,b:125,a:.55},iR={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:_o,paddingColor:_o,borderColor:_o,marginColor:_o,eventTargetColor:_o,shapeColor:_o,shapeMarginColor:_o,showInfo:!0,showAccessibilityInfo:!0};function aR({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=az({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function az({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((A,I)=>{u[A]=I});let d=l.styles,m=l.bounds??[],g=c.nodes,p=g.contentDocumentIndex??{index:[],value:[]},h=g.backendNodeId??[],f=g.attributes??[],E=g.parentIndex??[],b=g.nodeName??[],w=g.nodeType??[],R=g.pseudoType??{index:[],value:[]},v=g.inputChecked??{index:[]},M=e[c.frameId];for(let A=0;A<h.length;A++){let I=h[A],k=w[A],j=f[A]??[],ne=E[A]!==void 0&&E[A]>=0?E[A]:void 0,Te=ne!==void 0?h[ne]:void 0,At=Te!==void 0?a[Te]:void 0,G=R.index.indexOf(A),$=G!==-1?e[R.value[G]]:void 0,ge=u[A],ae;ge?ae=m[ge]??[]:ae=[];let Ce=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!Ce){s.warn({backendNodeId:I,frameId:M,frameIndex:o,nodeBounds:ae},"DOM node has no tag name");continue}let Me={backendNodeId:I,psuedoType:$,nodeType:k,frameIndex:o,parentFrameId:M,ownedFrameId:void 0,bounds:{x:ae[0]??null,y:ae[1]??null,width:ae[2]??null,height:ae[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:Te??null,tagName:Ce,parent:At??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};At&&At.childrenBackendIds.push(I);let Jt=p.index.indexOf(A);if(Jt!==-1){let _e=p.value[Jt];i[_e]=Me;let $e=r[_e]?.frameId;Me.ownedFrameId=$e!==void 0?e[$e]:void 0}for(let _e of Object.keys(Me.bounds)){let $e=_e;Me.bounds[$e]!==null&&(Me.bounds[$e]/=n)}let qt=ge!==void 0?d[ge]??[]:[];for(let _e=0;_e<qt.length&&!(_e>=t.length);_e++){let $e=qt[_e];if($e===void 0||isNaN($e))continue;let st=e[$e];if(st===void 0)continue;let Pt=t[_e];Me.computedStyles[Pt]=st}for(let _e=0;_e<j.length;_e+=2){let $e=j[_e],st=j[_e+1];if(!$e||!st)continue;let Pt=e[$e],Gt=e[st];!Pt||!Gt||(Me.attributes[Pt]=Gt)}v.index.includes(A)&&(Me.attributes.checked="true"),a[Me.backendNodeId]=Me}return a[h[0]]}function Wg(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${Wg(t,e)}${a}`}return r.mPathSelector=n,n}function oR(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var sz=["html","#document","#document-fragment"];function sR({node:r,domGraph:e}){let t=[],n=r,o=oR(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=oR(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,sz.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],m=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else m?.nodeType===1&&!m.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function lR(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function cR(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Ee}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Ee})).attributes,i=Wn(o,dn);if(!i)throw new Error(`Could not find attribute ${dn} for object ${e}`);return i}var cz=["focusable","keyshortcuts","controls","live","relevant","orientation"],uz=["selected","readonly","modal","required","invalid"],dz=["id","name","role","content"],uR=["absolute","fixed","sticky"],mz=["i","label"],pz=["path"],gz=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],pR=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],gR=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],hz=["menulistpopup","statictext","inlinetextbox"],fz=80,dR=100,hR=50,Kg=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],Sz=["cite"],yz={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},bz={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},mR={indentLevel:0},$g=class r{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&t.length<hR?t:""),this.role=this.role||(e.domNode.attributes.role??""),Az(this.properties,e.domNode,e.importantProperties)}Cz(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&pz.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>gR.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>ER(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>TR(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&mz.includes(this.domNode.tagName)||gz.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||hr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>bR(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}serialize(e=mR){let t=Object.assign({},mR,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=jg(this.properties),u=" ".repeat(n),d=this.role||"",m=this.tagName??"unknown",g=this.name;d==="heading"&&g==="heading"&&(g=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(g="");let h=this.nameSources?.find(v=>!v.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let v=h.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===g&&(g="")}let f=Kg.includes(this.role)||Sz.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${g}
4329
- `;let E=`${u}<${m}`;!a&&!f&&(E+=` id="${this.id}"`);let b=s??!1;if((l.multiline||l.contenteditable)&&this.children.length>0&&(b=!0),d&&d!=="generic"&&d!==m&&!(yz[d]??[]).includes(m)&&(E+=` role=${JSON.stringify(d)}`),g&&(E+=` name=${JSON.stringify(g)}`),this.content&&!b&&(E+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isIneligible()&&(E+=` ${hr.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,M=Math.round(v.x??0),A=Math.round(v.y??0),I=Math.round((v.x??0)+(v.width??0)),k=Math.round((v.y??0)+(v.height??0));E+=` bounds=[${M} ${A} ${I} ${k}]`}let w=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-w>1e3)throw new Error(`Serialization for the HTML element with tag ${m} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([v,M])=>{if(!cz.includes(v)){{if(uz.includes(v)&&(!M||M==="false"))return;if(v==="value"&&b&&(l.type==="text"||this.role==="textbox"))return;if(v==="level"&&`${M}`=="1")return;if(v==="url"&&l.src&&m==="img")return;if(v==="url"&&l.href&&m==="a")return;if(v==="editable"&&M==="plaintext")return;if(v==="type"&&M===m)return;if(c&&!bz[v])return}typeof M=="string"?E+=` ${v}="${ft(M,dR,!0)}"`:typeof M=="boolean"?M?E+=` ${v}`:E+=` ${v}={false}`:typeof M<"u"&&(E+=` ${v}={${ft(JSON.stringify(M),dR,!0)}}`)}})}if(m==="::before"||m==="::after"){let v="";for(let M of this.children)v+=M.serialize({...e,indentLevel:n,neighbors:0});return v}let R=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||R)E+=` />
4330
- `;else{let v="";for(let A of this.children)v+=A.serialize({...e,indentLevel:n+2,neighbors:0});let M=v.trim();M.length<=fz&&!M.includes(`
4328
+ //# sourceURL=momentic-injected/extra-scripts.js`}function zg(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var VB=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],WB=["local-network-access"];function JC(r){return wr?r.filter(e=>!WB.includes(e)):r}function QC(r){return JC(r||VB)}async function ZC(r){try{return await jB(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function jB({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:ne}),o=await xr(r,e,500),i=await r.boundingBox({timeout:ne});if(i===null){e.warn({elementDisplayString:o},"Attempting to click on element with no bounding box, not performing Chakra redirection");return}if(i.width>5||i.height>5||n!=="input")return;if(t)try{let c=r.page().locator(`label[for=${JSON.stringify(t)}]`);return await c.waitFor({state:"visible",timeout:ne}),{locator:c,relativePoint:void 0}}catch{}let a=await r.evaluate(c=>{let l=window,u=c.parentElement;if(!u)return{type:"error",error:"Input click target has no parent for redirection"};let d=c.getBoundingClientRect(),m=u.getBoundingClientRect();if(m.width===0||m.height===0)return{type:"error",error:"Parent element has no width or height"};let p={x:Math.min(Math.max(1,d.left-m.left),m.width-1),y:Math.min(Math.max(1,d.top-m.top),m.height-1)},g=l._MOMENTIC_FEATURE_FLAGS?.[uu],h=c.getAttribute(mn),f=!g&&h?Rr(h):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:p,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:ne});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:ne}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var tR=["date","datetime-local","month","time","week"],eR={date:/^\d{4}-\d{2}-\d{2}$/,"datetime-local":/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,month:/^\d{4}-\d{2}$/,time:/^\d{2}:\d{2}$/,week:/^\d{4}-W\d{2}$/};async function rR(r){try{await z($B(r),{milliseconds:re})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function $B({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await st({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:ne,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!eR[i])return;eR[i].test(e)&&n.warn(`Detected datetime input (${e}) in normalized format - this may fail to fill correctly as it is not how the user would input the value`),t.clearContent=!1,n.info("Transforming datetime input to use sequential key presses")}import{z as $t}from"zod";var nR=$t.object({doubleClick:$t.boolean().optional(),rightClick:$t.boolean().optional(),force:$t.boolean().optional(),waitForDownload:$t.boolean().optional(),delayMs:$t.number().optional(),downloadTimeoutMs:$t.number().optional(),relativePosition:$t.object({x:$t.number(),y:$t.number()}).optional()}),uve=$t.object({repeat:$t.number().optional(),convertMeta:$t.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:$t.number().optional()});async function Su({locator:r,callbacks:e,logger:t,timeoutMs:n=ne}){try{await Hg(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let p=window.getComputedStyle(d,null).getPropertyValue("display");if(p==="none"||p==="contents")return!1;let g=d.getBoundingClientRect();return!(!g.height||!g.width)},a.removeHighlightTimers=a.removeHighlightTimers||[],a.removeHighlightFunctions=a.removeHighlightFunctions||{};let s=0;for(;!a.momenticIsEligible(i)&&s<3;){if(!i.parentElement)throw new Error("No eligible non-empty parent found for highlighting");i=i.parentElement,s++}let c=i.style.getPropertyValue("outline"),l=i.style.getPropertyPriority("outline");i.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let u=`momentic${Math.floor(Math.random()*1e7)}`;a[u]=()=>{i.style.removeProperty("outline"),i.style.setProperty("outline",c,l),i.getAttribute("style")||i.removeAttribute("style")},a.removeHighlightTimers.push(setTimeout(()=>{a[u](),a.removeHighlightFunctions?.[u]&&delete a.removeHighlightFunctions[u]},5e3)),a.removeHighlightFunctions[u]=a[u]},void 0,{timeout:n});return await z(o,{milliseconds:n}),!0}catch(o){return t.debug({err:o},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1}}async function Hg(r,e=ne){let t=await r.state.getRoot();await st({root:t,fn:()=>{let o=window,i=o.removeHighlightTimers||[];for(;i.length;){let a=i.pop();clearTimeout(a)}Object.values(o.removeHighlightFunctions??{}).forEach(a=>{a()})},timeout:e,arg:void 0,waitForPageLoad:r.waitForPageLoad,codePath:"removing element highlights"})}async function Gg(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Mo({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>iR({...r,targetingResult:t,useVisualClick:e})})}async function XB(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await JB(r,e)}catch(n){throw e.redirectionAttempts===0?(e.logger.error({redirectionAttemptError:n,originalError:r},"Error handling click error, rethrowing original error"),r):n}}async function JB(r,e){let{logger:t,redirectionAttempts:n=0}=e,o=e.targetingResult.locator;if(r.message.includes("label")&&r.message.includes("for=")&&r.message.includes("intercepts pointer events")){let i=await o.getAttribute("id",{timeout:ne});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:ne}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),iR({...e,targetingResult:{locator:a},redirectionAttempts:n+1})}else throw t.error({err:r},"Click error does not match any known recoverable patterns, rethrowing"),r}async function QB(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=nR.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await tz({targetingResult:t,position:n,options:o,logger:e,isAndroid:r.isAndroid});return e.info({position:n,options:i.success?i.data:void 0,clickLocation:{clickX:s,clickY:c,reason:l},duration:Date.now()-a},"Visual click"),{x:s,y:c}}async function ZB(r){let{actionSource:e,targetingResult:t,options:n,logger:o}=r,i=r.targetingResult.locator,a=n?.relativePosition??r.position;if(e==="click"&&!a){let l=await ZC({locator:i,logger:o});l&&(i=l.locator,a=l.relativePoint??a)}let s=n?.force||t.hints?.force||!1;s&&!a&&t.hints?.relativeXYToLocator&&(a=t.hints.relativeXYToLocator);let c=i.toString();o.info({locator:c},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:re,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:re,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(nz(u))o.warn({err:u},"Click action timed out while waiting for navigation after completion, continuing...");else return o.error({err:u},"Error clicking on locator, attempting to recover..."),XB(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function iR(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??yg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof YB.TimeoutError?new x("ActionFailureError",`Download did not complete in ${u}ms`):new x("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Su({locator:a.locator,callbacks:n,logger:t,timeoutMs:ne})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await QB(r):l=(await ZB(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new x("InternalWebAgentError","Cannot wait for download without a callback to create an isolated folder");t.info("Waiting for download to start and complete");let u=await z(s,{milliseconds:e.downloadTimeoutMs??yg});if(u instanceof Error)throw u;return{downloadedFile:await rz(u,o.createIsolatedFolder,t),coordinates:c,locatorSource:l}}else throw new Error("No download promise or error but the step requested to wait for a download");return{coordinates:c,locatorSource:l}}async function ez(r,e){let t=await r.locator.boundingBox({timeout:re});if(!t){let i=await xr(r.locator,e,500);throw new x("ActionFailureError",`${Fd}${i?`: ${i}`:""}`)}if(r.hints?.relativeXYToLocator){let i=t.x+r.hints.relativeXYToLocator.x,a=t.y+r.hints.relativeXYToLocator.y;return[{x:i,y:a},"targeting hint"]}let n=t.x+t.width/2,o=t.y+t.height/2;return[{x:n,y:o},"halfway point"]}async function tz({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:re}),d=r.relativePosition.x,m=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(m=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+m,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:re});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await ez(e,n);o=u.x,i=u.y,a=d}let s=e.locator.page(),c=r?.rightClick?"right":"left",l=r?.delayMs??25;return r?.doubleClick?await s.mouse.dblclick(o,i,{button:c,delay:l}):await s.mouse.click(o,i,{button:c,delay:l}),{clickX:o,clickY:i,reason:a}}async function rz(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=Mg(r.suggestedFilename()),i=e();await r.saveAs(KB(i,o)),oR(n,{force:!0}),setTimeout(()=>{oR(i,{recursive:!0,force:!0})},5*60*1e3);let a=PC(qB(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function nz(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as oz}from"os";var iz={goToNextWord:{win32:"Control+ArrowRight",darwin:"Alt+ArrowRight",linux:"Control+ArrowRight"},goToPreviousWord:{win32:"Control+ArrowLeft",darwin:"Alt+ArrowLeft",linux:"Control+ArrowLeft"},selectNextWord:{win32:"Control+Shift+ArrowRight",darwin:"Alt+Shift+ArrowRight",linux:"Control+Shift+ArrowRight"},selectPreviousWord:{win32:"Control+Shift+ArrowLeft",darwin:"Alt+Shift+ArrowLeft",linux:"Control+Shift+ArrowLeft"},selectToStartOfLine:{win32:"Shift+Home",darwin:"Meta+Shift+LeftArrow",linux:"Shift+Home"},selectToEndOfLine:{win32:"Shift+End",darwin:"Meta+Shift+RightArrow",linux:"Shift+End"},deleteNextWord:{win32:"Control+Delete",darwin:"Alt+Fn+Delete",linux:"Control+Delete"},deletePreviousWord:{win32:"Control+Backspace",darwin:"Alt+Delete",linux:"Control+Backspace"}};function az(){let r=oz();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function aR(r){return JSON.stringify(r.split("+").sort())}function yu(r,e){let t=az(),n=aR(r);for(let o of Object.values(iz))if(Object.values(o).some(i=>aR(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function Vg({frame:r,page:e,deltaX:t,directionX:n,deltaY:o,directionY:i,signal:a,callbacks:s,logger:c}){if(!t&&!o)return;let l=n==="left"?-1:1,u=i==="up"?-1:1;if(r)await st({root:r,fn:([d,m,p,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*p,window.scrollY+(m??window.innerHeight)*g),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"scrolling page"});else{let d=e.viewportSize()||Rn,m=await st({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing page height"}),[p,g,h]=await st({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let E=f.getBoundingClientRect();return[f.scrollTop,E.x,E.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Ee,codePath:"computing active element position"});await e.mouse.wheel((t??d.width)*l,(o??d.height)*u);try{let f=Date.now();for(;Date.now()-f<Ee;){a?.throwIfAborted();let E=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:ne}),[b,C,R]=await z(e.evaluate(()=>{let v=document.activeElement;if(!v)return[void 0,void 0,void 0];let M=v.getBoundingClientRect();return[v.scrollTop,M.x,M.y]}),{milliseconds:ne});if(E===m&&b===p&&C===g&&R===h)break;m=E,p=b,g=C,h=R,await j(dt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Wg(r,e){let t,n;for(let o=0;o<4;o++)try{return t=r.pages(),await Promise.all(t.map(async i=>{let a="";try{a=e?.getTitles?await i.title():""}catch{a="Unknown page"}return{title:a,url:i.url()}}))}catch(i){n=i,await j(dt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function sR(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,delayMs:s}=r;if(a){await sz(e,t,n,o,s,i);return}await e.mouse.move(i.x,i.y),await e.mouse.down(),await e.mouse.move(t+i.x,n+i.y,{steps:o}),await j(s??Ro),await e.mouse.up()}async function lR(r,e,t,n){await r.mouse.move(e.x,e.y,{steps:3}),await r.mouse.down(),await r.mouse.move(t.x,t.y,{steps:3}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,du):500),await r.mouse.up()}async function sz(r,e,t,n,o,i){let a=Math.max(1,n??1),s=i.x,c=i.y,l=i.x+e,u=i.y+t;await r.evaluate(async({startX:d,startY:m,endX:p,endY:g,stepCount:h,delayMs:f})=>{let E=document.elementFromPoint(d,m)??document.body??document.documentElement,C=window._momenticMobileUtilities.dispatchTouch;C(E,"touchstart",d,m);for(let R=1;R<=h;R+=1){let v=d+(p-d)*R/h,M=m+(g-m)*R/h;C(E,"touchmove",v,M),await new Promise(A=>setTimeout(A,Math.floor((f??500)/h)))}C(E,"touchend",p,g)},{startX:s,startY:c,endX:l,endY:u,stepCount:a,delayMs:o})}import{randomUUID as hz}from"crypto";import{cloneDeep as qg}from"lodash-es";function Wn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as lz}from"crypto";var cz="v1";function jg(r,e){if(r.tagName.toLowerCase()==="svg"&&!dz(r))try{let t=cR(r,e),n=uz(JSON.stringify(t));return{version:cz,json:t,hash:n}}catch{return}}function uz(r){return lz("md5").update(r).digest("hex")}function cR(r,e){let t=r.tagName.toLowerCase(),n=mz(r);if(t==="image"&&n["xlink:href"])throw new Error("Image tags within SVGs are not supported");let o={type:t,props:n,children:[]};for(let i of r.childrenBackendIds){let a=e.backendIdToNode[i];if(a&&a.nodeType===1){let s=cR(a,e);s&&o.children.push(s)}}return o}function dz(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function mz(r){let e={},t=r.attributes;for(let n of Object.keys(t))hr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var _o={r:147,g:196,b:125,a:.55},dR={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:_o,paddingColor:_o,borderColor:_o,marginColor:_o,eventTargetColor:_o,shapeColor:_o,shapeMarginColor:_o,showInfo:!0,showAccessibilityInfo:!0};function mR({snapshot:r,devicePixelRatio:e,computedStylesToFetch:t,logger:n}){let o=r.strings,i=r.documents,a={},s={},c={roots:[],backendIdToNode:a,frameIndexToIframeNode:s};return i.forEach((l,u)=>{let d=pz({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function pz({allDocuments:r,stringConstants:e,computedStylesToFetch:t,devicePixelRatio:n,frameIndex:o,frameIndexToIframeNode:i,backendIdToNode:a,logger:s}){let c=r[o],l=c.layout,u={};l.nodeIndex.forEach((A,I)=>{u[A]=I});let d=l.styles,m=l.bounds??[],p=c.nodes,g=p.contentDocumentIndex??{index:[],value:[]},h=p.backendNodeId??[],f=p.attributes??[],E=p.parentIndex??[],b=p.nodeName??[],C=p.nodeType??[],R=p.pseudoType??{index:[],value:[]},v=p.inputChecked??{index:[]},M=e[c.frameId];for(let A=0;A<h.length;A++){let I=h[A],k=C[A],W=f[A]??[],oe=E[A]!==void 0&&E[A]>=0?E[A]:void 0,Te=oe!==void 0?h[oe]:void 0,At=Te!==void 0?a[Te]:void 0,G=R.index.indexOf(A),$=G!==-1?e[R.value[G]]:void 0,he=u[A],se;he?se=m[he]??[]:se=[];let Ce=b[A]!==void 0?e[b[A]]?.toLowerCase():void 0;if(!Ce){s.warn({backendNodeId:I,frameId:M,frameIndex:o,nodeBounds:se},"DOM node has no tag name");continue}let Me={backendNodeId:I,psuedoType:$,nodeType:k,frameIndex:o,parentFrameId:M,ownedFrameId:void 0,bounds:{x:se[0]??null,y:se[1]??null,width:se[2]??null,height:se[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:Te??null,tagName:Ce,parent:At??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};At&&At.childrenBackendIds.push(I);let Jt=g.index.indexOf(A);if(Jt!==-1){let _e=g.value[Jt];i[_e]=Me;let $e=r[_e]?.frameId;Me.ownedFrameId=$e!==void 0?e[$e]:void 0}for(let _e of Object.keys(Me.bounds)){let $e=_e;Me.bounds[$e]!==null&&(Me.bounds[$e]/=n)}let qt=he!==void 0?d[he]??[]:[];for(let _e=0;_e<qt.length&&!(_e>=t.length);_e++){let $e=qt[_e];if($e===void 0||isNaN($e))continue;let lt=e[$e];if(lt===void 0)continue;let Pt=t[_e];Me.computedStyles[Pt]=lt}for(let _e=0;_e<W.length;_e+=2){let $e=W[_e],lt=W[_e+1];if(!$e||!lt)continue;let Pt=e[$e],Gt=e[lt];!Pt||!Gt||(Me.attributes[Pt]=Gt)}v.index.includes(A)&&(Me.attributes.checked="true"),a[Me.backendNodeId]=Me}return a[h[0]]}function $g(r,e){if(r.mPathSelector)return r.mPathSelector;let t=r.parent,n;if(!t)n=r.tagName;else if(r.tagName==="body")n="body";else{let i=t.childrenBackendIds.filter(c=>e.backendIdToNode[c]?.nodeType===1&&!e.backendIdToNode[c]?.psuedoType).indexOf(r.backendNodeId),a=` > ${r.tagName}:nth-child(${i+1})`;n=`${$g(t,e)}${a}`}return r.mPathSelector=n,n}function uR(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var gz=["html","#document","#document-fragment"];function pR({node:r,domGraph:e}){let t=[],n=r,o=uR(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=uR(o,e),!o&&n.frameIndex!==0)throw new Error("No parent node but not in main frame")},a=0;for(;o&&a<1e6;){if(a++,gz.includes(n.tagName)){i();continue}if(n.tagName==="body")t.push("body");else{let c=!1,l=1;for(let u=0;u<o.childrenBackendIds.length;u++){let d=o.childrenBackendIds[u],m=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else m?.nodeType===1&&!m.psuedoType&&l++}if(!c)throw new Error(`Could not find child (${n.tagName}) in parent's children list (${o.tagName})`)}i()}return t.reverse()}function gR(r,e){let t=r.locator("html"),n=[];for(let o=0;o<e.length;o++){let i=e[o];if(n.push(i),i.startsWith("iframe")){let a=n.join(" > ");n=[],o<e.length-1?t=t.frameLocator(a):t=t.locator(a)}}if(n.length&&(t=t.locator(n.join(" > "))),"owner"in t)throw new Error("Final locator from mpath is a frame locator");return t}async function hR(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Ee}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Ee})).attributes,i=Wn(o,mn);if(!i)throw new Error(`Could not find attribute ${mn} for object ${e}`);return i}var fz=["focusable","keyshortcuts","controls","live","relevant","orientation"],Sz=["selected","readonly","modal","required","invalid"],yz=["id","name","role","content"],fR=["absolute","fixed","sticky"],bz=["i","label"],Ez=["path"],Tz=["statictext","textbox","checkbox","combobox","iframe","rootwebarea","table","caption","columnheader","rowheader","gridcell","grid","row","rowgroup","cell","image","graphics-symbol","graphics-document","graphics-object","svgroot","button","link","list","listitem","tablist","tabpanel","tab","searchbox","menu","menubar","form","dialog","alertdialog","banner","navigation","main","menuitem","menuitemcheckbox","menuitemradio","option","radio","progressbar","switch","tree","treeitem","separator","LabelText"],bR=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],ER=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],vz=["menulistpopup","statictext","inlinetextbox"],Az=80,SR=100,TR=50,Xg=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],wz=["cite"],Cz={LabelText:["label"],listitem:["li"],image:["img","svg"],link:["a"],RootWebArea:["#document"],paragraph:["p"],LineBreak:["br"],separator:["hr"],"graphics-symbol":["svg","rect"],gridcell:["td","th"],SvgRoot:["svg"],navigation:["nav"],cell:["td","th"],row:["tr"],list:["ul"],heading:["h1","h2","h3","h4","h5","h6"]},Rz={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},yR={indentLevel:0},Kg=class r{id;role;name;nameSources;tagName;content;properties;internalProperties;ignoredReasons;dataMomenticId;importantProperties;pathFromRoot;mPathSelector;parent;children;parentFrame;domNode;backendNodeId;ignoredByCDP;flagNotActionableNodes;constructor(e){if(this.id=e.id,this.role=e.role,this.name=e.name,this.nameSources=e.nameSources,this.content=e.content,this.properties={},this.pathFromRoot=e.pathFromRoot,this.children=e.children,this.backendNodeId=e.backendNodeID,this.ignoredByCDP=e.ignoredByCDP,this.internalProperties=e.internalProperties??{},this.parentFrame=e.parentFrame,this.ignoredReasons=e.ignoredReasons,this.importantProperties=e.importantProperties,this.flagNotActionableNodes=e.flagNotActionableNodes,e.properties&&e.properties.forEach(t=>{t.name==="keyshortcuts"?this.dataMomenticId=parseInt(t.value.value):this.properties[t.name]=t.value.value}),e.domNode){this.domNode=e.domNode,this.tagName=e.domNode.tagName||void 0;let t=e.domNode.attributes.id;this.name=this.name||e.domNode.attributes.name||(t&&t.length<TR?t:""),this.role=this.role||(e.domNode.attributes.role??""),Pz(this.properties,e.domNode,e.importantProperties)}Oz(this)}getSerializedFormWithContext(){return this.serialize({noId:!0,maxLevel:1,neighbors:1})}getNodeOnlySerializedForm(){return this.serialize({noId:!0,noChildren:!0,noContent:!0})}getLogForm(){return JSON.stringify({id:this.id,name:this.name??"",role:this.role??"",backendNodeId:this.backendNodeId})}isInteresting(e){if(this.domNode&&Ez.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>ER.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>RR(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>xR(o,e))||e.styles?.some(o=>{let i=o.split(":");if(i.length!==2)return!1;let a=i[0]?.trim(),s=i[1]?.trim();if(a===void 0||s===void 0)return!1;let c=this.domNode?.computedStyles[a];return c!==void 0&&(c===s||s==="*")}))return!0}if(this.domNode&&bz.includes(this.domNode.tagName)||Tz.includes(this.role.toLowerCase())||this.domNode?.computedStyles["background-image"]&&this.domNode?.computedStyles["background-image"]!=="none"&&this.children.length===0||this.role.toLowerCase()==="inlinetextbox"&&this.tagName||!this.properties.hidden&&(this.properties.focusable||this.properties.settable)||hr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>CR(n))?!0:this.children.every(n=>n.role==="StaticText")&&this.internalProperties?.inCodeMirrorEditor?!1:this.children.some(n=>n.role==="StaticText")||this.children.length>1&&this.children.some(n=>n.tagName==="input")||this.children.some(n=>n.isIneligible())?!0:this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height)?!1:!!this.name.trim()||!!this.content||Object.keys(this.properties).some(n=>n.startsWith("data"))}shouldSerializeBounds(){let e=this.domNode?.computedStyles.position;return!!(e&&(e==="absolute"||e==="fixed"||e==="sticky"))}isIneligible(){return!!(this.domNode?.computedStyles.display==="contents"||this.domNode&&(this.domNode.bounds.x===null||this.domNode.bounds.y===null||!this.domNode.bounds.width||!this.domNode.bounds.height))}serialize(e=yR){let t=Object.assign({},yR,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=qg(this.properties),u=" ".repeat(n),d=this.role||"",m=this.tagName??"unknown",p=this.name;d==="heading"&&p==="heading"&&(p=""),this.nameSources?.find(v=>!v.superseded&&v.type==="contents")&&this.children.length>0&&(p="");let h=this.nameSources?.find(v=>!v.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let v=h.attributeValue?.relatedNodes??[];v.length===1&&v[0].text&&v[0].text===p&&(p="")}let f=Xg.includes(this.role)||wz.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${p}
4329
+ `;let E=`${u}<${m}`;!a&&!f&&(E+=` id="${this.id}"`);let b=s??!1;if((l.multiline||l.contenteditable)&&this.children.length>0&&(b=!0),d&&d!=="generic"&&d!==m&&!(Cz[d]??[]).includes(m)&&(E+=` role=${JSON.stringify(d)}`),p&&(E+=` name=${JSON.stringify(p)}`),this.content&&!b&&(E+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isIneligible()&&(E+=` ${hr.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let v=this.domNode.bounds,M=Math.round(v.x??0),A=Math.round(v.y??0),I=Math.round((v.x??0)+(v.width??0)),k=Math.round((v.y??0)+(v.height??0));E+=` bounds=[${M} ${A} ${I} ${k}]`}let C=Date.now();if(Object.keys(l).length>0&&!i){if(Date.now()-C>1e3)throw new Error(`Serialization for the HTML element with tag ${m} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([v,M])=>{if(!fz.includes(v)){{if(Sz.includes(v)&&(!M||M==="false"))return;if(v==="value"&&b&&(l.type==="text"||this.role==="textbox"))return;if(v==="level"&&`${M}`=="1")return;if(v==="url"&&l.src&&m==="img")return;if(v==="url"&&l.href&&m==="a")return;if(v==="editable"&&M==="plaintext")return;if(v==="type"&&M===m)return;if(c&&!Rz[v])return}typeof M=="string"?E+=` ${v}="${ft(M,SR,!0)}"`:typeof M=="boolean"?M?E+=` ${v}`:E+=` ${v}={false}`:typeof M<"u"&&(E+=` ${v}={${ft(JSON.stringify(M),SR,!0)}}`)}})}if(m==="::before"||m==="::after"){let v="";for(let M of this.children)v+=M.serialize({...e,indentLevel:n,neighbors:0});return v}let R=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||R)E+=` />
4330
+ `;else{let v="";for(let A of this.children)v+=A.serialize({...e,indentLevel:n+2,neighbors:0});let M=v.trim();M.length<=Az&&!M.includes(`
4331
4331
  `)?E+=`>${M}</${m}>
4332
4332
  `:E+=`>
4333
4333
  ${v}${u}</${m}>
4334
4334
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let v=this.parent.children.findIndex(I=>I.id===this.id),M=v>0?this.parent.children[v-1]?.serialize({...e,neighbors:0}):"",A=v<this.parent.children.length-1?this.parent.children[v+1]?.serialize({...e,neighbors:0}):"";return`${M||""}
4335
4335
  ${E}
4336
- ${A||""}`}return E}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:jg(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=jg(this.properties),e}},qg=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let m=a(d);m&&(u.push(m),m.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(t);return new r(s,n,o,i)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let m of l){let g=n(m,s||u);g&&(d.push(g),g.parent=c,u=!0)}if(c.children=d,s||u)return c;if(Kg.includes(i.role)&&a)return c}let o=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}pruneToSerializedCharLimit(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n=c=>c.role==="StaticText"||c.role==="ListMarker",o=new WeakMap,i=(c,l)=>{if(o.has(c))return o.get(c);let u=c.serialize({indentLevel:l,noChildren:!0});return o.set(c,u),u},a=(c,l,u)=>{let d=c.shallowClone();d.children=[];let m=i(c,l).length;if(u<=m)return{clone:d,used:m};if(n(c)||c.children.length===0)return{clone:d,used:m};let g=m,p=u-g;for(let h of c.children){let f=l+2,E=i(h,f).length;if(p<E)break;let{clone:b,used:w}=a(h,f,p);if(w>p)break;d.children.push(b),b.parent=d,g+=w,p-=w}return{clone:d,used:g}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function Ez(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function Tz(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?(Wl({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?(Wl({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function fR({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:s,showZeroOpacityElements:c,filterByViewport:l,viewportDetails:u,useMPaths:d,importantProperties:m,allowedA11yIgnoreReasonsOverride:g,cdpClient:p,logger:h,callId:f}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let E=($,ge={})=>{},b=r.backendDOMNodeId,w=hz.includes(r.role?.value?.toLowerCase()??"");if(!w&&b===void 0)return E("Filtering out node since it doesn't exist in the DOM"),[];let R=b?i.backendIdToNode[b]:void 0;if(!w&&!R)try{let $=await z(p.send({method:"DOM.describeNode",params:{backendNodeId:b}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if($&&$.node.nodeName.toLowerCase()==="slot"&&$.node.distributedNodes?.length)h.debug({redirectedDomNode:R,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:$},"Redirecting node to assigned slot");else return E("Filtering out node since it doesn't exist in the DOM",{cdpResult:$}),[]}catch($){return E("Filtering out node since it doesn't exist in the DOM",{err:$}),[]}if(R&&e&&l&&u&&r.backendDOMNodeId&&!Tz(R,u,h,f))return R.momenticIgnored=!0,[];if(R&&R.computedStyles.display==="none")return R.momenticIgnored=!0,[];if(R&&R.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&R.tagName.toLowerCase()!=="input")return R.momenticIgnored=!0,[];if(c===!1)return R.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",M=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new $g({domNode:R,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:M,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter($=>(g??pR).includes($.name)||gR.includes($.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+Ez(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:m,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),I=n,k=a[t],j=t;if(R?.tagName.toLowerCase()==="iframe"&&R.ownedFrameId){let $=n.childFrames.find(Ce=>Ce.frameId===R.ownedFrameId),ge=o[$?.frameId??""]?.root,ae=a[$?.frameId??""];if($&&ge&&ae){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Ce=ge;r.childIds=Ce.childIds,I=$,k=ae,j=$.frameId}}let ne=R?.childrenBackendIds?.length??0,Te=(r.childIds??[]).filter($=>!!k.get(parseInt($))).length;if(ne>Te){let $=r.childIds?.map(ae=>k.get(parseInt(ae))).filter(Boolean).map(ae=>ae?.backendDOMNodeId).filter(ae=>ae!==void 0)??[],ge=0;for(let ae of R?.childrenBackendIds??[]){if($.includes(ae)){ge=(r.childIds?.findIndex(_e=>k.get(parseInt(_e))?.backendDOMNodeId===ae)??0)+1;continue}let Ce=i.backendIdToNode[ae];if(!Ce||Ce?.tagName.toLowerCase()!=="svg")continue;let Me=Math.floor(-1*Math.random()*1e7),Jt={nodeId:Me.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:ae,frameId:j,role:{type:"string",value:"graphics-symbol"}};k.set(Me,Jt),r.childIds||(r.childIds=[]),r.childIds.splice(ge,0,Me.toString()),ge++}}if(r.childIds?.length===1&&R){let $=k.get(parseInt(r.childIds[0])),ge=$?.role?.value,ae=R.childrenBackendIds;if($&&ge==="StaticText"&&ae.length===1){let Ce=i.backendIdToNode[ae[0]];if(Ce?.tagName?.toLowerCase()==="span"){let Me=Math.floor(-1*Math.random()*1e7).toString(),Jt={nodeId:Me,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ce.backendNodeId,frameId:j,childIds:[$.nodeId]};$.parentId=Me,k.set(parseInt(Me),Jt),r.childIds=[Me]}}}for(let $ of r.childIds??[]){if(!$)continue;let ge=k.get(parseInt($));if(!ge)continue;let ae=await fR({node:ge,parent:A,domGraph:i,axGraph:o,frameId:j,frameContext:I,inputNodeMap:a,cdpClient:p,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:m,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});ae.length&&(A.children=A.children.concat(ae))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let $=A.name,ge=A.children[0]?.name;($===ge||!ge)&&(A.children=[])}let At=[];for(let $=A.children.length-1;$>=0;$--){let ge=A.children[$];if(ge.role!=="StaticText"){At.push(ge);continue}if($===0||A.children[$-1].role!=="StaticText"){At.push(ge);continue}A.children[$-1].name+=ge.name}if(A.children=At.reverse(),!A.isInteresting(m)&&r.parentId)return R&&(R.momenticIgnored=!0),A.children;for(let $ of A.children)$.parent=A;return wz(A),R&&d&&Wg(R,i),[A]}function SR({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:c,startId:l=1}){r.id=l,l+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:Kg.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(s[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let m=Vg(d,i),g=m?c[m.hash]:void 0,p=g?g.description:void 0;g&&(r.properties["data-momentic-description"]=p)}for(let m of r.children)l=SR({node:m,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function yR({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:m,allowedA11yIgnoreReasonsOverride:g}){let p=t??"root",h=r[p]?.root;if(!h)throw new Error("A11y tree has no root");let f=lz(),E=A=>{let I=A.allNodes.filter(j=>!j.ignoredReasons?.find(Te=>(g??pR).includes(Te.name))),k=new Map;return I.forEach(j=>{k.set(parseInt(j.nodeId),j)}),k},b={};Object.entries(r).forEach(([A,I])=>{b[A]=E(I)});let w=await fR({node:h,domGraph:e,parent:null,inputNodeMap:b,axGraph:r,frameId:p,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:g});if(w.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(w)}`);if(w.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let R={},v={},M={};return SR({node:w[0],a11yIdNodeMap:R,dataMomenticIdMap:v,selectorToNodeMap:M,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:m}),new qg(w[0],R,v,M)}function vz(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<hR&&!hr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(bR(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=Number(e);if(!Number.isNaN(o))return o}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function Az(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||dz.includes(a);if((hr.relevantElementAttributes.includes(a)||ER(a,t))&&!c){let u=vz(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&uR.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of uR)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of t?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],m=`${c}: ${d}`;o.includes(m)||o.push(m)}}o.length>0&&(r.style=o.join("; "))}function wz(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(ft(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let g=u.children.filter(p=>p.tagName==="th");if(g.length){if(i=g.map(p=>ft(p.name,100,!1)),i.length===g.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(g=>g.tagName==="td"||g.tagName==="th"),m=d.length===i?.length;d.forEach((g,p)=>{g.tagName!=="th"&&(g.properties["col-index"]||(g.properties["col-index"]=p+1),m&&(g.properties.col||(g.properties.col=i[p])))})}}}function Cz(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function bR(r,e){if(e&&TR(r,e))return!0;if(hr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(hr.alwaysInterestingClassNames.includes(r))return!0;for(let t of hr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function ER(r,e){if(e?.attributes?.includes(r))return!0;for(let t of e?.attributes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}function TR(r,e){if(e?.classes?.includes(r))return!0;for(let t of e?.classes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}var Su=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await z(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new x("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await W(dt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await z(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new x("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await z(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new x("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await z(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await z(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new x("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await z(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await z(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var Ui="<empty>";function Rz(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function wR(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Rz(r.url)}async function xz(r,e){let t=await r.send({timeout:ee,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:ee,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:ee,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Fi({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:Di,method:"Page.getFrameTree",params:{}}),r.send({timeout:Di,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,m)=>{if(wR(d.frame))return null;try{return await CR({cdpClient:r,rawFrameTree:d,indices:[m],parent:n,warnings:o,logger:t})}catch(g){return o.push(`Failed to get child frame: ${g}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function CR({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await xz(r,a),c=s.attributes??[],l=null,u=[];for(let p of["src","name","id","title","srcdoc","sandbox"]){let h=Wn(c,p);h&&(u.push(`${p}=${JSON.stringify(h)}`),p==="src"&&(l=h))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},g=(e.childFrames??[]).map(async(p,h)=>{if(wR(p.frame))return null;try{return await CR({cdpClient:r,rawFrameTree:p,indices:[...t,h],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(g)).filter(p=>p!==null),d}async function Mz(r){try{return await r.owner().count()===1}catch{return!1}}async function _z(r){try{return await r.count()===1}catch{return!1}}async function Kr(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let l of t){let u=!1;for(let d of[...l.locationData.attributeSelectors,Ui]){let m=o.frameLocator(d===Ui?"iframe":`iframe[${d}]`);if(await Mz(m)){u=!0,o=m,i.push(d);break}}if(!u)throw new x("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,Ui]){let u=o.locator(l===Ui?"iframe":`iframe[${l}]`);if(await _z(u)){a=u,i.push(l);break}}if(!a)throw new x("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:te}),c=await s.asElement().contentFrame();if(!c)throw new x("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function vR(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function RR({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===Ui?s=s.length===1?s[0].childFrames:[]:s=s.filter(m=>m.locationData.attributeSelectors.includes(d)).map(m=>m.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===Ui?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Kr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),c=vR(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Kr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),c=vR(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Kr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let a=o;for(let s=0;s<t.indices.length-1;s++)a=a[t.indices[s]]?.childFrames??[];if(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Kr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Lr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function yu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Yg(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function xR(r){let e=Yg(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function MR(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function _R({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await Pz({frameElementHandle:n,logger:e,signal:t})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function Pz({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await Ss({promiseGenerator:async()=>r.evaluate(async i=>{let a=i.scrollTop;i.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(c=>setTimeout(c,250));let s=Date.now();for(;Date.now()-s<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(l=>setTimeout(l,250))}}),timeoutMs:Ee,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}import{create as Iz,windowedFiniteBatchScheduler as Oz}from"@yornaath/batshit";import{reduce as Lz}from"lodash-es";var Nz=100,Dz=2e3;function PR(r){return Iz({fetcher:async t=>{r(Lz(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:Oz({windowMs:Dz,maxBatchSize:Nz})})}async function IR({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(p=>p.url());i.debug({frameUrl:l,...r},"Passive click event captured on element");let m,g;if(l)try{let p=await n.frameElement();m=await z(p?.boundingBox(),{milliseconds:ee})??void 0;let h=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)g={type:"url",url:`/${h.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(h)}`)}catch(p){i.warn({err:p},"Failed to construct iframe details for recorded action, using hardcoded URL only"),g={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:g,frameBoundingBox:m})}catch(p){i.error({err:p},"Failed to transform passive click action")}})()}import{randomUUID as Yr}from"crypto";import kz from"js-beautify";var Uz=["Dead"],bu=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Yr(),type:"PRESET_ACTION",command:en(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let h=en(i);a={id:Yr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let h=en(i);a={id:Yr(),type:"PRESET_ACTION",command:{...h,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let h=en(i);a={id:Yr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:be(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=kz.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=fC(d,"data-momentic-interacted",4e4)}catch{}let m;try{m=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...be(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),m=s}let g=this.recordedSteps.get(u)?.step??a,p=g?.command;p&&"target"in p&&p.target?(p.target={type:"description",elementDescriptor:m},this.callbacks.onStepRecorded({...g,command:p},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:n}=e;if(Uz.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=en("TYPE");i={id:Yr(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=en("PRESS");i={id:Yr(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,m=i.command.value;i={id:Yr(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${m}`:`${d}${m}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:Yr(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=en(l);u.deltaY=Math.abs(i);let d={id:Yr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=en(l);u.deltaX=Math.abs(i);let d={id:Yr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};import{z as Xg}from"zod";var ZAe=Xg.object({type:Xg.literal("url"),url:Xg.string()});var Eu=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let m of this.userControlledBrowserSettings.importantStyles){let g=m.split(":");if(g.length!==2){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}let p=g[0]?.trim(),h=g[1]?.trim();if(p===void 0||h===void 0){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(p)||this.computedStylesToFetch.push(p)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),n=Yg(e),{frame:o,mPathSelectorTokens:i}=await Kr(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await Fi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await RR({page:t,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(yu(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:yu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await _R({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Fi({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[z(n.evaluate(e,t),{milliseconds:Ee})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Kr(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Ee})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await Fi({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await fr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new x("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await fr({fn:()=>Fi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await fr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let l=await fr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await fr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await fr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(m=>m>750)&&n.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:On,filterByViewport:!1,flagNotActionableNodes:!1}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=sR({node:o,domGraph:this.domGraph});return lR(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:Ee});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await cR(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(Cr(o))}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await Fi({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof x&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await W(dt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:yu(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=Wn(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Kr(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Kr(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new x("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await yR({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Kr(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await at({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Ee,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(Wn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Wn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:ee,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:ee,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:ee,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(g){i.warn({err:g},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let c,l;for(let g=0;g<3;g++)try{l=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(p){c=p,i.warn({err:p},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),m=[];for(;d.length>0;){let g=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:g,warnings:s});if(!h)continue}catch(h){if(h.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${g.frameId} with url ${g.url}, allowing it to be fetched: ${h}`)}d.push(...g.childFrames);let p=async()=>{try{let h=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:g.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${g.frameId}`,logObject:o,logger:i});u[g.frameId]=h}catch(h){i.warn({err:h,url:g.url,src:g.src},`Error getting raw a11y tree for child frame ${g.frameId}, continuing...`)}};m.push(p())}return await Promise.all(m),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Ee}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:t,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:ee}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await W(dt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new x("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return aR({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=xR(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};function Jg(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var As=class r{static USER_AGENT=uu;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:m,onVideoPageChange:g}){xE(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=m,this.onVideoPageChange=g}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let t=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){t();return}this.abortSignal.addEventListener("abort",t),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",t)}}async initialize({grantPermissions:e,runInitScripts:t,timingRecorder:n}){if(this.contextInitialized)return;let o={[lu]:this.userBrowserSettings.visualActions},i=[];if(this.userControlledBrowserSettings.extraHeaders&&i.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e){let u=["clipboard-read","clipboard-write","microphone","camera","geolocation"];Ur||u.push("local-network-access"),i.push(this.context.grantPermissions(u))}i.push(this.context.addInitScript({content:`${fg.htmlUtilsLibJs}
4337
- //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Fg(o,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let a=u=>this.handleNewPageEvent(u);this.context.on("page",a),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",a)});let s=!1;if(t){let u=async()=>{let d=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${fg.htmlUtilsLibJs}
4338
- //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Fg(o,this.userBrowserSettings.disableFullStory)})])}catch(m){if(m instanceof Error&&m.message.includes("Content Security Policy"))this.logger.warn({err:m},"Content Security Policy error from adding Momentic scripts, reloading page instead"),s=!0;else throw m}(n??{})["add-init-scripts"]=Date.now()-d};i.push(u())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&jz()==="darwin"&&Bz("system_profiler SPDisplaysDataType").toString().includes("Retina"))C.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let u=async()=>{let d=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(n??{})["fetch-dpr"]=Date.now()-d};i.push(u())}let c=Date.now();await z(Promise.all(i),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let l=Date.now();(n??{})["ops-attach"]=l-c,s&&await this.page.reload(),this.cdpClient=await Su.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(n??{})["cdp-init"]=Date.now()-l,await this.initializeScreencast(),this.stateManager=new Eu({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init(e){let t=await $C(e),n=new r(t);return await n.initialize({grantPermissions:!0,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let m=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-m}let u=c?.url(),d=new r({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await Gg(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=Qg(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await z(t(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Co(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Qg(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{_C(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(OC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=PR(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await Ig({pageId:t,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",UC(this.customHeaders,this.logger))),Ur&&await e.route("**/*",Ts),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)} (${n})`;if(!t||t==="about:blank"||!Co(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await z(Bg(this.getBrowserCallbacks()),{milliseconds:te})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Di;){a++,n?.throwIfAborted();try{if(await at({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:te,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await W(dt),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),at({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:ee,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:t});if(a.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(t<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await W(Ro),this.screenshot({...e,retries:t-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??Ee}),c=Buffer.from(s.data,"base64"),l=await LR.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&Gz(n,c),this.lastScreenshotForRecording=c,!e)return c;let m=await e.boundingBox({timeout:ee});if(!m)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:g,y:p,width:h,height:f}=m;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");g=Math.floor(g),p=Math.floor(p),h=Math.floor(h),f=Math.floor(f);try{let E=await LR.fromBuffer(c),b=E.bitmap.width,w=E.bitmap.height;g=Math.max(0,Math.min(g,b-1)),p=Math.max(0,Math.min(p,w-1)),h=Math.max(1,Math.min(h,b-g)),f=Math.max(1,Math.min(f,w-p)),c=await E.crop({x:g,y:p,w:h,h:f}).getBuffer("image/jpeg")}catch(E){throw new Error(`Failed taking element screenshot at coordinates (${g}, ${p}) with size (${h}, ${f}): ${E}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){qw(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await W(dt),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:te})}if(!i)throw new x("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(vC.has(s))throw new x("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await at({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:te,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},n=!1){let o=await this.getActivePageOrFrame();await XC({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await W(Ro),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??Af}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Ee})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:Ee})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return hu({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:te}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await MC(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:te});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:te,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await xC(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await RC(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new x("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Gg(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,delete t.serializedForm,delete t.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:t,locator:n,startingBoundingBox:o,allowNotActionableNodesOverride:i,logger:a=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let s=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});s?(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(s){if(s instanceof Nr)throw a.warn({err:s},"Cache attributes disqualify found element"),s;a.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(s){a.debug({err:s},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!bg.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:ee})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:ee});if(!s||!s.width||!s.height)throw new x("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:ee});o.text=s?.trim()}if(n?.attributes&&n.attributes.length>0){let s={};for(let c of n.attributes){let l=c.trim().toLowerCase();if(!(!l||hr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:ee});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new x("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new x("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,m,g;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let b=c.parentFrame,{cache:w,config:R}=await this.stateManager.getAutoFrameDetailsFromHandle(b);d=w,m=R,u=R.frame,g="auto iframe"}else c.parentFrame&&l?(m=l,u=await this.getActivePageOrFrame(),g="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),g="should not be possible");let p=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:u,node:c}),h={id:e,inputDescription:t??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:be(i),frameCache:d},f,E=!1;o||(m&&(i.info({frameConfigSource:g,frameConfig:MR(m)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),E=!0),await this.updateCacheWithNewNodeDetails({node:c,target:h,locator:p,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:h,root:u,locator:p,logger:i}));try{return{resolution:{locator:p,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:h,frameConfig:m,frameConfigSource:g}}finally{E&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let g,p=!1,h=Date.now();for(;Date.now()-h<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(f),p=!0;break}catch(f){g=f,await W(dt,a)}if(!p)throw g}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,m;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let g=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:g,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(p){if(p instanceof ya)break;if(p instanceof Nr){if(d++,d>2)throw i.error({err:p},"Got multiple cache disqualification errors, giving up"),p;i.warn({err:p},"Got cache disqualification error, waiting and retrying resolution"),await W(dt,a)}a?.throwIfAborted(),g&&i.warn({err:p},`Could not resolve target using primary cache only (x${u})`),await W(dt,a)}}return m||(m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:m.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:m?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),m}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=Bi(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),m;if(t.generatedSelectors||t.hybridSelector){let g;try{g=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(p){m=p,p instanceof Lr&&(l.push(...p.decisions),u=p.cacheMissReason)}if(g)return{...g,pageState:void 0,decisions:[...l,...g.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:m?.message,selectors:Bi(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw m;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let g=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(g)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=be(o),g;u=u??"secondary-resolution-failed"}throw new Lr(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new ya("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:On,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:yg,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await at({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:ee,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,m,g=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};g.push(v),m="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,M=d.workingSelectors.slice(0,5);g.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:M}),n.debug({reason:v,workingSelectors:M},"Resolved with CSS selectors"),m="CSS_SELECTOR"}else throw g.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&g.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new Lr("Cache evaluation failed",g,l.cacheMissReason);let p,h,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let M=v.join(" > ");p=e.locator(M),h=this.stateManager.getNodeUsingMPathSelector(M)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),h=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?p=e.locator(d.workingSelectors[0]):p=e.locator(Cr(f));else throw new x("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[E,b]=await Promise.all([p.textContent(),p.boundingBox()]);if((E??"")!==(d.textContent??""))throw n.warn({currentTextContent:E,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!b||Math.abs(b.height-d.boundingBox.height)>1||Math.abs(b.width-d.boundingBox.width)>1||Math.abs((b.x??0)-(d.boundingBox.x??0))>1||Math.abs((b.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:b,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let w=Bi(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:p,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let R=Zg(w,t);return R&&Object.keys(R).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(n),t.cacheResolutionUpdateSource=m),{a11yNode:h,displayString:d.serializedElement,locator:p,decisions:g}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),c=Date.now(),l=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),l++;let m=s.locator(n),g;try{return await m.waitFor({state:"attached",timeout:te}),g=await Rr(m,o,500)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:m,displayString:g,decisions:d}}catch(p){let h=p.message;u=new x("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${h.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":h}`),await W(dt,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:ee});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!t||!n||!c||!l){this.logger.debug({oldX:t,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:t,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<EC){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await at({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Ee,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(yg*t.nodeOnlySerializedHtml.length);if(l&&l.closestDistance&&l.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${l.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:l.closestDistance,closestElement:l.closestNodeSerialized})}else{if(l?.error)throw new Error(l.error);if(l?.dataMomenticId||l?.mPathSelector){let d=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,m,g;if(d)m=this.stateManager.dataMomenticIdToNodeMap[d],g=e.locator(Cr(d));else if(l.mPathSelector)m=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),g=e.locator(l.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let p=l.closestNodeSerialized??await Rr(g,o,500)??"unknown element";o.warn({result:l,originalTarget:t,displayString:p},"Resolved cached target to new node with pure html levenshtein distance");let h=Bi(t);await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:g,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=Zg(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${u} string comparison distance of the saved element.`,logs:l.logs,distance:l.closestDistance,closestElement:p,savedElement:t.nodeOnlySerializedHtml}),{locator:g,a11yNode:m,displayString:p,decisions:n,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`)}}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let s=t.screenshotUrl,c=t.role??"";if(s&&bg.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=Kz(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:m}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),g=d.boundingBox?.width,p=d.boundingBox?.height;if(!g||!p)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let h=d.id,f=this.stateManager.a11yIdToNodeMap[h],E=Bi(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:m,allowNotActionableNodesOverride:o});let b=Zg(E,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:b,templateMatch:u},"Updated cache after template matching resolution")),{locator:m,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:te})??"",i=YC.some(a=>a===o.toLowerCase());return await zg({targetingResult:t,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return zg({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),eu(s,t,n)){a=!0;break}await W(dt,this.abortSignal)}if(!a)throw new x("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${nw(t)} in ${o}ms.
4339
- Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,n={}){await this.highlight(e),await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:ee});if(!o)throw new x("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await W(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Ee):500),await this.highlight(t),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:ee});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+t,{steps:n}),await W(Ro),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Mo({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:ee});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Mo({func:t=>t.locator.focus({timeout:Ee}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await at({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:te,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Mo({func:t=>t.locator.blur({timeout:Ee}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,n=!1){await this.highlight(e.locator),await Mo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${t.index} is not a number`)}await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?Number(t.index):void 0},{force:n,timeout:ee})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=fu(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async keyDown(e,t){if(t.convertMeta){let n=fu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Jg(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=fu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Jg(e))await this.page.keyboard.up(n)}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForDOMStability()}async getBrowserState(e){let{maxAttempts:t=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:On;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,m;for(;d<t;){d++;try{return await z(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(g){if(s?.throwIfAborted(),m=g instanceof Error?g.message:`${g}`,d>=t)throw g;u.warn({err:g,url:this.url()},"Error getting a11y tree, retrying...")}}throw new x("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${m}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await at({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:ee,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=m=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await W(Ro,this.abortSignal),s)try{let d=await this.screenshot(c);if(!d.equals(s)){s=d,l=!1;continue}l=!0}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<bC)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await rR(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e,t,n,o,i){await tR({page:this.page,deltaX:e,deltaY:t,steps:n,delayMs:o,visualTarget:i,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:ee}),n=await z(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Ee});process.platform==="darwin"&&n===1&&(n=SC);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[m=0,g=0,p=0,h=0]=u[d];m/=n,g/=n,p/=n,h/=n;let f=m+p/2,E=g+h/2;return{centerX:f,centerY:E}}async scrollVertical(e){return Hg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return Hg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,t){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=NR(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await W(dt)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
4340
- Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Co(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=wl(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}async solveCaptcha(){await this.getBrowserState({allowNotActionableNodesOverride:!0});let e;for(let s of Object.values(this.stateManager.a11yIdToNodeMap))if(s.role==="image"&&s.name.toLowerCase().includes("captcha")){if(!s.backendNodeId)continue;e=await this.stateManager.getLocatorFromBackendId(this.page,s.backendNodeId);break}if(!e){let s=await(await this.getActivePageOrFrame()).solveRecaptchas();if(!s.captchas||!s.captchas.length)throw new Error("No captchas found on the page");return}let t=await e.screenshot({type:"jpeg",animations:"allow",caret:"hide",quality:100,timeout:ee}),n=await fetch("https://api.2captcha.com/createTask",{method:"POST",body:JSON.stringify({clientKey:ki,task:{type:"ImageToTextTask",body:t.toString("base64"),case:!0},languagePool:"en"})});if(!n.ok){let s=`Captcha solver API returned error response: ${n.statusText}`;throw this.logger.error({text:await n.text()},s),new Error(s)}let{taskId:o}=await n.json(),i=Date.now(),a="";for(;Date.now()-i<TC;){await W(2500);let s=await fetch("https://api.2captcha.com/getTaskResult",{method:"POST",body:JSON.stringify({clientKey:ki,taskId:o})});if(!s.ok){let l=`Captcha solution API returned error response: ${s.statusText}`;throw this.logger.error({text:await s.text()},l),new Error(l)}let c=await s.json();if(c.errorId){let l=`Captcha solution API returned error ID ${c.errorId}`;throw this.logger.error(l),new Error(l)}if(c.status==="ready"){a=c.solution.text;break}}if(!a)throw new Error("Captcha solution timed out");return a}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await z(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&IR({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Co(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},dt);let s=async()=>{clearInterval(t)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,t,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:te})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await Ss({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new x("UserInfrastructureError",`The page with URL ${ft(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await Ss({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return Vz.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await at({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:Ee,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new x("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n,o=Ee){let i=await this.getActivePageOrFrame();return at({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=_n}){let i=kC(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new x("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:te})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>1)throw new x("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*t),d=Math.ceil(i*n),m=u+l,g=d+c;return this.getDomNodeFromPixelPosition(m,g)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:te,params:{highlightConfig:iR,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:te,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:te})}catch{}}async getTargetFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(t,e);return this.getTargetFromBackendNodeId({root:t,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:t,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[dn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Cr(a)),c;o.bounds.x!==null&&o.bounds.y!==null&&(c={x:o.bounds.x,y:o.bounds.y,width:o.bounds.width??0,height:o.bounds.height??0});let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:s}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await z(this.performTargetRedirectionHelper(e,t,n),{milliseconds:ee})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now();if(n===void 0&&(n=await e.boundingBox({timeout:ee})??void 0),!n){let w=await Rr(e,t,500);t.error(`Attempted to click on element with no bounding box: ${w}`);return}let{x:i,y:a,width:s,height:c}=n,l=this.getViewport();if(i<0||a<0||!l||i+s>l.width||a+c>l.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let u=await this.getActivePageOrFrame(),{dataMomenticId:d,mPathSelector:m,error:g,serializedElement:p,foundElementRelativePoint:h,force:f,logs:E}=await e.evaluate(w=>{let R=window;if(!R.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return R.performTargetRedirection(w)},void 0,{timeout:te}),b=Date.now()-o;if(g){t.warn({error:g,serializedElement:p,duration:b,force:f,logs:E},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:p,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(Cr(d)),hints:{relativeXYToLocator:h,force:f}};if(m)return t.info({newMPathSelector:m,serializedElement:p,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(m),hints:{relativeXYToLocator:h,force:f}};if(h)return t.info({foundElementRelativePoint:h,serializedElement:p,duration:b,force:f,logs:E},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:p,duration:b,force:f,logs:E},"Forcing click on original element"),{locator:e,hints:{force:f}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:Ee});if("error"in s&&s.error)throw s.error.startsWith(gC)?new sl(s.error):s.error.startsWith(hC)?new ll(s.error):new Error(s.error);return s.warnings.length&&t.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,t){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,t,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*t),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:te})}async scrollFromPositionPercentages(e,t,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!ki}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,_g(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Tu(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(c),this.logToUserConsole(this.page,"error",c);return}let n=t?.trim()||NR(e),o=zz(e),i=$z(e),a=Im[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Tu(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:Wz.getType(e)||"application/octet-stream"},{timeout:cu})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=l;let m=atob(l),g=new Array(m.length);for(let h=0;h<m.length;h++)g[h]=m.charCodeAt(h);let p=new Uint8Array(g);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([p],{type:u})}isSameEntry(h){return h.name===this.name}queryPermission(h){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(h){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let h=new Blob([p]);return new File([h],d.momenticFileName,{type:u})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){this.cdpClient.loadEventLogs.length>0&&(this.cdpClient.loadEventLogs=[]);let t={...this.debugData};return this.debugData={logsPerPage:[]},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t){this.requestRecorders[e]=t}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,n){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:n})}registerMock(e,t,n,o){let i=e??Qg();return this.mocks[i]={matcher:t,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??yC}get userBrowserSettings(){return Bi(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Di}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=gu();for(let t of e)if(!(!Tu(t)||!OR(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=qz(t,o);return Tu(i)&&OR(i).isDirectory()&&Hz(i).length>0})))return t}};import A1 from"fetch-cookie";import{cloneDeep as nx}from"lodash-es";import{CookieJar as w1}from"tough-cookie";async function Sr({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var Yz=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function DR({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(Yz.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await W(250),l++;let u=(await t.getOpenPages()).map(m=>m.url),d=t.url();if(u.length!==e.length)for(let m=u.length-1;m>=e.length;m--){let g=u[m];if(Co(g,o)&&g!==r&&g!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(m)});break}}}}async function Xr(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as t1}from"crypto";var UR={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},FR={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},kR=/<(\S+) id="(\d+)".*?>/g,Xz=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,BR=["h1","h2","section","footer","nav","aside","form","label","dialog"],Jz=[...BR,"span","div","h3"],Qz=["table","select","form","ul","ol","menu","pre","code","dialog"],Zz=["table","form","dialog","nav","section","ul","select"];function vu(r){return e1(r)}function e1({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4341
- `),l=0,u=[],d=0,m=[],g=[],p=!1;for(;l<c.length;){p&&(s.push({ids:m,content:u.join(`
4342
- `),tokenLength:d}),u=[],d=0,m=g.length?[g[g.length-1].id]:[],p=!1);let h=c[l],f=xr(h);d+=f,h.length>a&&(h=h.slice(0,a));let w=Array.from(h.matchAll(kR)).map(G=>G&&G.length>=3?{tagName:G[1],id:G[2]}:void 0).filter(G=>!!G),v=Array.from(h.matchAll(Xz)).map(G=>G&&(G[2]||G[4])).filter(G=>!!G);v.reverse();let M=h.replace(/ id="[0-9]+"/g,"");u.push(M);for(let G of w)m.push(G.id),g.push(G);for(let G of v){let $=g[g.length-1];$&&$.tagName===G&&g.pop()}let A=g.some(G=>Qz.includes(G.tagName)),I=c[l+1]??"",k=xr(I),ne=Array.from(I.matchAll(kR)).map(G=>G&&G.length>2?G[1]:void 0).filter(G=>!!G),Te=ne.some(G=>BR.includes(G)),At=ne.some(G=>Jz.includes(G));d+k>=i&&(p=!0),d>=n&&(Te&&!A||v.some(G=>Zz.includes(G)))&&(p=!0),d>=o&&At&&!A&&(p=!0),l++}return u.length&&s.push({ids:m,content:u.join(`
4343
- `),tokenLength:d}),s.forEach((h,f)=>{let E=h.ids[0],b=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:E,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var r1=75e4,Au=3e5;async function Po(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=t,l=r.tree,u=r.serializedTree,d=xr(u);if(d>r1)try{let m=vu({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await o1({...r,tokenLimit:Au-1e4,chunks:m.chunks}),u=l.serialize();let g=xr(u);i.info({oldTokens:d,newTokens:g},"Filtered page using keywords"),d=g}catch(m){i.warn({err:m},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Au*Hn),u=l.serialize();let g=xr(u);i.info({oldTokens:d,newTokens:g},"Filtered page using naive truncation"),d=g}if(d>Au)try{if(o){let m=vu({serializedTree:u,options:FR,logger:i}),g=t1();l=await z(n1({...r,chunks:m.chunks,callId:g}),{milliseconds:12e3,signal:c}),u=l.serialize();let p=xr(u);i.info({oldTokens:d,newTokens:p,langfuseCallId:g},"Filtered page using AI chunk ranking"),d=p}else{let m=vu({serializedTree:u,options:UR,logger:i});l=await z(i1({...r,chunkResult:m,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=xr(u);i.info({oldTokens:d,newTokens:g},"Filtered page using RAG"),d=g}}catch(m){i.warn({err:m},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Au*Hn),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function n1({type:r,callId:e,chunks:t,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:t,description:n,type:r,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:be(c)}),u=[];return t.forEach((m,g)=>{l.indices.includes(g)&&(u=u.concat(m.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function o1(r){let{description:e,fixtures:t,tree:n}=r,{generator:o,logger:i,signal:a}=t;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:be(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(g=>g.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((g,p)=>g+p.tokenLength,0)>r.tokenLimit&&l.length>1)continue;let d=l.flatMap(g=>g.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function i1(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:s,signal:c}=t,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:be(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function th(r,e){if(!r.description)throw new x("UserConfigurationError","Cannot locate element with empty description");return Sr({action:async()=>a1(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function a1(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u}=r,{ctx:d,orgId:m,browser:g,localCodeEvalTools:p,generator:h,abortSignal:f}=e,E=r.description,b=r.useMemory&&!t;n&&(E=await bs({orgId:m,s:E,context:n,localTools:p,signal:f,logger:l})),a&&(E=l1(E,a));let{serializedTree:w,tree:R}=await Xr(g,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),v,M=Date.now(),A;for(;!v&&Date.now()-M<3e3;){f.throwIfAborted();try{v=await g.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ae){A=ae}}if(!v)throw new x("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${A?.message}`);let I=w,k=!1,ne=`data:image/jpeg;base64,${v.toString("base64")}`;I=await Po({type:"locator",description:E,screenshot:ne,serializedTree:w,options:{aiPageFiltering:c},tree:R,fixtures:{generator:h,signal:f,logger:l,orgId:m}}),I!==w&&(k=!0);let Te=await h.getElementLocation({browserState:I,goal:E,screenshot:ne,source:a,memory:b?s:void 0},{disableCache:t,abortSignal:f,loggerTags:be(l),useMemory:b});if(l.debug({usedRag:k,result:Te},"Got locator result"),!(Te.id>0))throw new Tn(`Could not find any relevant element: ${Te.thoughts}`,Te.updatedMemory?{type:"GCS_TRACES",traces:Te.updatedMemory}:void 0);let{resolution:G,target:$,frameConfig:ge}=await g.createTargetFromA11yId({id:Te.id,requirements:Te.requirements,additionalElements:Te.additionalElements,description:E,targetSource:"AI",logger:l});if(G.a11yNode?.properties?.hidden&&G.a11yNode?.properties?.hidden!=="false")throw new x("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${G.displayString}`);return b&&(Te.updatedMemory?$.memory={type:"GCS_TRACES",traces:Te.updatedMemory}:s&&($.memory=s)),{thoughts:Te.thoughts,target:$,resolution:G,frameConfig:ge,screenshot:ne}}var s1=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],zR="<select> element:",HR="text input or contenteditable element:",GR="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",VR="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",eh=[zR,HR,GR,VR,...s1];function WR(r,e){if(r===e)return!0;for(let t of eh){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(eh.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!eh.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function l1(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${zR} ${r}`;case"TYPE":return`${HR} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${GR}
4344
- ${r}`;case"ELEMENT_CHECK":return`${VR}
4345
- ${r}`;default:return r}}var c1=15;async function wu({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=c1}){if(!r.assertion.trim())throw new x("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=Zc(c),u=0,d=Date.now(),m,g,p;try{await Sr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let h;for(;u<a&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await W(l,n.abortSignal),h=Date.now();let f=!1;try{if(m=await Sr({action:async()=>{let b=await jR(s,t,n.abortSignal);return g&&g.serializedTree===b.serializedTree&&g.screenshotBuff.equals(b.screenshotBuff)?(f=!0,m):(g=b,$R({command:r,state:b,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),m?.success){m?.updatedMemory&&hs(r,m.updatedMemory,t);break}else throw m?.thoughts?new x("AssertionFailureError",m.thoughts):new x("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(E){n.abortSignal.throwIfAborted(),p=E instanceof Error?E:new Error(`${E}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:E},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!m?.success)try{m=await Sr({action:async()=>$R({command:r,state:await jR(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),p=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(m?.updatedMemory&&hs(r,m.updatedMemory,t),!m?.success){let f=`AI check still failing after ${u} attempts.`;throw p&&(f+=` Latest result: ${p.message}`),new x("AssertionFailureError",f)}return{...m,succeedImmediately:!1,urlAfterCommand:s.url()}}async function jR(r,e,t){let[n,o]=await Promise.all([Xr(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function $R({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:m}=t,g={type:"ASSERTION"},{serializedTree:p,tree:h}=e,f=e.screenshotBuff,E=f.toString("base64"),b=u.url(),w=r.contextChoice??"MULTIMODAL",R=p;w!=="VISION_ONLY"&&(R=await Po({type:"assertion",serializedTree:p,tree:h,description:r.assertion,screenshot:E,options:{aiPageFiltering:a},fixtures:{generator:d,signal:m,logger:l,orgId:t.orgId}}),R!==p&&(g.ragUsed=!0),g.pageState=R);let v={goal:r.assertion,url:b,memory:o?r.cache?.memory:void 0,browserState:R,screenshot:E,contextChoice:w,source:c},A=await(w==="VISION_ONLY"?(I,k)=>d.getVisualAssertionResult(I,k):(I,k)=>d.getAssertionResult(I,k))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:m,logger:l,loggerTags:be(l)});return(A.result||i)&&A.relevantElements&&(g.relevantElementsSerialized=A.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await u1(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function u1(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await z(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var d1=75e4,Cu=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function qR(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await m1(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Cu?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await W(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function m1(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await W(o.smartWaitingTimeout,n);return}if(!e.description)throw new x("UserConfigurationError","Cannot locate element with empty description");await z(p1(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function p1(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await Sr({action:async()=>g1(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function g1(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await bs({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:m}=await Xr(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(xr(m)>d1)throw new Cu;s.throwIfAborted();let p;try{p=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new x("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${p.toString("base64")}`;s.throwIfAborted();let E=await u.getSmartWaitingDecision({browserState:m,description:d,screenshot:f},{abortSignal:s,loggerTags:be(n)});return n.debug({result:E},"Got smart waiting result"),E.isPageReady}import{cloneDeep as YR}from"lodash-es";async function XR(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>cf(e.cache)?e.cache:void 0,a=i(),s=YR(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=aw(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,m=500,g=!1;for(;u<2||Date.now()-l<t;){u++,u>1&&await W(m,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await KR({cacheToUse:a,params:r});if(d=h,g=f,h.success)break;c(),m=Math.min(m*2,1e4)}if(!d)throw new x("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&qs(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await KR({cacheToUse:h,params:r});d=f,d.success||c(!0)}let p=i();return d.success&&p?.target&&!g&&(p.target=sg(p.target),p.updatedAt=new Date),d}async function KR({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Sn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=qc(t.assertion),l,u=!1,d=YR(r);try{let{elementInteractedDisplayString:m,result:g,thoughts:p}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>h1(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ta(t),targetName:"target"}});return l={success:g.success,data:g.data,err:g.err,elementInteractedDisplayString:m,thoughts:p},u=!0,g.success||(s.warn({aiThoughts:p,elementString:m,err:g.err},"Element check found an element but failed"),l={...g,thoughts:p}),{result:l,elementWasFound:u}}catch(m){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${m.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(m instanceof x)||m.reason!="ActionFailureError")throw m;return l={success:!1,err:m,data:void 0,thoughts:void 0},s.warn({err:m},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function h1(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await f1(r,e.assertion)}async function f1(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:ft(a,500,!0)},!Wr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ft(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await r.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new x("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!Wr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new x("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Lt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Lt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Lt*1e3});break}case"FOCUSED":{t=await r.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(t=e.negated?!t:t,!t){let a=gr(e);n=new x("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!Wr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!Wr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The style property ${e.property} ${s}`):n=new x("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:t,data:o,err:n}}function JR(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as S1}from"jimp";async function ws(r,e){let t=await r.screenshot(e),n=await S1.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as QR}from"jimp";import rh from"jpeg-js";import y1 from"pixelmatch";async function ZR({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Sn(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async ne=>ws(o,{locator:ne.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await ws(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let j=`${l.width}x${l.height}`,ne=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${j}) does not match saved screenshot dimensions (${ne}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await QR.fromBuffer(l.buffer),m={width:l.width,height:l.height},g=await QR.fromBuffer(u.buffer),p={width:u.width,height:u.height},h,f=m.width*m.height,E=p.width*p.height,b=Math.abs(m.height-p.height),w=Math.abs(m.width-p.width);if(f>E){let j=d.cover({w:p.width,h:p.height});l.buffer=await j.getBuffer("image/jpeg"),h="current",l.width=p.width,l.height=p.height}else if(E>f){let j=g.cover({w:m.width,h:m.height});u.buffer=await j.getBuffer("image/jpeg"),h="saved"}let R={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=t.threshold??.1,A=y1(rh.decode(u.buffer).data,rh.decode(l.buffer).data,R.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=A>v*100,k=`Visual diff of ${A.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${v*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${w} pixels.`),I)throw new x("ActionFailureError",k);return{fail:I,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:rh.encode(R,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var b1=3e4;function E1(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function Ru({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??b1/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([p,h])=>p&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([p,h])=>p&&h).forEach(([p,h])=>{a.append(p,h)});let s=a.toString(),c;if(Li(r.url)&&(c=r.url),t&&Ni(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await z((async()=>{let p=s?`${l}?${s}`:l;try{let h=E1(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(p,{headers:f,method:r.method,body:h.content})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new x("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let p;try{p=await d.text()}catch(h){p=`Failed to read response body: ${h}`}throw new x("ActionFailureError",`Fetch request failed with status ${d.status}: ${p}`)}let m={};d.headers.forEach((p,h)=>{m[h]=p});let g={status:d.status,headers:m,request:{url:d.url,method:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{g.request.json=JSON.parse(r.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{g.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(g.text=await d.text());return g}var T1=5e3;async function tx({timeout:r=Lt,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await xu(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await W(s,e.signal),s=Math.min(Math.floor(s*1.5),T1);else return i}return i=await xu(e),i}async function xu({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(ex,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(ex,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?cn.CONTAINS:un.CONTAINS;a=new x("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new x("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function ex({value:r,negated:e,returnHtml:t}){let n=document.documentElement.outerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var v1=3e4;async function rx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??v1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Li(r.url)&&(s=r.url),t&&Ni(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=await z((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new x("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,m=await l.text();try{d=JSON.parse(m)}catch{throw new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}let u={};return l.headers.forEach((d,m)=>{u[m]=d}),{status:l.status,headers:u,json:await l.json()}}var Mu=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=t,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Xr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await Po({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),m={url:this.browser.url(),browserState:d,startingScreenshot:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...be(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Xr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,m=await Po({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),g={url:c,browserState:m,startingScreenshot:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(g,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...be(a)},langfuseSessionId:s})}catch(p){throw new x("InternalWebAgentError",`Error generating command: ${p instanceof Error?p.message:p}`,{errOptions:{cause:p}})}}async getBrowserState(e){return Xr(this.browser,e)}async locateElement(e){return await th({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return Sr({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let m=i[d],g=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:m,cache:a[d],action:async p=>p,options:{...c,targetName:o[d]}});u.push(g)}try{let d=await s(...u.map(p=>p.result)),m=p=>p==="fromTarget"?"From Target":p==="toTarget"?"To Target":"Target",g=u.map((p,h)=>p.thoughts?`${m(o[h])}: ${p.thoughts}`:void 0).filter(p=>!!p).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(p=>p.elementInteractedDisplayString),thoughts:g}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new x("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await Sr({action:()=>this.wrapElementTargetingCommandHelper({...e,originalCache:e.originalCache??e.cache}),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&Nd(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Ud(i)||Dd(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(Fd(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Nr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof x?n:new x("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new x("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await W(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:m,source:g}=s,p=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,E=!1,b=nx(e.cache);if((!b||l)&&!Td(o))throw new x("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(p.info("Cache explicitly disabled for this step"),E=!0,b=void 0),b&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&b.targetSource==="HEURISTIC_HEALED"&&(E=!0,b=void 0),b?.inputDescription&&!WR(o.elementDescriptor,b.inputDescription)&&(p.warn({old:b.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),E=!0,b=void 0);let w=v=>!!v&&qs(v),R=!0;if(!w(b)){R=!1,p.info({description:o.elementDescriptor,targetHealingInProgress:m,cacheBustedBeforeAction:E,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(E||!i)&&await qR({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:g,logger:p,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await th({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:g,useMemory:h,memory:h?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:p},this.getControllerFixtures(t))}catch(I){if(I instanceof Tn&&I.updatedLocatorMemory){let k={id:-1,...i,memory:I.updatedLocatorMemory};Yc({cmd:c,key:d,newTarget:k,logger:p,updatedWithAI:!0})}throw new x("ActionFailureError",I.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let M=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,p),A=await a(M);return Yc({cmd:c,key:d,newTarget:v.target,logger:p,updatedWithAI:!0}),m&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=be(p)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,b,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:p,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let M=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,p),A=await a(M);if(Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.1"]),Yc({cmd:c,key:d,newTarget:b,logger:p,updatedWithAI:!1}),R){let I=v.decisions.filter(k=>k.matched);if(I.length!==1)p.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=I[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let M="unknown";v instanceof Lr&&v.cacheMissReason&&(M=v.cacheMissReason),Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.1",`missReason:${M}`]);let A=!1;if((v instanceof Nr||Nd(v)||Ud(v)||Fd(v)||hS(v)||Dd(v)||fS(v))&&(A=!0),v instanceof x&&!A)throw p.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){p.info({err:v},"Failed to execute action with cached target, retrying with AI");let I;return b.memory&&nf(b.memory)&&(I=b.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:I,retriesWithAI:f,targetHealingInProgress:!0}})}throw new x("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return ws(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await W(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new x("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Nf(n)?await this.browser.waitForDOMStability({timeout:Ee}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:te}),this.options?.autoFollowNewTabs&&await DR({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{su(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>Rg(e)}}async resolveCommandTemplateStrings(e,t){return au({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?wu({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new x("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new x("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return wu({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new x("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let f=RE(n.schema);if(f)throw new x("UserConfigurationError",f)}let p=await this.browser.getCondensedHtml(),h=await this.browser.screenshot({retries:2});try{let f=await this.generator.getTextExtraction({goal:n.goal,browserState:p,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${h.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:be(a)});if(f.result==="NOT_FOUND")throw new x("ActionFailureError","No relevant data found for extraction goal on this page");if(f.thoughts?.includes("MaxGenerationLengthExceededError"))throw new x("UserConfigurationError",f.thoughts);return{thoughts:f.thoughts||void 0,data:f.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(f){let E=f.message;throw E.includes("MaxGenerationLengthExceededError")?new x("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):E.includes("AIProviderError")&&E.includes("time")?new x("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:f}}):f}}case"NAVIGATE":if(!Li(n.url)&&!Ni(n.url,this.browser.baseUrl))throw new x("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":if(!this.browser.canSolveCaptchas())break;let c=await this.browser.solveCaptcha();c&&(await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:"the captcha image solution input"},cache:void 0,action:p=>this.browser.click(p,this.createCallbacksForBrowser(this.orgId),{}),options:{...n,targetName:"target",disableCache:i}}),await this.browser.type(c,{clearContent:!0,pressEnter:!0},!0));break;case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let p,h;if(n.target&&Pr(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:b,thoughts:w}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:R=>this.browser.hover(R),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});p=b,h=w}let f=this.browser.getViewport()?.height??Rn.height,E=this.browser.getViewport()?.width??Rn.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??f));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??f);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??E));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??E);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:h}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new x("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let p=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:p},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new x("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let l=n.delay*1e3;await W(l,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Pr(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let p=this.browser.url(),{elementInteractedDisplayString:h,result:f,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:w=>this.browser.click(w,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:E,data:f.downloadedFile?{downloadedFile:f.downloadedFile}:void 0};return tu(p,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Pr(n.fromTarget)&&Pr(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(Pr(n.fromTarget)||Pr(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:p,thoughts:h}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(f,E)=>this.browser.dragAndDrop(f.locator,E.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p[0],thoughts:h}}case"MOUSE_DRAG":{let p=parseInt(n.deltaX),h=parseInt(n.deltaY),f=n.steps??5;if(isNaN(p)||isNaN(h))throw new x("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Pr(n.target)){await this.browser.mouseDragUsingVisualCoordinates(p,h,f,void 0,n.target.pixels);break}let E,b;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:w,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async v=>this.browser.mouseDrag(p,h,f,v.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});E=w,b=R}else await this.browser.mouseDrag(p,h,f,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:E,thoughts:b}}case"SELECT_OPTION":{if(!Sn(n.target))throw new Error("Select with x/y is not supported yet");let p=n.target.elementDescriptor,h=n.choice,{elementInteractedDisplayString:f,thoughts:E}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:p},cache:n.cache?.target,action:b=>this.browser.selectOption(b,h,n.force),options:{...n,targetName:"target",disableCache:i,source:Ta(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:E}}case"TAB":{let p={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,p);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let u=await this.browser.setCookie(n.value);a.debug({results:u},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let p;try{n.environment==="BROWSER"?(p=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:p},"Executed JavaScript in browser")):p=await $r({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async h=>{if(!this.options?.scratchPadId){a.warn({updates:h},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:h,logger:a})}}})}catch(h){throw this.throwIfClosed(),new x("ActionFailureError",h instanceof Error?h.message:`${h}`,{errOptions:{cause:h}})}try{JSON.stringify(p)}catch(h){throw new x("ActionFailureError",`Return value is not serializable: ${h instanceof Error?h.message:`${h}`}`,{errOptions:{cause:h}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:p}}case"TYPE":{if(n.target&&Pr(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let p=this.browser.url(),h,f,E=nx(n.target),b=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(E){let{elementInteractedDisplayString:R,thoughts:v}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:E,cache:n.cache?.target,action:M=>this.browser.typeIntoTarget(n.value,M,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!b,source:Ta(n)}});h=R,f=v}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let w={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:h,thoughts:f};return tu(p,w.urlAfterCommand)&&(w.succeedImmediately=!0,w.succeedImmediatelyReason="URL changed"),w}case"HOVER":{if(Pr(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:p,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.hover(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:h}}case"FOCUS":{if(!Sn(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:p,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:f=>this.browser.focus(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:h}}case"BLUR":{if(n.target&&!Sn(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:p,thoughts:h}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:f=>this.browser.blur(f),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:h}}case"PRESS":let d=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let m={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return tu(d,m.urlAfterCommand)&&(m.succeedImmediately=!0,m.succeedImmediatelyReason="URL changed"),m;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let p=new w1,h=A1(fetch,p),f;try{f=new URL(n.url).hostname}catch{}let E=await Ru({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:h});return{data:Qs.parse({...E,cookies:Cl(p,f)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await rx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return ZR({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:p=>this.wrapElementTargetingCommand(p)});case"FILE_UPLOAD":{let p,h;if(n.fileSource.type==="URL"?(h=n.fileSource.url,p=await wC({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(h=n.fileSource.name,p=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!p)throw new x("UserConfigurationError",`Attempted to use non-existent file for upload step: ${h}`);await this.browser.setFileChooserHandler({...p,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let p;if(!n.storageState.trim())p=void 0;else if(p=await $r({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof p!="object")throw new x("ActionFailureError",`Credentials must evaluate to an object (received ${typeof p} instead)`);let h;try{h=zy.optional().parse(p)}catch(f){throw new x("ActionFailureError",`Credentials provided do not follow the required format: ${f}`)}await this.browser.loadAuthState(h);break}case"ELEMENT_CHECK":{let p=(n.timeout??Lt)*1e3,h=this.generator.getAgentConfig()?.assertion;if(JR(n.assertion)&&!n.useSelector&&n.target.type==="description"&&h&&h!=="v1"){let E={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let b=await wu({command:E,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${b.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:b.afterScreenshotOverride}}finally{E.cache?.memory&&hs(n,E.cache?.memory.traces,a)}}let f=await XR({command:n,tracer:t,timeoutMs:p,targetingWrapper:E=>this.wrapElementTargetingCommand(E),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!f.success,data:f.data,elementInteracted:f.elementInteractedDisplayString,thoughts:f.err?.message??f.thoughts??`Element assertion ${f.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let p=await Sr({action:async()=>tx({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!p.success,data:p.data,thoughts:p.success?"Page assertion passed.":p.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let p=new Gn(n.requestMatcher),h=this.browser.registerRequestListener(p);return this.registeredListeners[n.key]=h.then(async f=>await Og(f)).catch(f=>{a.error({err:f},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let p=this.registeredListeners[n.key];if(!p)throw new x("ActionFailureError",`No listener registered with key: ${n.key}`);let h=n.timeout??10;return{data:await z(p,{milliseconds:h*1e3,message:`Request listener timed out after ${h} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let p=new Gn(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:h=>p.matches({url:h.request.url,method:h.request.method}),onRequestStart:(h,f)=>{this.recordedRequests[n.key][h]=pu(f)},onRequestComplete:(h,f)=>{this.recordedRequests[n.key]?.[h]&&(this.recordedRequests[n.key][h]=pu(f))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let p=this.recordedRequests[n.key];if(!p)throw new x("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(p),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let p;return n.requestMatcher&&(p=new Gn(n.requestMatcher)),this.browser.setHeader(n.name,n.value,p),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Gn(n.requestMatcher),async(h,f)=>{let E=await $r({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:h,response:f},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),b=lb.parse(E);return new Response(b.body,{status:b.status,headers:b.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new bu({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}};import{cloneDeep as C1}from"lodash-es";import lx from"truncate-json";var ox=1e3,ix=5e6,R1=5*1024*1024;function cx(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=lx(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.type){case"MOBILE_PRESET_STEP":ax(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":ax(n),cx(n.steps,e);break;default:{let o=n;throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")}}}}function ax(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function sx(r,e){let t=JSON.stringify(r),n=t.replaceAll("\\u0000","");if(t.length!==n.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return n}function _u(r,e){let t=C1(r);if(cx(t,e),t.length>ox)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,ox);let n=sx(t,e);if(n.length>ix)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>ix;)t.pop(),n=sx(t,e);let{jsonString:o}=lx(n,R1);try{return zt.array().parse(JSON.parse(o))}catch(i){throw e.error({serialized:n,err:i},"Could not parse serialized results into JSON structure after processing"),i}}import{AsyncLocalStorage as x1}from"async_hooks";var Cs=new x1;function M1(r){Cs.enterWith({activeTracers:[r]})}function _1(r,e){let t=Cs.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function P1(r,e){let t=Cs.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return Cs.run({activeTracers:n},e)}var mn={globalAls:Cs,initializeRootTracerContext:M1,withChildTracer:_1,withChildTracerAsync:P1};var Io=class r{spans;parentSection;finished=!1;startTime;endTime;constructor(e){this.startTime=e?.startTime??Date.now(),this.spans=e?.subSpans??[],this.parentSection=e}startSection(e,t){let n={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},o=new r(n);try{return mn.withChildTracer(o,()=>t(o,n))}catch(i){throw n.error=i instanceof Error?i.message:String(i),i}finally{o.finish(),this.addSpan(n)}}async startAsyncSection(e,t,n){let o={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},i=new r(o);this.addSpan(o);try{let a;return n?.signal||n?.timeoutMs?a=await mn.withChildTracerAsync(i,()=>z(t(i,o),{milliseconds:n?.timeoutMs??1/0,signal:n?.signal,message:n?.timeoutMsg??`Operation timed out after ${n?.timeoutMs??1/0}ms (${e})`})):a=await mn.withChildTracerAsync(i,()=>t(i,o)),a}catch(a){throw o.error=a instanceof Error?a.message:String(a),a}finally{i.finish()}}finish(){if(!this.finished){this.endTime=Date.now();for(let e of this.spans)e.endTime||(e.endTime=this.endTime,e.durationMs=e.endTime-e.startTime);this.parentSection&&(this.parentSection.endTime=this.endTime,this.parentSection.durationMs=this.parentSection.endTime-this.parentSection.startTime),this.finished=!0}}addSpan(e){this.spans.push(e)}startSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{a=t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}async startAsyncSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{i?.signal||i?.timeoutMs?a=await z(t(o),{milliseconds:i?.timeoutMs??1/0,signal:i?.signal,message:i?.timeoutMsg??`Operation timed out after ${i?.timeoutMs??1/0}ms${"name"in i?` (${i.name})`:""}`}):a=await t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}getRootSpan(){return this.finished||this.finish(),{type:"SECTION",name:"root step span",startTime:this.startTime,endTime:this.endTime,subSpans:this.spans,attributes:{},durationMs:this.endTime?this.endTime-this.startTime:void 0}}};function Z(){let r=mn.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new Io}async function ux(r){let{driver:e,abortSignal:t,logger:n,packageName:o}=r,i;try{i=await z(e.execute("mobile: shell",{command:"dumpsys",args:["activity","recents"]}),{signal:t,milliseconds:1e4})}catch(s){t?.throwIfAborted(),n.warn({err:s,packageName:o},"Failed to read recents output while removing package");return}if(typeof i!="string"){n.warn({packageName:o,outputType:typeof i},"Unexpected dumpsys output when removing package from recents");return}let a=I1(i,o);if(a.length!==0)for(let s of a){t?.throwIfAborted();try{await e.execute("mobile: shell",{command:"am",args:["stack","remove",s.toString()]}),n.info({packageName:o,taskId:s},"Removed task from recents")}catch(c){t?.throwIfAborted(),n.warn({err:c,packageName:o,taskId:s},"Failed to remove task from recents")}}}function I1(r,e){let t=r.split("Task{");if(t.length<=1)return[];let n=new Set;for(let o of t.slice(1)){let i=`Task{${o}`;if(!i.includes(e)||i.includes("app.lawnchair/.LawnchairLauncher"))continue;let a=i.match(/taskId=(\d+)/);if(!a)continue;let[,s]=a;if(!s)continue;let c=Number.parseInt(s,10);Number.isNaN(c)||n.add(c)}return Array.from(n)}function Rs(r){let e=[],t=r.getAttribute("text")??"",n=r.getAttribute("hint")??"",o=r.getAttribute("showing-hint")==="true";t.trim()&&!o&&t.trim()!==n.trim()&&e.push(t.trim());for(let i of Array.from(r.childNodes??[]))if(i.nodeType===3){let a=i.nodeValue??"";a.trim()&&e.push(a.trim())}else if(i.nodeType===1){let a=Rs(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as eH}from"fs";import{tmpdir as tH}from"os";import bx from"path";import{diff as Z1}from"deep-object-diff";import{cloneDeep as yx}from"lodash-es";import gx from"fontoxpath";import O1 from"@prettier/plugin-xml";import L1 from"prettier";import{DOMParser as N1,XMLSerializer as D1}from"slimdom";var k1=new Set(["android.webkit.webview","com.facebook.react.views.webview.reactwebview","com.tencent.smtt.sdk.webview","com.tencent.smtt.sdk.x5webview","org.xwalk.core.xwalkview","com.uc.webview.export.webview"]);function xs(r){let e=r.toLowerCase();return e.endsWith("webview")||k1.has(e)}function U1(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}var F1=new Set(["index","package","a11y-important","screen-reader-focusabl"]),B1=new Set(["selected","checked","checkable","clickable","enabled","focusable","focused","long-clickable","password","scrollable","selected","showing-hint","context-clickable","multiline","text-entry-key","heading","dismissable","screen-reader-focusable","content-invalid","a11y-focused"]),z1=new Set(["text","hint"]),H1=new Set(["live-region","drawing-order"]),G1=new Set(["displayed","enabled"]);function V1(r,e){let t={};for(let[n,o]of Object.entries(e))F1.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||B1.has(n)&&o==="false"||z1.has(n)&&o===""||G1.has(n)&&o==="true"||H1.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function dx(r,e,t){let{prunedDocument:n,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=r,c=a.value++;t.setAttribute("id",String(c));let l={};for(let m of e.attributes){let g=m.name,p=m.value;p!=null&&(l[g]=String(p))}let u=V1(e.tagName,l);for(let[m,g]of Object.entries(u))t.setAttribute(m,g);if(o.set(c,e),i.set(c,t),xs(e.tagName)){let m=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&m.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);m.trim().length>0&&t.appendChild(n.createCDATASection(`
4336
+ ${A||""}`}return E}shallowClone(){let e=new r({id:this.id,role:this.role,name:this.name,nameSources:this.nameSources,content:this.content,properties:[],pathFromRoot:this.pathFromRoot,children:[],ignoredReasons:this.ignoredReasons,backendNodeID:this.backendNodeId,ignoredByCDP:this.ignoredByCDP,internalProperties:qg(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=qg(this.properties),e}},Yg=class r{constructor(e,t,n,o){this.root=e;this.a11yIdNodeMap=t;this.dataMomenticIdMap=n;this.selectorToNodeMap=o}serialize(e){return this.root.serialize(e)}pruneUsingSummaries(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n={},o={},i={},a=c=>{let l=c.shallowClone();if(e[c.id])return l.properties["data-momentic-summary"]=e[c.id],n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l;let u=[];for(let d of c.children){let m=a(d);m&&(u.push(m),m.parent=l)}return l.children=u,n[c.id]=l,c.dataMomenticId&&(o[c.dataMomenticId]=l),c.mPathSelector&&(i[c.mPathSelector]=l),l},s=a(t);return new r(s,n,o,i)}pruneUsingRelevantIds(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");function n(i,a=!1){let s=e.has(`${i.id}`)||i.id===t?.id,c=i.shallowClone(),l=i.children,u=!1,d=[];for(let m of l){let p=n(m,s||u);p&&(d.push(p),p.parent=c,u=!0)}if(c.children=d,s||u)return c;if(Xg.includes(i.role)&&a)return c}let o=n(t);return new r(o,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}pruneToSerializedCharLimit(e){let t=this.root;if(!t)throw new Error("Cannot prune a11y tree with no root");let n=c=>c.role==="StaticText"||c.role==="ListMarker",o=new WeakMap,i=(c,l)=>{if(o.has(c))return o.get(c);let u=c.serialize({indentLevel:l,noChildren:!0});return o.set(c,u),u},a=(c,l,u)=>{let d=c.shallowClone();d.children=[];let m=i(c,l).length;if(u<=m)return{clone:d,used:m};if(n(c)||c.children.length===0)return{clone:d,used:m};let p=m,g=u-p;for(let h of c.children){let f=l+2,E=i(h,f).length;if(g<E)break;let{clone:b,used:C}=a(h,f,g);if(C>g)break;d.children.push(b),b.parent=d,p+=C,g-=C}return{clone:d,used:p}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function xz(r){return r.name?.value?`"${r.name.value}"`:r.role?.value&&r.role.value!=="none"&&r.role.value!=="generic"?`"${r.role.value}"`:`"${r.nodeId}"`}function Mz(r,e,t,n){return r.bounds.x===null||r.bounds.y===null||r.bounds.height===null||r.bounds.width===null||r.bounds.width===0||r.bounds.height===0?!0:r.bounds.x+r.bounds.width<e.leftBound||r.bounds.x>e.rightBound?($l({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport horizontally"),!1):r.bounds.y+r.bounds.height<e.upperBound||r.bounds.y>e.lowerBound?($l({logger:t,logKey:n,maxCount:5,intervalMs:3e3},{domNode:r,logKey:n},"Filtering out node since it is not in the viewport vertically"),!1):r.computedStyles.display==="none"?(t.debug({domNode:r},"Filtering out node since it has display none"),!1):!0}async function vR({node:r,parent:e,frameId:t,frameContext:n,axGraph:o,domGraph:i,inputNodeMap:a,flagNotActionableNodes:s,showZeroOpacityElements:c,filterByViewport:l,viewportDetails:u,useMPaths:d,importantProperties:m,allowedA11yIgnoreReasonsOverride:p,cdpClient:g,logger:h,callId:f}){if(!e&&r.parentId)throw new Error(`Got no parent for accessibility node ${r.nodeId}: ${JSON.stringify(r)}`);let E=($,he={})=>{},b=r.backendDOMNodeId,C=vz.includes(r.role?.value?.toLowerCase()??"");if(!C&&b===void 0)return E("Filtering out node since it doesn't exist in the DOM"),[];let R=b?i.backendIdToNode[b]:void 0;if(!C&&!R)try{let $=await z(g.send({method:"DOM.describeNode",params:{backendNodeId:b}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if($&&$.node.nodeName.toLowerCase()==="slot"&&$.node.distributedNodes?.length)h.debug({redirectedDomNode:R,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:$},"Redirecting node to assigned slot");else return E("Filtering out node since it doesn't exist in the DOM",{cdpResult:$}),[]}catch($){return E("Filtering out node since it doesn't exist in the DOM",{err:$}),[]}if(R&&e&&l&&u&&r.backendDOMNodeId&&!Mz(R,u,h,f))return R.momenticIgnored=!0,[];if(R&&R.computedStyles.display==="none")return R.momenticIgnored=!0,[];if(R&&R.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&R.tagName.toLowerCase()!=="input")return R.momenticIgnored=!0,[];if(c===!1)return R.momenticIgnored=!0,[]}let v=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",M=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",A=new Kg({domNode:R,id:parseInt(r.nodeId),role:r.role?.value||"",name:v,nameSources:r.name?.sources,content:M,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter($=>(p??bR).includes($.name)||ER.includes($.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+xz(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:m,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),I=n,k=a[t],W=t;if(R?.tagName.toLowerCase()==="iframe"&&R.ownedFrameId){let $=n.childFrames.find(Ce=>Ce.frameId===R.ownedFrameId),he=o[$?.frameId??""]?.root,se=a[$?.frameId??""];if($&&he&&se){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Ce=he;r.childIds=Ce.childIds,I=$,k=se,W=$.frameId}}let oe=R?.childrenBackendIds?.length??0,Te=(r.childIds??[]).filter($=>!!k.get(parseInt($))).length;if(oe>Te){let $=r.childIds?.map(se=>k.get(parseInt(se))).filter(Boolean).map(se=>se?.backendDOMNodeId).filter(se=>se!==void 0)??[],he=0;for(let se of R?.childrenBackendIds??[]){if($.includes(se)){he=(r.childIds?.findIndex(_e=>k.get(parseInt(_e))?.backendDOMNodeId===se)??0)+1;continue}let Ce=i.backendIdToNode[se];if(!Ce||Ce?.tagName.toLowerCase()!=="svg")continue;let Me=Math.floor(-1*Math.random()*1e7),Jt={nodeId:Me.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:se,frameId:W,role:{type:"string",value:"graphics-symbol"}};k.set(Me,Jt),r.childIds||(r.childIds=[]),r.childIds.splice(he,0,Me.toString()),he++}}if(r.childIds?.length===1&&R){let $=k.get(parseInt(r.childIds[0])),he=$?.role?.value,se=R.childrenBackendIds;if($&&he==="StaticText"&&se.length===1){let Ce=i.backendIdToNode[se[0]];if(Ce?.tagName?.toLowerCase()==="span"){let Me=Math.floor(-1*Math.random()*1e7).toString(),Jt={nodeId:Me,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Ce.backendNodeId,frameId:W,childIds:[$.nodeId]};$.parentId=Me,k.set(parseInt(Me),Jt),r.childIds=[Me]}}}for(let $ of r.childIds??[]){if(!$)continue;let he=k.get(parseInt($));if(!he)continue;let se=await vR({node:he,parent:A,domGraph:i,axGraph:o,frameId:W,frameContext:I,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:m,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});se.length&&(A.children=A.children.concat(se))}if(A.role==="StaticText"&&(A.children=[]),A.children.length===1&&A.children[0].role==="StaticText"){let $=A.name,he=A.children[0]?.name;($===he||!he)&&(A.children=[])}let At=[];for(let $=A.children.length-1;$>=0;$--){let he=A.children[$];if(he.role!=="StaticText"){At.push(he);continue}if($===0||A.children[$-1].role!=="StaticText"){At.push(he);continue}A.children[$-1].name+=he.name}if(A.children=At.reverse(),!A.isInteresting(m)&&r.parentId)return R&&(R.momenticIgnored=!0),A.children;for(let $ of A.children)$.parent=A;return Iz(A),R&&d&&$g(R,i),[A]}function AR({node:r,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,domGraph:i,useMPaths:a,selectorToNodeMap:s,iconKnowledgeBase:c,startId:l=1}){r.id=l,l+=1,e[r.id]=r,r.dataMomenticId?t[r.dataMomenticId]=r:Xg.includes(r.role);let u=r.backendNodeId,d=u!==void 0?i.backendIdToNode[u]:void 0;if(a&&d&&d.mPathSelector&&(s[d.mPathSelector]=r,r.mPathSelector=d.mPathSelector),c&&d&&d.tagName?.toLowerCase()==="svg"){let m=jg(d,i),p=m?c[m.hash]:void 0,g=p?p.description:void 0;p&&(r.properties["data-momentic-description"]=g)}for(let m of r.children)l=AR({node:m,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function wR({rawA11yGraph:r,domGraph:e,startingFrameId:t,logger:n,cdpClient:o,filterByViewport:i,showZeroOpacityElements:a,flagNotActionableNodes:s,importantProperties:c,viewportDetails:l,useMPaths:u,frameContext:d,iconKnowledgeBase:m,allowedA11yIgnoreReasonsOverride:p}){let g=t??"root",h=r[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=hz(),E=A=>{let I=A.allNodes.filter(W=>!W.ignoredReasons?.find(Te=>(p??bR).includes(Te.name))),k=new Map;return I.forEach(W=>{k.set(parseInt(W.nodeId),W)}),k},b={};Object.entries(r).forEach(([A,I])=>{b[A]=E(I)});let C=await vR({node:h,domGraph:e,parent:null,inputNodeMap:b,axGraph:r,frameId:g,frameContext:d,cdpClient:o,logger:n,callId:f,showZeroOpacityElements:a,importantProperties:c,filterByViewport:i,viewportDetails:l,useMPaths:u,flagNotActionableNodes:s,allowedA11yIgnoreReasonsOverride:p});if(C.length>1)throw new Error(`Something went horribly wrong processing the a11y tree, we got: ${JSON.stringify(C)}`);if(C.length===0)throw new Error("There are no accessible elements on this page or frame. Are you sure this website loads properly?");let R={},v={},M={};return AR({node:C[0],a11yIdNodeMap:R,dataMomenticIdMap:v,selectorToNodeMap:M,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:m}),new Yg(C[0],R,v,M)}function _z(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<TR&&!hr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(CR(a,n)){i.push(a);continue}return i.length?i.join(" "):null}if(e==="true")return!0;if(e==="false")return!1;try{let o=Number(e);if(!Number.isNaN(o))return o}catch{}return r==="src"&&e.includes("base64")?e.slice(0,e.indexOf("base64")+6)+"...":e.length>60?e.slice(0,50)+"...":e}function Pz(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||yz.includes(a);if((hr.relevantElementAttributes.includes(a)||RR(a,t))&&!c){let u=_z(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&fR.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of fR)if(e.attributes.style.includes(`position: ${a}`)){n=a;break}}n&&o.push(`position: ${n}`);let i;e.computedStyles.opacity&&e.computedStyles.opacity==="0"&&(i="opacity: 0"),i&&o.push(i);for(let a of t?.styles??[]){let s=a.split(":"),c=s[0]?.trim(),l=s[1]?.trim(),u=e.computedStyles[c??""];if(c!==void 0&&l!==void 0&&u!==void 0&&(l==="*"||u===l)){let d=e.computedStyles[c],m=`${c}: ${d}`;o.includes(m)||o.push(m)}}o.length>0&&(r.style=o.join("; "))}function Iz(r){let e=r.properties.class;if(typeof e=="string"&&e.includes("cm-content")){r.children.forEach((i,a)=>{i.properties["cm-line-number"]=`${a+1}`});return}if(typeof e=="string"&&e.includes("notion-page-content")){r.children.forEach((i,a)=>{i.properties["block-number"]=`${a+1}`}),r.children.length>0&&(r.children[r.children.length-1].properties.description="This is the last block in the document. Click here to add new text to the end.");return}if(r.tagName==="table"){let i=[],a=r.children.find(c=>c.tagName==="thead");if(a){let c=a.children.find(l=>l.tagName==="tr");if(c){let l=c.children.filter(u=>u.tagName==="th");l.forEach((u,d)=>{u.properties["col-index"]||(u.properties["col-index"]=d+1),i?.push(ft(u.name,100,!1))}),i?.length!==l.length&&(i=void 0)}}let s=0;for(let c of r.children)if(c.tagName==="tbody")for(let l=0;l<c.children.length;l++){let u=c.children[l];if(u.tagName!=="tr")continue;if(l===0&&!i?.length){let p=u.children.filter(g=>g.tagName==="th");if(p.length){if(i=p.map(g=>ft(g.name,100,!1)),i.length===p.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(p=>p.tagName==="td"||p.tagName==="th"),m=d.length===i?.length;d.forEach((p,g)=>{p.tagName!=="th"&&(p.properties["col-index"]||(p.properties["col-index"]=g+1),m&&(p.properties.col||(p.properties.col=i[g])))})}}}function Oz(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function CR(r,e){if(e&&xR(r,e))return!0;if(hr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(hr.alwaysInterestingClassNames.includes(r))return!0;for(let t of hr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function RR(r,e){if(e?.attributes?.includes(r))return!0;for(let t of e?.attributes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}function xR(r,e){if(e?.classes?.includes(r))return!0;for(let t of e?.classes??[])if(t.endsWith("*")){let n=t.slice(0,-1);if(r.startsWith(n))return!0}return!1}var bu=class r{constructor(e,t,n,o,i){this.session=e;this.logger=t;this.contextGetter=n;this.pageGetter=o;this.defaultTimeoutMs=i}cdpInitializingPromise=void 0;cdpCrashDetails=void 0;cdpFullyDead=!1;loadEventLogs=[];static async init({logger:e,contextGetter:t,pageGetter:n,defaultTimeoutMs:o}){let i=t(),a=n(),s,c;for(let u=0;u<2;u++)try{s=await z(i.newCDPSession(a),{milliseconds:o*u,fallback:()=>{throw new x("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await j(dt),c=d}if(!s)throw c;let l=new r(s,e,t,n,o);try{await z(l.registerHandlers(s),{milliseconds:o,message:`CDP handler registration timed out after ${o}ms`})}catch(u){throw l.cdpFullyDead=!0,new x("UserInfrastructureError",`Failed to initialize CDP client: ${u}`)}return l}async registerHandlers(e){e.on("Target.attachedToTarget",async()=>{try{await e.send("Runtime.runIfWaitingForDebugger")}catch(t){this.logger.warn({err:t},"Failed to run Runtime.runIfWaitingForDebugger")}}),e.on("Target.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},targetCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP session crashed, Momentic will likely not function correctly")}),e.on("Inspector.targetCrashed",t=>{this.cdpCrashDetails={...this.cdpCrashDetails??{},inspectorCrashDetails:JSON.stringify(t)},this.logger.error({payload:t},"CDP inspector session crashed, Momentic will likely not function correctly")}),e.on("Page.frameRequestedNavigation",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Frame requested navigation: ${JSON.stringify(t)}`)}),e.on("Page.navigatedWithinDocument",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Navigated within document: ${JSON.stringify(t)}`)}),e.on("Page.lifecycleEvent",t=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page lifecycle event: ${JSON.stringify(t)}`)}),e.on("Page.loadEventFired",()=>{this.loadEventLogs.push(`[${new Date(Date.now()).toLocaleString("en-US",{timeZone:"America/Los_Angeles"})}] Page load event fired`)}),await Promise.all([e.send("Accessibility.enable"),e.send("Page.enable"),e.send("DOM.enable"),e.send("Overlay.enable"),e.send("DOMSnapshot.enable"),e.send("CSS.enable")])}async send({method:e,params:t,timeout:n=this.defaultTimeoutMs,timeoutMsg:o}){for(;this.cdpInitializingPromise;)await z(this.cdpInitializingPromise,{milliseconds:n});if(this.cdpCrashDetails){if(this.cdpFullyDead)throw new x("UserInfrastructureError",`The browser inspector session encountered a critical crash: ${JSON.stringify(this.cdpCrashDetails)}`);this.logger.warn(`Detected crashed CDP client before method ${e}, reinitializing before proceeding...`),await this.reinitialize()}try{return await z(this.session.send(e,t),{milliseconds:n,message:o??`Chrome command ${e} timed out after ${n}ms. This is likely an infrastructure issue caused by a lack of compute resources or a crash at the browser level.`})}catch(i){throw["Internal error","Target crashed"].some(a=>i.message.includes(a))&&!this.cdpInitializingPromise&&(this.logger.warn({err:i},`CDP crashed during CDP method ${e}, re-initializing client`),await this.reinitialize()),i}}async createRawCDPSession(e=this.defaultTimeoutMs){let t=e,n=this.pageGetter(),o=await z(this.contextGetter().newCDPSession(n),{milliseconds:t,fallback:()=>{throw this.logger.error(`Failed to initialize CDP session within the page load timeout (${n.url()})`),new x("UserInfrastructureError",`Failed to initialize CDP session within the page load timeout (${n.url()})`)}});return this.logger.debug(`Created new CDP session for ${n.url()}`),o}async reinitialize(e=this.defaultTimeoutMs){await this.cdpInitializingPromise,this.cdpInitializingPromise=(async()=>{try{let t=this.session;this.session=await this.createRawCDPSession(e),await z(this.registerHandlers(this.session),{milliseconds:e,message:`Failed to register CDP handlers within ${e}ms`}),this.logger.debug("Successfully reinitialized and attached new handlers to CDP session");try{await z(t.detach(),{milliseconds:1e3})}catch(n){this.logger.warn({err:n},"Failed to detach old CDP session after reinitialization, continuing...")}this.cdpCrashDetails=void 0,this.cdpFullyDead=!1}catch(t){this.cdpCrashDetails={...this.cdpCrashDetails??{},reinitializeError:`${t}`},this.cdpFullyDead=!0}finally{this.cdpInitializingPromise=void 0}})(),await this.cdpInitializingPromise}on(e,t){return this.session.on(e,t),this.session}off(e,t){return this.session.off(e,t),this.session}addListener(e,t){return this.session.addListener(e,t),this.session}removeListener(e,t){return this.session.removeListener(e,t),this.session}};var ki="<empty>";function Lz(r){return r.includes("doubleclick.net")||r.includes("googletagmanager.com")||r.includes("googlesyndication.com")||r.includes("s.amazon-adsystem.com")||r.includes("smartadserver.com")||r.includes("omnitagjs.com")||r.includes("x.adroll.com")}function PR(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||Lz(r.url)}async function Nz(r,e){let t=await r.send({timeout:re,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:re,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:re,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Ui({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:Di,method:"Page.getFrameTree",params:{}}),r.send({timeout:Di,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,m)=>{if(PR(d.frame))return null;try{return await IR({cdpClient:r,rawFrameTree:d,indices:[m],parent:n,warnings:o,logger:t})}catch(p){return o.push(`Failed to get child frame: ${p}`),null}}),u=await Promise.all(l);return n.childFrames=u.filter(d=>d!==null),o.length&&t?.warn({warnings:o},"Got warnings when fetching frame tree"),n}async function IR({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await Nz(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Wn(c,g);h&&(u.push(`${g}=${JSON.stringify(h)}`),g==="src"&&(l=h))}let d={type:"frame",cdpFrame:e.frame,url:e.frame.url,frameId:a,locationData:{indices:t,attributeSelectors:u},src:l,childFrames:[],parent:n,domNode:s},p=(e.childFrames??[]).map(async(g,h)=>{if(PR(g.frame))return null;try{return await IR({cdpClient:r,rawFrameTree:g,indices:[...t,h],parent:d,warnings:o,logger:i})}catch(f){return o.push(`Failed to get child frame (child ${h} of frame with url ${e.frame.url}): ${f}`),null}});return d.childFrames=(await Promise.all(p)).filter(g=>g!==null),d}async function Dz(r){try{return await r.owner().count()===1}catch{return!1}}async function kz(r){try{return await r.count()===1}catch{return!1}}async function Yr(r,e){let t=[],n=r;for(;n.parent.type==="frame";)t.push(n.parent),n=n.parent;t.reverse();let o=e,i=[];for(let l of t){let u=!1;for(let d of[...l.locationData.attributeSelectors,ki]){let m=o.frameLocator(d===ki?"iframe":`iframe[${d}]`);if(await Dz(m)){u=!0,o=m,i.push(d);break}}if(!u)throw new x("ActionFailureError",`Failed to find a unique attribute to identify intermediate frame with url matching '${l.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`)}let a;for(let l of[...r.locationData.attributeSelectors,ki]){let u=o.locator(l===ki?"iframe":`iframe[${l}]`);if(await kz(u)){a=u,i.push(l);break}}if(!a)throw new x("ActionFailureError",`Failed to find a unique attribute to identify target frame with url matching '${r.url}'. Please attach a unique 'id', 'name', 'title', or 'src' attribute to the frame.`);let s=await a.evaluateHandle(l=>l,{timeout:ne}),c=await s.asElement().contentFrame();if(!c)throw new x("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function MR(r,e){let t=[...r],n=[];for(;t.length;){let o=t.shift();e(o)&&n.push(o),t.push(...o.childFrames)}return n}async function OR({page:r,frameTree:e,cache:t}){let n,o=e.childFrames,i=[];if(t.mPathSelectorTokens.length){let s=o;for(let u=0;u<t.mPathSelectorTokens.length-1;u++){let d=t.mPathSelectorTokens[u];d===ki?s=s.length===1?s[0].childFrames:[]:s=s.filter(m=>m.locationData.attributeSelectors.includes(d)).map(m=>m.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===ki?c=s:c=s.filter(u=>u.locationData.attributeSelectors.includes(l)),c.length===1)return n=c[0],i.push(`Found unique frame with mpath ${t.mPathSelectorTokens.join(" > ")}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with mpath ${t.mPathSelectorTokens.join(" > ")}`)}if(t.frameSrcRegex){let s=new RegExp(t.frameSrcRegex),c=MR(o,l=>!!l.src&&s.test(l.src));if(c.length===1)return n=c[0],i.push(`Found unique frame with src regex ${t.frameSrcRegex}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with src regex ${t.frameSrcRegex}`),t.frameSrcRegex=void 0}if(t.frameUrlRegex){let s=new RegExp(t.frameUrlRegex),c=MR(o,l=>!!l.url&&s.test(l.url));if(c.length===1)return n=c[0],i.push(`Found unique frame with url regex ${t.frameUrlRegex}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};i.push(`Found ${c.length} frames with url regex ${t.frameUrlRegex}`),t.frameUrlRegex=void 0}let a=o;for(let s=0;s<t.indices.length-1;s++)a=a[t.indices[s]]?.childFrames??[];if(n=a[t.indices[t.indices.length-1]],n)return i.push(`Found unique frame with indices ${t.indices.join(" > ")}`),{resolution:{type:"auto",frame:(await Yr(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Nr("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function Eu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Jg(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function LR(r){let e=Jg(r),t=r.src??"",n=r.url??"",o=[],i=[],a=[...e.childFrames];for(;a.length;){let s=a.shift();s.src&&o.push(s.src),s.url&&i.push(s.url),a.push(...s.childFrames)}return{srcs:o,urls:i,desiredSrc:t,desiredUrl:n}}function NR(r){return r.type==="auto"?{type:"auto",frameId:r.handle.frameId,url:r.handle.url,src:r.handle.src??"",mPathSelectorTokens:r.mPathSelectorTokens.join(" > ")}:{type:"url",url:r.url}}async function DR({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await Uz({frameElementHandle:n,logger:e,signal:t})}catch(o){n?e.warn({err:o},"Failed to scroll iframe into view, trying with raw JS"):e.warn("Failed to scroll iframe into view - no frame element")}finally{await n?.dispose()}}async function Uz({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox();await ys({promiseGenerator:async()=>r.evaluate(async i=>{let a=i.scrollTop;i.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(c=>setTimeout(c,250));let s=Date.now();for(;Date.now()-s<1e3;){let c=i.scrollTop;if(c===a)break;a=c,await new Promise(l=>setTimeout(l,250))}}),timeoutMs:Ee,codePath:"scrollIframeIntoView",signal:t}),e.info({oldBb:n,newBb:await r.boundingBox()},"Successfully scrolled iframe into view")}import{create as Fz,windowedFiniteBatchScheduler as Bz}from"@yornaath/batshit";import{reduce as zz}from"lodash-es";var Hz=100,Gz=2e3;function kR(r){return Fz({fetcher:async t=>{r(zz(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:Bz({windowMs:Gz,maxBatchSize:Hz})})}async function UR({event:r,transformer:e,enricher:t,frame:n,lastScreenshotForRecording:o,logger:i}){let{warnings:a,error:s,properties:c}=r.target;if(s){i.error({error:s,warnings:a},"Error while capturing passive click");return}if(a.length&&i.warn({warnings:a},"Warnings while capturing passive click"),!c)return;let l=n.parentFrame()?n.url():void 0,d=n.page().frames().map(g=>g.url());i.debug({frameUrl:l,...r},"Passive click event captured on element");let m,p;if(l)try{let g=await n.frameElement();m=await z(g?.boundingBox(),{milliseconds:re})??void 0;let h=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)p={type:"url",url:`/${h.urlRegex}/`};else throw new Error(`Got no url regex options: ${JSON.stringify(h)}`)}catch(g){i.warn({err:g},"Failed to construct iframe details for recorded action, using hardcoded URL only"),p={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:p,frameBoundingBox:m})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as Xr}from"crypto";import Vz from"js-beautify";var Wz=["Dead"],Tu=class{recordedSteps=new Map;callbacks;signal;generator;testId;orgId;nextStepOffset=0;logger;constructor({signal:e,callbacks:t,generator:n,testId:o,orgId:i,logger:a}){this.signal=e,this.logger=a,this.testId=o,this.orgId=i,this.callbacks={onStepRecorded:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onStepRecorded(s,c)},onActionReceived:(s,c)=>{this.recordedSteps.set(c,{step:s}),t.onActionReceived?.(s,c)}},this.generator=n}reserveIndexForCommand(e){let t=this.nextStepOffset;return this.recordedSteps.set(t,{step:{id:Xr(),type:"PRESET_ACTION",command:tn(e)}}),this.nextStepOffset++,t}async recordElementAction(e){let{type:t,target:n,frameConfig:o}=e;if(this.signal.aborted){this.logger.debug("Transformer was already cleaned up, ignoring click...");return}let i,a,s=n.properties.attributes.nodeOnlySerializedHtml.trim(),c=s,l;switch(e.frameConfig?e.frameBoundingBox?l={x:e.frameBoundingBox.x+n.properties.boundingBox.x,y:e.frameBoundingBox.y+n.properties.boundingBox.y,width:n.properties.boundingBox.width,height:n.properties.boundingBox.height}:this.logger.warn(e,"No frame bounding box found, refusing to write bounding box"):l=n.properties.boundingBox,t){case"CLICK":{i="CLICK";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}}}};break}case"SELECT":{i="SELECT_OPTION";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,type:"SELECT_OPTION",iframeUrl:o?.url,target:{type:"description",elementDescriptor:c},cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),boundingBox:l}},choice:{type:"VALUE",value:e.selectedValue??"Unknown option"}}};break}case"MOUSE_DRAG":{i="MOUSE_DRAG";let h=tn(i);a={id:Xr(),type:"PRESET_ACTION",command:{...h,target:{type:"description",elementDescriptor:c},deltaX:e.deltaX.toString(),deltaY:e.deltaY.toString(),iframeUrl:o?.url,cache:{target:{id:-1,...n.properties.attributes,targetSource:"RECORDING",targetUpdateTime:new Date().toUTCString(),targetUpdateLoggerTags:be(this.logger),boundingBox:l}}}};break}default:throw new Error(`Unknown action type: ${t}`)}let u;e.offset===void 0?(u=this.nextStepOffset,this.nextStepOffset++):u=e.offset,this.callbacks.onActionReceived?.(a,u);let d=e.target.browserState;try{d=Vz.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=TC(d,"data-momentic-interacted",4e4)}catch{}let m;try{m=(await this.generator.getReverseMappedDescription({target:d,screenshot:e.screenshotBase64?`data:image/jpeg;base64,${e.screenshotBase64}`:void 0,boundingBox:n.properties.boundingBox},{disableCache:!1,loggerTags:{testId:this.testId,...be(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),m=s}let p=this.recordedSteps.get(u)?.step??a,g=p?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:m},this.callbacks.onStepRecorded({...p,command:g},u)):this.logger.warn("Could not find existing command to update after description mapping")}recordKeystroke(e){let{key:t,combinable:n}=e;if(Wz.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=tn("TYPE");i={id:Xr(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=tn("PRESS");i={id:Xr(),type:"PRESET_ACTION",command:{...d,value:t}}}let a,s=this.nextStepOffset-1,c=this.recordedSteps.get(s),l=c?.step,u=l?.command;if(n){if(u?.type===i.command.type){let d=u.value,m=i.command.value;i={id:Xr(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${m}`:`${d}${m}`}},a=s}else if(u?.type==="CLICK"&&i.command.type==="TYPE")l.command={...i.command,target:u.target,cache:u.cache},i=c.step,a=s;else if(u?.type==="TYPE"&&i.command.type==="PRESS"&&i.command.value==="Backspace"){let d=u.value;i={id:Xr(),type:"PRESET_ACTION",command:{...u,value:d.slice(0,d.length-1)}},a=s}}a===void 0&&(a=this.nextStepOffset,this.nextStepOffset++),this.callbacks.onStepRecorded(i,a)}recordScroll(e){if(this.signal.aborted)return;let t=()=>{let{deltaY:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_DOWN"&&s.deltaY?(i+=s.deltaY,c=a):s?.type==="SCROLL_UP"&&s.deltaY?(i-=s.deltaY,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_DOWN":"SCROLL_UP",u=tn(l);u.deltaY=Math.abs(i);let d={id:Xr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},n=()=>{let{deltaX:i}=e;if(!i)return;let a=this.nextStepOffset-1,s=this.recordedSteps.get(a)?.step.command,c;s?.type==="SCROLL_RIGHT"&&s.deltaX?(i+=s.deltaX,c=a):s?.type==="SCROLL_LEFT"&&s.deltaX?(i-=s.deltaX,c=a):(c=this.nextStepOffset,this.nextStepOffset++);let l=i>0?"SCROLL_RIGHT":"SCROLL_LEFT",u=tn(l);u.deltaX=Math.abs(i);let d={id:Xr(),type:"PRESET_ACTION",command:u};this.callbacks.onStepRecorded(d,c)},o=this.recordedSteps.get(this.nextStepOffset-1);o?.step.command.type==="SCROLL_LEFT"||o?.step.command.type==="SCROLL_RIGHT"?(n(),e.deltaY>=20&&t()):(t(),e.deltaX>=20&&n())}};import{z as Qg}from"zod";var Twe=Qg.object({type:Qg.literal("url"),url:Qg.string()});var vu=class{smartWaitingTimeoutMs;pageLoadTimeoutMs;allowPartialAccessibilityTree;logger;cdpClient;pageGetter;abortSignalGetter;userControlledBrowserSettings;enricher;iconKnowledgeBase;computedStylesToFetch=["display","opacity","visibility","height","position","background-image"];activeFrameCache;activeFrameConfig;lastA11yIdToNodeMap={};lastDataMomenticIdToNodeMap={};lastSelectorToNodeMap={};lastA11yTreeRoot;lastDomGraph;allowedA11yIgnoreReasonsOverride;constructor({smartWaitingTimeoutMs:e,pageLoadTimeoutMs:t,allowPartialAccessibilityTree:n,logger:o,cdpClient:i,pageGetter:a,abortSignalGetter:s,enricher:c,iconKnowledgeBase:l,userBrowserSettings:u,allowedA11yIgnoreReasonsOverride:d}){if(this.smartWaitingTimeoutMs=e,this.pageLoadTimeoutMs=t,this.allowPartialAccessibilityTree=n,this.logger=o,this.cdpClient=i,this.pageGetter=a,this.abortSignalGetter=s,this.enricher=c,this.iconKnowledgeBase=l,this.userControlledBrowserSettings=u,this.allowedA11yIgnoreReasonsOverride=d,this.userControlledBrowserSettings.importantStyles)for(let m of this.userControlledBrowserSettings.importantStyles){let p=m.split(":");if(p.length!==2){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}let g=p[0]?.trim(),h=p[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:m},"Invalid style property passed to importantStyles");continue}this.computedStylesToFetch.includes(g)||this.computedStylesToFetch.push(g)}}get frameConfig(){return this.activeFrameConfig}get domGraph(){return this.lastDomGraph}get selectorToNodeMap(){return this.lastSelectorToNodeMap}get dataMomenticIdToNodeMap(){return this.lastDataMomenticIdToNodeMap}get a11yIdToNodeMap(){return this.lastA11yIdToNodeMap}get a11yTreeRoot(){return this.lastA11yTreeRoot}setActiveFrameConfig(e){e?(this.activeFrameConfig=e,this.activeFrameCache=void 0):(this.activeFrameConfig=void 0,this.activeFrameCache=void 0)}reset(){this.activeFrameCache=void 0,this.activeFrameConfig=void 0,this.lastA11yIdToNodeMap={},this.lastDataMomenticIdToNodeMap={},this.lastSelectorToNodeMap={},this.lastA11yTreeRoot=void 0,this.lastDomGraph=void 0}saveAutoFrameCacheDetails(e){if(!this.activeFrameConfig||this.activeFrameConfig.type!=="auto"||!this.userControlledBrowserSettings.autoExpandIframes)return;let t={...e,indices:this.activeFrameConfig.handle.locationData.indices,mPathSelectorTokens:this.activeFrameConfig.mPathSelectorTokens};return this.constructIframeRegexAsync(this.activeFrameConfig.handle,t),t}async getAutoFrameDetailsFromHandle(e){let t=this.pageGetter(),n=Jg(e),{frame:o,mPathSelectorTokens:i}=await Yr(e,t),a={indices:e.locationData.indices,mPathSelectorTokens:i};return this.constructIframeRegexAsync(e,a),{cache:a,config:{type:"auto",frame:o,handle:e,mPathSelectorTokens:i,frameTree:n,cache:a}}}async resolveAutoFrameCache(e){let t=this.pageGetter(),n=await Ui({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await OR({page:t,frameTree:n,cache:e});return this.logger.info({logs:i},"Resolved auto frame cache"),{...o,cache:e}}async resolveActiveFrameConfig({logger:e=this.logger,signal:t=this.abortSignalGetter()}){if(!this.frameConfig)return null;if(this.activeFrameCache)if(Eu(this.frameConfig)!==this.activeFrameCache.frameIdentifierStringified)this.activeFrameCache=void 0;else if(this.activeFrameCache.frame&&"isDetached"in this.activeFrameCache.frame&&this.activeFrameCache.frame.isDetached())this.activeFrameCache=void 0;else return this.activeFrameCache;let n;return this.frameConfig.type==="url"?n=await this.resolveUrlMatcherFrameConfig({config:this.frameConfig,logger:e,signal:t}):n={source:"auto",frame:this.frameConfig.frame,handle:this.frameConfig.handle,frameIdentifierStringified:Eu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await DR({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Ui({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[z(n.evaluate(e,t),{milliseconds:Ee})],a=Array.from(o.childFrames);for(;a.length>0;){let c=a.shift(),l=c.url;l==="about:blank"||l.startsWith("chrome-error://")||(a.push(...c.childFrames),i.push(Yr(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Ee})).catch(u=>(this.logger.warn({err:u,frameUrl:c.url},"Failed to evaluate function in frame"),"MOMENTIC_FRAME_EVAL_ERROR"))))}return(await Promise.all(i)).filter(c=>c!=="MOMENTIC_FRAME_EVAL_ERROR")}async getAllChildFrameUrls(){let e=this.pageGetter(),t=await Ui({cdpClient:this.cdpClient,page:e,logger:this.logger}),n=Array.from(t.childFrames),o=[];for(;n.length>0;){let i=n.shift();n.push(...i.childFrames),o.push(i.src??i.url)}return o}async getDomGraph({devicePixelRatio:e,signal:t,logger:n}){return this.getDOMTree({devicePixelRatio:e??1,signal:t,logger:n??this.logger})}async getA11yTree(e){let t={},n=e.logger??this.logger,o=e.abortSignal??this.abortSignalGetter(),i=this.pageGetter(),a,s,c=null;if(this.frameConfig?.type==="url"){if(a=await fr({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new x("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await fr({fn:()=>Ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),codePath:"getMomenticFrameTree",logObject:t,signal:o,logger:n}),c=null):(s={type:"root",page:i,childFrames:[]},c=null);await fr({fn:async()=>this.addMomenticIds({rootPage:i,childFrames:s.childFrames,frameFilter:a?.frame,logger:n}),codePath:"addIdsToElement",logObject:t,signal:o,logger:n});let l=await fr({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await fr({fn:()=>this.getRawA11yGraph({cdpClient:this.cdpClient,frameId:c,childFrames:s.childFrames,logTimings:t,logger:n,signal:o}),codePath:"totalA11yFetch",logObject:t,signal:o,logger:n}),{tree:d}=await fr({fn:()=>this.composeA11yDomGraph({opts:e,a11yGraph:u,domGraph:l,startingFrameId:c,frameContext:s,logger:n,iconKnowledgeBase:this.iconKnowledgeBase,showZeroOpacityElements:e.showZeroOpacityElements,flagNotActionableNodes:e.flagNotActionableNodes}),codePath:"a11yProcess",logObject:t,signal:o,logger:n});return Object.values(t).some(m=>m>750)&&n.warn({logTimings:t},"A11y tree fetch component took a long time"),this.lastA11yIdToNodeMap=d.a11yIdNodeMap,this.lastDataMomenticIdToNodeMap=d.dataMomenticIdMap,this.lastA11yTreeRoot=d.root,this.lastDomGraph=l,this.lastSelectorToNodeMap=d.selectorToNodeMap,d}async fetchA11yTreeForRecording(e,t){if(await this.getA11yTree({devicePixelRatio:e,abortSignal:t,logger:On,filterByViewport:!1,flagNotActionableNodes:!1}),Math.random()<.1){let n=this.lastA11yTreeRoot?.serialize();this.logger.debug({tree:n&&n.length>4e5?"REDACTED_DUE_TO_SIZE":n},"Refreshed a11y tree during recording")}}async getLocatorFromA11yNode({page:e,root:t,node:n}){if(n.backendNodeId===void 0)throw new Error(`Node with a11y id ${n.id} has no backend node ID: ${n.getNodeOnlySerializedForm()}`);if(this.userControlledBrowserSettings.visualActions){let o=this.domGraph?.backendIdToNode[n.backendNodeId];if(!o)throw new Error(`Could not find DOM node for backend node ID ${n.backendNodeId}`);let i=pR({node:o,domGraph:this.domGraph});return gR(e,i)}else return this.getLocatorFromBackendId(t,n.backendNodeId)}async getLocatorFromBackendId(e,t){let n=await this.cdpClient.send({method:"DOM.resolveNode",params:{backendNodeId:t},timeout:Ee});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await hR(this.cdpClient,n.object.objectId)}catch(i){throw this.logger.debug({err:i,object:JSON.stringify(n.object)},"Failed to get ID attribute"),i}return e.locator(Rr(o))}getNodeUsingMPathSelector(e){let t=this.selectorToNodeMap[e];if(t)return t;let n=e.split(" > "),o="";for(let i=n.length-1;i>=0;i--){let a=n.slice(i).join(" > ");if(this.selectorToNodeMap[a]){o=a;break}}this.logger.warn({selectorMapSize:Object.keys(this.selectorToNodeMap).length,selector:e,closestSelector:o},"Could not find a11y node using mpath selector")}async resolveUrlMatcherFrameConfig({config:e,signal:t=this.abortSignalGetter(),logger:n=this.logger}){let o=Date.now(),i,a,s,c=0;for(;Date.now()-o<this.smartWaitingTimeoutMs;)try{i=await Ui({cdpClient:this.cdpClient,page:this.pageGetter(),logger:n}),a=await this.getMatchingFrameByUrlWithCdp(i,e),n.info({frameId:a.handle.frameId,url:a.handle.url,src:a.handle.src,locationData:a.handle.locationData},`Found matching frame using ${a.matchType}`);break}catch(l){if(s=l,l instanceof x&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await j(dt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Eu(e),cacheTime:Date.now(),frameTree:i,mPathSelectorTokens:[]};throw s}async getMatchingFrameByUrlWithCdp(e,t){let n=t.url,o=this.pageGetter(),i=Array.from(e.childFrames),a=[];for(;i.length>0;){let s=i.shift(),c=s.domNode;i.push(...s.childFrames);let l=Wn(c.attributes??[],"src"),u=c.contentDocument?.documentURL;if(!l&&!u){this.logger.debug("Skipping frame with no URL or src");continue}for(let d of[l,u])if(d){if(n.startsWith("/")&&n.endsWith("/")){if(new RegExp(n.slice(1,-1)).test(d)){a.push({handle:s,matchType:"regex",...await Yr(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await Yr(s,o)});break}}}if(a.length===1){let s=a[0];return this.userControlledBrowserSettings.autoExpandIframes||(s.handle.childFrames=[]),s}else throw a.length>1?new Error(`Found multiple frames with src matching '${n}'. Please use a more specific selector.`):new x("ActionFailureError",`Failed to find frame with src matching: ${n}`)}async composeA11yDomGraph({opts:e,a11yGraph:t,domGraph:n,startingFrameId:o,frameContext:i,logger:a,iconKnowledgeBase:s,showZeroOpacityElements:c,flagNotActionableNodes:l}){let u=await wR({rawA11yGraph:t,startingFrameId:o,frameContext:i,domGraph:n,logger:a,cdpClient:this.cdpClient,showZeroOpacityElements:c,flagNotActionableNodes:l,filterByViewport:e.filterByViewport,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles},viewportDetails:void 0,iconKnowledgeBase:s,useMPaths:this.userControlledBrowserSettings.visualActions,allowedA11yIgnoreReasonsOverride:this.allowedA11yIgnoreReasonsOverride});if(!u||!u.root)throw new Error("Accessibility tree appears empty");return{tree:u}}async addMomenticIds({rootPage:e,childFrames:t,frameFilter:n,logger:o}){if(this.userControlledBrowserSettings.visualActions)return;let i=await this.addMomenticIdsHelper(n??e,1);if(!this.userControlledBrowserSettings.autoExpandIframes||n)return;let a=Array.from(t),s=[];for(;a.length>0;){let c=a.shift();a.push(...c.childFrames);let l=async()=>{try{let{frame:u}=await Yr(c,e);i=await this.addMomenticIdsHelper(u,i)}catch(u){c.url!=="about:blank"&&o.warn({err:u},"Error adding momentic IDs to child frame, continuing...")}};s.push(l())}await Promise.all(s)}async addMomenticIdsHelper(e,t){if(this.userControlledBrowserSettings.visualActions)return t;let n=this.logger;return await st({root:e,fn:i=>window.addIdsToElement?.(document.body,i),arg:t,timeout:Ee,waitForPageLoad:async()=>{try{await e.waitForLoadState("domcontentloaded",{timeout:this.smartWaitingTimeoutMs})}catch(i){n.warn({err:i},"Error loading frame root adding momentic ids, continuing...")}},codePath:"adding Momentic element IDs to the page"})??t}getPageDomain(e){try{let t=new URL(e);if(!t.hostname)return null;let n=t.hostname.split("."),o=n.length>2?n.slice(-2).join("."):t.hostname;return`${t.protocol}//${o}`}catch{return null}}async decideChildFrameUnrollEligibility({logger:e,warnings:t,handle:n}){try{let{shouldUnroll:o,reason:i}=await this.decideChildFrameUnrollEligibilityHelper({domNode:n.domNode});return{shouldUnroll:o,reason:i}}catch(o){if(o.message.includes("Could not compute box model"))return{shouldUnroll:!1};let i=`Got error when determining whether to filter frame ${n.frameId} with url ${n.url}, allowing it to be fetched: ${o}`;return t?.push(i),e?.warn({err:o},i),{shouldUnroll:!0}}}async decideChildFrameUnrollEligibilityHelper({domNode:e}){let t=e.attributes??[];if(Wn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Wn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:re,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:re,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:re,method:"CSS.getComputedStyleForNode",params:{nodeId:e.nodeId}})]);if(!o.model||!o.model.height||!o.model.width)return{shouldUnroll:!1,reason:"no bounding box"};if(o.model.height<10||o.model.width<10)return{shouldUnroll:!1,reason:"small bounding box"};for(let a of i.computedStyle){if(a.name==="display"&&a.value==="none")return{shouldUnroll:!1,reason:"display: none"};if(a.name==="visibility"&&a.value==="hidden")return{shouldUnroll:!1,reason:"visibility: hidden"};if(a.name==="opacity"&&a.value==="0")return{shouldUnroll:!1,reason:"opacity: 0"}}return{shouldUnroll:!0}}async getRawA11yGraph({cdpClient:e,frameId:t,childFrames:n,logTimings:o,logger:i=this.logger,signal:a=this.abortSignalGetter()}){let s=[];try{await this.pageGetter().waitForLoadState("load",{timeout:this.pageLoadTimeoutMs})}catch(p){i.warn({err:p},"Failed to wait for page load event before a11y tree fetch, attempting to continue without it..."),await this.cdpClient.reinitialize()}let c,l;for(let p=0;p<3;p++)try{l=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:t,timeoutMs:this.pageLoadTimeoutMs,logTimings:o}),codePath:"a11y-tree-fetch-root",logObject:o,logger:i});break}catch(g){c=g,i.warn({err:g},"Reinitializing CDP client before retrying a11y graph fetch"),await this.cdpClient.reinitialize()}if(!l)throw new Error(`Failed to fetch accessibility tree for root page: ${c}`);let u={};if(u[t??"root"]=l,!this.userControlledBrowserSettings.autoExpandIframes)return u;let d=Array.from(n),m=[];for(;d.length>0;){let p=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:p,warnings:s});if(!h)continue}catch(h){if(h.message.includes("Could not compute box model"))continue;s.push(`Got error when determining whether to filter frame ${p.frameId} with url ${p.url}, allowing it to be fetched: ${h}`)}d.push(...p.childFrames);let g=async()=>{try{let h=await fr({fn:()=>this.getRawA11yTreeForFrame({frameId:p.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${p.frameId}`,logObject:o,logger:i});u[p.frameId]=h}catch(h){i.warn({err:h,url:p.url,src:p.src},`Error getting raw a11y tree for child frame ${p.frameId}, continuing...`)}};m.push(g())}return await Promise.all(m),s.length>0&&this.logger.warn({warnings:s},"Got warnings when fetching the raw a11y graph"),u}async getRawA11yTreeForFrame({frameId:e,timeoutMs:t,logTimings:n}){let o;if(this.allowPartialAccessibilityTree)o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getFullAXTree",params:{frameId:e??void 0},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes;else{let a=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Ee}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await fr({fn:()=>this.cdpClient.send({method:"Accessibility.queryAXTree",params:{backendNodeId:a},timeout:t,timeoutMsg:`Fetching the document tree took over ${t}ms. This usually indicates that the current page is too large to be loaded at once, or your machine is severely resource constrained.`}),codePath:"cdp-query-ax-tree",logObject:n,logger:this.logger})).nodes}if(!o||o.length<=1)throw new Error("Document is entirely empty");return{root:o[0],allNodes:o}}async getDOMTree({devicePixelRatio:e,signal:t,logger:n}){let o,i=0,a;for(;!o&&i<3;)try{if(o=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:this.computedStylesToFetch},timeout:re}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await j(dt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new x("UserInfrastructureError",`Received an empty HTML snapshot from the browser. This usually indicates the page has crashed due to resource consumption issues or hanging client-side JavaScript code: ${a?.message}`);return mR({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=LR(e);(async()=>{try{let o=await this.enricher?.constructIframeRegex(n);o?.srcRegex&&(t.frameSrcRegex=o.srcRegex),o?.urlRegex&&(t.frameUrlRegex=o.urlRegex),this.logger.debug({result:o,params:n},"Constructed iframe regex for cache")}catch(o){this.logger.warn({err:o},"Failed to construct iframe regex, skipping...")}})()}};var ws=class r{static USER_AGENT=mu;abortSignal=void 0;contextInitialized=!1;cleanedUp=!1;browser;context;properties;page;userControlledBrowserSettings;pageLoadPromises={};lastTabChangeEventTimeout=void 0;pageLoadAbortControllers=new Set;pageLoadAbortListenerCleanup;clientCallbacks;harBatcher;iconKnowledgeBase;cdpClient;debugData={logsPerPage:[]};recentFrameNavigations={};requestRecorders={};mocks={};customHeaders=[];enricher;storage;logger;stateManager;transformer;lastScreenshotForRecording=void 0;originsVisited=new Set;viewport;onVideoPageChange;baseUrl;constructor({storage:e,enricher:t,browser:n,context:o,page:i,baseUrl:a,logger:s,userBrowserSettings:c,viewport:l,properties:u,clientCallbacks:d,iconKnowledgeBase:m,onVideoPageChange:p}){OE(c),this.storage=e,this.enricher=t,this.browser=n,this.context=o,this.page=i,this.baseUrl=a,this.logger=s,this.userControlledBrowserSettings=c,this.viewport=l,this.properties=u,this.clientCallbacks=d,this.iconKnowledgeBase=m,this.onVideoPageChange=p}registerAbortSignal(e){if(this.pageLoadAbortListenerCleanup&&(this.pageLoadAbortListenerCleanup(),this.pageLoadAbortListenerCleanup=void 0),this.abortSignal=e,!this.abortSignal)return;let t=()=>{for(let n of this.pageLoadAbortControllers)n.abort();this.pageLoadAbortControllers.clear()};if(this.abortSignal.aborted){t();return}this.abortSignal.addEventListener("abort",t),this.pageLoadAbortListenerCleanup=()=>{this.abortSignal?.removeEventListener("abort",t)}}async initialize({grantPermissions:e,permissionsToGrant:t,runInitScripts:n,timingRecorder:o}){if(this.contextInitialized)return;let i={[uu]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(QC(t))),a.push(this.context.addInitScript({content:`${Sg.htmlUtilsLibJs}
4337
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Bg(i,this.userBrowserSettings.disableFullStory)}),this.exposeRecordingBindings());let s=d=>this.handleNewPageEvent(d);this.context.on("page",s),this.handleNewPageEventHelper(this.page),this.context.on("close",()=>{this.context.off("page",s)});let c=!1;if(n){let d=async()=>{let m=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${Sg.htmlUtilsLibJs}
4338
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Bg(i,this.userBrowserSettings.disableFullStory)})])}catch(p){if(p instanceof Error&&p.message.includes("Content Security Policy"))this.logger.warn({err:p},"Content Security Policy error from adding Momentic scripts, reloading page instead"),c=!0;else throw p}(o??{})["add-init-scripts"]=Date.now()-m};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&Qz()==="darwin"&&$z("system_profiler SPDisplaysDataType").toString().includes("Retina"))w.warn("[DEV] Setting device pixel ratio to 2 in local dev since a Retina display was detected"),this.properties.systemDevicePixelRatio=2;else{let d=async()=>{let m=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-m};a.push(d())}let l=Date.now();await z(Promise.all(a),{milliseconds:this.pageLoadTimeout,message:"Timed out attaching Chrome permissions and initialization scripts",signal:this.abortSignal});let u=Date.now();(o??{})["ops-attach"]=u-l,c&&await this.page.reload(),this.cdpClient=await bu.init({logger:this.logger,contextGetter:()=>this.context,pageGetter:()=>this.page,defaultTimeoutMs:this.pageLoadTimeout}),(o??{})["cdp-init"]=Date.now()-u,await this.initializeScreencast(),this.stateManager=new vu({smartWaitingTimeoutMs:this.smartWaitingTimeout,pageLoadTimeoutMs:this.pageLoadTimeout,allowPartialAccessibilityTree:this.userControlledBrowserSettings.allowPartialAccessibilityTree??!1,logger:this.logger,cdpClient:this.cdpClient,pageGetter:()=>this.page,abortSignalGetter:()=>this.abortSignal,enricher:this.enricher,iconKnowledgeBase:this.iconKnowledgeBase,userBrowserSettings:this.userBrowserSettings,allowedA11yIgnoreReasonsOverride:this.properties.allowedA11yIgnoreReasonsOverride}),this.contextInitialized=!0}async fixViewportForNewHeadless(){this.properties.isNewHeadless&&this.viewport&&await this.cdpClient.send({method:"Emulation.setDeviceMetricsOverride",params:{width:this.viewport.width,height:this.viewport.height,deviceScaleFactor:0,mobile:this.viewport.width<1e3}})}async initializeScreencast(){await this.fixViewportForNewHeadless(),this.clientCallbacks?.onScreencastFrame&&this.viewport&&(await this.cdpClient.send({method:"Page.startScreencast",params:{format:"jpeg",quality:75,maxWidth:this.viewport.width,maxHeight:this.viewport.height}}),this.cdpClient.on("Page.screencastFrame",e=>{let t=e.sessionId,n=Buffer.from(e.data,"base64");this.lastScreenshotForRecording=n,this.clientCallbacks?.onScreencastFrame?.(n,()=>{(async()=>{try{await this.cdpClient.send({method:"Page.screencastFrameAck",params:{sessionId:t}})}catch{}})()})}))}static async init(e){let t=await XC(e),n=new r(t);return await n.initialize({grantPermissions:!0,permissionsToGrant:e.userBrowserSettings.grantedPermissions,runInitScripts:!1}),n}static async fromExistingContext({context:e,storage:t,enricher:n,userBrowserSettings:o,properties:i,logger:a,timingRecorder:s}){let c=e.pages()[0];if(!c)throw new Error("No page found in existing context");let l=c.viewportSize();if(!l){let m=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-m}let u=c?.url(),d=new r({browser:e.browser(),context:e,page:c,baseUrl:u,logger:a,storage:t,enricher:n,userBrowserSettings:o,viewport:l,properties:i,clientCallbacks:void 0,iconKnowledgeBase:null});return await d.initialize({grantPermissions:!1,runInitScripts:!0,timingRecorder:s}),d}async handleAvailableTabsChangeHelper(){try{let e=await Wg(this.context,{getTitles:!0}),t=this.page.url();this.clientCallbacks?.onTabsChange?.(e,t)}catch(e){this.logger.error({err:e},"Error sending available tabs to frontend")}}handleAvailableTabsChange(){try{clearTimeout(this.lastTabChangeEventTimeout),this.lastTabChangeEventTimeout=setTimeout(()=>this.handleAvailableTabsChangeHelper(),500)}catch(e){this.logger.warn({err:e},"Error handling available tabs change")}}addToPageLoadPromises(e,t){let n=Zg(),o=`${e}-${n}`,i=Date.now(),a=!1,s=new AbortController;this.pageLoadAbortControllers.add(s);let c=async()=>{try{await z(t(),{signal:s.signal,milliseconds:this.pageLoadTimeout,message:`Page load promise for code path ${e} timed out after ${this.pageLoadTimeout}ms`})}catch(l){l.name!=="AbortError"&&!this.closed&&this.logger.error({err:l,promiseKey:o,codePath:e,duration:Date.now()-i},`Page load promise for code path ${e} encountered error`)}finally{delete this.pageLoadPromises[o],this.pageLoadAbortControllers.delete(s),a=!0}};this.pageLoadPromises[o]=c().catch(()=>{}),a&&delete this.pageLoadPromises[o]}handlePageClosedEvent(e){if(this.page!==e){this.logger.debug({url:e.url()},"Detected background page was closed, just updating available tabs only"),this.handleAvailableTabsChange();return}let t=async()=>{if(this.closed)return;this.logger.info({url:e.url()},"Detected active page was closed, switching to another tab");let n=this.context.pages();for(let o=n.length-1;o>=0;o--){let i=n[o];if(!(!i||i.isClosed()||!Co(i.url()))){this.logger.info(`Automatically switching to tab ${o} after close: ${i.url()}`),await this.switchToPage({type:"INDEX",index:String(o)});break}}};this.addToPageLoadPromises("page closed handler",async()=>t())}handleNewPageEvent(e){let t=e.url();this.logger.info({url:t},"Detected new page event, registering handlers and waiting for load to complete");try{this.handleNewPageEventHelper(e)}catch(n){this.logger.warn({err:n},"Error handling new page open, continuing....")}}handleNewPageEventHelper(e){let t=Zg(),n="new-page-load-handler";e.on("close",a=>this.handlePageClosedEvent(a)),e.on("framenavigated",a=>this.handleFrameNavigationEvent(a)),e.on("crash",()=>{this.logger.error("Page crashed at the Playwright level!")});let o=this.context.pages().indexOf(e);!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableConsoleLogs&&e.on("console",a=>{NC(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(UC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=kR(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await Og({pageId:t,route:a,request:s,onHarEntry:(c,l)=>{this.harBatcher?.fetch({[c]:l}).catch(()=>{})},logger:this.logger,requestRecorders:this.requestRecorders,mocks:this.mocks,isBrowserClosed:()=>this.closed})}),await e.route("**/*",GC(this.customHeaders,this.logger))),wr&&await e.route("**/*",vs),await this.loadFrameAndRecordUrl({root:e,codePath:n}),this.handleAvailableTabsChange()};this.addToPageLoadPromises(n,async()=>i())}async handleCollectSvgs(e){}handleFrameNavigationEvent(e){let t=e.url(),n=e.parentFrame()?"has-parent":"no-parent",o=`frame-navigation-handler-${t.slice(0,50)} (${n})`;if(!t||t==="about:blank"||!Co(t)||this.recentFrameNavigations[o]&&Date.now()-this.recentFrameNavigations[o]<1e3)return;this.recentFrameNavigations[o]=Date.now();let i=async()=>{try{if(e.isDetached())return;await this.loadFrameAndRecordUrl({root:e,codePath:o}),this.handleAvailableTabsChange(),!e.parentFrame()&&!e.isDetached()&&this.clientCallbacks?.onSvgsCollected&&(setTimeout(()=>{(async()=>{try{await this.handleCollectSvgs(e)}catch(s){this.logger.warn({err:s},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(a){a.name!=="AbortError"&&this.logger.warn({err:a,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>i())}async injectKnowledgeBaseIntoBrowser(e){try{if(!this.iconKnowledgeBase||await e.evaluate(()=>!!window._MOMENTIC_ICON_KNOWLEDGE_BASE))return;let n={};Object.keys(this.iconKnowledgeBase).forEach(o=>{this.iconKnowledgeBase[o]?.description&&(n[o]=this.iconKnowledgeBase[o].description)}),await e.evaluate(o=>{let i=window;i._MOMENTIC_ICON_KNOWLEDGE_BASE=o},n)}catch(t){this.logger.warn({err:t},"Failed to inject icon knowledge base into browser, continuing...")}}getBrowserCallbacks(){return{waitForPageLoad:()=>this.waitForPageLoad(),waitForUrl:e=>this.waitForUrl(e),getBrowserState:e=>this.getBrowserState(e),waitForDomStability:e=>this.waitForDOMStability(e),state:{url:()=>this.url(),getDomGraph:()=>this.stateManager.domGraph,getOpenPages:()=>this.getOpenPages(),getRoot:()=>this.getActivePageOrFrame(),userBrowserSettings:this.userBrowserSettings},pageLoadTimeoutMs:this.pageLoadTimeout,signal:this.abortSignal}}ping(){if(this.closed)throw new Error("Page has been closed")}setActiveFrameConfig(e){this.stateManager.setActiveFrameConfig(e)}async reset(e){this.abortSignal=void 0,this.debugData.logsPerPage=[],this.pageLoadPromises={},await this.clearAuthState({closeNonActiveTabs:!0}),await this.stopScreencast(),await this.reinitializeCDPClient(),await this.navigate({url:e.newUrl??this.baseUrl,initialNavigation:!0,loadTimeoutMs:e.timeout}),this.stateManager.reset()}async clearHighlights(){try{await z(Hg(this.getBrowserCallbacks()),{milliseconds:ne})}catch(e){this.logger.debug({err:e},"Failed to clear highlights, continuing...")}}async cleanup(){this.abortSignal=void 0,this.cleanedUp=!0;try{this.pageLoadAbortListenerCleanup?.(),this.pageLoadAbortListenerCleanup=void 0,this.pageLoadAbortControllers.forEach(e=>e.abort()),this.pageLoadAbortControllers.clear(),this.originsVisited.clear(),await this.context.close(),await this.browser?.close(),this.browser=null}catch(e){this.logger.warn({err:e},"Error cleaning up browser, continuing...")}finally{this.browser=null}}get closed(){return this.cleanedUp||this.context.pages().every(e=>e.isClosed())||!!this.browser&&!this.browser.isConnected()}async ensureMomenticBrowserScriptsLoaded(e,t,n){let o=Date.now(),i=0,a=0;for(;Date.now()-o<Di;){a++,n?.throwIfAborted();try{if(await st({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:ne,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),root:e,codePath:"ensuring Momentic system scripts are loaded"}))return}catch(s){if(i++,i>=3){t.warn({err:s},"Multiple errors checking if Momentic scripts are loaded, aborting...");return}}await j(dt),a%2===0&&t.warn("Still waiting for momentic browser scripts to load...")}throw new Error(`Failed to load momentic browser scripts on page ${e.url()}`)}async html(){let e=await this.getActivePageOrFrame();return await this.ensureMomenticBrowserScriptsLoaded(e,this.logger),st({root:e,fn:()=>{let t=window;if(!t?.getFullHtmlTree)throw new Error("Missing Momentic HTML library when fetching page HTML");return t.getFullHtmlTree()},arg:void 0,timeout:re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the full HTML tree"})}url(){return this.page.url()}async stabilizePageForScreenshot(){try{await this.evaluateFunctionInPage(()=>{let e=window,t=[],n=new Map;document.querySelectorAll("input,textarea,[contenteditable]").forEach(o=>{n.set(o,{value:o.style.getPropertyValue("caret-color"),priority:o.style.getPropertyPriority("caret-color")}),o.style.setProperty("caret-color","transparent","important")}),t.push(()=>{for(let[o,i]of n)o.style.setProperty("caret-color",i.value,i.priority)}),e._MOMENTIC_SCREENSHOT_CLEANUP=()=>{for(let o of t)o();delete e._MOMENTIC_SCREENSHOT_CLEANUP}},void 0,"stabilizing page for screenshot")}catch(e){(!(e instanceof Error)||!e.message.includes("Execution context was destroyed"))&&this.logger.warn({err:e},"Failed to stabilize page before screenshot, continuing...")}}async removeScreenshotStabilization(){try{await this.evaluateFunctionInPage(()=>{window._MOMENTIC_SCREENSHOT_CLEANUP?.()},void 0,"removing screenshot stabilization")}catch{}}async screenshot(e){let{retries:t=1,stabilizeBeforeScreenshot:n=!1}=e,o=this.page.url();n&&await this.stabilizePageForScreenshot();let i=Date.now();try{await this.fixViewportForNewHeadless();let a=await this.screenshotHelper({...e,retries:t});if(a.byteLength>5e6)this.logger.error("Page screenshot is greater than 5MB, which may cause performance issues with some AI models");else if(a.length===0)throw new Error("Got empty screenshot");return a}catch(a){if(t<=0||a.message.includes("has been closed"))throw a;return this.logger.warn({err:a,pageUrl:o},"Failed taking screenshot, retrying..."),await j(Ro),this.screenshot({...e,retries:t-1})}finally{Date.now()-i>1e3&&this.logger.warn({pageUrl:o,duration:Date.now()-i},"Screenshot took longer than expected"),n&&await this.removeScreenshotStabilization()}}async screenshotHelper({locator:e,quality:t,saveToDiskPath:n,timeout:o,respectActiveFrame:i,clearHighlights:a=!1}){a&&await this.clearHighlights(),i&&this.stateManager.frameConfig&&(e=await(await this.getActivePageOrFrame()).frameElement());let s=await this.cdpClient.send({method:"Page.captureScreenshot",params:{format:"jpeg",quality:t,optimizeForSpeed:!0},timeout:o??Ee}),c=Buffer.from(s.data,"base64"),l=await BR.fromBuffer(c),{width:u,height:d}=this.getViewport()??{};if(u&&d&&(l.bitmap.width!==u||l.bitmap.height!==d)&&(c=await l.resize({w:u,h:d}).getBuffer("image/jpeg")),n&&Yz(n,c),this.lastScreenshotForRecording=c,!e)return c;let m=await e.boundingBox({timeout:re});if(!m)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:p,y:g,width:h,height:f}=m;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");p=Math.floor(p),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let E=await BR.fromBuffer(c),b=E.bitmap.width,C=E.bitmap.height;p=Math.max(0,Math.min(p,b-1)),g=Math.max(0,Math.min(g,C-1)),h=Math.max(1,Math.min(h,b-p)),f=Math.max(1,Math.min(f,C-g)),c=await E.crop({x:p,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(E){throw new Error(`Failed taking element screenshot at coordinates (${p}, ${g}) with size (${h}, ${f}): ${E}`)}finally{"dispose"in e&&await e?.dispose()}return c}getViewport(){if(this.viewport)return this.viewport;let e=this.page.viewportSize();return e||null}async navigate({url:e,initialNavigation:t=!1,loadTimeoutMs:n=this.pageLoadTimeout}){Qw(e)&&(e=new URL(e,this.baseUrl).toString());let o=Date.now();t||(await this.waitForPageLoad(),await this.waitForDOMStability());let i=!1,a;for(let c=0;c<3;c++)try{await this.page.goto(e,{timeout:n,waitUntil:"domcontentloaded"}),i=!0;break}catch(l){if(a=l,this.abortSignal?.throwIfAborted(),this.logger.warn({err:l},`Error occurred during navigation${c===0?", retrying...":" (fatal)"}`),await j(dt),a.message.includes("Timeout")&&a.message.includes("exceeded")||a.message.includes("net::ERR_CONNECTION_REFUSED"))break;await this.cdpClient.send({method:"Page.stopLoading",params:{},timeout:ne})}if(!i)throw new x("UserInfrastructureError",a?.message??"Failed to load page");await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"navigate-step-wait-for-load"}),this.logger.info({url:e},`Navigation complete in ${Math.floor(Date.now()-o)}ms`);let s=this.url();if(RC.has(s))throw new x("UserInfrastructureError",`${e} took too long to load \u{1F61E}. Please ensure the site is accessible and returns content within the page load timeout.`);await this.fixViewportForNewHeadless()}async type(e,t={},n=!1){await this.directTypeHelper(e,t,n)}async getActiveElementHandle(e){return e.evaluateHandle(()=>document.activeElement)}async getActiveElement(e){try{return await st({root:e,fn:()=>{let n=document.activeElement?.textContent??void 0;n&&n.length>100&&(n=n.slice(0,100)+"...[TRUNCATED]");let o=!1,i=window.getSelection();i&&!i.isCollapsed&&i.toString().trim().length>0&&(o=!0);let a=document.activeElement;return a&&"selectionStart"in a&&typeof a.selectionStart=="number"&&typeof a.selectionEnd=="number"&&a.selectionStart!==a.selectionEnd&&(o=!0),document.activeElement?{tag:document.activeElement.tagName.toLowerCase(),contentEditable:document.activeElement.getAttribute("contenteditable")??void 0,textContent:n,hasTextSelected:o}:{hasTextSelected:o}},arg:void 0,timeout:ne,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting the active element"})}catch(t){this.logger.warn({err:t},"Failed to get active element");return}}async directTypeHelper(e,t={},n=!1){let o=await this.getActivePageOrFrame();await rR({root:o,text:e,options:t,logger:this.logger,callbacks:this.getBrowserCallbacks()});let i=await this.getActiveElement(o);if(n){let s=Date.now();for(;Date.now()-s<this.smartWaitingTimeout&&(!i||i.tag==="body");)await j(Ro),this.abortSignal?.throwIfAborted(),i=await this.getActiveElement(o);i||this.logger.warn("No active element found to type into, attempting anyways")}let a=i?.tag==="input"||i?.tag==="textarea";if(t.clearContent)if(a||t.forceClearContent)if(this.properties.isAndroid&&!a&&i?.textContent){this.logger.info("Clearing content using backspaces");let s=0,c=i.textContent?.length;for(;c&&s<50;){s++;let l=[...Array(c)].map(()=>"Backspace").join("+");await this.page.keyboard.press(l),i=await this.getActiveElement(o),c=i?.textContent?.length}c&&this.logger.warn("Content still remains after clearing existing")}else this.properties.isAndroid?await this.page.keyboard.press("Control+A"):process.platform==="darwin"?await this.page.keyboard.press("Meta+A"):await this.page.keyboard.press("Control+A"),await this.page.keyboard.press("Backspace"),await this.page.waitForTimeout(25);else this.logger.info({activeElementDetails:i},"Currently active element is not eligible for replace content, skipping...");await this.page.keyboard.type(e,{delay:t.delay??wf}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Ee})}catch(t){this.logger.warn({err:t},"Failed to scroll into view, trying with raw JS");try{await e.evaluate(async n=>{let o=n.scrollTop;n.scrollIntoView(),await new Promise(a=>setTimeout(a,250));let i=Date.now();for(;Date.now()-i<1e3;){let a=n.scrollTop;if(a===o)break;o=a,await new Promise(s=>setTimeout(s,250))}},void 0,{timeout:Ee})}catch(n){this.logger.warn({err:n},"Failed to scroll into view using JS, continuing...")}}}async highlightA11yId(e){try{let{resolution:t}=await this.createTargetFromA11yId({id:e,description:null,targetSource:"AI",skipSaveToCache:!0});return await this.highlight(t.locator),!0}catch(t){return this.logger.debug({err:t,id:e},"Failed to highlight target"),!1}}async highlight(e){return Su({locator:e,callbacks:this.getBrowserCallbacks(),logger:this.logger})}recordUrlVisited(e){try{let t=new URL(e).origin;if(t==="null")return;this.originsVisited.add(t)}catch(t){this.logger.warn({err:t},"Failed to record origin visited")}}async waitForPageLoad(){let e=Date.now(),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises),o=-1,i=0;for(;t.length!==0;){if(Date.now()-e>this.pageLoadTimeout&&this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Still waiting on page load promises"),Date.now()-o<20&&(i++,i>2)){this.logger.error({outstandingPromiseKeys:n,outstandingPromises:t},"Synchronous waiting loop detected, exiting page load wait");return}o=Date.now(),await Promise.allSettled(t),t=Object.values(this.pageLoadPromises),n=Object.keys(this.pageLoadPromises)}}async clearAuthState(e){await this.context.clearCookies();for(let o of this.originsVisited)this.logger.debug({origin:o},`Clearing data using CDP for origin ${o}`),await this.cdpClient.send({method:"Storage.clearDataForOrigin",params:{origin:o,storageTypes:"all"},timeout:ne}),this.originsVisited.delete(o);let t=this.context.pages().indexOf(this.page),n=[...this.context.pages()];for(let o=0;o<n.length;o++){let i=n[o];if(i.isClosed())continue;let a=i.url();try{this.originsVisited.delete(new URL(a).origin)}catch{}await LC(i,this.logger),o!==t&&e.closeNonActiveTabs&&(this.logger.info(`Closing tab ${o} with URL ${a}`),await i.close())}}async loadAuthState(e){await this.waitForPageLoad(),await this.waitForDOMStability(),!e||Object.keys(e).length===0?await this.clearAuthState({closeNonActiveTabs:!1}):await this.loadAuthStateHelper(e),await this.refresh(),await this.waitForDOMStability()}async loadAuthStateHelper(e){let t=[];for(let i of e.cookies??[]){let a=await this.setCookie(i);t=t.concat(a)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:ne});let n=0;for(let i of e.origins??[])for(let a of i.localStorage)try{await this.cdpClient.send({timeout:ne,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(i.origin).origin,isLocalStorage:!0},key:a.name,value:a.value}}),n++}catch(s){this.logger.warn({err:s,origin:i},"Failed to set local storage entry, continuing...");break}this.logger.info(`Loaded ${n} local storage entries`);let o=e.idb;o&&Object.keys(o).length>0&&(await OC(this.page,o,this.logger),this.logger.info(`Loaded ${Object.keys(o??{}).length} indexedDB databases`))}async saveAuthState(){let t=0,n=null;for(;t<=2;)try{await this.waitForPageLoad(),await this.waitForDOMStability();let o=await this.context.storageState();return o.idb=await IC(this.page,this.logger),o}catch(o){if(n=o,t++,t<=2){this.logger.warn({err:o,retryCount:t,maxRetries:2},`Error saving auth state, retrying (${t}/2)...`);let i=Math.pow(2,t)*100;await new Promise(a=>setTimeout(a,i))}}throw this.logger.error({err:n},"Failed to save auth state after 2 retries"),new x("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Wg(this.context,e)}saveA11yDetailsToCache(e,t){t.content=e.content,t.name=e.name,t.role=e.role,t.numChildren=e.children.length,delete t.serializedForm,delete t.nodeOnlySerializedForm}async updateCacheWithNewNodeDetails({node:e,target:t,locator:n,startingBoundingBox:o,allowNotActionableNodesOverride:i,logger:a=this.logger}){if(e&&this.saveA11yDetailsToCache(e,t),t.frameCache=this.stateManager.saveAutoFrameCacheDetails(t.frameCache),n)try{let s=await this.fetchHtmlAttributes({locator:n,logger:a,startingBoundingBox:o,allowNotActionableNodesOverride:i});s?(t.generatedSelectors=s.generatedSelectors,t.serializedHtml=s.serializedHtml,t.nodeOnlySerializedHtml=s.nodeOnlySerializedHtml,t.hybridSelector=s.hybridSelector):a.warn("Got undefined HTML attributes when trying to update cache")}catch(s){if(s instanceof Dr)throw a.warn({err:s},"Cache attributes disqualify found element"),s;a.warn({err:s},"Failed to fetch HTML attributes for target, continuing...")}try{await this.saveElementVisualAttributes({target:t,locator:n,logger:a,boundingBox:o})}catch(s){a.debug({err:s},"Failed to save element visual details, continuing...")}}async saveElementVisualAttributes({target:e,locator:t,logger:n,boundingBox:o}){if(!t)return{scrollPerformed:!1};if(!Eg.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:re})),!o||!o.width||!o.height)return n.debug("Skipping visual attributes saving for element with no bounding box after action"),e.boundingBox=void 0,e.screenshotUrl=void 0,{scrollPerformed:!0};let{x:i=0,y:a=0,width:s=0,height:c=0}=o;if(e.boundingBox&&Math.abs(e.boundingBox.width-s)<1&&Math.abs(e.boundingBox.height-c)<1&&Math.abs((e.boundingBox.x??0)-i)<1&&Math.abs((e.boundingBox.y??0)-a)<1)return{scrollPerformed:!0};e.boundingBox=o;let l=await this.screenshot({locator:t,quality:75,retries:0});return e.screenshotUrl=await this.storage.uploadScreenshot(l),{scrollPerformed:!0}}async resolveAutoFrameCache(e){return this.stateManager.resolveAutoFrameCache(e)}async getElementRequiredValues({logger:e,locator:t,requirements:n}){let o={},i=!!n?.position&&n.position!=="irrelevant",a=!!n?.shape&&n.shape!=="irrelevant";if(i||a){let s=await t.boundingBox({timeout:re});if(!s||!s.width||!s.height)throw new x("ActionFailureError","Element does not have a bounding box as required");a&&(o.shape={width:s.width,height:s.height,tolerance:n.shape}),i&&(o.position={x1:s.x,y1:s.y,x2:s.x+s.width,y2:s.y+s.height,tolerance:n.position})}if(n?.text){let s=await t.textContent({timeout:re});o.text=s?.trim()}if(n?.attributes&&n.attributes.length>0){let s={};for(let c of n.attributes){let l=c.trim().toLowerCase();if(!(!l||hr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:re});u!==null&&(s[c]=u)}catch(u){e.warn({err:u,attr:c},"Failed to fetch required attribute, continuing...")}}o.attributes=s}return o}async getAdditionalElementDetails({mainLocator:e,additionalElement:t,root:n,logger:o}){let i=this.stateManager.a11yIdToNodeMap[t.id];if(!i)return;let a=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:n,node:i});if(e.contentFrame!==a.contentFrame)return;let s=await this.fetchHtmlAttributes({locator:a,logger:o});if(!s?.generatedSelectors||s.generatedSelectors.length===0)return;let c={selectors:s.generatedSelectors};return t.requirements&&(c.requirements=await this.getElementRequiredValues({logger:o,locator:a,requirements:t.requirements})),c}async getAdditionalElementsDetails({mainElementId:e,mainLocator:t,additionalElements:n,root:o,logger:i}){let a=new Set,s=[];for(let c of n)try{if(c.id===e||a.has(c.id))continue;let l=await this.getAdditionalElementDetails({mainLocator:t,additionalElement:c,root:o,logger:i});if(a.add(c.id),!l)continue;s.push(l)}catch(l){this.logger.warn({err:l,additionalElement:c},"Failed to fetch additional element details, continuing...")}return s}async updateCacheWithAdditionalRequirements({mainElementId:e,requirements:t,additionalElements:n,target:o,locator:i,root:a,logger:s}){if(t)try{o.requirements=await this.getElementRequiredValues({logger:s,locator:i,requirements:t})}catch(c){s.warn({err:c},"Failed to generate required values for target")}n&&(o.additionalElements=await this.getAdditionalElementsDetails({mainElementId:e,mainLocator:i,additionalElements:n,root:a,logger:s}))}async createTargetFromA11yId({id:e,description:t,targetSource:n,skipSaveToCache:o,logger:i=this.logger,requirements:a,additionalElements:s}){if(e<0)throw new x("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new x("InternalWebAgentError",`Resolving target failed because id ${e} does not exist on the page. This generally indicates an incorrect element was targeted.`);let l=this.stateManager.frameConfig,u,d,m,p;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let b=c.parentFrame,{cache:C,config:R}=await this.stateManager.getAutoFrameDetailsFromHandle(b);d=C,m=R,u=R.frame,p="auto iframe"}else c.parentFrame&&l?(m=l,u=await this.getActivePageOrFrame(),p="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),p="should not be possible");let g=await this.stateManager.getLocatorFromA11yNode({page:this.page,root:u,node:c}),h={id:e,inputDescription:t??void 0,targetSource:n,targetUpdateTime:new Date().toISOString(),targetUpdateLoggerTags:be(i),frameCache:d},f,E=!1;o||(m&&(i.info({frameConfigSource:p,frameConfig:NR(m)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(m),E=!0),await this.updateCacheWithNewNodeDetails({node:c,target:h,locator:g,logger:i,allowNotActionableNodesOverride:!0}),await this.updateCacheWithAdditionalRequirements({mainElementId:e,requirements:a,additionalElements:s,target:h,root:u,locator:g,logger:i}));try{return{resolution:{locator:g,a11yNode:c,displayString:c.getNodeOnlySerializedForm(),decisions:[]},target:h,frameConfig:m,frameConfigSource:p}}finally{E&&this.stateManager.setActiveFrameConfig(f)}}async resolveTarget(e,t,n={}){let{targetName:o,logger:i=this.logger,signal:a=this.abortSignal,allowNotActionableNodesOverride:s}=n;if(t.frameCache&&this.userBrowserSettings.autoExpandIframes){let p,g=!1,h=Date.now();for(;Date.now()-h<this.smartWaitingTimeout;)try{let f=await this.stateManager.resolveAutoFrameCache(t.frameCache);this.setActiveFrameConfig(f),g=!0;break}catch(f){p=f,await j(dt,a)}if(!g)throw p}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,m;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let p=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:p,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(g){if(g instanceof Sa)break;if(g instanceof Dr){if(d++,d>2)throw i.error({err:g},"Got multiple cache disqualification errors, giving up"),g;i.warn({err:g},"Got cache disqualification error, waiting and retrying resolution"),await j(dt,a)}a?.throwIfAborted(),p&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await j(dt,a)}}return m||(m=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:m.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:m?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),m}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=Fi(t),l=[],u,d=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),m;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(g){m=g,g instanceof Nr&&(l.push(...g.decisions),u=g.cacheMissReason)}if(p)return{...p,pageState:void 0,decisions:[...l,...p.decisions]};n||(l.push({type:"CSS_SELECTOR",matched:!1,reason:m?.message,selectors:Fi(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw m;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:d,target:t,decisions:l,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=be(o),p;u=u??"secondary-resolution-failed"}throw new Nr(`Could not find any relevant node given target: ${JSON.stringify(c)}`,l,u)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Sa("Insufficient data to resolve target using primary methods (missing node HTML)");let a=i?n:On,s=this.userControlledBrowserSettings.hybridSelectorMode,c={ldistThreshold:bg,requireBoundingBox:!o,ignoreHrefForCaching:this.userControlledBrowserSettings.ignoreHrefForCaching,requireMatchingBoundingBox:this.userControlledBrowserSettings.bustCacheOnBoundingBoxChange?t.boundingBox:void 0,requirements:t.requirements,additionalElements:t.additionalElements,importantProperties:{attributes:this.userControlledBrowserSettings.importantAttributes,classes:this.userControlledBrowserSettings.importantClasses,styles:this.userControlledBrowserSettings.importantStyles}},{css:l,hybrid:u}=await st({fn:v=>window.evaluatePrimaryCaches(v),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c},hybridParams:s&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:c}:void 0},root:e,timeout:re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),d,m,p=[];if(s==="prefer"&&u?.result){d=u.result;let v={type:"HYBRID_SELECTOR",matched:!0,logs:u.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};p.push(v),m="HYBRID_SELECTOR"}else if(l?.result){d=l.result;let v=`${d.workingSelectors.length} CSS selectors matched the following element: ${d.serializedElement}`,M=d.workingSelectors.slice(0,5);p.push({type:"CSS_SELECTOR",matched:!0,logs:l.logs,reason:v,selectors:M}),n.debug({reason:v,workingSelectors:M},"Resolved with CSS selectors"),m="CSS_SELECTOR"}else throw p.push({type:"CSS_SELECTOR",matched:!1,reason:l.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:l.logs}),u&&p.push({type:"HYBRID_SELECTOR",matched:!1,reason:u.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:u.logs}),l?.error&&n.error({err:new Error(l.error)},"Cache evaluation errored unexpectedly (CSS)"),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new Nr("Cache evaluation failed",p,l.cacheMissReason);let g,h,f;if(this.userBrowserSettings.visualActions){let v=d.mPath;if(!v)throw new Error("Found element did not have an mPath despite using visual actions");let M=v.join(" > ");g=e.locator(M),h=this.stateManager.getNodeUsingMPathSelector(M)}else if(d.dataMomenticId!==void 0)f=parseInt(d.dataMomenticId),h=this.stateManager.dataMomenticIdToNodeMap[f],"workingSelectors"in d?g=e.locator(d.workingSelectors[0]):g=e.locator(Rr(f));else throw new x("InternalWebAgentError","Received an element resolution result with no identifying attributes");s&&t.hybridSelector&&(u?.logs.length===1?a.warn({hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution rejected, continuing..."):u?.result?l?.result&&u?.result&&u.result.serializedElement!==l.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(l.result.mPath)!==JSON.stringify(u.result.mPath)?n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):l.result.dataMomenticId!==u.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):a.warn({originalCache:t,hybridResult:u,cssResult:l,hybridMode:s},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[E,b]=await Promise.all([g.textContent(),g.boundingBox()]);if((E??"")!==(d.textContent??""))throw n.warn({currentTextContent:E,originalTextContent:d.textContent},"Retrying cache resolution because element's text content has changed since resolution"),new Error("Element's text has changed since cache was resolved");if(!b||Math.abs(b.height-d.boundingBox.height)>1||Math.abs(b.width-d.boundingBox.width)>1||Math.abs((b.x??0)-(d.boundingBox.x??0))>1||Math.abs((b.y??0)-(d.boundingBox.y??0))>1)throw n.warn({currentBoundingBox:b,originalBoundingBox:d.boundingBox},"Retrying cache resolution because element's bounding box has changed since resolution"),new Error("Element's bounding box has changed since cache was resolved");let C=Fi(t);await this.updateCacheWithNewNodeDetails({node:h,target:t,locator:g,logger:n,startingBoundingBox:d.boundingBox,allowNotActionableNodesOverride:o});let R=eh(C,t);return R&&Object.keys(R).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(n),t.cacheResolutionUpdateSource=m),{a11yNode:h,displayString:d.serializedElement,locator:g,decisions:p}}async resolveHardcodedCssSelector(e){let{ctx:t,selector:n,logger:o=this.logger,signal:i=this.abortSignal,timeoutMs:a=this.smartWaitingTimeout}=e,s=await this.getActivePageOrFrame(),c=Date.now(),l=0,u,d=[];for(;Date.now()-c<a;){i?.throwIfAborted(),l++;let m=s.locator(n),p;try{return await m.waitFor({state:"attached",timeout:ne}),p=await xr(m,o,500)??"",d.push({type:"USER_SELECTOR",matched:!0,reason:`The user-provided CSS selector ${n} matched an element on the page.`}),t?.details?.push({type:"TARGETING",name:e.targetName,elementLocationDecisions:d,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toISOString()}),{locator:m,displayString:p,decisions:d}}catch(g){let h=g.message;u=new x("ActionFailureError",`CSS selector '${n}' failed to resolve after ${l} attempts: ${h.includes("locator.waitFor: Timeout")?"the selector did not match any element on the page":h}`),await j(dt,i)}}throw u}async resolveTargetWithSecondaryMethods(e){if(!e.target.boundingBox)return;let{x:t,y:n,width:o,height:i}=e.target.boundingBox,a=await this.resolveTargetWithSecondaryMethodsHelper(e);if(!a)return;let s=await a.locator.boundingBox({timeout:re});if(!s){this.logger.debug({proposedNode:a.displayString},"Rejecting secondary matching result due to lack of a bounding box");return}let{x:c,y:l,width:u,height:d}=s;if(Math.abs(u-o)>10||Math.abs(d-i)>10){this.logger.debug({newW:u,oldW:o,newH:d,oldH:i,proposedNode:a.displayString},"Rejecting secondary matching result due to difference in dimensions");return}else if(!t||!n||!c||!l){this.logger.debug({oldX:t,oldY:n,newX:c,newY:l,proposedNode:a.displayString},"Rejecting secondary matching result due to missing x/y coords");return}else if(Math.abs(c-t)>100||Math.abs(l-n)>100){this.logger.debug({newX:c,newY:l,oldX:t,oldY:n,proposedNode:a.displayString},"Rejecting secondary matching result due to large difference in x/y coords");return}return a}async resolveTargetWithSecondaryMethodsHelper({root:e,target:t,decisions:n,logger:o,signal:i,allowNotActionableNodesOverride:a}){if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.trim().length<CC){let l="Refusing to attempt HTML comparison since the saved element is too short.";n.push({type:"HTML_DISTANCE",matched:!1,reason:l})}else if(t.nodeOnlySerializedHtml&&t.nodeOnlySerializedHtml.length>50)try{let l=await st({fn:d=>window.findClosestElementByLDist?.(d),arg:{nodeOnlySerializedHtml:t.nodeOnlySerializedHtml},timeout:Ee,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(bg*t.nodeOnlySerializedHtml.length);if(l&&l.closestDistance&&l.closestDistance>=u){let d=`Closest HTML candidate still has too far distance (${l.closestDistance}) from threshold (${u})`;n.push({type:"HTML_DISTANCE",matched:!1,reason:d,distance:l.closestDistance,closestElement:l.closestNodeSerialized})}else{if(l?.error)throw new Error(l.error);if(l?.dataMomenticId||l?.mPathSelector){let d=l.dataMomenticId?parseInt(l.dataMomenticId):void 0,m,p;if(d)m=this.stateManager.dataMomenticIdToNodeMap[d],p=e.locator(Rr(d));else if(l.mPathSelector)m=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),p=e.locator(l.mPathSelector);else throw new Error("HTML ldist comparison returned no error, data momentic id, or mPath selector");let g=l.closestNodeSerialized??await xr(p,o,500)??"unknown element";o.warn({result:l,originalTarget:t,displayString:g},"Resolved cached target to new node with pure html levenshtein distance");let h=Fi(t);await this.updateCacheWithNewNodeDetails({node:m,target:t,locator:p,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=eh(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(o),t.cacheResolutionUpdateSource="HTML_DISTANCE",o.info({diffs:f,result:l},"Updated cache after l-dist resolution")),n.push({type:"HTML_DISTANCE",matched:!0,reason:`Found an element on the page within ${u} string comparison distance of the saved element.`,logs:l.logs,distance:l.closestDistance,closestElement:g,savedElement:t.nodeOnlySerializedHtml}),{locator:p,a11yNode:m,displayString:g,decisions:n,pageState:void 0}}else throw new Error(`Got invalid HTML evaluation result: ${JSON.stringify(l)}`)}}catch(l){o.info({err:l},"Failed to find closest HTML node using levenshtein distance"),n.push({type:"HTML_DISTANCE",matched:!1,reason:`Error finding closest HTML node by string distance: ${l}`})}let s=t.screenshotUrl,c=t.role??"";if(s&&Eg.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshotUrl:s,signal:i,allowNotActionableNodesOverride:a});return{...l,decisions:[...n,...l.decisions],pageState:void 0}}catch(l){i?.throwIfAborted(),n.push({type:"TEMPLATE_MATCHING",matched:!1,reason:`Error finding closest element using saved screenshot: ${l}`,elementImageUrl:s}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshotUrl:e,oldTarget:t,signal:n,allowNotActionableNodesOverride:o}){let i;if(!this.enricher)throw new Error("Enricher not available for screenshot resolution");let a=await this.screenshot({retries:0}),c=await(await fetch(e)).arrayBuffer(),l=t1(),u=await this.enricher.runTemplateMatching({id:l,searchImageBase64String:Buffer.from(c).toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:d,locator:m}=await this.getTargetFromPositionPercentages({percentX:u.x,percentY:u.y,allowNotActionableNodesOverride:o}),p=d.boundingBox?.width,g=d.boundingBox?.height;if(!p||!g)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let h=d.id,f=this.stateManager.a11yIdToNodeMap[h],E=Fi(t);await this.updateCacheWithNewNodeDetails({target:t,node:f,locator:m,allowNotActionableNodesOverride:o});let b=eh(E,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=be(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:l,diffs:b,templateMatch:u},"Updated cache after template matching resolution")),{locator:m,a11yNode:f,displayString:d.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot",elementImageUrl:e}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:ne})??"",i=tR.some(a=>a===o.toLowerCase());return await Gg({targetingResult:t,options:{force:n.force,relativePosition:n.relativePosition},logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,position:i?{x:1,y:1}:void 0,actionSource:"type",browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1}),await this.page.waitForTimeout(150),this.directTypeHelper(e,n)}async click(e,t,n={}){return Gg({targetingResult:e,options:n,logger:this.logger,actionSource:"click",retryTimeoutMs:this.smartWaitingTimeout,controllerCallbacks:t,browserCallbacks:this.getBrowserCallbacks(),isAndroid:this.properties.isAndroid??!1})}async waitForUrl({beforeUrl:e,matcher:t},n){let o=n?.timeout??this.pageLoadTimeout,i=Date.now(),a=!1,s=e;for(;Date.now()-i<o;){if(this.abortSignal?.throwIfAborted(),s=this.url(),ru(s,t,n)){a=!0;break}await j(dt,this.abortSignal)}if(!a)throw new x("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${lw(t)} in ${o}ms.
4339
+ Current tab: ${s}`);try{await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"wait-for-url-step"})}catch(c){this.logger.warn({err:c},"Failed waiting for page load after URL change, continuing...")}}async dragAndDrop(e,t,n={}){await this.highlight(e),await this.hover({locator:e}),await this.page.mouse.down();let o=await t.boundingBox({timeout:re});if(!o)throw new x("ActionFailureError","Could not get bounding box of target element");let i=o.x+o.width/2,a=o.y+o.height/2,s=n.steps??5;await this.page.mouse.move(i,a,{steps:s}),await j(n.hoverSeconds?Math.min(n.hoverSeconds*1e3,Ee):500),await this.highlight(t),await this.page.mouse.up()}async mouseDrag(e,t,n,o){o&&await this.hover({locator:o}),await this.page.mouse.down();let i;if(o){let a=await o.boundingBox({timeout:re});a&&(i={x:a.x+a.width/2,y:a.y+a.height/2})}i||(this.logger.warn("Could not get starting position from fromTarget, falling back to (0,0)"),i={x:0,y:0}),await this.page.mouse.move(i.x+e,i.y+t,{steps:n}),await j(Ro),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Mo({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:re});if(!n)throw new Error("Attempted to hover over element with no bounding box");await this.page.mouse.move(n.x+n.width/2,n.y+n.height/2,{steps:3})},action:"hovering over element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,targetingResult:e,callbacks:this.getBrowserCallbacks()})}async focus(e){await this.highlight(e.locator),await Mo({func:t=>t.locator.focus({timeout:Ee}),action:"focusing element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async blur(e){if(!e){let t=await this.getActivePageOrFrame();await st({fn:()=>{let n=document.activeElement;n&&n.nodeType===1&&n.blur()},root:t,arg:void 0,waitForPageLoad:()=>this.waitForPageLoad(),timeout:ne,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Mo({func:t=>t.locator.blur({timeout:Ee}),action:"blurring element",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),targetingResult:e})}async selectOption(e,t,n=!1){await this.highlight(e.locator),await Mo({action:"selecting option from dropdown",logger:this.logger,retryTimeoutMs:this.smartWaitingTimeout,callbacks:this.getBrowserCallbacks(),func:async o=>{if(t.type==="INDEX"){let i=Number(t.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${t.index} is not a number`)}await o.locator.selectOption({value:t.type==="VALUE"?t.value:void 0,label:t.type==="LABEL"?t.label:void 0,index:t.type==="INDEX"?Number(t.index):void 0},{force:n,timeout:re})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=yu(e,this.properties.isAndroid);o!==e&&(this.logger.info({key:e,convertedKey:o},"Converted platform dependent keys"),e=o)}for(let o=0;o<n;o++)await this.page.keyboard.press(e,{delay:t.delayMs??0})}async keyDown(e,t){if(t.convertMeta){let n=yu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of zg(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=yu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of zg(e))await this.page.keyboard.up(n)}async refresh(e){let t=e?.loadTimeoutMs??this.pageLoadTimeout;await this.waitForPageLoad();let n=0,o=2;for(;n<o;){n++;try{await this.page.reload({waitUntil:"domcontentloaded",timeout:t});break}catch(i){this.logger.warn({err:i,attempt:n},`Failed to reload page${n<o?", retrying...":", continuing..."}`)}}await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"reload-step"}),await this.waitForDOMStability()}async getBrowserState(e){let{maxAttempts:t=2,logger:n=this.logger,skipWaitForPageLoad:o,allowNotActionableNodesOverride:i,shouldLogOnFailure:a}=e,s=e.abortSignal??this.abortSignal,c=!i,l=i?!0:this.userControlledBrowserSettings.showZeroOpacityElements,u=a?n:On;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,m;for(;d<t;){d++;try{return await z(this.stateManager.getA11yTree({devicePixelRatio:this.devicePixelRatio,abortSignal:s,logger:n,filterByViewport:e.filterByViewport,showZeroOpacityElements:l,flagNotActionableNodes:c}),{milliseconds:this.pageLoadTimeout*d,signal:s,message:"Getting browser state took too long"})}catch(p){if(s?.throwIfAborted(),m=p instanceof Error?p.message:`${p}`,d>=t)throw p;u.warn({err:p,url:this.url()},"Error getting a11y tree, retrying...")}}throw new x("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${m}`)}async getViewportOffsetDetails(e){let[t,n,o,i,a]=await st({root:e,fn:()=>[window.scrollY,window.scrollX,window.screen.width,window.screen.height,window.devicePixelRatio],arg:void 0,timeout:re,waitForPageLoad:async()=>{},codePath:"getting current viewport details"});return{upperBound:t,lowerBound:t+i,leftBound:n,rightBound:n+o,width:o,height:i,devicePixelRatio:this.properties.systemDevicePixelRatio??a}}async waitForDOMStability(e){let{logger:t=this.logger,timeout:n=this.smartWaitingTimeout,signal:o}=e??{},i={value:Date.now()},a=m=>{i.value=Date.now()},s=()=>a("DOM.documentUpdated");this.cdpClient.addListener("DOM.documentUpdated",s);let c=()=>a("Page.frameDetached");this.cdpClient.addListener("Page.frameDetached",()=>c);let l=()=>a("Page.frameStartedLoading");this.cdpClient.addListener("Page.frameStartedLoading",l);let u=()=>a("Page.navigatedWithinDocument");this.cdpClient.addListener("Page.navigatedWithinDocument",u);let d=()=>a("frameRequestedNavListener");this.cdpClient.addListener("Page.frameRequestedNavigation",d);try{await this.waitForDOMStabilityHelper(i,t,n,o)}finally{this.cdpClient.removeListener("DOM.documentUpdated",s),this.cdpClient.removeListener("Page.frameDetached",c),this.cdpClient.removeListener("Page.frameStartedLoading",l),this.cdpClient.removeListener("Page.navigatedWithinDocument",u),this.cdpClient.removeListener("Page.frameRequestedNavigation",d)}}async waitForDOMStabilityHelper(e,t,n,o){let i=!1,a=Date.now(),s,c={quality:25,retries:0,stabilizeBeforeScreenshot:!0},l=!1,u=0;for(;Date.now()-a<n;){if(o?.throwIfAborted(),await j(Ro,this.abortSignal),s)try{let d=await this.screenshot(c);if(!d.equals(s)){s=d,l=!1;continue}l=!0}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}else try{s=await this.screenshot(c)}catch(d){u++,u%3===0&&t.warn({err:d,screenshotErrors:u},"Failed to take screenshot for DOM stability check"),o?.throwIfAborted()}if(!(Date.now()-e.value<wC)){i=!0;break}}i||t.warn({duration:Date.now()-a,stable:{a11y:i,screenshot:l}},"A11y wait phase completed due to timeout, continuing...")}async clickUsingVisualCoordinates(e,t){let{x:n,y:o}=e;this.logger.debug({x:n,y:o},"Executing mouse click with visual coordinates"),await this.waitForPageLoad(),await this.page.mouse.click(n,o,{button:t.rightClick?"right":"left",clickCount:t.doubleClick?2:1})}async dragAndDropUsingVisualCoordinates(e,t,n){await lR(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e,t,n,o,i){await sR({page:this.page,deltaX:e,deltaY:t,steps:n,delayMs:o,visualTarget:i,isAndroid:this.properties.isAndroid??!1})}async hoverUsingVisualCoordinates(e){await this.page.mouse.move(e.x,e.y,{steps:3})}async getElementLocation(e){let t=await this.cdpClient.send({method:"DOMSnapshot.captureSnapshot",params:{computedStyles:[],includeDOMRects:!0,includePaintOrder:!0},timeout:re}),n=await z(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Ee});process.platform==="darwin"&&n===1&&(n=vC);let o=t.documents[0],i=o.layout,a=o.nodes,s=a.nodeName||[],c=a.backendNodeId||[],l=i.nodeIndex,u=i.bounds,d=-1;for(let b=0;b<s.length;b++)if(c[b]===e){d=l.indexOf(b);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[m=0,p=0,g=0,h=0]=u[d];m/=n,p/=n,g/=n,h/=n;let f=m+g/2,E=p+h/2;return{centerX:f,centerY:E}}async scrollVertical(e){return Vg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:0,directionX:null,deltaY:e?Math.abs(e):null,directionY:e&&e>0?"down":"up",signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async scrollHorizontal(e){return Vg({frame:this.stateManager.frameConfig?await this.getActivePageOrFrame():null,page:this.page,deltaX:e?Math.abs(e):null,directionX:e&&e>0?"right":"left",deltaY:0,directionY:null,signal:this.abortSignal,callbacks:this.getBrowserCallbacks(),logger:this.logger})}async goForward(){await this.waitForPageLoad(),await this.page.goForward({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-forward"})}async goBack(){await this.waitForPageLoad(),await this.page.goBack({waitUntil:"domcontentloaded",timeout:this.pageLoadTimeout}),await this.loadFrameAndRecordUrl({root:this.page,signal:this.abortSignal,codePath:"go-back"})}async reinitializeCDPClient(e){await this.cdpClient.reinitialize(e),await this.initializeScreencast()}async stopScreencast(){if(this.clientCallbacks?.onScreencastFrame)try{await this.cdpClient.send({method:"Page.stopScreencast",params:{}})}catch{}}async changeActivePage(e,t){if(await this.stopScreencast(),this.recordUrlVisited(e.url()),this.onVideoPageChange){let n=await e.video()?.path();if(n){let o=zR(n);this.onVideoPageChange({videoName:o})}}this.page=e,await this.reinitializeCDPClient(t??this.pageLoadTimeout)}async createNewTab(e,t){let n=await this.context.newPage();await this.changeActivePage(n,t?.loadTimeoutMs),await this.navigate({url:e,initialNavigation:!0,...t}),this.handleAvailableTabsChange()}async switchToPage(e,t){let n=!0,o,i=Date.now();for(;n||t?.retry&&Date.now()-i<this.smartWaitingTimeout;){n=!1;try{await this.switchToPageHelper(e,t);return}catch(a){this.logger.warn({err:a},"Error switching to page, retrying..."),o=a,await j(dt)}}throw o}async switchToPageHelper(e,t){let n=this.context.pages().map((i,a)=>({page:i,url:i.url(),index:a})),o;if(e.type==="INDEX"){let i=Number(e.index);if(isNaN(i))throw new x("UserConfigurationError",`Page index ${e.index} is not a number`);if(i<0||i>=n.length)throw new Error(`Page index ${e.index} exceeds the number of available pages: ${JSON.stringify(n.map(a=>a.url))}`);o=n[i]}else{let i=n.filter(a=>e.type==="SUBSTRING"?a.url.includes(e.substring):a.url.match(e.pattern));i.length>1&&this.logger.warn(`More than one page matches the page switch criteria: ${JSON.stringify(i.map(a=>a.url))}`),o=i[i.length-1]}if(!o)throw new Error(`Could not find matching page using criteria: ${JSON.stringify(e)}.
4340
+ Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Co(o.url,this.logger)){this.logger.error(`Refusing to switch to page with invalid URL: ${o.url}`);return}this.logger.info(`Switching to tab ${o.index} with url ${o.url}`),await this.changeActivePage(o.page,t?.loadTimeoutMs),await this.loadFrameAndRecordUrl({root:o.page,signal:this.abortSignal,codePath:"switch-to-tab-step"}),this.handleAvailableTabsChange()}async setCookie(e){let t;return typeof e=="string"?t=Dl(e):t=[e],await this.context.addCookies(t),t}async setLocalStorage(e,t){let n;for(let o=0;o<2;o++)try{await this.evaluateFunctionInPage(([i,a])=>{i&&localStorage.setItem(i,a||"")},[e,t],`setting local storage key ${e}`);return}catch(i){n=i}if(n)throw n}getActiveFrameConfig(){return this.stateManager.frameConfig}async exposeRecordingBindings(){try{await z(this.exposeRecordingBindingsHelper(),{milliseconds:this.pageLoadTimeout})}catch(e){e instanceof Error&&e.message.includes("already registered")||this.logger.error({err:e},"Failed to install Momentic libraries for action recording")}}async exposeRecordingBindingsHelper(){await this.context.exposeBinding("isRecordingActive",()=>this.transformer!==void 0,{handle:!1}),await this.context.exposeBinding("captureTargetedEvent",({frame:e},t)=>{this.transformer&&UR({event:t,frame:e,transformer:this.transformer,enricher:this.enricher,lastScreenshotForRecording:this.lastScreenshotForRecording?.toString("base64"),logger:this.logger})},{handle:!1}),await this.context.exposeBinding("captureKeystroke",async(e,t)=>{this.transformer&&this.transformer.recordKeystroke(t)})}async startRecordingCrons(e){if(e.aborted)return;let t,n=(await this.getOpenPages()).map(c=>c.url),o=0,i=!1,a=async()=>{if(e.aborted||o>8){clearTimeout(t);return}i=!0;let c;try{c=(await this.getOpenPages()).map(u=>u.url),o=0}catch(u){this.logger.debug({err:u},"Failed getting new open pages during recording tab switch cron, skipping..."),o++;return}let l=this.url();for(let u=c.length-1;u>=n.length;u--){let d=c[u];Co(d,this.logger)&&d!==l&&this.logger.info({lastActivePages:n,currentUrl:l,newOpenPages:c},"Auto-following new tab during recording"),await this.switchToPage({type:"INDEX",index:String(u)});break}n=c};t=setInterval(async()=>{if(!i){i=!0;try{await a()}catch(c){this.logger.error({err:c},"Error while checking pages during recording")}finally{i=!1}}},dt);let s=async()=>{clearInterval(t)};e.addEventListener("abort",s,{once:!0})}async startRecording(e,t,n){this.logger.debug({isClickToRecord:n},"Starting recording mode in Chrome browser"),await this.startRecordingCrons(e),await this.page.evaluate(i=>{let a=window;a._MOMENTIC_RECORDING_ACTIVE=!0,a._MOMENTIC_CLICK_RECORD_ACTIVE=i},n),this.transformer=t,await this.injectKnowledgeBaseIntoBrowser(this.page);let o=async()=>{this.transformer=void 0,this.lastScreenshotForRecording=void 0;try{await this.page.evaluate(()=>{let i=window;i._MOMENTIC_RECORDING_ACTIVE=!1,i._MOMENTIC_CLICK_RECORD_ACTIVE=!1})}catch{}};e.addEventListener("abort",o,{once:!0})}async getSelectOptions(e){return await e.evaluate(n=>Array.from(n.querySelectorAll("option")).map(i=>({value:i.value,label:i.label})),void 0,{timeout:ne})}getActivePage(){return this.page}async getActivePageOrFrame(){let e=await this.stateManager.resolveActiveFrameConfig({});return e?(await this.loadFrameAndRecordUrl({root:e.frame,signal:this.abortSignal,codePath:"get-active-frame-locator"}),e.frame):this.page}async loadFrameAndRecordUrl({root:e,signal:t,codePath:n}){let o=this.pageLoadTimeout,i=e.url();if(!i.includes("chrome-error://")){try{await ys({promiseGenerator:async()=>e.waitForLoadState("domcontentloaded",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlDomContentLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){let s=a;if(s.name==="AbortError")throw new x("UserInfrastructureError",`The page with URL ${ft(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await ys({promiseGenerator:async()=>e.waitForLoadState("load",{timeout:o}),signal:t,codePath:`loadFrameAndRecordUrlPageLoad-${n}`,logger:this.logger,timeoutMs:this.pageLoadTimeout})}catch(a){this.logger.warn({err:a,codePath:n,url:i},"Failed waiting for current frame to load, continuing...")}this.recordUrlVisited(e.url())}}async getCondensedHtml(e){let{skipWait:t=!1}=e??{};return t||(await this.waitForPageLoad(),await this.waitForDOMStability()),this.getCondensedHtmlHelper()}async getCondensedHtmlHelper(){let e=await this.getRawCondensedHtml();return Xz.html(e,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1})}async getRawCondensedHtml(){let e=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(e,this.logger,this.abortSignal);let{result:t,error:n}=await st({fn:()=>window.getCondensedHtmlTree(),root:e,arg:void 0,timeout:Ee,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new x("InternalWebAgentError","Got empty HTML tree - are you sure the page is fully loaded?");return t}registerDialogHandler(e){let t=async n=>{try{e==="ACCEPT"?await n.accept():await n.dismiss()}catch(o){this.logger.warn({err:o},"Failed to handle dialog")}};this.page.once("dialog",t)}async evaluateFunctionInAllFrames(e,t){return this.stateManager.executeFunctionInAllFrames(e,t)}async evaluateFunctionInPage(e,t,n,o=Ee){let i=await this.getActivePageOrFrame();return st({root:i,fn:e,arg:t,timeout:o,waitForPageLoad:()=>this.waitForPageLoad(),codePath:n})}async evaluateCodeInPage({code:e,fragment:t,context:n,timeoutMs:o=_n}){let i=HC(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new x("ActionFailureError",`Code evaluation in browser exceeded the allowed timeout of ${o/1e3} seconds`)},signal:this.abortSignal});return s}async getDomNodeFromPixelPosition(e,t){await this.cdpClient.send({method:"DOM.getDocument",params:{depth:0},timeout:Ee});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:ne})}catch(o){throw this.logger.error({err:o,x:e,y:t},"Failed to get DOM node from position percents"),new Error("No element was found at the given location")}return n}async getDomNodeFromPositionPercentages(e,{percentX:t,percentY:n}){if(t<0||t>1||n<0||n>1)throw new x("UserConfigurationError","Invalid percent passed to percentage location");let{width:o,height:i,upperBound:a,leftBound:s}=await this.getViewportOffsetDetails(e),c=Math.round(a),l=Math.round(s),u=Math.ceil(o*t),d=Math.ceil(i*n),m=u+l,p=d+c;return this.getDomNodeFromPixelPosition(m,p)}async highlightFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n;try{n=await this.getDomNodeFromPositionPercentages(t,e)}catch{}return n?(await this.cdpClient.send({method:"Overlay.highlightNode",timeout:ne,params:{highlightConfig:dR,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:ne,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:ne})}catch{}}async getTargetFromPositionPercentages(e){let t=await this.getActivePageOrFrame(),n=await this.getDomNodeFromPositionPercentages(t,e);return this.getTargetFromBackendNodeId({root:t,backendNodeId:n.backendNodeId,allowNotActionableNodesOverride:e.allowNotActionableNodesOverride})}async getTargetFromBackendNodeId({root:e,backendNodeId:t,allowNotActionableNodesOverride:n}){let o=this.stateManager.domGraph?.backendIdToNode[t];if(!o)throw new Error("No DOM node was found with the given backend ID");let i=o?.attributes[mn],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Rr(a)),c;o.bounds.x!==null&&o.bounds.y!==null&&(c={x:o.bounds.x,y:o.bounds.y,width:o.bounds.width??0,height:o.bounds.height??0});let l=await this.fetchHtmlAttributes({locator:s,logger:this.logger,startingBoundingBox:c,allowNotActionableNodesOverride:n}),u={id:-1,dataMomenticId:a,targetSource:"XY_PERCENT",targetUpdateTime:new Date().toUTCString(),...l};return this.logger.debug({target:u},"Tied backend ID to HTML node"),{target:u,locator:s}}async performTargetRedirection(e,t,n){try{return await this.scrollIntoViewIfNeeded(e),await z(this.performTargetRedirectionHelper(e,t,n),{milliseconds:re})??{locator:e}}catch(o){return t.warn({err:o},"Error performing target redirection, using original element"),{locator:e}}}async performTargetRedirectionHelper(e,t,n){let o=Date.now();if(n===void 0&&(n=await e.boundingBox({timeout:re})??void 0),!n){let C=await xr(e,t,500);t.error(`Attempted to click on element with no bounding box: ${C}`);return}let{x:i,y:a,width:s,height:c}=n,l=this.getViewport();if(i<0||a<0||!l||i+s>l.width||a+c>l.height){t.info("Skipping locator redirection because the element is outside the viewport");return}let u=await this.getActivePageOrFrame(),{dataMomenticId:d,mPathSelector:m,error:p,serializedElement:g,foundElementRelativePoint:h,force:f,logs:E}=await e.evaluate(C=>{let R=window;if(!R.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return R.performTargetRedirection(C)},void 0,{timeout:ne}),b=Date.now()-o;if(p){t.warn({error:p,serializedElement:g,duration:b,force:f,logs:E},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(Rr(d)),hints:{relativeXYToLocator:h,force:f}};if(m)return t.info({newMPathSelector:m,serializedElement:g,duration:b,force:f,logs:E},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(m),hints:{relativeXYToLocator:h,force:f}};if(h)return t.info({foundElementRelativePoint:h,serializedElement:g,duration:b,force:f,logs:E},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:b,force:f,logs:E},"Forcing click on original element"),{locator:e,hints:{force:f}}}}async fetchHtmlAttributes({locator:e,logger:t=this.logger,startingBoundingBox:n,allowNotActionableNodesOverride:o}){let{hybridSelectorMode:i,showZeroOpacityElements:a}=this.userControlledBrowserSettings,s=await e.evaluate((c,l)=>{let u=window;return u.generateHtmlCacheAttributes?u.generateHtmlCacheAttributes(c,l):{warnings:[],error:"generateHtmlCacheAttributes is not defined"}},{generateHybridSelector:i==="test"||i==="prefer",startingBoundingBox:n,showZeroOpacityElements:o?!0:a},{timeout:Ee});if("error"in s&&s.error)throw s.error.startsWith(bC)?new ll(s.error):s.error.startsWith(EC)?new cl(s.error):new Error(s.error);return s.warnings.length&&t.warn(s,"Got warnings while generating HTML attributes for target"),s.attributes}async moveMouseFromPositionPercentages(e,t){let n=this.getViewport();if(!n)throw new Error("Cannot move mouse using percentages without viewport");let o=Math.ceil(n.width*e),i=Math.ceil(n.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseMoved",x:o,y:i,button:"left",clickCount:0}}),{x:o,y:i}}async clickMouseFromPositionPercentages(e,t,n){let o=this.getViewport();if(!o)throw new Error("Cannot click mouse using percentages without viewport");let i=Math.ceil(o.width*t),a=Math.ceil(o.height*n);await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:e==="down"?"mousePressed":"mouseReleased",x:i,y:a,button:"left",clickCount:e==="down"?1:0},timeout:ne})}async scrollFromPositionPercentages(e,t,n,o){let i=this.getViewport();if(!i)throw new Error("Cannot scroll using percentages without viewport");let a=Math.ceil(i.width*e),s=Math.ceil(i.height*t);return await this.cdpClient.send({method:"Input.dispatchMouseEvent",params:{type:"mouseWheel",deltaX:a,deltaY:s,x:n,y:o}}),{deltaX:a,deltaY:s}}canSolveCaptchas(){return!!xC}async getAllFrameUrls(){return await this.stateManager.getAllChildFrameUrls()}async setFileChooserHandler(e){setTimeout(()=>{try{e.cleanup()}catch(t){this.logger.debug({err:t,filePath:e.filePath},"Failed cleaning up file after upload")}},3e4),await this.setFileChooserHandlerHelper(e)}logToUserConsole(e,t,n,...o){let i=this.context.pages().indexOf(e);i=i===-1?0:i,Pg(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Au(e)){let c=`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`;this.logger.error(c),this.logToUserConsole(this.page,"error",c);return}let n=t?.trim()||zR(e),o=qz(e),i=Zz(e),a=Om[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Au(e))throw new Error(`File chooser triggered after the source file ${e} has been cleaned up, ignoring...`);await c.setFiles({name:n,buffer:o,mimeType:Jz.getType(e)||"application/octet-stream"},{timeout:du})}catch(l){this.logger.error({err:l},"Error handling file chooser"),this.logToUserConsole(this.page,"error",l.message)}});let s=o.toString("base64");await this.evaluateFunctionInPage(({fileName:c,base64Data:l,mimeType:u})=>{let d=window;d.momenticFileName=c,d.momenticFileBase64=l;let m=atob(l),p=new Array(m.length);for(let h=0;h<m.length;h++)p[h]=m.charCodeAt(h);let g=new Uint8Array(p);d.MomenticFile=class extends Blob{kind="file";name=d.momenticFileName;constructor(){super([g],{type:u})}isSameEntry(h){return h.name===this.name}queryPermission(h){return console.info("[MOMENTIC] MomenticFile.queryPermission called"),Promise.resolve("granted")}remove(){return console.info("[MOMENTIC] MomenticFile.remove called"),Promise.resolve()}async requestPermission(h){return console.info("[MOMENTIC] MomenticFile.requestPermission called"),Promise.resolve("granted")}async getFile(){console.info("[MOMENTIC] MomenticFile.getFile called");let h=new Blob([g]);return new File([h],d.momenticFileName,{type:u})}async createSyncAccessHandle(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}async createWritable(){throw console.error("[MOMENTIC] Not implemented"),new Error("Not implemented")}},d.showOpenFilePicker=async()=>(console.info("[MOMENTIC] showOpenFilePicker called"),[new d.MomenticFile])},{fileName:n,base64Data:s,mimeType:a},"set-file-chooser-handler",5e3)}getSerializedFormFromA11yId(e){return this.stateManager.a11yIdToNodeMap[e]?.getNodeOnlySerializedForm()}retrieveAndClearDebugData(){this.cdpClient.loadEventLogs.length>0&&(this.cdpClient.loadEventLogs=[]);let t={...this.debugData};return this.debugData={logsPerPage:[]},t}async copy(e){try{await this.evaluateFunctionInPage(t=>navigator.clipboard.writeText(t),e,"copying text to clipboard")}catch(t){if(t instanceof Error&&t.message.includes("Document is not focused")){await this.evaluateFunctionInPage(()=>{document.activeElement||document.body.focus()},void 0,"focusing on body element before copying to clipboard"),await this.press("Tab",{}),await this.press("Shift+Tab",{}),await this.evaluateFunctionInPage(n=>navigator.clipboard.writeText(n),e,"copying text to clipboard");return}throw t}}async paste(){await this.waitForPageLoad(),await this.press("Meta+V",{convertMeta:!0})}async registerRequestListener(e){return this.page.waitForResponse(t=>{let n=t.request();return e.matches({url:n.url(),method:n.method()})})}registerRequestRecorder(e,t){this.requestRecorders[e]=t}removeRequestRecorder(e){delete this.requestRecorders[e]}setHeader(e,t,n){this.customHeaders.push({key:e.toLowerCase(),value:t,matcher:n})}registerMock(e,t,n,o){let i=e??Zg();return this.mocks[i]={matcher:t,generateResponse:n,fetchOriginalResponse:o},i}removeMock(e){if(!e){this.mocks={};return}delete this.mocks[e]}async setOfflineMode(e){await this.context.setOffline(e)}get smartWaitingTimeout(){return this.userControlledBrowserSettings.smartWaitingTimeoutMs??AC}get userBrowserSettings(){return Fi(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Di}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=fu();for(let t of e)if(!(!Au(t)||!FR(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=e1(t,o);return Au(i)&&FR(i).isDirectory()&&Kz(i).length>0})))return t}};import P1 from"fetch-cookie";import{cloneDeep as cx}from"lodash-es";import{CookieJar as I1}from"tough-cookie";async function Sr({frameConfig:r,action:e,browser:t}){let n=t.getActiveFrameConfig();r?t.setActiveFrameConfig(r):n?.type==="auto"&&t.setActiveFrameConfig(void 0);try{return await e()}finally{t.setActiveFrameConfig(n)}}var r1=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function HR({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(r1.includes(n.type))return;let s=("cache"in n&&n.cache&&"target"in n.cache?n.cache.target:void 0)?.nodeOnlySerializedHtml?.includes("<a")??!1?300:3e3,c=Date.now(),l=0;for(;l===0||Date.now()-c<s;){await j(250),l++;let u=(await t.getOpenPages()).map(m=>m.url),d=t.url();if(u.length!==e.length)for(let m=u.length-1;m>=e.length;m--){let p=u[m];if(Co(p,o)&&p!==r&&p!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(m)});break}}}}async function Jr(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as l1}from"crypto";var VR={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},WR={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},GR=/<(\S+) id="(\d+)".*?>/g,n1=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,jR=["h1","h2","section","footer","nav","aside","form","label","dialog"],o1=[...jR,"span","div","h3"],i1=["table","select","form","ul","ol","menu","pre","code","dialog"],a1=["table","form","dialog","nav","section","ul","select"];function wu(r){return s1(r)}function s1({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4341
+ `),l=0,u=[],d=0,m=[],p=[],g=!1;for(;l<c.length;){g&&(s.push({ids:m,content:u.join(`
4342
+ `),tokenLength:d}),u=[],d=0,m=p.length?[p[p.length-1].id]:[],g=!1);let h=c[l],f=Mr(h);d+=f,h.length>a&&(h=h.slice(0,a));let C=Array.from(h.matchAll(GR)).map(G=>G&&G.length>=3?{tagName:G[1],id:G[2]}:void 0).filter(G=>!!G),v=Array.from(h.matchAll(n1)).map(G=>G&&(G[2]||G[4])).filter(G=>!!G);v.reverse();let M=h.replace(/ id="[0-9]+"/g,"");u.push(M);for(let G of C)m.push(G.id),p.push(G);for(let G of v){let $=p[p.length-1];$&&$.tagName===G&&p.pop()}let A=p.some(G=>i1.includes(G.tagName)),I=c[l+1]??"",k=Mr(I),oe=Array.from(I.matchAll(GR)).map(G=>G&&G.length>2?G[1]:void 0).filter(G=>!!G),Te=oe.some(G=>jR.includes(G)),At=oe.some(G=>o1.includes(G));d+k>=i&&(g=!0),d>=n&&(Te&&!A||v.some(G=>a1.includes(G)))&&(g=!0),d>=o&&At&&!A&&(g=!0),l++}return u.length&&s.push({ids:m,content:u.join(`
4343
+ `),tokenLength:d}),s.forEach((h,f)=>{let E=h.ids[0],b=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:E,maxId:b},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var c1=75e4,Cu=3e5;async function Po(r){let{options:e,fixtures:t,screenshot:n}=r,{aiPageFiltering:o}=e,{logger:i,generator:a,orgId:s,signal:c}=t,l=r.tree,u=r.serializedTree,d=Mr(u);if(d>c1)try{let m=wu({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await d1({...r,tokenLimit:Cu-1e4,chunks:m.chunks}),u=l.serialize();let p=Mr(u);i.info({oldTokens:d,newTokens:p},"Filtered page using keywords"),d=p}catch(m){i.warn({err:m},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Cu*Hn),u=l.serialize();let p=Mr(u);i.info({oldTokens:d,newTokens:p},"Filtered page using naive truncation"),d=p}if(d>Cu)try{if(o){let m=wu({serializedTree:u,options:WR,logger:i}),p=l1();l=await z(u1({...r,chunks:m.chunks,callId:p}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=Mr(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:p},"Filtered page using AI chunk ranking"),d=g}else{let m=wu({serializedTree:u,options:VR,logger:i});l=await z(m1({...r,chunkResult:m,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let p=Mr(u);i.info({oldTokens:d,newTokens:p},"Filtered page using RAG"),d=p}}catch(m){i.warn({err:m},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Cu*Hn),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function u1({type:r,callId:e,chunks:t,description:n,fixtures:o,tree:i}){let{generator:a,signal:s,logger:c}=o,l=await a.rankChunksWithAi({chunks:t,description:n,type:r,softTokenLimit:4e4,hardTokenLimit:8e4,callId:e},{abortSignal:s,logger:c,loggerTags:be(c)}),u=[];return t.forEach((m,p)=>{l.indices.includes(p)&&(u=u.concat(m.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function d1(r){let{description:e,fixtures:t,tree:n}=r,{generator:o,logger:i,signal:a}=t;if(!e.trim())throw new Error("Empty description passed to page filtering");let s=await o.getExtractedKeywords({goal:e},{logger:i,loggerTags:be(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(p=>p.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((p,g)=>p+g.tokenLength,0)>r.tokenLimit&&l.length>1)continue;let d=l.flatMap(p=>p.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function m1(r){let{description:e,fixtures:t,chunkResult:n,tokenLimit:o,tree:i}=r,{generator:a,logger:s,signal:c}=t,l=await a.rankChunksWithRag({description:e,chunks:n.chunks,tokenLimit:o},{abortSignal:c,logger:s,loggerTags:be(s)});if(l.ids.length===0)throw new Error("RAG returned no important ids");return i.pruneUsingRelevantIds(new Set(l.ids.map(d=>`${d}`)))}async function rh(r,e){if(!r.description)throw new x("UserConfigurationError","Cannot locate element with empty description");return Sr({action:async()=>p1(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function p1(r,e){let{disableCache:t,testContext:n,filterByViewport:o,skipWait:i,source:a,memory:s,aiPageFiltering:c,logger:l,allowNotActionableNodesOverride:u}=r,{ctx:d,orgId:m,browser:p,localCodeEvalTools:g,generator:h,abortSignal:f}=e,E=r.description,b=r.useMemory&&!t;n&&(E=await Es({orgId:m,s:E,context:n,localTools:g,signal:f,logger:l})),a&&(E=h1(E,a));let{serializedTree:C,tree:R}=await Jr(p,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),v,M=Date.now(),A;for(;!v&&Date.now()-M<3e3;){f.throwIfAborted();try{v=await p.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(se){A=se}}if(!v)throw new x("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${A?.message}`);let I=C,k=!1,oe=`data:image/jpeg;base64,${v.toString("base64")}`;I=await Po({type:"locator",description:E,screenshot:oe,serializedTree:C,options:{aiPageFiltering:c},tree:R,fixtures:{generator:h,signal:f,logger:l,orgId:m}}),I!==C&&(k=!0);let Te=await h.getElementLocation({browserState:I,goal:E,screenshot:oe,source:a,memory:b?s:void 0},{disableCache:t,abortSignal:f,loggerTags:be(l),useMemory:b});if(l.debug({usedRag:k,result:Te},"Got locator result"),!(Te.id>0))throw new vn(`Could not find any relevant element: ${Te.thoughts}`,Te.updatedMemory?{type:"GCS_TRACES",traces:Te.updatedMemory}:void 0);let{resolution:G,target:$,frameConfig:he}=await p.createTargetFromA11yId({id:Te.id,requirements:Te.requirements,additionalElements:Te.additionalElements,description:E,targetSource:"AI",logger:l});if(G.a11yNode?.properties?.hidden&&G.a11yNode?.properties?.hidden!=="false")throw new x("ActionFailureError",`Momentic's AI found a relevant element to interact with, but it is explicitly marked with an 'aria-hidden' attribute. Please remove this attribute or adjust the element description to locate a different element. Element chosen: ${G.displayString}`);return b&&(Te.updatedMemory?$.memory={type:"GCS_TRACES",traces:Te.updatedMemory}:s&&($.memory=s)),{thoughts:Te.thoughts,target:$,resolution:G,frameConfig:he,screenshot:oe}}var g1=["Element exactly matching the description below. Interpret the description narrowly and do not assume there are any typos or errors. Err on the side of returning -1 unless there is a perfect match. Description:","Element closely matching the description below. Interpret the description narrowly and do not return elements that are merely loosely related. Description:","Element matching the description below. This element is being located as part of a negative check step (i.e. we are trying to verify the element does not exist). Therefore, interpret the description narrowly, do not assume there are typos, and err on the side of returning -1 unless there is a perfect match. Description:"],$R="<select> element:",qR="text input or contenteditable element:",KR="Element matching the description below. It is possible the element is hidden or doesn't exist. Interpret the description narrowly and do not assume there are typos. Return -1 unless there is an straightforward match. Description:",YR="Element matching the description below. This element is being located as part of a check step (i.e. we are trying to verify certain properties about the element). Interpret the description narrowly and do not return elements that are merely loosely related. Description:",th=[$R,qR,KR,YR,...g1];function XR(r,e){if(r===e)return!0;for(let t of th){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(th.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!th.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function h1(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${$R} ${r}`;case"TYPE":return`${qR} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${KR}
4344
+ ${r}`;case"ELEMENT_CHECK":return`${YR}
4345
+ ${r}`;default:return r}}var f1=15;async function Ru({command:r,aiPageFiltering:e,logger:t,fixtures:n,source:o,useMemory:i,maxRetries:a=f1}){if(!r.assertion.trim())throw new x("ActionFailureError","Assertion command is missing the assertion content");let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=tu(c),u=0,d=Date.now(),m,p,g;try{await Sr({action:()=>s.clearHighlights(),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:s,logger:t})}catch(f){t.warn({err:f},"Failed to clear highlights before AI check, continuing...")}let h;for(;u<a&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await j(l,n.abortSignal),h=Date.now();let f=!1;try{if(m=await Sr({action:async()=>{let b=await JR(s,t,n.abortSignal);return p&&p.serializedTree===b.serializedTree&&p.screenshotBuff.equals(b.screenshotBuff)?(f=!0,m):(p=b,QR({command:r,state:b,fixtures:n,useMemory:i,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:o}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),m?.success){m?.updatedMemory&&fs(r,m.updatedMemory,t);break}else throw m?.thoughts?new x("AssertionFailureError",m.thoughts):new x("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(E){n.abortSignal.throwIfAborted(),g=E instanceof Error?E:new Error(`${E}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:E},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!m?.success)try{m=await Sr({action:async()=>QR({command:r,state:await JR(s,t,n.abortSignal),fixtures:n,useMemory:i,useConsensus:!0,highlightElementsOnFailure:!0,attemptNumber:u,aiPageFiltering:e,logger:t}),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s})}catch(f){n.abortSignal.throwIfAborted(),g=f instanceof Error?f:new Error(`${f}`)}finally{u++}if(m?.updatedMemory&&fs(r,m.updatedMemory,t),!m?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new x("AssertionFailureError",f)}return{...m,succeedImmediately:!1,urlAfterCommand:s.url()}}async function JR(r,e,t){let[n,o]=await Promise.all([Jr(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function QR({command:r,state:e,fixtures:t,useConsensus:n,useMemory:o,highlightElementsOnFailure:i,aiPageFiltering:a,attemptNumber:s,source:c,logger:l}){let{browser:u,generator:d,abortSignal:m}=t,p={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,E=f.toString("base64"),b=u.url(),C=r.contextChoice??"MULTIMODAL",R=g;C!=="VISION_ONLY"&&(R=await Po({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:E,options:{aiPageFiltering:a},fixtures:{generator:d,signal:m,logger:l,orgId:t.orgId}}),R!==g&&(p.ragUsed=!0),p.pageState=R);let v={goal:r.assertion,url:b,memory:o?r.cache?.memory:void 0,browserState:R,screenshot:E,contextChoice:C,source:c},A=await(C==="VISION_ONLY"?(I,k)=>d.getVisualAssertionResult(I,k):(I,k)=>d.getAssertionResult(I,k))(v,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:m,logger:l,loggerTags:be(l)});return(A.result||i)&&A.relevantElements&&(p.relevantElementsSerialized=A.relevantElements.map(I=>u.getSerializedFormFromA11yId(I)).filter(I=>!!I),await S1(A.relevantElements,u,l)),{success:A.result,thoughts:A.thoughts,afterScreenshotOverride:f,updatedMemory:o?A.updatedMemory:void 0}}async function S1(r,e,t){let n=Date.now();for(let o of r){if(Date.now()-n>2e3){t.debug("Highlighting relevant elements took over 2s, aborting...");return}try{let i=new AbortController;await z(e.highlightA11yId(o),{milliseconds:1e3,fallback:()=>{throw i.abort(),new Error("Timed out waiting for highlighting to complete")}})}catch(i){t.debug({err:i},"Failed to highlight relevant element after assertion, continuing...");return}}}var y1=75e4,xu=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function ZR(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await b1(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof xu?t.warn("Skipping AI smart waiting due to excessive page size - falling back to naive waiting"):t.warn({err:a},"Unexpected error occurred during AI smart waiting");let s=o.smartWaitingTimeout-(Date.now()-i);s>0&&await j(s,n)}finally{t.debug({durationMs:Date.now()-i},"AI smart waiting complete")}}async function b1(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await j(o.smartWaitingTimeout,n);return}if(!e.description)throw new x("UserConfigurationError","Cannot locate element with empty description");await z(E1(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function E1(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await Sr({action:async()=>T1(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function T1(r,e){let{testContext:t,logger:n,filterByViewport:o,allowNotActionableNodesOverride:i}=r,{browser:a,abortSignal:s,localCodeEvalTools:c,orgId:l,generator:u}=e,d=r.description;t&&(d=await Es({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:m}=await Jr(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Mr(m)>y1)throw new xu;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(b){throw new x("ActionFailureError",`Failed to take screenshot of page to perform smart waiting. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${b instanceof Error?b.message:b}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let E=await u.getSmartWaitingDecision({browserState:m,description:d,screenshot:f},{abortSignal:s,loggerTags:be(n)});return n.debug({result:E},"Got smart waiting result"),E.isPageReady}import{cloneDeep as tx}from"lodash-es";async function rx(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>uf(e.cache)?e.cache:void 0,a=i(),s=tx(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=dw(s,a);a.target=f.target,a.updatedAt=f.updatedAt}else{if(!s){a=void 0;return}a.target=s.target,a.updatedAt=s.updatedAt}},l=Date.now(),u=0,d,m=500,p=!1;for(;u<2||Date.now()-l<t;){u++,u>1&&await j(m,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await ex({cacheToUse:a,params:r});if(d=h,p=f,h.success)break;c(),m=Math.min(m*2,1e4)}if(!d)throw new x("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&Ks(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await ex({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!p&&(g.target=lg(g.target),g.updatedAt=new Date),d}async function ex({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!yn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=Yc(t.assertion),l,u=!1,d=tx(r);try{let{elementInteractedDisplayString:m,result:p,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>v1(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ea(t),targetName:"target"}});return l={success:p.success,data:p.data,err:p.err,elementInteractedDisplayString:m,thoughts:g},u=!0,p.success||(s.warn({aiThoughts:g,elementString:m,err:p.err},"Element check found an element but failed"),l={...p,thoughts:g}),{result:l,elementWasFound:u}}catch(m){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${m.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(m instanceof x)||m.reason!="ActionFailureError")throw m;return l={success:!1,err:m,data:void 0,thoughts:void 0},s.warn({err:m},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function v1(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await A1(r,e.assertion)}async function A1(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:ft(a,500,!0)},!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:ft(await r.evaluate(s=>s.cloneNode(!1).outerHTML),500,!0)};let a;try{a=await r.getAttribute(e.attr,{timeout:3e3})??""}catch(s){n=new x("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new x("AssertionFailureError",`The attribute ${e.attr} ${s} '${e.value}': ${a}`)}break}case"ELEMENT_EXISTENCE":{switch(e.condition){case"VISIBLE":{t=await r.evaluate(async(s,c)=>{let l=Date.now();for(;Date.now()-l<c;){await new Promise(d=>setTimeout(d,250));let u=s.getBoundingClientRect();if(!(u.width===0||u.height===0)&&window.getComputedStyle(s).visibility!=="hidden"&&window.getComputedStyle(s).display!=="none")return!0}return!1},Lt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Lt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Lt*1e3});break}case"FOCUSED":{t=await r.evaluate(s=>s===document.activeElement);break}default:return(s=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e.condition)}if(t=e.negated?!t:t,!t){let a=gr(e);n=new x("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=gr(e);t=!1,n=new x("AssertionFailureError",`The element tag name ${s} '${e.value}': ${a}`)}break}case"ELEMENT_STYLE":{let a=await r.evaluate((s,c)=>window.getComputedStyle(s).getPropertyValue(c),e.property);if(!jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=gr(e);t=!1,e.operation==="EXISTS"?n=new x("AssertionFailureError",`The style property ${e.property} ${s}`):n=new x("AssertionFailureError",`The style property ${e.property} ${s} '${e.value}': ${a}`)}break}default:return(a=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(e)}return{thoughts:void 0,success:t,data:o,err:n}}function nx(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as w1}from"jimp";async function Cs(r,e){let t=await r.screenshot(e),n=await w1.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as ox}from"jimp";import nh from"jpeg-js";import C1 from"pixelmatch";async function ix({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!yn(t.target))throw new Error("Visual Diff with x/y is not supported yet");await o.waitForDOMStability({logger:a});let c={clearHighlights:!0,hideCaret:!0},l;t.target?.elementDescriptor?l=(await i({ctx:r,tracer:e,command:t,target:t.target,cache:t.cache?.target,action:async oe=>Cs(o,{locator:oe.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await Cs(o,c);let u=await s.prepareGoldenScreenshotForComparison(a,t,l);if((l.height!==u.height||l.width!==u.width)&&a.warn({currHeight:l.height,currWidth:l.width,savedHeight:u.height,savedWidth:u.width},"Mismatched before and after visual diff screenshot sizes"),Math.abs(l.height-u.height)>10||Math.abs(l.width-u.width)>10){let W=`${l.width}x${l.height}`,oe=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${W}) does not match saved screenshot dimensions (${oe}) - did you change the size of the target or the viewport?`,beforeScreenshotOverride:u.buffer,afterScreenshotOverride:l.buffer,succeedImmediately:!1,urlAfterCommand:o.url()}}let d=await ox.fromBuffer(l.buffer),m={width:l.width,height:l.height},p=await ox.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=m.width*m.height,E=g.width*g.height,b=Math.abs(m.height-g.height),C=Math.abs(m.width-g.width);if(f>E){let W=d.cover({w:g.width,h:g.height});l.buffer=await W.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(E>f){let W=p.cover({w:m.width,h:m.height});u.buffer=await W.getBuffer("image/jpeg"),h="saved"}let R={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},v=t.threshold??.1,A=C1(nh.decode(u.buffer).data,nh.decode(l.buffer).data,R.data,l.width,l.height,{threshold:v,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,I=A>v*100,k=`Visual diff of ${A.toFixed(2)}% detected, which is ${I?"over":"under"} the threshold of ${v*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${b} pixels and wider by ${C} pixels.`),I)throw new x("ActionFailureError",k);return{fail:I,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:nh.encode(R,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var R1=3e4;function x1(r){if(!r.body)return{};switch(r.body.type){case"json":return{content:r.body.content,contentType:"application/json"};case"form-urlencoded":{let e=new URLSearchParams;return Object.entries(r.body.content).forEach(([t,n])=>{e.append(t,n)}),{content:e.toString(),contentType:"application/x-www-form-urlencoded;charset=UTF-8"}}}}async function Mu({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??R1/1e3,i=Object.fromEntries(Object.entries(r.headers||{}).filter(([g,h])=>g&&h)),a=new URLSearchParams;Object.entries(r.params||{}).filter(([g,h])=>g&&h).forEach(([g,h])=>{a.append(g,h)});let s=a.toString(),c;if(Li(r.url)&&(c=r.url),t&&Ni(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=c;e.info({url:l,searchParams:s,headers:i,body:r.body,method:r.method},"Making HTTP request");let d=await z((async()=>{let g=s?`${l}?${s}`:l;try{let h=x1(r),f=new Headers(i);return h.contentType&&!f.has("Content-Type")&&f.set("Content-Type",h.contentType),await n(g,{headers:f,method:r.method,body:h.content})}catch(h){throw e.error({err:h},"Failed to make HTTP request"),new Error(`Failed to make HTTP request: ${h}`)}})(),{milliseconds:o*1e3,fallback:()=>{throw new x("ActionFailureError",`Fetch request timed out after ${o} seconds`)}});if(!d.ok){let g;try{g=await d.text()}catch(h){g=`Failed to read response body: ${h}`}throw new x("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let m={};d.headers.forEach((g,h)=>{m[h]=g});let p={status:d.status,headers:m,request:{url:d.url,method:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{p.request.json=JSON.parse(r.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{p.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(p.text=await d.text());return p}var M1=5e3;async function sx({timeout:r=Lt,...e}){let t=Date.now(),n=r*1e3,o=n+1e4,i,a=0,s=500;for(;a-t<n;){if(Date.now()-t>o){e.logger.warn("Exceeded max system timeout for page assertion, exiting...");break}e.signal?.throwIfAborted();let c=Date.now();i=await _u(e),a=Date.now();let l=a-c;if(l>1e3&&e.logger.warn({pageAssertDuration:l},"Page assertion took longer than expected"),!i.success)await j(s,e.signal),s=Math.min(Math.floor(s*1.5),M1);else return i}return i=await _u(e),i}async function _u({assertion:r,browser:e,autoExpandIframes:t}){switch(r.type){case"CONTENT":case"CONTENT":{let o,i=!1,a;try{let s;if(t){let c=await e.evaluateFunctionInAllFrames(ax,{value:r.value,negated:!!r.negated,returnHtml:!1});i=r.negated?c.every(l=>l.evaluation):c.some(l=>l.evaluation),s=c.find(l=>l.pageHtml)?.pageHtml}else({evaluation:i,pageHtml:s}=await e.evaluateFunctionInPage(ax,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?un.CONTAINS:dn.CONTAINS;a=new x("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new x("AssertionFailureError",`Failed to evaluate page content assertion: ${s instanceof Error?s.message:`${s}`}`)}return{success:i,err:a,data:i||!o?void 0:{pageContent:o}}}default:return(o=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(r)}}function ax({value:r,negated:e,returnHtml:t}){let n=document.documentElement.outerHTML,o=n.includes(r)===!e;return n.length>1e4&&(n=n.slice(0,1e4)+"...TRUNCATED"),{evaluation:o,pageHtml:!o&&t?n:void 0}}var _1=3e4;async function lx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??_1/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,m])=>d&&m));a["Content-Type"]="application/json";let s;if(Li(r.url)&&(s=r.url),t&&Ni(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new x("ActionFailureError",`Invalid URL: ${r.url}`);let l=await z((async()=>{try{return await n(s,{headers:a,method:"POST",body:JSON.stringify({query:r.query,variables:r.variables?JSON.parse(r.variables):void 0}),signal:i.signal})}catch(d){e.error({err:d},"Failed to make HTTP request")}})(),{milliseconds:o*1e3});if(!l)throw new x("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,m=await l.text();try{d=JSON.parse(m)}catch{throw new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}throw d?.errors?.length&&d?.errors[0]?.message?new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new x("ActionFailureError",`GraphQL request failed with status ${l.status}: ${m}`)}let u={};return l.headers.forEach((d,m)=>{u[m]=d}),{status:l.status,headers:u,json:await l.json()}}var Pu=class{orgId;options;storage;localCodeEvalTools;uploadedFileStorage;visualDiffScreenshotStorage;browser;generator;executeAbortController=new AbortController;logger;recordAbortController=null;registeredListeners={};recordedRequests={};constructor({browser:e,generator:t,logger:n,storage:o,orgId:i,localCodeEvalTools:a,uploadedFileStorage:s,visualDiffScreenshotStorage:c,options:l}){this.orgId=i,this.options=l,this.browser=e,this.browser.registerAbortSignal(this.executeAbortController.signal),this.storage=o,this.uploadedFileStorage=s,this.visualDiffScreenshotStorage=c,this.localCodeEvalTools=a,this.generator=t,this.logger=n}setOpen(){this.executeAbortController=new AbortController,this.browser.registerAbortSignal(this.executeAbortController.signal)}setClosed(){this.executeAbortController.abort()}throwIfClosed(){this.executeAbortController.signal.throwIfAborted()}get closed(){return this.executeAbortController.signal.aborted}async evaluateAiAction({goal:e,startingScreenshot:t,history:n,disableCache:o,langfuseSessionId:i,lastError:a,logger:s=this.logger}){let[c,l]=await Promise.all([Jr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:s}),this.browser.screenshot({retries:1,clearHighlights:!0})]),u=`data:image/jpeg;base64,${l.toString("base64")}`,d=await Po({type:"ai-action",description:e,screenshot:u,serializedTree:c.serializedTree,tree:c.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:s,orgId:this.orgId}}),m={url:this.browser.url(),browserState:d,startingScreenshot:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(m,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...be(s)},langfuseSessionId:i})}async promptToCommand({goal:e,startingScreenshot:t,history:n,actionHint:o,disableCache:i,logger:a=this.logger,langfuseSessionId:s}){let c=this.browser.url(),[l,u]=await Promise.all([Jr(this.browser,{abortSignal:this.executeAbortController.signal,skipWait:!0,skipWaitForPageLoad:!0,logger:a}),this.browser.screenshot({retries:1,clearHighlights:!0})]),d=`data:image/jpeg;base64,${u.toString("base64")}`,m=await Po({type:"ai-action",description:e,screenshot:d,serializedTree:l.serializedTree,tree:l.tree,options:{aiPageFiltering:!!this.options?.aiPageFiltering},fixtures:{generator:this.generator,signal:this.executeAbortController.signal,logger:a,orgId:this.orgId}}),p={url:c,browserState:m,startingScreenshot:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(p,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...be(a)},langfuseSessionId:s})}catch(g){throw new x("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return Jr(this.browser,e)}async locateElement(e){return await rh({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return Sr({action:async()=>{let n=await this.browser.resolveHardcodedCssSelector({ctx:null,selector:e,timeoutMs:2e3,logger:this.logger});return{thoughts:"Located element with selector",target:{id:-1,selector:e,targetSource:"USER_CSS_SELECTOR",targetUpdateTime:new Date().toUTCString()},resolution:n}},frameConfig:t?{type:"url",url:t}:void 0,browser:this.browser,logger:this.logger})}getControllerFixtures(e){return{ctx:e??null,browser:this.browser,generator:this.generator,logger:this.logger,orgId:this.orgId,storage:this.storage,localCodeEvalTools:this.localCodeEvalTools,abortSignal:this.executeAbortController.signal}}shouldUseMemory(){return this.options?.useMemory??(this.orgId==="org_01HMSCJQBCCG51M2ZF65YC5B8W"||this.orgId==="org_01HMJTX4GT1KG94KZRCT8MZ6YB")}async wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:a,action:s,options:c,retriesWithAI:l=1}){let u=[];for(let d=0;d<i.length;d++){let m=i[d],p=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:m,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(p)}try{let d=await s(...u.map(g=>g.result)),m=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",p=u.map((g,h)=>g.thoughts?`${m(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:p}}catch(d){if(this.throwIfClosed(),l>0)return this.logger.warn({err:d},"Failed to execute action with multiple cached targets, retrying with AI"),this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:o,descriptions:i,caches:i.map(()=>{}),action:s,options:c,retriesWithAI:l-1});throw new x("ActionFailureError",d.message,{errOptions:{cause:d}})}}async wrapElementTargetingCommand(e){let t=this.logger.child({commandId:e.command.id}),n;for(let o=0;o<2;o++)try{return await Sr({action:()=>this.wrapElementTargetingCommandHelper({...e,originalCache:e.originalCache??e.cache}),frameConfig:e.options.iframeUrl?{type:"url",url:e.options.iframeUrl}:void 0,browser:this.browser,logger:t})}catch(i){if(n=i,this.browser.userBrowserSettings.visualActions&&kd(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Bd(i)||Ud(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(zd(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof Dr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof x?n:new x("ActionFailureError",n?.message??"An unknown error occurred during element targeting")}async wrapHardcodedCssTargetingCommandHelper({ctx:e,target:t,action:n,options:o,command:i}){let a=this.logger.child({commandId:i.id}),{targetName:s}=o;if(t.type!=="description")throw new x("ActionFailureError","Cannot use selector with non-description target");let c,l=Date.now(),u=Date.now();for(;Date.now()-u<this.browser.smartWaitingTimeout;){l=Date.now();try{let d=await this.browser.resolveHardcodedCssSelector({ctx:e,selector:t.elementDescriptor,targetName:s,logger:a});return{result:await n({locator:d.locator}),elementInteractedDisplayString:d.displayString}}catch(d){if(d.name==="AbortError")throw d;c=d,a.warn({err:d},"Failed to action on hardcoded css selector"),Date.now()-l<500&&await j(500)}}throw c}async wrapElementTargetingCommandHelper(e){let{ctx:t,tracer:n,target:o,originalCache:i,action:a,options:s,command:c}=e,{disableCache:l,useSelector:u,targetName:d,targetHealingInProgress:m,source:p}=s,g=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,E=!1,b=cx(e.cache);if((!b||l)&&!Ad(o))throw new x("ActionFailureError","Cannot target element with no cached data or element descriptor");if(u)return this.wrapHardcodedCssTargetingCommandHelper(e);l&&(g.info("Cache explicitly disabled for this step"),E=!0,b=void 0),b&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&b.targetSource==="HEURISTIC_HEALED"&&(E=!0,b=void 0),b?.inputDescription&&!XR(o.elementDescriptor,b.inputDescription)&&(g.warn({old:b.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),E=!0,b=void 0);let C=v=>!!v&&Ks(v),R=!0;if(!C(b)){R=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:m,cacheBustedBeforeAction:E,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(E||!i)&&await ZR({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:p,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let v;try{v=await rh({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:p,useMemory:h,memory:h?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:g},this.getControllerFixtures(t))}catch(I){if(I instanceof vn&&I.updatedLocatorMemory){let k={id:-1,...i,memory:I.updatedLocatorMemory};Jc({cmd:c,key:d,newTarget:k,logger:g,updatedWithAI:!0})}throw new x("ActionFailureError",I.message)}v.frameConfig&&this.browser.setActiveFrameConfig(v.frameConfig);let M=s.disableGlobalLocatorRedirect?{locator:v.resolution.locator}:await this.attemptLocatorRedirect(v.resolution.locator,g),A=await a(M);return Jc({cmd:c,key:d,newTarget:v.target,logger:g,updatedWithAI:!0}),m&&(n.recordTargetAutoHeal({healType:"AI"}),v.target.targetSource="AI_HEALED",v.target.targetUpdateTime=new Date().toUTCString(),v.target.targetUpdateLoggerTags=be(g)),{result:A,elementInteractedDisplayString:v.resolution.displayString,thoughts:v.thoughts}}try{let v=await this.browser.resolveTarget(t,b,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(v.locator);let M=s.disableGlobalLocatorRedirect?{locator:v.locator}:await this.attemptLocatorRedirect(v.locator,g),A=await a(M);if(Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),Jc({cmd:c,key:d,newTarget:b,logger:g,updatedWithAI:!1}),R){let I=v.decisions.filter(k=>k.matched);if(I.length!==1)g.warn({decisions:v.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=I[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:A,elementInteractedDisplayString:v.displayString}}catch(v){this.throwIfClosed();let M="unknown";v instanceof Nr&&v.cacheMissReason&&(M=v.cacheMissReason),Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!b.requirements}`,`hasAdditionalElements:${!!b.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.13.2",`missReason:${M}`]);let A=!1;if((v instanceof Dr||kd(v)||Bd(v)||zd(v)||fS(v)||Ud(v)||SS(v))&&(A=!0),v instanceof x&&!A)throw g.error({err:v},"Failed to execute action with cached target (fatal)"),v;if(f>0&&o){g.info({err:v},"Failed to execute action with cached target, retrying with AI");let I;return b.memory&&of(b.memory)&&(I=b.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:I,retriesWithAI:f,targetHealingInProgress:!0}})}throw new x("ActionFailureError",v.message,{errOptions:{cause:v}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return Cs(this.browser,e)}async executePresetCommand(e,t,n,o,i){this.options?.slowMoMs&&await j(this.options.slowMoMs);let a=await this.browser.getOpenPages(),s=this.browser.url(),c;try{c=await this.resolveCommandTemplateStrings(n,o)}catch(l){throw this.throwIfClosed(),new x("ActionFailureError",`Failed to substitute template strings in command: ${l.message}`,{errOptions:{cause:l}})}try{let l=await this.executePresetCommandHelper(e,t,n,o,i);return this.browser.userBrowserSettings.visualActions&&Df(n)?await this.browser.waitForDOMStability({timeout:Ee}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:ne}),this.options?.autoFollowNewTabs&&await HR({beforeUrl:s,command:n,beforePages:a.map(u=>u.url),browser:this.browser,logger:this.logger}),l}catch(l){throw l.name!=="AbortError"&&this.logger.error({err:l},"Error thrown in action controller"),l}finally{cu(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>xg(e)}}async resolveCommandTemplateStrings(e,t){return lu({obj:e,context:t,bannedKeys:["type","a11yData","thoughts","cache","code"],orgId:this.orgId,logger:this.logger,signal:this.executeAbortController.signal,localTools:this.localCodeEvalTools})}async executePresetCommandHelper(e,t,n,o,i){i=i||"disableCache"in n&&!!n.disableCache;let a=this.logger.child({commandId:n.id});switch(n.type){case"SUCCESS":let s=n.condition;return s?.assertion.trim()?Ru({command:s,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a}):{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AI_ASSERTION":{if(!n.assertion.trim())throw new x("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new x("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ru({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new x("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=IE(n.schema);if(h)throw new x("UserConfigurationError",h)}let p=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:p,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:be(a)});if(h.result==="NOT_FOUND")throw new x("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new x("UserConfigurationError",h.thoughts);return{thoughts:h.thoughts||void 0,data:h.result,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}catch(h){let f=h.message;throw f.includes("MaxGenerationLengthExceededError")?new x("UserConfigurationError","You tried to extract too much data. Please rephrase your query to limit the results returned or use a JavaScript step in the browser instead."):f.includes("AIProviderError")&&f.includes("time")?new x("AIProviderError","The AI provider responded with an error. This may be because you tried to extract too much data. Please limit extraction results to 2000 characters.",{errOptions:{cause:h}}):h}}case"NAVIGATE":if(!Li(n.url)&&!Ni(n.url,this.browser.baseUrl))throw new x("ActionFailureError",`Invalid URL provided to navigate command: ${n.url}`);await this.browser.navigate({url:n.url,loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"DIALOG":this.browser.registerDialogHandler(n.action);break;case"CAPTCHA":throw new x("UserConfigurationError","Captcha solving is no longer available on Momentic");case"GO_BACK":await this.browser.goBack();break;case"GO_FORWARD":await this.browser.goForward();break;case"SCROLL_LEFT":case"SCROLL_RIGHT":case"SCROLL_DOWN":case"SCROLL_UP":{let p,g;if(n.target&&Ir(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:E,thoughts:b}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:C=>this.browser.hover(C),options:{...n,targetName:"target",disableGlobalLocatorRedirect:!0,disableCache:i}});p=E,g=b}let h=this.browser.getViewport()?.height??Rn.height,f=this.browser.getViewport()?.width??Rn.width;switch(n.type){case"SCROLL_UP":await this.browser.scrollVertical(-(n.deltaY??h));break;case"SCROLL_DOWN":await this.browser.scrollVertical(n.deltaY??h);break;case"SCROLL_LEFT":await this.browser.scrollHorizontal(-(n.deltaX??f));break;case"SCROLL_RIGHT":await this.browser.scrollHorizontal(n.deltaX??f);break}return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new x("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let p=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:p},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new x("UserConfigurationError",`Wait timeout of ${n.delay} seconds exceeds the maximum allowed value of 30 minutes`);let c=n.delay*1e3;await j(c,this.executeAbortController.signal);break;case"REFRESH":await this.browser.refresh({loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"CLICK":{if(Ir(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let p=this.browser.url(),{elementInteractedDisplayString:g,result:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:b=>this.browser.click(b,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),E={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return nu(p,E.urlAfterCommand)&&(E.succeedImmediately=!0,E.succeedImmediatelyReason="URL changed"),E}case"COPY":return await this.browser.copy(n.value),{succeedImmediately:!1,data:n.value,urlAfterCommand:this.browser.url()};case"PASTE":{await this.browser.paste();break}case"DRAG":{if(Ir(n.fromTarget)&&Ir(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverSeconds:n.hoverSeconds});break}if(Ir(n.fromTarget)||Ir(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:p,thoughts:g}=await this.wrapMultiElementTargetingCommand({ctx:e,tracer:t,command:n,targetNames:["fromTarget","toTarget"],descriptions:[n.fromTarget,n.toTarget],caches:[n.cache?.fromTarget,n.cache?.toTarget],action:(h,f)=>this.browser.dragAndDrop(h.locator,f.locator,{hoverSeconds:n.hoverSeconds,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p[0],thoughts:g}}case"MOUSE_DRAG":{let p=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(p)||isNaN(g))throw new x("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&Ir(n.target)){await this.browser.mouseDragUsingVisualCoordinates(p,g,h,void 0,n.target.pixels);break}let f,E;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:b,thoughts:C}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async R=>this.browser.mouseDrag(p,g,h,R.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=b,E=C}else await this.browser.mouseDrag(p,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:E}}case"SELECT_OPTION":{if(!yn(n.target))throw new Error("Select with x/y is not supported yet");let p=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:p},cache:n.cache?.target,action:E=>this.browser.selectOption(E,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ea(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let p={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,p);break}case"NEW_TAB":await this.browser.createNewTab(n.url,{loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0});break;case"COOKIE":if(!n.value)break;let l=await this.browser.setCookie(n.value);a.debug({results:l},"Set cookies");break;case"LOCAL_STORAGE":if(!n.value||!n.key)break;await this.browser.setLocalStorage(n.key,n.value);break;case"JAVASCRIPT":{let p;try{n.environment==="BROWSER"?(p=await this.browser.evaluateCodeInPage({code:n.code,fragment:n.fragment??!1,context:o.toObjectCopy(),timeoutMs:n.timeout?n.timeout*1e3:void 0}),a.info({result:p},"Executed JavaScript in browser")):p=await qr({orgId:this.orgId,code:n.code,fragment:!!n.fragment,context:o,timeoutMs:n.timeout?n.timeout*1e3:void 0,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal,callbacks:{onPersistentVariableUpdates:async g=>{if(!this.options?.scratchPadId){a.warn({updates:g},"Got persistent variable updates but scratch pad is not available");return}await this.storage.savePersistentVariables?.({scratchPadId:this.options?.scratchPadId,orgId:this.orgId,updates:g,logger:a})}}})}catch(g){throw this.throwIfClosed(),new x("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(p)}catch(g){throw new x("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:p}}case"TYPE":{if(n.target&&Ir(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n),await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);break}let p=this.browser.url(),g,h,f=cx(n.target),E=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:C,thoughts:R}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:v=>this.browser.typeIntoTarget(n.value,v,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter,relativePosition:n.relativePosition}),options:{...n,targetName:"target",disableCache:i,disableGlobalLocatorRedirect:!E,source:Ea(n)}});g=C,h=R}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return nu(p,b.urlAfterCommand)&&(b.succeedImmediately=!0,b.succeedImmediatelyReason="URL changed"),b}case"HOVER":{if(Ir(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.hover(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"FOCUS":{if(!yn(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:h=>this.browser.focus(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"BLUR":{if(n.target&&!yn(n.target))throw new Error("Blur with x/y is not supported yet");if(!n.target||!n.target.elementDescriptor)return await this.browser.blur(null),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};let{elementInteractedDisplayString:p,thoughts:g}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,target:n.target,command:n,cache:n.cache?.target,action:h=>this.browser.blur(h),options:{...n,targetName:"target",disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:p,thoughts:g}}case"PRESS":let u=this.browser.url();await this.browser.press(n.value,{repeat:n.repeat,convertMeta:n.convertMeta??!0,delayMs:n.delayMs});let d={urlAfterCommand:this.browser.url(),succeedImmediately:!1};return nu(u,d.urlAfterCommand)&&(d.succeedImmediately=!0,d.succeedImmediatelyReason="URL changed"),d;case"KEY_DOWN":return await this.browser.keyDown(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"KEY_UP":return await this.browser.keyUp(n.value,{convertMeta:n.convertMeta??!0}),{urlAfterCommand:this.browser.url(),succeedImmediately:!1};case"REQUEST":{let p=new I1,g=P1(fetch,p),h;try{h=new URL(n.url).hostname}catch{}let f=await Mu({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Zs.parse({...f,cookies:kl(p,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await lx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return ix({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,storage:this.storage,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:p=>this.wrapElementTargetingCommand(p)});case"FILE_UPLOAD":{let p,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,p=await _C({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,p=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!p)throw new x("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...p,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let p;if(!n.storageState.trim())p=void 0;else if(p=await qr({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof p!="object")throw new x("ActionFailureError",`Credentials must evaluate to an object (received ${typeof p} instead)`);let g;try{g=mb.optional().parse(p)}catch(h){throw new x("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let p=(n.timeout??Lt)*1e3,g=this.generator.getAgentConfig()?.assertion;if(nx(n.assertion)&&!n.useSelector&&n.target.type==="description"&&g&&g!=="v1"){let f={id:n.id,type:"AI_ASSERTION",assertion:`There is no element on the page closely matches the following description. If the description has single quotes, remember that requires an exact text substring match. Description: ${n.target.elementDescriptor}`,iframeUrl:n.iframeUrl,timeout:n.timeout,cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let E=await Ru({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),source:"NEGATED_CHECK"});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${E.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:E.afterScreenshotOverride}}finally{f.cache?.memory&&fs(n,f.cache?.memory.traces,a)}}let h=await rx({command:n,tracer:t,timeoutMs:p,targetingWrapper:f=>this.wrapElementTargetingCommand(f),fixtures:this.getControllerFixtures(e),disableCache:i});return{fail:!h.success,data:h.data,elementInteracted:h.elementInteractedDisplayString,thoughts:h.err?.message??h.thoughts??`Element assertion ${h.success?"succeeded":"failed"}.`,succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"PAGE_CHECK":{let p=await Sr({action:async()=>sx({assertion:n.assertion,browser:this.browser,logger:a,timeout:n.timeout,signal:this.executeAbortController.signal,autoExpandIframes:!!this.browser.userBrowserSettings.autoExpandIframes}),frameConfig:n.iframeUrl?{type:"url",url:n.iframeUrl}:void 0,browser:this.browser,logger:a});return{fail:!p.success,data:p.data,thoughts:p.success?"Page assertion passed.":p.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let p=new Gn(n.requestMatcher),g=this.browser.registerRequestListener(p);return this.registeredListeners[n.key]=g.then(async h=>await Lg(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let p=this.registeredListeners[n.key];if(!p)throw new x("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await z(p,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let p=new Gn(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>p.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=hu(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=hu(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let p=this.recordedRequests[n.key];if(!p)throw new x("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(p),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let p;return n.requestMatcher&&(p=new Gn(n.requestMatcher)),this.browser.setHeader(n.name,n.value,p),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Gn(n.requestMatcher),async(g,h)=>{let f=await qr({orgId:this.orgId,code:n.responseGenerator,fragment:!1,context:o,timeoutMs:void 0,logger:a,localTools:this.localCodeEvalTools,mock:{request:g,response:h},disallowVariableUpdates:!0,responseSerialization:"RESPONSE"}),E=pb.parse(f);return new Response(E.body,{status:E.status,headers:E.headers})},n.fetchOriginalResponse??!1)},succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"REMOVE_ROUTE_MOCK":return this.browser.removeMock(n.key),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"OFFLINE_MODE":return await this.browser.setOfflineMode(n.enable),{succeedImmediately:!1,urlAfterCommand:this.browser.url()};default:return(p=>{throw"If Typescript complains about the line below, you missed a case or break in the switch above"})(n)}return{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}async getReverseMappedDescription({browserState:e,targetId:t,disableCache:n,screenshot:o}){return(await this.generator.getReverseMappedDescription({browserState:e,target:t,screenshot:o},{disableCache:n,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})).phrase}async stopRecordMode(){this.recordAbortController?.abort(),await this.browser.clearAllCdpHighlights()}async startRecordMode({params:e,abortController:t,isClickToRecord:n}){this.recordAbortController=t;let o=new Tu({signal:t.signal,...e});return await this.browser.startRecording(this.recordAbortController.signal,o,n),o}async runSectionAutohealing(e){return this.generator.getAutohealingProposal(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:be(this.logger)})}};import{cloneDeep as O1}from"lodash-es";import gx from"truncate-json";var ux=1e3,dx=5e6,L1=5*1024*1024;function hx(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=gx(JSON.stringify(n.data),1e3);n.data=JSON.parse(o)}}catch(o){e.error({err:o},"Failed to serialize individual result output data"),n.data=`Result output data could not be serialized: ${o}`}switch(n.type){case"MOBILE_PRESET_STEP":mx(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":mx(n),hx(n.steps,e);break;default:{let o=n;throw new Error("If Typescript complains about the line below, you missed a case or break in the switch above")}}}}function mx(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function px(r,e){let t=JSON.stringify(r),n=t.replaceAll("\\u0000","");if(t.length!==n.length){let o=t.indexOf("\\u0000");e.warn({input:t.slice(Math.max(0,o-500),Math.min(t.length,o+500))},"Database content violation: stripped unicode character from input")}return n}function Iu(r,e){let t=O1(r);if(hx(t,e),t.length>ux)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,ux);let n=px(t,e);if(n.length>dx)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>dx;)t.pop(),n=px(t,e);let{jsonString:o}=gx(n,L1);try{return zt.array().parse(JSON.parse(o))}catch(i){throw e.error({serialized:n,err:i},"Could not parse serialized results into JSON structure after processing"),i}}import{AsyncLocalStorage as N1}from"async_hooks";var Rs=new N1;function D1(r){Rs.enterWith({activeTracers:[r]})}function k1(r,e){let t=Rs.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function U1(r,e){let t=Rs.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return Rs.run({activeTracers:n},e)}var pn={globalAls:Rs,initializeRootTracerContext:D1,withChildTracer:k1,withChildTracerAsync:U1};var Io=class r{spans;parentSection;finished=!1;startTime;endTime;constructor(e){this.startTime=e?.startTime??Date.now(),this.spans=e?.subSpans??[],this.parentSection=e}startSection(e,t){let n={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},o=new r(n);try{return pn.withChildTracer(o,()=>t(o,n))}catch(i){throw n.error=i instanceof Error?i.message:String(i),i}finally{o.finish(),this.addSpan(n)}}async startAsyncSection(e,t,n){let o={type:"SECTION",name:e,startTime:Date.now(),endTime:void 0,subSpans:[],attributes:{}},i=new r(o);this.addSpan(o);try{let a;return n?.signal||n?.timeoutMs?a=await pn.withChildTracerAsync(i,()=>z(t(i,o),{milliseconds:n?.timeoutMs??1/0,signal:n?.signal,message:n?.timeoutMsg??`Operation timed out after ${n?.timeoutMs??1/0}ms (${e})`})):a=await pn.withChildTracerAsync(i,()=>t(i,o)),a}catch(a){throw o.error=a instanceof Error?a.message:String(a),a}finally{i.finish()}}finish(){if(!this.finished){this.endTime=Date.now();for(let e of this.spans)e.endTime||(e.endTime=this.endTime,e.durationMs=e.endTime-e.startTime);this.parentSection&&(this.parentSection.endTime=this.endTime,this.parentSection.durationMs=this.parentSection.endTime-this.parentSection.startTime),this.finished=!0}}addSpan(e){this.spans.push(e)}startSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{a=t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}async startAsyncSpan(e,t,...n){let o={type:e,startTime:Date.now(),endTime:void 0,attributes:{}},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a;try{i?.signal||i?.timeoutMs?a=await z(t(o),{milliseconds:i?.timeoutMs??1/0,signal:i?.signal,message:i?.timeoutMsg??`Operation timed out after ${i?.timeoutMs??1/0}ms${"name"in i?` (${i.name})`:""}`}):a=await t(o),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(s){throw o.error=s instanceof Error?s.message:String(s),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,s}return a}getRootSpan(){return this.finished||this.finish(),{type:"SECTION",name:"root step span",startTime:this.startTime,endTime:this.endTime,subSpans:this.spans,attributes:{},durationMs:this.endTime?this.endTime-this.startTime:void 0}}};function ee(){let r=pn.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new Io}async function fx(r){let{driver:e,abortSignal:t,logger:n,packageName:o}=r,i;try{i=await z(e.execute("mobile: shell",{command:"dumpsys",args:["activity","recents"]}),{signal:t,milliseconds:1e4})}catch(s){t?.throwIfAborted(),n.warn({err:s,packageName:o},"Failed to read recents output while removing package");return}if(typeof i!="string"){n.warn({packageName:o,outputType:typeof i},"Unexpected dumpsys output when removing package from recents");return}let a=F1(i,o);if(a.length!==0)for(let s of a){t?.throwIfAborted();try{await e.execute("mobile: shell",{command:"am",args:["stack","remove",s.toString()]}),n.info({packageName:o,taskId:s},"Removed task from recents")}catch(c){t?.throwIfAborted(),n.warn({err:c,packageName:o,taskId:s},"Failed to remove task from recents")}}}function F1(r,e){let t=r.split("Task{");if(t.length<=1)return[];let n=new Set;for(let o of t.slice(1)){let i=`Task{${o}`;if(!i.includes(e)||i.includes("app.lawnchair/.LawnchairLauncher"))continue;let a=i.match(/taskId=(\d+)/);if(!a)continue;let[,s]=a;if(!s)continue;let c=Number.parseInt(s,10);Number.isNaN(c)||n.add(c)}return Array.from(n)}function xs(r){let e=[],t=r.getAttribute("text")??"",n=r.getAttribute("hint")??"",o=r.getAttribute("showing-hint")==="true";t.trim()&&!o&&t.trim()!==n.trim()&&e.push(t.trim());for(let i of Array.from(r.childNodes??[]))if(i.nodeType===3){let a=i.nodeValue??"";a.trim()&&e.push(a.trim())}else if(i.nodeType===1){let a=xs(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as sH}from"fs";import{tmpdir as lH}from"os";import Cx from"path";import{diff as aH}from"deep-object-diff";import{cloneDeep as wx}from"lodash-es";import Ex from"fontoxpath";import B1 from"@prettier/plugin-xml";import z1 from"prettier";import{DOMParser as H1,XMLSerializer as G1}from"slimdom";var V1=new Set(["android.webkit.webview","com.facebook.react.views.webview.reactwebview","com.tencent.smtt.sdk.webview","com.tencent.smtt.sdk.x5webview","org.xwalk.core.xwalkview","com.uc.webview.export.webview"]);function Ms(r){let e=r.toLowerCase();return e.endsWith("webview")||V1.has(e)}function W1(r){let e=["android.widget.","android.view.","android.webkit.","android.app.","android.support.","androidx.","com.android.inputmethod."];for(let t of e)if(r.startsWith(t))return r.substring(t.length);return r}var j1=new Set(["index","package","a11y-important","screen-reader-focusabl"]),$1=new Set(["selected","checked","checkable","clickable","enabled","focusable","focused","long-clickable","password","scrollable","selected","showing-hint","context-clickable","multiline","text-entry-key","heading","dismissable","screen-reader-focusable","content-invalid","a11y-focused"]),q1=new Set(["text","hint"]),K1=new Set(["live-region","drawing-order"]),Y1=new Set(["displayed","enabled"]);function X1(r,e){let t={};for(let[n,o]of Object.entries(e))j1.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||$1.has(n)&&o==="false"||q1.has(n)&&o===""||Y1.has(n)&&o==="true"||K1.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function Sx(r,e,t){let{prunedDocument:n,idToElement:o,prunedIdToElement:i,idCounter:a,opts:s}=r,c=a.value++;t.setAttribute("id",String(c));let l={};for(let m of e.attributes){let p=m.name,g=m.value;g!=null&&(l[p]=String(g))}let u=X1(e.tagName,l);for(let[m,p]of Object.entries(u))t.setAttribute(m,p);if(o.set(c,e),i.set(c,t),Ms(e.tagName)){let m=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&m.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);m.trim().length>0&&t.appendChild(n.createCDATASection(`
4346
4346
  ${m}
4347
- `));return}}let d=Array.from(e.childNodes??[]);for(let m of d){let g=m.nodeType;if(g===3){let p=m.nodeValue;p&&p.trim().length>0&&t.appendChild(n.createTextNode(p));continue}if(g===1){let p=m;if(!$1(p,s?.viewportBounds))continue;let h=n.createElement(U1(p.tagName));dx(r,p,h),t.appendChild(h)}}}function W1(r,e,t,n){let o=r.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:t,prunedIdToElement:i,idCounter:{value:0},opts:n},s=o.documentElement;dx(a,e,s);let c=new D1().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function mx(r,e){let t=new N1,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new Error("No root element found in XML");if(i.tagName!=="hierarchy")throw new Error("No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=W1(t,i,o,e);return{xml:await L1.format(c,{parser:"xml",plugins:[O1],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function j1(r){let e=[],t=r;for(;t;){let n=t.tagName,o=t.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===t){i=s+1;break}}e.unshift(`${n}[${i}]`),t=o}return`/${e.join("/")}`}function Pu(r,e){let t=r.idToElement.get(e);if(t)return j1(t)}function nh(r,e){let t=r.idToElement.get(e);if(!t)return;let n=t.cloneNode(!0);for(let o of Array.from(n.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a)}return n.outerHTML}function Oo(r){if(!r.hasAttribute("bounds"))return;let e=r.getAttribute("bounds");if(!e)return;let t=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(t){let n=parseInt(t[1],10),o=parseInt(t[2],10),i=parseInt(t[3],10),a=parseInt(t[4],10);if(Number.isFinite(n)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return[n,o,i,a]}}function $1(r,e){if(!e)return!0;let t=Oo(r);if(!t||t.length<4)return!0;let n=t[0],o=t[1],i=t[2],a=t[3];return!(i<=e.left||n>=e.right||a<=e.top||o>=e.bottom)}function px(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function hx({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=Oo(e),!t))throw new Error("ActionFailureError: Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:px(e,r?.attributesRequired),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:t[0],y1:t[1],x2:t[2],y2:t[3],tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:t[2]-t[0],height:t[3]-t[1],tolerance:r?.shapeSpecificity}:void 0}}function Sx({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=Oo(n);if(!o)throw new Error(`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=Pu(t.graph,r.id)??"",a=nh(t.graph,r.id)??"",s=hx({requirements:r.requirements,element:n}),c=[];r.additionalElements&&(c=r.additionalElements.map(({id:u,requirements:d})=>{let m=t.graph.idToElement.get(u);if(!m)return;let g=Pu(t.graph,u);return g?{xPath:g,requirements:hx({requirements:d,element:m})}:void 0}).filter(u=>!!u));let l;if(xs(n.tagName)&&r.inWebview!==!1?l={type:"WEBVIEW",resolvedDescription:e,xPath:i}:l={type:"NATIVE",bounds:o,resolvedDescription:e,xPath:i,elementOnlySerializedXml:a,requirements:s,requiredRelatedElements:c},r.updatedMemory){let u={type:"GCS_TRACES",traces:r.updatedMemory};l.memory=u}return{target:l,resolvedNode:n}}function oh(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var q1=.1,K1=.25;function Iu(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*q1;case"broad":return o<=Math.abs(e)*K1;case"irrelevant":return!0}}function Y1(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!Iu(e.tolerance,n,o,Math.min(1,t)))return!1;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(r[1]+r[3])/2;return Iu(e.tolerance,a,s,Math.min(1,i))}function X1(r,e){return Iu(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?Iu(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var fx=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=Rs(r);if(c!==o)throw new Error(`ActionFailureError: Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new Error(`ActionFailureError: Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new Error(`ActionFailureError: Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!Y1(t.newElementBounds,a))throw new Error(`ActionFailureError: Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!X1(t.newElementBounds,s))throw new Error(`ActionFailureError: Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function Ou(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=Z();if(e.type==="WEBVIEW")return J1(e,r);let a=gx.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Error(`ActionFailureError: Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let m=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let g of m){let p=gx.evaluateXPathToFirstNode(g.xPath,o);if(!p)throw new Error(`ActionFailureError: Required related element not found for XPath: ${g.xPath}`);fx(p,g.requirements)}})}let s=Oo(a);if(!s)throw new Error("ActionFailureError: Resolved native element has no bounding box");fx(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[m,g]of n.idToElement.entries())if(g===a){c=m;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=nh(n,c)??l,u=Pu(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function J1(r,e){let{stateManager:t,logger:n,signal:o}=e,i=Z(),a=await t.getActiveWebview();if(!a||!a.browserController)throw new Error("No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw new Error("No browser target available on cache");let c=r.browserCache,l=await i.startAsyncSection("Resolve target in webview",()=>s.resolveTarget(null,c,{logger:n,signal:o}));return{resolvedTarget:{...r,controller:a.browserController,resolution:l}}}function Lo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;_l(e)&&(e[t]={...e[t],[n]:si.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function Lu(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Je=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s}){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await t.startAsyncSection("Get emulator state",async()=>{let p=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),h=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:p,screenshot:h}}),l;try{l=await t.startAsyncSpan("AI_LOCATOR_CALL",async p=>{let h=await this.generator.getMobileElementLocation({description:e,screenXml:c.emulatorState.graph.xml,screenshot:c.screenshot,memory:i?a:void 0},{logger:this.logger,loggerTags:be(this.logger),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return p.result=h,h})}catch(p){throw this.throwIfAborted(),this.logger.error({err:p},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${p instanceof Error?p.message:p}`)}if(l.id===-1)throw new vn(l.thoughts??"No matching element found");let{target:u,resolvedNode:d}=Sx({aiResponse:l,description:e,emulatorState:c.emulatorState});if(u.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:u.elementOnlySerializedXml},attributes:{}}),{resolvedTarget:{...u,resolvedNode:d},thoughts:l.thoughts};let{browserLocateResult:m,browserController:g}=await t.startAsyncSpan("TARGET_RESOLUTION",async p=>{let h=await this.stateManager.getActiveWebview();if(!h||!h.browserController)throw new Error("No browser controller is attached to the requested webview");let f=await h.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return p.result={serializedElement:f.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:f,browserController:h.browserController}});return{resolvedTarget:{...u,controller:g,resolution:m.resolution,browserCache:m.target},thoughts:m.thoughts}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1}=e,d;if(i==="cache"&&"cache"in o&&o.cache){let f=o.cache;a==="target"&&"target"in f?d=f.target:a==="fromTarget"&&"fromTarget"in f?d=f.fromTarget:a==="toTarget"&&"toTarget"in f&&(d=f.toTarget)}let m=!1,g=yx(d),p;if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),m=!0,g=void 0),s&&(m=!0,g=void 0),g&&g?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:g?.resolvedDescription},"Cache description mismatch, clearing it automatically"),m=!0,g=void 0),!g){this.logger.info({description:n,cacheBustedBeforeAction:m},"Prompting AI for a new element location");let f=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:oh(d)});p=f.thoughts;let E=await t(f.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:f.resolvedTarget,updatedWithAI:!0}),{result:E,thoughts:p}}let h;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),h=await this.stateManager.getDomState();let{resolvedTarget:f,updatedCache:E}=await c.startAsyncSpan("CACHE_RESOLUTION",async w=>{let{resolvedTarget:R}=await Ou({target:g,domState:h,stateManager:this.stateManager,logger:this.logger}),v=Lu(R),M=Z1(g,v);return M&&Object.keys(M).length>0&&this.logger.info({cacheDiffs:M},"Successfully resolved target with cache"),w.attributes.serializedElement=R.type==="WEBVIEW"?R.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":R.elementOnlySerializedXml,{resolvedTarget:R,updatedCache:v}}),b=await t(f);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:E,updatedWithAI:!1}),g.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.1"]),{result:b,thoughts:"Successfully executed preset action with cache."}}catch(f){g.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.1"]),this.throwIfAborted(),this.logger.warn({err:f},"Failed to resolve target cache, retrying with AI");let E=this.shouldUseMemoryForCommand(o),b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:E,memory:g?.memory,webviewMemory:oh(g)});p=b.thoughts;let w=await t(b.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:w,thoughts:p}}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings}}getBoundsFromNativeCache(e){let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new Error(`ActionFailureError: Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return yx(this.aiSettings)}};function rH(r){let e={relativePosition:r.relativePosition};if(r.doubleTap&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both doubleTap and longPress");return r.doubleTap?{...e,doubleTap:!0,doubleTapDelayMs:r.doubleTapDelayMs}:r.longPress?{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}:e}var zi=class extends Je{async tapOnAbsoluteCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(e.doubleTap){await this.driver.tap({x:t,y:n});let o=e.doubleTapDelayMs??100;await new Promise(i=>setTimeout(i,o))}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,m=o+u;return await this.tapOnAbsoluteCoordinates({x:d,y:m,...t}),{x:d,y:m}}async tapOnWebviewTarget(e,t){let{controller:n}=e;return(await n.browser.click(e.resolution,{createIsolatedFolder:()=>{let i=Math.random().toString(36).substring(4),a=bx.join(tH(),"momentic","downloads"),s=bx.join(a,this.orgId,i);return eH(s,{recursive:!0}),s}},{delayMs:t?.longPress?t?.longPressDurationMs??2e3:void 0,relativePosition:t?.relativePosition,doubleClick:t?.doubleTap})).coordinates}async tapOnTarget({target:e,options:t}){return await Z().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.attributes.options=t,"type"in e&&e.type==="NATIVE"?o.attributes.point=await this.tapOnNativeTarget(e,t):(o.withinWebview=!0,o.attributes.point=await this.tapOnWebviewTarget(e,t))},{name:"Tap on target"})}async executeTap({command:e}){let t=Z(),n=rH(e);if(e.target.type==="coordinates"){let a=await this.driver.getWindowSize(),s=e.target.xPercent*a.width,c=e.target.yPercent*a.height;return await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.tapOnAbsoluteCoordinates({...n,x:s,y:c})},{name:`Tap at coordinates ${s}, ${c}`}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,action:a=>this.tapOnTarget({target:a,options:n}),description:o});return{success:!0,message:i}}};var jn=class extends Je{async doPress({keycode:e,longPress:t}){await Z().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var Ex=25,Nu=class extends Je{async doType(e){let t=Z();if(!e.target){if(e.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await Z().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??Ex};o.attributes.options=i;let{controller:a,resolution:s}=t;await a.browser.typeIntoTarget(e.text,s,i)},{name:"Typing within web view"})}async doNativeType(e,t){let n=new zi(this.constructPerformerParams());e.clearContent?(await n.tapOnNativeTarget(t,{longPress:!0}),await this.clearContent()):await n.tapOnNativeTarget(t),await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e)}async sendKeys(e){let t=Z(),n=e.keyPressDelayMs??Ex;await t.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<3e3;){if(this.throwIfAborted(),await this.driver.isKeyboardShown())return;await new Promise(s=>setTimeout(s,500))}i.attributes.timedOut=!0}),n?await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.updateSettings({keyInjectionDelay:n}),await this.driver.keys(e.text),await this.driver.updateSettings({keyInjectionDelay:0})},{name:"Typing keys with a delay"}):await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.keys(e.text)},{name:"Typing keys"})}async clearContent(){let e=Z();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper())}catch(t){this.logger.warn({err:t},"Failed to find select all button, continuing...")}}async clearContentHelper(){let e=this.driver.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await e.waitForExist({timeout:750}),await e.click(),await new jn(this.constructPerformerParams()).doPress({keycode:67})}};import Yt from"zod";var Tx=.8,$n=.2,nH=Yt.object({navigationBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()}),statusBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()})}),Hi=class extends Je{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=nH.parse(await this.driver.executeScript("mobile: getSystemBars",[]));n=this.getInsetBoundsFromViewport(t),o.navigationBar.visible&&(n.height=Math.max(1,n.height-o.navigationBar.height)),o.statusBar.visible&&(n.top+=o.statusBar.height,n.height=Math.max(1,n.height-o.statusBar.height))}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),n=this.getInsetBoundsFromViewport(t)}break;case"OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getInsetBoundsFromBounds(i);break}default:{let o=e;throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getInsetBoundsFromViewport(e){let t=Math.floor(e.width*$n),n=Math.floor(e.height*$n);return{left:e.x+t,top:e.y+n,width:Math.max(1,e.width-t*2),height:Math.max(1,e.height-n*2)}}getInsetBoundsFromBounds(e){let t=e[0],n=e[1],o=e[2],i=e[3],a=o-t,s=i-n,c=Math.floor(a*$n),l=Math.floor(s*$n);return{left:t+c,top:n+l,width:Math.max(1,a-c*2),height:Math.max(1,s-l*2)}}async executeSwipe(e){let t=Z();if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:o,startY:i,deltaPixels:a}=e.scrollableElement;return await t.startAsyncSpan("EMULATOR_INTERACTION",async s=>{s.attributes.startX=o,s.attributes.startY=i,s.attributes.deltaPixels=a,s.attributes.direction=e.direction,await this.performRawSwipe({startX:o,startY:i,deltaPixels:a,direction:e.direction,durationMs:e.durationMs})},{name:`Swipe ${e.direction} using raw coordinates`}),{success:!0,message:"Successfully executed swipe action"}}if(e.scrollableElement.type!=="CUSTOM"){let o=await this.driver.getWindowRect(),i=await this.getHardcodedScrollableElementBounds(e.scrollableElement,o);return await t.startAsyncSpan("EMULATOR_INTERACTION",async a=>{await this.swipeByAbsoluteCoordinates({span:a,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:i})},{name:`Swipe ${e.direction} in the entire ${e.scrollableElement.type.toLowerCase()}`}),{success:!0,message:"Successfully executed swipe action"}}let{thoughts:n}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async o=>Z().startAsyncSpan("EMULATOR_INTERACTION",async a=>"type"in o&&o.type==="NATIVE"?this.scrollInNativeContainer({span:a,cmd:e,target:o}):(a.withinWebview=!0,this.swipeInWebview({span:a,cmd:e,target:o})),{name:`Swipe ${e.direction} in the specified container`}),tracer:t});return{success:!0,message:n}}async scrollInNativeContainer({span:e,cmd:t,target:n}){let o=n.bounds[2]-n.bounds[0],i=n.bounds[3]-n.bounds[1],a=Math.floor(o*$n),s=Math.floor(i*$n);await this.swipeByAbsoluteCoordinates({span:e,direction:t.direction,percent:t.viewportPercent,durationMs:t.durationMs,containerBounds:{left:n.bounds[0]+a,top:n.bounds[1]+s,width:Math.max(1,o-a*2),height:Math.max(1,i-s*2)}})}async swipeInWebview({span:e,cmd:t,target:n}){let{controller:o,resolution:i}=n;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=t.direction==="down"||t.direction==="up",c=await i.locator.boundingBox();if(!c)throw new Error("Failed to get bounds for webview container");let l=Math.floor(c.width*$n),u=Math.floor(c.height*$n),d=Math.max(1,c.width-l*2),m=Math.max(1,c.height-u*2),g={x:c.x+l+d/2,y:c.y+u+m/2},p=(s?m:d)*(t.viewportPercent??Tx)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=g,e.attributes.scrollPixelAmount=p,await o.browser.mouseDragUsingVisualCoordinates(s?0:p,s?p:0,10,t.durationMs,g)}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=Tx,durationMs:o=500,containerBounds:i}){e.attributes.containerBounds=i;let a,s;t==="up"||t==="down"?(a=i.height*n,s=Math.floor(a/(o/1e3))):(a=i.width*n,s=Math.floor(a/(o/1e3))),e.attributes.pixelDelta=a,e.attributes.pixelsPerSecond=s,await this.driver.executeScript("mobile: swipeGesture",[{...i,direction:t,percent:n,speed:s}])}};import aH from"pixelmatch";import{_android as sH,chromium as lH}from"playwright";import{PNG as xx}from"pngjs";import{z as Ve}from"zod";var vx=Ve.object({"Android-Package":Ve.string(),Browser:Ve.string(),"Protocol-Version":Ve.string(),"User-Agent":Ve.string(),"V8-Version":Ve.string(),"WebKit-Version":Ve.string(),webSocketDebuggerUrl:Ve.string()}),Ax=Ve.object({description:Ve.string(),devtoolsFrontendUrl:Ve.string(),id:Ve.string(),title:Ve.string(),type:Ve.string(),url:Ve.string(),webSocketDebuggerUrl:Ve.string()}),wx=Ve.object({proc:Ve.string(),webview:Ve.string(),webviewName:Ve.string()}),Cx=Ve.array(wx.extend({info:vx.optional(),pages:Ve.array(Ax).optional()})),oIe=Ve.array(wx.extend({info:vx,pages:Ve.array(Ax)}));function ih(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=xx.sync.read(n),a=xx.sync.read(o);if(i.width!==a.width||i.height!==a.height)return 100;let s=i.width,c=i.height,l=Buffer.alloc(s*c*4);return aH(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var Du=class r{driver;limbarClient;device;currentContext;logger;webviews=new Map;fixtures;orgId;options;aborter;constructor({driver:e,context:t,limbarClient:n,logger:o,device:i,fixtures:a,orgId:s,options:c,aborter:l}){this.driver=e,this.limbarClient=n,this.device=i,this.currentContext=t,this.logger=o,this.fixtures=a,this.orgId=s,this.options=c,this.aborter=l;for(let u of["SIGINT","SIGTERM"])process.on(u,async()=>{await this.cleanupWebviews()})}static async init({driver:e,logger:t,fixtures:n,limbarClient:o,orgId:i,adbPort:a,options:s,aborter:c,playwrightDevice:l}){let u=await e.getContext(),d=typeof u=="string"?u:u.id,m;if(l)m=l;else{let p=(await sH.devices()).filter(h=>h._initializer?.serial?.endsWith(a.toString())||h._initializer?.serial?.endsWith((a-1).toString()));if(t.warn({devices:p.map(h=>({serial:h._initializer?.serial,model:h._initializer?.model}))},"No playwright device provided, using ADB to find device"),p.length===0)throw new Error(`Momentic found no devices listening on port ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);if(p.length>1)throw new Error(`Momentic found multiple devices on the ports ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);m=p[0]}return new r({driver:e,context:d,logger:t,device:m,fixtures:n,orgId:i,options:s,aborter:c,limbarClient:o})}async getContexts(){let e=await this.driver.getContexts({}),t=Array.from(this.webviews.values());return{contexts:e,webviews:t.map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active,hasPlaywright:!!n.browserController,lastSeen:n.lastSeen,socketName:n.socketName}))}}async getRawScreenshotBase64(e=2){let t=Z(),n;for(let o=0;o<e;o++)try{return await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>await this.driver.takeScreenshot(),{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(i){if(n=i,o===e-1)throw i}throw new Error(`Failed to take screenshot: ${n}`)}async getCurrentScreenshotPngString(){return`data:image/png;base64,${await this.getRawScreenshotBase64(1)}`}async waitForScreenshotStability({timeoutMs:e,signal:t,reason:n,tolerancePercent:o=1}){await Z().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c=!1;for(;Date.now()-a<e;){if(t?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64();continue}let l=await this.getRawScreenshotBase64();if(ih(s,l)<=o){c=!0;break}s=l,await W(250,t)}c||(i.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"))})}async getCurrentPackage(){let e=await this.driver.execute("mobile: getCurrentPackage");return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){await this.refreshWebviews();let t=(await this.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph,n=await this.getCurrentPackage(),o=[];for(let[i,a]of t.idToElement.entries()){if(o.some(l=>l.id===i))continue;let s=a.getAttribute("content-desc");(xs(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:Oo(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await Z().startAsyncSpan("EMULATOR_READ_STATE",()=>t.getBrowserState({abortSignal:this.aborter.controller?.signal,serializationOpts:{noId:!0}}),{name:"Get webview content",signal:this.aborter.controller?.signal})).serializedTree}async getDomState(e){return await Z().startAsyncSection("Get emulator state XML",async()=>{let n;if(!e?.skipFetchingFullWebviewContent)try{n=await this.getActiveWebviewContent()}catch(c){this.logger.error({err:c},"Could not get webview info to get the nested DOM state")}this.throwIfAborted();let i=e?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,a=await this.getPageSource();return{graph:await mx(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await Z().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.getPageSource(),{name:"Get Android page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.getWindowRect();return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}async refreshWebviews(){try{await this.refreshWebviewsHelper()}catch(e){this.logger.warn({err:e},"Error refreshing webviews, continuing...")}}async refreshWebviewsHelper(){await this.getPageSource(),this.throwIfAborted();let e=await this.getCurrentPackage(),t=await this.getDetailedContexts();if(!t){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let n=Date.now(),o=new Set;for(let i of t){if(this.throwIfAborted(),i.webview==="NATIVE_APP")continue;let a=i.info["Android-Package"];if(e&&a!==e&&this.logger.warn({packageName:a,currentPkgName:e},"Ignoring webview not in the active package"),o.add(i.webview),!this.webviews.has(i.webview)||!this.webviews.get(i.webview)?.active){let s={contextId:i.webview,packageName:a,active:!1,lastSeen:n,socketName:i.proc.startsWith("@")?i.proc.substring(1):i.proc};this.logger.info({contextId:s.contextId,packageName:s.packageName,socketName:s.socketName},"New webview detected"),this.webviews.set(i.webview,s);let c;if(a==="com.android.chrome"?(this.logger.info({webviewInfo:s},`Connecting Playwright to Android Chrome: ${i.webview}`),c=await this.connectPlaywrightToChrome(s),this.logger.info(`Connected Playwright to Android Chrome: ${i.webview}`)):(this.logger.info({webviewInfo:s},`Connecting Playwright to webview: ${i.webview}`),c=await this.connectPlaywrightToWebview(a,s.socketName),c&&this.logger.info(`Connected Playwright to webview ${i.webview}`)),!c)continue;s.browserController=c,s.active=!0}}for(let[i,a]of this.webviews.entries())!o.has(i)&&a.active&&(this.logger.info(`Disconnecting dead webview ${i}`),this.disconnectPlaywrightFromWebview(a),a.active=!1)}async getActiveWebview(){await Z().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviews()});let e=await this.driver.execute("mobile: getCurrentPackage");e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(t.length!==0){if(t.length>1)throw new Error("Multiple active webviews in a single package is currently not supported");return t[0]}}async executeRawADBCommand(e){let t=this.driver.capabilities,n=s=>{if(!t||typeof t!="object")return;let c=t[s];return typeof c=="string"?c:void 0},o=n("deviceUDID")||n("udid")||n("appium:udid")||n("appium:deviceUDID"),i=e.trim().split(/\s+/).filter(s=>s.length>0);this.logger.info({serial:o,cmdArgs:i},"Executing ADB command");let a=await ht(i,{serial:o,timeoutMs:15e3,throwOnError:!0});return this.logger.info({result:a},"ADB command result"),a}async cleanupWebviews(){for(let[e,t]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(t),t.active=!1}async getDetailedContexts(){return await Z().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=Cx.parse(t)}catch(o){throw new Error(`Failed to parse contexts. Original error:
4347
+ `));return}}let d=Array.from(e.childNodes??[]);for(let m of d){let p=m.nodeType;if(p===3){let g=m.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(p===1){let g=m;if(!Z1(g,s?.viewportBounds))continue;let h=n.createElement(W1(g.tagName));Sx(r,g,h),t.appendChild(h)}}}function J1(r,e,t,n){let o=r.parseFromString("<hierarchy/>","text/xml"),i=new Map,a={prunedDocument:o,idToElement:t,prunedIdToElement:i,idCounter:{value:0},opts:n},s=o.documentElement;Sx(a,e,s);let c=new G1().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function yx(r,e){let t=new H1,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new Error("No root element found in XML");if(i.tagName!=="hierarchy")throw new Error("No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=J1(t,i,o,e);return{xml:await z1.format(c,{parser:"xml",plugins:[B1],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function Q1(r){let e=[],t=r;for(;t;){let n=t.tagName,o=t.parentElement,i=1;if(o){let a=Array.from(o.children).filter(s=>s.tagName===n);for(let s=0;s<a.length;s++)if(a[s]===t){i=s+1;break}}e.unshift(`${n}[${i}]`),t=o}return`/${e.join("/")}`}function Ou(r,e){let t=r.idToElement.get(e);if(t)return Q1(t)}function oh(r,e){let t=r.idToElement.get(e);if(!t)return;let n=t.cloneNode(!0);for(let o of Array.from(n.children)){let i=o;for(let a of Array.from(i.children))i.removeChild(a)}return n.outerHTML}function Oo(r){if(!r.hasAttribute("bounds"))return;let e=r.getAttribute("bounds");if(!e)return;let t=e.match(/\[(\d+),(\d+)\]\[(\d+),(\d+)\]/);if(t){let n=parseInt(t[1],10),o=parseInt(t[2],10),i=parseInt(t[3],10),a=parseInt(t[4],10);if(Number.isFinite(n)&&Number.isFinite(o)&&Number.isFinite(i)&&Number.isFinite(a))return[n,o,i,a]}}function Z1(r,e){if(!e)return!0;let t=Oo(r);if(!t||t.length<4)return!0;let n=t[0],o=t[1],i=t[2],a=t[3];return!(i<=e.left||n>=e.right||a<=e.top||o>=e.bottom)}function bx(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function Tx({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=Oo(e),!t))throw new Error("ActionFailureError: Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:bx(e,r?.attributesRequired),requiredBounds:r?.boundsRequired,position:r?.positionSpecificity?{x1:t[0],y1:t[1],x2:t[2],y2:t[3],tolerance:r?.positionSpecificity}:void 0,shape:r?.shapeSpecificity?{width:t[2]-t[0],height:t[3]-t[1],tolerance:r?.shapeSpecificity}:void 0}}function Ax({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new Error(`Could not find node with id: ${r.id}`);let o=Oo(n);if(!o)throw new Error(`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=Ou(t.graph,r.id)??"",a=oh(t.graph,r.id)??"",s=Tx({requirements:r.requirements,element:n}),c=[];r.additionalElements&&(c=r.additionalElements.map(({id:u,requirements:d})=>{let m=t.graph.idToElement.get(u);if(!m)return;let p=Ou(t.graph,u);return p?{xPath:p,requirements:Tx({requirements:d,element:m})}:void 0}).filter(u=>!!u));let l;if(Ms(n.tagName)&&r.inWebview!==!1?l={type:"WEBVIEW",resolvedDescription:e,xPath:i}:l={type:"NATIVE",bounds:o,resolvedDescription:e,xPath:i,elementOnlySerializedXml:a,requirements:s,requiredRelatedElements:c},r.updatedMemory){let u={type:"GCS_TRACES",traces:r.updatedMemory};l.memory=u}return{target:l,resolvedNode:n}}function ih(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var eH=.1,tH=.25;function Lu(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*eH;case"broad":return o<=Math.abs(e)*tH;case"irrelevant":return!0}}function rH(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!Lu(e.tolerance,n,o,Math.min(1,t)))return!1;let i=e.y2-e.y1,a=(e.y1+e.y2)/2,s=(r[1]+r[3])/2;return Lu(e.tolerance,a,s,Math.min(1,i))}function nH(r,e){return Lu(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?Lu(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var vx=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=xs(r);if(c!==o)throw new Error(`ActionFailureError: Resolved element text mismatch: expected ${o}, got ${c}`)}if(n)for(let[c,l]of Object.entries(n)){let u=r.getAttribute(c)??void 0;if(u!==l)throw new Error(`ActionFailureError: Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new Error(`ActionFailureError: Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!rH(t.newElementBounds,a))throw new Error(`ActionFailureError: Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!nH(t.newElementBounds,s))throw new Error(`ActionFailureError: Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function Nu(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=ee();if(e.type==="WEBVIEW")return oH(e,r);let a=Ex.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new Error(`ActionFailureError: Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let m=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let p of m){let g=Ex.evaluateXPathToFirstNode(p.xPath,o);if(!g)throw new Error(`ActionFailureError: Required related element not found for XPath: ${p.xPath}`);vx(g,p.requirements)}})}let s=Oo(a);if(!s)throw new Error("ActionFailureError: Resolved native element has no bounding box");vx(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[m,p]of n.idToElement.entries())if(p===a){c=m;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=oh(n,c)??l,u=Ou(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function oH(r,e){let{stateManager:t,logger:n,signal:o}=e,i=ee(),a=await t.getActiveWebview();if(!a||!a.browserController)throw new Error("No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw new Error("No browser target available on cache");let c=r.browserCache,l=await i.startAsyncSection("Resolve target in webview",()=>s.resolveTarget(null,c,{logger:n,signal:o}));return{resolvedTarget:{...r,controller:a.browserController,resolution:l}}}function Lo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;Ml(e)&&(e[t]={...e[t],[n]:si.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function Du(r){if(r.type==="WEBVIEW")return{type:"WEBVIEW",resolvedDescription:r.resolvedDescription,xPath:r.xPath,browserCache:r.browserCache,memory:r.memory};let{resolvedNode:e,...t}=r;return{...t}}var Je=class{driver;generator;stateManager;logger;fixtures;aborter;orgId;aiSettings;constructor(e){this.stateManager=e.stateManager,this.generator=e.generator,this.driver=e.driver,this.logger=e.logger,this.fixtures=e.fixtures,this.aborter=e.aborter,this.orgId=e.orgId,this.aiSettings=e.aiSettings}shouldUseMemoryForCommand(e){return this.aiSettings?.useMemory&&!e?.disableCache}async findElement({description:e,tracer:t,skipFetchingFullWebviewContent:n=!1,removeWebviewContent:o=!1,useMemory:i=!1,memory:a,webviewMemory:s}){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let c=await t.startAsyncSection("Get emulator state",async()=>{let g=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),h=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:g,screenshot:h}}),l;try{l=await t.startAsyncSpan("AI_LOCATOR_CALL",async g=>{let h=await this.generator.getMobileElementLocation({description:e,screenXml:c.emulatorState.graph.xml,screenshot:c.screenshot,memory:i?a:void 0},{logger:this.logger,loggerTags:be(this.logger),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return g.result=h,h})}catch(g){throw this.throwIfAborted(),this.logger.error({err:g},"Failed to locate element"),new Error(`ActionFailureError: Failed to locate element: ${g instanceof Error?g.message:g}`)}if(l.id===-1)throw new An(l.thoughts??"No matching element found");let{target:u,resolvedNode:d}=Ax({aiResponse:l,description:e,emulatorState:c.emulatorState});if(u.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:u.elementOnlySerializedXml},attributes:{}}),{resolvedTarget:{...u,resolvedNode:d},thoughts:l.thoughts};let{browserLocateResult:m,browserController:p}=await t.startAsyncSpan("TARGET_RESOLUTION",async g=>{let h=await this.stateManager.getActiveWebview();if(!h||!h.browserController)throw new Error("No browser controller is attached to the requested webview");let f=await h.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return g.result={serializedElement:f.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:f,browserController:h.browserController}});return{resolvedTarget:{...u,controller:p,resolution:m.resolution,browserCache:m.target},thoughts:m.thoughts}}async wrapTargetingAction(e){let{action:t,description:n,command:o,cacheKey:i="cache",targetName:a="target",cacheIsInvalidAfterResolution:s,tracer:c,skipFetchingFullWebviewContent:l=!1,removeWebviewContent:u=!1}=e,d;if(i==="cache"&&"cache"in o&&o.cache){let f=o.cache;a==="target"&&"target"in f?d=f.target:a==="fromTarget"&&"fromTarget"in f?d=f.fromTarget:a==="toTarget"&&"toTarget"in f&&(d=f.toTarget)}let m=!1,p=wx(d),g;if(o.disableCache&&(this.logger.debug({command:o},"Cache explicitly disabled for command"),m=!0,p=void 0),s&&(m=!0,p=void 0),p&&p?.resolvedDescription!==n&&(this.logger.info({description:n,cacheDescription:p?.resolvedDescription},"Cache description mismatch, clearing it automatically"),m=!0,p=void 0),!p){this.logger.info({description:n,cacheBustedBeforeAction:m},"Prompting AI for a new element location");let f=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:ih(d)});g=f.thoughts;let E=await t(f.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:f.resolvedTarget,updatedWithAI:!0}),{result:E,thoughts:g}}let h;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),h=await this.stateManager.getDomState();let{resolvedTarget:f,updatedCache:E}=await c.startAsyncSpan("CACHE_RESOLUTION",async C=>{let{resolvedTarget:R}=await Nu({target:p,domState:h,stateManager:this.stateManager,logger:this.logger}),v=Du(R),M=aH(p,v);return M&&Object.keys(M).length>0&&this.logger.info({cacheDiffs:M},"Successfully resolved target with cache"),C.attributes.serializedElement=R.type==="WEBVIEW"?R.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":R.elementOnlySerializedXml,{resolvedTarget:R,updatedCache:v}}),b=await t(f);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:E,updatedWithAI:!1}),p.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!p.requirements}`,`hasAdditionalElements:${!!p.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),{result:b,thoughts:"Successfully executed preset action with cache"}}catch(f){p.type!=="WEBVIEW"&&Tt.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!p.requirements}`,`hasAdditionalElements:${!!p.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.13.2"]),this.throwIfAborted(),this.logger.warn({err:f},"Failed to resolve target cache, retrying with AI");let E=this.shouldUseMemoryForCommand(o),b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:E,memory:p?.memory,webviewMemory:ih(p)});g=b.thoughts;let C=await t(b.resolvedTarget);return Lo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:C,thoughts:g}}}constructPerformerParams(){return{stateManager:this.stateManager,generator:this.generator,driver:this.driver,logger:this.logger,fixtures:this.fixtures,aborter:this.aborter,orgId:this.orgId,aiSettings:this.aiSettings}}getBoundsFromNativeCache(e){let[t,n,o,i]=e.bounds;if(t===void 0||n===void 0||o===void 0||i===void 0)throw new Error(`ActionFailureError: Native element cache has incomplete bounds: [${e.bounds.join(", ")}]`);return{left:t,top:n,width:o-t,height:i-n}}calculateSwipeCoordinates({containerBounds:e,direction:t,desiredDelta:n,edgeMarginPercent:o=.1}){let i=e.left+e.width/2,a=e.top+e.height/2;if(t==="up"||t==="down"){let s=e.height*o,c=e.top+s,l=e.top+e.height-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:i,startY:t==="down"?l:c,actualDelta:d}}else{let s=e.width*o,c=e.left+s,l=e.left+e.width-s,u=l-c,d=Math.min(Math.abs(n),u);return{startX:t==="right"?l:c,startY:a,actualDelta:d}}}invertDirection(e){if(e==="up")return"down";if(e==="down")return"up";if(e==="left")return"right";if(e==="right")return"left";throw new Error(`Unreachable code: ${e}`)}async performRawSwipe({startX:e,startY:t,deltaPixels:n,direction:o,durationMs:i=300}){let a=Math.abs(n),s=e,c=t;o==="up"||o==="down"?c=o==="up"?t-a:t+a:s=o==="left"?e-a:e+a,await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:e,y:t},{type:"pointerDown",button:0},{type:"pause",duration:100},{type:"pointerMove",duration:i,x:s,y:c},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}get abortSignal(){return this.aborter.controller?.signal}get aiSettingsCopy(){return wx(this.aiSettings)}};function cH(r){let e={relativePosition:r.relativePosition};if(r.doubleTap&&r.longPress)throw new Error("UserConfigurationError: Cannot specify both doubleTap and longPress");return r.doubleTap?{...e,doubleTap:!0,doubleTapDelayMs:r.doubleTapDelayMs}:r.longPress?{...e,longPress:!0,longPressDurationMs:r.longPressDurationMs}:e}var Bi=class extends Je{async tapOnAbsoluteCoordinates(e){let t=e.x,n=e.y;if(this.logger.info({x:t,y:n},"Tap at coordinates"),e.longPress)return await this.driver.executeScript("mobile: longClickGesture",[{x:t,y:n,duration:e.longPressDurationMs??2e3}]);if(e.doubleTap){await this.driver.tap({x:t,y:n});let o=e.doubleTapDelayMs??100;await new Promise(i=>setTimeout(i,o))}await this.driver.tap({x:t,y:n})}async tapOnNativeTarget(e,t){let[n,o,i,a]=e.bounds,s=i-n,c=a-o,l=t?.relativePosition?.x??s/2,u=t?.relativePosition?.y??c/2;l=Math.max(0,Math.min(l,s)),u=Math.max(0,Math.min(u,c));let d=n+l,m=o+u;return await this.tapOnAbsoluteCoordinates({x:d,y:m,...t}),{x:d,y:m}}async tapOnWebviewTarget(e,t){let{controller:n}=e;return(await n.browser.click(e.resolution,{createIsolatedFolder:()=>{let i=Math.random().toString(36).substring(4),a=Cx.join(lH(),"momentic","downloads"),s=Cx.join(a,this.orgId,i);return sH(s,{recursive:!0}),s}},{delayMs:t?.longPress?t?.longPressDurationMs??2e3:void 0,relativePosition:t?.relativePosition,doubleClick:t?.doubleTap})).coordinates}async tapOnTarget({target:e,options:t}){return await ee().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.attributes.options=t,"type"in e&&e.type==="NATIVE"?o.attributes.point=await this.tapOnNativeTarget(e,t):(o.withinWebview=!0,o.attributes.point=await this.tapOnWebviewTarget(e,t))},{name:"Tap on target"})}async executeTap({command:e}){let t=ee(),n=cH(e);if(e.target.type==="coordinates"){let a=await this.driver.getWindowSize(),s=e.target.xPercent*a.width,c=e.target.yPercent*a.height;return await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.tapOnAbsoluteCoordinates({...n,x:s,y:c})},{name:`Tap at coordinates ${s}, ${c}`}),{success:!0,message:`Tapped at ${s}, ${c}`}}let o=e.target.description,{thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,action:a=>this.tapOnTarget({target:a,options:n}),description:o});return{success:!0,message:i}}};var jn=class extends Je{async doPress({keycode:e,longPress:t}){await ee().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var Rx=25,ku=class extends Je{async doType(e){let t=ee();if(!e.target){if(e.clearContent)throw new Error("UserConfigurationError: clearing content is only supported when a target is provided to the Type step");return await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for page to stabilize before typing"}),await this.sendKeys(e),{success:!0,message:"Successfully executed type action"}}if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Type step");let{thoughts:n}=await this.wrapTargetingAction({command:e,tracer:t,action:async o=>{"type"in o&&o.type==="NATIVE"?await this.doNativeType(e,o):await this.doWebviewType(e,o)},description:e.target.description});return{success:!0,message:n}}async doWebviewType(e,t){await ee().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??Rx};o.attributes.options=i;let{controller:a,resolution:s}=t;await a.browser.typeIntoTarget(e.text,s,i)},{name:"Typing within web view"})}async doNativeType(e,t){let n=new Bi(this.constructPerformerParams());e.clearContent?(await n.tapOnNativeTarget(t,{longPress:!0}),await this.clearContent()):await n.tapOnNativeTarget(t),await this.stateManager.waitForScreenshotStability({timeoutMs:3e3,signal:this.aborter.controller?.signal,reason:"Waiting for keyboard to appear before typing"}),await this.sendKeys(e)}async sendKeys(e){let t=ee(),n=e.keyPressDelayMs??Rx;await t.startAsyncSection("Waiting for system keyboard to open",async(o,i)=>{let a=Date.now();for(;Date.now()-a<3e3;){if(this.throwIfAborted(),await this.driver.isKeyboardShown())return;await new Promise(s=>setTimeout(s,500))}i.attributes.timedOut=!0}),n?await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.updateSettings({keyInjectionDelay:n}),await this.driver.keys(e.text),await this.driver.updateSettings({keyInjectionDelay:0})},{name:"Typing keys with a delay"}):await t.startAsyncSpan("EMULATOR_INTERACTION",async()=>{await this.driver.keys(e.text)},{name:"Typing keys"})}async clearContent(){let e=ee();try{await e.startAsyncSection("Clearing any content from the focused field",()=>this.clearContentHelper())}catch(t){this.logger.warn({err:t},"Failed to find select all button, continuing...")}}async clearContentHelper(){let e=this.driver.$('//android.widget.LinearLayout[@content-desc="Select all" and @clickable="true"]');await e.waitForExist({timeout:750}),await e.click(),await new jn(this.constructPerformerParams()).doPress({keycode:67})}};import Yt from"zod";var xx=.8,$n=.2,uH=Yt.object({navigationBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()}),statusBar:Yt.object({visible:Yt.boolean(),x:Yt.number(),y:Yt.number(),width:Yt.number(),height:Yt.number()})}),zi=class extends Je{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=uH.parse(await this.driver.executeScript("mobile: getSystemBars",[]));n=this.getInsetBoundsFromViewport(t),o.navigationBar.visible&&(n.height=Math.max(1,n.height-o.navigationBar.height)),o.statusBar.visible&&(n.top+=o.statusBar.height,n.height=Math.max(1,n.height-o.statusBar.height))}catch(o){this.logger.warn({err:o},"Failed to get system bars, using hardcoded bounds"),n=this.getInsetBoundsFromViewport(t)}break;case"OPEN_WEBVIEW":{let o=await this.stateManager.getActiveWebviewNodes();if(o.length===0)throw new Error("No active webviews found");if(o.length>1){let a=o.map(s=>({id:s.id,ele:s.originalElement.outerHTML,bounds:s.bounds}));throw new Error(`Multiple active webviews found. Momentic currently only supports a single active webview at a time. Discovered nodes: ${JSON.stringify(a)}`)}let i=o[0]?.bounds;if(!i)throw new Error("No bounds found for active webview");n=this.getInsetBoundsFromBounds(i);break}default:{let o=e;throw new Error("If Typescript complains about the line above, you missed a switch case")}}return n}getInsetBoundsFromViewport(e){let t=Math.floor(e.width*$n),n=Math.floor(e.height*$n);return{left:e.x+t,top:e.y+n,width:Math.max(1,e.width-t*2),height:Math.max(1,e.height-n*2)}}getInsetBoundsFromBounds(e){let t=e[0],n=e[1],o=e[2],i=e[3],a=o-t,s=i-n,c=Math.floor(a*$n),l=Math.floor(s*$n);return{left:t+c,top:n+l,width:Math.max(1,a-c*2),height:Math.max(1,s-l*2)}}async executeSwipe(e){let t=ee();if(e.scrollableElement.type==="CUSTOM_COORDINATES"){let{startX:o,startY:i,deltaPixels:a}=e.scrollableElement;return await t.startAsyncSpan("EMULATOR_INTERACTION",async s=>{s.attributes.startX=o,s.attributes.startY=i,s.attributes.deltaPixels=a,s.attributes.direction=e.direction,await this.performRawSwipe({startX:o,startY:i,deltaPixels:a,direction:e.direction,durationMs:e.durationMs})},{name:`Swipe ${e.direction} using raw coordinates`}),{success:!0,message:"Successfully executed swipe action"}}if(e.scrollableElement.type!=="CUSTOM"){let o=await this.driver.getWindowRect(),i=await this.getHardcodedScrollableElementBounds(e.scrollableElement,o);return await t.startAsyncSpan("EMULATOR_INTERACTION",async a=>{await this.swipeByAbsoluteCoordinates({span:a,direction:e.direction,percent:e.viewportPercent,durationMs:e.durationMs,containerBounds:i})},{name:`Swipe ${e.direction} in the entire ${e.scrollableElement.type.toLowerCase()}`}),{success:!0,message:"Successfully executed swipe action"}}let{thoughts:n}=await this.wrapTargetingAction({command:e,description:e.scrollableElement.target.description,action:async o=>ee().startAsyncSpan("EMULATOR_INTERACTION",async a=>"type"in o&&o.type==="NATIVE"?this.scrollInNativeContainer({span:a,cmd:e,target:o}):(a.withinWebview=!0,this.swipeInWebview({span:a,cmd:e,target:o})),{name:`Swipe ${e.direction} in the specified container`}),tracer:t});return{success:!0,message:n}}async scrollInNativeContainer({span:e,cmd:t,target:n}){let o=n.bounds[2]-n.bounds[0],i=n.bounds[3]-n.bounds[1],a=Math.floor(o*$n),s=Math.floor(i*$n);await this.swipeByAbsoluteCoordinates({span:e,direction:t.direction,percent:t.viewportPercent,durationMs:t.durationMs,containerBounds:{left:n.bounds[0]+a,top:n.bounds[1]+s,width:Math.max(1,o-a*2),height:Math.max(1,i-s*2)}})}async swipeInWebview({span:e,cmd:t,target:n}){let{controller:o,resolution:i}=n;if(!o.browser.getViewport())throw new Error("Failed to get viewport size from webview");let s=t.direction==="down"||t.direction==="up",c=await i.locator.boundingBox();if(!c)throw new Error("Failed to get bounds for webview container");let l=Math.floor(c.width*$n),u=Math.floor(c.height*$n),d=Math.max(1,c.width-l*2),m=Math.max(1,c.height-u*2),p={x:c.x+l+d/2,y:c.y+u+m/2},g=(s?m:d)*(t.viewportPercent??xx)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=p,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates(s?0:g,s?g:0,10,t.durationMs,p)}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=xx,durationMs:o=500,containerBounds:i}){e.attributes.containerBounds=i;let a,s;t==="up"||t==="down"?(a=i.height*n,s=Math.floor(a/(o/1e3))):(a=i.width*n,s=Math.floor(a/(o/1e3))),e.attributes.pixelDelta=a,e.attributes.pixelsPerSecond=s,await this.driver.executeScript("mobile: swipeGesture",[{...i,direction:t,percent:n,speed:s}])}};import pH from"pixelmatch";import{_android as gH,chromium as hH}from"playwright";import{PNG as Lx}from"pngjs";import{z as Ve}from"zod";var Mx=Ve.object({"Android-Package":Ve.string(),Browser:Ve.string(),"Protocol-Version":Ve.string(),"User-Agent":Ve.string(),"V8-Version":Ve.string(),"WebKit-Version":Ve.string(),webSocketDebuggerUrl:Ve.string()}),_x=Ve.object({description:Ve.string(),devtoolsFrontendUrl:Ve.string(),id:Ve.string(),title:Ve.string(),type:Ve.string(),url:Ve.string(),webSocketDebuggerUrl:Ve.string()}),Px=Ve.object({proc:Ve.string(),webview:Ve.string(),webviewName:Ve.string()}),Ix=Ve.array(Px.extend({info:Mx.optional(),pages:Ve.array(_x).optional()})),CIe=Ve.array(Px.extend({info:Mx,pages:Ve.array(_x)}));function ah(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=Lx.sync.read(n),a=Lx.sync.read(o);if(i.width!==a.width||i.height!==a.height)return 100;let s=i.width,c=i.height,l=Buffer.alloc(s*c*4);return pH(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var Uu=class r{driver;limbarClient;device;currentContext;logger;webviews=new Map;fixtures;orgId;options;aborter;constructor({driver:e,context:t,limbarClient:n,logger:o,device:i,fixtures:a,orgId:s,options:c,aborter:l}){this.driver=e,this.limbarClient=n,this.device=i,this.currentContext=t,this.logger=o,this.fixtures=a,this.orgId=s,this.options=c,this.aborter=l;for(let u of["SIGINT","SIGTERM"])process.on(u,async()=>{await this.cleanupWebviews()})}static async init({driver:e,logger:t,fixtures:n,limbarClient:o,orgId:i,adbPort:a,options:s,aborter:c,playwrightDevice:l}){let u=await e.getContext(),d=typeof u=="string"?u:u.id,m;if(l)m=l;else{let g=(await gH.devices()).filter(h=>h._initializer?.serial?.endsWith(a.toString())||h._initializer?.serial?.endsWith((a-1).toString()));if(t.warn({devices:g.map(h=>({serial:h._initializer?.serial,model:h._initializer?.model}))},"No playwright device provided, using ADB to find device"),g.length===0)throw new Error(`Momentic found no devices listening on port ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);if(g.length>1)throw new Error(`Momentic found multiple devices on the ports ${a} or ${a-1}. This can occur if Android Studio reuses existing emulators. Please run 'adb emu kill' and 'adb disconnect' and retry.`);m=g[0]}return new r({driver:e,context:d,logger:t,device:m,fixtures:n,orgId:i,options:s,aborter:c,limbarClient:o})}async getContexts(){let e=await this.driver.getContexts({}),t=Array.from(this.webviews.values());return{contexts:e,webviews:t.map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active,hasPlaywright:!!n.browserController,lastSeen:n.lastSeen,socketName:n.socketName}))}}async getRawScreenshotBase64(e=2){let t=ee(),n;for(let o=0;o<e;o++)try{return await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>await this.driver.takeScreenshot(),{name:"Take screenshot",signal:this.aborter.controller?.signal,timeoutMs:3e3})}catch(i){if(n=i,o===e-1)throw i}throw new Error(`Failed to take screenshot: ${n}`)}async getCurrentScreenshotPngString(){return`data:image/png;base64,${await this.getRawScreenshotBase64(1)}`}async waitForScreenshotStability({timeoutMs:e,signal:t,reason:n,tolerancePercent:o=1}){await ee().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c=!1;for(;Date.now()-a<e;){if(t?.throwIfAborted(),!s){s=await this.getRawScreenshotBase64();continue}let l=await this.getRawScreenshotBase64();if(ah(s,l)<=o){c=!0;break}s=l,await j(250,t)}c||(i.attributes.timedOut=!0,this.logger.warn({purpose:n},"Timed out waiting for screenshot stability"))})}async getCurrentPackage(){let e=await this.driver.execute("mobile: getCurrentPackage");return typeof e=="string"?e:void 0}async getActiveWebviewNodes(){await this.refreshWebviews();let t=(await this.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph,n=await this.getCurrentPackage(),o=[];for(let[i,a]of t.idToElement.entries()){if(o.some(l=>l.id===i))continue;let s=a.getAttribute("content-desc");(Ms(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:Oo(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await ee().startAsyncSpan("EMULATOR_READ_STATE",()=>t.getBrowserState({abortSignal:this.aborter.controller?.signal,serializationOpts:{noId:!0}}),{name:"Get webview content",signal:this.aborter.controller?.signal})).serializedTree}async getDomState(e){return await ee().startAsyncSection("Get emulator state XML",async()=>{let n;if(!e?.skipFetchingFullWebviewContent)try{n=await this.getActiveWebviewContent()}catch(c){this.logger.error({err:c},"Could not get webview info to get the nested DOM state")}this.throwIfAborted();let i=e?.filterOffscreenElements??!0?await this.getViewportBounds():void 0,a=await this.getPageSource();return{graph:await yx(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await ee().startAsyncSpan("EMULATOR_READ_STATE",()=>this.driver.getPageSource(),{name:"Get Android page source",signal:this.aborter.controller?.signal})}async getViewportBounds(){let e=await this.driver.getWindowRect();return{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height}}async refreshWebviews(){try{await this.refreshWebviewsHelper()}catch(e){this.logger.warn({err:e},"Error refreshing webviews, continuing...")}}async refreshWebviewsHelper(){await this.getPageSource(),this.throwIfAborted();let e=await this.getCurrentPackage(),t=await this.getDetailedContexts();if(!t){this.logger.warn("No context details, not proceeding with refreshing webviews");return}let n=Date.now(),o=new Set;for(let i of t){if(this.throwIfAborted(),i.webview==="NATIVE_APP")continue;let a=i.info["Android-Package"];if(e&&a!==e&&this.logger.warn({packageName:a,currentPkgName:e},"Ignoring webview not in the active package"),o.add(i.webview),!this.webviews.has(i.webview)||!this.webviews.get(i.webview)?.active){let s={contextId:i.webview,packageName:a,active:!1,lastSeen:n,socketName:i.proc.startsWith("@")?i.proc.substring(1):i.proc};this.logger.info({contextId:s.contextId,packageName:s.packageName,socketName:s.socketName},"New webview detected"),this.webviews.set(i.webview,s);let c;if(a==="com.android.chrome"?(this.logger.info({webviewInfo:s},`Connecting Playwright to Android Chrome: ${i.webview}`),c=await this.connectPlaywrightToChrome(s),this.logger.info(`Connected Playwright to Android Chrome: ${i.webview}`)):(this.logger.info({webviewInfo:s},`Connecting Playwright to webview: ${i.webview}`),c=await this.connectPlaywrightToWebview(a,s.socketName),c&&this.logger.info(`Connected Playwright to webview ${i.webview}`)),!c)continue;s.browserController=c,s.active=!0}}for(let[i,a]of this.webviews.entries())!o.has(i)&&a.active&&(this.logger.info(`Disconnecting dead webview ${i}`),this.disconnectPlaywrightFromWebview(a),a.active=!1)}async getActiveWebview(){await ee().startAsyncSection("Refresh webviews",async()=>{await this.refreshWebviews()});let e=await this.driver.execute("mobile: getCurrentPackage");e!==void 0&&typeof e!="string"&&this.logger.warn({currentPkg:e},"Unexpected getCurrentPackage result");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(t.length!==0){if(t.length>1)throw new Error("Multiple active webviews in a single package is currently not supported");return t[0]}}async executeRawADBCommand(e){let t=this.driver.capabilities,n=s=>{if(!t||typeof t!="object")return;let c=t[s];return typeof c=="string"?c:void 0},o=n("deviceUDID")||n("udid")||n("appium:udid")||n("appium:deviceUDID"),i=e.trim().split(/\s+/).filter(s=>s.length>0);this.logger.info({serial:o,cmdArgs:i},"Executing ADB command");let a=await ht(i,{serial:o,timeoutMs:15e3,throwOnError:!0});return this.logger.info({result:a},"ADB command result"),a}async cleanupWebviews(){for(let[e,t]of this.webviews.entries())this.logger.info(`Disconnecting webview ${e}`),this.disconnectPlaywrightFromWebview(t),t.active=!1}async getDetailedContexts(){return await ee().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=Ix.parse(t)}catch(o){throw new Error(`Failed to parse contexts. Original error:
4348
4348
  ${o}
4349
- Raw: ${JSON.stringify(t)}`)}return n.filter(o=>{if(!o.webviewName)return!0;if(!o.info||!o.pages)return!1;let i=o.pages.filter(a=>{if(!a.title)return!1;let s=a.url;return!(!s||s===""||s.startsWith("about:blank")||s.startsWith("chrome-error:"))});return i?!!i:(this.logger.debug({context:o},"Webview has no qualified pages, skipping"),!1)})},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e}){return await Z().startSection("Run remote Chrome initialization",async(n,o)=>{let i={};o.attributes.timings=i;let a=await As.fromExistingContext({context:e,logger:this.logger,timingRecorder:i,userBrowserSettings:{visualActions:!0,disableBrowserMonitoring:!0,autoExpandIframes:!0},properties:{isNewHeadless:!0,allowedA11yIgnoreReasonsOverride:[],isAndroid:!0},storage:this.fixtures.storage,enricher:this.fixtures.browserEnricher});return new Mu({browser:a,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new ql})})}async connectPlaywrightToWebview(e,t){return Z().startAsyncSection("Connect headless browser client to webview",async()=>{for(let o=0;o<2;o++)try{return await this.connectPlaywrightToWebviewHelper(e,t)}catch(i){this.logger.warn({err:i},"Failed to connect Playwright to webview, retrying...")}},{signal:this.aborter.controller?.signal,timeoutMs:8e3,timeoutMsg:"Timed out connecting Playwright to the webview"})}extractSocketNameFromWebview(e,t){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;t.warn({pkg:e.pkg()},"Could not extract socket name from webview")}async connectPlaywrightToWebviewHelper(e,t){let n=this.device.webViews(),o=n.find(l=>!(l.pkg()!==e||this.extractSocketNameFromWebview(l,this.logger)!==t));if(!o){let l=`Could not find webview for ${e} with socket name ${t}`;throw this.logger.warn({webviews:n.map(u=>({pkg:u.pkg,name:this.extractSocketNameFromWebview(u,this.logger)}))},l),new Error(l)}let i=await o.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let l=`Webview ${e} with socket ${t} is not a valid webview`;this.logger.warn({pageUrl:a},l);return}let s=i.context();return await this.createBrowserController({context:s})}async connectPlaywrightToChrome(e){return await Z().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.connectPlaywrightToChromeHelper(e),{name:"Connect headless browser client to Chrome",signal:this.aborter.controller?.signal})}async connectPlaywrightToChromeHelper(e){let{contextId:t,socketName:n}=e;try{this.logger.info({contextId:t,socketName:n},"Connecting to Chrome webview");let o;e.forwardedPort?(o=`http://127.0.0.1:${e.forwardedPort}`,this.logger.info({contextId:t,endpoint:o,socketName:n},"Using existing forwarded port")):(o=`http://127.0.0.1:${await this.forwardDevToolsSocket(e.socketName)}`,this.logger.info({contextId:t,endpoint:o,socketName:n},`Forwarding DevTools socket for ${e.socketName}`)),this.logger.info({endpoint:o,socketName:n},"Connecting to CDP endpoint");let i=await lH.connectOverCDP({endpointURL:o,timeout:8e3}),a=i.contexts()[0];if(!a){this.logger.warn("No browser context available after CDP connection"),await i.close();return}return this.createBrowserController({context:a})}catch(o){this.logger.warn({err:o},`Error connecting Playwright to webview ${e.contextId}, continuing...`);return}}async disconnectPlaywrightFromWebview(e){try{e.browserController&&(this.logger.info(`Disconnecting Playwright from webview: ${e.contextId}`),await e.browserController.browser.cleanup(),e.browserController=void 0),e.forwardedPort&&await this.removeDevToolsForwarding(e.forwardedPort)}catch(t){this.logger.error({err:t},`Error disconnecting Playwright from webview ${e.contextId}:`)}}async forwardDevToolsSocket(e){this.logger.info("Setting up port forwarding for DevTools");let t=1e4+Math.floor(Math.random()*1e4),n=this.driver.capabilities,o=n.deviceUDID||n.udid||n["appium:udid"]||n["appium:deviceUDID"];this.logger.info({deviceId:o},`Device ID from capabilities: ${o||"not found"}`);let i=e&&e.trim().length>0?`localabstract:${e}`:"localabstract:chrome_devtools_remote";return await this.executeRawADBCommand(`forward tcp:${t} ${i}`),this.logger.info(`Successfully forwarded DevTools socket to port ${t}`),t}async removeDevToolsForwarding(e){await this.executeRawADBCommand(`forward --remove tcp:${e}`),this.logger.info("Successfully removed port forwarding")}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}};var Mx=5,_x=.8,cH=1,ku=class extends Hi{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??_x,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer(e,t){let n=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:n.width,height:n.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,n)};let o=Z(),i=e.target.description;if(t){let c=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:t}}let{resolvedTarget:a}=await this.findElement({description:i,tracer:o});if(a.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${i}" resolved to a webview element. Custom containers must be native elements.`);let s=this.getBoundsFromNativeCache(a);return this.logger.info({bounds:s},"Got container bounds from AI"),{bounds:s,cache:a}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=Z();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:n,description:t,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i)}});return{success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,t,n){let o=n.scrollDetails,i=Z(),a=e.scrollStepPercent??_x,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await Ou({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n});a=u.resolvedTarget,s=u.thoughts}catch(u){if(this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u instanceof vn)return null;throw u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),Lo({command:e,updatedCache:Lu(a),updatedWithAI:!0}),{success:!0,message:s}):(Lo({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0}),{success:!0,message:s})}async searchForElement(e,t,n){let o=Z(),i=await this.resolveContainer(e.scrollableElement);return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<Mx;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),m=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(m)return m;if(!l)throw new Error(`ActionFailureError: Could not find element "${t}" after scrolling to the end`);this.logger.debug({attempt:u,cumulativePixelDelta:a},"Element not found, scrolling further");let g=uH(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:g}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${Mx} scroll attempts`)}buildScrollDetails(e,t,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:t,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:t,resolution:n}=e;await t.browser.hover({locator:n.locator})}async scrollByPage({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o}){return Z().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i}){if(e===0)return;let a=Z(),s,c,l;if(t.type==="CUSTOM_COORDINATES")s=t.startX,c=t.startY,l=t.deltaPixels;else{let m=(await this.resolveContainer(t,n)).bounds,g=m.height*i,p=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:g});s=p.startX,c=p.startY,l=p.actualDelta}let u=Math.ceil(Math.abs(e)/l);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:s,startY:c,maxScrollPerStep:l,numScrolls:u},"scrollByPixelDelta calculated parameters"),await a.startAsyncSpan("EMULATOR_INTERACTION",async d=>{d.attributes.pixelDelta=e,d.attributes.numScrolls=u,d.attributes.maxScrollPerStep=l,d.attributes.startX=s,d.attributes.startY=c;let m=0;for(let g=0;g<u;g++){this.throwIfAborted();let p=Math.abs(e)-m,h=Math.min(l,p);await this.performRawSwipe({startX:s,startY:c,deltaPixels:h,direction:this.invertDirection(o)}),m+=h}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=cH,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let g=t.height*n,p=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:g});s=p.startX,c=p.startY,l=p.actualDelta}await this.performRawSwipe({startX:s,startY:c,deltaPixels:l,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=ih(a,u),m=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:m,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),m}};function uH(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as dH}from"crypto";import _s from"fs";import{tmpdir as mH}from"os";import Gi from"path";var Uu=class extends Je{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install ${Gi.resolve(t.localPath)}`),this.logger.info({uri:e,localPath:t.localPath},"Installed APK on device")}finally{t.cleanup()}}async resolveUriToLocalApk(e){try{let t=new URL(e);if(t.protocol==="file:"){let n=t.href.slice(7),o;if(_s.existsSync(n))o=n;else if(_s.existsSync(Gi.join("/",n)))o=Gi.join("/",n);else throw new Error(`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new Error(`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{_s.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new Error(`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=Gi.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{_s.accessSync(e)}catch{throw new Error(`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=Gi.extname(t)||".apk",o=Gi.join(mH(),`momentic-apk-${dH()}${n}`);return _s.writeFileSync(o,e),o}};import{existsSync as pH,readFileSync as gH}from"fs";import hH from"zod";var fH=hH.string().url();async function Px(r){if(fH.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new Error(`Fetch failed or timed out for URL: ${r}`,{cause:i})}finally{clearTimeout(t)}if(!n.ok)throw new Error(`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!pH(r))throw new Error(`File does not exist at path: ${r}`);return gH(r).toString("base64")}var Fu=class extends Je{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),m=o+a/2,g=i+s/2,p=c+u/2,h=l+d/2,f=n?.hoverDuration??500,E=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:g},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:E,x:p,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new Error("ActionFailureError: Cannot drag and drop between different webviews");let i=n?.hoverDuration?n.hoverDuration/1e3:void 0,a;n?.dragDuration&&(a=Math.max(1,Math.floor(n.dragDuration/200))),await o.browser.dragAndDrop(e.resolution.locator,t.resolution.locator,{hoverSeconds:i,steps:a})}async executeDragAndDrop({command:e}){let t=Z();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new Error("ActionFailureError: Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new Error(`ActionFailureError: Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
4350
- ${c}`}}};import{cloneDeep as Ix}from"lodash-es";var Bu=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,t){return await e.getAttribute(t,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(t=>t.tagName)}async isEditable(e){return await e.isEditable({timeout:Lt*1e3})}async isEnabled(e){return await e.isEnabled({timeout:Lt*1e3})}async isFocused(e){return await e.evaluate(t=>t===document.activeElement)}async getStyleProperty(e,t){return await e.evaluate((n,o)=>window.getComputedStyle(n).getPropertyValue(o),t)}},zu=class{async getTextContent(e){return Rs(e)}async getAttribute(e,t){return e.getAttribute(t)??""}async getTagName(e){return e.tagName}async isEditable(e){throw new Error("Cannot perform editable check on native element")}async isEnabled(e){return e.getAttribute("enabled")==="true"}async isFocused(e){return e.getAttribute("focused")==="true"}async getStyleProperty(e,t){throw new Error("Cannot perform computed style checks on native element")}};var SH=5e3,Hu=class extends Je{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??Lt)*1e3,o=n+1e4,i,a=0,s=500,c=Ix(e.cache);if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");for(;a-t<n;){if(Date.now()-t>o){this.logger.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),i=await this.executeElementCheckHelper(e),a=Date.now(),!i.success)e.cache=c,c=Ix(c),await W(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),SH);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});return l.success||c&&e.cache&&(e.cache=fs({originalCache:c,newCache:e.cache,targetGetter:u=>u.target}).result),l}async executeElementCheckHelper(e,t){let n=Z();if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");let o=qc(e.assertion);try{return(await this.wrapTargetingAction({...t??{},command:e,tracer:n,action:async a=>"type"in a&&a.type==="NATIVE"?await this.executeNativeElementCheck(e,a):await this.executeWebviewElementCheck(e,a),description:e.target.description,skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).result}catch(i){return o&&(i instanceof vn||i instanceof Tn)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=Z(),{assertion:o}=e,i=t.resolvedNode;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{let s=await this.executeElementAssertion({assertion:o,element:i,elementPropertyAccessors:new zu,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=Z(),o=t.resolution.locator,i=e.assertion;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{await t.controller.browser.highlight(o);let s=await this.executeElementAssertion({assertion:i,element:o,elementPropertyAccessors:new Bu,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:t,elementPropertyAccessors:n,span:o}){switch(e.type){case"ELEMENT_CONTENT":{let i=await n.getTextContent(t)??"";return o.attributes.elementTextContent=ft(i,500,!0),Wr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${gr(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=ft(await t.evaluate(a=>a.cloneNode(!1).outerHTML),500,!0));let i;try{i=await n.getAttribute(t,e.attr)}catch(a){return{success:!1,message:`The element does not have an attribute named ${e.attr}: ${a}`}}if(!Wr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=gr(e);return{success:!1,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}case"ELEMENT_EXISTENCE":{let i=!1;switch(e.condition){case"EDITABLE":i=await n.isEditable(t);break;case"VISIBLE":case"EXISTS":i=!0;break;case"ENABLED":{i=await n.isEnabled(t);break}case"FOCUSED":i=await n.isFocused(t);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:!0}:{success:!1,message:`The element ${gr(e)}`}}case"ELEMENT_NAME":{let i=await n.getTagName(t);return Wr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})?{success:!0}:{success:!1,message:`The element tag name ${gr(e)} '${e.value}': ${i}`}}case"ELEMENT_STYLE":{let i=await n.getStyleProperty(t,e.property);if(!Wr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=gr(e);return{success:!1,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}default:throw new Error("Unrecognized element assertion type")}}};var yH=5e3,Gu=class extends Je{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??Lt)*1e3,i=o+1e4,a=0,s=500;for(;a-n<o;){if(Date.now()-n>i){this.logger.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e);if(a=Date.now(),!c.success)await W(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),yH);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await Z().startAsyncSection("Execute screen check",async(n,o)=>{let[i,a]=await Promise.all([this.executeNativeScreenCheckHelper({span:o,command:e}),this.executeWebviewScreenCheckHelper(e)]);return a?e.assertion.negated?i.success&&a.success?i:i.success?a:i:i.success?i:a:i})}async executeNativeScreenCheckHelper({span:e,command:t}){let{assertion:n}=t;switch(n.type){case"CONTENT":try{let o=(await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph.document.documentElement?.outerHTML;if(!o)throw new Error("Failed to get screen HTML");let i=o.includes(n.value)===!n.negated;return o.length>1e4&&(o=o.slice(0,1e4)+"...TRUNCATED"),i?{success:!0}:(e.attributes.screenContent=o,{success:!1,message:`The screen ${og(n)}.`})}catch(o){return{success:!1,message:`Failed to evaluate screen content assertion: ${o instanceof Error?o.message:`${o}`}`}}default:return n.type,{success:!1,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e){let t=await this.stateManager.getActiveWebview();if(!t||!t.browserController)return;let n=t.browserController.browser;return await xu({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var Vu=class extends Je{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:!0,message:"Uninstalled APK."}}async uninstallApkPackage(e){let t=e.replace(/^package:/,""),n=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${t}$" || true`);if(!n||n.length===0)throw new Error(`Package ${t} not found`);if(n.split(`
4351
- `).filter(i=>!!i).length>1)throw new Error(`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new Error(`Failed to uninstall package ${t}: ${i}`)}}};var Vi=class r extends Je{options;appsWithGrantedPermissions=new Set;adbPort;constructor(e){super(e),this.options=e.options??{},this.adbPort=e.adbPort}static async init({driver:e,generator:t,logger:n,fixtures:o,orgId:i,options:a,abortController:s,adbPort:c,limbarClient:l,playwrightDevice:u,aiSettings:d}){let m={controller:s},g=await Du.init({driver:e,logger:n,fixtures:o,orgId:i,limbarClient:l,options:a?.emulator??{},aborter:m,adbPort:c,playwrightDevice:u}),p=new r({driver:e,generator:t,stateManager:g,logger:n,fixtures:o,options:a,aborter:m,orgId:i,aiSettings:d,adbPort:c});return await p.initializeSettings(),p}async installApp(e){await this.stateManager.executeRawADBCommand(`install ${EH.resolve(e)}`)}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await au({obj:e.command,context:this.fixtures.testContext,bannedKeys:t,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools})}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{su(e.command,n)}}async executeCommandHelper({command:e}){let t=Z();switch(e.type){case"TAP":return new zi(this.constructPerformerParams()).executeTap({command:e});case"TYPE":return await new Nu(this.constructPerformerParams()).doType(e);case"AI_CHECK":{let n=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=Zc(i),s=Date.now(),c=0,l,u=!1,d;for(;c<o&&!u;){this.throwIfAborted(),u||l&&l-s>=i&&(u=!0),c!==0&&await W(a,this.abortSignal),l=Date.now();try{let m="",g="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{m=(await this.stateManager.getDomState({})).graph.xml,g=await this.stateManager.getCurrentScreenshotPngString()},{name:"Get emulator state"});let p=await t.startAsyncSpan("AI_ASSERTION_CALL",async h=>{let f=await this.generator.evaluateMobileAssertion({assertion:e.assertion,screenXml:m,screenshot:g,memory:n?e.cache?.memory:void 0},{logger:this.logger,loggerTags:be(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["mobile-assertion"],useMemory:n});return h.result={thoughts:f.thoughts,result:f.result},f});if(n&&p.updatedMemory){let h={type:"GCS_TRACES",traces:p.updatedMemory};e.cache={...e.cache??{},memory:h}}if(p.result)return{success:p.result,message:p.thoughts};{let h=`AssertionFailureError: ${p.thoughts}`;d=new Error(h)}}catch(m){this.throwIfAborted(),this.logger.info({err:m},`AI check assert attempt ${c} failed, retrying...`),d=m instanceof Error?m:new Error(`${m}`)}finally{c++}}return{success:!1,message:d?.message}}case"SWIPE":return new Hi(this.constructPerformerParams()).executeSwipe(e);case"SCREEN_CHECK":return new Gu(this.constructPerformerParams()).executeScreenCheck(e);case"ELEMENT_CHECK":return await new Hu(this.constructPerformerParams()).executeElementCheck(e);case"DRAG_AND_DROP":return await new Fu(this.constructPerformerParams()).executeDragAndDrop({command:e});case"SCROLL_TO":return new ku(this.constructPerformerParams()).executeScrollTo(e);case"JAVASCRIPT":{let n=await $r({orgId:this.orgId,code:e.code,fragment:!1,context:this.fixtures.testContext,timeoutMs:e.timeout?e.timeout*1e3:void 0,logger:this.logger,localTools:this.fixtures.localCodeEvalTools,signal:this.abortSignal});try{JSON.stringify(n)}catch(o){throw new Error(`UserConfigurationError: Return value is not serializable: ${o instanceof Error?o.message:`${o}`}`)}return{success:!0,output:n}}case"REQUEST":{let n;try{n=new URL(e.url).hostname}catch(l){throw new Error(`UserConfigurationError: Invalid URL: ${l}`)}let o=new TH,i=bH(fetch,o),a=Date.now(),s=await Ru({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),c=Cl(o,n);return{output:Qs.parse({...s,cookies:c}),success:!0,message:`Successfully executed request in ${Date.now()-a}ms`}}case"OPEN_NOTIFICATION_DRAWER":return await new jn(this.constructPerformerParams()).doPress({keycode:83}),{success:!0};case"OPEN_APP":{let n=e.activityName;if(!n){let i=["resolve-activity","--brief","-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER",e.packageName],a=await z(this.driver.execute("mobile: shell",{command:"pm",args:i}),{signal:this.abortSignal,milliseconds:1e4});if(typeof a!="string")throw new Error(`Could not find main activity name for package ${e.packageName}. Unexpected output: ${a}`);if(a.includes("No activity found"))throw new Error(`No activity found for package ${e.packageName}.`);if(n=a.trim().split(`
4352
- `).pop()?.replace(/^.*\//,""),!n)throw new Error(`Could not parse main activity name for package ${e.packageName}. Raw output: ${a}`)}if(this.options.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let i={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeScript("mobile: changePermissions",[i]),this.appsWithGrantedPermissions.add(e.packageName)}let o=["start"];if(e.intentExtras)try{let i=JSON.parse(e.intentExtras);for(let[a,s]of Object.entries(i))o.push("-e",a,typeof s=="string"?s:JSON.stringify(s))}catch(i){throw new Error(`UserConfigurationError: Invalid intent extras does not parse as valid JSON: ${i instanceof Error?i.message:`${i}`}`)}return o.push("-n",`${e.packageName}/${n}`),await this.driver.execute("mobile: shell",{command:"am",args:o}),await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),{success:!0}}case"PRESS":{let n=new jn(this.constructPerformerParams());switch(e.key){case"HOME":await n.doPress({keycode:3});break;case"BACK":await n.doPress({keycode:4});break;case"APP_SWITCHER":await n.doPress({keycode:187});break;case"POWER":await n.doPress({keycode:26});break;case"SEARCH":await n.doPress({keycode:84});break;case"VOLUME_UP":await n.doPress({keycode:24});break;case"VOLUME_DOWN":await n.doPress({keycode:25});break;case"VOLUME_MUTE":await n.doPress({keycode:164});break}return{success:!0}}case"PRESS_KEYBOARD":{let n=new jn(this.constructPerformerParams()),o=i=>n.doPress({keycode:i});switch(e.key){case"CLOSE_KEYBOARD":{let i=Date.now();for(;Date.now()-i<5e3&&(await this.driver.hideKeyboard(),!!await this.driver.isKeyboardShown()););break}case"ENTER":await o(66);break;case"BACKSPACE":await o(67);break;default:{let i=e}}return{success:!0}}case"WAIT":return await W(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:!0};case"INSTALL_APP":return new Uu(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new Vu(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await Px(e.file);return await this.driver.pushFile(e.storageLocation,n),await this.driver.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]}),{success:!0}}case"TOGGLE_SETTINGS":{switch(e.settingsType){case"AIRPLANE_MODE":await this.driver.toggleAirplaneMode();break;case"DATA":await this.driver.toggleData();break;case"WIFI":await this.driver.toggleWiFi();break;case"LOCATION":await this.driver.toggleLocationServices();break;default:throw e.settingsType,new Error(`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ADB":{let n=await this.driver.execute(e.command,JSON.parse(e.jsonArgs??"{}"));return this.logger.info({output:n},"ADB command executed successfully"),{success:!0,output:n,message:"ADB command executed successfully"}}case"KILL_APP":{let n=await this.stateManager.getCurrentPackage();if(!n)throw new Error("No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await ux({packageName:n,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger})}catch(o){this.throwIfAborted(),this.logger.warn({err:o,packageName:n},"Failed to remove package from recents, continuing...")}return{success:!0}}case"STATE":{await this.stateManager.refreshWebviews();let n=await this.stateManager.getDomState(),o=await this.stateManager.getContexts(),i={xml:n.graph.xml,contexts:o};return this.logger.info({result:i},"State debug command output"),{output:i,success:!0}}default:{let n=e;return{success:!0}}}}async initializeSettings(){let{latitude:e,longitude:t}=this.options?.emulator?.geolocation??Sl;await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),await this.driver.setGeoLocation({latitude:e,longitude:t})}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64()}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString()}async getA11yTree(){return(await this.stateManager.getDomState({})).graph.xml}async executeRawADBCommand(e){return this.stateManager.executeRawADBCommand(e)}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}resetAbortController(e){this.aborter.controller=e??new AbortController}isAborted(){return this.aborter.controller?.signal.aborted}abort(){this.aborter.controller?.abort()}async cleanup(){await this.stateManager.cleanupWebviews()}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};async function Ox({socket:r,logger:e,androidDriverFactory:t,getOrgId:n,mobileGeneratorFactory:o,browserGeneratorFactory:i,browserEnricherFactory:a,storageFactory:s,localToolsFactory:c,globalStateManager:l,settingsFactory:u}){let d=r.id,m=r.handshake.query?.testMetadata,g=r.handshake.query?.fileName,p=g?vH.basename(g,".test.yaml"):"",h=Ar.parse(JSON.parse(m??"")),f=h.id,E=h.settings?.defaultChannel,b=h.settings?.defaultTag,w=h.settings?.defaultApkFilePath?.trim(),R=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:R});let v=await u(R,e),M={...v.emulator,...h.settings?.emulator},A;if(M.region==="local"){if(l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");if(!M.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is local");A={avdId:M.localEmulatorSettings.avdId,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:w||void 0}}else A={region:M.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:M.remoteEmulatorSettings?.androidVersion};let I=Date.now(),{driver:k,cleanup:j,emulatorName:ne,adbPort:Te,limbarClient:At,limbarToken:G,limbarUrl:$,playwrightDevice:ge}=await t({socket:r,logger:e,creationOpts:A}),ae=await iu({driver:k,onLogs:zo=>{r.emit("logcatLogs",zo)}});e.info({adbPort:Te,apkChannel:E,apkTag:b,duration:Date.now()-I,emulatorName:ne},"Android emulator session initiated"),e=e.child({emulator:ne});let Ce=await o(R,e),Me=await i(R,e),Jt=await a(R,e),qt=await s(R),_e=c?await c(R):void 0,$e={};h.settings?.defaultEnv&&($e=(await qt.fetchEnvironment(h.settings?.defaultEnv,e))?.variables??{});let st=new ui({variablesFromEnvironment:$e,envName:h.settings?.defaultEnv,testName:p}),Pt=await Vi.init({driver:k,generator:Ce,logger:e,limbarClient:At,playwrightDevice:ge,aiSettings:{...v.ai,useMemory:v.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:M},fixtures:{storage:qt,browserEnricher:Jt,browserGenerator:Me,localCodeEvalTools:_e,testContext:st},orgId:R,adbPort:Te,abortController:new AbortController}),Gt=await Pt.getViewportBounds();if(!r.connected)throw await ae(),await j(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Fo=AH({socket:r,testContext:st}),Bo=async()=>{clearInterval(Fo);try{await ae(),await j(),await Pt.cleanup()}catch(zo){e.warn({err:zo},"Failed to clean up emulator in socket server")}};return l.registerSession(d,{controller:Pt,cleanup:Bo,emulatorName:ne,local:M.region==="local"}),r.emit("session",{testId:f,sessionId:d,limbarUrl:$,limbarToken:G,viewportBounds:Gt}),{sessionId:d,testId:f,orgId:R,emulatorName:ne,logger:e,testName:p}}function AH({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}async function Lx({socket:r,logger:e,globalStateManager:t}){await t.removeSession(r.id,e)}var wH=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},Nx={event:"cancel",createHandler:wH};var CH=({logger:r,globalStateManager:e,socket:t})=>async(n,o)=>{let i=e.getSession(t.id);if(!i){o({err:"No active Android session found"});return}try{let s=await i.controller.getA11yTree();o({a11yTree:s})}catch(a){r.error({err:a},"Error fetching a11y tree from the session controller"),o({err:a.message})}},Dx={event:"fetchA11yTree",createHandler:CH};import{diff as jH}from"deep-object-diff";import{cloneDeep as $H}from"lodash-es";function kx(r,e,t=1e4,n=5e3){let o=0;async function i(){try{let s=await z(r.driver.execute("mobile: shell",{command:"echo",args:["ping"]}).catch(c=>{throw c}),{milliseconds:n});if(typeof s=="string"&&s.trim()==="ping")o>0&&e.info("Driver heartbeat restored"),o=0;else throw new Error(`Unexpected heartbeat output: ${s}`)}catch(s){o++;let c=s instanceof Error?s.message:`${s}`;e.error({attempt:o,error:c},"Driver heartbeat failed"),o>=3&&e.error("Driver appears unresponsive \u2014 possible ADB tunnel/emulator failure")}}let a=setInterval(()=>{i()},t);return i(),a}async function Ux(r){let e=Date.now(),t=r.fixtures.controller;try{return await RH(r)}catch(n){let o=t.isAborted()||n instanceof DOMException&&n.name==="AbortError";return{...r.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":`${n}`}}}async function RH({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await xH({step:n,params:e}),s={};Object.entries(a).forEach(([m,g])=>{s[m]=JSON.stringify(g)});let c={...n,type:"MOBILE_MODULE_STEP",inputs:s,startTime:t,steps:[],endTime:Date.now(),status:"SUCCESS"},l=await o.startSubSteps(),{status:u,results:d}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:l}});return c.steps=d,c.status=u,c.endTime=Date.now(),$w({result:c,...jw(d)}),c}async function xH({step:r,params:e}){let t={},{logger:n,controller:o}=e.fixtures;for(let i of r.parameters?.parameterNames??[]){let a=r.inputs?.[i]??r.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}t[i]=await $r({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as Fx}from"crypto";import{diff as MH}from"deep-object-diff";import{cloneDeep as _H}from"lodash-es";async function Bx({fixtures:r,step:e,inputs:t,stepTracer:n}){let o=Date.now(),{logger:i,controller:a}=r,s;if(!t.interactive)try{s=await a.getScreenshotBase64()}catch(u){i.warn({err:u},"Failed to take before screenshot")}let c="cache"in e.command?_H(e.command.cache??{}):{},l={...e,status:"SUCCESS",startTime:o,endTime:Date.now()};try{let u=await a.executeCommand({command:e.command});l={...e,status:u.success?"SUCCESS":"FAILED",message:u.message,startTime:o,endTime:Date.now(),data:u.output}}catch(u){u instanceof Error&&u.name==="AbortError"||a.isAborted()?l={...e,status:"CANCELLED",message:"Step cancelled.",startTime:o,endTime:Date.now()}:(i.error({err:u},"Failed to execute preset step"),l={...e,status:"FAILED",message:u instanceof Error?u.message:String(u),startTime:o,endTime:Date.now()})}finally{if(!t.interactive){try{let m=Fx(),g=await a.getScreenshotBase64();l.afterSnapshot=m,n.attachAfterScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(g,"base64")})}catch(m){i.warn({err:m},"Failed to take after screenshot")}if(s){let m=Fx();l.beforeSnapshot=m,n.attachBeforeScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=MH(c,u);d&&Object.keys(d).length>0&&i.info({diffs:mi(d)},"Updated cache")}return l}import{streamText as zH}from"ai";import{randomUUID as HH}from"crypto";var Wu=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:t,logger:n,callbacks:o,rootStep:i}=e;this.controller=t,this.logger=n,this.callbacks=o,this.rootStep=i}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let t=this.subStepIndex++,n=await this.callbacks.executeStep(e,t);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as FH,stepCountIs as BH}from"ai";var ah="get_emulator_state",ju="finish";import zx from"dedent";var IH=zx`
4349
+ Raw: ${JSON.stringify(t)}`)}return n.filter(o=>{if(!o.webviewName)return!0;if(!o.info||!o.pages)return!1;let i=o.pages.filter(a=>{if(!a.title)return!1;let s=a.url;return!(!s||s===""||s.startsWith("about:blank")||s.startsWith("chrome-error:"))});return i?!!i:(this.logger.debug({context:o},"Webview has no qualified pages, skipping"),!1)})},{name:"Get available contexts",signal:this.aborter.controller?.signal})}async createBrowserController({context:e}){return await ee().startSection("Run remote Chrome initialization",async(n,o)=>{let i={};o.attributes.timings=i;let a=await ws.fromExistingContext({context:e,logger:this.logger,timingRecorder:i,userBrowserSettings:{visualActions:!0,disableBrowserMonitoring:!0,autoExpandIframes:!0},properties:{isNewHeadless:!0,allowedA11yIgnoreReasonsOverride:[],isAndroid:!0},storage:this.fixtures.storage,enricher:this.fixtures.browserEnricher});return new Pu({browser:a,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new Yl})})}async connectPlaywrightToWebview(e,t){return ee().startAsyncSection("Connect headless browser client to webview",async()=>{for(let o=0;o<2;o++)try{return await this.connectPlaywrightToWebviewHelper(e,t)}catch(i){this.logger.warn({err:i},"Failed to connect Playwright to webview, retrying...")}},{signal:this.aborter.controller?.signal,timeoutMs:8e3,timeoutMsg:"Timed out connecting Playwright to the webview"})}extractSocketNameFromWebview(e,t){if("_socketName"in e&&typeof e._socketName=="string")return e._socketName;if("_data"in e&&e._data?.socketName)return e._data.socketName;t.warn({pkg:e.pkg()},"Could not extract socket name from webview")}async connectPlaywrightToWebviewHelper(e,t){let n=this.device.webViews(),o=n.find(l=>!(l.pkg()!==e||this.extractSocketNameFromWebview(l,this.logger)!==t));if(!o){let l=`Could not find webview for ${e} with socket name ${t}`;throw this.logger.warn({webviews:n.map(u=>({pkg:u.pkg,name:this.extractSocketNameFromWebview(u,this.logger)}))},l),new Error(l)}let i=await o.page(),a=i.url();if(a===""||a.startsWith("about:blank")||a.startsWith("chrome-error:")){let l=`Webview ${e} with socket ${t} is not a valid webview`;this.logger.warn({pageUrl:a},l);return}let s=i.context();return await this.createBrowserController({context:s})}async connectPlaywrightToChrome(e){return await ee().startAsyncSpan("EMULATOR_READ_STATE",async()=>this.connectPlaywrightToChromeHelper(e),{name:"Connect headless browser client to Chrome",signal:this.aborter.controller?.signal})}async connectPlaywrightToChromeHelper(e){let{contextId:t,socketName:n}=e;try{this.logger.info({contextId:t,socketName:n},"Connecting to Chrome webview");let o;e.forwardedPort?(o=`http://127.0.0.1:${e.forwardedPort}`,this.logger.info({contextId:t,endpoint:o,socketName:n},"Using existing forwarded port")):(o=`http://127.0.0.1:${await this.forwardDevToolsSocket(e.socketName)}`,this.logger.info({contextId:t,endpoint:o,socketName:n},`Forwarding DevTools socket for ${e.socketName}`)),this.logger.info({endpoint:o,socketName:n},"Connecting to CDP endpoint");let i=await hH.connectOverCDP({endpointURL:o,timeout:8e3}),a=i.contexts()[0];if(!a){this.logger.warn("No browser context available after CDP connection"),await i.close();return}return this.createBrowserController({context:a})}catch(o){this.logger.warn({err:o},`Error connecting Playwright to webview ${e.contextId}, continuing...`);return}}async disconnectPlaywrightFromWebview(e){try{e.browserController&&(this.logger.info(`Disconnecting Playwright from webview: ${e.contextId}`),await e.browserController.browser.cleanup(),e.browserController=void 0),e.forwardedPort&&await this.removeDevToolsForwarding(e.forwardedPort)}catch(t){this.logger.error({err:t},`Error disconnecting Playwright from webview ${e.contextId}:`)}}async forwardDevToolsSocket(e){this.logger.info("Setting up port forwarding for DevTools");let t=1e4+Math.floor(Math.random()*1e4),n=this.driver.capabilities,o=n.deviceUDID||n.udid||n["appium:udid"]||n["appium:deviceUDID"];this.logger.info({deviceId:o},`Device ID from capabilities: ${o||"not found"}`);let i=e&&e.trim().length>0?`localabstract:${e}`:"localabstract:chrome_devtools_remote";return await this.executeRawADBCommand(`forward tcp:${t} ${i}`),this.logger.info(`Successfully forwarded DevTools socket to port ${t}`),t}async removeDevToolsForwarding(e){await this.executeRawADBCommand(`forward --remove tcp:${e}`),this.logger.info("Successfully removed port forwarding")}throwIfAborted(){this.aborter.controller?.signal.throwIfAborted()}};var Nx=5,Dx=.8,fH=1,Fu=class extends zi{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??Dx,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer(e,t){let n=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:n.width,height:n.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,n)};let o=ee(),i=e.target.description;if(t){let c=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:c},"Got container bounds from native cache"),{bounds:c,cache:t}}let{resolvedTarget:a}=await this.findElement({description:i,tracer:o});if(a.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${i}" resolved to a webview element. Custom containers must be native elements.`);let s=this.getBoundsFromNativeCache(a);return this.logger.info({bounds:s},"Got container bounds from AI"),{bounds:s,cache:a}}async tryUseCachedScrollPosition(e,t){let n=e.cache?.target;return n?n.type==="WEBVIEW"?this.tryUseWebviewCache(e,t):n.scrollDetails?this.tryUseNativeScrollCache(e,t,n):null:null}async tryUseWebviewCache(e,t){let n=ee();try{let{thoughts:o}=await this.wrapTargetingAction({command:e,tracer:n,description:t,action:async i=>{if(i.type==="NATIVE")throw new Error("Expected WEBVIEW target but got NATIVE");await this.scrollWebviewTargetIntoView(i)}});return{success:!0,message:o}}catch(o){return this.logger.warn({err:o},"Failed to use webview cache, falling back to search"),null}}async tryUseNativeScrollCache(e,t,n){let o=n.scrollDetails,i=ee(),a=e.scrollStepPercent??Dx,s=o.scrollableElement.type==="CUSTOM"?o.scrollableElement.cache:void 0;await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:o.direction,scrollStepPercent:a});try{let l=await this.tryFindElement({cmd:e,description:t,tracer:i,scrollDetails:o,useAIIfCacheFails:!1});if(l)return l;this.logger.info("Element not found at cached position, undoing scroll")}catch(l){this.logger.warn({err:l},"Error finding element at cached position, will undo scroll")}let c=o.direction==="down"?"up":"down";return this.logger.info({pixelDelta:o.pixelDelta,originalDirection:o.direction,undoDirection:c,scrollableElementType:o.scrollableElement.type},"Undoing scroll"),await this.scrollByPixelDelta({pixelDelta:o.pixelDelta,scrollableElement:o.scrollableElement,containerCache:s,direction:c,scrollStepPercent:a}),null}async tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:o,useAIIfCacheFails:i=!0}){let a,s,c=e.cache?.target;if(c&&c.resolvedDescription===t&&!e.disableCache){await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"});let u=await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0});try{let{resolvedTarget:d}=await Nu({target:c,domState:u,stateManager:this.stateManager,logger:this.logger});a=d,s="Successfully resolved scroll to target with cache.",this.logger.info("Successfully resolved scroll to target from cache")}catch(d){this.logger.warn({err:d},"Failed to resolve target from cache")}}if(!a&&!i)return null;if(!a)try{let u=await this.findElement({description:t,tracer:n});a=u.resolvedTarget,s=u.thoughts}catch(u){if(this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u instanceof An)return null;throw u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),Lo({command:e,updatedCache:Du(a),updatedWithAI:!0}),{success:!0,message:s}):(Lo({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0}),{success:!0,message:s})}async searchForElement(e,t,n){let o=ee(),i=await this.resolveContainer(e.scrollableElement);return this.scrollAndSearch(e,t,o,n,i)}async scrollAndSearch(e,t,n,o,i){let a=0,s=i.bounds,c=s.height*o,l=!0;for(let u=0;u<Nx;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),m=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(m)return m;if(!l)throw new Error(`ActionFailureError: Could not find element "${t}" after scrolling to the end`);this.logger.debug({attempt:u,cumulativePixelDelta:a},"Element not found, scrolling further");let p=SH(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:p}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${Nx} scroll attempts`)}buildScrollDetails(e,t,n){return e.scrollableElement.type==="CUSTOM"?{pixelDelta:t,scrollableElement:{type:"CUSTOM",target:e.scrollableElement.target,cache:n},direction:e.direction}:e.scrollableElement.type==="CUSTOM_COORDINATES"?{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}:{pixelDelta:t,scrollableElement:e.scrollableElement,direction:e.direction}}async scrollWebviewTargetIntoView(e){let{controller:t,resolution:n}=e;await t.browser.hover({locator:n.locator})}async scrollByPage({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o}){return ee().startAsyncSpan("EMULATOR_INTERACTION",async a=>(a.attributes.containerBounds=t,a.attributes.direction=e,this.executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,rawCoordinates:o})),{name:`Scroll ${e} by one page`})}async scrollByPixelDelta({pixelDelta:e,scrollableElement:t,containerCache:n,direction:o,scrollStepPercent:i}){if(e===0)return;let a=ee(),s,c,l;if(t.type==="CUSTOM_COORDINATES")s=t.startX,c=t.startY,l=t.deltaPixels;else{let m=(await this.resolveContainer(t,n)).bounds,p=m.height*i,g=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:p});s=g.startX,c=g.startY,l=g.actualDelta}let u=Math.ceil(Math.abs(e)/l);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:s,startY:c,maxScrollPerStep:l,numScrolls:u},"scrollByPixelDelta calculated parameters"),await a.startAsyncSpan("EMULATOR_INTERACTION",async d=>{d.attributes.pixelDelta=e,d.attributes.numScrolls=u,d.attributes.maxScrollPerStep=l,d.attributes.startX=s,d.attributes.startY=c;let m=0;for(let p=0;p<u;p++){this.throwIfAborted();let g=Math.abs(e)-m,h=Math.min(l,g);await this.performRawSwipe({startX:s,startY:c,deltaPixels:h,direction:this.invertDirection(o)}),m+=h}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=fH,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let p=t.height*n,g=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:p});s=g.startX,c=g.startY,l=g.actualDelta}await this.performRawSwipe({startX:s,startY:c,deltaPixels:l,direction:this.invertDirection(e)});let u=await this.stateManager.getRawScreenshotBase64(),d=ah(a,u),m=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:m,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),m}};function SH(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as yH}from"crypto";import Ps from"fs";import{tmpdir as bH}from"os";import Hi from"path";var Bu=class extends Je{async doInstallApk(e){return await this.installApkFromUri(e.uri),{success:!0,message:"Installed APK."}}async installApkFromUri(e){let t=await this.resolveUriToLocalApk(e);try{await this.stateManager.executeRawADBCommand(`install ${Hi.resolve(t.localPath)}`),this.logger.info({uri:e,localPath:t.localPath},"Installed APK on device")}finally{t.cleanup()}}async resolveUriToLocalApk(e){try{let t=new URL(e);if(t.protocol==="file:"){let n=t.href.slice(7),o;if(Ps.existsSync(n))o=n;else if(Ps.existsSync(Hi.join("/",n)))o=Hi.join("/",n);else throw new Error(`APK not found at path: ${n}`);return this.assertFileExists(o),{localPath:o,cleanup:()=>{}}}if(t.protocol==="http:"||t.protocol==="https:"){let n=await this.fetchWithTimeout(t);if(!n.ok)throw new Error(`Failed to download APK from ${e} (status ${n.status})`);let o=await n.arrayBuffer(),i=Buffer.from(o),a=await this.writeBufferToTempFile(i,t.pathname);return{localPath:a,cleanup:()=>{try{Ps.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new Error(`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=Hi.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{Ps.accessSync(e)}catch{throw new Error(`APK not found at path: ${e}`)}}async fetchWithTimeout(e){let t=AbortSignal.timeout(9e4);return await fetch(e,{signal:t})}async writeBufferToTempFile(e,t){let n=Hi.extname(t)||".apk",o=Hi.join(bH(),`momentic-apk-${yH()}${n}`);return Ps.writeFileSync(o,e),o}};import{existsSync as EH,readFileSync as TH}from"fs";import vH from"zod";var AH=vH.string().url();async function kx(r){if(AH.safeParse(r).success){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4),n;try{n=await fetch(r,{signal:e.signal})}catch(i){throw new Error(`Fetch failed or timed out for URL: ${r}`,{cause:i})}finally{clearTimeout(t)}if(!n.ok)throw new Error(`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!EH(r))throw new Error(`File does not exist at path: ${r}`);return TH(r).toString("base64")}var zu=class extends Je{async dragNative(e,t,n){let{left:o,top:i,width:a,height:s}=this.getBoundsFromNativeCache(e),{left:c,top:l,width:u,height:d}=this.getBoundsFromNativeCache(t),m=o+a/2,p=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,E=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:m,y:p},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:E,x:g,y:h},{type:"pointerUp",button:0}]}]),await this.driver.releaseActions()}async dragWebview(e,t,n){let{controller:o}=e;if(e.controller!==t.controller)throw new Error("ActionFailureError: Cannot drag and drop between different webviews");let i=n?.hoverDuration?n.hoverDuration/1e3:void 0,a;n?.dragDuration&&(a=Math.max(1,Math.floor(n.dragDuration/200))),await o.browser.dragAndDrop(e.resolution.locator,t.resolution.locator,{hoverSeconds:i,steps:a})}async executeDragAndDrop({command:e}){let t=ee();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new Error("ActionFailureError: Drag and drop only supports description targets for now");let n=e.fromTarget.description,{result:o,thoughts:i}=await this.wrapTargetingAction({command:e,tracer:t,description:n,cacheKey:"cache",targetName:"fromTarget",action:async l=>l}),a=e.toTarget.description,{result:s,thoughts:c}=await this.wrapTargetingAction({command:e,tracer:t,description:a,cacheKey:"cache",targetName:"toTarget",action:async l=>l});if(o.type!==s.type)throw new Error(`ActionFailureError: Drag and drop targets must be in the same context (both native or both webview). Found: From=${o.type}, To=${s.type}`);return await t.startAsyncSpan("EMULATOR_INTERACTION",async l=>{o.type==="NATIVE"&&s.type==="NATIVE"?await this.dragNative(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}):o.type==="WEBVIEW"&&s.type==="WEBVIEW"&&(l.withinWebview=!0,await this.dragWebview(o,s,{hoverDuration:e.hoverDuration,dragDuration:e.dragDuration}))},{name:"Drag and drop"}),{success:!0,message:`${i}
4350
+ ${c}`}}};import{cloneDeep as Ux}from"lodash-es";var Hu=class{async getTextContent(e){return await e.textContent()??""}async getAttribute(e,t){return await e.getAttribute(t,{timeout:3e3})??""}async getTagName(e){return await e.evaluate(t=>t.tagName)}async isEditable(e){return await e.isEditable({timeout:Lt*1e3})}async isEnabled(e){return await e.isEnabled({timeout:Lt*1e3})}async isFocused(e){return await e.evaluate(t=>t===document.activeElement)}async getStyleProperty(e,t){return await e.evaluate((n,o)=>window.getComputedStyle(n).getPropertyValue(o),t)}},Gu=class{async getTextContent(e){return xs(e)}async getAttribute(e,t){return e.getAttribute(t)??""}async getTagName(e){return e.tagName}async isEditable(e){throw new Error("Cannot perform editable check on native element")}async isEnabled(e){return e.getAttribute("enabled")==="true"}async isFocused(e){return e.getAttribute("focused")==="true"}async getStyleProperty(e,t){throw new Error("Cannot perform computed style checks on native element")}};var wH=5e3,Vu=class extends Je{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??Lt)*1e3,o=n+1e4,i,a=0,s=500,c=Ux(e.cache);if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");for(;a-t<n;){if(Date.now()-t>o){this.logger.warn("Exceeded max system timeout for element check, exiting...");break}if(this.throwIfAborted(),i=await this.executeElementCheckHelper(e),a=Date.now(),!i.success)e.cache=c,c=Ux(c),await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),wH);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});return l.success||c&&e.cache&&(e.cache=Ss({originalCache:c,newCache:e.cache,targetGetter:u=>u.target}).result),l}async executeElementCheckHelper(e,t){let n=ee();if(e.target.type!=="description")throw new Error("UserConfigurationError: x/y targets are not supported for the Element Check step");let o=Yc(e.assertion);try{return(await this.wrapTargetingAction({...t??{},command:e,tracer:n,action:async a=>"type"in a&&a.type==="NATIVE"?await this.executeNativeElementCheck(e,a):await this.executeWebviewElementCheck(e,a),description:e.target.description,skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).result}catch(i){return o&&(i instanceof An||i instanceof vn)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=ee(),{assertion:o}=e,i=t.resolvedNode;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{let s=await this.executeElementAssertion({assertion:o,element:i,elementPropertyAccessors:new Gu,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=ee(),o=t.resolution.locator,i=e.assertion;return await n.startAsyncSpan("ELEMENT_ASSERTION",async a=>{await t.controller.browser.highlight(o);let s=await this.executeElementAssertion({assertion:i,element:o,elementPropertyAccessors:new Hu,span:a});return a.result=s,s},{name:"Webview element check"})}async executeElementAssertion({assertion:e,element:t,elementPropertyAccessors:n,span:o}){switch(e.type){case"ELEMENT_CONTENT":{let i=await n.getTextContent(t)??"";return o.attributes.elementTextContent=ft(i,500,!0),jr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${gr(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=ft(await t.evaluate(a=>a.cloneNode(!1).outerHTML),500,!0));let i;try{i=await n.getAttribute(t,e.attr)}catch(a){return{success:!1,message:`The element does not have an attribute named ${e.attr}: ${a}`}}if(!jr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=gr(e);return{success:!1,message:`The attribute ${e.attr} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}case"ELEMENT_EXISTENCE":{let i=!1;switch(e.condition){case"EDITABLE":i=await n.isEditable(t);break;case"VISIBLE":case"EXISTS":i=!0;break;case"ENABLED":{i=await n.isEnabled(t);break}case"FOCUSED":i=await n.isFocused(t);break;default:throw e.condition,new Error("Unrecognized element condition type")}return i=e.negated?!i:i,i?{success:!0}:{success:!1,message:`The element ${gr(e)}`}}case"ELEMENT_NAME":{let i=await n.getTagName(t);return jr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})?{success:!0}:{success:!1,message:`The element tag name ${gr(e)} '${e.value}': ${i}`}}case"ELEMENT_STYLE":{let i=await n.getStyleProperty(t,e.property);if(!jr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=gr(e);return{success:!1,message:`The style property ${e.property} ${a}${e.operation==="EXISTS"?"":` '${e.value}': ${i}`}`}}return{success:!0}}default:throw new Error("Unrecognized element assertion type")}}};var CH=5e3,Wu=class extends Je{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??Lt)*1e3,i=o+1e4,a=0,s=500;for(;a-n<o;){if(Date.now()-n>i){this.logger.warn("Exceeded max system timeout for screen check, exiting...");break}this.throwIfAborted();let c=await this.executeScreenCheckHelper(e);if(a=Date.now(),!c.success)await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),CH);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await ee().startAsyncSection("Execute screen check",async(n,o)=>{let[i,a]=await Promise.all([this.executeNativeScreenCheckHelper({span:o,command:e}),this.executeWebviewScreenCheckHelper(e)]);return a?e.assertion.negated?i.success&&a.success?i:i.success?a:i:i.success?i:a:i})}async executeNativeScreenCheckHelper({span:e,command:t}){let{assertion:n}=t;switch(n.type){case"CONTENT":try{let o=(await this.stateManager.getDomState({skipFetchingFullWebviewContent:!0,removeWebviewContent:!0})).graph.document.documentElement?.outerHTML;if(!o)throw new Error("Failed to get screen HTML");let i=o.includes(n.value)===!n.negated;return o.length>1e4&&(o=o.slice(0,1e4)+"...TRUNCATED"),i?{success:!0}:(e.attributes.screenContent=o,{success:!1,message:`The screen ${ig(n)}.`})}catch(o){return{success:!1,message:`Failed to evaluate screen content assertion: ${o instanceof Error?o.message:`${o}`}`}}default:return n.type,{success:!1,message:`Unsupported screen check assertion type: ${n.type}`}}}async executeWebviewScreenCheckHelper(e){let t=await this.stateManager.getActiveWebview();if(!t||!t.browserController)return;let n=t.browserController.browser;return await _u({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var ju=class extends Je{async doUninstallApk(e){return await this.uninstallApkPackage(e.packageName),{success:!0,message:"Uninstalled APK."}}async uninstallApkPackage(e){let t=e.replace(/^package:/,""),n=await this.stateManager.executeRawADBCommand(`shell pm list packages | grep -E "^package:${t}$" || true`);if(!n||n.length===0)throw new Error(`Package ${t} not found`);if(n.split(`
4351
+ `).filter(i=>!!i).length>1)throw new Error(`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new Error(`Failed to uninstall package ${t}: ${i}`)}}};var Gi=class r extends Je{options;appsWithGrantedPermissions=new Set;adbPort;constructor(e){super(e),this.options=e.options??{},this.adbPort=e.adbPort}static async init({driver:e,generator:t,logger:n,fixtures:o,orgId:i,options:a,abortController:s,adbPort:c,limbarClient:l,playwrightDevice:u,aiSettings:d}){let m={controller:s},p=await Uu.init({driver:e,logger:n,fixtures:o,orgId:i,limbarClient:l,options:a?.emulator??{},aborter:m,adbPort:c,playwrightDevice:u}),g=new r({driver:e,generator:t,stateManager:p,logger:n,fixtures:o,options:a,aborter:m,orgId:i,aiSettings:d,adbPort:c});return await g.initializeSettings(),g}async installApp(e){await this.stateManager.executeRawADBCommand(`install ${xH.resolve(e)}`)}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await lu({obj:e.command,context:this.fixtures.testContext,bannedKeys:t,orgId:this.orgId,logger:this.logger,signal:this.abortSignal,localTools:this.fixtures.localCodeEvalTools})}catch(o){throw this.throwIfAborted(),new Error(`ActionFailureError: Failed to substitute template strings in command: ${o.message}`,{cause:o})}try{return await this.executeCommandHelper(e)}catch(o){throw o.name!=="AbortError"&&this.logger.error({err:o},"Error thrown in action controller"),o}finally{cu(e.command,n)}}async executeCommandHelper({command:e}){let t=ee();switch(e.type){case"TAP":return new Bi(this.constructPerformerParams()).executeTap({command:e});case"TYPE":return await new ku(this.constructPerformerParams()).doType(e);case"AI_CHECK":{let n=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=tu(i),s=Date.now(),c=0,l,u=!1,d;for(;c<o&&!u;){this.throwIfAborted(),u||l&&l-s>=i&&(u=!0),c!==0&&await j(a,this.abortSignal),l=Date.now();try{let m="",p="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{m=(await this.stateManager.getDomState({})).graph.xml,p=await this.stateManager.getCurrentScreenshotPngString()},{name:"Get emulator state"});let g=await t.startAsyncSpan("AI_ASSERTION_CALL",async h=>{let f=await this.generator.evaluateMobileAssertion({assertion:e.assertion,screenXml:m,screenshot:p,memory:n?e.cache?.memory:void 0},{logger:this.logger,loggerTags:be(this.logger),agentConfigVersion:this.aiSettings.agentConfig?.["mobile-assertion"],useMemory:n});return h.result={thoughts:f.thoughts,result:f.result},f});if(n&&g.updatedMemory){let h={type:"GCS_TRACES",traces:g.updatedMemory};e.cache={...e.cache??{},memory:h}}if(g.result)return{success:g.result,message:g.thoughts};{let h=`AssertionFailureError: ${g.thoughts}`;d=new Error(h)}}catch(m){this.throwIfAborted(),this.logger.info({err:m},`AI check assert attempt ${c} failed, retrying...`),d=m instanceof Error?m:new Error(`${m}`)}finally{c++}}return{success:!1,message:d?.message}}case"SWIPE":return new zi(this.constructPerformerParams()).executeSwipe(e);case"SCREEN_CHECK":return new Wu(this.constructPerformerParams()).executeScreenCheck(e);case"ELEMENT_CHECK":return await new Vu(this.constructPerformerParams()).executeElementCheck(e);case"DRAG_AND_DROP":return await new zu(this.constructPerformerParams()).executeDragAndDrop({command:e});case"SCROLL_TO":return new Fu(this.constructPerformerParams()).executeScrollTo(e);case"JAVASCRIPT":{let n=await qr({orgId:this.orgId,code:e.code,fragment:!1,context:this.fixtures.testContext,timeoutMs:e.timeout?e.timeout*1e3:void 0,logger:this.logger,localTools:this.fixtures.localCodeEvalTools,signal:this.abortSignal});try{JSON.stringify(n)}catch(o){throw new Error(`UserConfigurationError: Return value is not serializable: ${o instanceof Error?o.message:`${o}`}`)}return{success:!0,output:n}}case"REQUEST":{let n;try{n=new URL(e.url).hostname}catch(l){throw new Error(`UserConfigurationError: Invalid URL: ${l}`)}let o=new MH,i=RH(fetch,o),a=Date.now(),s=await Mu({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),c=kl(o,n);return{output:Zs.parse({...s,cookies:c}),success:!0,message:`Successfully executed request in ${Date.now()-a}ms`}}case"OPEN_NOTIFICATION_DRAWER":return await new jn(this.constructPerformerParams()).doPress({keycode:83}),{success:!0};case"OPEN_APP":{let n=e.activityName;if(!n){let i=["resolve-activity","--brief","-a","android.intent.action.MAIN","-c","android.intent.category.LAUNCHER",e.packageName],a=await z(this.driver.execute("mobile: shell",{command:"pm",args:i}),{signal:this.abortSignal,milliseconds:1e4});if(typeof a!="string")throw new Error(`Could not find main activity name for package ${e.packageName}. Unexpected output: ${a}`);if(a.includes("No activity found"))throw new Error(`No activity found for package ${e.packageName}.`);if(n=a.trim().split(`
4352
+ `).pop()?.replace(/^.*\//,""),!n)throw new Error(`Could not parse main activity name for package ${e.packageName}. Raw output: ${a}`)}if(this.options.emulator?.autoGrantPermissions&&!this.appsWithGrantedPermissions.has(e.packageName)){let i={permissions:"all",appPackage:e.packageName,action:"grant"};await this.driver.executeScript("mobile: changePermissions",[i]),this.appsWithGrantedPermissions.add(e.packageName)}let o=["start"];if(e.intentExtras)try{let i=JSON.parse(e.intentExtras);for(let[a,s]of Object.entries(i))o.push("-e",a,typeof s=="string"?s:JSON.stringify(s))}catch(i){throw new Error(`UserConfigurationError: Invalid intent extras does not parse as valid JSON: ${i instanceof Error?i.message:`${i}`}`)}return o.push("-n",`${e.packageName}/${n}`),await this.driver.execute("mobile: shell",{command:"am",args:o}),await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.abortSignal,reason:"Waiting for stability after app launch"}),{success:!0}}case"PRESS":{let n=new jn(this.constructPerformerParams());switch(e.key){case"HOME":await n.doPress({keycode:3});break;case"BACK":await n.doPress({keycode:4});break;case"APP_SWITCHER":await n.doPress({keycode:187});break;case"POWER":await n.doPress({keycode:26});break;case"SEARCH":await n.doPress({keycode:84});break;case"VOLUME_UP":await n.doPress({keycode:24});break;case"VOLUME_DOWN":await n.doPress({keycode:25});break;case"VOLUME_MUTE":await n.doPress({keycode:164});break}return{success:!0}}case"PRESS_KEYBOARD":{let n=new jn(this.constructPerformerParams()),o=i=>n.doPress({keycode:i});switch(e.key){case"CLOSE_KEYBOARD":{let i=Date.now();for(;Date.now()-i<5e3&&(await this.driver.hideKeyboard(),!!await this.driver.isKeyboardShown()););break}case"ENTER":await o(66);break;case"BACKSPACE":await o(67);break;default:{let i=e}}return{success:!0}}case"WAIT":return await j(e.timeoutSecs*1e3,this.aborter.controller?.signal),{success:!0};case"INSTALL_APP":return new Bu(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new ju(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await kx(e.file);return await this.driver.pushFile(e.storageLocation,n),await this.driver.execute("mobile: shell",{command:"am",args:["broadcast","-a","android.intent.action.MEDIA_SCANNER_SCAN_FILE","-d",`file://${e.storageLocation}`]}),{success:!0}}case"TOGGLE_SETTINGS":{switch(e.settingsType){case"AIRPLANE_MODE":await this.driver.toggleAirplaneMode();break;case"DATA":await this.driver.toggleData();break;case"WIFI":await this.driver.toggleWiFi();break;case"LOCATION":await this.driver.toggleLocationServices();break;default:throw e.settingsType,new Error(`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ADB":{let n=await this.driver.execute(e.command,JSON.parse(e.jsonArgs??"{}"));return this.logger.info({output:n},"ADB command executed successfully"),{success:!0,output:n,message:"ADB command executed successfully"}}case"KILL_APP":{let n=await this.stateManager.getCurrentPackage();if(!n)throw new Error("No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await fx({packageName:n,driver:this.driver,abortSignal:this.abortSignal,logger:this.logger})}catch(o){this.throwIfAborted(),this.logger.warn({err:o,packageName:n},"Failed to remove package from recents, continuing...")}return{success:!0}}case"STATE":{await this.stateManager.refreshWebviews();let n=await this.stateManager.getDomState(),o=await this.stateManager.getContexts(),i={xml:n.graph.xml,contexts:o};return this.logger.info({result:i},"State debug command output"),{output:i,success:!0}}default:{let n=e;return{success:!0}}}}async initializeSettings(){let{latitude:e,longitude:t}=this.options?.emulator?.geolocation??fl;await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_COARSE_LOCATION"]}),await this.driver.execute("mobile: shell",{command:"pm",args:["grant","io.appium.settings","android.permission.ACCESS_FINE_LOCATION"]}),await this.driver.setGeoLocation({latitude:e,longitude:t})}async getScreenshotBase64(){return this.stateManager.getRawScreenshotBase64()}async getScreenshotPngString(){return this.stateManager.getCurrentScreenshotPngString()}async getA11yTree(){return(await this.stateManager.getDomState({})).graph.xml}async executeRawADBCommand(e){return this.stateManager.executeRawADBCommand(e)}async getViewportBounds(){return this.stateManager.getViewportBounds()}async waitForScreenshotStability(e){return this.stateManager.waitForScreenshotStability({timeoutMs:e.timeoutMs??5e3,reason:e.reason,signal:this.aborter.controller?.signal})}resetAbortController(e){this.aborter.controller=e??new AbortController}isAborted(){return this.aborter.controller?.signal.aborted}abort(){this.aborter.controller?.abort()}async cleanup(){await this.stateManager.cleanupWebviews()}get abortSignal(){return this.aborter.controller?.signal}get context(){return this.fixtures.testContext}get localCodeEvalTools(){return this.fixtures.localCodeEvalTools}};async function Fx({socket:r,logger:e,androidDriverFactory:t,getOrgId:n,mobileGeneratorFactory:o,browserGeneratorFactory:i,browserEnricherFactory:a,storageFactory:s,localToolsFactory:c,globalStateManager:l,settingsFactory:u}){let d=r.id,m=r.handshake.query?.testMetadata,p=r.handshake.query?.fileName,g=p?_H.basename(p,".test.yaml"):"",h=Ar.parse(JSON.parse(m??"")),f=h.id,E=h.settings?.defaultChannel,b=h.settings?.defaultTag,C=h.settings?.defaultApkFilePath?.trim(),R=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:R});let v=await u(R,e),M={...v.emulator,...h.settings?.emulator},A;if(M.region==="local"){if(l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");if(!M.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is local");A={avdId:M.localEmulatorSettings.avdId,apkToInstall:E?{channel:E,tag:b}:void 0,apkFilePath:C||void 0}}else A={region:M.region,apkToInstall:E?{channel:E,tag:b}:void 0,osVersion:M.remoteEmulatorSettings?.androidVersion};let I=Date.now(),{driver:k,cleanup:W,emulatorName:oe,adbPort:Te,limbarClient:At,limbarToken:G,limbarUrl:$,playwrightDevice:he}=await t({socket:r,logger:e,creationOpts:A}),se=await su({driver:k,onLogs:zo=>{r.emit("logcatLogs",zo)}});e.info({adbPort:Te,apkChannel:E,apkTag:b,duration:Date.now()-I,emulatorName:oe},"Android emulator session initiated"),e=e.child({emulator:oe});let Ce=await o(R,e),Me=await i(R,e),Jt=await a(R,e),qt=await s(R),_e=c?await c(R):void 0,$e={};h.settings?.defaultEnv&&($e=(await qt.fetchEnvironment(h.settings?.defaultEnv,e))?.variables??{});let lt=new ui({variablesFromEnvironment:$e,envName:h.settings?.defaultEnv,testName:g}),Pt=await Gi.init({driver:k,generator:Ce,logger:e,limbarClient:At,playwrightDevice:he,aiSettings:{...v.ai,useMemory:v.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:M},fixtures:{storage:qt,browserEnricher:Jt,browserGenerator:Me,localCodeEvalTools:_e,testContext:lt},orgId:R,adbPort:Te,abortController:new AbortController}),Gt=await Pt.getViewportBounds();if(!r.connected)throw await se(),await W(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Fo=PH({socket:r,testContext:lt}),Bo=async()=>{clearInterval(Fo);try{await se(),await W(),await Pt.cleanup()}catch(zo){e.warn({err:zo},"Failed to clean up emulator in socket server")}};return l.registerSession(d,{controller:Pt,cleanup:Bo,emulatorName:oe,local:M.region==="local"}),r.emit("session",{testId:f,sessionId:d,limbarUrl:$,limbarToken:G,viewportBounds:Gt}),{sessionId:d,testId:f,orgId:R,emulatorName:oe,logger:e,testName:g}}function PH({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}async function Bx({socket:r,logger:e,globalStateManager:t}){await t.removeSession(r.id,e)}var IH=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},zx={event:"cancel",createHandler:IH};var OH=({logger:r,globalStateManager:e,socket:t})=>async(n,o)=>{let i=e.getSession(t.id);if(!i){o({err:"No active Android session found"});return}try{let s=await i.controller.getA11yTree();o({a11yTree:s})}catch(a){r.error({err:a},"Error fetching a11y tree from the session controller"),o({err:a.message})}},Hx={event:"fetchA11yTree",createHandler:OH};import{diff as QH}from"deep-object-diff";import{cloneDeep as ZH}from"lodash-es";function Gx(r,e,t=1e4,n=5e3){let o=0;async function i(){try{let s=await z(r.driver.execute("mobile: shell",{command:"echo",args:["ping"]}).catch(c=>{throw c}),{milliseconds:n});if(typeof s=="string"&&s.trim()==="ping")o>0&&e.info("Driver heartbeat restored"),o=0;else throw new Error(`Unexpected heartbeat output: ${s}`)}catch(s){o++;let c=s instanceof Error?s.message:`${s}`;e.error({attempt:o,error:c},"Driver heartbeat failed"),o>=3&&e.error("Driver appears unresponsive \u2014 possible ADB tunnel/emulator failure")}}let a=setInterval(()=>{i()},t);return i(),a}async function Vx(r){let e=Date.now(),t=r.fixtures.controller;try{return await LH(r)}catch(n){let o=t.isAborted()||n instanceof DOMException&&n.name==="AbortError";return{...r.moduleParams.step,steps:[],type:"MOBILE_MODULE_STEP",startTime:e,endTime:Date.now(),status:o?"CANCELLED":"FAILED",message:o?"Step cancelled.":`${n}`}}}async function LH({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await NH({step:n,params:e}),s={};Object.entries(a).forEach(([m,p])=>{s[m]=JSON.stringify(p)});let c={...n,type:"MOBILE_MODULE_STEP",inputs:s,startTime:t,steps:[],endTime:Date.now(),status:"SUCCESS"},l=await o.startSubSteps(),{status:u,results:d}=await i({...e,listParams:{steps:n.steps,containerName:`module ('${n.name}')`,tracer:l}});return c.steps=d,c.status=u,c.endTime=Date.now(),Jw({result:c,...Xw(d)}),c}async function NH({step:r,params:e}){let t={},{logger:n,controller:o}=e.fixtures;for(let i of r.parameters?.parameterNames??[]){let a=r.inputs?.[i]??r.parameters?.defaultParameters?.[i];if(!a){n.warn({k:i},"No value found for parameter in module");continue}t[i]=await qr({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as Wx}from"crypto";import{diff as DH}from"deep-object-diff";import{cloneDeep as kH}from"lodash-es";async function jx({fixtures:r,step:e,inputs:t,stepTracer:n}){let o=Date.now(),{logger:i,controller:a}=r,s;if(!t.interactive)try{s=await a.getScreenshotBase64()}catch(u){i.warn({err:u},"Failed to take before screenshot")}let c="cache"in e.command?kH(e.command.cache??{}):{},l={...e,status:"SUCCESS",startTime:o,endTime:Date.now()};try{let u=await a.executeCommand({command:e.command});l={...e,status:u.success?"SUCCESS":"FAILED",message:u.message,startTime:o,endTime:Date.now(),data:u.output}}catch(u){u instanceof Error&&u.name==="AbortError"||a.isAborted()?l={...e,status:"CANCELLED",message:"Step cancelled.",startTime:o,endTime:Date.now()}:(i.error({err:u},"Failed to execute preset step"),l={...e,status:"FAILED",message:u instanceof Error?u.message:String(u),startTime:o,endTime:Date.now()})}finally{if(!t.interactive){try{let m=Wx(),p=await a.getScreenshotBase64();l.afterSnapshot=m,n.attachAfterScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(p,"base64")})}catch(m){i.warn({err:m},"Failed to take after screenshot")}if(s){let m=Wx();l.beforeSnapshot=m,n.attachBeforeScreenshot({logger:i,snapshotId:m,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=DH(c,u);d&&Object.keys(d).length>0&&i.info({diffs:mi(d)},"Updated cache")}return l}import{streamText as qH}from"ai";import{randomUUID as KH}from"crypto";var $u=class{controller;logger;rootStep;subStepIndex=0;callbacks;finalState=void 0;results=[];constructor(e){let{controller:t,logger:n,callbacks:o,rootStep:i}=e;this.controller=t,this.logger=n,this.callbacks=o,this.rootStep=i}async createAndExecuteStep(e){this.callbacks.onAiActionEvent?.({type:"SUBSTEP_CREATED",rootStep:this.rootStep,step:e});let t=this.subStepIndex++,n=await this.callbacks.executeStep(e,t);return this.results.push(n),n}recordGenericToolCall(e){this.callbacks.onAiActionEvent?.({type:"GENERIC_TOOL_CALLED",toolName:e,rootStep:this.rootStep})}};import{hasToolCall as jH,stepCountIs as $H}from"ai";var sh="get_emulator_state",qu="finish";import $x from"dedent";var FH=$x`
4353
4353
  You cannot interact with the user directly. If you feel like you need to ask the user for clarification, or you are stuck, call the "finish" tool with success=false. Never output text without calling a tool.
4354
- `,Hx=r=>zx`
4354
+ `,qx=r=>$x`
4355
4355
  <background>
4356
4356
  You are an advanced, AI agent part of an end-to-end testing platform called Momentic.
4357
4357
  Momentic uses AI agents to translate high-level natural language descriptions of user flows into browser automation for the purpose of validating application correctness.
@@ -4364,7 +4364,7 @@ The steps you generate will be fed to downstream Momentic agents that are respon
4364
4364
  The user will provide you with a high-level goal to achieve. Your task is to use the tools at your disposal to make as much progress as you can towards accomplishing the goal until one of the following is true:
4365
4365
  - You have successfully accomplished the goal, fulfilling all criteria specified by the user. In this case, end the generation cycle by calling the "finish" tool with success=true.
4366
4366
  - You have determined that the goal is impossible to accomplish or too vague to interpret confidently. In this case, end the generation cycle by calling the "finish" tool with success=false. Some examples of why a goal could be impossible: a) the goal requires a step type or capability that is not available to you; b) the user's app crashes or displays a 500 internal server error page; c) Momentic's AI agents repeatedly fail to perform the correct interaction, which could indicate an accessibility issue with the app.
4367
- ${r?"":IH}
4367
+ ${r?"":FH}
4368
4368
  </task>
4369
4369
 
4370
4370
  <values>
@@ -4382,23 +4382,23 @@ Momentic users value the following:
4382
4382
  b) There is a loading state that blocks you from proceeding with generation, and you need to wait until the state changes. In this case, you can generate an AI_CHECK step for the anticipated "done" state (e.g. "There is no loading spinner visible"). Unless explicitly specified by the user, you can generate and retry an assertion up to 3 times with a timeout up to 30 seconds each.
4383
4383
  If the max. allowed retries is exceeded, fail the generation cycle by calling "finish".
4384
4384
  </rules>
4385
- `;import{tool as NH}from"ai";import{randomUUID as DH}from"crypto";import kH from"zod";import{tool as OH}from"ai";import LH from"zod";var Gx=r=>{let e=OH({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:LH.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(ah),n.info("AI action tool called (get_emulator_state)"),sh(t)}});return{name:ah,tool:e}};async function sh(r){let e=await r.getA11yTree(),t=await r.getScreenshotBase64();return{type:"content",value:[{type:"text",text:"<emulatorXml>"},{type:"text",text:e},{type:"text",text:"</emulatorXml>"},{type:"text",text:"<screenshot>"},{type:"media",data:t,mediaType:"image/png"},{type:"text",text:"</screenshot>"}]}}var Vx=r=>({name:"create_execute_step",tool:NH({description:"Create and immediately execute a new Momentic step in the Android emulator, returning the result from the step and the state of the emulator after the step finished executing.",inputSchema:kH.object({step:Am}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=Yy(t),s={id:DH(),type:"MOBILE_PRESET_STEP",command:a},c=await n.createAndExecuteStep(s);c.status==="SUCCESS"&&await i.waitForScreenshotStability({reason:"Waiting for stability after executing AI-generated sub-step"});let l={...c,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},u=await sh(i);return{type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...u.value,{type:"text",text:"</stateAfter>"}]}}})});import{tool as UH}from"ai";import lh from"zod";var Wx=r=>{let e=UH({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:lh.object({message:lh.string(),success:lh.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:ju,tool:e}};var jx=[Vx,Gx,Wx];function $x(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of jx){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:be(e),sessionId:o}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let m=l[d];for(let g of m.content)if(!(typeof g!="object"||!("type"in g))&&!(g.type!=="tool-result"||g.output.type!=="content")&&!(g.output.value.length<3))for(let p=0;p<g.output.value.length;p++){let h=g.output.value[p];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=g.output.value[p+1];f.type==="text"?f.text="TRUNCATED DUE TO CONVERSATION LENGTH":e.warn({msg:f},"Got unexpected part when truncating emulator state message")}else{u=!0;continue}}}return c};return{model:a("claude-haiku-4-5-20251001"),tools:i,prepareStep:s,stopWhen:[BH(15),FH(ju)],system:Hx(!1)}}async function qx(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await GH(r)}catch(o){let i=t.isAborted()||o instanceof DOMException&&o.name==="AbortError";return i||n.error({err:o},"Failed to execute mobile AI action"),{...r.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":`${o}`}}}async function GH(r){let{step:e,stepTracer:t,executeMobileStepList:n}=r.aiActionParams,{controller:o,logger:i}=r.fixtures,{step:a}=r.callbacks,s=await t.startSubSteps(),c=HH(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,E)=>{let b=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new Error("InternalWebAgentError: Expected exactly one result from executeMobileStepList");return b.results[0]},m={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},g=new Wu({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:m}),p=$x({controller:o,logger:l,contextManager:g,aiActionSessionId:c}),h=zH({...p,messages:[{role:"user",content:e.text}],abortSignal:o.abortSignal});for await(let f of h.fullStream)switch(o.throwIfAborted(),f.type){case"text-delta":a?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:f.text,rootStep:m})}if(await h.response,o.throwIfAborted(),!g.finalState)throw new Error("InternalWebAgentError: The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...e,status:g.finalState.status,startTime:u,endTime:Date.now(),message:g.finalState.message,steps:g.results}}var VH=60*60*1e3;async function $u(r){let{fixtures:e,inputs:t,listParams:n,work:o}=r,{containerName:i,steps:a,tracer:s}=n,{logger:c,controller:l,usageTracker:u}=e,d=s.getParentStepIdChain(),m=[],g,p="SUCCESS",{fromStep:h,toStep:f}=t;for(let E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&h){let A=JSON.stringify(d);if(b.id===h.fromStepId&&A===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!Ww({currentStep:b,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let w=0,R=1,v=Date.now();b.retries&&b.retries>0&&(R+=b.retries);let M=[];for(;w<R&&Date.now()-v<VH;){w++;let A=`Executing step index ${E} in ${i} - ${lg(b)}`;w!==1&&(A+=` (attempt ${w})`),c.info({step:b},A);let I=Date.now(),k=await s.startStep({logger:c,step:b,attempt:w,parentStepIdChain:d});u.trackStepExecution(b);let j=await WH({step:b,stepTracer:k,params:r}),{trace:ne}=await k.finish({parentStepIdChain:d,result:j});if(j.trace=ne,A=`Finished step index ${E} in ${i} - ${lg(b)}`,w!==1&&(A+=` (attempt ${w})`),c.info({step:{id:b.id},trace:j.trace,status:j.status},A),j.status!=="SUCCESS"&&w<R){M.push(j),Date.now()-I<1e3&&await W(1e3-(Date.now()-I));continue}if(M.length>0&&(j.previousAttempts=M),m.push(j),j.status!=="SUCCESS")return p=j.status,g=j,{results:m,status:p,terminalResult:g};if(b.envKey&&l.context.setVariable(b.envKey,j.data),f){let Te=JSON.stringify(d);if(b.id===f.toStepId&&Te===JSON.stringify(f.parentStepIdChain))return o.shouldStopExecuting=!0,{results:m,status:p,terminalResult:g}}if(o.shouldStopExecuting)return{results:m,status:p,terminalResult:g};break}}return{results:m,status:p,terminalResult:g}}async function WH({step:r,stepTracer:e,params:t}){let{fixtures:n,inputs:o,callbacks:i,work:a}=t,s;switch(r.type){case"MOBILE_PRESET_STEP":{s=await Bx({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await Ux({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:$u}});break}case"MOBILE_AI_ACTION_STEP":{s=await qx({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:$u}});break}}return s}async function qu(r){let{tracer:e,containerName:t}=r,{steps:n,testMetadata:o}=r.inputs,{cacheStorage:i,logger:a,controller:s}=r.fixtures,c=a.child({testId:r.inputs.testMetadata.id,testName:r.inputs.testName});await i.resolveEntries({logger:c,testId:o.id,stepLists:{steps:n}});let l=$H(n);c.info({testMetadata:Ar.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=JE(c),m=kx(s,c);c.info({cpu:d?.cpuMetadata,platform:d?.platform},`Starting execution of ${t}`);let{status:g,results:p}=await $u({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(m),g==="SUCCESS"){let h=jH(n,l);if(h&&Object.keys(h).length>0){c.info({diffs:mi(h)},"Saving mobile step cache entries post-success");let{cachesToSave:f}=await jr({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:f})}else c.info("No cache entries to update");return{status:"PASSED",results:p}}return g==="FAILED"&&await Hw({logger:c,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,originalStepsWithCaches:n,updatedStepsWithCaches:l}),g==="CANCELLED"?{status:"CANCELLED",results:p}:{status:"FAILED",results:p}}var ch=class{parentTracer=null;socket;step;interactionTracer;constructor({step:e,socket:t,parentTracer:n}){this.socket=t,this.parentTracer=n,this.step=e,this.interactionTracer=new Io,mn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...ME.parse(e),trace:Mm.parse(t)};switch(n.result.status){case"SUCCESS":this.socket.emit("success",n);break;case"FAILED":this.socket.emit("failure",n);break;case"CANCELLED":this.socket.emit("cancelled",n);break}return{trace:t}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new Wi({parentStep:this.step,socket:this.socket,parentTracer:this})}},Wi=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:n}){this.parentTracer=n,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:e.parentStepIdChain,attempt:e.attempt}),new ch({step:e.step,parentTracer:this,socket:this.socket})}},Ku=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new Wi({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new Wi({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new Wi({parentStep:null,parentTracer:null,socket:this.socket})}};var qH=({metadata:r,logger:e,globalStateManager:t,socket:n,cacheStorageFactory:o,getGitMetadata:i})=>async(a,s)=>{let c=t.getSession(n.id);if(!c)throw new Error("No active Android session found");let l=await i(),u=e.child({testId:a.testMetadata.id,branch:l.gitBranchName}),d=await o(r.orgId,l),m=c.controller;m.resetAbortController();let g=new Ku(n),p=await qu({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:m,logger:u,cacheStorage:d,usageTracker:new Al},containerName:"entire test",inputs:{steps:a.steps,fromStep:a.fromStep,toStep:a.toStep,orgId:r.orgId,testName:r.testName,testMetadata:a.testMetadata,interactive:!0},tracer:g,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}}}});await g.finish();let h={results:zt.array().parse(p.results),status:p.status};s?.(h)},Kx={event:"execute",createHandler:qH};import{debounce as KH}from"ts-debounce";var YH=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=KH(t,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(r.id);if(!o)throw new Error("No active Android session found");o.emulatorName&&(o.local||n(o.emulatorName))}},Yx={event:"keepalive",createHandler:YH};var Xx=[Kx,Nx,Yx,Dx];function Jx(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new XH(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0}),i=async()=>{await n.removeAllSessions(e)};o.on("connection",async s=>{let c=s.id,l=e.child({sessionId:c});l.info({event:"connection",transport:s.conn.transport.name},"Android websocket connection initiated"),s.on("disconnect",async()=>{await Lx({socket:s,globalStateManager:n,logger:l})});let u;try{u=await Ox({...r,socket:s,globalStateManager:n,logger:l})}catch(d){l.error({err:d},"Failed to setup Android connection"),s.emit("error",{message:d instanceof Error?d.message:JSON.stringify(d)}),s.disconnect(!0);return}Xx.forEach(d=>a(d,{...r,socket:s,metadata:u,logger:l}))});let a=(s,c)=>{let l=s.createHandler(c),u=(...d)=>{s.event!=="keepalive"&&c.logger.debug({event:s.event},`Websocket event (${s.event})`);let m=g=>{c.logger.error({event:s.event,err:g instanceof Error?g:new Error(`${g}`)},"Unhandled exception in socket handler"),c.socket.emit("error",{message:g instanceof Error?g.message:typeof g=="string"?g:JSON.stringify(g)})};try{let g=l.apply(this,d);g&&typeof g.catch=="function"&&g.catch(m)}catch(g){m(g)}};c.socket.on(s.event,u)};return{server:o,dispose:i}}import{randomUUID as oW}from"crypto";import{diff as H0e}from"deep-object-diff";import Q0e from"yaml";import{z as eke}from"zod";import{execSync as JH}from"child_process";function Kn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,C.debug({postSaveCommand:n},"Executing post-save hook command");try{JH(n,{encoding:"utf-8"})}catch(o){C.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as y0e}from"deep-object-diff";import{cloneDeep as E0e}from"lodash-es";import{v4 as O0e}from"uuid";import N0e from"yaml";import QH from"@dotenvx/dotenvx";import ZH from"fs";import Qx from"path";function Zx(r,e){return(r.config.environments??[]).map(t=>Ps(t.name,r,e))}function eG(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function tG(r){let{envVariables:e,project:t}=r;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=eG(i);s&&(n[o]=s);continue}let a;try{a=ZH.readFileSync(Qx.resolve(t.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&C.debug(n,"Set environment variables with interpolation from project configuration"),n}function rG(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=QH.config({path:Qx.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function Ps(r,e,t){let n=(e.config.environments??[]).find(c=>c.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);let o={},i=tG({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=rG({project:e,envFile:n.envFile,logger:t});return Object.assign(o,a),n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o}}import{existsSync as oG,readFileSync as iG,readdirSync as aG,writeFileSync as sG}from"fs";import{glob as lG}from"glob";import No,{dirname as eM}from"path";import{cwd as dh}from"process";import tM from"yaml";import{z as Ie}from"zod";import nG from"zod";var Yu=["**/*.test.yaml","**/*.module.yaml"],uh=nG.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),Xu=15;var ji="momentic.config.yaml",mh="momentic.workspace.yaml",cG=Ie.object({projects:Ie.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),uG=Ie.union([Ie.string(),Ie.object({fromFile:Ie.string(),json:Ie.boolean().optional()})]),dG=Ie.object({name:uh,baseUrl:Ie.string().optional().describe("Optional for mobile tests"),envFile:Ie.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Ie.record(Ie.string(),uG).optional(),inheritFromShell:Ie.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:ao.optional().describe("NB: most things should use project-level configuration only")}),mG=Ie.object({postSave:Ie.string().optional()}),pG=Ie.object({name:uh,include:Ie.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Ie.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Ie.string().optional(),reporterDir:Ie.string().optional(),outputDir:Ie.string().optional(),recordVideo:Ie.boolean().optional(),retries:Ie.number().optional().describe("number of retries per test"),parallel:Ie.number().optional().describe("degree of parallelism"),environments:Ie.array(dG).optional(),gitMainBranch:Ie.string().optional(),gitProtectedBranches:Ie.string().array().optional(),ai:Dm.optional(),browser:ao.optional(),emulator:Rm.optional(),advanced:km.optional(),displayRoot:Ie.string().optional().describe("relative path from project root to use as the Repository root"),hooks:mG.optional()});function rM(r,e){let t;try{t=iG(r,"utf-8")}catch(o){C.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=tM.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){C.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function ph(r){let e=rM(r,"project configuration");if(e!==void 0)try{return pG.parse(e)}catch(t){C.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function gG(r){let e=rM(r,"workspace configuration");if(e!==void 0)try{return cG.parse(e)}catch(t){C.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function hG(){let r=[],e=dh(),t=No.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=No.basename(e);if(zl.includes(i))return C.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of aG(e))if(a.endsWith(ji)){let s=No.join(e,a),c=ph(s);c&&r.push({configFilePath:s,config:c,rootDir:eM(s)})}if(r.length)return r;if(e=No.dirname(e),e===t)break}return r}async function Is(r={}){let{configFilePath:e,nameFilter:t}=r,n=await SG(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
4386
- ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return C.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function fG(r){let e=gG(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ji}`)),n=AbortSignal.timeout(2e3),o;try{o=await lG(t,{absolute:!1,cwd:dh(),dotRelative:!1,maxDepth:Xu,nodir:!0,signal:n})}catch(a){throw C.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${mh} is misconfigured.`),a}let i=[];for(let a of o){let s=No.join(dh(),a),c=ph(s);c&&i.push({configFilePath:s,config:c,rootDir:eM(s)})}return i}async function SG(r){if(r){r=No.resolve(r);let t=ph(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:No.dirname(r)}]}if(oG(mh)){let t=await fG(mh);if(t)return t}return hG()}function nM(r,e){let t=tM.stringify(r);sG(e,t)}import iM from"fs";import{glob as yG}from"glob";import Os from"path";import bG from"yaml";import{z as oM}from"zod";var aM=!1,EG=oM.object({fileType:oM.nativeEnum(De)});async function yr(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??Yu,o=Array.from(r.config.exclude??[]).concat(Hl),i=AbortSignal.timeout(5e3),a;try{a=await yG(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:Xu,nodir:!0,signal:i})}catch(s){throw C.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=TG(r.rootDir,s,t,e?On:C);c&&(t.duplicateEntities[c.id]=c.paths)}return aM=!0,t}function TG(r,e,t,n){let o=Os.join(r,e),i=vG(o,n);if(!i)return;let a=AG(i,o,n);if(!a)return;let s=EG.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let c=s.data.fileType,l=wG(o,n);if(!l)return;let u=CG(e,o,l);switch(c){case De.TEST:try{return RG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case De.MODULE:try{return xG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case De.MOBILE_TEST:try{return _G(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case De.MOBILE_MODULE:try{return MG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{let d=c;return}}}function vG(r,e){try{return iM.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function AG(r,e,t){try{let n=bG.parse(r);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return n}catch(n){t.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function wG(r,e){try{return iM.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function CG(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:Os.sep,fullPathSegments:e.split(Os.sep),relativePathSegments:r.split(Os.sep),fileName:Os.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function RG(r,e,t,n,o){let i=di.parse(r),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:De.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function xG(r,e,t,n,o){let i=nr.parse(r),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:De.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!aM&&rn(i.name)!==s&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${s}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function MG(r,e,t,n,o){let i=Ua.parse(r),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=t.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:De.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function _G(r,e,t,n,o){let i=Ar.parse(r),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=t.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:De.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}import{z as gh}from"zod";var sM="test-results";var Gke=gh.object({width:gh.number(),height:gh.number()});import{execFile as PG}from"node:child_process";import{promisify as IG}from"node:util";import OG from"simple-git";var ke=OG(),lM=IG(PG);async function LG(r){let e=await Ue(r,ke.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
4387
- `)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function NG(r,e,t){try{let o=t["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await lM("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await lM("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function DG(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return NG(r,e,t);if(o)return}catch{}}function Ju(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Ue(r,e){try{return(await e).trim()}catch(t){if(t instanceof Error&&t.message.includes("not a git repository"))return;r.error({err:t},"Failed to run git command");return}}function kG(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild"}async function UG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function FG(r){let[e,t,n]=await Promise.all([Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function BG(r){let[e,t,n,o]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Ju(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function zG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ju(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function HG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Ju(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function GG(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Ue(r,ke.revparse(["HEAD"])),Ue(r,ke.revparse(["--short","HEAD"])),Ue(r,ke.revparse(["--abbrev-ref","HEAD"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"])),e?Ue(r,ke.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),LG(r)]),d=l?await Ue(r,ke.show(["--no-patch","--format=%ci",l])):void 0,m=i?.includes("github.com"),g=i?.includes("gitlab.com"),p=i?Ju(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,E=u["user.username"]||void 0,b=await DG(r,i,u)??E??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:m?p:void 0,gitlabProjectPath:g?p:void 0,pipelineId:void 0}}async function VG(){let r=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}async function WG(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Ls(r,e){let t=kG();if(!t)return GG(r,e);switch(t){case"GithubActions":return UG(r);case"GitlabCI":return FG(r);case"CircleCI":return BG(r);case"Buildkite":return zG(r);case"AzureDevOps":return HG(r);case"GCPCloudBuild":return VG()}}async function jG(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function $G(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(t,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function qG(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await $G(r,e,n,o,t)}else if(t.gitlabProjectPath)return await jG(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function $i(r,e,t){let n=await WG(t),o=await Ls(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await qG(r,e,i);return{...n,...o,...a}}import{diff as cM}from"deep-object-diff";import Yn from"fs";import{cloneDeep as KG}from"lodash-es";import Qu from"path";import{v4 as YG}from"uuid";import Ns from"yaml";function uM(r,e){let t=`${rn(e)}.module.yaml`,n=Qu.join(Qu.dirname(r),t);if(Yn.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Yn.renameSync(r,n),n}function dM({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.mobileModules[r.moduleId]?.fullFilePath,a=t.mobileModules[r.moduleId]?.name;if(!i||!Yn.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=Yn.readFileSync(i,"utf-8"),c=Ns.parse(s),l={...c,...r,schemaVersion:e},u=wo({fileType:De.MOBILE_MODULE,...Ua.parse(l),steps:jt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,m=cM(u,c);if(m&&Object.keys(m).length===0&&!o&&!d)return;let g=Ns.stringify(u);Yn.writeFileSync(i,g,"utf-8");let p;d&&(p=uM(i,r.name)),Kn(p||i,n.config)}function mM({moduleId:r,patch:e,momenticFiles:t,project:n,logger:o}){let i=t.mobileModules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${r} that could not be found on disk`);let a=Ds(i,o),s={...a,...e},c=wo({fileType:De.MOBILE_MODULE,...Nl.parse(s)}),l=cM(c,a);if(l&&Object.keys(l).length===0)return;let u=Ns.stringify(c);Yn.writeFileSync(i,u,"utf-8");let d;e.name&&(d=uM(i,e.name)),Kn(d||i,n.config)}async function pM({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=rn(r),s=Qu.join(o,`${a}.module.yaml`),c=YG(),{stepsToSave:l}=await jr({steps:n}),u={schemaVersion:wn,moduleId:c,description:e,enabled:t},d={fileType:De.MOBILE_MODULE,...u,steps:l},m=Ns.stringify(ib.parse(d));return Yn.writeFileSync(s,m,"utf-8"),Kn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function Ds(r,e){let t=Yn.readFileSync(r,"utf-8"),n=Ns.parse(t);try{return{...Nl.parse(n),name:Qu.basename(r,".module.yaml")}}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic mobile module`),o}}async function hh(r,e,t,n){let o=Ds(r.fullFilePath,t),{resolvedSteps:i}=await Qc({rawSteps:o.steps,resolvedModuleCache:n||{},onFetchModule:async s=>{let c=e.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Could not find mobile module with id ${s}`);return Ds(c,t)},logger:t,metadata:{id:o.moduleId,schemaVersion:o.schemaVersion}}),a={...o,name:r.name,description:o.description||void 0,steps:i};return n&&(n[r.id]=KG(a)),a}async function gM(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await hh(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as XG}from"crypto";import Do from"fs";import Sh from"path";import Zu from"yaml";import fh from"zod";function hM({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${rn(r)}.test.yaml`,s=Sh.join(o,a);if(Do.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:De.MOBILE_TEST,id:XG(),description:e,schemaVersion:oo,settings:n,steps:t},l=Zu.stringify(c);return Do.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function JG(r){if(!Do.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Do.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
4388
- `),t=Zu.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function ed(r,e,t){let n=JG(r),o;try{o=Ar.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await Uw({rawStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},logger:e,testMetadata:o,onFetchModule:async s=>{let c=t.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Mobile module ${s} not found`);return Ds(c,e)}});return{...o,steps:i.steps}}async function fM({filePath:r,steps:e,settings:t,folder:n,project:o,momenticFiles:i,schemaVersion:a}){let s=Sh.isAbsolute(r)?r:Sh.join(n,r);if(!Do.existsSync(s))throw new Error(`Test file not found: ${s}`);let c=Do.readFileSync(s,"utf-8").replace(/\r\n|\r/g,`
4389
- `),l=Zu.parse(c),u=xm.extend({steps:fh.record(fh.string(),fh.unknown()).array()}).parse({...l,schemaVersion:a});if(u.fileType!==De.MOBILE_TEST)throw new Error(`File at '${s}' is not a mobile test (fileType=${u.fileType}).`);let d;e&&(d=await jr({steps:e}));let m={...u,...d?.stepsToSave!==void 0?{steps:d.stepsToSave}:{steps:u.steps},...t!==void 0?{settings:t}:{}},g=Zu.stringify(m);for(let p of d?.moduleUpdates??[])dM({content:p,schemaVersion:oo,momenticFiles:i,project:o});Do.writeFileSync(s,g,"utf-8"),Kn(s,o.config)}import{randomUUID as QG}from"crypto";import Xn from"fs";import qi from"path";var SM=new Set([".DS_Store","__MACOSX"]),yM={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function ZG(r,e,t){if(yM[t]){let i=yM[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var yh=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function bM(r,e){try{let t=qi.join(e,"metadata.json");return Yl.parse(JSON.parse(Xn.readFileSync(t,"utf-8")))}catch{throw new yh(r,e)}}function EM(r,e,t){let n=QG(),o=r.child({runGroupId:n});Xn.rmSync(e,{recursive:!0,force:!0});let i=Xn.readdirSync(t).filter(c=>!SM.has(c)).map(c=>qi.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);Xn.mkdirSync(e,{recursive:!0});let a={...bM(t,i[0]),id:n};for(let c of i){let l=qi.join(c,"runs");if(!Xn.existsSync(l))continue;let u=bM(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let g=m;a[g]=ZG(a,u,g)}let d=Xn.readdirSync(l);for(let m of d){if(SM.has(m))continue;let g=qi.join(l,m),p=qi.join(e,"runs",m);Xn.cpSync(g,p,{recursive:!0})}}let s=qi.join(e,"metadata.json");Xn.writeFileSync(s,JSON.stringify(a,null,2))}import vM from"adm-zip";import wh from"fs";import{z as sV}from"zod";var F="v1",bh="mobile-cli",ko="0.13.1";var eV=9e4,tV=3,rV=1500,nV=15e3,Mr=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function oV(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Eh=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return ko&&(e[$l]=ko),bh&&(e[Nb]=bh),e}async sendRequest(e,t){let{retries:n=tV,requestTimeoutMs:o=eV,initialRetryDelayMs:i=rV,maxRetryDelayMs:a=nV,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(m){u=m;try{s?.(u)}catch{}if(m instanceof Mr&&m.status>=400&&m.status<500)throw m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Ln),c===0)throw u;let g=l-c,p=Math.min(i*Math.pow(2,g-1),a);await new Promise(h=>setTimeout(h,p))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await oV(u);throw new Mr(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}return this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Qr=class extends Eh{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[Lb]:this.mode??""}}};import{createAnthropic as iV}from"@ai-sdk/anthropic";function aV(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[$l]:ko??"",...t&&{[kb]:t},...n||{}};return o&&(i[Db]=JSON.stringify(o)),i}var td=r=>e=>{let t=aV(r);return iV({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var Uo=class extends Qr{agentConfig;constructor(e,t){let n={..._y,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return gy.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${F}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:ko,...e},signal:t.abortSignal});return py.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${F}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return sV.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${F}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return Gb.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${F}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Fm.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return Hb.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return Fb.parse(o)}async getMcpCopilotConversationEvaluation(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:t.abortSignal});return Bb.parse(o)}async getMcpCopilotChatSummary(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:t.abortSignal});return zb.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${F}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Fm.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${F}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Ub.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${F}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${F}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Yd.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${F}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Vb.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${F}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return qd.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return $S.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return qS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${F}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Ld.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${F}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return My.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${F}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return HS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${F}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return WS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${F}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return VS.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${F}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return ef.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return td({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as Th}from"zod";var _r=class extends Qr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${F}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{C.warn(`API key check failed: ${t.message}`)}});return rE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${F}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Qb.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${F}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return jb.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${F}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${F}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return qb.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${F}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${F}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Kb.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${F}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Wb.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${F}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return tE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${F}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return nE.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${F}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return yE.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${F}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${F}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${F}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${F}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${F}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return oE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${F}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return cy.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${F}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${F}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${F}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return iE.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${F}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${F}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return aE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${F}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return sE.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${F}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return lE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${F}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return TE.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${F}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${F}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ha.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${F}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ha.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${F}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Gm.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${F}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ha.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${F}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ha.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${F}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Gm.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${F}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Th.record(Th.string(),Th.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${F}/quarantine`,{method:"GET"});return cE.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${F}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,t,n){await this.sendRequest(`/${F}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${F}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return uE.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${F}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:t,md5:n}){let o={channel:e,tag:t,md5:n},i=await this.sendRequest(`/${F}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return dE.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${F}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${F}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return mE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${F}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function vh(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(C.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),C.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return C.debug("Got auth info from API"),n}var rd=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var Ki=class extends Qr{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${F}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return tf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Yi=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as lV,en as cV}from"@faker-js/faker";var Xi="v1",Ji=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};ai={generate:this.sendAiGenerate.bind(this)};constructor(e){this.httpClient=e.httpClient,e.fakerSeed&&(this.fakerInstance=new lV({locale:cV}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Xi}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Mr?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Xi}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Mr?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Xi}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Mr?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Xi}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Mr?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Xi}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Mr?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Xi}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Mr?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function TM(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var nd=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await TM(n,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};var Qi=class extends Qr{constructor(e){super(e)}async getMobileElementLocation(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/mobile-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return Iy.parse(o)}async evaluateMobileAssertion(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${F}/mobile-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Ny.parse(o)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return td({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function od({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i}){return i?new Kl:new Ah(r,e,t,{alwaysSaveCache:o,regenerateCache:n})}var Ah=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a}=o,{gitBranchName:s,gitProtectedBranches:c}=n;this.cacheHeaders=Bm(n),this.readCaches=!i;let l=s&&c.includes(s);a||!l?this.writeCaches=!0:this.writeCaches=!1}cacheHeaders;readCaches;writeCaches;async saveEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateMobileStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.warn({err:o},"Failed to save mobile step cache entries, continuing...")}}async resolveEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t}=e.stepLists,n=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}for(let i of[t])i&&ig({steps:i,stepCacheEntries:n,logger:e.logger});let{cachesToSave:o}=await jr({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};import id from"path";function uV(r){let e=new vM,t=id.join(r,"metadata.json"),n=Yl.parse(JSON.parse(wh.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of wh.readdirSync(id.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new vM(id.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(id.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function ad(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!wh.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new nd(e);try{let{runGroupId:i,buffer:a}=uV(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",t.error(`Failed to upload test results: ${a}.`);return}}import dV from"adm-zip";import vt from"fs";import Xt from"path";var ks=class r{constructor(e){this.filePath=e;vt.rmSync(this.filePath,{recursive:!0,force:!0}),vt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Xt.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){vt.mkdirSync(Xt.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Xt.join(this.filePath,e);if(vt.existsSync(t))return vt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.filePath,t);try{vt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Xt.join(this.filePath,e);return vt.createWriteStream(t)}createRunArchive(e){return new Ch(Xt.join(this.filePath,"runs"),e)}},Ch=class{constructor(e,t){this.filePath=e;this.tempPath=Xt.join(e,`temp-storage-${t}`),this.finalPath=Xt.join(e,`${t}.zip`),vt.rmSync(this.tempPath,{recursive:!0,force:!0}),vt.rmSync(this.finalPath,{recursive:!0,force:!0}),vt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Xt.join(this.tempPath,e);if(vt.existsSync(t))return vt.readFileSync(t)}mkdir(e){vt.mkdirSync(Xt.join(this.tempPath,e),{recursive:!0})}cd(e){return new ks(Xt.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.tempPath,t);vt.writeFileSync(o,n)}createFileStream(e){let t=Xt.join(this.tempPath,e);return vt.createWriteStream(t)}close(){let e=new dV;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();vt.writeFileSync(this.finalPath,t),vt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import E1e from"adm-zip";import Sd from"fs";import HM from"body-parser";import NV from"cors";import DV from"dedent";import{Router as hV}from"express";import Ht from"fs";import{globSync as fV}from"glob";import St from"path";import sd from"fs";import mV from"path";var pV=new du(30,60*1e3),_h="https://api.momentic.ai",xh,wM=r=>{_h=r},Ph=()=>_h,Us=()=>xh;var Zi,Mh,AM,CM=async r=>{if(xh&&Zi&&AM)return Zi;let e=new _r({baseUrl:_h,apiKey:r,logger:C});xh=e;try{let t=await e.getAuthInfo();return Zi=t.orgId,Mh=t.userId,AM=r,Zi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},ea=()=>{if(!Zi)throw new Error("Your organization ID is invalid.");return Zi},ld=()=>{if(!Mh)throw new Error("Your user ID is invalid.");return Mh};var Ih,Rh,RM=(r,e)=>{Ih=r,Rh?.abort(),Rh=new AbortController;let t=Rh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=mV.resolve(r.rootDir,o.envFile);try{if(sd.lstatSync(i).isSymbolicLink())return;sd.existsSync(i)&&n.push(i)}catch(a){C.warn({err:a},`Failed to check if env file ${i} exists`)}});try{gV({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){C.error({err:o},"Failed to start config file watchers")}},Fe=()=>Ih;function gV({filesToWatch:r,revalidator:e,signal:t,project:n}){C.debug("Starting watch on the following files:"),r.forEach(o=>{C.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(pV.increment("setLocalProject")&&C.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Ih=await Promise.resolve(e(n.configFilePath)))};sd.watchFile(o,{persistent:!1},i);let a=()=>{sd.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ne(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var Bs=hV();function Fs(r){let e=Fe(),t=St.dirname(e.configFilePath);return St.join(t,...r)}function SV(r){let e=Fe(),t=St.dirname(e.configFilePath),n=St.relative(t,r);return n?n.split(St.sep):[]}function yV(r,e){let t=Ht.statSync(r),n=SV(r);return Om.parse({name:e,absolutePath:r,relativePath:n.join(St.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}Bs.post("/",Ne(async(r,e,t)=>{let n;try{n=bb.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Fs(n);if(!Ht.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(St.sep)}`});return}if(!Ht.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}let a=Fe(),s=Array.from(a.config.exclude??[]).concat(Hl),l=fV("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let m=St.join(o,d);return yV(m,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));Bs.put("/",Ne(async(r,e,t)=>{let n;try{n=Eb.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Fs(n);if(Ht.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(St.sep)}`,pathSegments:n});return}Ht.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(St.sep)}`,pathSegments:n};e.status(201).json(i)}));Bs.patch("/",Ne(async(r,e,t)=>{let n,o;try{let l=Tb.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Fs(n),a=Fs(o);if(!Ht.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(St.sep)}`});return}if(Ht.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(St.sep)}`});return}let s=St.dirname(a);Ht.existsSync(s)||Ht.mkdirSync(s,{recursive:!0}),Ht.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(St.sep)} to ${o.join(St.sep)}`,pathSegments:o};e.status(200).json(c)}));Bs.delete("/",Ne(async(r,e,t)=>{let n,o=!0;try{let c=vb.parse(r.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Fs(n);if(!Ht.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(St.sep)}`,pathSegments:n});return}if(!Ht.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}if(o)Ht.rmSync(i,{recursive:!0,force:!0});else{if(Ht.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Ht.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Oh=Bs;import{Router as TV}from"express";import{hostname as bV}from"os";var EV="0.13.1",zs=fi({app:"desktop-server",hostname:bV(),disableConsoleLogs:!0}).child({cliVersion:EV});(async()=>{try{let r=await Ls(zs);r.gitBranchName&&zs.addBinding("branch",r.gitBranchName)}catch{}})();var xM=TV();xM.get("/",async(r,e)=>{let t=Fe(),n=Us();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await $i(zs,n,t);e.status(200).json(o)});var Lh=xM;import kV from"events";import GM,{Router as UV}from"express";import FV from"http";import BV from"path";var cd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};var ud=new cd;import{Router as AV}from"express";import{existsSync as wV}from"fs";import CV from"path";import{hostname as vV}from"os";var Nh="0.13.1",mt=fi({app:"mobile-desktop-server",hostname:vV(),disableConsoleLogs:!0}).child({cliVersion:Nh});(async()=>{try{let r=await Ls(mt);r.gitBranchName&&mt.addBinding("branch",r.gitBranchName)}catch{}})();var Dh=AV();Dh.get("/",Ne(async(r,e)=>{let t=Us();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));Dh.post("/upload-url",Ne(async(r,e)=>{let t;try{t=Mb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Us();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=CV.resolve(t.filePath);if(!wV(o)){e.status(400).json({error:`File not found: ${o}`});return}await ou({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:mt}),e.sendStatus(204)}));var MM=Dh;import{Router as MV}from"express";import{Router as RV}from"express";import _M from"fs";import xV from"path";var Hs=RV();async function kh(r){return(await gM(r,mt)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){C.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Hs.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await kh(n);e.status(200).json(o)}));Hs.get("/:moduleId",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await yr(Fe()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await hh(n,t,C);e.json(o)}catch(o){e.status(400).json({err:o})}}));Hs.patch("/:moduleId/metadata",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=_b.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Fe(),o=await yr(n);mM({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:C,project:n}),e.status(201).json({message:"ok"})}));Hs.post("/",Ne(async(r,e)=>{let t;try{t=Pb.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{Ea(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=Fe(),i=(await yr(n)).mobileModules;if(Object.values(i).find(c=>c.name===t.name)){e.status(400).json({error:`A mobile module with the name "${t.name}" already exists. Please choose a different name.`});return}let a=xV.join(n.rootDir,t.folderPath??"");if(!_M.existsSync(a)||!_M.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await pM({...t,folder:a,project:n});e.status(201).json(s)}));var PM=Hs;var IM=MV();IM.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await kh(n),i=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var OM=IM;import{Router as _V}from"express";var Uh=_V();Uh.get("/",Ne((r,e)=>{let t=Zx(Fe(),mt);e.status(200).json(t)}));Uh.get("/names",Ne((r,e)=>{let n=Fe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var LM=Uh;import{Router as PV}from"express";var NM=PV();NM.get("/",(r,e)=>{e.status(200).json({userId:ld(),orgId:ea(),cliVersion:Nh??"0.0.0"})});var DM=NM;import{Router as IV}from"express";var kM=IV();kM.get("/",Ne(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=ud.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4390
- `).filter(s=>s.trim().startsWith("package:")).map(s=>s.replace("package:","").trim()).filter(s=>s.length>0&&!s.startsWith("io.appium"))||[];e.status(200).json({packages:a})}catch(o){mt.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var UM=kM;import{Router as OV}from"express";import Fh from"path";var dd=OV();dd.patch("/:testPath",Ne(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=xb.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0){e.status(400).json({error:"At least one of steps or settings is required"});return}let o=Fe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await yr(o);await fM({filePath:i,steps:n.steps,settings:n.settings,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:oo});let s={message:"ok"};e.status(200).json(s)}));dd.post("/",Ne((r,e)=>{let t;try{t=Rb.parse(r.body)}catch(p){e.status(400).json({error:`Invalid request body: ${p}`});return}let{name:n,description:o,settings:i,pathSegments:a}=t;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{Ea(n)}catch(p){e.status(400).json({error:p.message});return}let s=Fe(),c=Fh.join(s.rootDir,...a),{fullPath:l,testId:u}=hM({name:n,description:o,steps:[],settings:i,folder:c}),d=Fh.basename(l),m=Fh.relative(s.rootDir,l),g={id:u,fileName:d,fullPath:l,relativeFilePath:m};e.status(201).json(g)}));dd.get("/:fileName",Ne(async(r,e)=>{let t=r.params.fileName;if(!t){e.status(400).json({error:"Missing fileName in path"});return}let n=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,o=Fe(),i=await yr(o),s=await ed(n,mt,i);e.status(200).json(s)}));var FM=dd;import{Router as LV}from"express";var BM=LV();BM.get("/",Ne((r,e)=>{let t=Fe(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var zM=BM;var md=class extends Yi{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=Fe();return Ps(t,o,C)}};var VM="10mb";async function WM(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&wM(n),await CM(t);let u=ea(),d=ld(),m=r.logger.child({orgId:u,userId:d});RM(i,A=>Is({configFilePath:A}));let g=GM();g.use(NV()),g.use(HM.json({limit:VM})),g.use(HM.urlencoded({extended:!1,limit:VM}));let p=UV();if(p.use("/folders",Oh),p.use("/entities",OM),p.use("/identify",DM),p.use("/mobile-tests",FM),p.use("/mobile-modules",PM),p.use("/assets",MM),p.use("/git",Lh),p.use("/environments",LM),p.use("/installed-packages",UM),p.use("/settings",zM),g.use("/api",p),g.use((A,I,k)=>{C.debug({url:A.url,path:A.path,query:A.query,method:A.method,body:A.body,headers:A.rawHeaders,client:A.ip},"Incoming request on mobile-desktop-server"),I.on("close",()=>{I.statusCode>=400&&(C.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"),mt.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),g.use((A,I,k,j)=>{if(A instanceof Error&&A.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}C.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),mt.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${A.message}`)}),o){let A=GM.static(o,{setHeaders:I=>{I.setHeader("Cache-Control","no-cache")},redirect:!1});g.use(A),g.use("*",(I,k)=>{k.sendFile(BV.join(o,"index.html"))})}let h=FV.createServer(g),f=`http://localhost:${e}`;await new Promise(A=>{try{h.listen(e,()=>{m.info(`Mobile desktop server is running at ${f}`),A()})}catch(I){I.message.includes("EADDRINUSE")?zV(e):C.error(`An unexpected error occurred while starting the server: ${I.message}`),process.exit(1)}});let b={type:"API_KEY",baseUrl:Ph(),apiKey:t,logger:m},w=new _r(b),R=Fe(),v={...b,mode:"interactive"},{dispose:M}=Jx({baseServer:h,logger:m,authorization:b,globalStateManager:ud,getOrgId:()=>ea(),getGitMetadata:async()=>await $i(m,w,R),androidDriverFactory:async({socket:A,logger:I,creationOpts:k})=>{let j=Math.floor(Math.random()*1e4)+4e4,ne=await Zl(j,"appium");return nu({logger:I,driverLogLevel:a,apiClient:w,creationOpts:k,socket:A,appiumPort:ne,sessionId:A.id,orgId:ea(),onStatusUpdate:Te=>{A.emit("connectionStatusUpdate",{message:Te})}})},mobileGeneratorFactory:async A=>new Qi({baseUrl:Ph(),apiKey:t,logger:m,mode:"interactive"}),browserGeneratorFactory:async A=>new Uo(R.config.ai?.agentConfig,v),browserEnricherFactory:async A=>new Ki(v,new Uo(R.config.ai?.agentConfig,v)),storageFactory:async A=>new md(w,A),cacheStorageFactory:async(A,I)=>od({orgId:A,client:w,gitMetadata:I,regenerateCache:s??!1,noCache:l??!1,alwaysSaveCache:c??!1}),localToolsFactory:async()=>new Ji({httpClient:w,fakerSeed:void 0}),keepSessionAlive:A=>w.extendAndroidEmulatorTtl(A),settingsFactory:async()=>({emulator:{},ai:{},...R.config})});process.once("SIGUSR2",async()=>{return;try{await M(),await Tt.flush()}catch(A){C.error({err:A},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{C.info("SIGTERM in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{C.info("SIGINT in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}})}kV.setMaxListeners(25);process.on("warning",r=>{mt.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{mt.error({err:r},"Uncaught exception on mobile-desktop-server"),C.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{mt.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),C.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function zV(r){C.error(DV`Port ${r} is already in use by another process. Please close the other process and try again.
4385
+ `;import{tool as HH}from"ai";import{randomUUID as GH}from"crypto";import VH from"zod";import{tool as BH}from"ai";import zH from"zod";var Kx=r=>{let e=BH({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:zH.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(sh),n.info("AI action tool called (get_emulator_state)"),lh(t)}});return{name:sh,tool:e}};async function lh(r){let e=await r.getA11yTree(),t=await r.getScreenshotBase64();return{type:"content",value:[{type:"text",text:"<emulatorXml>"},{type:"text",text:e},{type:"text",text:"</emulatorXml>"},{type:"text",text:"<screenshot>"},{type:"media",data:t,mediaType:"image/png"},{type:"text",text:"</screenshot>"}]}}var Yx=r=>({name:"create_execute_step",tool:HH({description:"Create and immediately execute a new Momentic step in the Android emulator, returning the result from the step and the state of the emulator after the step finished executing.",inputSchema:VH.object({step:bm}),toModelOutput:t=>t,execute:async({step:t})=>{let{contextManager:n,logger:o,controller:i}=r;o.info({step:t},"AI action tool called (create_execute_step)");let a=By(t),s={id:GH(),type:"MOBILE_PRESET_STEP",command:a},c=await n.createAndExecuteStep(s);c.status==="SUCCESS"&&await i.waitForScreenshotStability({reason:"Waiting for stability after executing AI-generated sub-step"});let l={...c,trace:void 0,beforeSnapshot:void 0,afterSnapshot:void 0},u=await lh(i);return{type:"content",value:[{type:"text",text:"<result>"},{type:"text",text:JSON.stringify(l,null,2)},{type:"text",text:"</result>"},{type:"text",text:"<stateAfter>"},...u.value,{type:"text",text:"</stateAfter>"}]}}})});import{tool as WH}from"ai";import ch from"zod";var Xx=r=>{let e=WH({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:ch.object({message:ch.string(),success:ch.boolean()}),toModelOutput:t=>t,execute:async({message:t,success:n})=>{let{contextManager:o,logger:i}=r;return i.info({message:t,success:n},"AI action tool called (finish)"),o.finalState={message:t,status:n?"SUCCESS":"FAILED"},{type:"content",value:[{type:"text",text:"Done"}]}}});return{name:qu,tool:e}};var Jx=[Yx,Kx,Xx];function Qx(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of Jx){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:be(e),sessionId:o}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let m=l[d];for(let p of m.content)if(!(typeof p!="object"||!("type"in p))&&!(p.type!=="tool-result"||p.output.type!=="content")&&!(p.output.value.length<3))for(let g=0;g<p.output.value.length;g++){let h=p.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=p.output.value[g+1];f.type==="text"?f.text="TRUNCATED DUE TO CONVERSATION LENGTH":e.warn({msg:f},"Got unexpected part when truncating emulator state message")}else{u=!0;continue}}}return c};return{model:a("claude-haiku-4-5-20251001"),tools:i,prepareStep:s,stopWhen:[$H(15),jH(qu)],system:qx(!1)}}async function Zx(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await YH(r)}catch(o){let i=t.isAborted()||o instanceof DOMException&&o.name==="AbortError";return i||n.error({err:o},"Failed to execute mobile AI action"),{...r.aiActionParams.step,steps:[],type:"MOBILE_AI_ACTION_STEP",startTime:e,endTime:Date.now(),status:i?"CANCELLED":"FAILED",message:i?"Step cancelled.":`${o}`}}}async function YH(r){let{step:e,stepTracer:t,executeMobileStepList:n}=r.aiActionParams,{controller:o,logger:i}=r.fixtures,{step:a}=r.callbacks,s=await t.startSubSteps(),c=KH(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,E)=>{let b=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${E}`}});if(b.results.length!==1)throw new Error("InternalWebAgentError: Expected exactly one result from executeMobileStepList");return b.results[0]},m={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},p=new $u({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:m}),g=Qx({controller:o,logger:l,contextManager:p,aiActionSessionId:c}),h=qH({...g,messages:[{role:"user",content:e.text}],abortSignal:o.abortSignal});for await(let f of h.fullStream)switch(o.throwIfAborted(),f.type){case"text-delta":a?.onAiActionEvent?.({type:"LLM_TEXT_OUTPUT",text:f.text,rootStep:m})}if(await h.response,o.throwIfAborted(),!p.finalState)throw new Error("InternalWebAgentError: The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...e,status:p.finalState.status,startTime:u,endTime:Date.now(),message:p.finalState.message,steps:p.results}}var XH=60*60*1e3;async function Ku(r){let{fixtures:e,inputs:t,listParams:n,work:o}=r,{containerName:i,steps:a,tracer:s}=n,{logger:c,controller:l,usageTracker:u}=e,d=s.getParentStepIdChain(),m=[],p,g="SUCCESS",{fromStep:h,toStep:f}=t;for(let E=0;E<a.length;E++){let b=a[E];if(b.skipped)continue;if(o.fastForwardingToStep&&h){let A=JSON.stringify(d);if(b.id===h.fromStepId&&A===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!Yw({currentStep:b,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let C=0,R=1,v=Date.now();b.retries&&b.retries>0&&(R+=b.retries);let M=[];for(;C<R&&Date.now()-v<XH;){C++;let A=`Executing step index ${E} in ${i} - ${cg(b)}`;C!==1&&(A+=` (attempt ${C})`),c.info({step:b},A);let I=Date.now(),k=await s.startStep({logger:c,step:b,attempt:C,parentStepIdChain:d});u.trackStepExecution(b);let W=await JH({step:b,stepTracer:k,params:r}),{trace:oe}=await k.finish({parentStepIdChain:d,result:W});if(W.trace=oe,A=`Finished step index ${E} in ${i} - ${cg(b)}`,C!==1&&(A+=` (attempt ${C})`),c.info({step:{id:b.id},trace:W.trace,status:W.status},A),W.status!=="SUCCESS"&&C<R){M.push(W),Date.now()-I<1e3&&await j(1e3-(Date.now()-I));continue}if(M.length>0&&(W.previousAttempts=M),m.push(W),W.status!=="SUCCESS")return g=W.status,p=W,{results:m,status:g,terminalResult:p};if(b.envKey&&l.context.setVariable(b.envKey,W.data),f){let Te=JSON.stringify(d);if(b.id===f.toStepId&&Te===JSON.stringify(f.parentStepIdChain))return o.shouldStopExecuting=!0,{results:m,status:g,terminalResult:p}}if(o.shouldStopExecuting)return{results:m,status:g,terminalResult:p};break}}return{results:m,status:g,terminalResult:p}}async function JH({step:r,stepTracer:e,params:t}){let{fixtures:n,inputs:o,callbacks:i,work:a}=t,s;switch(r.type){case"MOBILE_PRESET_STEP":{s=await jx({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await Vx({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:Ku}});break}case"MOBILE_AI_ACTION_STEP":{s=await Zx({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:Ku}});break}}return s}async function Yu(r){let{tracer:e,containerName:t}=r,{steps:n,testMetadata:o}=r.inputs,{cacheStorage:i,logger:a,controller:s}=r.fixtures,c=a.child({testId:r.inputs.testMetadata.id,testName:r.inputs.testName});await i.resolveEntries({logger:c,testId:o.id,stepLists:{steps:n}});let l=ZH(n);c.info({testMetadata:Ar.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=rT(c),m=Gx(s,c);c.info({cpu:d?.cpuMetadata,platform:d?.platform},`Starting execution of ${t}`);let{status:p,results:g}=await Ku({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(m),p==="SUCCESS"){let h=QH(n,l);if(h&&Object.keys(h).length>0){c.info({diffs:mi(h)},"Saving mobile step cache entries post-success");let{cachesToSave:f}=await $r({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:f})}else c.info("No cache entries to update");return{status:"PASSED",results:g}}return p==="FAILED"&&await $w({logger:c,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,originalStepsWithCaches:n,updatedStepsWithCaches:l}),p==="CANCELLED"?{status:"CANCELLED",results:g}:{status:"FAILED",results:g}}var uh=class{parentTracer=null;socket;step;interactionTracer;constructor({step:e,socket:t,parentTracer:n}){this.socket=t,this.parentTracer=n,this.step=e,this.interactionTracer=new Io,pn.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...LE.parse(e),trace:wm.parse(t)};switch(n.result.status){case"SUCCESS":this.socket.emit("success",n);break;case"FAILED":this.socket.emit("failure",n);break;case"CANCELLED":this.socket.emit("cancelled",n);break}return{trace:t}}getParentStepIdChain(){return this.parentTracer?this.parentTracer?.getParentStepIdChain()??[]:[]}async startSubSteps(){return new Vi({parentStep:this.step,socket:this.socket,parentTracer:this})}},Vi=class{parentTracer;parentStep;socket;constructor({parentStep:e,socket:t,parentTracer:n}){this.parentTracer=n,this.parentStep=e,this.socket=t}getParentStepIdChain(){return this.parentStep?[...this.parentTracer?.getParentStepIdChain()??[],this.parentStep.id]:[]}async startStep(e){return this.socket.emit("started",{stepId:e.step.id,parentStepIdChain:e.parentStepIdChain,attempt:e.attempt}),new uh({step:e.step,parentTracer:this,socket:this.socket})}},Xu=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new Vi({parentStep:null,parentTracer:null,socket:this.socket})}};var eG=({metadata:r,logger:e,globalStateManager:t,socket:n,cacheStorageFactory:o,getGitMetadata:i})=>async(a,s)=>{let c=t.getSession(n.id);if(!c)throw new Error("No active Android session found");let l=await i(),u=e.child({testId:a.testMetadata.id,branch:l.gitBranchName}),d=await o(r.orgId,l),m=c.controller;m.resetAbortController();let p=new Xu(n),g=await Yu({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:m,logger:u,cacheStorage:d,usageTracker:new Nl},containerName:"entire test",inputs:{steps:a.steps,fromStep:a.fromStep,toStep:a.toStep,orgId:r.orgId,testName:r.testName,testMetadata:a.testMetadata,interactive:!0},tracer:p,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}}}});await p.finish();let h={results:zt.array().parse(g.results),status:g.status};s?.(h)},eM={event:"execute",createHandler:eG};import{debounce as tG}from"ts-debounce";var rG=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=tG(t,3e4,{maxWait:6e4});return async()=>{let o=e.getSession(r.id);if(!o)throw new Error("No active Android session found");o.emulatorName&&(o.local||n(o.emulatorName))}},tM={event:"keepalive",createHandler:rG};var rM=[eM,zx,tM,Hx];function nM(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new nG(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0}),i=async()=>{await n.removeAllSessions(e)};o.on("connection",async s=>{let c=s.id,l=e.child({sessionId:c});l.info({event:"connection",transport:s.conn.transport.name},"Android websocket connection initiated"),s.on("disconnect",async()=>{await Bx({socket:s,globalStateManager:n,logger:l})});let u;try{u=await Fx({...r,socket:s,globalStateManager:n,logger:l})}catch(d){l.error({err:d},"Failed to setup Android connection"),s.emit("error",{message:d instanceof Error?d.message:JSON.stringify(d)}),s.disconnect(!0);return}rM.forEach(d=>a(d,{...r,socket:s,metadata:u,logger:l}))});let a=(s,c)=>{let l=s.createHandler(c),u=(...d)=>{s.event!=="keepalive"&&c.logger.debug({event:s.event},`Websocket event (${s.event})`);let m=p=>{c.logger.error({event:s.event,err:p instanceof Error?p:new Error(`${p}`)},"Unhandled exception in socket handler"),c.socket.emit("error",{message:p instanceof Error?p.message:typeof p=="string"?p:JSON.stringify(p)})};try{let p=l.apply(this,d);p&&typeof p.catch=="function"&&p.catch(m)}catch(p){m(p)}};c.socket.on(s.event,u)};return{server:o,dispose:i}}import{randomUUID as dW}from"crypto";import{diff as lke}from"deep-object-diff";import bke from"yaml";import{z as Tke}from"zod";import{execSync as oG}from"child_process";function Kn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,w.debug({postSaveCommand:n},"Executing post-save hook command");try{oG(n,{encoding:"utf-8"})}catch(o){w.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as B0e}from"deep-object-diff";import{cloneDeep as H0e}from"lodash-es";import{v4 as Z0e}from"uuid";import tke from"yaml";import iG from"@dotenvx/dotenvx";import aG from"fs";import oM from"path";function iM(r,e){return(r.config.environments??[]).map(t=>Is(t.name,r,e))}function sG(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let[n,o]=t.split(/:-|-/,2),i=process.env[n];return t.includes(":-")?i&&i!==""?i:o||"":t.includes("-")?i!==void 0?i:o||"":i||""}):r}function lG(r){let{envVariables:e,project:t}=r;if(!e)return{};let n={};for(let[o,i]of Object.entries(e)){if(typeof i=="string"){let s=sG(i);s&&(n[o]=s);continue}let a;try{a=aG.readFileSync(oM.resolve(t.rootDir,i.fromFile),"utf-8")}catch(s){throw new Error(`Failed to read environment variable '${o}' from file '${i.fromFile}': ${s}`)}if(i.json)try{n[o]=JSON.parse(a)}catch(s){throw new Error(`Failed to parse environment variable '${o}' from file '${i.fromFile}' as JSON: ${s}`)}else n[o]=a}return Object.keys(n).length>0&&w.debug(n,"Set environment variables with interpolation from project configuration"),n}function cG(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=iG.config({path:oM.resolve(e.rootDir,t),processEnv:o,logLevel:"error",quiet:!0});if(i.error)throw new Error(`Failed to load .env file: ${i.error.message}`);return n.debug(o,"Set environment variables from .env file"),o}function Is(r,e,t){let n=(e.config.environments??[]).find(c=>c.name===r);if(!n)throw new Error(`Environment ${r} not found in local project configuration file`);let o={},i=lG({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=cG({project:e,envFile:n.envFile,logger:t});return Object.assign(o,a),n.inheritFromShell&&(t.debug(process.env,"Inheriting environment variables from shell"),Object.assign(o,process.env)),{name:r,variables:o}}import{existsSync as dG,readFileSync as mG,readdirSync as pG,writeFileSync as gG}from"fs";import{glob as hG}from"glob";import No,{dirname as aM}from"path";import{cwd as mh}from"process";import sM from"yaml";import{z as Ie}from"zod";import uG from"zod";var Ju=["**/*.test.yaml","**/*.module.yaml"],dh=uG.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),Qu=15;var Wi="momentic.config.yaml",ph="momentic.workspace.yaml",fG=Ie.object({projects:Ie.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),SG=Ie.union([Ie.string(),Ie.object({fromFile:Ie.string(),json:Ie.boolean().optional()})]),yG=Ie.object({name:dh,baseUrl:Ie.string().optional().describe("Optional for mobile tests"),envFile:Ie.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Ie.record(Ie.string(),SG).optional(),inheritFromShell:Ie.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:ao.optional().describe("NB: most things should use project-level configuration only")}),bG=Ie.object({postSave:Ie.string().optional()}),EG=Ie.object({name:dh,include:Ie.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Ie.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Ie.string().optional(),reporterDir:Ie.string().optional(),outputDir:Ie.string().optional(),recordVideo:Ie.boolean().optional(),retries:Ie.number().optional().describe("number of retries per test"),parallel:Ie.number().optional().describe("degree of parallelism"),environments:Ie.array(yG).optional(),gitMainBranch:Ie.string().optional(),gitProtectedBranches:Ie.string().array().optional(),ai:km.optional(),browser:ao.optional(),emulator:vm.optional(),advanced:Um.optional(),displayRoot:Ie.string().optional().describe("relative path from project root to use as the Repository root"),hooks:bG.optional()});function lM(r,e){let t;try{t=mG(r,"utf-8")}catch(o){w.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=sM.parse(t),typeof n!="object"||n===null)throw new Error(`The ${e} file should parse as a map with key-value pairs, but is type ${typeof n} instead`)}catch(o){w.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function gh(r){let e=lM(r,"project configuration");if(e!==void 0)try{return EG.parse(e)}catch(t){w.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function TG(r){let e=lM(r,"workspace configuration");if(e!==void 0)try{return fG.parse(e)}catch(t){w.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function vG(){let r=[],e=mh(),t=No.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=No.basename(e);if(Gl.includes(i))return w.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of pG(e))if(a.endsWith(Wi)){let s=No.join(e,a),c=gh(s);c&&r.push({configFilePath:s,config:c,rootDir:aM(s)})}if(r.length)return r;if(e=No.dirname(e),e===t)break}return r}async function Os(r={}){let{configFilePath:e,nameFilter:t}=r,n=await wG(e);if(t&&(n=n.filter(o=>o.config.name===t)),n.length>1)throw new Error(`Multiple valid projects were found in the same directory. Please use the '-c / --config' flag to disambiguate:
4386
+ ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return w.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function AG(r){let e=TG(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${Wi}`)),n=AbortSignal.timeout(2e3),o;try{o=await hG(t,{absolute:!1,cwd:mh(),dotRelative:!1,maxDepth:Qu,nodir:!0,signal:n})}catch(a){throw w.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${ph} is misconfigured.`),a}let i=[];for(let a of o){let s=No.join(mh(),a),c=gh(s);c&&i.push({configFilePath:s,config:c,rootDir:aM(s)})}return i}async function wG(r){if(r){r=No.resolve(r);let t=gh(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:No.dirname(r)}]}if(dG(ph)){let t=await AG(ph);if(t)return t}return vG()}function cM(r,e){let t=sM.stringify(r);gG(e,t)}import dM from"fs";import{glob as CG}from"glob";import Ls from"path";import RG from"yaml";import{z as uM}from"zod";var mM=!1,xG=uM.object({fileType:uM.nativeEnum(De)});async function yr(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??Ju,o=Array.from(r.config.exclude??[]).concat(Vl),i=AbortSignal.timeout(5e3),a;try{a=await CG(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:Qu,nodir:!0,signal:i})}catch(s){throw w.error({err:s},"Failed to list all Momentic files in the current directory. This usually indicates the 'include' and 'exclude' globs are misconfigured in your momentic.config.yaml, or that your machine is severely resource constrained."),new Error("Listing Momentic files timed out after 5 seconds.",{cause:s})}for(let s of a){let c=MG(r.rootDir,s,t,e?On:w);c&&(t.duplicateEntities[c.id]=c.paths)}return mM=!0,t}function MG(r,e,t,n){let o=Ls.join(r,e),i=_G(o,n);if(!i)return;let a=PG(i,o,n);if(!a)return;let s=xG.safeParse(a);if(s.success===!1){n.warn(`Possible Momentic file at ${o} does not have a 'fileType', skipping: ${s.error}`);return}let c=s.data.fileType,l=IG(o,n);if(!l)return;let u=OG(e,o,l);switch(c){case De.TEST:try{return LG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case De.MODULE:try{return NG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case De.MOBILE_TEST:try{return kG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case De.MOBILE_MODULE:try{return DG(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile module metadata: ${d}`);return}default:{let d=c;return}}}function _G(r,e){try{return dM.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function PG(r,e,t){try{let n=RG.parse(r);if(typeof n!="object"||n===null)throw new Error("The YAML document should parse as a map with key-value pairs");return n}catch(n){t.warn(`Could not parse possible Momentic file at ${e}, skipping: ${n}`);return}}function IG(r,e){try{return dM.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function OG(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:Ls.sep,fullPathSegments:e.split(Ls.sep),relativePathSegments:r.split(Ls.sep),fileName:Ls.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function LG(r,e,t,n,o){let i=di.parse(r),a;if(e.tests[i.id]){let s=e.tests[i.id].fullFilePath;a={id:i.id,paths:[s,n]}}return e.tests[i.id]={type:De.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function NG(r,e,t,n,o){let i=nr.parse(r),a;if(e.modules[i.moduleId]){let c=e.modules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}e.modules[i.moduleId]={type:De.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!mM&&nn(i.name)!==s&&o.warn(`The module with ID ${i.moduleId} has a name (${i.name}) that does not match its file name (${s}). We recommend renaming the module or the file to be consistent to avoid confusion and issues with module resolution.`),a}function DG(r,e,t,n,o){let i=Da.parse(r),a;if(e.mobileModules[i.moduleId]){let c=e.mobileModules[i.moduleId].fullFilePath;a={id:i.moduleId,paths:[c,n]}}let s=t.fileName.replace(".module.yaml","");return e.mobileModules[i.moduleId]={type:De.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function kG(r,e,t,n,o){let i=Ar.parse(r),a;if(e.mobileTests[i.id]){let c=e.mobileTests[i.id].fullFilePath;a={id:i.id,paths:[c,n]}}let s=t.fileName.replace(".test.yaml","");return e.mobileTests[i.id]={type:De.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,...t},a}import{z as hh}from"zod";var pM="test-results";var cUe=hh.object({width:hh.number(),height:hh.number()});import{execFile as UG}from"node:child_process";import{promisify as FG}from"node:util";import BG from"simple-git";var ke=BG(),gM=FG(UG);async function zG(r){let e=await Ue(r,ke.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
4387
+ `)){let o=n.indexOf("=");if(o===-1)continue;let i=n.slice(0,o),a=n.slice(o+1).trim();t[i]=a}return t}async function HG(r,e,t){try{let o=t["github.user"]||void 0;if(o)return o}catch{}let n;try{if(e?.startsWith("http://")||e?.startsWith("https://"))n=new URL(e).host;else if(e?.startsWith("git@")){let o=e.indexOf("@"),i=e.indexOf(":",o+1);o!==-1&&i!==-1&&(n=e.slice(o+1,i))}}catch{}if(n=n?.toLowerCase(),!!n){try{if(e?.startsWith("git@")&&n?.includes("github")){let{stdout:o,stderr:i}=await gM("ssh",["-T","-o","BatchMode=yes",`git@${n}`],{timeout:5e3}),s=`${o??""}${i??""}`.trim().match(/Hi\s+([A-Za-z0-9_-]+)!/);if(s?.[1])return s[1]}}catch{}try{let o=n&&n!=="github.com"?["api","--hostname",n,"user","-q",".login"]:["api","user","-q",".login"],{stdout:i}=await gM("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function GG(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return HG(r,e,t);if(o)return}catch{}}function Zu(r){if(r.startsWith("git@")){let e=r.split(":");if(e.length===2){let t=e[1].replace(".git","").split("/");if(t.length===2){let n=t[0],o=t[1];return`${n}/${o}`}}}else if(r.startsWith("http")||r.startsWith("https")){let t=new URL(r).pathname.split("/").filter(Boolean);if(t.length>=2){let n=t[0],o=t[1].replace(".git","");return`${n}/${o}`}}}async function Ue(r,e){try{return(await e).trim()}catch(t){if(t instanceof Error&&t.message.includes("not a git repository"))return;r.error({err:t},"Failed to run git command");return}}function VG(){if(process.env.GITHUB_ACTION)return"GithubActions";if(process.env.GITLAB_CI)return"GitlabCI";if(process.env.CIRCLECI)return"CircleCI";if(process.env.BUILDKITE)return"Buildkite";if(process.env["System.CollectionUri"]?.includes("azure"))return"AzureDevOps";if(process.env.PROJECT_ID&&process.env.BUILD_ID)return"GCPCloudBuild"}async function WG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.GITHUB_SERVER_URL&&process.env.GITHUB_REPOSITORY?`${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}`:void 0;return{ciProvider:"GithubActions",gitCommitSha:process.env.GITHUB_SHA,gitCommitShaShort:process.env.GITHUB_SHA?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.GITHUB_HEAD_REF||process.env.GITHUB_REF_NAME,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:process.env.GITHUB_REPOSITORY,pipelineId:process.env.GITHUB_RUN_ID}}async function jG(r){let[e,t,n]=await Promise.all([Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]);return{ciProvider:"GitlabCI",gitCommitSha:process.env.CI_COMMIT_SHA,gitCommitShaShort:process.env.CI_COMMIT_SHORT_SHA,gitCommitTimestamp:process.env.CI_COMMIT_TIMESTAMP?new Date(process.env.CI_COMMIT_TIMESTAMP):void 0,gitBranchName:process.env.CI_COMMIT_BRANCH||process.env.CI_COMMIT_REF_NAME,gitOriginUrl:e,gitCommitMessage:t,gitCommitAuthorName:n,gitlabProjectPath:process.env.CI_PROJECT_PATH,pipelineId:`${process.env.CI_PIPELINE_ID}:${process.env.CI_JOB_ID}`}}async function $G(r){let[e,t,n,o]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Zu(i):void 0;return{ciProvider:"CircleCI",gitCommitSha:process.env.CIRCLE_SHA1,gitCommitShaShort:process.env.CIRCLE_SHA1?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.CIRCLE_BRANCH,gitOriginUrl:i,gitCommitMessage:n,gitCommitAuthorName:o,githubRepository:a?c:void 0,gitlabProjectPath:s?c:void 0,pipelineId:process.env.CIRCLE_PIPELINE_ID}}async function qG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zu(o):void 0;return{ciProvider:"Buildkite",gitCommitSha:process.env.BUILDKITE_COMMIT,gitCommitShaShort:process.env.BUILDKITE_COMMIT?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env.BUILDKITE_BRANCH,gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env.BUILDKITE_PIPELINE_ID}:${process.env.BUILDKITE_BUILD_ID}:${process.env.BUILDKITE_JOB_ID}`}}async function KG(r){let[e,t,n]=await Promise.all([Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Zu(o):void 0;return{ciProvider:"AzureDevOps",gitCommitSha:process.env["Build.SourceVersion"],gitCommitShaShort:process.env["Build.SourceVersion"]?.slice(0,6),gitCommitTimestamp:e?new Date(e):void 0,gitBranchName:process.env["System.PullRequest.SourceBranch"]??process.env["Build.SourceBranchName"],gitOriginUrl:o,gitCommitMessage:t,gitCommitAuthorName:n,githubRepository:i?s:void 0,gitlabProjectPath:a?s:void 0,pipelineId:`${process.env["System.JobId"]}:${process.env["System.JobAttempt"]}`}}async function YG(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([Ue(r,ke.revparse(["HEAD"])),Ue(r,ke.revparse(["--short","HEAD"])),Ue(r,ke.revparse(["--abbrev-ref","HEAD"])),Ue(r,ke.listRemote(["--get-url","origin"])),Ue(r,ke.show(["--no-patch","--format=%ci"])),Ue(r,ke.show(["-s","--pretty=%B"])),Ue(r,ke.show(["-s","--pretty=%an"])),e?Ue(r,ke.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),zG(r)]),d=l?await Ue(r,ke.show(["--no-patch","--format=%ci",l])):void 0,m=i?.includes("github.com"),p=i?.includes("gitlab.com"),g=i?Zu(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,E=u["user.username"]||void 0,b=await GG(r,i,u)??E??void 0;return{ciProvider:"none",gitCommitSha:t,gitCommitShaShort:n,gitBranchName:o,gitOriginUrl:i,gitCommitTimestamp:a?new Date(a):void 0,gitCommitMessage:s,gitCommitAuthorName:c,gitLocalUsername:b,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:m?g:void 0,gitlabProjectPath:p?g:void 0,pipelineId:void 0}}async function XG(){let r=process.env._HEAD_REPO_URL;return{ciProvider:"GCPCloudBuild",gitCommitSha:process.env.COMMIT_SHA,gitCommitShaShort:process.env.COMMIT_SHA?.slice(0,6),gitBranchName:process.env.BRANCH_NAME,gitOriginUrl:r?process.env._HEAD_REPO_URL:void 0,gitCommitTimestamp:void 0,gitCommitMessage:void 0,gitCommitAuthorName:void 0,githubRepository:r?process.env.REPO_FULL_NAME:void 0,pipelineId:`${process.env.PROJECT_ID}:${process.env.BUILD_ID}`}}async function JG(r){let e=r.config.gitProtectedBranches??[];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function Ns(r,e){let t=VG();if(!t)return YG(r,e);switch(t){case"GithubActions":return WG(r);case"GitlabCI":return jG(r);case"CircleCI":return $G(r);case"Buildkite":return qG(r);case"AzureDevOps":return KG(r);case"GCPCloudBuild":return XG()}}async function QG(r,e,t,n){let o=n;if(!n.gitCommitSha)return o;if(n.gitMainBranch&&(!o.lastCommitOnMainSha||!o.lastCommitOnMainTimestamp))try{let i=await e.getMergeBaseCommitFromGitlab(t,n.gitMainBranch,n.gitCommitSha);o={...o,lastCommitOnMainSha:i.sha,lastCommitOnMainTimestamp:i.committer.date}}catch(i){r.warn({err:i},"Failed to get merge base commit from Gitlab")}if(!o.gitCommitTimestamp||!o.gitCommitAuthorName||!o.gitCommitMessage||!o.gitCommitAuthorName)try{let i=await e.getCommitFromGitlab(t,n.gitCommitSha);i&&(o={...o,gitCommitTimestamp:o.gitCommitTimestamp??i.committer.date,gitCommitAuthorName:o.gitCommitAuthorName??i.author.name,gitCommitMessage:o.gitCommitMessage??i.message})}catch(i){r.warn({err:i},"Failed to get commit from Gitlab")}if(n.gitBranchName&&n.gitBranchName===n.gitMainBranch&&!o.mergedGitBranchName)try{let i=await e.getMergedBranchFromGitlab(t,n.gitBranchName??"",n.gitCommitSha);i.mergedBranch&&(o={...o,mergedGitBranchName:i.mergedBranch})}catch(i){r.warn({err:i},"Failed to get merged branch from Gitlab")}return o}async function ZG(r,e,t,n,o){let i=o;if(!o.gitCommitSha)return i;if(o.gitMainBranch&&(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp))try{let a=await e.getMergeBaseCommitFromGithub(t,n,o.gitMainBranch,o.gitCommitSha);i={...i,lastCommitOnMainSha:a.sha,lastCommitOnMainTimestamp:a.committer.date}}catch(a){r.warn({err:a},"Failed to get merge base commit from GitHub")}if(!i.gitCommitTimestamp||!i.gitCommitAuthorName||!i.gitCommitMessage||!i.gitCommitAuthorName)try{let a=await e.getCommitFromGithub(t,n,o.gitCommitSha);a&&(i={...i,gitCommitTimestamp:i.gitCommitTimestamp??a.committer.date,gitCommitAuthorName:i.gitCommitAuthorName??a.author.name,gitCommitMessage:i.gitCommitMessage??a.message})}catch(a){r.warn({err:a},"Failed to get commit from GitHub")}if(o.gitBranchName&&o.gitBranchName===o.gitMainBranch&&!i.mergedGitBranchName)try{let a=await e.getMergedBranchFromGithub(t,n,o.gitBranchName??"",o.gitCommitSha);a.mergedBranch&&(i={...i,mergedGitBranchName:a.mergedBranch})}catch(a){r.warn({err:a},"Failed to get merged branch from GitHub")}return i}async function eV(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await ZG(r,e,n,o,t)}else if(t.gitlabProjectPath)return await QG(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function ji(r,e,t){let n=await JG(t),o=await Ns(r,n.gitMainBranch),i={...n,...o};(!i.lastCommitOnMainSha||!i.lastCommitOnMainTimestamp)&&i.gitBranchName===n.gitMainBranch&&(i.lastCommitOnMainSha=i.gitCommitSha,i.lastCommitOnMainTimestamp=i.gitCommitTimestamp);let a=await eV(r,e,i);return{...n,...o,...a}}import{diff as hM}from"deep-object-diff";import Yn from"fs";import{cloneDeep as tV}from"lodash-es";import ed from"path";import{v4 as rV}from"uuid";import Ds from"yaml";function fM(r,e){let t=`${nn(e)}.module.yaml`,n=ed.join(ed.dirname(r),t);if(Yn.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return Yn.renameSync(r,n),n}function SM({content:r,schemaVersion:e,momenticFiles:t,project:n,forceSaveOnNoDiffs:o}){let i=t.mobileModules[r.moduleId]?.fullFilePath,a=t.mobileModules[r.moduleId]?.name;if(!i||!Yn.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=Yn.readFileSync(i,"utf-8"),c=Ds.parse(s),l={...c,...r,schemaVersion:e},u=wo({fileType:De.MOBILE_MODULE,...Da.parse(l),steps:Vt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,m=hM(u,c);if(m&&Object.keys(m).length===0&&!o&&!d)return;let p=Ds.stringify(u);Yn.writeFileSync(i,p,"utf-8");let g;d&&(g=fM(i,r.name)),Kn(g||i,n.config)}function yM({moduleId:r,patch:e,momenticFiles:t,project:n,logger:o}){let i=t.mobileModules[r]?.fullFilePath;if(!i)throw new Error(`Tried to update mobile module ${r} that could not be found on disk`);let a=ks(i,o),s={...a,...e},c=wo({fileType:De.MOBILE_MODULE,...Ll.parse(s)}),l=hM(c,a);if(l&&Object.keys(l).length===0)return;let u=Ds.stringify(c);Yn.writeFileSync(i,u,"utf-8");let d;e.name&&(d=fM(i,e.name)),Kn(d||i,n.config)}async function bM({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=nn(r),s=ed.join(o,`${a}.module.yaml`),c=rV(),{stepsToSave:l}=await $r({steps:n}),u={schemaVersion:Cn,moduleId:c,description:e,enabled:t},d={fileType:De.MOBILE_MODULE,...u,steps:l},m=Ds.stringify(Yy.parse(d));return Yn.writeFileSync(s,m,"utf-8"),Kn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function ks(r,e){let t=Yn.readFileSync(r,"utf-8"),n=Ds.parse(t);try{return{...Ll.parse(n),name:ed.basename(r,".module.yaml")}}catch(o){throw e.error({err:o,moduleFilePath:r,moduleContents:t},`${r} does not parse as a valid Momentic mobile module`),o}}async function fh(r,e,t,n){let o=ks(r.fullFilePath,t),{resolvedSteps:i}=await eu({rawSteps:o.steps,resolvedModuleCache:n||{},onFetchModule:async s=>{let c=e.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Could not find mobile module with id ${s}`);return ks(c,t)},logger:t,metadata:{id:o.moduleId,schemaVersion:o.schemaVersion}}),a={...o,name:r.name,description:o.description||void 0,steps:i};return n&&(n[r.id]=tV(a)),a}async function EM(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await fh(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as nV}from"crypto";import Do from"fs";import yh from"path";import td from"yaml";import Sh from"zod";function TM({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${nn(r)}.test.yaml`,s=yh.join(o,a);if(Do.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:De.MOBILE_TEST,id:nV(),description:e,schemaVersion:oo,settings:n,steps:t},l=td.stringify(c);return Do.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function oV(r){if(!Do.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Do.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
4388
+ `),t=td.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function rd(r,e,t){let n=oV(r),o;try{o=Ar.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await Gw({rawStepLists:{steps:n.steps,beforeSteps:n.beforeSteps,afterSteps:n.afterSteps},logger:e,testMetadata:o,onFetchModule:async s=>{let c=t.mobileModules[s]?.fullFilePath;if(!c)throw new Error(`Mobile module ${s} not found`);return ks(c,e)}});return{...o,steps:i.steps}}async function vM({filePath:r,steps:e,settings:t,folder:n,project:o,momenticFiles:i,schemaVersion:a}){let s=yh.isAbsolute(r)?r:yh.join(n,r);if(!Do.existsSync(s))throw new Error(`Test file not found: ${s}`);let c=Do.readFileSync(s,"utf-8").replace(/\r\n|\r/g,`
4389
+ `),l=td.parse(c),u=Am.extend({steps:Sh.record(Sh.string(),Sh.unknown()).array()}).parse({...l,schemaVersion:a});if(u.fileType!==De.MOBILE_TEST)throw new Error(`File at '${s}' is not a mobile test (fileType=${u.fileType}).`);let d;e&&(d=await $r({steps:e}));let m={...u,...d?.stepsToSave!==void 0?{steps:d.stepsToSave}:{steps:u.steps},...t!==void 0?{settings:t}:{}},p=td.stringify(m);for(let g of d?.moduleUpdates??[])SM({content:g,schemaVersion:oo,momenticFiles:i,project:o});Do.writeFileSync(s,p,"utf-8"),Kn(s,o.config)}import{randomUUID as iV}from"crypto";import Xn from"fs";import $i from"path";var AM=new Set([".DS_Store","__MACOSX"]),wM={status:(r,e)=>{if(r.status===e.status)return r.status;if(r.status==="FAILED"||e.status==="FAILED")return"FAILED";if(r.status==="CANCELLED"||e.status==="CANCELLED")return"CANCELLED";if(r.status==="RETRYING"||e.status==="RETRYING")return"RETRYING";if(r.status==="RUNNING"||e.status==="RUNNING")return"RUNNING";if(r.status==="PENDING"||e.status==="PENDING")return"PENDING";throw new Error(`Invalid run status merge: ${r.status} and ${e.status}`)},startedAt:(r,e)=>r.startedAt<e.startedAt?r.startedAt:e.startedAt,updatedAt:(r,e)=>r.updatedAt>e.updatedAt?r.updatedAt:e.updatedAt,finishedAt:(r,e)=>!r.finishedAt||!e.finishedAt?new Date:r.finishedAt>e.finishedAt?r.finishedAt:e.finishedAt,gitCommitTimestamp:(r,e)=>{if(!(!r&&!e)){if(!r.gitCommitTimestamp||!e.gitCommitTimestamp||r.gitCommitTimestamp.getTime()!==e.gitCommitTimestamp.getTime())throw new Error(`Git commit timestamps must match to be merged: ${r.gitCommitTimestamp} and ${e.gitCommitTimestamp}`);return r.gitCommitTimestamp}},pipelineId:(r,e)=>r.pipelineId===e.pipelineId?r.pipelineId:!r.pipelineId&&e.pipelineId?e.pipelineId:!e.pipelineId&&r.pipelineId?r.pipelineId:r.startedAt<e.startedAt?e.pipelineId:r.pipelineId,labels:(r,e)=>{let t=new Set([...r.labels??[],...e.labels??[]]);return Array.from(t)}};function aV(r,e,t){if(wM[t]){let i=wM[t];return i(r,e)}let n=r[t],o=e[t];if(n!==o)throw new Error(`Metadata values for key "${t}" do not match: "${n}" vs "${o}"`);return n}var bh=class extends Error{constructor(e,t){let n=`${e} contains invalid Momentic results: ${t}. Please ensure that the path points to a folder containing only valid results. If you passed \`--output-dir test-results/results-1\` to the \`run\` command, your results path for merging should be \`test-results\`.`;super(n),this.name="InvalidMomenticResultsPathError"}};function CM(r,e){try{let t=$i.join(e,"metadata.json");return Jl.parse(JSON.parse(Xn.readFileSync(t,"utf-8")))}catch{throw new bh(r,e)}}function RM(r,e,t){let n=iV(),o=r.child({runGroupId:n});Xn.rmSync(e,{recursive:!0,force:!0});let i=Xn.readdirSync(t).filter(c=>!AM.has(c)).map(c=>$i.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);Xn.mkdirSync(e,{recursive:!0});let a={...CM(t,i[0]),id:n};for(let c of i){let l=$i.join(c,"runs");if(!Xn.existsSync(l))continue;let u=CM(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let m in u){if(m==="id")continue;let p=m;a[p]=aV(a,u,p)}let d=Xn.readdirSync(l);for(let m of d){if(AM.has(m))continue;let p=$i.join(l,m),g=$i.join(e,"runs",m);Xn.cpSync(p,g,{recursive:!0})}}let s=$i.join(e,"metadata.json");Xn.writeFileSync(s,JSON.stringify(a,null,2))}import MM from"adm-zip";import Ch from"fs";import{z as gV}from"zod";var U="v1",Eh="mobile-cli",ko="0.13.2";var sV=9e4,lV=3,cV=1500,uV=15e3,_r=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function dV(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Th=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return ko&&(e[Kl]=ko),Eh&&(e[Bb]=Eh),e}async sendRequest(e,t){let{retries:n=lV,requestTimeoutMs:o=sV,initialRetryDelayMs:i=cV,maxRetryDelayMs:a=uV,onFailedRequest:s}=t,c=n,l=n,u,d={path:e,baseUrl:this.baseUrl,method:t.method};for(;c>0;)try{return c--,await this.sendSingleRequestHelper(e,t,o)}catch(m){u=m;try{s?.(u)}catch{}if(m instanceof _r&&m.status>=400&&m.status<500)throw m;if(m instanceof Error&&m.name==="AbortError"&&(u=new Ln),c===0)throw u;let p=l-c,g=Math.min(i*Math.pow(2,p-1),a);await new Promise(h=>setTimeout(h,g))}throw this.logger.warn({...d,err:u},"Got fatal error response from Momentic server"),u}async sendSingleRequestHelper(e,t,n){let o={path:e,baseUrl:this.baseUrl,method:t.method},i=new AbortController,a=setTimeout(()=>i.abort(),n),s=()=>i.abort();t.signal&&t.signal.addEventListener("abort",s,{once:!0});let c=Date.now(),l={...this.getHeaders(),...t.extraHeaders};try{let u=await fetch(`${this.baseUrl}${e}`,{method:t.method,body:t.body?JSON.stringify(t.body):void 0,headers:l,signal:i.signal});if(!u.ok){let m=await dV(u);throw new _r(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}return this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server"),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},Zr=class extends Th{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[Fb]:this.mode??""}}};import{createAnthropic as mV}from"@ai-sdk/anthropic";function pV(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[Kl]:ko??"",...t&&{[Hb]:t},...n||{}};return o&&(i[zb]=JSON.stringify(o)),i}var nd=r=>e=>{let t=pV(r);return mV({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var Uo=class extends Zr{agentConfig;constructor(e,t){let n={...Py,...e};super(t),this.agentConfig=n}getAgentConfig(){return this.agentConfig}async rankChunksWithAi(e,t){let n={...e,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/recommend-chunks-ai`,{method:"POST",body:n,signal:t.abortSignal});return hy.parse(o)}async rankChunksWithRag(e,t){let n=await this.sendRequest(`/${U}/web-agent/recommend-chunks`,{method:"POST",body:{cliVersion:ko,...e},signal:t.abortSignal});return gy.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return gV.string().parse(t)}async getElementLocation(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.locator},o=await this.sendRequest(`/${U}/web-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return qb.parse(o)}async getAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.assertion},o=await this.sendRequest(`/${U}/web-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return Bm.parse(o)}async getLintStepResult(e,t){let n={...e,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/step`,{method:"POST",body:n,signal:t.abortSignal});return $b.parse(o)}async getLintMcpCopilotMessageResult(e,t){let n={message:e.message,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/lint/mcp-copilot`,{method:"POST",body:n,signal:t.abortSignal});return Vb.parse(o)}async getMcpCopilotConversationEvaluation(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/mcp-copilot-conversation-evaluator`,{method:"POST",body:n,signal:t.abortSignal});return Wb.parse(o)}async getMcpCopilotChatSummary(e,t){let n={messagesAndToolCalls:e.messagesAndToolCalls,disableCache:!!t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/mcp-copilot-chat-summary`,{method:"POST",body:n,signal:t.abortSignal});return jb.parse(o)}async getVisualAssertionResult(e,t){let n={...e,disableCache:!!t.disableCache,useConsensus:!!t.useConsensus,attemptNumber:t.attemptNumber,loggerTags:t.loggerTags,useMemory:t.useMemory,agentConfigVersion:this.agentConfig?.["visual-assertion"]},o=await this.sendRequest(`/${U}/web-agent/visual-assertion`,{method:"POST",body:n,signal:t.abortSignal});return Bm.parse(o)}async getAiActionCommand(e,t){let n=await this.sendRequest(`/${U}/web-agent/next-command-dynamic`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Gb.parse(n)}async getMultiturnAiActionCommand(e,t){return await this.sendRequest(`/${U}/web-agent/ai-action/next-command`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal})}async getMultiturnAiActionEvaluation(e,t){let n=await this.sendRequest(`/${U}/web-agent/ai-action/evaluate`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Jd.parse(n)}async getReverseMappedDescription(e,t){let n=await this.sendRequest(`/${U}/web-agent/reverse-mapped-description`,{method:"POST",body:{...e,disableCache:t.disableCache,loggerTags:t.loggerTags},signal:t.abortSignal});return Kb.parse(n)}async getTextExtraction(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags,agentConfigVersion:this.agentConfig?.["text-extraction"]},o=await this.sendRequest(`/${U}/web-agent/text-extraction`,{method:"POST",body:n,signal:t.abortSignal});return Yd.parse(o)}async getPageSummary(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/page-summary`,{method:"POST",body:n,signal:t.abortSignal});return qS.parse(o)}async getSmartWaitingDecision(e,t){let n={...e,disableCache:t.disableCache,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/web-agent/smart-waiting`,{method:"POST",body:n,signal:t.abortSignal});return KS.parse(o)}async getTestResultClassification(e,t){let n=await this.sendRequest(`/${U}/web-agent/result-classification`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return Dd.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return _y.parse(n)}async getAutohealingProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/autoheal-section`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return GS.parse(n)}async getFailureRecoveryProposal(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return jS.parse(n)}async getFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/web-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return WS.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return tf.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return nd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as vh}from"zod";var Pr=class extends Zr{constructor(e){super({...e,mode:void 0})}getAppUrl(){return this.baseUrl==="http://localhost:8000"?"http://localhost:3000":this.baseUrl.replace(/\/\/api/,"//app")}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{w.warn(`API key check failed: ${t.message}`)}});return sE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return nE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return Xb.parse(t)}async updateStepCaches(e,t){await this.sendRequest(`/${U}/cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Qb.parse(n)}async updateMobileStepCaches(e,t){await this.sendRequest(`/${U}/mobile-cache`,{method:"PATCH",body:e,extraHeaders:t,retries:3,requestTimeoutMs:1e4,initialRetryDelayMs:3e3})}async getMobileStepCacheForTest(e,t){let n=await this.sendRequest(`/${U}/mobile-cache`,{method:"POST",body:e,extraHeaders:t,retries:10,requestTimeoutMs:3e4,initialRetryDelayMs:3e3});return Zb.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Yb.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return aE.parse(t)}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return lE.parse(e)}async acquireCacheLock(e,t){let n=await this.sendRequest(`/${U}/result-cache/lock`,{method:"POST",body:e,signal:t,retries:3,requestTimeoutMs:3e4});return AE.parse(n)}async releaseCacheLock(e){await this.sendRequest(`/${U}/result-cache/lock`,{method:"DELETE",body:{key:e},retries:3,requestTimeoutMs:5e3})}async deleteCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"DELETE",body:e,retries:3,requestTimeoutMs:5e3})}async setCacheResult(e){await this.sendRequest(`/${U}/result-cache/entry`,{method:"PATCH",body:e,retries:3,requestTimeoutMs:5e3})}async getCacheResult(e){try{return await this.sendRequest(`/${U}/result-cache/entry`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(t){if(t instanceof Error&&t.message.includes("404"))return null;throw t}}async queueSuiteRuns(e){let t=await this.sendRequest(`/${U}/suites/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return cE.parse(t)}async bulkGetRunGroupStatus(e){let t={runGroupIds:e},n=await this.sendRequest(`/${U}/run-groups/status`,{method:"POST",body:t,retries:3,requestTimeoutMs:5e3});return uy.array().parse(n)}async uploadProposedSteps(e,t){try{await this.sendRequest(`/${U}/test-fragments/`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4})}catch(n){t.error({err:n},"Failed to upload proposed steps")}}async reportBillableEvents(e,t){try{await this.sendRequest(`/${U}/billing/events`,{method:"POST",body:t,retries:10,requestTimeoutMs:1e4})}catch(n){e.error({err:n},"Failed to report billable event")}}async fetchTestFragment(e){let t=await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return uE.parse(t)}async patchTestFragment(e,t){await this.sendRequest(`/${U}/test-fragments/${e}`,{method:"PATCH",body:t,retries:3,requestTimeoutMs:1e4})}async getPastTestResults(e,t){let n=await this.sendRequest(`/${U}/results/tests/${e}`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return dE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return mE.parse(e)}async startProcessingResultsUpload(e,t){let n=await this.sendRequest(`/${U}/results/uploads/${e}/process`,{method:"POST",body:t,retries:3,requestTimeoutMs:1e4});return pE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return RE.parse(t)}catch(t){return e.error({err:t},"Failed to fetch icon knowledge base"),null}}async saveNewIcons(e,t){try{await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3})}catch(n){t.error({err:n},"Failed to save new icons to icon knowledge base")}}async getMergeBaseCommitFromGithub(e,t,n,o){let i=new URLSearchParams;i.set("base",n),i.set("head",o);let a=await this.sendRequest(`/${U}/git/github/${e}/${t}/merge-base-commit?${i.toString()}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(a)}async getCommitFromGithub(e,t,n){let o=await this.sendRequest(`/${U}/git/github/${e}/${t}/commits/${n}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(o)}async getMergedBranchFromGithub(e,t,n,o){let i=encodeURIComponent(n),a=await this.sendRequest(`/${U}/git/github/${e}/${t}/${i}/${o}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vm.parse(a)}async getMergeBaseCommitFromGitlab(e,t,n){let o=new URLSearchParams;o.set("base",t),o.set("head",n);let i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/merge-base-commit?${o.toString()}`,{method:"GET",retries:3,requestTimeoutMs:5e3});return Ga.parse(a)}async getCommitFromGitlab(e,t){let n=encodeURIComponent(e),o=await this.sendRequest(`/${U}/git/gitlab/${n}/commits/${t}`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Ga.parse(o)}async getMergedBranchFromGitlab(e,t,n){let o=encodeURIComponent(t),i=encodeURIComponent(e),a=await this.sendRequest(`/${U}/git/gitlab/${i}/${o}/${n}/merged-branch`,{method:"GET",retries:3,requestTimeoutMs:1e4});return Vm.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return vh.record(vh.string(),vh.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return gE.parse(e)}async quarantineTest(e,t,n){await this.sendRequest(`/${U}/quarantine`,{method:"POST",body:{testId:e.id,testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async unquarantineTest(e,t,n){await this.sendRequest(`/${U}/quarantine/${e.id}`,{method:"DELETE",body:{testName:e.name,reason:t,...n??{}},retries:3,requestTimeoutMs:1e4})}async createAndroidEmulator(e){let t=await this.sendRequest(`/${U}/limbar/android`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return hE.parse(t)}async extendAndroidEmulatorTtl(e){try{await this.sendRequest(`/${U}/limbar/android/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async generateAndroidAssetUrls({channel:e,tag:t,md5:n}){let o={channel:e,tag:t,md5:n},i=await this.sendRequest(`/${U}/limbar/android/upload-url`,{method:"POST",retries:3,body:o,requestTimeoutMs:15e3,logResponse:!0});return fE.parse(i)}async deleteAndroidEmulator(e){await this.sendRequest(`/${U}/limbar/android/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async getAndroidAssets(){let e=await this.sendRequest(`/${U}/limbar/assets`,{method:"GET",retries:3,requestTimeoutMs:1e4});return SE.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}};async function Ah(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(w.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),w.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return w.debug("Got auth info from API"),n}var od=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var qi=class extends Zr{generator;constructor(e,t){super(e),this.generator=t}async runTemplateMatching(e,t={}){let n=await this.sendRequest(`/${U}/web-agent/template-matching`,{method:"POST",body:e,signal:t?.signal});return rf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var Ki=class{constructor(e,t){this.client=e;this.orgId=t}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async uploadScreenshot(e){return(await this.client.uploadScreenshot({screenshot:e.toString("base64")})).key}async releaseCacheLock(e){return this.client.releaseCacheLock(e)}async deleteCacheResult(e){return this.client.deleteCacheResult(e)}async setCacheResult(e){return this.client.setCacheResult(e)}async getCacheResult(e){return this.client.getCacheResult(e)}fetchIconKnowledgeBase(e){return this.client.fetchIconKnowledgeBase(e)}saveNewIcons(e,t){return this.client.saveNewIcons(e,t)}};import{Faker as hV,en as fV}from"@faker-js/faker";var Yi="v1",Xi=class{httpClient;fakerInstance;type="API_CLIENT";sms={send:this.sendSms.bind(this),fetchLatest:this.fetchLatestSms.bind(this)};email={send:this.sendEmail.bind(this),fetchLatest:this.fetchLatestEmail.bind(this),fetchAll:this.fetchAllEmails.bind(this)};ai={generate:this.sendAiGenerate.bind(this)};constructor(e){this.httpClient=e.httpClient,e.fakerSeed&&(this.fakerInstance=new hV({locale:fV}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${Yi}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof _r?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${Yi}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${Yi}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${Yi}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof _r?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function xM(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var id=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await xM(n,"application/zip",t);if(!i.ok)throw new Error(`Failed to upload test results: ${await i.text()}`);let{runGroupId:a}=await this.client.startProcessingResultsUpload(o,{runGroupId:e});return a}};var Ji=class extends Zr{constructor(e){super(e)}async getMobileElementLocation(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/mobile-agent/locate-element`,{method:"POST",body:n,signal:t.abortSignal});return eb.parse(o)}async evaluateMobileAssertion(e,t){let n={...e,disableCache:t.disableCache,useMemory:t.useMemory,agentConfigVersion:t.agentConfigVersion,loggerTags:t.loggerTags},o=await this.sendRequest(`/${U}/mobile-agent/assertion`,{method:"POST",body:n,signal:t.abortSignal});return nb.parse(o)}async getMobileFailureRecoveryPlan(e,t){let n=await this.sendRequest(`/${U}/mobile-agent/failure-recovery-plan`,{method:"POST",body:{...e,loggerTags:t.loggerTags},signal:t.abortSignal});return ab.parse(n)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return nd({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function ad({orgId:r,client:e,gitMetadata:t,regenerateCache:n,alwaysSaveCache:o,noCache:i}){return i?new Xl:new wh(r,e,t,{alwaysSaveCache:o,regenerateCache:n})}var wh=class{constructor(e,t,n,o){this.orgId=e;this.client=t;let{regenerateCache:i,alwaysSaveCache:a}=o,{gitBranchName:s,gitProtectedBranches:c}=n;this.cacheHeaders=zm(n),this.readCaches=!i;let l=s&&c.includes(s);a||!l?this.writeCaches=!0:this.writeCaches=!1}cacheHeaders;readCaches;writeCaches;async saveEntries({entries:e,testId:t,logger:n}){if(!this.writeCaches){n.debug("Skipping cache storage because branch is protected");return}try{await this.client.updateMobileStepCaches({entries:e,testId:t},this.cacheHeaders)}catch(o){n.warn({err:o},"Failed to save mobile step cache entries, continuing...")}}async resolveEntries(e){if(!this.readCaches){e.logger.debug("Skipping cache resolution because of regenerate flag");return}let{steps:t}=e.stepLists,n=await this.client.getMobileStepCacheForTest({testId:e.testId},this.cacheHeaders);if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}for(let i of[t])i&&ag({steps:i,stepCacheEntries:n,logger:e.logger});let{cachesToSave:o}=await $r({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};import sd from"path";function SV(r){let e=new MM,t=sd.join(r,"metadata.json"),n=Jl.parse(JSON.parse(Ch.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of Ch.readdirSync(sd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new MM(sd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(sd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function ld(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!Ch.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new id(e);try{let{runGroupId:i,buffer:a}=SV(n),s=await o.uploadResultsArchive(i,a),c=`${e.getAppUrl()}/run-groups/${s}`;t.success(`Successfully uploaded test results. Once processed, your results can be found at ${c}`);return}catch(i){let a;i instanceof Error?a=i.message:typeof i=="string"?a=i:a="Unknown error",t.error(`Failed to upload test results: ${a}.`);return}}import yV from"adm-zip";import vt from"fs";import Xt from"path";var Us=class r{constructor(e){this.filePath=e;vt.rmSync(this.filePath,{recursive:!0,force:!0}),vt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Xt.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){vt.mkdirSync(Xt.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Xt.join(this.filePath,e);if(vt.existsSync(t))return vt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.filePath,t);try{vt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Xt.join(this.filePath,e);return vt.createWriteStream(t)}createRunArchive(e){return new Rh(Xt.join(this.filePath,"runs"),e)}},Rh=class{constructor(e,t){this.filePath=e;this.tempPath=Xt.join(e,`temp-storage-${t}`),this.finalPath=Xt.join(e,`${t}.zip`),vt.rmSync(this.tempPath,{recursive:!0,force:!0}),vt.rmSync(this.finalPath,{recursive:!0,force:!0}),vt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Xt.join(this.tempPath,e);if(vt.existsSync(t))return vt.readFileSync(t)}mkdir(e){vt.mkdirSync(Xt.join(this.tempPath,e),{recursive:!0})}cd(e){return new Us(Xt.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Xt.join(this.tempPath,t);vt.writeFileSync(o,n)}createFileStream(e){let t=Xt.join(this.tempPath,e);return vt.createWriteStream(t)}close(){let e=new yV;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();vt.writeFileSync(this.finalPath,t),vt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import V1e from"adm-zip";import bd from"fs";import qM from"body-parser";import HV from"cors";import GV from"dedent";import{Router as vV}from"express";import Ht from"fs";import{globSync as AV}from"glob";import St from"path";import cd from"fs";import bV from"path";var EV=new pu(30,60*1e3),Ph="https://api.momentic.ai",Mh,PM=r=>{Ph=r},Ih=()=>Ph,Fs=()=>Mh;var Qi,_h,_M,IM=async r=>{if(Mh&&Qi&&_M)return Qi;let e=new Pr({baseUrl:Ph,apiKey:r,logger:w});Mh=e;try{let t=await e.getAuthInfo();return Qi=t.orgId,_h=t.userId,_M=r,Qi}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Zi=()=>{if(!Qi)throw new Error("Your organization ID is invalid.");return Qi},ud=()=>{if(!_h)throw new Error("Your user ID is invalid.");return _h};var Oh,xh,OM=(r,e)=>{Oh=r,xh?.abort(),xh=new AbortController;let t=xh.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=bV.resolve(r.rootDir,o.envFile);try{if(cd.lstatSync(i).isSymbolicLink())return;cd.existsSync(i)&&n.push(i)}catch(a){w.warn({err:a},`Failed to check if env file ${i} exists`)}});try{TV({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){w.error({err:o},"Failed to start config file watchers")}},Fe=()=>Oh;function TV({filesToWatch:r,revalidator:e,signal:t,project:n}){w.debug("Starting watch on the following files:"),r.forEach(o=>{w.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(EV.increment("setLocalProject")&&w.warn(`A file change under the ${n.rootDir} directory has caused Momentic to reload its configuration more than 30 times in the last minute. Rapid changes to files may indicate your momentic.config.yaml 'include' glob is incorrect. Please ensure temporary, library, and auto-generated files are not included in Momentic's context.`),Oh=await Promise.resolve(e(n.configFilePath)))};cd.watchFile(o,{persistent:!1},i);let a=()=>{cd.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Ne(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var zs=vV();function Bs(r){let e=Fe(),t=St.dirname(e.configFilePath);return St.join(t,...r)}function wV(r){let e=Fe(),t=St.dirname(e.configFilePath),n=St.relative(t,r);return n?n.split(St.sep):[]}function CV(r,e){let t=Ht.statSync(r),n=wV(r);return Lm.parse({name:e,absolutePath:r,relativePath:n.join(St.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}zs.post("/",Ne(async(r,e,t)=>{let n;try{n=wb.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=Bs(n);if(!Ht.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(St.sep)}`});return}if(!Ht.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}let a=Fe(),s=Array.from(a.config.exclude??[]).concat(Vl),l=AV("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let m=St.join(o,d);return CV(m,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));zs.put("/",Ne(async(r,e,t)=>{let n;try{n=Cb.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=Bs(n);if(Ht.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(St.sep)}`,pathSegments:n});return}Ht.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(St.sep)}`,pathSegments:n};e.status(201).json(i)}));zs.patch("/",Ne(async(r,e,t)=>{let n,o;try{let l=Rb.parse(r.body);n=l.pathSegments,o=l.newPathSegments}catch(l){e.status(400).json({error:`Failed to parse folder update body: ${l}`});return}let i=Bs(n),a=Bs(o);if(!Ht.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(St.sep)}`});return}if(Ht.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(St.sep)}`});return}let s=St.dirname(a);Ht.existsSync(s)||Ht.mkdirSync(s,{recursive:!0}),Ht.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(St.sep)} to ${o.join(St.sep)}`,pathSegments:o};e.status(200).json(c)}));zs.delete("/",Ne(async(r,e,t)=>{let n,o=!0;try{let c=xb.parse(r.body);n=c.pathSegments,o=c.recursive??!0}catch(c){e.status(400).json({error:`Failed to parse folder delete body: ${c}`});return}let i=Bs(n);if(!Ht.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(St.sep)}`,pathSegments:n});return}if(!Ht.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(St.sep)}`});return}if(o)Ht.rmSync(i,{recursive:!0,force:!0});else{if(Ht.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Ht.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var Lh=zs;import{Router as MV}from"express";import{hostname as RV}from"os";var xV="0.13.2",Hs=fi({app:"desktop-server",hostname:RV(),disableConsoleLogs:!0}).child({cliVersion:xV});(async()=>{try{let r=await Ns(Hs);r.gitBranchName&&Hs.addBinding("branch",r.gitBranchName)}catch{}})();var LM=MV();LM.get("/",async(r,e)=>{let t=Fe(),n=Fs();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await ji(Hs,n,t);e.status(200).json(o)});var Nh=LM;import VV from"events";import KM,{Router as WV}from"express";import jV from"http";import $V from"path";var dd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}hasActiveLocalSession(){for(let e of this.sessions.values())if(e.local===!0)return!0;return!1}async removeSession(e,t){let n=this.sessions.get(e);if(n)try{await n.cleanup?.(),t.info({sessionId:e,emulatorName:n.emulatorName},"Android emulator cleaned up")}catch(o){t.error({err:o},"Error during Android session cleanup")}finally{this.sessions.delete(e)}}async removeAllSessions(e){let t=Array.from(this.sessions.keys());await Promise.all(t.map(n=>this.removeSession(n,e)))}};var md=new dd;import{Router as PV}from"express";import{existsSync as IV}from"fs";import OV from"path";import{hostname as _V}from"os";var Dh="0.13.2",mt=fi({app:"mobile-desktop-server",hostname:_V(),disableConsoleLogs:!0}).child({cliVersion:Dh});(async()=>{try{let r=await Ns(mt);r.gitBranchName&&mt.addBinding("branch",r.gitBranchName)}catch{}})();var kh=PV();kh.get("/",Ne(async(r,e)=>{let t=Fs();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));kh.post("/upload-url",Ne(async(r,e)=>{let t;try{t=Lb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Fs();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=OV.resolve(t.filePath);if(!IV(o)){e.status(400).json({error:`File not found: ${o}`});return}await au({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:mt}),e.sendStatus(204)}));var NM=kh;import{Router as DV}from"express";import{Router as LV}from"express";import DM from"fs";import NV from"path";var Gs=LV();async function Uh(r){return(await EM(r,mt)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){w.warn(`Found a dangling mobile module with ID ${n.moduleId} that could not be found on disk.`);return}return{...o,content:n}}).filter(n=>n!==void 0)}Gs.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await Uh(n);e.status(200).json(o)}));Gs.get("/:moduleId",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await yr(Fe()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await fh(n,t,w);e.json(o)}catch(o){e.status(400).json({err:o})}}));Gs.patch("/:moduleId/metadata",Ne(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=Nb.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Fe(),o=await yr(n);yM({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:w,project:n}),e.status(201).json({message:"ok"})}));Gs.post("/",Ne(async(r,e)=>{let t;try{t=Db.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{ba(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=Fe(),i=(await yr(n)).mobileModules;if(Object.values(i).find(c=>c.name===t.name)){e.status(400).json({error:`A mobile module with the name "${t.name}" already exists. Please choose a different name.`});return}let a=NV.join(n.rootDir,t.folderPath??"");if(!DM.existsSync(a)||!DM.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await bM({...t,folder:a,project:n});e.status(201).json(s)}));var kM=Gs;var UM=DV();UM.get("/",Ne(async(r,e)=>{let t=Fe(),n=await yr(t),o=await Uh(n),i=new Set;n?.tests&&Object.values(n.tests).forEach(l=>{l.labels?.forEach(u=>i.add(u))});let a=Array.from(i).sort(),s=Object.values(n.mobileTests),c={labels:a,modules:o,tests:s};e.status(200).json(c)}));var FM=UM;import{Router as kV}from"express";var Fh=kV();Fh.get("/",Ne((r,e)=>{let t=iM(Fe(),mt);e.status(200).json(t)}));Fh.get("/names",Ne((r,e)=>{let n=Fe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));var BM=Fh;import{Router as UV}from"express";var zM=UV();zM.get("/",(r,e)=>{e.status(200).json({userId:ud(),orgId:Zi(),cliVersion:Dh??"0.0.0"})});var HM=zM;import{Router as FV}from"express";var GM=FV();GM.get("/",Ne(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=md.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4390
+ `).filter(s=>s.trim().startsWith("package:")).map(s=>s.replace("package:","").trim()).filter(s=>s.length>0&&!s.startsWith("io.appium"))||[];e.status(200).json({packages:a})}catch(o){mt.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var VM=GM;import{Router as BV}from"express";import Bh from"path";var pd=BV();pd.patch("/:testPath",Ne(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=Ob.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0){e.status(400).json({error:"At least one of steps or settings is required"});return}let o=Fe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await yr(o);await vM({filePath:i,steps:n.steps,settings:n.settings,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:oo});let s={message:"ok"};e.status(200).json(s)}));pd.post("/",Ne((r,e)=>{let t;try{t=Ib.parse(r.body)}catch(g){e.status(400).json({error:`Invalid request body: ${g}`});return}let{name:n,description:o,settings:i,pathSegments:a}=t;if(!n||typeof n!="string"){e.status(400).json({error:"Missing or invalid 'name' in body"});return}try{ba(n)}catch(g){e.status(400).json({error:g.message});return}let s=Fe(),c=Bh.join(s.rootDir,...a),{fullPath:l,testId:u}=TM({name:n,description:o,steps:[],settings:i,folder:c}),d=Bh.basename(l),m=Bh.relative(s.rootDir,l),p={id:u,fileName:d,fullPath:l,relativeFilePath:m};e.status(201).json(p)}));pd.get("/:fileName",Ne(async(r,e)=>{let t=r.params.fileName;if(!t){e.status(400).json({error:"Missing fileName in path"});return}let n=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,o=Fe(),i=await yr(o),s=await rd(n,mt,i);e.status(200).json(s)}));var WM=pd;import{Router as zV}from"express";var jM=zV();jM.get("/",Ne((r,e)=>{let t=Fe(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var $M=jM;var gd=class extends Ki{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=Fe();return Is(t,o,w)}};var YM="10mb";async function XM(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&PM(n),await IM(t);let u=Zi(),d=ud(),m=r.logger.child({orgId:u,userId:d});OM(i,A=>Os({configFilePath:A}));let p=KM();p.use(HV()),p.use(qM.json({limit:YM})),p.use(qM.urlencoded({extended:!1,limit:YM}));let g=WV();if(g.use("/folders",Lh),g.use("/entities",FM),g.use("/identify",HM),g.use("/mobile-tests",WM),g.use("/mobile-modules",kM),g.use("/assets",NM),g.use("/git",Nh),g.use("/environments",BM),g.use("/installed-packages",VM),g.use("/settings",$M),p.use("/api",g),p.use((A,I,k)=>{w.debug({url:A.url,path:A.path,query:A.query,method:A.method,body:A.body,headers:A.rawHeaders,client:A.ip},"Incoming request on mobile-desktop-server"),I.on("close",()=>{I.statusCode>=400&&(w.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"),mt.error({url:A.url,method:A.method,statusCode:I.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),p.use((A,I,k,W)=>{if(A instanceof Error&&A.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}w.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),mt.error({stack:A.stack,msg:A.message,err:A,url:I.url,method:I.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${A.message}`)}),o){let A=KM.static(o,{setHeaders:I=>{I.setHeader("Cache-Control","no-cache")},redirect:!1});p.use(A),p.use("*",(I,k)=>{k.sendFile($V.join(o,"index.html"))})}let h=jV.createServer(p),f=`http://localhost:${e}`;await new Promise(A=>{try{h.listen(e,()=>{m.info(`Mobile desktop server is running at ${f}`),A()})}catch(I){I.message.includes("EADDRINUSE")?qV(e):w.error(`An unexpected error occurred while starting the server: ${I.message}`),process.exit(1)}});let b={type:"API_KEY",baseUrl:Ih(),apiKey:t,logger:m},C=new Pr(b),R=Fe(),v={...b,mode:"interactive"},{dispose:M}=nM({baseServer:h,logger:m,authorization:b,globalStateManager:md,getOrgId:()=>Zi(),getGitMetadata:async()=>await ji(m,C,R),androidDriverFactory:async({socket:A,logger:I,creationOpts:k})=>{let W=Math.floor(Math.random()*1e4)+4e4,oe=await tc(W,"appium");return iu({logger:I,driverLogLevel:a,apiClient:C,creationOpts:k,socket:A,appiumPort:oe,sessionId:A.id,orgId:Zi(),onStatusUpdate:Te=>{A.emit("connectionStatusUpdate",{message:Te})}})},mobileGeneratorFactory:async A=>new Ji({baseUrl:Ih(),apiKey:t,logger:m,mode:"interactive"}),browserGeneratorFactory:async A=>new Uo(R.config.ai?.agentConfig,v),browserEnricherFactory:async A=>new qi(v,new Uo(R.config.ai?.agentConfig,v)),storageFactory:async A=>new gd(C,A),cacheStorageFactory:async(A,I)=>ad({orgId:A,client:C,gitMetadata:I,regenerateCache:s??!1,noCache:l??!1,alwaysSaveCache:c??!1}),localToolsFactory:async()=>new Xi({httpClient:C,fakerSeed:void 0}),keepSessionAlive:A=>C.extendAndroidEmulatorTtl(A),settingsFactory:async()=>({emulator:{},ai:{},...R.config})});process.once("SIGUSR2",async()=>{return;try{await M(),await Tt.flush()}catch(A){w.error({err:A},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{w.info("SIGTERM in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{w.info("SIGINT in Momentic mobile app received");try{await M(),await Tt.flush()}finally{h.close(()=>process.exit(0))}})}VV.setMaxListeners(25);process.on("warning",r=>{mt.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{mt.error({err:r},"Uncaught exception on mobile-desktop-server"),w.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{mt.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),w.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function qV(r){w.error(GV`Port ${r} is already in use by another process. Please close the other process and try again.
4391
4391
  Using Bash on MacOS or Linux:
4392
4392
  lsof -t -i :58888 | xargs kill -9
4393
4393
 
4394
4394
  Using Command Prompt on Windows:
4395
4395
  for /f "tokens=5" %a in ('netstat -ano ^| findstr :58888') do taskkill /PID %a /F
4396
- `)}import iW from"open";import yd from"path";import{fileURLToPath as aW}from"url";import{InvalidArgumentError as pd,Option as rt}from"@commander-js/extra-typings";import{z as HV}from"zod";var jM=58890;function gd(r){let e=parseInt(r,10);if(isNaN(e))throw new pd("Not a number.");return e}var Gs=new rt("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new pd("API key is required.");return r}).makeOptionMandatory(),Bh=new rt("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Vs=new rt("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return HV.string().url().parse(r),r}catch{throw new pd("Not a valid URL.")}}),zh=new rt("-y, --yes","Skip all confirmation prompts.").env("CI"),Hh=new rt("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.").implies({disableCache:!1,saveCache:!0}),Gh=new rt("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI").implies({disableCache:!1}),Vh=new rt("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1,regenerateCache:!1}),Wh=new rt("--tag <tag>","Tag identifier for the asset."),$M=new rt("--channel <channel>","Channel name for the asset."),qM=new rt("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),KM=new rt("--env <env>","Environment to run all tests in (overrides test-level configuration)."),YM=new rt("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),XM=new rt("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),JM=new rt("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(gd),QM=new rt("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=gd(r);if(e<1)throw new pd("Shard index must be greater than 0.");return e}),ZM=new rt("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(gd),jh=new rt("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),e_=new rt("--upload-results","Upload test results to Momentic Cloud.").default(!1),$h=new rt("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),t_=new rt("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),r_=new rt("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(gd);import{randomUUID as ZV}from"crypto";import{existsSync as eW}from"fs";import qh from"fs";import hd from"path";import{cwd as VV}from"process";async function n_({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,logger:a,quarantinedTestReasons:s}){let c=new Set;if(r&&r.length>0){let u=r.some(m=>qh.existsSync(m)),d=VV();u?(d!==t.rootDir&&a.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),a.info(`Reading tests from the following local file paths:
4396
+ `)}import mW from"open";import Ed from"path";import{fileURLToPath as pW}from"url";import{InvalidArgumentError as hd,Option as rt}from"@commander-js/extra-typings";import{z as KV}from"zod";var JM=58890;function fd(r){let e=parseInt(r,10);if(isNaN(e))throw new hd("Not a number.");return e}var Vs=new rt("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new hd("API key is required.");return r}).makeOptionMandatory(),zh=new rt("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Ws=new rt("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return KV.string().url().parse(r),r}catch{throw new hd("Not a valid URL.")}}),Hh=new rt("-y, --yes","Skip all confirmation prompts.").env("CI"),Gh=new rt("--regenerate-cache","Regenerate all caches by starting from an empty cache state. This flag is useful for completely regenerating caches after changing configuration options. Warning: using this option will cause all steps to run without any cached data, resulting in significantly longer execution times.").implies({disableCache:!1,saveCache:!0}),Vh=new rt("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI").implies({disableCache:!1}),Wh=new rt("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1,regenerateCache:!1}),jh=new rt("--tag <tag>","Tag identifier for the asset."),QM=new rt("--channel <channel>","Channel name for the asset."),ZM=new rt("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),e_=new rt("--env <env>","Environment to run all tests in (overrides test-level configuration)."),t_=new rt("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),r_=new rt("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),n_=new rt("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(fd),o_=new rt("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=fd(r);if(e<1)throw new hd("Shard index must be greater than 0.");return e}),i_=new rt("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(fd),$h=new rt("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),a_=new rt("--upload-results","Upload test results to Momentic Cloud.").default(!1),qh=new rt("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),s_=new rt("--ignore-quarantine","Run all tests even if they are quarantined. This is useful for validating that quarantined tests are fixed before moving them out of quarantine.").implies({skipQuarantined:!1,onlyQuarantined:!1}),l_=new rt("--timeout-minutes <timeoutMinutes>","Maximum number of minutes to run tests before stopping. When the timeout is reached, tests will stop and current results will be printed.").argParser(fd);import{randomUUID as aW}from"crypto";import{existsSync as sW}from"fs";import Kh from"fs";import Sd from"path";import{cwd as XV}from"process";async function c_({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,logger:a,quarantinedTestReasons:s}){let c=new Set;if(r&&r.length>0){let u=r.some(m=>Kh.existsSync(m)),d=XV();u?(d!==t.rootDir&&a.warn(`The current working directory ('${d}') is different from the project root directory ('${t.rootDir}'). All test path arguments will be resolved relative to the current working directory and only those tests matched by the project inclusion configuration will be ran. To avoid confusion, Momentic strongly recommends running the CLI from the project root directory or using substring filters rather than file paths.`),a.info(`Reading tests from the following local file paths:
4397
4397
  - ${r.join(`
4398
4398
  - `)}
4399
- `),r.forEach(m=>{if(!qh.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let g,p;try{g=qh.statSync(m),p=g.isDirectory()}catch(f){a.warn({err:f},`Skipping path ${m} because it cannot be read`);return}let h=hd.resolve(m);Object.values(e.mobileTests).filter(f=>p?f.fullFilePath.startsWith(h):f.fullFilePath===h).forEach(f=>{c.add(f.fullFilePath)})})):(a.info("The arguments provided don't appear to be valid paths. Treating them as substrings instead... "),Object.values(e.mobileTests).forEach(m=>{r.some(g=>m.relativePath.includes(g))&&c.add(m.fullFilePath)}))}else{!n&&!await Xl("No test paths or substrings were provided. Do you want to run all tests?")&&(a.error("Cancelled by user."),process.exit(1));let u=Object.values(e.mobileTests);a.info(`Reading all ${u.length} mobile tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of Array.from(c)){let d=hd.relative(t.rootDir,u);o&&!o.some(m=>new RegExp(m).test(d))&&c.delete(u),i&&i.some(m=>new RegExp(m).test(d))&&c.delete(u)}return(await Promise.all(Array.from(c).map(async u=>{try{let d=hd.relative(t.rootDir,u),m=await ed(u,a,e),g=hd.basename(u,".test.yaml");return{id:m.id,name:g,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,steps:m.steps,fullFilePath:u,relativeFilePath:d,quarantined:!!s[m.id],quarantinedReason:s[m.id]}}catch(d){a.error(`Failed to read and resolve mobile test at '${u}': ${d}`),process.exit(1)}}))).filter(u=>!!u)}import{randomUUID as WV}from"crypto";import{existsSync as jV,statSync as $V}from"fs";import{cloneDeep as qV}from"lodash-es";import KV from"path";async function o_(r){let{inputs:e,fixtures:t,metadata:n,options:o}=r,{tracer:i,logger:a}=t,{runId:s}=n,{testDefinition:c,runSigIntHandlers:l,project:u}=e,d=new Date,m=await i.startRun({logger:a,testId:c.id,testName:c.name,runId:s,testDescription:c.description,schemaVersion:c.schemaVersion,originalSteps:{steps:qV(c.steps),beforeSteps:void 0,afterSteps:void 0},quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}),g=a.child(m.loggerBindings||{}),p=1+(c.settings?.retries??u.config.retries??1);try{for(let h=0;h<p;h++){let f=new Date,E=await YV({runTracer:m,testDefinition:c,metadata:n,constants:{attemptNumber:h,totalAttempts:p},fixtures:{...t,logger:g},inputs:e,options:o}),b=new Date;if(E.status!=="FAILED")return await m.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason};if(h!==p-1){a.warn("Retrying failed mobile run");continue}return a.error("Mobile test failed after all exhausting attempts"),await m.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}}throw new Error("This code should not be reachable")}finally{l?.pop()}}async function YV(r){let{runTracer:e,testDefinition:t,metadata:n,constants:o,fixtures:i,inputs:a,options:s}=r,{attemptNumber:c,totalAttempts:l}=o,{orgId:u,gitMetadata:d}=n,{apiClient:m,logger:g,usageTracker:p}=i,{logUpdate:h,channel:f,tag:E,project:b,envOverride:w}=a,{regenerateCache:R,alwaysSaveCache:v,noCache:M,logLevel:A,localAvdId:I,localApkPath:k}=s;c!==0&&h("RETRY",`attempt ${c}/${l}`);let j={...a.project.config.emulator,...t.settings?.emulator},ne=k?KV.resolve(k):void 0;if(ne&&(!jV(ne)||!$V(ne).isFile()))throw new Error(`Local APK path "${ne}" does not exist. Provide a valid file path via --local-apk-path.`);let Te=od({orgId:u,client:m,gitMetadata:d,regenerateCache:R??!1,alwaysSaveCache:v??!1,noCache:M??!1}),At=new Yi(m,u),G={type:"API_KEY",baseUrl:m.baseUrl,apiKey:m.apiKey,logger:g,mode:"runner"},$=new Qi(G),ge=new Uo(b.config.ai?.agentConfig,G),ae=new Ki(G,ge),Ce=new Ji({httpClient:m,fakerSeed:void 0}),Me=Math.floor(Math.random()*1e4)+4e4,Jt=await Zl(Me,"appium"),qt=j.region==="local"?ne??t.settings?.defaultApkFilePath?.trim():void 0,_e=f&&!qt?{channel:f,tag:E}:void 0,$e,st;if(I||j.region==="local"){if(!j.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is set to local. Provide --local-avd-id or configure a default local emulator AVD.");st=I??j.localEmulatorSettings?.avdId,$e={avdId:st,apkToInstall:_e,apkFilePath:qt}}else $e={region:j.region,apkToInstall:_e,osVersion:j.remoteEmulatorSettings?.androidVersion??eb};let Pt=WV(),Gt=await nu({apiClient:m,logger:g,driverLogLevel:A,creationOpts:$e,onStatusUpdate:$s=>{g.debug({status:$s},"Limbar emulator status update")},appiumPort:Jt,orgId:u,sessionId:Pt}),Fo=await e.startAttempt({emulatorName:Gt.emulatorName,runAttemptId:Pt}),Bo=g.child(Fo.loggerBindings||{}),zo=await iu({driver:Gt.driver,onLogs:$s=>{Fo.appendLogs($s)}}),bd=w||t.settings?.defaultEnv,Zh;bd&&(Zh=Ps(bd,b,Bo).variables);let l_=new ui({variablesFromEnvironment:Zh??{},envName:bd,testName:t.name}),Y=await Vi.init({driver:Gt.driver,generator:$,logger:Bo,limbarClient:Gt.limbarClient,playwrightDevice:Gt.playwrightDevice,orgId:u,adbPort:Gt.adbPort,options:{emulator:j},aiSettings:{...b.config.ai,useMemory:b.config.ai?.useMemory!==!1,...t.settings?.ai},fixtures:{storage:At,browserEnricher:ae,browserGenerator:ge,localCodeEvalTools:Ce,testContext:l_}}),js;try{js=await qu({containerName:`mobile test ${t.name}`,fixtures:{controller:Y,logger:Bo,cacheStorage:Te,usageTracker:p},work:{},inputs:{testName:t.name,steps:t.steps,orgId:u,testMetadata:t},tracer:Fo,callbacks:{}})}finally{await zo(),await Gt.cleanup(),await Y.cleanup()}return await Fo.finish({logger:Bo,results:js.results,status:js.status,assetDetails:{avdId:st,tag:_e?.tag,channel:_e?.channel}}),js}import{debounce as XV}from"ts-debounce";var Ws="0.13.1";function JV(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function QV(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Kh=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.interactionTracer=new Io,mn.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Ga}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Ga}/${t}.jpeg`,contents:n})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(t=>t.finish({status:QV(e.status),finishedAt:e.finishedAt}))))}async finish(e){return await this.finishInternal({status:e.result.status,finishedAt:new Date(e.result.endTime)}),{trace:this.interactionTracer.getRootSpan()}}async startSubSteps(){let e=new ta(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},ta=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;async getScreenshot(e,t){return this.diskStorage.readFile(`${Ga}/${t}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new Kh(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(t),t}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:JV(e.status),finishedAt:e.finishedAt}))))}},Yh=class{constructor(e,t,n,o,i,a){this.keepalive=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.diskStorage.mkdir("assets"),this.logStream=this.diskStorage.createFileStream("assets/logs.logcat")}finished=!1;children=[];logStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}appendLogs(e){let t=e.join(`
4399
+ `),r.forEach(m=>{if(!Kh.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let p,g;try{p=Kh.statSync(m),g=p.isDirectory()}catch(f){a.warn({err:f},`Skipping path ${m} because it cannot be read`);return}let h=Sd.resolve(m);Object.values(e.mobileTests).filter(f=>g?f.fullFilePath.startsWith(h):f.fullFilePath===h).forEach(f=>{c.add(f.fullFilePath)})})):(a.info("The arguments provided don't appear to be valid paths. Treating them as substrings instead... "),Object.values(e.mobileTests).forEach(m=>{r.some(p=>m.relativePath.includes(p))&&c.add(m.fullFilePath)}))}else{!n&&!await Ql("No test paths or substrings were provided. Do you want to run all tests?")&&(a.error("Cancelled by user."),process.exit(1));let u=Object.values(e.mobileTests);a.info(`Reading all ${u.length} mobile tests in the project from local disk.`),u.forEach(d=>{c.add(d.fullFilePath)})}for(let u of Array.from(c)){let d=Sd.relative(t.rootDir,u);o&&!o.some(m=>new RegExp(m).test(d))&&c.delete(u),i&&i.some(m=>new RegExp(m).test(d))&&c.delete(u)}return(await Promise.all(Array.from(c).map(async u=>{try{let d=Sd.relative(t.rootDir,u),m=await rd(u,a,e),p=Sd.basename(u,".test.yaml");return{id:m.id,name:p,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,steps:m.steps,fullFilePath:u,relativeFilePath:d,quarantined:!!s[m.id],quarantinedReason:s[m.id]}}catch(d){a.error(`Failed to read and resolve mobile test at '${u}': ${d}`),process.exit(1)}}))).filter(u=>!!u)}import{randomUUID as JV}from"crypto";import{existsSync as QV,statSync as ZV}from"fs";import{cloneDeep as eW}from"lodash-es";import tW from"path";async function u_(r){let{inputs:e,fixtures:t,metadata:n,options:o}=r,{tracer:i,logger:a}=t,{runId:s}=n,{testDefinition:c,runSigIntHandlers:l,project:u}=e,d=new Date,m=await i.startRun({logger:a,testId:c.id,testName:c.name,runId:s,testDescription:c.description,schemaVersion:c.schemaVersion,originalSteps:{steps:eW(c.steps),beforeSteps:void 0,afterSteps:void 0},quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}),p=a.child(m.loggerBindings||{}),g=1+(c.settings?.retries??u.config.retries??1);try{for(let h=0;h<g;h++){let f=new Date,E=await rW({runTracer:m,testDefinition:c,metadata:n,constants:{attemptNumber:h,totalAttempts:g},fixtures:{...t,logger:p},inputs:e,options:o}),b=new Date;if(E.status!=="FAILED")return await m.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason};if(h!==g-1){a.warn("Retrying failed mobile run");continue}return a.error("Mobile test failed after all exhausting attempts"),await m.finish({logger:a,...E,finishedAt:b}),{...E,startedAt:d,lastAttemptStartedAt:f,finishedAt:b,runId:s,attempts:h+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}}throw new Error("This code should not be reachable")}finally{l?.pop()}}async function rW(r){let{runTracer:e,testDefinition:t,metadata:n,constants:o,fixtures:i,inputs:a,options:s}=r,{attemptNumber:c,totalAttempts:l}=o,{orgId:u,gitMetadata:d}=n,{apiClient:m,logger:p,usageTracker:g}=i,{logUpdate:h,channel:f,tag:E,project:b,envOverride:C}=a,{regenerateCache:R,alwaysSaveCache:v,noCache:M,logLevel:A,localAvdId:I,localApkPath:k}=s;c!==0&&h("RETRY",`attempt ${c}/${l}`);let W={...a.project.config.emulator,...t.settings?.emulator},oe=k?tW.resolve(k):void 0;if(oe&&(!QV(oe)||!ZV(oe).isFile()))throw new Error(`Local APK path "${oe}" does not exist. Provide a valid file path via --local-apk-path.`);let Te=ad({orgId:u,client:m,gitMetadata:d,regenerateCache:R??!1,alwaysSaveCache:v??!1,noCache:M??!1}),At=new Ki(m,u),G={type:"API_KEY",baseUrl:m.baseUrl,apiKey:m.apiKey,logger:p,mode:"runner"},$=new Ji(G),he=new Uo(b.config.ai?.agentConfig,G),se=new qi(G,he),Ce=new Xi({httpClient:m,fakerSeed:void 0}),Me=Math.floor(Math.random()*1e4)+4e4,Jt=await tc(Me,"appium"),qt=W.region==="local"?oe??t.settings?.defaultApkFilePath?.trim():void 0,_e=f&&!qt?{channel:f,tag:E}:void 0,$e,lt;if(I||W.region==="local"){if(!W.localEmulatorSettings?.avdId)throw new Error("AVD name is required when region is set to local. Provide --local-avd-id or configure a default local emulator AVD.");lt=I??W.localEmulatorSettings?.avdId,$e={avdId:lt,apkToInstall:_e,apkFilePath:qt}}else $e={region:W.region,apkToInstall:_e,osVersion:W.remoteEmulatorSettings?.androidVersion??Wy};let Pt=JV(),Gt=await iu({apiClient:m,logger:p,driverLogLevel:A,creationOpts:$e,onStatusUpdate:qs=>{p.debug({status:qs},"Limbar emulator status update")},appiumPort:Jt,orgId:u,sessionId:Pt}),Fo=await e.startAttempt({emulatorName:Gt.emulatorName,runAttemptId:Pt}),Bo=p.child(Fo.loggerBindings||{}),zo=await su({driver:Gt.driver,onLogs:qs=>{Fo.appendLogs(qs)}}),Td=C||t.settings?.defaultEnv,ef;Td&&(ef=Is(Td,b,Bo).variables);let g_=new ui({variablesFromEnvironment:ef??{},envName:Td,testName:t.name}),Y=await Gi.init({driver:Gt.driver,generator:$,logger:Bo,limbarClient:Gt.limbarClient,playwrightDevice:Gt.playwrightDevice,orgId:u,adbPort:Gt.adbPort,options:{emulator:W},aiSettings:{...b.config.ai,useMemory:b.config.ai?.useMemory!==!1,...t.settings?.ai},fixtures:{storage:At,browserEnricher:se,browserGenerator:he,localCodeEvalTools:Ce,testContext:g_}}),$s;try{$s=await Yu({containerName:`mobile test ${t.name}`,fixtures:{controller:Y,logger:Bo,cacheStorage:Te,usageTracker:g},work:{},inputs:{testName:t.name,steps:t.steps,orgId:u,testMetadata:t},tracer:Fo,callbacks:{}})}finally{await zo(),await Gt.cleanup(),await Y.cleanup()}return await Fo.finish({logger:Bo,results:$s.results,status:$s.status,assetDetails:{avdId:lt,tag:_e?.tag,channel:_e?.channel}}),$s}import{debounce as nW}from"ts-debounce";var js="0.13.2";function oW(r){switch(r){case"PASSED":return"SUCCESS";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":case"PENDING":case"RETRYING":case"WAITING_FOR_USER":return"RUNNING"}}function iW(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Yh=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.interactionTracer=new Io,pn.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Va}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${Va}/${t}.jpeg`,contents:n})}async finishInternal(e){this.finished||(this.finished=!0,this.interactionTracer.finish(),await Promise.all(this.children.map(t=>t.finish({status:iW(e.status),finishedAt:e.finishedAt}))))}async finish(e){return await this.finishInternal({status:e.result.status,finishedAt:new Date(e.result.endTime)}),{trace:this.interactionTracer.getRootSpan()}}async startSubSteps(){let e=new ea(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},ea=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o}children=[];finished=!1;async getScreenshot(e,t){return this.diskStorage.readFile(`${Va}/${t}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new Yh(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(t),t}async finish(e){this.finished||(this.finished=!0,await Promise.all(this.children.map(t=>t.finishInternal({status:oW(e.status),finishedAt:e.finishedAt}))))}},Xh=class{constructor(e,t,n,o,i,a){this.keepalive=e;this.testId=t;this.testName=n;this.runAttemptId=o;this.metadata=i;this.diskStorage=a;this.diskStorage.mkdir("assets"),this.logStream=this.diskStorage.createFileStream("assets/logs.logcat")}finished=!1;children=[];logStream;get loggerBindings(){return{runAttemptId:this.runAttemptId}}appendLogs(e){let t=e.join(`
4400
4400
  `);this.logStream.write(t+`
4401
- `)}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,status:n,results:o,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:n,assetDetails:e.assetDetails,finishedAt:new Date,results:_u(o,t),beforeResults:i?_u(i,t):void 0,afterResults:a?_u(a,t):void 0};await Promise.all(this.children.map(c=>c.finish({status:s.status,finishedAt:s.finishedAt})));try{this.logStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)})}async startBeforeStepList(){let e=new ta(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ta(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ta(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${Ga}/${t}.jpeg`)}},Xh=class{constructor(e,t,n,o,i,a){this.client=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,status:t.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(e){let{runAttemptId:t}=e;this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let n=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),o={id:t,schemaVersion:wn,runAttemptSchemaVersion:_E,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=XV(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new Yh(()=>void i(),this.testId,this.testName,t,o,n);return this.children.push(a),a}},fd=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;this.metadata=n;this.client=o;this.diskStorage=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({orgId:e,runGroupId:t,outputDir:n,client:o,gitMetadata:i,labels:a}){let s={...i,id:t,trigger:ar.CLI,startedAt:new Date,status:"RUNNING",cliVersion:Ws,labels:a??[]},c=new ks(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new r(e,t,s,o,c)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,n={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let t=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,testDescription:e.testDescription,labels:e.testLabels,trigger:"CLI",status:"RUNNING",environmentName:e.environmentName,cliVersion:Ws,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:"ANDROID"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Xh(this.client,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function i_(r,e,t){if(t)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]=i.quarantinedReason,o),{})}catch(n){return r.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function gn(){try{await z(Promise.all([BE(),Tt.flush()]),{milliseconds:5e3})}catch{}}async function a_(r){let{options:e,fixtures:t,inputs:n,metadata:o}=r,{project:i,apiClient:a,logger:s}=t,{orgId:c,runGroupId:l,gitMetadata:u}=o,{outputDir:d,parallel:m}=e;eW(d)&&C.warn(`Output directory ${d} already exists, removing before test execution...`);let g=await i_(s,a,e.ignoreQuarantine),p=await yr(i),h=await n_({tests:n.tests,yes:e.yes,project:i,momenticFiles:p,logger:C,quarantinedTestReasons:g}),f=$E({items:h,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:G=>G.relativeFilePath}),E=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),b=await fd.start({logger:E,orgId:c,runGroupId:l,outputDir:d,client:a,gitMetadata:u,labels:[]}),w=[],R=new Date,v=new Set,M=async()=>tW({runResults:w,startTime:R,ranTests:v,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:d}),A=[],I=async G=>{C.warn(`${G} Stopping tests and printing latest results.`),await b.finish({logger:E,status:"CANCELLED"}),await M(),await Promise.allSettled(A.map($=>$())),await gn(),process.exit(1)},k=async()=>{await I("SIGINT received.")};process.once("SIGINT",k);let j;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let G=e.timeoutMinutes*60*1e3;j=setTimeout(()=>{I(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},G)}let ne={};for(let G=0;G<f.length;G++){let $=Object.values(ne);$.length===m&&await Promise.race($.map(Ce=>Ce.promise));let ge=f[G],ae=`test-${G}`;ne[ae]={done:!1,promise:(async({testDefinition:Ce})=>{v.add(ae);let Me=Ce.relativeFilePath.includes("..")?Ce.fullFilePath:Ce.relativeFilePath;Wa({status:"START",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length});let Jt=setInterval(()=>Wa({status:"RUN",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),5*60*1e3),qt=ZV(),_e=E.child({testId:Ce.id,runId:qt}),$e=new ru({logger:_e,reporter:new rd(a),runType:"mobile-test-run",runId:qt,testMetadata:Ce,suiteMetadata:void 0});try{let st=await o_({metadata:{...o,runId:qt},fixtures:{...t,tracer:b,logger:_e,usageTracker:$e},inputs:{...n,project:i,testDefinition:Ce,channel:n.channel??Ce.settings?.defaultChannel,tag:n.tag??Ce.settings?.defaultTag,logUpdate:(Pt,Gt)=>Wa({status:Pt,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length,additionalText:Gt}),runSigIntHandlers:A},options:e});Wa({status:st.status,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),w.push(st)}catch(st){let Pt=`Encountered unexpected fatal error when running test '${Ce.name}': ${st.message}
4402
- ${st.stack}`;C.error(Pt),_e.error({err:st},`Encountered unexpected fatal error when running test ${Ce.name}`)}finally{clearInterval(Jt),ne[ae].done=!0,delete ne[ae]}await $e.flush(s)})({testDefinition:ge})}}await Promise.allSettled(Object.values(ne).map(G=>G.promise)),j&&clearTimeout(j);let At=w.some(G=>G.status==="FAILED"&&!G.quarantined)?"FAILED":"PASSED";return await b.finish({logger:E,status:At}),process.off("SIGINT",k),M()}async function tW({runResults:r,startTime:e,ranTests:t,apiClient:n,uploadResults:o,outputDir:i}){let a=n.getAppUrl(),s=zE({results:r,startTime:e.getTime(),onFailed:c=>{},getDisplayLine:c=>{let l=`${Km}- ${c.filePath}`;return c.runId&&(l+=` ( link when uploaded: ${a}/runs/${c.runId} )`),l},entity:"mobile test"});return C.log(""),o?(C.success(`Test results have been saved to the folder ${i}. Uploading to Momentic Cloud...`),await ad({client:n,consoleLogger:C,resultsPath:i})):C.success(`Test results have been saved to the folder ${i}. Upload them to Momentic Cloud by running 'npx momentic-mobile results upload ${i}'.`),s}async function Jh(){iC(),WE("Chromium")||(ho?(await Xl("The Chromium browser is not installed but is required for automating webviews. Install it now?")||process.exit(1),await Ql({rawBrowsers:["chromium"],force:!1,all:!1})):(C.error("The Chromium browser is not installed but is required for automating webviews. Please install it using 'momentic-mobile install-browsers chromium'"),process.exit(1)))}ZA({serviceName:"mobile-cli"});cr.setApp("mobile-cli");var Jn=new rW;Jn.name("momentic-mobile").description("Momentic Mobile CLI").version(Ws);var sW=Jn.command("assets").description("Manage mobile testing assets");sW.command("upload").description("Upload an asset for mobile tests").argument("<file>","Path to the asset file to upload").addOption(Gs).addOption(Vs).addOption(Wh).addOption(qM).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i}=e,a=yd.resolve(r);Sd.existsSync(a)||(C.error(`File not found: ${a}`),process.exit(1));let s=new _r({baseUrl:n,apiKey:t,logger:C});/\.apk$/i.test(a)||(C.error(`File is not an APK file: ${a}`),process.exit(1)),await ou({tag:o?.toLowerCase(),channel:i.toLowerCase(),filePath:a,apiClient:s,logger:C})});Jn.command("app").addOption(Gs).addOption(Vs).addOption(zh).addOption(Bh).addOption($h).addOption(Hh).addOption(Gh).addOption(Vh).action(async r=>{let{apiKey:e,server:t,yes:n,disableCache:o,saveCache:i,regenerateCache:a}=r,s=Xm(r.logLevel);cr.setApp("mobile-desktop-server");let c=new _r({baseUrl:t,apiKey:e,logger:cr});await vh({client:c,skipPrompts:n}),C.debug("API key check complete");let l=aW(import.meta.url),u=yd.dirname(l),d=yd.resolve(u,"..","static");await Jh(),C.debug({appiumHome:ys},"Resolved resource paths");let m=await Is({configFilePath:r.config}),g=jM;await WM({momenticServerUrl:t,serverPort:g,apiKey:e,staticDir:d,initialProject:m,driverLogLevel:s,logger:cr,regenerateCache:a,noCache:o,alwaysSaveCache:i});let p=`http://localhost:${g}`;C.info(`Local app started on: ${p}`),await iW(p)});var s_=Jn.command("results").description("Merge and upload test results.");s_.command("merge").description("Merge test results files.").addOption(jh).addArgument(new Qh("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired()).action(async(r,e)=>{let{outputDir:t}=e;t||(C.error("Output directory is required."),process.exit(1)),Sd.existsSync(r)||(C.warn("Results path does not exist, skipping merge."),process.exit(0)),Sd.existsSync(t)&&C.warn(`Output directory ${t} already exists, removing before merging...`),EM(cr,t,r),await gn(),process.exit(0)});var lW=new Qh("<results>","Path to the results archive.").argRequired();s_.command("upload").description("Upload test results to Momentic cloud.").addOption(Gs).addOption(Vs).addArgument(lW).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=cr,i=new _r({baseUrl:n,apiKey:t,logger:o});await ad({consoleLogger:C,resultsPath:r,client:i}),await gn(),process.exit(0)});var cW=Jn.command("run").alias("test").description("Run tests on the local machine");cW.addOption(Gs).addOption(Vs).addOption(Bh).addOption(zh).addOption(JM).addOption($h).addOption(ZM).addOption(QM).addOption(Hh).addOption(Gh).addOption(Vh).addOption(jh).addOption(e_).addOption(t_).addOption(r_).addOption(Wh).addOption($M).addOption(KM).addOption(YM).addOption(XM).addArgument(new Qh("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i,outputDir:a}=e,s=Xm(e.logLevel);await Jh(),C.debug({appiumHome:ys},"Resolved resource paths"),jE({shardIndex:e.shardIndex,shardCount:e.shardCount});let c=await Is({configFilePath:e.config}),l=a??c.config.outputDir??sM,u=e.parallel??c.config.parallel??1;C.debug("Checking API key and dependencies");let d=new _r({baseUrl:n,apiKey:t,logger:C}),{orgId:m,userId:g}=await vh({client:d,skipPrompts:e.yes});C.debug("API key check and browser installation complete");let p=oW(),h=cr.child({runGroupId:p,orgId:m,userId:g}),f=await $i(cr,d,c);h.debug(f,"Got local git metadata");try{let E=await a_({options:{...e,parallel:u,outputDir:l,alwaysSaveCache:e.saveCache,noCache:e.disableCache,logLevel:s,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount},fixtures:{logger:h,project:c,apiClient:d},inputs:{envOverride:e.env,tag:o,channel:i,tests:r},metadata:{gitMetadata:f,runGroupId:p,orgId:m}});await gn(),E.failed>0?process.exit(1):process.exit(0)}catch(E){C.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),C.error(E),cr.error({err:E},"Failed to run tests locally"),await gn(),process.exit(1)}});Jn.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new nW("--name <name>","Name of the project")).action(async r=>{C.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
4403
- `),C.info("This wizard will help you bootstrap a new Momentic project."),Sd.existsSync(ji)&&(C.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let t={name:r.name??await NE("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Yu};nM(t,ji),C.success(`Initialized Momentic project file at ${yd.resolve(ji)}`)});Jn.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Jm.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(C.error("No browsers specified"),process.exit(1)),await Ql({rawBrowsers:r,force:e.force,all:e.all})});async function uW(){try{await Jn.parseAsync(process.argv),await gn()}catch(r){cr.error({err:r},"Uncaught error in CLI"),C.error(r),await gn(),process.exit(1)}}uW();
4401
+ `)}async finish(e){if(this.finished)return;this.finished=!0;let{logger:t,status:n,results:o,beforeResults:i,afterResults:a}=e,s={...this.metadata,status:n,assetDetails:e.assetDetails,finishedAt:new Date,results:Iu(o,t),beforeResults:i?Iu(i,t):void 0,afterResults:a?Iu(a,t):void 0};await Promise.all(this.children.map(c=>c.finish({status:s.status,finishedAt:s.finishedAt})));try{this.logStream.end()}catch{}this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)})}async startBeforeStepList(){let e=new ea(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ea(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ea(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${Va}/${t}.jpeg`)}},Jh=class{constructor(e,t,n,o,i,a){this.client=e;this.testId=t;this.testName=n;this.runId=o;this.metadata=i;this.diskStorage=a}children=[];finished=!1;get loggerBindings(){return{runId:this.runId}}async finish(e){if(this.finished)return;this.finished=!0;let t={...this.metadata,finishedAt:e.finishedAt||new Date,status:e.status,failureDetails:e.failureDetails,failureReason:e.failureReason,flake:e.isFlake||!1,failureRecoveryDetails:e.failureRecoveryDetails};await Promise.all(this.children.map(n=>n.finish({logger:e.logger,status:t.status,results:[],beforeResults:[],afterResults:[]}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(t,null,2)}),this.diskStorage.close()}async startAttempt(e){let{runAttemptId:t}=e;this.metadata.attempts=this.metadata.attempts+1,this.metadata.status="RUNNING",this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(this.metadata,null,2)});let n=this.diskStorage.cd(`attempts/${this.metadata.attempts}`),o={id:t,schemaVersion:Cn,runAttemptSchemaVersion:NE,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=nW(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new Xh(()=>void i(),this.testId,this.testName,t,o,n);return this.children.push(a),a}},yd=class r{constructor(e,t,n,o,i){this.orgId=e;this.runGroupId=t;this.metadata=n;this.client=o;this.diskStorage=i}children=[];finished=!1;get loggerBindings(){return{orgId:this.orgId,runGroupId:this.runGroupId,branch:this.metadata.gitBranchName}}static async start({orgId:e,runGroupId:t,outputDir:n,client:o,gitMetadata:i,labels:a}){let s={...i,id:t,trigger:ar.CLI,startedAt:new Date,status:"RUNNING",cliVersion:js,labels:a??[]},c=new Us(n);return c.storeFile({name:"metadata.json",contents:JSON.stringify(s,null,2)}),new r(e,t,s,o,c)}async finish(e){if(this.finished)return;this.finished=!0;let{status:t}=e,n={...this.metadata,status:t,updatedAt:new Date,finishedAt:new Date};await Promise.all(this.children.map(o=>o.finish({logger:e.logger,status:n.status,finishedAt:n.finishedAt}))),this.diskStorage.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)})}async startRun(e){let t=this.diskStorage.createRunArchive(e.runId),n={stepsSnapshot:e.originalSteps.steps,runGroupId:this.runGroupId,testId:e.testId,testName:e.testName,testDescription:e.testDescription,labels:e.testLabels,trigger:"CLI",status:"RUNNING",environmentName:e.environmentName,cliVersion:js,schemaVersion:e.schemaVersion,startedAt:new Date,attempts:0,quarantined:e.quarantined,quarantinedReason:e.quarantinedReason,executionType:"ANDROID"};t.storeFile({name:"metadata.json",contents:JSON.stringify(n,null,2)});let o=new Jh(this.client,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function d_(r,e,t){if(t)return{};try{return(await e.getQuarantinedTests()).quarantined.reduce((o,i)=>(o[i.testId]=i.quarantinedReason,o),{})}catch(n){return r.warn({err:n},"Failed to fetch quarantined tests, proceeding without them."),{}}}async function hn(){try{await z(Promise.all([WE(),Tt.flush()]),{milliseconds:5e3})}catch{}}async function m_(r){let{options:e,fixtures:t,inputs:n,metadata:o}=r,{project:i,apiClient:a,logger:s}=t,{orgId:c,runGroupId:l,gitMetadata:u}=o,{outputDir:d,parallel:m}=e;sW(d)&&w.warn(`Output directory ${d} already exists, removing before test execution...`);let p=await d_(s,a,e.ignoreQuarantine),g=await yr(i),h=await c_({tests:n.tests,yes:e.yes,project:i,momenticFiles:g,logger:w,quarantinedTestReasons:p}),f=JE({items:h,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:G=>G.relativeFilePath}),E=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),b=await yd.start({logger:E,orgId:c,runGroupId:l,outputDir:d,client:a,gitMetadata:u,labels:[]}),C=[],R=new Date,v=new Set,M=async()=>lW({runResults:C,startTime:R,ranTests:v,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:d}),A=[],I=async G=>{w.warn(`${G} Stopping tests and printing latest results.`),await b.finish({logger:E,status:"CANCELLED"}),await M(),await Promise.allSettled(A.map($=>$())),await hn(),process.exit(1)},k=async()=>{await I("SIGINT received.")};process.once("SIGINT",k);let W;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let G=e.timeoutMinutes*60*1e3;W=setTimeout(()=>{I(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},G)}let oe={};for(let G=0;G<f.length;G++){let $=Object.values(oe);$.length===m&&await Promise.race($.map(Ce=>Ce.promise));let he=f[G],se=`test-${G}`;oe[se]={done:!1,promise:(async({testDefinition:Ce})=>{v.add(se);let Me=Ce.relativeFilePath.includes("..")?Ce.fullFilePath:Ce.relativeFilePath;ja({status:"START",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length});let Jt=setInterval(()=>ja({status:"RUN",testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),5*60*1e3),qt=aW(),_e=E.child({testId:Ce.id,runId:qt}),$e=new ou({logger:_e,reporter:new od(a),runType:"mobile-test-run",runId:qt,testMetadata:Ce,suiteMetadata:void 0});try{let lt=await u_({metadata:{...o,runId:qt},fixtures:{...t,tracer:b,logger:_e,usageTracker:$e},inputs:{...n,project:i,testDefinition:Ce,channel:n.channel??Ce.settings?.defaultChannel,tag:n.tag??Ce.settings?.defaultTag,logUpdate:(Pt,Gt)=>ja({status:Pt,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length,additionalText:Gt}),runSigIntHandlers:A},options:e});ja({status:lt.status,testLogRef:Me,getRunningTestsCount:()=>v.size,getTotalTestsCount:()=>f.length}),C.push(lt)}catch(lt){let Pt=`Encountered unexpected fatal error when running test '${Ce.name}': ${lt.message}
4402
+ ${lt.stack}`;w.error(Pt),_e.error({err:lt},`Encountered unexpected fatal error when running test ${Ce.name}`)}finally{clearInterval(Jt),oe[se].done=!0,delete oe[se]}await $e.flush(s)})({testDefinition:he})}}await Promise.allSettled(Object.values(oe).map(G=>G.promise)),W&&clearTimeout(W);let At=C.some(G=>G.status==="FAILED"&&!G.quarantined)?"FAILED":"PASSED";return await b.finish({logger:E,status:At}),process.off("SIGINT",k),M()}async function lW({runResults:r,startTime:e,ranTests:t,apiClient:n,uploadResults:o,outputDir:i}){let a=n.getAppUrl(),s=jE({results:r,startTime:e.getTime(),onFailed:c=>{},getDisplayLine:c=>{let l=`${Ym}- ${c.filePath}`;return c.runId&&(l+=` ( link when uploaded: ${a}/runs/${c.runId} )`),l},entity:"mobile test"});return w.log(""),o?(w.success(`Test results have been saved to the folder ${i}. Uploading to Momentic Cloud...`),await ld({client:n,consoleLogger:w,resultsPath:i})):w.success(`Test results have been saved to the folder ${i}. Upload them to Momentic Cloud by running 'npx momentic-mobile results upload ${i}'.`),s}async function Qh(){uC(),YE("Chromium")||(ho?(await Ql("The Chromium browser is not installed but is required for automating webviews. Install it now?")||process.exit(1),await ec({rawBrowsers:["chromium"],force:!1,all:!1})):(w.error("The Chromium browser is not installed but is required for automating webviews. Please install it using 'momentic-mobile install-browsers chromium'"),process.exit(1)))}ow({serviceName:"mobile-cli"});cr.setApp("mobile-cli");var Jn=new cW;Jn.name("momentic-mobile").description("Momentic Mobile CLI").version(js);var gW=Jn.command("assets").description("Manage mobile testing assets");gW.command("upload").description("Upload an asset for mobile tests").argument("<file>","Path to the asset file to upload").addOption(Vs).addOption(Ws).addOption(jh).addOption(ZM).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i}=e,a=Ed.resolve(r);bd.existsSync(a)||(w.error(`File not found: ${a}`),process.exit(1));let s=new Pr({baseUrl:n,apiKey:t,logger:w});/\.apk$/i.test(a)||(w.error(`File is not an APK file: ${a}`),process.exit(1)),await au({tag:o?.toLowerCase(),channel:i.toLowerCase(),filePath:a,apiClient:s,logger:w})});Jn.command("app").addOption(Vs).addOption(Ws).addOption(Hh).addOption(zh).addOption(qh).addOption(Gh).addOption(Vh).addOption(Wh).action(async r=>{let{apiKey:e,server:t,yes:n,disableCache:o,saveCache:i,regenerateCache:a}=r,s=Jm(r.logLevel);cr.setApp("mobile-desktop-server");let c=new Pr({baseUrl:t,apiKey:e,logger:cr});await Ah({client:c,skipPrompts:n}),w.debug("API key check complete");let l=pW(import.meta.url),u=Ed.dirname(l),d=Ed.resolve(u,"..","static");await Qh(),w.debug({appiumHome:bs},"Resolved resource paths");let m=await Os({configFilePath:r.config}),p=JM;await XM({momenticServerUrl:t,serverPort:p,apiKey:e,staticDir:d,initialProject:m,driverLogLevel:s,logger:cr,regenerateCache:a,noCache:o,alwaysSaveCache:i});let g=`http://localhost:${p}`;w.info(`Local app started on: ${g}`),await mW(g)});var p_=Jn.command("results").description("Merge and upload test results.");p_.command("merge").description("Merge test results files.").addOption($h).addArgument(new Zh("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired()).action(async(r,e)=>{let{outputDir:t}=e;t||(w.error("Output directory is required."),process.exit(1)),bd.existsSync(r)||(w.warn("Results path does not exist, skipping merge."),process.exit(0)),bd.existsSync(t)&&w.warn(`Output directory ${t} already exists, removing before merging...`),RM(cr,t,r),await hn(),process.exit(0)});var hW=new Zh("<results>","Path to the results archive.").argRequired();p_.command("upload").description("Upload test results to Momentic cloud.").addOption(Vs).addOption(Ws).addArgument(hW).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=cr,i=new Pr({baseUrl:n,apiKey:t,logger:o});await ld({consoleLogger:w,resultsPath:r,client:i}),await hn(),process.exit(0)});var fW=Jn.command("run").alias("test").description("Run tests on the local machine");fW.addOption(Vs).addOption(Ws).addOption(zh).addOption(Hh).addOption(n_).addOption(qh).addOption(i_).addOption(o_).addOption(Gh).addOption(Vh).addOption(Wh).addOption($h).addOption(a_).addOption(s_).addOption(l_).addOption(jh).addOption(QM).addOption(e_).addOption(t_).addOption(r_).addArgument(new Zh("<tests...>","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i,outputDir:a}=e,s=Jm(e.logLevel);await Qh(),w.debug({appiumHome:bs},"Resolved resource paths"),XE({shardIndex:e.shardIndex,shardCount:e.shardCount});let c=await Os({configFilePath:e.config}),l=a??c.config.outputDir??pM,u=e.parallel??c.config.parallel??1;w.debug("Checking API key and dependencies");let d=new Pr({baseUrl:n,apiKey:t,logger:w}),{orgId:m,userId:p}=await Ah({client:d,skipPrompts:e.yes});w.debug("API key check and browser installation complete");let g=dW(),h=cr.child({runGroupId:g,orgId:m,userId:p}),f=await ji(cr,d,c);h.debug(f,"Got local git metadata");try{let E=await m_({options:{...e,parallel:u,outputDir:l,alwaysSaveCache:e.saveCache,noCache:e.disableCache,logLevel:s,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount},fixtures:{logger:h,project:c,apiClient:d},inputs:{envOverride:e.env,tag:o,channel:i,tests:r},metadata:{gitMetadata:f,runGroupId:g,orgId:m}});await hn(),E.failed>0?process.exit(1):process.exit(0)}catch(E){w.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),w.error(E),cr.error({err:E},"Failed to run tests locally"),await hn(),process.exit(1)}});Jn.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new uW("--name <name>","Name of the project")).action(async r=>{w.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
4403
+ `),w.info("This wizard will help you bootstrap a new Momentic project."),bd.existsSync(Wi)&&(w.error("A momentic.config.yaml file already exists in this directory. Please rename or remove it to initialize a new project."),process.exit(1));let t={name:r.name??await BE("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Ju};cM(t,Wi),w.success(`Initialized Momentic project file at ${Ed.resolve(Wi)}`)});Jn.command("install-browsers").description("Install browser executables onto the local machine.").option("-f, --force","Force reinstallation even if the browser executables already exist on disk.").option("-a, --all","Install all browsers types.").argument("[browsers...]",`Browsers to install. Available choices: ${Qm.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(w.error("No browsers specified"),process.exit(1)),await ec({rawBrowsers:r,force:e.force,all:e.all})});async function SW(){try{await Jn.parseAsync(process.argv),await hn()}catch(r){cr.error({err:r},"Uncaught error in CLI"),w.error(r),await hn(),process.exit(1)}}SW();
4404
4404
  //# sourceMappingURL=cli.js.map