momentic-mobile 0.19.0 → 0.19.1

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,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var mI=Object.defineProperty;var $e=(r,e)=>()=>(r&&(e=r(r=0)),e);var gI=(r,e)=>{for(var t in e)mI(r,t,{get:e[t],enumerable:!0})};var GT,VT=$e(()=>{"use strict";GT=typeof globalThis=="object"?globalThis:global});var WT=$e(()=>{"use strict";VT()});var jT=$e(()=>{"use strict";WT()});var fn,Dm=$e(()=>{"use strict";fn="1.9.0"});function s0(r){var e=new Set([r]),t=new Set,n=r.match($T);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($T);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 $T,qT,KT=$e(()=>{"use strict";Dm();$T=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;qT=s0(fn)});function Di(r,e,t,n){var o;n===void 0&&(n=!1);var i=Ts[Es]=(o=Ts[Es])!==null&&o!==void 0?o:{version:fn};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!==fn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+fn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+fn+"."),!0}function Sn(r){var e,t,n=(e=Ts[Es])===null||e===void 0?void 0:e.version;if(!(!n||!qT(n)))return(t=Ts[Es])===null||t===void 0?void 0:t[r]}function ki(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+fn+".");var t=Ts[Es];t&&delete t[r]}var l0,Es,Ts,vs=$e(()=>{"use strict";jT();Dm();KT();l0=fn.split(".")[0],Es=Symbol.for("opentelemetry.js.api."+l0),Ts=GT});function As(r,e,t){var n=Sn("diag");if(n)return t.unshift(e),n[r].apply(n,u0([],c0(t),!1))}var c0,u0,YT,XT=$e(()=>{"use strict";vs();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},u0=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(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 As("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("verbose",this._namespace,e)},r}()});var Be,_c=$e(()=>{"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 JT(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 QT=$e(()=>{"use strict";_c()});var d0,p0,m0,qr,Rs=$e(()=>{"use strict";XT();QT();_c();vs();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},p0=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))},m0="diag",qr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=Sn("diag");if(s)return s[o].apply(s,p0([],d0(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=Sn("diag"),d=JT((s=i.logLevel)!==null&&s!==void 0?s:Be.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return Di("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ki(m0,t)},t.createComponentLogger=function(o){return new YT(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 ZT,ev=$e(()=>{"use strict";ZT=Symbol("BaggageEntryMetadata")});function km(r){return typeof r!="string"&&(g0.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:ZT,toString:function(){return r}}}var g0,tv=$e(()=>{"use strict";Rs();ev();g0=qr.instance()});function Um(r){return Symbol.for(r)}var h0,Fm,Bm=$e(()=>{"use strict";h0=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}(),Fm=new h0});function Gm(){return Hm}var Io,f0,Ic,S0,y0,b0,E0,zm,T0,v0,A0,Hm,R0,w0,C0,x0,M0,_0,I0,Vm=$e(()=>{"use strict";Io=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)}}(),f0=function(){function r(){}return r.prototype.createGauge=function(e,t){return w0},r.prototype.createHistogram=function(e,t){return C0},r.prototype.createCounter=function(e,t){return R0},r.prototype.createUpDownCounter=function(e,t){return x0},r.prototype.createObservableGauge=function(e,t){return _0},r.prototype.createObservableCounter=function(e,t){return M0},r.prototype.createObservableUpDownCounter=function(e,t){return I0},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),Ic=function(){function r(){}return r}(),S0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Ic),y0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Ic),b0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Ic),E0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Ic),zm=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),T0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),v0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),A0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),Hm=new f0,R0=new S0,w0=new b0,C0=new E0,x0=new y0,M0=new T0,_0=new v0,I0=new A0});var Yt,rv=$e(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Yt||(Yt={}))});var P0,O0,nv,ov=$e(()=>{"use strict";Bm();P0=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},O0=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))},nv=function(){function r(){}return r.prototype.active=function(){return Fm},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,O0([n],P0(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var L0,N0,Wm,D0,iv,av=$e(()=>{"use strict";ov();vs();Rs();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},N0=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))},Wm="context",D0=new nv,iv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return Di(Wm,e,qr.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,N0([e,t,n],L0(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return Sn(Wm)||D0},r.prototype.disable=function(){this._getContextManager().disable(),ki(Wm,qr.instance())},r}()});var Ui,sv=$e(()=>{"use strict";av();Ui=iv.getInstance()});var W,lv=$e(()=>{"use strict";Rs();W=qr.instance()});var k0,cv,uv=$e(()=>{"use strict";Vm();k0=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return Hm},r}(),cv=new k0});var jm,dv,pv=$e(()=>{"use strict";uv();vs();Rs();jm="metrics",dv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return Di(jm,e,qr.instance())},r.prototype.getMeterProvider=function(){return Sn(jm)||cv},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ki(jm,qr.instance())},r}()});var Pc,mv=$e(()=>{"use strict";pv();Pc=dv.getInstance()});var Ne=$e(()=>{"use strict";tv();Bm();_c();Vm();rv();sv();lv();mv()});import{Argument as Jd,Command as xj,Option as kf}from"@commander-js/extra-typings";import uB from"appium";import{z as Zd}from"zod";var Fj=Zd.object({input:Zd.string(),agentConfigVersion:Zd.string().optional()});import{z as ut}from"zod";var Hj=ut.object({srcs:ut.array(ut.string()),urls:ut.array(ut.string()),desiredSrc:ut.string().optional(),desiredUrl:ut.string().optional()}),Bf=ut.object({srcRegex:ut.string().optional(),urlRegex:ut.string().optional()}),zf=ut.object({x:ut.number(),y:ut.number(),correlation:ut.number()}),Gj=ut.object({searchImageBase64String:ut.string(),pageImageBase64String:ut.string(),id:ut.string().uuid(),timeoutMs:ut.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as hI}from"zod-openapi";import Ta from"zod";var va=Ta.object({updatedAt:Ta.coerce.date().optional()}),Zo=Ta.object({contentType:Ta.enum(["image/jpeg","image/png"]),id:Ta.string()});hI(N);var Cn=(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))(Cn||{}),fI=N.object({mPathSelectorTokens:N.string().array(),frameSrcRegex:N.string().optional(),frameUrlRegex:N.string().optional(),indices:N.number().array()}),Aa=N.object({result:N.number(),traceId:N.string()}).array(),cn=N.object({type:N.literal("GCS_TRACES"),traces:Aa}),Lt=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(Lt||{}),Hf=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(Lt)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(Lt)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),SI=N.object({selectors:N.string().array(),requirements:Hf.optional()}),xn=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:Hf.optional(),additionalElements:SI.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().or(Zo.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:fI.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(Cn).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:cn.optional()}).openapi({ref:"ElementTargetCache"});function El(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var yI=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),bI=N.object({x:N.number(),y:N.number()}),EI=N.object({type:N.literal("coordinates"),pixels:bI}).openapi({ref:"CoordinatesTarget"});function Mn(r){return r.type==="description"}function kr(r){return r.type==="coordinates"}var Ct=N.discriminatedUnion("type",[yI,EI]).openapi({ref:"ElementTarget"});function ep(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Gf(r){return cn.safeParse(r).success}import{v4 as we}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as PI}from"zod-openapi";import{z as he}from"zod";import{extendZodWithOpenApi as TI}from"zod-openapi";import{z as Ra}from"zod";var wa=Ra.object({result:Ra.boolean(),traceId:Ra.string()}).array(),Ca=Ra.object({type:Ra.literal("GCS_TRACES"),traces:wa}),_n=va.extend({memory:Ca.optional()});TI(he);var Vf=he.object({thoughts:he.string(),result:he.boolean(),relevantElements:he.array(he.number()).optional(),updatedMemory:wa.optional()}),er=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(er||{});var vI=he.object({type:he.literal("ELEMENT_NAME"),negated:he.boolean().optional(),operation:he.nativeEnum(er),value:he.string()}).openapi({ref:"ElementNameAssertion"}),AI=he.object({type:he.literal("ELEMENT_STYLE"),negated:he.boolean().optional(),operation:he.nativeEnum(er),property:he.string(),value:he.string()}).openapi({ref:"ElementStyleAssertion"}),RI=he.object({type:he.literal("ELEMENT_CONTENT"),negated:he.boolean().optional(),operation:he.nativeEnum(er),value:he.string()}).openapi({ref:"ElementContentAssertion"}),wI=he.object({type:he.literal("ELEMENT_ATTRIBUTE"),negated:he.boolean().optional(),operation:he.nativeEnum(er),attr:he.string(),value:he.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ur=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Ur||{});var CI=he.object({type:he.literal("ELEMENT_EXISTENCE"),negated:he.boolean().optional(),condition:he.nativeEnum(Ur).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Tl=he.discriminatedUnion("type",[RI,wI,CI,vI,AI]).openapi({ref:"ManualElementAssertion"});var xI=he.object({type:he.literal("CONTENT"),negated:he.boolean().optional(),value:he.string()}).openapi({ref:"PageContentAssertion"}),Wf=he.discriminatedUnion("type",[xI]).openapi({ref:"ManualPageAssertion"});import Nt from"zod";var tp=Nt.discriminatedUnion("type",[Nt.object({type:Nt.literal("SUBSTRING"),url:Nt.string()}),Nt.object({type:Nt.literal("GLOB"),glob:Nt.string()}),Nt.object({type:Nt.literal("REGEX"),regex:Nt.string()}),Nt.object({type:Nt.literal("DOMAIN"),domain:Nt.string()})]),xa=Nt.object({urlMatcher:tp,method:Nt.string().optional()});import{z as ue}from"zod";var MI=ue.object({type:ue.literal("json"),content:ue.string().describe("The JSON content to send in the request body")}),_I=ue.object({type:ue.literal("form-urlencoded"),content:ue.record(ue.string(),ue.string()).describe("The form fields to send in the request body")}),II=ue.discriminatedUnion("type",[MI,_I]),uo=ue.object({url:ue.string(),method:ue.union([ue.literal("GET"),ue.literal("POST"),ue.literal("PUT"),ue.literal("DELETE"),ue.literal("PATCH")]),headers:ue.record(ue.string(),ue.string()).optional(),params:ue.record(ue.string(),ue.string()).optional(),body:II.optional(),timeout:ue.number().int().optional().describe("Max seconds to wait for the request to complete")}),jf=ue.object({url:ue.string(),headers:ue.record(ue.string(),ue.string()).optional(),query:ue.string(),variables:ue.string().optional(),timeout:ue.number().int().optional().describe("Max seconds to wait for the request to complete")}),vl=ue.object({code:ue.string(),fragment:ue.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ue.union([ue.literal("NODE"),ue.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ue.number().int().max(60).optional().describe("Max seconds for the code to complete")});var rt=($=>($.AI_EXTRACT="AI_EXTRACT",$.AI_ASSERTION="AI_ASSERTION",$.AUTH_LOAD="AUTH_LOAD",$.AUTH_SAVE="AUTH_SAVE",$.BLUR="BLUR",$.CAPTCHA="CAPTCHA",$.CLICK="CLICK",$.COOKIE="COOKIE",$.COPY="COPY",$.DIALOG="DIALOG",$.DRAG="DRAG",$.ELEMENT_CHECK="ELEMENT_CHECK",$.FILE_UPLOAD="FILE_UPLOAD",$.FOCUS="FOCUS",$.GO_BACK="GO_BACK",$.GO_FORWARD="GO_FORWARD",$.HOVER="HOVER",$.JAVASCRIPT="JAVASCRIPT",$.LOCAL_STORAGE="LOCAL_STORAGE",$.MOUSE_DRAG="MOUSE_DRAG",$.NAVIGATE="NAVIGATE",$.NEW_TAB="NEW_TAB",$.PAGE_CHECK="PAGE_CHECK",$.PASTE="PASTE",$.PRESS="PRESS",$.KEY_DOWN="KEY_DOWN",$.KEY_UP="KEY_UP",$.REFRESH="REFRESH",$.REQUEST="REQUEST",$.GRAPHQL_REQUEST="GRAPHQL_REQUEST",$.SCROLL_DOWN="SCROLL_DOWN",$.SCROLL_UP="SCROLL_UP",$.SCROLL_LEFT="SCROLL_LEFT",$.SCROLL_RIGHT="SCROLL_RIGHT",$.SELECT_OPTION="SELECT_OPTION",$.SWITCH_TAB="TAB",$.TYPE="TYPE",$.VISUAL_DIFF="VISUAL_DIFF",$.WAIT="WAIT",$.WAIT_FOR_URL="WAIT_FOR_URL",$.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="SUCCESS",$))(rt||{});PI(S);var Q=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),tr=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"}),rr=va.extend({target:xn}).optional().openapi({ref:"SingleTargetCache"});function $f(r){return rr.safeParse(r).success}var Al=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),qf=Q.merge(Al).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),Rl=tr.merge(S.object({cache:rr})),po=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),mo=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),ei=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),ti=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),A$=S.discriminatedUnion("type",[po,mo,ei,ti]).openapi({ref:"AllScrollCommands"}),OI=Q.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Kf=Q.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),LI=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")}),Yf=Q.extend({type:S.literal("WAIT_FOR_URL"),matcher:tp}).merge(LI).openapi({ref:"WaitUrlCommand"}),Xf=Q.merge(Al).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Jf=Q.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Qf=Q.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),NI=Q.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),DI=Q.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"}),np=Q.merge(tr).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Zf=Q.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),eS=Q.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),tS=Q.merge(vl).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),ri=Q.merge(tr).extend({type:S.literal("CLICK"),target:Ct,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:rr,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),rS=va.extend({fromTarget:xn.optional(),toTarget:xn.optional()}),ni=Q.merge(tr).merge(S.object({type:S.literal("DRAG"),fromTarget:Ct,toTarget:Ct,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:rS.optional()})).openapi({ref:"DragCommand"}),oi=Q.merge(tr).merge(S.object({type:S.literal("MOUSE_DRAG"),target:Ct.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:rr})).openapi({ref:"MouseDragCommand"}),ii=Q.merge(tr).merge(S.object({type:S.literal("HOVER"),target:Ct,cache:rr})).openapi({ref:"HoverCommand"}),Ma=Q.merge(tr).merge(S.object({type:S.literal("FOCUS"),target:Ct,cache:rr})).openapi({ref:"FocusCommand"}),_a=Q.merge(tr).extend({type:S.literal("BLUR"),target:Ct.optional(),cache:rr}).openapi({ref:"BlurCommand"}),kI=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),UI=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),FI=Q.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[kI,UI]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),nS=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()})]),ai=Q.merge(tr).extend({type:S.literal("SELECT_OPTION"),target:Ct,cache:rr,choice:nS.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),op=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),Ia=Q.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:op.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:_n.optional(),source:S.string().optional()})).openapi({ref:"AIAssertionCommand"}),Dt=5,si=600,li=Q.merge(tr).extend({type:S.literal("ELEMENT_CHECK"),target:Ct,assertion:Tl,cache:rr.or(_n).optional(),timeout:S.number().int().min(0).max(si).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),oS=Q.extend({type:S.literal("PAGE_CHECK"),assertion:Wf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(si).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),iS=Q.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"}),BI=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()}),aS=25,ci=Q.merge(tr).merge(BI).extend({type:S.literal("TYPE"),target:Ct.optional(),value:S.string(),cache:rr}).openapi({ref:"TypeCommand"}),sS=Q.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"}),lS=Q.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),cS=Q.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),zI=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),HI=S.object({type:S.literal("REGEX"),pattern:S.string()}),GI=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),VI=S.discriminatedUnion("type",[zI,HI,GI]),WI=Q.merge(Al).merge(S.object({type:S.literal("TAB"),action:VI})).openapi({ref:"TabCommand"}),uS=Q.merge(Al).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),jI=Q.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),dS=Q.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),pS=Q.extend({type:S.literal("REQUEST")}).merge(uo).openapi({ref:"RequestCommand"}),Pa=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()})}),mS=Q.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(jf).openapi({ref:"GraphQLRequestCommand"}),gS=Q.merge(S.object({type:S.literal("SUCCESS"),condition:Ia.optional()})).openapi({ref:"SuccessCommand"}),hS=Q.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),$I=S.object({data:S.union([S.string().describe("location at which to find a jpg - public URL or local"),Zo]),width:S.number(),height:S.number()});var Oa=Q.merge(tr).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:Ct.optional(),screenshot:$I.optional(),cache:rr})).openapi({ref:"VisualDiffCommand"}),qI=Q.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:xa,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),KI=Q.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),YI=Q.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:xa,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),XI=Q.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),JI=Q.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:xa.optional()})).openapi({ref:"SetHeaderCommand"}),QI=Q.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:xa,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"})),ZI=Q.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"})),eP=Q.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),tP=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],R$=[...tP,"DRAG"],rP=S.discriminatedUnion("type",[ri,ci,sS,lS,cS,ai,qf,mo,po,Ia,Jf,ii,Kf]),nP=S.discriminatedUnion("type",[...rP.options,ni]),oP=S.discriminatedUnion("type",[...nP.options]),fS=S.discriminatedUnion("type",[...oP.options,gS]),ip=S.discriminatedUnion("type",[gS,ri,ci,sS,lS,cS,ai,qf,mo,po,Ia,Jf,ii,Kf,tS,li,oS,uS,Yf,iS,Zf,Qf,dS,ni,oi,eS,Xf,pS,mS]),iP=S.discriminatedUnion("type",[iS,DI,NI,np,jI,Zf,OI,li,FI,Qf,tS,dS,oi,uS,oS,eS,Xf,pS,mS,ei,ti,WI,Oa,Ma,_a,Yf,qI,KI,YI,XI,JI,QI,ZI,eP]),ui=S.discriminatedUnion("type",[...fS.options,...iP.options]).openapi({ref:"Command"}),wl=S.discriminatedUnion("type",[...fS.options,hS]),w$=S.discriminatedUnion("type",[...ip.options,hS]);function un(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:we(),type:r};break;case"AUTH_LOAD":{e={id:we(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:we(),type:r,goal:""};break;case"DIALOG":e={id:we(),type:r,action:"DISMISS"};break;case"DRAG":e={id:we(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:we(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:we(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:we(),type:r,delay:1};break;case"BLUR":e={id:we(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:we(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:we(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:we(),type:r,value:""};break;case"SELECT_OPTION":e={id:we(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:we(),type:r,url:""};case"TAB":e={id:we(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:we(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:we(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:we(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:we(),type:r,code:""};break;case"AI_ASSERTION":e={id:we(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:we(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:we(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:we(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:we(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:we(),type:r,key:""};break}case"SET_HEADER":{e={id:we(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:we(),type:r};break}case"OFFLINE_MODE":{e={id:we(),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 SS(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 aP}from"zod";var I$=aP.discriminatedUnion("type",[_a,np,ri,ni,Ma,ii,oi,po,mo,ei,ti,ai,ci,Oa,li]);import{z as sP}from"zod";import{z as Pn}from"zod";function La(r){return Pn.object({key:Pn.string(),testId:Pn.string().optional(),moduleId:Pn.string().optional(),organizationId:Pn.string(),value:r})}function Na(r){return La(r).extend({uniqueKey:Pn.string()})}function Cl(r){return Pn.record(Pn.string(),Na(r))}var kt={type:!0,cache:!0},di=sP.discriminatedUnion("type",[Ia.pick(kt),_a.pick(kt),ri.pick(kt),ni.pick(kt),li.pick(kt),Ma.pick(kt),ii.pick(kt),oi.pick(kt),po.pick(kt),mo.pick(kt),ei.pick(kt),ti.pick(kt),ai.pick(kt),ci.pick(kt),Oa.pick(kt)]),ap=Object.values(rt).filter(r=>di.options.some(e=>e.shape.type.safeParse(r).success));ui.options.forEach(r=>{if("target"in r.shape&&!ap.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function sp(r){return ap.includes(r.type)}var yS=La(di),bS=Na(di),F$=Cl(di);import{v4 as FK}from"uuid";import{z as A}from"zod";var TS=Symbol("Let zodToJsonSchema decide on which parser to use");var ES={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"},vS=r=>typeof r=="string"?{...ES,name:r}:{...ES,...r};var AS=r=>{let e=vS(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 lp(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function ye(r,e,t,n,o){r[e]=t,lp(r,e,n,o)}var xl=(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 Se}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"?xl(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as lP}from"zod";function RS(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==lP.ZodAny&&(t.items=Z(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&ye(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&ye(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(ye(t,"minItems",r.exactLength.value,r.exactLength.message,e),ye(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function wS(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?ye(t,"minimum",n.value,n.message,e):ye(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ye(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ye(t,"maximum",n.value,n.message,e):ye(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ye(t,"maximum",n.value,n.message,e));break;case"multipleOf":ye(t,"multipleOf",n.value,n.message,e);break}return t}function CS(){return{type:"boolean"}}function Ml(r,e){return Z(r.type._def,e)}var xS=(r,e)=>Z(r.innerType._def,e);function cp(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>cp(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 cP(r,e)}}var cP=(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":ye(t,"minimum",n.value,n.message,e);break;case"max":ye(t,"maximum",n.value,n.message,e);break}return t};function MS(r,e){return{...Z(r.innerType._def,e),default:r.defaultValue()}}function _S(r,e){return e.effectStrategy==="input"?Z(r.schema._def,e):ze(e)}function IS(r){return{type:"string",enum:Array.from(r.values)}}var uP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function PS(r,e){let t=[Z(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),Z(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(uP(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 OS(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 Da}from"zod";var up,vr={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:()=>(up===void 0&&(up=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),up),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 _l(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":ye(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":ye(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":Ar(t,"email",n.message,e);break;case"format:idn-email":Ar(t,"idn-email",n.message,e);break;case"pattern:zod":Ut(t,vr.email,n.message,e);break}break;case"url":Ar(t,"uri",n.message,e);break;case"uuid":Ar(t,"uuid",n.message,e);break;case"regex":Ut(t,n.regex,n.message,e);break;case"cuid":Ut(t,vr.cuid,n.message,e);break;case"cuid2":Ut(t,vr.cuid2,n.message,e);break;case"startsWith":Ut(t,RegExp(`^${dp(n.value,e)}`),n.message,e);break;case"endsWith":Ut(t,RegExp(`${dp(n.value,e)}$`),n.message,e);break;case"datetime":Ar(t,"date-time",n.message,e);break;case"date":Ar(t,"date",n.message,e);break;case"time":Ar(t,"time",n.message,e);break;case"duration":Ar(t,"duration",n.message,e);break;case"length":ye(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),ye(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Ut(t,RegExp(dp(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Ar(t,"ipv4",n.message,e),n.version!=="v4"&&Ar(t,"ipv6",n.message,e);break}case"base64url":Ut(t,vr.base64url,n.message,e);break;case"jwt":Ut(t,vr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Ut(t,vr.ipv4Cidr,n.message,e),n.version!=="v4"&&Ut(t,vr.ipv6Cidr,n.message,e);break}case"emoji":Ut(t,vr.emoji(),n.message,e);break;case"ulid":{Ut(t,vr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Ar(t,"binary",n.message,e);break}case"contentEncoding:base64":{ye(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Ut(t,vr.base64,n.message,e);break}}break}case"nanoid":Ut(t,vr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function dp(r,e){return e.patternStrategy==="escape"?pP(r):r}var dP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function pP(r){let e="";for(let t=0;t<r.length;t++)dP.has(r[t])||(e+="\\"),e+=r[t];return e}function Ar(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}}})):ye(r,"format",e,t,n)}function Ut(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:LS(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):ye(r,"pattern",LS(e,n),t,n)}function LS(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 mI=Object.defineProperty;var $e=(r,e)=>()=>(r&&(e=r(r=0)),e);var gI=(r,e)=>{for(var t in e)mI(r,t,{get:e[t],enumerable:!0})};var GT,VT=$e(()=>{"use strict";GT=typeof globalThis=="object"?globalThis:global});var WT=$e(()=>{"use strict";VT()});var jT=$e(()=>{"use strict";WT()});var fn,Dm=$e(()=>{"use strict";fn="1.9.0"});function s0(r){var e=new Set([r]),t=new Set,n=r.match($T);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($T);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 $T,qT,KT=$e(()=>{"use strict";Dm();$T=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;qT=s0(fn)});function Di(r,e,t,n){var o;n===void 0&&(n=!1);var i=Ts[Es]=(o=Ts[Es])!==null&&o!==void 0?o:{version:fn};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!==fn){var a=new Error("@opentelemetry/api: Registration of version v"+i.version+" for "+r+" does not match previously registered API v"+fn);return t.error(a.stack||a.message),!1}return i[r]=e,t.debug("@opentelemetry/api: Registered a global for "+r+" v"+fn+"."),!0}function Sn(r){var e,t,n=(e=Ts[Es])===null||e===void 0?void 0:e.version;if(!(!n||!qT(n)))return(t=Ts[Es])===null||t===void 0?void 0:t[r]}function ki(r,e){e.debug("@opentelemetry/api: Unregistering a global for "+r+" v"+fn+".");var t=Ts[Es];t&&delete t[r]}var l0,Es,Ts,vs=$e(()=>{"use strict";jT();Dm();KT();l0=fn.split(".")[0],Es=Symbol.for("opentelemetry.js.api."+l0),Ts=GT});function As(r,e,t){var n=Sn("diag");if(n)return t.unshift(e),n[r].apply(n,u0([],c0(t),!1))}var c0,u0,YT,XT=$e(()=>{"use strict";vs();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},u0=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(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 As("debug",this._namespace,e)},r.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("error",this._namespace,e)},r.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("info",this._namespace,e)},r.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("warn",this._namespace,e)},r.prototype.verbose=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return As("verbose",this._namespace,e)},r}()});var Be,_c=$e(()=>{"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 JT(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 QT=$e(()=>{"use strict";_c()});var d0,p0,m0,qr,Rs=$e(()=>{"use strict";XT();QT();_c();vs();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},p0=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))},m0="diag",qr=function(){function r(){function e(o){return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];var s=Sn("diag");if(s)return s[o].apply(s,p0([],d0(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=Sn("diag"),d=JT((s=i.logLevel)!==null&&s!==void 0?s:Be.INFO,o);if(u&&!i.suppressOverrideMessage){var p=(c=new Error().stack)!==null&&c!==void 0?c:"<failed to generate stacktrace>";u.warn("Current logger will be overwritten from "+p),d.warn("Current logger will overwrite one already registered from "+p)}return Di("diag",d,t,!0)};t.setLogger=n,t.disable=function(){ki(m0,t)},t.createComponentLogger=function(o){return new YT(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 ZT,ev=$e(()=>{"use strict";ZT=Symbol("BaggageEntryMetadata")});function km(r){return typeof r!="string"&&(g0.error("Cannot create baggage metadata from unknown type: "+typeof r),r=""),{__TYPE__:ZT,toString:function(){return r}}}var g0,tv=$e(()=>{"use strict";Rs();ev();g0=qr.instance()});function Um(r){return Symbol.for(r)}var h0,Fm,Bm=$e(()=>{"use strict";h0=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}(),Fm=new h0});function Gm(){return Hm}var Io,f0,Ic,S0,y0,b0,E0,zm,T0,v0,A0,Hm,R0,w0,C0,x0,M0,_0,I0,Vm=$e(()=>{"use strict";Io=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)}}(),f0=function(){function r(){}return r.prototype.createGauge=function(e,t){return w0},r.prototype.createHistogram=function(e,t){return C0},r.prototype.createCounter=function(e,t){return R0},r.prototype.createUpDownCounter=function(e,t){return x0},r.prototype.createObservableGauge=function(e,t){return _0},r.prototype.createObservableCounter=function(e,t){return M0},r.prototype.createObservableUpDownCounter=function(e,t){return I0},r.prototype.addBatchObservableCallback=function(e,t){},r.prototype.removeBatchObservableCallback=function(e){},r}(),Ic=function(){function r(){}return r}(),S0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Ic),y0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n){},e}(Ic),b0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Ic),E0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n){},e}(Ic),zm=function(){function r(){}return r.prototype.addCallback=function(e){},r.prototype.removeCallback=function(e){},r}(),T0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),v0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),A0=function(r){Io(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(zm),Hm=new f0,R0=new S0,w0=new b0,C0=new E0,x0=new y0,M0=new T0,_0=new v0,I0=new A0});var Yt,rv=$e(()=>{"use strict";(function(r){r[r.INT=0]="INT",r[r.DOUBLE=1]="DOUBLE"})(Yt||(Yt={}))});var P0,O0,nv,ov=$e(()=>{"use strict";Bm();P0=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},O0=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))},nv=function(){function r(){}return r.prototype.active=function(){return Fm},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,O0([n],P0(o),!1))},r.prototype.bind=function(e,t){return t},r.prototype.enable=function(){return this},r.prototype.disable=function(){return this},r}()});var L0,N0,Wm,D0,iv,av=$e(()=>{"use strict";ov();vs();Rs();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},N0=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))},Wm="context",D0=new nv,iv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalContextManager=function(e){return Di(Wm,e,qr.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,N0([e,t,n],L0(i),!1))},r.prototype.bind=function(e,t){return this._getContextManager().bind(e,t)},r.prototype._getContextManager=function(){return Sn(Wm)||D0},r.prototype.disable=function(){this._getContextManager().disable(),ki(Wm,qr.instance())},r}()});var Ui,sv=$e(()=>{"use strict";av();Ui=iv.getInstance()});var W,lv=$e(()=>{"use strict";Rs();W=qr.instance()});var k0,cv,uv=$e(()=>{"use strict";Vm();k0=function(){function r(){}return r.prototype.getMeter=function(e,t,n){return Hm},r}(),cv=new k0});var jm,dv,pv=$e(()=>{"use strict";uv();vs();Rs();jm="metrics",dv=function(){function r(){}return r.getInstance=function(){return this._instance||(this._instance=new r),this._instance},r.prototype.setGlobalMeterProvider=function(e){return Di(jm,e,qr.instance())},r.prototype.getMeterProvider=function(){return Sn(jm)||cv},r.prototype.getMeter=function(e,t,n){return this.getMeterProvider().getMeter(e,t,n)},r.prototype.disable=function(){ki(jm,qr.instance())},r}()});var Pc,mv=$e(()=>{"use strict";pv();Pc=dv.getInstance()});var Ne=$e(()=>{"use strict";tv();Bm();_c();Vm();rv();sv();lv();mv()});import{Argument as Jd,Command as xj,Option as kf}from"@commander-js/extra-typings";import jF from"appium";import{z as Zd}from"zod";var Fj=Zd.object({input:Zd.string(),agentConfigVersion:Zd.string().optional()});import{z as ut}from"zod";var Hj=ut.object({srcs:ut.array(ut.string()),urls:ut.array(ut.string()),desiredSrc:ut.string().optional(),desiredUrl:ut.string().optional()}),Bf=ut.object({srcRegex:ut.string().optional(),urlRegex:ut.string().optional()}),zf=ut.object({x:ut.number(),y:ut.number(),correlation:ut.number()}),Gj=ut.object({searchImageBase64String:ut.string(),pageImageBase64String:ut.string(),id:ut.string().uuid(),timeoutMs:ut.number().max(1e4).min(0).optional()});import{z as _}from"zod";import*as N from"zod";import{extendZodWithOpenApi as hI}from"zod-openapi";import Ta from"zod";var va=Ta.object({updatedAt:Ta.coerce.date().optional()}),Zo=Ta.object({contentType:Ta.enum(["image/jpeg","image/png"]),id:Ta.string()});hI(N);var Cn=(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))(Cn||{}),fI=N.object({mPathSelectorTokens:N.string().array(),frameSrcRegex:N.string().optional(),frameUrlRegex:N.string().optional(),indices:N.number().array()}),Aa=N.object({result:N.number(),traceId:N.string()}).array(),cn=N.object({type:N.literal("GCS_TRACES"),traces:Aa}),Lt=(o=>(o.PRECISE="precise",o.NARROW="narrow",o.BROAD="broad",o.IRRELEVANT="irrelevant",o))(Lt||{}),Hf=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(Lt)}).optional(),shape:N.object({width:N.number(),height:N.number(),tolerance:N.nativeEnum(Lt)}).optional(),boundingBox:N.object({x:N.number(),y:N.number(),width:N.number(),height:N.number()}).optional()}),SI=N.object({selectors:N.string().array(),requirements:Hf.optional()}),xn=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:Hf.optional(),additionalElements:SI.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().or(Zo.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:fI.optional(),inputDescription:N.string().optional().describe("the description that generated this cache"),targetSource:N.nativeEnum(Cn).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:cn.optional()}).openapi({ref:"ElementTargetCache"});function El(r){return!!(r.serializedHtml||r.screenshotUrl||r.generatedSelectors||r.hybridSelector)}var yI=N.object({type:N.literal("description"),elementDescriptor:N.string().describe("Description of the element.")}).openapi({ref:"DescriptionTarget"}),bI=N.object({x:N.number(),y:N.number()}),EI=N.object({type:N.literal("coordinates"),pixels:bI}).openapi({ref:"CoordinatesTarget"});function Mn(r){return r.type==="description"}function kr(r){return r.type==="coordinates"}var Ct=N.discriminatedUnion("type",[yI,EI]).openapi({ref:"ElementTarget"});function ep(r){if(!r)return!1;switch(r.type){case"description":return!!r.elementDescriptor}return!0}function Gf(r){return cn.safeParse(r).success}import{v4 as we}from"uuid";import*as S from"zod";import{extendZodWithOpenApi as PI}from"zod-openapi";import{z as he}from"zod";import{extendZodWithOpenApi as TI}from"zod-openapi";import{z as Ra}from"zod";var wa=Ra.object({result:Ra.boolean(),traceId:Ra.string()}).array(),Ca=Ra.object({type:Ra.literal("GCS_TRACES"),traces:wa}),_n=va.extend({memory:Ca.optional()});TI(he);var Vf=he.object({thoughts:he.string(),result:he.boolean(),relevantElements:he.array(he.number()).optional(),updatedMemory:wa.optional()}),er=(o=>(o.CONTAINS="CONTAINS",o.STARTS_WITH="STARTS_WITH",o.EQUALS="EQUALS",o.EXISTS="EXISTS",o))(er||{});var vI=he.object({type:he.literal("ELEMENT_NAME"),negated:he.boolean().optional(),operation:he.nativeEnum(er),value:he.string()}).openapi({ref:"ElementNameAssertion"}),AI=he.object({type:he.literal("ELEMENT_STYLE"),negated:he.boolean().optional(),operation:he.nativeEnum(er),property:he.string(),value:he.string()}).openapi({ref:"ElementStyleAssertion"}),RI=he.object({type:he.literal("ELEMENT_CONTENT"),negated:he.boolean().optional(),operation:he.nativeEnum(er),value:he.string()}).openapi({ref:"ElementContentAssertion"}),wI=he.object({type:he.literal("ELEMENT_ATTRIBUTE"),negated:he.boolean().optional(),operation:he.nativeEnum(er),attr:he.string(),value:he.string()}).openapi({ref:"ElementAttributeValueAssertion"}),Ur=(i=>(i.EXISTS="EXISTS",i.VISIBLE="VISIBLE",i.ENABLED="ENABLED",i.EDITABLE="EDITABLE",i.FOCUSED="FOCUSED",i))(Ur||{});var CI=he.object({type:he.literal("ELEMENT_EXISTENCE"),negated:he.boolean().optional(),condition:he.nativeEnum(Ur).describe("Treated as the element exists AND is also ...")}).openapi({ref:"ElementExistenceAssertion"}),Tl=he.discriminatedUnion("type",[RI,wI,CI,vI,AI]).openapi({ref:"ManualElementAssertion"});var xI=he.object({type:he.literal("CONTENT"),negated:he.boolean().optional(),value:he.string()}).openapi({ref:"PageContentAssertion"}),Wf=he.discriminatedUnion("type",[xI]).openapi({ref:"ManualPageAssertion"});import Nt from"zod";var tp=Nt.discriminatedUnion("type",[Nt.object({type:Nt.literal("SUBSTRING"),url:Nt.string()}),Nt.object({type:Nt.literal("GLOB"),glob:Nt.string()}),Nt.object({type:Nt.literal("REGEX"),regex:Nt.string()}),Nt.object({type:Nt.literal("DOMAIN"),domain:Nt.string()})]),xa=Nt.object({urlMatcher:tp,method:Nt.string().optional()});import{z as ue}from"zod";var MI=ue.object({type:ue.literal("json"),content:ue.string().describe("The JSON content to send in the request body")}),_I=ue.object({type:ue.literal("form-urlencoded"),content:ue.record(ue.string(),ue.string()).describe("The form fields to send in the request body")}),II=ue.discriminatedUnion("type",[MI,_I]),uo=ue.object({url:ue.string(),method:ue.union([ue.literal("GET"),ue.literal("POST"),ue.literal("PUT"),ue.literal("DELETE"),ue.literal("PATCH")]),headers:ue.record(ue.string(),ue.string()).optional(),params:ue.record(ue.string(),ue.string()).optional(),body:II.optional(),timeout:ue.number().int().optional().describe("Max seconds to wait for the request to complete")}),jf=ue.object({url:ue.string(),headers:ue.record(ue.string(),ue.string()).optional(),query:ue.string(),variables:ue.string().optional(),timeout:ue.number().int().optional().describe("Max seconds to wait for the request to complete")}),vl=ue.object({code:ue.string(),fragment:ue.boolean().optional().describe("Agents should not touch this unless explicitly told to"),environment:ue.union([ue.literal("NODE"),ue.literal("BROWSER")]).optional().describe("default NODE, Agents default to using node unless it is necessary to use browser"),timeout:ue.number().int().max(60).optional().describe("Max seconds for the code to complete")});var rt=($=>($.AI_EXTRACT="AI_EXTRACT",$.AI_ASSERTION="AI_ASSERTION",$.AUTH_LOAD="AUTH_LOAD",$.AUTH_SAVE="AUTH_SAVE",$.BLUR="BLUR",$.CAPTCHA="CAPTCHA",$.CLICK="CLICK",$.COOKIE="COOKIE",$.COPY="COPY",$.DIALOG="DIALOG",$.DRAG="DRAG",$.ELEMENT_CHECK="ELEMENT_CHECK",$.FILE_UPLOAD="FILE_UPLOAD",$.FOCUS="FOCUS",$.GO_BACK="GO_BACK",$.GO_FORWARD="GO_FORWARD",$.HOVER="HOVER",$.JAVASCRIPT="JAVASCRIPT",$.LOCAL_STORAGE="LOCAL_STORAGE",$.MOUSE_DRAG="MOUSE_DRAG",$.NAVIGATE="NAVIGATE",$.NEW_TAB="NEW_TAB",$.PAGE_CHECK="PAGE_CHECK",$.PASTE="PASTE",$.PRESS="PRESS",$.KEY_DOWN="KEY_DOWN",$.KEY_UP="KEY_UP",$.REFRESH="REFRESH",$.REQUEST="REQUEST",$.GRAPHQL_REQUEST="GRAPHQL_REQUEST",$.SCROLL_DOWN="SCROLL_DOWN",$.SCROLL_UP="SCROLL_UP",$.SCROLL_LEFT="SCROLL_LEFT",$.SCROLL_RIGHT="SCROLL_RIGHT",$.SELECT_OPTION="SELECT_OPTION",$.SWITCH_TAB="TAB",$.TYPE="TYPE",$.VISUAL_DIFF="VISUAL_DIFF",$.WAIT="WAIT",$.WAIT_FOR_URL="WAIT_FOR_URL",$.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="SUCCESS",$))(rt||{});PI(S);var Q=S.object({thoughts:S.string().optional(),id:S.string().uuid().describe("unique identifier to this step, used for step cache")}),tr=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"}),rr=va.extend({target:xn}).optional().openapi({ref:"SingleTargetCache"});function $f(r){return rr.safeParse(r).success}var Al=S.object({loadTimeout:S.number().int().max(60).optional().describe("Max seconds for the page to load")}),qf=Q.merge(Al).merge(S.object({type:S.literal("NAVIGATE"),url:S.string()})).openapi({ref:"NavigateCommand"}),Rl=tr.merge(S.object({cache:rr})),po=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_UP"),deltaY:S.number().optional()}))).openapi({ref:"ScrollUpCommand"}),mo=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_DOWN"),deltaY:S.number().optional()}))).openapi({ref:"ScrollDownCommand"}),ei=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_LEFT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollLeftCommand"}),ti=Q.merge(Rl.merge(S.object({target:Ct.optional(),type:S.literal("SCROLL_RIGHT"),deltaX:S.number().optional()}))).openapi({ref:"ScrollRightCommand"}),A$=S.discriminatedUnion("type",[po,mo,ei,ti]).openapi({ref:"AllScrollCommands"}),OI=Q.merge(S.object({type:S.literal("DIALOG"),action:S.union([S.literal("ACCEPT"),S.literal("DISMISS")])})).openapi({ref:"DialogCommand"}),Kf=Q.merge(S.object({type:S.literal("WAIT"),delay:S.number()})).openapi({ref:"WaitCommand"}),LI=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")}),Yf=Q.extend({type:S.literal("WAIT_FOR_URL"),matcher:tp}).merge(LI).openapi({ref:"WaitUrlCommand"}),Xf=Q.merge(Al).merge(S.object({type:S.literal("REFRESH")})).openapi({ref:"RefreshCommand"}),Jf=Q.merge(S.object({type:S.literal("GO_BACK")})).openapi({ref:"GoBackCommand"}),Qf=Q.merge(S.object({type:S.literal("GO_FORWARD")})).openapi({ref:"GoForwardCommand"}),NI=Q.extend({type:S.literal("AUTH_SAVE")}).openapi({ref:"AuthSaveCommand"}),DI=Q.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"}),np=Q.merge(tr).extend({type:S.literal("CAPTCHA")}).openapi({ref:"CaptchaCommand"}),Zf=Q.extend({type:S.literal("COPY"),value:S.string()}).openapi({ref:"CopyCommand"}),eS=Q.extend({type:S.literal("PASTE")}).openapi({ref:"PasteCommand"}),tS=Q.merge(vl).extend({type:S.literal("JAVASCRIPT")}).openapi({ref:"JavaScriptCommand"}),ri=Q.merge(tr).extend({type:S.literal("CLICK"),target:Ct,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:rr,relativePosition:S.object({x:S.number(),y:S.number()}).optional()}).openapi({ref:"ClickCommand"}),rS=va.extend({fromTarget:xn.optional(),toTarget:xn.optional()}),ni=Q.merge(tr).merge(S.object({type:S.literal("DRAG"),fromTarget:Ct,toTarget:Ct,steps:S.number().optional(),hoverSeconds:S.number().optional().describe("Seconds to hover the object before dropping"),cache:rS.optional()})).openapi({ref:"DragCommand"}),oi=Q.merge(tr).merge(S.object({type:S.literal("MOUSE_DRAG"),target:Ct.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:rr})).openapi({ref:"MouseDragCommand"}),ii=Q.merge(tr).merge(S.object({type:S.literal("HOVER"),target:Ct,cache:rr})).openapi({ref:"HoverCommand"}),Ma=Q.merge(tr).merge(S.object({type:S.literal("FOCUS"),target:Ct,cache:rr})).openapi({ref:"FocusCommand"}),_a=Q.merge(tr).extend({type:S.literal("BLUR"),target:Ct.optional(),cache:rr}).openapi({ref:"BlurCommand"}),kI=S.object({type:S.literal("URL"),url:S.string()}).describe("Accessible link to the file, either public http or local file://").openapi({ref:"UrlSource"}),UI=S.object({type:S.literal("USER_FILE"),name:S.string()}).describe("Accessible link to the file, references the google cloud file").openapi({ref:"UploadedFileSource"}),FI=Q.extend({type:S.literal("FILE_UPLOAD"),fileSource:S.discriminatedUnion("type",[kI,UI]),filename:S.string().optional()}).openapi({ref:"FileUploadCommand"}),nS=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()})]),ai=Q.merge(tr).extend({type:S.literal("SELECT_OPTION"),target:Ct,cache:rr,choice:nS.describe("new field for selecting options, optional for backcompat")}).openapi({ref:"SelectOptionCommand"}),op=S.union([S.literal("MULTIMODAL"),S.literal("VISION_ONLY")]),Ia=Q.merge(S.object({type:S.literal("AI_ASSERTION"),assertion:S.string(),disableCache:S.boolean().optional(),iframeUrl:S.string().optional(),contextChoice:op.optional(),timeout:S.number().int().optional().describe("Max seconds to wait for assertion to be true"),cache:_n.optional(),source:S.string().optional()})).openapi({ref:"AIAssertionCommand"}),Dt=5,si=600,li=Q.merge(tr).extend({type:S.literal("ELEMENT_CHECK"),target:Ct,assertion:Tl,cache:rr.or(_n).optional(),timeout:S.number().int().min(0).max(si).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"ElementAssertionCommand"}),oS=Q.extend({type:S.literal("PAGE_CHECK"),assertion:Wf,iframeUrl:S.string().optional().describe("url or url regex for the iframe"),timeout:S.number().int().min(0).max(si).optional().describe("max seconds to wait for the assertion to be true")}).openapi({ref:"PageAssertionCommand"}),iS=Q.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"}),BI=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()}),aS=25,ci=Q.merge(tr).merge(BI).extend({type:S.literal("TYPE"),target:Ct.optional(),value:S.string(),cache:rr}).openapi({ref:"TypeCommand"}),sS=Q.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"}),lS=Q.merge(S.object({type:S.literal("KEY_DOWN"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyDownCommand"}),cS=Q.merge(S.object({type:S.literal("KEY_UP"),value:S.string(),convertMeta:S.boolean().optional()})).openapi({ref:"KeyUpCommand"}),zI=S.object({type:S.literal("SUBSTRING"),substring:S.string()}),HI=S.object({type:S.literal("REGEX"),pattern:S.string()}),GI=S.object({type:S.literal("INDEX"),index:S.coerce.string()}),VI=S.discriminatedUnion("type",[zI,HI,GI]),WI=Q.merge(Al).merge(S.object({type:S.literal("TAB"),action:VI})).openapi({ref:"TabCommand"}),uS=Q.merge(Al).merge(S.object({type:S.literal("NEW_TAB"),url:S.string()})).openapi({ref:"NewTabCommand"}),jI=Q.merge(S.object({type:S.literal("COOKIE"),value:S.string()})).openapi({ref:"CookieCommand"}),dS=Q.merge(S.object({type:S.literal("LOCAL_STORAGE"),key:S.string(),value:S.string()})).openapi({ref:"LocalStorageCommand"}),pS=Q.extend({type:S.literal("REQUEST")}).merge(uo).openapi({ref:"RequestCommand"}),Pa=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()})}),mS=Q.extend({type:S.literal("GRAPHQL_REQUEST")}).merge(jf).openapi({ref:"GraphQLRequestCommand"}),gS=Q.merge(S.object({type:S.literal("SUCCESS"),condition:Ia.optional()})).openapi({ref:"SuccessCommand"}),hS=Q.merge(S.object({type:S.literal("FAILURE")})).openapi({ref:"FailureCommand"}),$I=S.object({data:S.union([S.string().describe("location at which to find a jpg - public URL or local"),Zo]),width:S.number(),height:S.number()});var Oa=Q.merge(tr).merge(S.object({type:S.literal("VISUAL_DIFF"),threshold:S.number().optional().describe("default 0.1"),target:Ct.optional(),screenshot:$I.optional(),cache:rr})).openapi({ref:"VisualDiffCommand"}),qI=Q.merge(S.object({type:S.literal("REGISTER_REQUEST_LISTENER"),requestMatcher:xa,key:S.string()})).openapi({ref:"RegisterRequestListenerCommand"}),KI=Q.merge(S.object({type:S.literal("AWAIT_LISTENER"),key:S.string(),timeout:S.number().optional().describe("timeout")})).openapi({ref:"WaitForListenerCommand"}),YI=Q.merge(S.object({type:S.literal("RECORD_REQUESTS"),requestMatcher:xa,key:S.string()})).openapi({ref:"RecordRequestsCommand"}),XI=Q.merge(S.object({type:S.literal("GET_RECORDED_REQUESTS"),key:S.string()})).openapi({ref:"GetRecordedRequestsCommand"}),JI=Q.merge(S.object({type:S.literal("SET_HEADER"),name:S.string(),value:S.string(),requestMatcher:xa.optional()})).openapi({ref:"SetHeaderCommand"}),QI=Q.merge(S.object({type:S.literal("MOCK_ROUTE"),requestMatcher:xa,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"})),ZI=Q.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"})),eP=Q.merge(S.object({type:S.literal("OFFLINE_MODE"),enable:S.boolean()})).openapi({ref:"OfflineModeCommand"}),tP=["CLICK","TYPE","PRESS","KEY_DOWN","KEY_UP","SELECT_OPTION","NAVIGATE","SCROLL_DOWN","SCROLL_UP","AI_ASSERTION","GO_BACK","HOVER","WAIT"],R$=[...tP,"DRAG"],rP=S.discriminatedUnion("type",[ri,ci,sS,lS,cS,ai,qf,mo,po,Ia,Jf,ii,Kf]),nP=S.discriminatedUnion("type",[...rP.options,ni]),oP=S.discriminatedUnion("type",[...nP.options]),fS=S.discriminatedUnion("type",[...oP.options,gS]),ip=S.discriminatedUnion("type",[gS,ri,ci,sS,lS,cS,ai,qf,mo,po,Ia,Jf,ii,Kf,tS,li,oS,uS,Yf,iS,Zf,Qf,dS,ni,oi,eS,Xf,pS,mS]),iP=S.discriminatedUnion("type",[iS,DI,NI,np,jI,Zf,OI,li,FI,Qf,tS,dS,oi,uS,oS,eS,Xf,pS,mS,ei,ti,WI,Oa,Ma,_a,Yf,qI,KI,YI,XI,JI,QI,ZI,eP]),ui=S.discriminatedUnion("type",[...fS.options,...iP.options]).openapi({ref:"Command"}),wl=S.discriminatedUnion("type",[...fS.options,hS]),w$=S.discriminatedUnion("type",[...ip.options,hS]);function un(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:we(),type:r};break;case"AUTH_LOAD":{e={id:we(),type:r,storageState:""};break}case"AI_EXTRACT":e={id:we(),type:r,goal:""};break;case"DIALOG":e={id:we(),type:r,action:"DISMISS"};break;case"DRAG":e={id:we(),type:r,fromTarget:{type:"description",elementDescriptor:""},toTarget:{type:"description",elementDescriptor:""}};break;case"MOUSE_DRAG":e={id:we(),type:r,deltaX:"0",deltaY:"0",steps:1};break;case"WAIT_FOR_URL":e={id:we(),type:r,matcher:{type:"SUBSTRING",url:""}};break;case"WAIT":e={id:we(),type:r,delay:1};break;case"BLUR":e={id:we(),type:r};break;case"HOVER":case"FOCUS":case"CLICK":e={id:we(),type:r,target:{type:"description",elementDescriptor:""}};break;case"COOKIE":case"PRESS":case"COPY":case"TYPE":e={id:we(),type:r,value:"",clearContent:!0};break;case"KEY_DOWN":case"KEY_UP":e={id:we(),type:r,value:""};break;case"SELECT_OPTION":e={id:we(),type:r,target:{type:"description",elementDescriptor:""},choice:{type:"VALUE",value:""}};break;case"NAVIGATE":case"NEW_TAB":return{id:we(),type:r,url:""};case"TAB":e={id:we(),type:r,action:{type:"SUBSTRING",substring:""}};break;case"REQUEST":e={id:we(),type:r,url:"",method:"GET"};break;case"GRAPHQL_REQUEST":e={id:we(),type:r,url:"",query:""};break;case"LOCAL_STORAGE":e={id:we(),type:r,key:"",value:""};break;case"JAVASCRIPT":e={id:we(),type:r,code:""};break;case"AI_ASSERTION":e={id:we(),type:r,assertion:""};break;case"FILE_UPLOAD":{e={id:we(),type:r,fileSource:{type:"URL",url:""}};break}case"ELEMENT_CHECK":{e={id:we(),type:r,target:{type:"description",elementDescriptor:""},assertion:{type:"ELEMENT_EXISTENCE",condition:"EXISTS"}};break}case"PAGE_CHECK":{e={id:we(),type:r,assertion:{type:"CONTENT",value:""}};break}case"REGISTER_REQUEST_LISTENER":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"AWAIT_LISTENER":{e={id:we(),type:r,key:""};break}case"RECORD_REQUESTS":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},key:""};break}case"GET_RECORDED_REQUESTS":{e={id:we(),type:r,key:""};break}case"SET_HEADER":{e={id:we(),type:r,name:"",value:""};break}case"MOCK_ROUTE":{e={id:we(),type:r,requestMatcher:{urlMatcher:{type:"REGEX",regex:""}},responseGenerator:""};break}case"REMOVE_ROUTE_MOCK":{e={id:we(),type:r};break}case"OFFLINE_MODE":{e={id:we(),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 SS(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 aP}from"zod";var I$=aP.discriminatedUnion("type",[_a,np,ri,ni,Ma,ii,oi,po,mo,ei,ti,ai,ci,Oa,li]);import{z as sP}from"zod";import{z as Pn}from"zod";function La(r){return Pn.object({key:Pn.string(),testId:Pn.string().optional(),moduleId:Pn.string().optional(),organizationId:Pn.string(),value:r})}function Na(r){return La(r).extend({uniqueKey:Pn.string()})}function Cl(r){return Pn.record(Pn.string(),Na(r))}var kt={type:!0,cache:!0},di=sP.discriminatedUnion("type",[Ia.pick(kt),_a.pick(kt),ri.pick(kt),ni.pick(kt),li.pick(kt),Ma.pick(kt),ii.pick(kt),oi.pick(kt),po.pick(kt),mo.pick(kt),ei.pick(kt),ti.pick(kt),ai.pick(kt),ci.pick(kt),Oa.pick(kt)]),ap=Object.values(rt).filter(r=>di.options.some(e=>e.shape.type.safeParse(r).success));ui.options.forEach(r=>{if("target"in r.shape&&!ap.includes(r.shape.type.value))throw new Error(`Command ${r.shape.type.value} has a target but no cache`)});function sp(r){return ap.includes(r.type)}var yS=La(di),bS=Na(di),F$=Cl(di);import{v4 as FK}from"uuid";import{z as A}from"zod";var TS=Symbol("Let zodToJsonSchema decide on which parser to use");var ES={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"},vS=r=>typeof r=="string"?{...ES,name:r}:{...ES,...r};var AS=r=>{let e=vS(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 lp(r,e,t,n){n?.errorMessages&&t&&(r.errorMessage={...r.errorMessage,[e]:t})}function ye(r,e,t,n,o){r[e]=t,lp(r,e,n,o)}var xl=(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 Se}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"?xl(e,r.currentPath):e.join("/")}}import{ZodFirstPartyTypeKind as lP}from"zod";function RS(r,e){let t={type:"array"};return r.type?._def&&r.type?._def?.typeName!==lP.ZodAny&&(t.items=Z(r.type._def,{...e,currentPath:[...e.currentPath,"items"]})),r.minLength&&ye(t,"minItems",r.minLength.value,r.minLength.message,e),r.maxLength&&ye(t,"maxItems",r.maxLength.value,r.maxLength.message,e),r.exactLength&&(ye(t,"minItems",r.exactLength.value,r.exactLength.message,e),ye(t,"maxItems",r.exactLength.value,r.exactLength.message,e)),t}function wS(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?ye(t,"minimum",n.value,n.message,e):ye(t,"exclusiveMinimum",n.value,n.message,e):(n.inclusive||(t.exclusiveMinimum=!0),ye(t,"minimum",n.value,n.message,e));break;case"max":e.target==="jsonSchema7"?n.inclusive?ye(t,"maximum",n.value,n.message,e):ye(t,"exclusiveMaximum",n.value,n.message,e):(n.inclusive||(t.exclusiveMaximum=!0),ye(t,"maximum",n.value,n.message,e));break;case"multipleOf":ye(t,"multipleOf",n.value,n.message,e);break}return t}function CS(){return{type:"boolean"}}function Ml(r,e){return Z(r.type._def,e)}var xS=(r,e)=>Z(r.innerType._def,e);function cp(r,e,t){let n=t??e.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,i)=>cp(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 cP(r,e)}}var cP=(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":ye(t,"minimum",n.value,n.message,e);break;case"max":ye(t,"maximum",n.value,n.message,e);break}return t};function MS(r,e){return{...Z(r.innerType._def,e),default:r.defaultValue()}}function _S(r,e){return e.effectStrategy==="input"?Z(r.schema._def,e):ze(e)}function IS(r){return{type:"string",enum:Array.from(r.values)}}var uP=r=>"type"in r&&r.type==="string"?!1:"allOf"in r;function PS(r,e){let t=[Z(r.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),Z(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(uP(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 OS(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 Da}from"zod";var up,vr={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:()=>(up===void 0&&(up=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u")),up),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 _l(r,e){let t={type:"string"};if(r.checks)for(let n of r.checks)switch(n.kind){case"min":ye(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e);break;case"max":ye(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":Ar(t,"email",n.message,e);break;case"format:idn-email":Ar(t,"idn-email",n.message,e);break;case"pattern:zod":Ut(t,vr.email,n.message,e);break}break;case"url":Ar(t,"uri",n.message,e);break;case"uuid":Ar(t,"uuid",n.message,e);break;case"regex":Ut(t,n.regex,n.message,e);break;case"cuid":Ut(t,vr.cuid,n.message,e);break;case"cuid2":Ut(t,vr.cuid2,n.message,e);break;case"startsWith":Ut(t,RegExp(`^${dp(n.value,e)}`),n.message,e);break;case"endsWith":Ut(t,RegExp(`${dp(n.value,e)}$`),n.message,e);break;case"datetime":Ar(t,"date-time",n.message,e);break;case"date":Ar(t,"date",n.message,e);break;case"time":Ar(t,"time",n.message,e);break;case"duration":Ar(t,"duration",n.message,e);break;case"length":ye(t,"minLength",typeof t.minLength=="number"?Math.max(t.minLength,n.value):n.value,n.message,e),ye(t,"maxLength",typeof t.maxLength=="number"?Math.min(t.maxLength,n.value):n.value,n.message,e);break;case"includes":{Ut(t,RegExp(dp(n.value,e)),n.message,e);break}case"ip":{n.version!=="v6"&&Ar(t,"ipv4",n.message,e),n.version!=="v4"&&Ar(t,"ipv6",n.message,e);break}case"base64url":Ut(t,vr.base64url,n.message,e);break;case"jwt":Ut(t,vr.jwt,n.message,e);break;case"cidr":{n.version!=="v6"&&Ut(t,vr.ipv4Cidr,n.message,e),n.version!=="v4"&&Ut(t,vr.ipv6Cidr,n.message,e);break}case"emoji":Ut(t,vr.emoji(),n.message,e);break;case"ulid":{Ut(t,vr.ulid,n.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{Ar(t,"binary",n.message,e);break}case"contentEncoding:base64":{ye(t,"contentEncoding","base64",n.message,e);break}case"pattern:zod":{Ut(t,vr.base64,n.message,e);break}}break}case"nanoid":Ut(t,vr.nanoid,n.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:}return t}function dp(r,e){return e.patternStrategy==="escape"?pP(r):r}var dP=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");function pP(r){let e="";for(let t=0;t<r.length;t++)dP.has(r[t])||(e+="\\"),e+=r[t];return e}function Ar(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}}})):ye(r,"format",e,t,n)}function Ut(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:LS(e,n),...t&&n.errorMessages&&{errorMessage:{pattern:t}}})):ye(r,"pattern",LS(e,n),t,n)}function LS(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
@@ -24,7 +24,7 @@ ${this.decisions.map(e=>e.toString()).join(`
24
24
  `).slice(o).filter(Boolean).join(`
25
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",Ss(e,...t))}error(e,...t){this._log("error",Ss(e,...t))}info(e,...t){this._log("info",Ss(e,...t))}log(e,...t){this._log("log",Ss(e,...t))}warn(e,...t){this._log("warn",Ss(e,...t))}getBuffer(){return this._buffer.length>0?this._buffer:void 0}};function CT(r){let e=globalThis.console,t=new Ac;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 _m=" ".repeat(6);import ND from"fetch-retry";import DD from"os";import xT,{multistream as kD}from"pino";import UD from"pino-pretty";import FD from"pino-std-serializers";var Pi=new Map,BD=!0,MT="Log throttle exceeded",zD=100,HD=5e3,GD=ND(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}}),Im=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??DD.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=BD?xT(a):xT(a,kD([{stream:UD({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 GD(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Mo(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===MT)return!0;let t=Date.now();return t-this.lastWindowStart>HD&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,MT),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<zD?(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(ms[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=FD.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:dE({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,Pi.set("app",this),Pi.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=pE[e]):(this.minLevelValue=ms[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},Oi=({app:r,hostname:e,disableConsoleLogs:t})=>(Pi.has(r)||Pi.set(r,new Im({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Pi.get(r));async function _T(){await Promise.all([...Pi.values()].map(r=>r.flush()))}import{hostname as VD}from"os";var pr=Oi({app:"cli",hostname:VD(),disableConsoleLogs:!0}).child({cliVersion:"0.19.0"});function Pm(r){if(!r)return;r=r.toLowerCase();let e=hc.safeParse(r);if(e.success)return R.setMinLevel(e.data),e.data}function IT({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 CT(()=>{if(c.forEach(u=>{R.log(""),o(u)}),c.length){R.log("");let u=c.length===1?"":"s";R.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{R.dimmed(n(d))})}if(l.length){R.log("");let u=l.length===1?"":"s";R.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{R.dimmed(n(d))})}if(a.length){R.log("");let u=a.length===1?"":"s";R.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{R.dimmed(n(d))})}if(s.length){R.log("");let u=s.length===1?"":"s";R.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{R.dimmed(n(d))})}if(i.length){R.log("");let u=i.length===1?"":"s";R.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{R.dimmed(n(d))})}R.log(""),R.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 ys=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Li.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Li.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Li.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Li.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Li.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Li.bgMagenta.white("RUNNING"),a=0):(R.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),WD||(i=`${i}`),R.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import jD from"fs";import{tmpdir as $D}from"os";import qD from"path";import{registry as bs}from"playwright-core/lib/server";import PT from"proper-lockfile";var OT=qD.join($D(),"momenticBrowserInstallation");var Om=["chrome","chromium","chrome-for-testing","ffmpeg"],KD={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},LT={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function NT(r){if(r==="Org Default")return!1;let e=LT[KD[r]??""]??"",t=bs.findExecutable(e);return!t||t.installType==="none"?!1:Lm(t)}function Lm(r){let e=r.executablePath();return jD.existsSync(e)}function YD(r,e){let t=LT[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=bs.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Lm(n)))return n}async function XD({browser:r,force:e}){let t=YD(r,e);if(!t){R.info(`Browser '${r}' is already installed, skipping...`);return}R.info(`Installing browser '${r}'...`);try{await bs.installDeps([t],!1),await bs.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){R.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=bs.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Lm(o);)R.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Rc({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Om:Array.from(new Set(r));try{await PT.lock(OT,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){R.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 XD({browser:i,force:e})}catch(a){o=a,R.error(`Failed to install the ${i} browser: ${a}`)}}finally{await PT.unlock(OT,{realpath:!1})}if(o)throw o}import{createServer as JD}from"http";async function wc(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await Cc(o))return o}R.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function Cc(r){return new Promise((e,t)=>{let n=JD();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(R.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 gne from"blocked-at";import fne from"why-is-node-running";function DT(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 QD(r,e,t,n){if(t>r.length&&(R.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 kT(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?QD(e,t,n,o):e}function Nm({regenerateCache:r,saveCache:e,disableCache:t}){if(t){if(r)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(e)throw new Error("--disable-cache and --save-cache cannot be used together.")}}import dB from"fs";import One,{multistream as Nne}from"pino";import kne from"pino-pretty";var Bne=5*1024,ZD="...[truncated]",zne=Buffer.byteLength(ZD,"utf8");import{PostHog as Xne}from"posthog-node";var Gn=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var UT=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:p}=e;if(p.aborted)return c(UT(p));l=()=>c(UT(p)),p.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(p){c(p)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new Gn(o??`Promise timed out after ${t}ms`);c(p)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(p=>{d(),s(p)}).catch(p=>{d(),c(p)})})}import{PostHog as ioe}from"posthog-node";import{execSync as e0}from"child_process";import Ni from"os";import t0 from"v8";var FT,$r,zT=Ni.platform(),r0=Ni.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),{}),BT=r=>{try{let e={},t=!1,n=n0(),o=o0(),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=t0.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"),_o&&R.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function HT(r){if(!Wr)return BT(r),{interval:setInterval(()=>BT(r),2e4),cpuMetadata:r0,platform:zT}}function n0(){let r=Ni.totalmem(),e=zT==="darwin"?i0():(()=>{let n=Ni.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function o0(){let r=Ni.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,!$r)return $r=t,null;let n={user:t.user-$r.user,nice:t.nice-$r.nice,sys:t.sys-$r.sys,idle:t.idle-$r.idle,irq:t.irq-$r.irq,total:t.total-$r.total};return FT={measurementTime:e,intervalMs:e-$r.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},$r=t,FT}function i0(){try{let r=e0("/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 p=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return p?Number.parseInt(p,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=Ni.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var xc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function a0(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 Mc(r,e){let t=a0(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var gv="=",Oc=";",$m=",";var hv=8192;var Fi={};gI(Fi,{getKeyPairs:()=>B0,parseKeyPairsIntoRecord:()=>z0,parsePairKeyValue:()=>fv,serializeKeyPairs:()=>F0});Ne();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};function F0(r){return r.reduce(function(e,t){var n=""+e+(e!==""?$m:"")+t;return n.length>hv?e:n},"")}function B0(r){return r.getAllEntries().map(function(e){var t=U0(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=Oc+o.metadata.toString()),i})}function fv(r){var e=r.split(Oc);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(gv);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=km(e.join(Oc))),{key:o,value:i,metadata:a}}}}}function z0(r){return typeof r!="string"||r.length===0?{}:r.split($m).map(function(e){return fv(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Ne();var Lc;(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"})(Lc||(Lc={}));var H0=",",G0=["OTEL_SDK_DISABLED"];function V0(r){return G0.indexOf(r)>-1}var W0=["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 j0(r){return W0.indexOf(r)>-1}var $0=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function q0(r){return $0.indexOf(r)>-1}var qm=1/0,Km=128,K0=128,Y0=128,Ym={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:qm,OTEL_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:qm,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:qm,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:K0,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:Y0,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:Lc.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 X0(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function J0(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 Q0(r,e,t,n){n===void 0&&(n=H0);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var Z0={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function ek(r,e,t){var n=t[r];if(typeof n=="string"){var o=Z0[n.toUpperCase()];o!=null&&(e[r]=o)}}function Sv(r){var e={};for(var t in Ym){var n=t;switch(n){case"OTEL_LOG_LEVEL":ek(n,e,r);break;default:if(V0(n))X0(n,e,r);else if(j0(n))J0(n,e,r);else if(q0(n))Q0(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function At(){var r=Sv(process.env);return Object.assign({},Ym,r)}function yv(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function Nc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=yv(r.charCodeAt(n)),i=yv(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var bv="1.25.1";var tk="deployment.environment";var rk="process.runtime.name";var nk="service.name";var ok="service.instance.id";var ik="telemetry.sdk.name",ak="telemetry.sdk.language",sk="telemetry.sdk.version";var Ev=tk;var Tv=rk;var Dc=nk;var vv=ok;var Cs=ik,xs=ak,Ms=sk;var lk="nodejs";var Av=lk;var Bi,kc=(Bi={},Bi[Cs]="opentelemetry",Bi[Tv]="node",Bi[xs]=Av,Bi[Ms]=bv,Bi);var ck=9,uk=6,dk=Math.pow(10,uk),pk=Math.pow(10,ck);function Rv(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*dk);return[t,n]}function wv(r){return r[0]*pk+r[1]}function _s(r){return r[0]*1e6+r[1]/1e3}var Po;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Po||(Po={}));var Cv=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 mk=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))},xv=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new Cv}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,gk([this._that],mk(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 mr;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(mr||(mr={}));var Pt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Pt||(Pt={}));var hk=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 _ae=function(r){hk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Mv(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}Ne();var gr;(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"})(gr||(gr={}));var _v=function(){function r(){this.kind=gr.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 me;(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"})(me||(me={}));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 Xm=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=Mv(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 Jm=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=gr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Xm(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 Xm(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 Xm(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:Pt.HISTOGRAM,dataPoints:n.map(function(i){var a=fk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.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}();Ne();var Qm=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},Zm=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))},eg=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,Zm([n,this._counts.length-t],Qm(this._counts.slice(t)),!1)),o.splice.apply(o,Zm([0,t],Qm(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(Zm([],Qm(this._counts),!1))},r}();var Iv=52,bk=2146435072,Ek=1048575,tg=1023,Uc=-tg+1,Fc=tg,Is=Math.pow(2,-1022);function Bc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&bk)>>20;return n-tg}function zc(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 Ps(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Ov(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)}}(),Vn=function(r){Tk(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Nv=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Is)return this._minNormalLowerBoundaryIndex();var t=Bc(e),n=this._rightShift(zc(e)-1,Iv);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Vn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Vn("overflow: "+e+" is > maximum lower boundary: "+n);return Ps(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=Uc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Fc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var Dv=function(){function r(e){this._scale=e,this._scaleFactor=Ps(Math.LOG2E,e),this._inverseFactor=Ps(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Is)return this._minNormalLowerBoundaryIndex()-1;if(zc(e)===0){var t=Bc(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 Vn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Is;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Vn("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 Uc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Fc+1<<this._scale)-1},r}();var kv=-10,Uv=20,vk=Array.from({length:31},function(r,e){return e>10?new Dv(e-10):new Nv(e-10)});function rg(r){if(r>Uv||r<kv)throw new Vn("expected scale >= "+kv+" && <= "+Uv+", 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},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}(),Rk=20,wk=160,ng=2,Ck=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=wk),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 eg),u===void 0&&(u=new eg),d===void 0&&(d=rg(Rk)),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<ng&&(W.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+ng),this._maxSize=ng)}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=Ov(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=rg(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 Fv=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=gr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Ck(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:Pt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Ak(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.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 xk=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},og=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=Rv(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Bv=function(){function r(){this.kind=gr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new og(e)},r.prototype.merge=function(e,t){var n=_s(t.sampleTime)>=_s(e.sampleTime)?t:e;return new og(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=_s(t.sampleTime)>=_s(e.sampleTime)?t:e;return new og(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Pt.GAUGE,dataPoints:n.map(function(i){var a=xk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var Mk=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 ig=function(){function r(e){this.monotonic=e,this.kind=gr.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:Pt.SUM,dataPoints:n.map(function(i){var a=Mk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Oo=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)}}(),Kr=function(){function r(){}return r.Drop=function(){return qv},r.Sum=function(){return Kv},r.LastValue=function(){return Yv},r.Histogram=function(){return Xv},r.ExponentialHistogram=function(){return _k},r.Default=function(){return Ik},r}();var zv=function(r){Oo(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 _v,e}(Kr);var Hv=function(r){Oo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new ig(!0),e.NON_MONOTONIC_INSTANCE=new ig(!1),e}(Kr);var Gv=function(r){Oo(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 Bv,e}(Kr);var Vv=function(r){Oo(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 Jm([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Kr);var Wv=function(r){Oo(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 Jm(this._boundaries,this._recordMinMax)},e}(Kr);var jv=function(r){Oo(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 Fv(this._maxSize,this._recordMinMax)},e}(Kr);var $v=function(r){Oo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case me.COUNTER:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return Kv;case me.GAUGE:case me.OBSERVABLE_GAUGE:return Yv;case me.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Wv(t.advice.explicitBucketBoundaries):Xv}return W.warn("Unable to recognize instrument type: "+t.type),qv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Kr);var qv=new zv,Kv=new Hv,Yv=new Gv,Xv=new Vv,_k=new jv,Ik=new $v;Ne();function Gc(){return"unknown_service:"+process.argv0}var Wn=function(){return Wn=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},Wn.apply(this,arguments)},Pk=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())})},Ok=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}}},Lk=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},ag=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 W.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]=Gc(),e[xs]=kc[xs],e[Cs]=kc[Cs],e[Ms]=kc[Ms],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&W.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 Pk(this,void 0,void 0,function(){return Ok(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=Wn(Wn({},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=Lk(a,2),l=c[0],u=c[1];return Wn(Wn(Wn(Wn({},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 Lo;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Lo||(Lo={}));Ne();var Nk=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())})},Dk=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}}},sg=function(){return mr.CUMULATIVE},Jv=function(r){switch(r){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.GAUGE:case me.HISTOGRAM:case me.OBSERVABLE_GAUGE:return mr.DELTA;case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return mr.CUMULATIVE}},Qv=function(r){switch(r){case me.COUNTER:case me.HISTOGRAM:return mr.DELTA;case me.GAUGE:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_GAUGE:return mr.CUMULATIVE}};function kk(){var r=At(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?sg:e==="delta"?Jv:e==="lowmemory"?Qv:(W.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."),sg)}function Uk(r){return r!=null?r===Lo.DELTA?Jv:r===Lo.LOWMEMORY?Qv:sg:kk()}function Fk(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Kr.Default()}}var Zv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=Fk(t),this._aggregationTemporalitySelector=Uk(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return Nk(this,void 0,void 0,function(){return Dk(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}();Ne();Ne();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},eA=1e4,tA=5,rA=1e3,nA=5e3,oA=1.5;function Ls(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=Bk(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):W.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function lg(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function cg(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return W.warn("Could not parse export URL: '"+r+"'"),r}}function ug(r){return typeof r=="number"?r<=0?dg(r,eA):r:zk()}function zk(){var r,e=Number((r=At().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:At().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?dg(e,eA):e}function dg(r,e){return W.warn("Timeout must be greater than 0",r),e}function iA(r){var e=[429,502,503,504];return e.includes(r)}function aA(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 sA=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 xv(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=ug(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Po.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Po.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Po.SUCCESS})}).catch(function(n){t({code:Po.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{W.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 W.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Ne();import*as pg from"url";import*as Wc from"http";import*as jc from"https";import*as lA from"zlib";import{Readable as Gk}from"stream";var jn;(function(r){r.NONE="none",r.GZIP="gzip"})(jn||(jn={}));var Hk=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)}}(),zi=function(r){Hk(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 Vc=function(){return Vc=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},Vc.apply(this,arguments)};function mg(r,e,t,n,o){var i=r.timeoutMillis,a=new pg.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 zi("Request Timeout");o(h)}else s>=14?l.destroy():l.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:Vc({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?Wc.request:jc.request,g=function(h,f){switch(h===void 0&&(h=tA),f===void 0&&(f=rA),l=m(p,function(T){var C="";T.on("data",function(x){return C+=x}),T.on("aborted",function(){if(u){var x=new zi("Request Timeout");o(x)}}),T.on("end",function(){if(u===!1)if(T.statusCode&&T.statusCode<299)W.debug("statusCode: "+T.statusCode,C),n(),clearTimeout(d),clearTimeout(c);else if(T.statusCode&&iA(T.statusCode)&&h>0){var x=void 0;f=oA*f,T.headers["retry-after"]?x=aA(T.headers["retry-after"]):x=Math.round(Math.random()*(nA-f)+f),c=setTimeout(function(){g(h-1,f)},x)}else{var w=new zi(T.statusMessage,T.statusCode,C);o(w),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(T){if(u){var C=new zi("Request Timeout",T.code);o(C)}else o(T);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var T=new zi("Request Timeout");o(T)}clearTimeout(d),clearTimeout(c)}),r.compression){case jn.GZIP:{l.setHeader("Content-Encoding","gzip");var b=Vk(e);b.on("error",o).pipe(lA.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function Vk(r){var e=new Gk;return e.push(r),e.push(null),e}function gg(r){if(r.httpAgentOptions&&r.keepAlive===!1){W.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new pg.URL(r.url),t=e.protocol==="http:"?Wc.Agent:jc.Agent;return new t(Vc({keepAlive:!0},r.httpAgentOptions))}catch(n){W.error("collector exporter failed to create http agent. err: "+n.message);return}}function hg(r){if(r)return r;var e=At().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||At().OTEL_EXPORTER_OTLP_COMPRESSION;return e===jn.GZIP?jn.GZIP:jn.NONE}Ne();var Wk=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)}}(),$c=function(r){Wk(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&&W.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,Ls(t.headers),Fi.parseKeyPairsIntoRecord(At().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=gg(t),i.compression=hg(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){W.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;mg(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}(sA);function uA(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function jk(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function dA(r){var e=uA(r);return jk(e)}function $k(r){var e=uA(r);return e.toString()}var qk=typeof BigInt<"u"?$k:wv;function cA(r){return r}function pA(r){if(r!==void 0)return Nc(r)}var Kk={encodeHrTime:dA,encodeSpanContext:Nc,encodeOptionalSpanContext:pA};function mA(r){var e,t;if(r===void 0)return Kk;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?dA:qk,encodeSpanContext:o?cA:Nc,encodeOptionalSpanContext:o?cA:pA}}var Yk=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 gA(r){return{name:r.name,version:r.version}}function Hi(r){return Object.keys(r).map(function(e){return hA(e,r[e])})}function hA(r,e){return{key:r,value:fA(e)}}function fA(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(fA)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=Yk(t,2),o=n[0],i=n[1];return hA(o,i)})}}:{}}function SA(r){return{attributes:Hi(r.attributes),droppedAttributesCount:0}}Ne();function bA(r,e){var t=mA(e);return{resource:SA(r.resource),schemaUrl:void 0,scopeMetrics:Xk(r.scopeMetrics,t)}}function Xk(r,e){return Array.from(r.map(function(t){return{scope:gA(t.scope),metrics:t.metrics.map(function(n){return Jk(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function Jk(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=tU(r.aggregationTemporality);switch(r.dataPointType){case Pt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:yA(r,e)};break;case Pt.GAUGE:t.gauge={dataPoints:yA(r,e)};break;case Pt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:Zk(r,e)};break;case Pt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:eU(r,e)};break}return t}function Qk(r,e,t){var n={attributes:Hi(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Yt.INT:n.asInt=r.value;break;case Yt.DOUBLE:n.asDouble=r.value;break}return n}function yA(r,e){return r.dataPoints.map(function(t){return Qk(t,r.descriptor.valueType,e)})}function Zk(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Hi(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 eU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Hi(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 tU(r){switch(r){case mr.DELTA:return 1;case mr.CUMULATIVE:return 2}}function EA(r,e){return{resourceMetrics:r.map(function(t){return bA(t,e)})}}var fg={serializeRequest:function(r){var e=EA(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 TA="0.52.1";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)}}(),Gi=function(){return Gi=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},Gi.apply(this,arguments)},AA="v1/metrics",rU="http://localhost:4318/"+AA,nU={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+TA},oU=function(r){vA(e,r);function e(t){var n=r.call(this,t,fg,"application/json")||this;return n.headers=Gi(Gi(Gi(Gi({},n.headers),nU),Fi.parseKeyPairsIntoRecord(At().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Ls(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:At().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?cg(At().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):At().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?lg(At().OTEL_EXPORTER_OTLP_ENDPOINT,AA):rU},e}($c),RA=function(r){vA(e,r);function e(t){return r.call(this,new oU(t),t)||this}return e}(Zv);var Vi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Vi||(Vi={}));var Yr;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Yr||(Yr={}));Ne();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)}}(),wA=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())})},CA=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}}},aU=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},sU=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))},lU=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 xA(r){return r!=null}function qc(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function MA(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Sg=function(r){iU(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function $n(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Sg("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function _A(r){return wA(this,void 0,void 0,function(){var e=this;return CA(this,function(t){return[2,Promise.all(r.map(function(n){return wA(e,void 0,void 0,function(){var o,i;return CA(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 IA(r){return r.status==="rejected"}function yg(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,sU([],aU(e(n)),!1))}),t}function PA(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=lU(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 OA(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 LA(r,e){return r.toLowerCase()===e.toLowerCase()}Ne();var hr;(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"})(hr||(hr={}));var bg=function(){function r(){this.kind=hr.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}();Ne();var Ee;(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"})(Ee||(Ee={}));function Xr(r,e,t){var n,o,i,a;return uU(r)||W.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:Yt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function NA(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 DA(r,e){return LA(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var cU=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function uU(r){return r.match(cU)!=null}var dU=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 pU(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 Kc=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=pU(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=OA(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 Yc=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=hr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Kc(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 Kc(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 Kc(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:Yr.HISTOGRAM,dataPoints:n.map(function(i){var a=dU(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ee.GAUGE||e.type===Ee.UP_DOWN_COUNTER||e.type===Ee.OBSERVABLE_GAUGE||e.type===Ee.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}();Ne();var Eg=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},Tg=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))},vg=function(){function r(e,t,n,o){e===void 0&&(e=new mU),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 mU=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,Tg([n,this._counts.length-t],Eg(this._counts.slice(t)),!1)),o.splice.apply(o,Tg([0,t],Eg(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(Tg([],Eg(this._counts),!1))},r}();var kA=52,gU=2146435072,hU=1048575,Ag=1023,Xc=-Ag+1,Jc=Ag,Ns=Math.pow(2,-1022);function Qc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&gU)>>20;return n-Ag}function Zc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&hU)*Math.pow(2,32);return o+n}function Ds(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function FA(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var fU=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)}}(),qn=function(r){fU(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var zA=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Ns)return this._minNormalLowerBoundaryIndex();var t=Qc(e),n=this._rightShift(Zc(e)-1,kA);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new qn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new qn("overflow: "+e+" is > maximum lower boundary: "+n);return Ds(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=Xc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Jc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var HA=function(){function r(e){this._scale=e,this._scaleFactor=Ds(Math.LOG2E,e),this._inverseFactor=Ds(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Ns)return this._minNormalLowerBoundaryIndex()-1;if(Zc(e)===0){var t=Qc(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 qn("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 qn("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 Xc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Jc+1<<this._scale)-1},r}();var GA=-10,VA=20,SU=Array.from({length:31},function(r,e){return e>10?new HA(e-10):new zA(e-10)});function Rg(r){if(r>VA||r<GA)throw new qn("expected scale >= "+GA+" && <= "+VA+", got: "+r);return SU[r+10]}var yU=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(){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}(),bU=20,EU=160,wg=2,WA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=EU),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 vg),u===void 0&&(u=new vg),d===void 0&&(d=Rg(bU)),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<wg&&(W.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+wg),this._maxSize=wg)}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=FA(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=Rg(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=eu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=eu.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 eu(0,-1);var o=t-n;return new eu(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 Cg=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=hr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new WA(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:Yr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=yU(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ee.GAUGE||e.type===Ee.UP_DOWN_COUNTER||e.type===Ee.OBSERVABLE_GAUGE||e.type===Ee.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}();Ne();var TU=Um("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function jA(r){return r.setValue(TU,!0)}Ne();function $A(){return function(r){W.error(vU(r))}}function vU(r){return typeof r=="string"?r:JSON.stringify(AU(r))}function AU(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 RU=$A();function tu(r){try{RU(r)}catch{}}var qA="1.30.1";var wU="process.runtime.name";var CU="service.name";var xU="telemetry.sdk.name",MU="telemetry.sdk.language",_U="telemetry.sdk.version";var KA=wU;var YA=CU;var ks=xU,Us=MU,Fs=_U;var IU="nodejs";var XA=IU;var Wi,No=(Wi={},Wi[ks]="opentelemetry",Wi[KA]="node",Wi[Us]=XA,Wi[Fs]=qA,Wi);function Bs(r){r.unref()}var UU=9,FU=6,BU=Math.pow(10,FU),Lce=Math.pow(10,UU);function Do(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*BU);return[t,n]}function ji(r){return r[0]*1e6+r[1]/1e3}var zs;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(zs||(zs={}));Ne();function JA(r,e){return new Promise(function(t){Ui.with(jA(Ui.active()),function(){r.export(e,function(n){t(n)})})})}var QA={_export:JA};var zU=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},ru=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=Do(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var xg=function(){function r(){this.kind=hr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new ru(e)},r.prototype.merge=function(e,t){var n=ji(t.sampleTime)>=ji(e.sampleTime)?t:e;return new ru(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=ji(t.sampleTime)>=ji(e.sampleTime)?t:e;return new ru(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Yr.GAUGE,dataPoints:n.map(function(i){var a=zU(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var HU=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},$i=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 nu=function(){function r(e){this.monotonic=e,this.kind=hr.SUM}return r.prototype.createAccumulation=function(e){return new $i(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new $i(t.startTime,this.monotonic,o,t.reset):new $i(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 $i(t.startTime,this.monotonic,o,!0):new $i(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Yr.SUM,dataPoints:n.map(function(i){var a=HU(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var ko=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)}}(),fr=function(){function r(){}return r.Drop=function(){return iR},r.Sum=function(){return aR},r.LastValue=function(){return sR},r.Histogram=function(){return lR},r.ExponentialHistogram=function(){return GU},r.Default=function(){return VU},r}();var ZA=function(r){ko(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 bg,e}(fr);var eR=function(r){ko(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ee.COUNTER:case Ee.OBSERVABLE_COUNTER:case Ee.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new nu(!0),e.NON_MONOTONIC_INSTANCE=new nu(!1),e}(fr);var tR=function(r){ko(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 xg,e}(fr);var rR=function(r){ko(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 Yc([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(fr);var Hs=function(r){ko(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 Yc(this._boundaries,this._recordMinMax)},e}(fr);var nR=function(r){ko(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 Cg(this._maxSize,this._recordMinMax)},e}(fr);var oR=function(r){ko(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ee.COUNTER:case Ee.UP_DOWN_COUNTER:case Ee.OBSERVABLE_COUNTER:case Ee.OBSERVABLE_UP_DOWN_COUNTER:return aR;case Ee.GAUGE:case Ee.OBSERVABLE_GAUGE:return sR;case Ee.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Hs(t.advice.explicitBucketBoundaries):lR}return W.warn("Unable to recognize instrument type: "+t.type),iR},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(fr);var iR=new ZA,aR=new eR,sR=new tR,lR=new rR,GU=new nR,VU=new oR;var cR=function(r){return fr.Default()},uR=function(r){return Vi.CUMULATIVE};var Mg=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())})},_g=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}}},dR=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},WU=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))},pR=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:cR,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:uR,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 Mg(this,void 0,void 0,function(){var t,n,o,i,a,s;return _g(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(WU([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],dR(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=dR.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(yg(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(yg(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Mg(this,void 0,void 0,function(){return _g(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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,$n(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Mg(this,void 0,void 0,function(){return _g(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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,$n(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Ne();var jU=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)}}(),ou=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())})},iu=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}}},$U=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},qU=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))},Ig=function(r){jU(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 ou(this,void 0,void 0,function(){var t;return iu(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,$n(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Sg?(W.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(tu(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return ou(this,void 0,void 0,function(){var o,i,a,s,c,l;return iu(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=W).error.apply(l,qU(["PeriodicExportingMetricReader: metrics collection errors"],$U(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(),W.debug("Error while resolving async portion of resource: ",s),tu(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,QA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==zs.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),Bs(this._interval)},e.prototype.onForceFlush=function(){return ou(this,void 0,void 0,function(){return iu(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 ou(this,void 0,void 0,function(){return iu(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}(pR);Ne();Ne();function au(){return"unknown_service:"+process.argv0}var Kn=function(){return Kn=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},Kn.apply(this,arguments)},KU=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())})},YU=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}}},XU=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},su=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 W.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[YA]=au(),e[Us]=No[Us],e[ks]=No[ks],e[Fs]=No[Fs],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&W.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 KU(this,void 0,void 0,function(){return YU(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=Kn(Kn({},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=XU(a,2),l=c[0],u=c[1];return Kn(Kn(Kn(Kn({},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 mR=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}();Ne();var Uo=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)}}(),lu=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=Ui.active()),typeof e!="number"){W.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Yt.INT&&!Number.isInteger(e)&&(W.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,Do(Date.now()))},r}();var gR=function(r){Uo(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}(lu);var hR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){W.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(lu);var fR=function(r){Uo(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}(lu);var SR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){W.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(lu);var cu=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 yR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);var bR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);var ER=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);function Gs(r){return r instanceof cu}var TR=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=Xr(e,Ee.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new fR(o,n)},r.prototype.createHistogram=function(e,t){var n=Xr(e,Ee.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new SR(o,n)},r.prototype.createCounter=function(e,t){var n=Xr(e,Ee.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new hR(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=Xr(e,Ee.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new gR(o,n)},r.prototype.createObservableGauge=function(e,t){var n=Xr(e,Ee.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new bR(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=Xr(e,Ee.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new yR(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=Xr(e,Ee.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new ER(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 uu=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=Xr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var JU=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)}}(),vR=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}}},QU=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 vR(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 vR(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 Mr=function(r){JU(e,r);function e(){return r.call(this,qc)||this}return e}(QU);var ZU=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},du=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Mr,this._cumulativeMemoStorage=new Mr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=qc(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=ZU(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 p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,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 Mr,e},r}();var Pg=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.")},AR=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(){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===Vi.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=eF(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=Pg(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 Mr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Pg(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=AR(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,l);o.set(c,p,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=Pg(e.keys()),s=a.next();!s.done;s=a.next()){var c=AR(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function eF(r){return Array.from(r.entries())}var tF=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)}}(),rF=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},RR=function(r){tF(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 du(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new pu(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new Mr;Array.from(t.entries()).forEach(function(a){var s=rF(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}(uu);Ne();function Og(r,e){var t="";return r.unit!==e.unit&&(t+=" - Unit '"+r.unit+"' does not match '"+e.unit+`'
27
+ `),globalThis.console=e}}var _m=" ".repeat(6);import ND from"fetch-retry";import DD from"os";import xT,{multistream as kD}from"pino";import UD from"pino-pretty";import FD from"pino-std-serializers";var Pi=new Map,BD=!0,MT="Log throttle exceeded",zD=100,HD=5e3,GD=ND(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}}),Im=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??DD.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=BD?xT(a):xT(a,kD([{stream:UD({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 GD(this.site,{method:"POST",headers:{"Content-Type":"application/json","signoz-access-token":"CumAaTMUcwjt05OddAmefKgshbhfRmWxzxih"},body:Mo(e),signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`Got error status (${t.statusText}) from SigNoz`)}catch{}}shouldAllowLog(e){if(e===MT)return!0;let t=Date.now();return t-this.lastWindowStart>HD&&(this.logsInCurrentWindow=0,this.droppedLogsInWindow&&this.log("error",void 0,MT),this.droppedLogsInWindow=!1,this.lastWindowStart=t),this.logsInCurrentWindow<zD?(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(ms[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=FD.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:dE({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,Pi.set("app",this),Pi.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=pE[e]):(this.minLevelValue=ms[e],this.consoleLogger.level=e)}enableConsoleLogs(){this.disableConsoleLogs=!1}},Oi=({app:r,hostname:e,disableConsoleLogs:t})=>(Pi.has(r)||Pi.set(r,new Im({bindings:{app:r},hostname:e,disableConsoleLogs:t})),Pi.get(r));async function _T(){await Promise.all([...Pi.values()].map(r=>r.flush()))}import{hostname as VD}from"os";var pr=Oi({app:"cli",hostname:VD(),disableConsoleLogs:!0}).child({cliVersion:"0.19.1"});function Pm(r){if(!r)return;r=r.toLowerCase();let e=hc.safeParse(r);if(e.success)return R.setMinLevel(e.data),e.data}function IT({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 CT(()=>{if(c.forEach(u=>{R.log(""),o(u)}),c.length){R.log("");let u=c.length===1?"":"s";R.error(`${c.length} ${t}${u} failed:`),c.forEach(d=>{R.dimmed(n(d))})}if(l.length){R.log("");let u=l.length===1?"":"s";R.warn(`${l.length} ${t}${u} cancelled:`),l.forEach(d=>{R.dimmed(n(d))})}if(a.length){R.log("");let u=a.length===1?"":"s";R.success(`${a.length} ${t}${u} passed:`),a.forEach(d=>{R.dimmed(n(d))})}if(s.length){R.log("");let u=s.length===1?"":"s";R.warn(`${s.length} quarantined ${t}${u} failed:`),s.forEach(d=>{R.dimmed(n(d))})}if(i.length){R.log("");let u=i.length===1?"":"s";R.warn(`${i.length} quarantined ${t}${u} passed:`),i.forEach(d=>{R.dimmed(n(d))})}R.log(""),R.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 ys=({status:r,testLogRef:e,getRunningTestsCount:t,getTotalTestsCount:n,additionalText:o})=>{r=r.toUpperCase();let i=r,a;r.includes("FAIL")?(i=Li.bgRed.white("FAIL"),a=3):r.includes("PASS")?(i=Li.bgGreen.white("PASS"),a=3):r.includes("START")?(i=Li.bgBlue.white("START"),a=2):r.includes("CANCEL")?(i=Li.bgRgb(191,68,11).white("CANCEL"),a=1):r.includes("RETRY")?(i=Li.bgRgb(191,68,11).white("RETRY"),a=2):r.includes("RUN")||r.includes("PROG")?(i=Li.bgMagenta.white("RUNNING"),a=0):(R.warn(`Unknown status tried to be logged in run test locally: ${r}`),a=0),WD||(i=`${i}`),R.log(`${i}${" ".repeat(a)} ${e} ${o?`${o} `:""}(${t()}/${n()})`)};import jD from"fs";import{tmpdir as $D}from"os";import qD from"path";import{registry as bs}from"playwright-core/lib/server";import PT from"proper-lockfile";var OT=qD.join($D(),"momenticBrowserInstallation");var Om=["chrome","chromium","chrome-for-testing","ffmpeg"],KD={Chromium:"chromium","Google Chrome":"chrome","Chrome for Testing":"chrome-for-testing"},LT={chrome:"chrome",chromium:"chromium","chrome-for-testing":"chromium-headless-shell",ffmpeg:"ffmpeg"};function NT(r){if(r==="Org Default")return!1;let e=LT[KD[r]??""]??"",t=bs.findExecutable(e);return!t||t.installType==="none"?!1:Lm(t)}function Lm(r){let e=r.executablePath();return jD.existsSync(e)}function YD(r,e){let t=LT[r];if(!t)throw new Error(`Requested install of unknown browser type ${r}`);let n=bs.findExecutable(t);if(!n||n.installType==="none")throw new Error(`Requested install of unknown browser type ${r}`);if(!(!e&&Lm(n)))return n}async function XD({browser:r,force:e}){let t=YD(r,e);if(!t){R.info(`Browser '${r}' is already installed, skipping...`);return}R.info(`Installing browser '${r}'...`);try{await bs.installDeps([t],!1),await bs.install([t],!1)}catch(n){if(n.message.includes("Lock file is already being held")){R.warn("Another process is installing Playwright browsers. Waiting for completion before proceeding..");let o=bs.findExecutable(r),i=5*60*1e3,a=Date.now();for(;Date.now()-a<i&&!Lm(o);)R.info("Waiting for browser to finish installing..."),await new Promise(s=>setTimeout(s,5e3))}else throw n}}async function Rc({rawBrowsers:r,force:e=!1,all:t=!1}){let n=t?Om:Array.from(new Set(r));try{await PT.lock(OT,{stale:1e3*60*5,update:1e3*60,realpath:!1,retries:{retries:30,factor:2,maxTimeout:15e3,minTimeout:500}})}catch(i){R.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 XD({browser:i,force:e})}catch(a){o=a,R.error(`Failed to install the ${i} browser: ${a}`)}}finally{await PT.unlock(OT,{realpath:!1})}if(o)throw o}import{createServer as JD}from"http";async function wc(r,e,t=30){for(let n=0;n<t;n+=1){let o=r+n;if(await Cc(o))return o}R.error(`Could not find an available port for ${e} starting from ${r} after ${t} attempts`),process.exit(1)}async function Cc(r){return new Promise((e,t)=>{let n=JD();n.once("error",o=>{o.code==="EADDRINUSE"?e(!1):(R.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 gne from"blocked-at";import fne from"why-is-node-running";function DT(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 QD(r,e,t,n){if(t>r.length&&(R.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 kT(r){let{items:e,shardIndex:t,shardCount:n,sortKey:o}=r;return n>1?QD(e,t,n,o):e}function Nm({regenerateCache:r,saveCache:e,disableCache:t}){if(t){if(r)throw new Error("--disable-cache and --regenerate-cache cannot be used together.");if(e)throw new Error("--disable-cache and --save-cache cannot be used together.")}}import $F from"fs";import One,{multistream as Nne}from"pino";import kne from"pino-pretty";var Bne=5*1024,ZD="...[truncated]",zne=Buffer.byteLength(ZD,"utf8");import{PostHog as Xne}from"posthog-node";var Gn=class extends Error{constructor(e){super(e),this.name="TimeoutError"}};var UT=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:p}=e;if(p.aborted)return c(UT(p));l=()=>c(UT(p)),p.addEventListener("abort",l,{once:!0})}let u=()=>{if(e.signal&&e.signal.removeEventListener("abort",l),n)try{s(n())}catch(p){c(p)}else{typeof r.cancel=="function"&&Promise.resolve().then(()=>r.cancel()).catch(()=>{});let p=o instanceof Error?o:new Gn(o??`Promise timed out after ${t}ms`);c(p)}};t<1/0&&(a=i.setTimeout(u,t));let d=()=>{i.clearTimeout(a),e.signal&&e.signal.removeEventListener("abort",l)};Promise.resolve(r).then(p=>{d(),s(p)}).catch(p=>{d(),c(p)})})}import{PostHog as ioe}from"posthog-node";import{execSync as e0}from"child_process";import Ni from"os";import t0 from"v8";var FT,$r,zT=Ni.platform(),r0=Ni.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),{}),BT=r=>{try{let e={},t=!1,n=n0(),o=o0(),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=t0.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"),_o&&R.warn(`Low machine resources detected (memory: ${i} free, cpu: ${a} free)`)):r.debug({memory:n,cpu:o},"Got machine resource usage metrics")}catch{}};function HT(r){if(!Wr)return BT(r),{interval:setInterval(()=>BT(r),2e4),cpuMetadata:r0,platform:zT}}function n0(){let r=Ni.totalmem(),e=zT==="darwin"?i0():(()=>{let n=Ni.freemem();return{availableMemory:n,rawFreeMemory:n,cachedMemory:0}})(),t=e.availableMemory/r;return{totalMemory:r,freeMemory:e.availableMemory,freePercentage:t}}function o0(){let r=Ni.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,!$r)return $r=t,null;let n={user:t.user-$r.user,nice:t.nice-$r.nice,sys:t.sys-$r.sys,idle:t.idle-$r.idle,irq:t.irq-$r.irq,total:t.total-$r.total};return FT={measurementTime:e,intervalMs:e-$r.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},$r=t,FT}function i0(){try{let r=e0("/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 p=r.match(new RegExp(`${u}:\\s+(\\d+)\\.`,"i"))?.[1];return p?Number.parseInt(p,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=Ni.freemem();return{availableMemory:e,rawFreeMemory:e,cachedMemory:0}}}var xc=class{increment(e,t,n){}gauge(e,t){}distribution(e,t,n){}async flush(){}async recordDuration({fn:e}){return await e()}};function a0(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 Mc(r,e){let t=a0(r);return!e||Object.keys(e).length===0?t:{...e,...t}}var gv="=",Oc=";",$m=",";var hv=8192;var Fi={};gI(Fi,{getKeyPairs:()=>B0,parseKeyPairsIntoRecord:()=>z0,parsePairKeyValue:()=>fv,serializeKeyPairs:()=>F0});Ne();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};function F0(r){return r.reduce(function(e,t){var n=""+e+(e!==""?$m:"")+t;return n.length>hv?e:n},"")}function B0(r){return r.getAllEntries().map(function(e){var t=U0(e,2),n=t[0],o=t[1],i=encodeURIComponent(n)+"="+encodeURIComponent(o.value);return o.metadata!==void 0&&(i+=Oc+o.metadata.toString()),i})}function fv(r){var e=r.split(Oc);if(!(e.length<=0)){var t=e.shift();if(t){var n=t.indexOf(gv);if(!(n<=0)){var o=decodeURIComponent(t.substring(0,n).trim()),i=decodeURIComponent(t.substring(n+1).trim()),a;return e.length>0&&(a=km(e.join(Oc))),{key:o,value:i,metadata:a}}}}}function z0(r){return typeof r!="string"||r.length===0?{}:r.split($m).map(function(e){return fv(e)}).filter(function(e){return e!==void 0&&e.value.length>0}).reduce(function(e,t){return e[t.key]=t.value,e},{})}Ne();var Lc;(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"})(Lc||(Lc={}));var H0=",",G0=["OTEL_SDK_DISABLED"];function V0(r){return G0.indexOf(r)>-1}var W0=["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 j0(r){return W0.indexOf(r)>-1}var $0=["OTEL_NO_PATCH_MODULES","OTEL_PROPAGATORS"];function q0(r){return $0.indexOf(r)>-1}var qm=1/0,Km=128,K0=128,Y0=128,Ym={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:qm,OTEL_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:qm,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:qm,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:Km,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:K0,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:Y0,OTEL_TRACES_EXPORTER:"",OTEL_TRACES_SAMPLER:Lc.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 X0(r,e,t){if(!(typeof t[r]>"u")){var n=String(t[r]);e[r]=n.toLowerCase()==="true"}}function J0(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 Q0(r,e,t,n){n===void 0&&(n=H0);var o=t[r];typeof o=="string"&&(e[r]=o.split(n).map(function(i){return i.trim()}))}var Z0={ALL:Be.ALL,VERBOSE:Be.VERBOSE,DEBUG:Be.DEBUG,INFO:Be.INFO,WARN:Be.WARN,ERROR:Be.ERROR,NONE:Be.NONE};function ek(r,e,t){var n=t[r];if(typeof n=="string"){var o=Z0[n.toUpperCase()];o!=null&&(e[r]=o)}}function Sv(r){var e={};for(var t in Ym){var n=t;switch(n){case"OTEL_LOG_LEVEL":ek(n,e,r);break;default:if(V0(n))X0(n,e,r);else if(j0(n))J0(n,e,r);else if(q0(n))Q0(n,e,r);else{var o=r[n];typeof o<"u"&&o!==null&&(e[n]=String(o))}}}return e}function At(){var r=Sv(process.env);return Object.assign({},Ym,r)}function yv(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}function Nc(r){for(var e=new Uint8Array(r.length/2),t=0,n=0;n<r.length;n+=2){var o=yv(r.charCodeAt(n)),i=yv(r.charCodeAt(n+1));e[t++]=o<<4|i}return e}var bv="1.25.1";var tk="deployment.environment";var rk="process.runtime.name";var nk="service.name";var ok="service.instance.id";var ik="telemetry.sdk.name",ak="telemetry.sdk.language",sk="telemetry.sdk.version";var Ev=tk;var Tv=rk;var Dc=nk;var vv=ok;var Cs=ik,xs=ak,Ms=sk;var lk="nodejs";var Av=lk;var Bi,kc=(Bi={},Bi[Cs]="opentelemetry",Bi[Tv]="node",Bi[xs]=Av,Bi[Ms]=bv,Bi);var ck=9,uk=6,dk=Math.pow(10,uk),pk=Math.pow(10,ck);function Rv(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*dk);return[t,n]}function wv(r){return r[0]*pk+r[1]}function _s(r){return r[0]*1e6+r[1]/1e3}var Po;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(Po||(Po={}));var Cv=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 mk=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))},xv=function(){function r(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new Cv}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,gk([this._that],mk(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 mr;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(mr||(mr={}));var Pt;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Pt||(Pt={}));var hk=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 _ae=function(r){hk(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function Mv(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}Ne();var gr;(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"})(gr||(gr={}));var _v=function(){function r(){this.kind=gr.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 me;(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"})(me||(me={}));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 Xm=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=Mv(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 Jm=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=gr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Xm(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 Xm(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 Xm(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:Pt.HISTOGRAM,dataPoints:n.map(function(i){var a=fk(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.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}();Ne();var Qm=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},Zm=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))},eg=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,Zm([n,this._counts.length-t],Qm(this._counts.slice(t)),!1)),o.splice.apply(o,Zm([0,t],Qm(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(Zm([],Qm(this._counts),!1))},r}();var Iv=52,bk=2146435072,Ek=1048575,tg=1023,Uc=-tg+1,Fc=tg,Is=Math.pow(2,-1022);function Bc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&bk)>>20;return n-tg}function zc(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 Ps(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function Ov(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)}}(),Vn=function(r){Tk(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var Nv=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Is)return this._minNormalLowerBoundaryIndex();var t=Bc(e),n=this._rightShift(zc(e)-1,Iv);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new Vn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new Vn("overflow: "+e+" is > maximum lower boundary: "+n);return Ps(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=Uc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Fc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var Dv=function(){function r(e){this._scale=e,this._scaleFactor=Ps(Math.LOG2E,e),this._inverseFactor=Ps(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Is)return this._minNormalLowerBoundaryIndex()-1;if(zc(e)===0){var t=Bc(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 Vn("overflow: "+e+" is > maximum lower boundary: "+t)}var n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Is;if(e===n-1)return Math.exp((e+(1<<this._scale))/this._scaleFactor)/2;throw new Vn("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 Uc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Fc+1<<this._scale)-1},r}();var kv=-10,Uv=20,vk=Array.from({length:31},function(r,e){return e>10?new Dv(e-10):new Nv(e-10)});function rg(r){if(r>Uv||r<kv)throw new Vn("expected scale >= "+kv+" && <= "+Uv+", 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},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}(),Rk=20,wk=160,ng=2,Ck=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=wk),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 eg),u===void 0&&(u=new eg),d===void 0&&(d=rg(Rk)),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<ng&&(W.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+ng),this._maxSize=ng)}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=Ov(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=rg(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 Fv=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=gr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Ck(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:Pt.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=Ak(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===me.GAUGE||e.type===me.UP_DOWN_COUNTER||e.type===me.OBSERVABLE_GAUGE||e.type===me.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 xk=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},og=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=Rv(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var Bv=function(){function r(){this.kind=gr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new og(e)},r.prototype.merge=function(e,t){var n=_s(t.sampleTime)>=_s(e.sampleTime)?t:e;return new og(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=_s(t.sampleTime)>=_s(e.sampleTime)?t:e;return new og(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Pt.GAUGE,dataPoints:n.map(function(i){var a=xk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var Mk=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 ig=function(){function r(e){this.monotonic=e,this.kind=gr.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:Pt.SUM,dataPoints:n.map(function(i){var a=Mk(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var Oo=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)}}(),Kr=function(){function r(){}return r.Drop=function(){return qv},r.Sum=function(){return Kv},r.LastValue=function(){return Yv},r.Histogram=function(){return Xv},r.ExponentialHistogram=function(){return _k},r.Default=function(){return Ik},r}();var zv=function(r){Oo(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 _v,e}(Kr);var Hv=function(r){Oo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new ig(!0),e.NON_MONOTONIC_INSTANCE=new ig(!1),e}(Kr);var Gv=function(r){Oo(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 Bv,e}(Kr);var Vv=function(r){Oo(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 Jm([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(Kr);var Wv=function(r){Oo(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 Jm(this._boundaries,this._recordMinMax)},e}(Kr);var jv=function(r){Oo(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 Fv(this._maxSize,this._recordMinMax)},e}(Kr);var $v=function(r){Oo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case me.COUNTER:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return Kv;case me.GAUGE:case me.OBSERVABLE_GAUGE:return Yv;case me.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Wv(t.advice.explicitBucketBoundaries):Xv}return W.warn("Unable to recognize instrument type: "+t.type),qv},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(Kr);var qv=new zv,Kv=new Hv,Yv=new Gv,Xv=new Vv,_k=new jv,Ik=new $v;Ne();function Gc(){return"unknown_service:"+process.argv0}var Wn=function(){return Wn=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},Wn.apply(this,arguments)},Pk=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())})},Ok=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}}},Lk=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},ag=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 W.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]=Gc(),e[xs]=kc[xs],e[Cs]=kc[Cs],e[Ms]=kc[Ms],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&W.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 Pk(this,void 0,void 0,function(){return Ok(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=Wn(Wn({},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=Lk(a,2),l=c[0],u=c[1];return Wn(Wn(Wn(Wn({},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 Lo;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE",r[r.LOWMEMORY=2]="LOWMEMORY"})(Lo||(Lo={}));Ne();var Nk=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())})},Dk=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}}},sg=function(){return mr.CUMULATIVE},Jv=function(r){switch(r){case me.COUNTER:case me.OBSERVABLE_COUNTER:case me.GAUGE:case me.HISTOGRAM:case me.OBSERVABLE_GAUGE:return mr.DELTA;case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:return mr.CUMULATIVE}},Qv=function(r){switch(r){case me.COUNTER:case me.HISTOGRAM:return mr.DELTA;case me.GAUGE:case me.UP_DOWN_COUNTER:case me.OBSERVABLE_UP_DOWN_COUNTER:case me.OBSERVABLE_COUNTER:case me.OBSERVABLE_GAUGE:return mr.CUMULATIVE}};function kk(){var r=At(),e=r.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE.trim().toLowerCase();return e==="cumulative"?sg:e==="delta"?Jv:e==="lowmemory"?Qv:(W.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."),sg)}function Uk(r){return r!=null?r===Lo.DELTA?Jv:r===Lo.LOWMEMORY?Qv:sg:kk()}function Fk(r){return r?.aggregationPreference?r.aggregationPreference:function(e){return Kr.Default()}}var Zv=function(){function r(e,t){this._otlpExporter=e,this._aggregationSelector=Fk(t),this._aggregationTemporalitySelector=Uk(t?.temporalityPreference)}return r.prototype.export=function(e,t){this._otlpExporter.export([e],t)},r.prototype.shutdown=function(){return Nk(this,void 0,void 0,function(){return Dk(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}();Ne();Ne();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},eA=1e4,tA=5,rA=1e3,nA=5e3,oA=1.5;function Ls(r){r===void 0&&(r={});var e={};return Object.entries(r).forEach(function(t){var n=Bk(t,2),o=n[0],i=n[1];typeof i<"u"?e[o]=String(i):W.warn('Header "'+o+'" has invalid value ('+i+") and will be ignored")}),e}function lg(r,e){return r.endsWith("/")||(r=r+"/"),r+e}function cg(r){try{var e=new URL(r);return e.pathname===""&&(e.pathname=e.pathname+"/"),e.toString()}catch{return W.warn("Could not parse export URL: '"+r+"'"),r}}function ug(r){return typeof r=="number"?r<=0?dg(r,eA):r:zk()}function zk(){var r,e=Number((r=At().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:At().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?dg(e,eA):e}function dg(r,e){return W.warn("Timeout must be greater than 0",r),e}function iA(r){var e=[429,502,503,504];return e.includes(r)}function aA(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 sA=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 xv(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit=="number"?e.concurrencyLimit:30,this.timeoutMillis=ug(e.timeoutMillis),this.onInit(e)}return r.prototype.export=function(e,t){if(this._shutdownOnce.isCalled){t({code:Po.FAILED,error:new Error("Exporter has been shutdown")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:Po.FAILED,error:new Error("Concurrent export limit reached")});return}this._export(e).then(function(){t({code:Po.SUCCESS})}).catch(function(n){t({code:Po.FAILED,error:n})})},r.prototype._export=function(e){var t=this;return new Promise(function(n,o){try{W.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 W.debug("shutdown started"),this.onShutdown(),this.forceFlush()},r}();Ne();import*as pg from"url";import*as Wc from"http";import*as jc from"https";import*as lA from"zlib";import{Readable as Gk}from"stream";var jn;(function(r){r.NONE="none",r.GZIP="gzip"})(jn||(jn={}));var Hk=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)}}(),zi=function(r){Hk(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 Vc=function(){return Vc=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},Vc.apply(this,arguments)};function mg(r,e,t,n,o){var i=r.timeoutMillis,a=new pg.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 zi("Request Timeout");o(h)}else s>=14?l.destroy():l.abort()},i),p={hostname:a.hostname,port:a.port,path:a.pathname,method:"POST",headers:Vc({"Content-Type":t},r.headers),agent:r.agent},m=a.protocol==="http:"?Wc.request:jc.request,g=function(h,f){switch(h===void 0&&(h=tA),f===void 0&&(f=rA),l=m(p,function(T){var C="";T.on("data",function(x){return C+=x}),T.on("aborted",function(){if(u){var x=new zi("Request Timeout");o(x)}}),T.on("end",function(){if(u===!1)if(T.statusCode&&T.statusCode<299)W.debug("statusCode: "+T.statusCode,C),n(),clearTimeout(d),clearTimeout(c);else if(T.statusCode&&iA(T.statusCode)&&h>0){var x=void 0;f=oA*f,T.headers["retry-after"]?x=aA(T.headers["retry-after"]):x=Math.round(Math.random()*(nA-f)+f),c=setTimeout(function(){g(h-1,f)},x)}else{var w=new zi(T.statusMessage,T.statusCode,C);o(w),clearTimeout(d),clearTimeout(c)}})}),l.on("error",function(T){if(u){var C=new zi("Request Timeout",T.code);o(C)}else o(T);clearTimeout(d),clearTimeout(c)}),l.on("abort",function(){if(u){var T=new zi("Request Timeout");o(T)}clearTimeout(d),clearTimeout(c)}),r.compression){case jn.GZIP:{l.setHeader("Content-Encoding","gzip");var b=Vk(e);b.on("error",o).pipe(lA.createGzip()).on("error",o).pipe(l);break}default:l.end(Buffer.from(e));break}};g()}function Vk(r){var e=new Gk;return e.push(r),e.push(null),e}function gg(r){if(r.httpAgentOptions&&r.keepAlive===!1){W.warn("httpAgentOptions is used only when keepAlive is true");return}if(!(r.keepAlive===!1||!r.url))try{var e=new pg.URL(r.url),t=e.protocol==="http:"?Wc.Agent:jc.Agent;return new t(Vc({keepAlive:!0},r.httpAgentOptions))}catch(n){W.error("collector exporter failed to create http agent. err: "+n.message);return}}function hg(r){if(r)return r;var e=At().OTEL_EXPORTER_OTLP_TRACES_COMPRESSION||At().OTEL_EXPORTER_OTLP_COMPRESSION;return e===jn.GZIP?jn.GZIP:jn.NONE}Ne();var Wk=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)}}(),$c=function(r){Wk(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&&W.warn("Metadata cannot be set when using http"),i.headers=Object.assign(i.DEFAULT_HEADERS,Ls(t.headers),Fi.parseKeyPairsIntoRecord(At().OTEL_EXPORTER_OTLP_HEADERS)),i.agent=gg(t),i.compression=hg(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){W.debug("Shutdown already started. Cannot send objects");return}var a=new Promise(function(c,l){var u;mg(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}(sA);function uA(r){var e=BigInt(1e9);return BigInt(r[0])*e+BigInt(r[1])}function jk(r){var e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}function dA(r){var e=uA(r);return jk(e)}function $k(r){var e=uA(r);return e.toString()}var qk=typeof BigInt<"u"?$k:wv;function cA(r){return r}function pA(r){if(r!==void 0)return Nc(r)}var Kk={encodeHrTime:dA,encodeSpanContext:Nc,encodeOptionalSpanContext:pA};function mA(r){var e,t;if(r===void 0)return Kk;var n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,o=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?dA:qk,encodeSpanContext:o?cA:Nc,encodeOptionalSpanContext:o?cA:pA}}var Yk=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 gA(r){return{name:r.name,version:r.version}}function Hi(r){return Object.keys(r).map(function(e){return hA(e,r[e])})}function hA(r,e){return{key:r,value:fA(e)}}function fA(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(fA)}}:e==="object"&&r!=null?{kvlistValue:{values:Object.entries(r).map(function(t){var n=Yk(t,2),o=n[0],i=n[1];return hA(o,i)})}}:{}}function SA(r){return{attributes:Hi(r.attributes),droppedAttributesCount:0}}Ne();function bA(r,e){var t=mA(e);return{resource:SA(r.resource),schemaUrl:void 0,scopeMetrics:Xk(r.scopeMetrics,t)}}function Xk(r,e){return Array.from(r.map(function(t){return{scope:gA(t.scope),metrics:t.metrics.map(function(n){return Jk(n,e)}),schemaUrl:t.scope.schemaUrl}}))}function Jk(r,e){var t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=tU(r.aggregationTemporality);switch(r.dataPointType){case Pt.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:yA(r,e)};break;case Pt.GAUGE:t.gauge={dataPoints:yA(r,e)};break;case Pt.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:Zk(r,e)};break;case Pt.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:eU(r,e)};break}return t}function Qk(r,e,t){var n={attributes:Hi(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case Yt.INT:n.asInt=r.value;break;case Yt.DOUBLE:n.asDouble=r.value;break}return n}function yA(r,e){return r.dataPoints.map(function(t){return Qk(t,r.descriptor.valueType,e)})}function Zk(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Hi(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 eU(r,e){return r.dataPoints.map(function(t){var n=t.value;return{attributes:Hi(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 tU(r){switch(r){case mr.DELTA:return 1;case mr.CUMULATIVE:return 2}}function EA(r,e){return{resourceMetrics:r.map(function(t){return bA(t,e)})}}var fg={serializeRequest:function(r){var e=EA(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 TA="0.52.1";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)}}(),Gi=function(){return Gi=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},Gi.apply(this,arguments)},AA="v1/metrics",rU="http://localhost:4318/"+AA,nU={"User-Agent":"OTel-OTLP-Exporter-JavaScript/"+TA},oU=function(r){vA(e,r);function e(t){var n=r.call(this,t,fg,"application/json")||this;return n.headers=Gi(Gi(Gi(Gi({},n.headers),nU),Fi.parseKeyPairsIntoRecord(At().OTEL_EXPORTER_OTLP_METRICS_HEADERS)),Ls(t?.headers)),n}return e.prototype.getDefaultUrl=function(t){return typeof t.url=="string"?t.url:At().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT.length>0?cg(At().OTEL_EXPORTER_OTLP_METRICS_ENDPOINT):At().OTEL_EXPORTER_OTLP_ENDPOINT.length>0?lg(At().OTEL_EXPORTER_OTLP_ENDPOINT,AA):rU},e}($c),RA=function(r){vA(e,r);function e(t){return r.call(this,new oU(t),t)||this}return e}(Zv);var Vi;(function(r){r[r.DELTA=0]="DELTA",r[r.CUMULATIVE=1]="CUMULATIVE"})(Vi||(Vi={}));var Yr;(function(r){r[r.HISTOGRAM=0]="HISTOGRAM",r[r.EXPONENTIAL_HISTOGRAM=1]="EXPONENTIAL_HISTOGRAM",r[r.GAUGE=2]="GAUGE",r[r.SUM=3]="SUM"})(Yr||(Yr={}));Ne();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)}}(),wA=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())})},CA=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}}},aU=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},sU=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))},lU=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 xA(r){return r!=null}function qc(r){var e=Object.keys(r);return e.length===0?"":(e=e.sort(),JSON.stringify(e.map(function(t){return[t,r[t]]})))}function MA(r){var e,t;return r.name+":"+((e=r.version)!==null&&e!==void 0?e:"")+":"+((t=r.schemaUrl)!==null&&t!==void 0?t:"")}var Sg=function(r){iU(e,r);function e(t){var n=r.call(this,t)||this;return Object.setPrototypeOf(n,e.prototype),n}return e}(Error);function $n(r,e){var t,n=new Promise(function(i,a){t=setTimeout(function(){a(new Sg("Operation timed out."))},e)});return Promise.race([r,n]).then(function(o){return clearTimeout(t),o},function(o){throw clearTimeout(t),o})}function _A(r){return wA(this,void 0,void 0,function(){var e=this;return CA(this,function(t){return[2,Promise.all(r.map(function(n){return wA(e,void 0,void 0,function(){var o,i;return CA(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 IA(r){return r.status==="rejected"}function yg(r,e){var t=[];return r.forEach(function(n){t.push.apply(t,sU([],aU(e(n)),!1))}),t}function PA(r,e){var t,n;if(r.size!==e.size)return!1;try{for(var o=lU(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 OA(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 LA(r,e){return r.toLowerCase()===e.toLowerCase()}Ne();var hr;(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"})(hr||(hr={}));var bg=function(){function r(){this.kind=hr.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}();Ne();var Ee;(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"})(Ee||(Ee={}));function Xr(r,e,t){var n,o,i,a;return uU(r)||W.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:Yt.DOUBLE,advice:(a=t?.advice)!==null&&a!==void 0?a:{}}}function NA(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 DA(r,e){return LA(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}var cU=/^[a-z][a-z0-9_.\-/]{0,254}$/i;function uU(r){return r.match(cU)!=null}var dU=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 pU(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 Kc=function(){function r(e,t,n,o){n===void 0&&(n=!0),o===void 0&&(o=pU(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=OA(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 Yc=function(){function r(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=hr.HISTOGRAM}return r.prototype.createAccumulation=function(e){return new Kc(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 Kc(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 Kc(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:Yr.HISTOGRAM,dataPoints:n.map(function(i){var a=dU(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ee.GAUGE||e.type===Ee.UP_DOWN_COUNTER||e.type===Ee.OBSERVABLE_GAUGE||e.type===Ee.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}();Ne();var Eg=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},Tg=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))},vg=function(){function r(e,t,n,o){e===void 0&&(e=new mU),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 mU=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,Tg([n,this._counts.length-t],Eg(this._counts.slice(t)),!1)),o.splice.apply(o,Tg([0,t],Eg(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(Tg([],Eg(this._counts),!1))},r}();var kA=52,gU=2146435072,hU=1048575,Ag=1023,Xc=-Ag+1,Jc=Ag,Ns=Math.pow(2,-1022);function Qc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=(t&gU)>>20;return n-Ag}function Zc(r){var e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);var t=e.getUint32(0),n=e.getUint32(4),o=(t&hU)*Math.pow(2,32);return o+n}function Ds(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}function FA(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}var fU=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)}}(),qn=function(r){fU(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(Error);var zA=function(){function r(e){this._shift=-e}return r.prototype.mapToIndex=function(e){if(e<Ns)return this._minNormalLowerBoundaryIndex();var t=Qc(e),n=this._rightShift(Zc(e)-1,kA);return t+n>>this._shift},r.prototype.lowerBoundary=function(e){var t=this._minNormalLowerBoundaryIndex();if(e<t)throw new qn("underflow: "+e+" is < minimum lower boundary: "+t);var n=this._maxNormalLowerBoundaryIndex();if(e>n)throw new qn("overflow: "+e+" is > maximum lower boundary: "+n);return Ds(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=Xc>>this._shift;return this._shift<2&&e--,e},r.prototype._maxNormalLowerBoundaryIndex=function(){return Jc>>this._shift},r.prototype._rightShift=function(e,t){return Math.floor(e*Math.pow(2,-t))},r}();var HA=function(){function r(e){this._scale=e,this._scaleFactor=Ds(Math.LOG2E,e),this._inverseFactor=Ds(Math.LN2,-e)}return r.prototype.mapToIndex=function(e){if(e<=Ns)return this._minNormalLowerBoundaryIndex()-1;if(Zc(e)===0){var t=Qc(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 qn("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 qn("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 Xc<<this._scale},r.prototype._maxNormalLowerBoundaryIndex=function(){return(Jc+1<<this._scale)-1},r}();var GA=-10,VA=20,SU=Array.from({length:31},function(r,e){return e>10?new HA(e-10):new zA(e-10)});function Rg(r){if(r>VA||r<GA)throw new qn("expected scale >= "+GA+" && <= "+VA+", got: "+r);return SU[r+10]}var yU=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(){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}(),bU=20,EU=160,wg=2,WA=function(){function r(e,t,n,o,i,a,s,c,l,u,d){e===void 0&&(e=e),t===void 0&&(t=EU),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 vg),u===void 0&&(u=new vg),d===void 0&&(d=Rg(bU)),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<wg&&(W.warn("Exponential Histogram Max Size set to "+this._maxSize+", changing to the minimum size of: "+wg),this._maxSize=wg)}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=FA(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=Rg(t)}},r.prototype._minScale=function(e){var t=Math.min(this.scale,e.scale),n=eu.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),o=eu.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 eu(0,-1);var o=t-n;return new eu(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 Cg=function(){function r(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=hr.EXPONENTIAL_HISTOGRAM}return r.prototype.createAccumulation=function(e){return new WA(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:Yr.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(function(i){var a=yU(i,2),s=a[0],c=a[1],l=c.toPointValue(),u=e.type===Ee.GAUGE||e.type===Ee.UP_DOWN_COUNTER||e.type===Ee.OBSERVABLE_GAUGE||e.type===Ee.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}();Ne();var TU=Um("OpenTelemetry SDK Context Key SUPPRESS_TRACING");function jA(r){return r.setValue(TU,!0)}Ne();function $A(){return function(r){W.error(vU(r))}}function vU(r){return typeof r=="string"?r:JSON.stringify(AU(r))}function AU(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 RU=$A();function tu(r){try{RU(r)}catch{}}var qA="1.30.1";var wU="process.runtime.name";var CU="service.name";var xU="telemetry.sdk.name",MU="telemetry.sdk.language",_U="telemetry.sdk.version";var KA=wU;var YA=CU;var ks=xU,Us=MU,Fs=_U;var IU="nodejs";var XA=IU;var Wi,No=(Wi={},Wi[ks]="opentelemetry",Wi[KA]="node",Wi[Us]=XA,Wi[Fs]=qA,Wi);function Bs(r){r.unref()}var UU=9,FU=6,BU=Math.pow(10,FU),Lce=Math.pow(10,UU);function Do(r){var e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*BU);return[t,n]}function ji(r){return r[0]*1e6+r[1]/1e3}var zs;(function(r){r[r.SUCCESS=0]="SUCCESS",r[r.FAILED=1]="FAILED"})(zs||(zs={}));Ne();function JA(r,e){return new Promise(function(t){Ui.with(jA(Ui.active()),function(){r.export(e,function(n){t(n)})})})}var QA={_export:JA};var zU=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},ru=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=Do(Date.now())},r.prototype.setStartTime=function(e){this.startTime=e},r.prototype.toPointValue=function(){return this._current},r}();var xg=function(){function r(){this.kind=hr.LAST_VALUE}return r.prototype.createAccumulation=function(e){return new ru(e)},r.prototype.merge=function(e,t){var n=ji(t.sampleTime)>=ji(e.sampleTime)?t:e;return new ru(e.startTime,n.toPointValue(),n.sampleTime)},r.prototype.diff=function(e,t){var n=ji(t.sampleTime)>=ji(e.sampleTime)?t:e;return new ru(t.startTime,n.toPointValue(),n.sampleTime)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Yr.GAUGE,dataPoints:n.map(function(i){var a=zU(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}})}},r}();var HU=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},$i=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 nu=function(){function r(e){this.monotonic=e,this.kind=hr.SUM}return r.prototype.createAccumulation=function(e){return new $i(e,this.monotonic)},r.prototype.merge=function(e,t){var n=e.toPointValue(),o=t.toPointValue();return t.reset?new $i(t.startTime,this.monotonic,o,t.reset):new $i(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 $i(t.startTime,this.monotonic,o,!0):new $i(t.startTime,this.monotonic,o-n)},r.prototype.toMetricData=function(e,t,n,o){return{descriptor:e,aggregationTemporality:t,dataPointType:Yr.SUM,dataPoints:n.map(function(i){var a=HU(i,2),s=a[0],c=a[1];return{attributes:s,startTime:c.startTime,endTime:o,value:c.toPointValue()}}),isMonotonic:this.monotonic}},r}();var ko=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)}}(),fr=function(){function r(){}return r.Drop=function(){return iR},r.Sum=function(){return aR},r.LastValue=function(){return sR},r.Histogram=function(){return lR},r.ExponentialHistogram=function(){return GU},r.Default=function(){return VU},r}();var ZA=function(r){ko(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 bg,e}(fr);var eR=function(r){ko(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createAggregator=function(t){switch(t.type){case Ee.COUNTER:case Ee.OBSERVABLE_COUNTER:case Ee.HISTOGRAM:return e.MONOTONIC_INSTANCE;default:return e.NON_MONOTONIC_INSTANCE}},e.MONOTONIC_INSTANCE=new nu(!0),e.NON_MONOTONIC_INSTANCE=new nu(!1),e}(fr);var tR=function(r){ko(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 xg,e}(fr);var rR=function(r){ko(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 Yc([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0),e}(fr);var Hs=function(r){ko(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 Yc(this._boundaries,this._recordMinMax)},e}(fr);var nR=function(r){ko(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 Cg(this._maxSize,this._recordMinMax)},e}(fr);var oR=function(r){ko(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype._resolve=function(t){switch(t.type){case Ee.COUNTER:case Ee.UP_DOWN_COUNTER:case Ee.OBSERVABLE_COUNTER:case Ee.OBSERVABLE_UP_DOWN_COUNTER:return aR;case Ee.GAUGE:case Ee.OBSERVABLE_GAUGE:return sR;case Ee.HISTOGRAM:return t.advice.explicitBucketBoundaries?new Hs(t.advice.explicitBucketBoundaries):lR}return W.warn("Unable to recognize instrument type: "+t.type),iR},e.prototype.createAggregator=function(t){return this._resolve(t).createAggregator(t)},e}(fr);var iR=new ZA,aR=new eR,sR=new tR,lR=new rR,GU=new nR,VU=new oR;var cR=function(r){return fr.Default()},uR=function(r){return Vi.CUMULATIVE};var Mg=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())})},_g=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}}},dR=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},WU=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))},pR=function(){function r(e){var t,n,o;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:cR,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:uR,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 Mg(this,void 0,void 0,function(){var t,n,o,i,a,s;return _g(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(WU([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis})],dR(this._metricProducers.map(function(l){return l.collect({timeoutMillis:e?.timeoutMillis})})),!1))];case 1:return t=dR.apply(void 0,[c.sent()]),n=t[0],o=t.slice(1),i=n.errors.concat(yg(o,function(l){return l.errors})),a=n.resourceMetrics.resource,s=n.resourceMetrics.scopeMetrics.concat(yg(o,function(l){return l.resourceMetrics.scopeMetrics})),[2,{resourceMetrics:{resource:a,scopeMetrics:s},errors:i}]}})})},r.prototype.shutdown=function(e){return Mg(this,void 0,void 0,function(){return _g(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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,$n(this.onShutdown(),e.timeoutMillis)];case 3:t.sent(),t.label=4;case 4:return this._shutdown=!0,[2]}})})},r.prototype.forceFlush=function(e){return Mg(this,void 0,void 0,function(){return _g(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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,$n(this.onForceFlush(),e.timeoutMillis)];case 3:return t.sent(),[2]}})})},r}();Ne();var jU=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)}}(),ou=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())})},iu=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}}},$U=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},qU=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))},Ig=function(r){jU(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 ou(this,void 0,void 0,function(){var t;return iu(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,$n(this._doRun(),this._exportTimeout)];case 1:return n.sent(),[3,3];case 2:return t=n.sent(),t instanceof Sg?(W.error("Export took longer than %s milliseconds and timed out.",this._exportTimeout),[2]):(tu(t),[3,3]);case 3:return[2]}})})},e.prototype._doRun=function(){var t,n;return ou(this,void 0,void 0,function(){var o,i,a,s,c,l;return iu(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=W).error.apply(l,qU(["PeriodicExportingMetricReader: metrics collection errors"],$U(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(),W.debug("Error while resolving async portion of resource: ",s),tu(s),[3,5];case 5:return i.scopeMetrics.length===0?[2]:[4,QA._export(this._exporter,i)];case 6:if(c=u.sent(),c.code!==zs.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),Bs(this._interval)},e.prototype.onForceFlush=function(){return ou(this,void 0,void 0,function(){return iu(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 ou(this,void 0,void 0,function(){return iu(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}(pR);Ne();Ne();function au(){return"unknown_service:"+process.argv0}var Kn=function(){return Kn=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},Kn.apply(this,arguments)},KU=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())})},YU=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}}},XU=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},su=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 W.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[YA]=au(),e[Us]=No[Us],e[ks]=No[ks],e[Fs]=No[Fs],e))},Object.defineProperty(r.prototype,"attributes",{get:function(){var e;return this.asyncAttributesPending&&W.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 KU(this,void 0,void 0,function(){return YU(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=Kn(Kn({},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=XU(a,2),l=c[0],u=c[1];return Kn(Kn(Kn(Kn({},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 mR=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}();Ne();var Uo=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)}}(),lu=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=Ui.active()),typeof e!="number"){W.warn("non-number value provided to metric "+this._descriptor.name+": "+e);return}this._descriptor.valueType===Yt.INT&&!Number.isInteger(e)&&(W.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,Do(Date.now()))},r}();var gR=function(r){Uo(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}(lu);var hR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.add=function(t,n,o){if(t<0){W.warn("negative value provided to counter "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(lu);var fR=function(r){Uo(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}(lu);var SR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.record=function(t,n,o){if(t<0){W.warn("negative value provided to histogram "+this._descriptor.name+": "+t);return}this._record(t,n,o)},e}(lu);var cu=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 yR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);var bR=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);var ER=function(r){Uo(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(cu);function Gs(r){return r instanceof cu}var TR=function(){function r(e){this._meterSharedState=e}return r.prototype.createGauge=function(e,t){var n=Xr(e,Ee.GAUGE,t),o=this._meterSharedState.registerMetricStorage(n);return new fR(o,n)},r.prototype.createHistogram=function(e,t){var n=Xr(e,Ee.HISTOGRAM,t),o=this._meterSharedState.registerMetricStorage(n);return new SR(o,n)},r.prototype.createCounter=function(e,t){var n=Xr(e,Ee.COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new hR(o,n)},r.prototype.createUpDownCounter=function(e,t){var n=Xr(e,Ee.UP_DOWN_COUNTER,t),o=this._meterSharedState.registerMetricStorage(n);return new gR(o,n)},r.prototype.createObservableGauge=function(e,t){var n=Xr(e,Ee.OBSERVABLE_GAUGE,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new bR(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableCounter=function(e,t){var n=Xr(e,Ee.OBSERVABLE_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new yR(n,o,this._meterSharedState.observableRegistry)},r.prototype.createObservableUpDownCounter=function(e,t){var n=Xr(e,Ee.OBSERVABLE_UP_DOWN_COUNTER,t),o=this._meterSharedState.registerAsyncMetricStorage(n);return new ER(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 uu=function(){function r(e){this._instrumentDescriptor=e}return r.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},r.prototype.updateDescription=function(e){this._instrumentDescriptor=Xr(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},r}();var JU=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)}}(),vR=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}}},QU=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 vR(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 vR(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 Mr=function(r){JU(e,r);function e(){return r.call(this,qc)||this}return e}(QU);var ZU=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},du=function(){function r(e,t){this._aggregator=e,this._activeCollectionStorage=new Mr,this._cumulativeMemoStorage=new Mr,this._overflowAttributes={"otel.metric.overflow":!0},this._cardinalityLimit=(t??2e3)-1,this._overflowHashCode=qc(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=ZU(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 p=n._activeCollectionStorage.get(a,c);u=n._aggregator.merge(p,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 Mr,e},r}();var Pg=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.")},AR=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(){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===Vi.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=eF(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=Pg(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 Mr,i=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),i===void 0)return o;try{for(var a=Pg(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=AR(a.value,3),c=s[0],l=s[1],u=s[2];if(e.has(c,u)){var d=e.get(c,u),p=n.merge(d,l);o.set(c,p,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=Pg(e.keys()),s=a.next();!s.done;s=a.next()){var c=AR(s.value,2),l=c[0],u=c[1],d=t.get(l,u);d?.setStartTime(n)}}catch(p){o={error:p}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return t},r}();function eF(r){return Array.from(r.entries())}var tF=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)}}(),rF=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},RR=function(r){tF(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 du(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new pu(n,i),s}return e.prototype.record=function(t,n){var o=this,i=new Mr;Array.from(t.entries()).forEach(function(a){var s=rF(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}(uu);Ne();function Og(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+`'
@@ -36,16 +36,17 @@ ${this.decisions.map(e=>e.toString()).join(`
36
36
  To resolve the conflict:`,Lg(l,e))),i=c):W.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
38
  `,Og(l,e),`To resolve the conflict:
39
- `,Lg(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 CR=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}();Ne();Ne();var xR=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Mr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){W.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Yt.INT&&!Number.isInteger(e)&&(W.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 MR=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 Mr,this._buffer.set(e,o)),typeof t!="number"){W.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Yt.INT&&!Number.isInteger(t)&&(W.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 Dg=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())})},kg=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}}},_R=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},IR=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))},PR=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){W.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 Dg(this,void 0,void 0,function(){var n,o,i,a;return kg(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,_A(IR(IR([],_R(n),!1),_R(o),!1))];case 1:return i=s.sent(),a=i.filter(IA).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 Dg(n,void 0,void 0,function(){var s,c;return kg(this,function(l){switch(l.label){case 0:return s=new xR(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=$n(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 Dg(n,void 0,void 0,function(){var s,c;return kg(this,function(l){switch(l.label){case 0:return s=new MR,c=Promise.resolve(i(s)),t!=null&&(c=$n(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(p){p.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&&PA(n.instruments,t)})},r}();var sF=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)}}(),OR=function(r){sF(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 du(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new pu(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}(uu);var LR=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)}}(),qi=function(){function r(){}return r.Noop=function(){return cF},r}();var lF=function(r){LR(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(qi);var NR=function(r){LR(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}(qi);var cF=new lF;var uF=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())})},dF=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}}},pF=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},DR=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new wR,this.observableRegistry=new PR,this.meter=new TR(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,OR);return t.length===1?t[0]:new CR(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,RR);return t},r.prototype.collect=function(e,t,n){return uF(this,void 0,void 0,function(){var o,i,a;return dF(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(xA),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=NA(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new t(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=pF(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new t(e,m,qi.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var mF=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.")},kR=function(){function r(e){this.resource=e,this.viewRegistry=new mR,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=MA(e),n=this.meterSharedStates.get(t);return n==null&&(n=new DR(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=mF(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 mu=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())})},gu=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}}},gF=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},hF=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))},UR=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return mu(this,void 0,void 0,function(){var t,n,o,i,a=this;return gu(this,function(s){switch(s.label){case 0:return t=Do(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return mu(a,void 0,void 0,function(){var l;return gu(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,hF([],gF(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 mu(this,void 0,void 0,function(){return gu(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 mu(this,void 0,void 0,function(){return gu(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 FR=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())})},BR=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}}},zR=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 fF(r,e){var t=e??su.empty();return r?su.default().merge(t):t}var Ug=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new kR(fF((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=zR(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){t={error:m}}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=zR(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}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?(W.warn("A shutdown MeterProvider cannot provide a Meter"),Gm()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new UR(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return FR(this,void 0,void 0,function(){return BR(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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 FR(this,void 0,void 0,function(){return BR(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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 SF=/[\^$\\.+?()[\]{}|]/g,hu=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(SF,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Ki=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 HR=function(){function r(e){var t;this._nameFilter=new hu((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Ki(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 GR=function(){function r(e){this._nameFilter=new Ki(e?.name),this._versionFilter=new Ki(e?.version),this._schemaUrlFilter=new Ki(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 yF(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var fu=function(){function r(e){var t;if(yF(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||hu.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 NR(e.attributeKeys):this.attributesProcessor=qi.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:fr.Default(),this.instrumentSelector=new HR({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new GR({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var gpe=process.env.APP||"unknown";Ne();import{v4 as bF}from"uuid";function EF(){return new RA({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Lo.DELTA})}var TF=[new fu({instrumentName:"test_event_duration",instrumentType:Ee.HISTOGRAM,aggregation:new Hs([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new fu({instrumentName:"test_step_duration",instrumentType:Ee.HISTOGRAM,aggregation:new Hs([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],yu=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 ag({[Dc]:e.serviceName,[Ev]:t,[vv]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:bF()}),o=EF(),i=new Ig({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new Ug({resource:n,readers:[i],views:TF}),Pc.setGlobalMeterProvider(this.provider),this.meter=Pc.getMeter("momentic-serverless")}increment(e,t,n){try{let o=Mc(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=Mc(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 ft=new xc;function VR(r){r.disabled||(ft=new yu(r))}import{exec as vF}from"child_process";import{platform as WR}from"os";var AF=1e4;async function Vs(r){return new Promise(e=>{vF(r,{timeout:AF},(t,n,o)=>{e({command:r,stdout:n,stderr:o,error:t?.message??null,timedOut:t?.killed??!1})})})}async function RF(r){if(WR()==="win32")return Vs(`tracert ${r}`);let t=await Vs(`traceroute ${r}`);return t.stderr.includes("not found")||t.error?.includes("not found")?Vs(`tracepath ${r}`):t}async function jR(r){let t=WR()==="win32",n=`https://${r}`,o=t?`ping -n 3 ${r}`:`ping -c 3 ${r}`,a=`curl -w "\\n\\ntime_namelookup: %{time_namelookup}s\\ntime_connect: %{time_connect}s\\ntime_appconnect: %{time_appconnect}s\\ntime_starttransfer: %{time_starttransfer}s\\ntime_total: %{time_total}s\\n" -o ${t?"NUL":"/dev/null"} -s ${n}`,[s,c,l]=await Promise.all([Vs(o),RF(r),Vs(a)]);return{ping:s,traceroute:c,curl:l}}import{tmpdir as pB,totalmem as mB}from"os";import gB from"path";import{execFile as wF}from"child_process";import CF from"path";function xF(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return CF.join(r,"platform-tools",e)}async function St(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=xF(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{wF(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as MF}from"@limrun/api";import{execSync as _F}from"child_process";import{hostname as IF}from"os";import PF from"path";import{_android as OF}from"playwright";var $R=9e4;async function qR(r){let{apiClient:e,logger:t,creationOpts:n,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:c}=r,{token:l,webRtcUrl:u,adbUrl:d,name:p,apkDownloadUrl:m,region:g,playwrightServerUrl:h}=await e.createAndroidEmulator({...n,hostname:IF(),sessionId:s}),f;try{_F("adb --version"),f="adb"}catch{if(process.env.ANDROID_HOME)f=PF.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new E("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:p,apkToInstall:n.apkToInstall,region:g,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:h},"Android instance creation ok");let b=await ft.recordDuration({fn:async()=>await MF({adbUrl:d,endpointUrl:u,token:l,logLevel:i,adbPath:f}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`]}),T;c&&(T=b.onConnectionStateChange(c));let C=["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&&C.push(m);let x=n.apkToInstall?.channel,w=n.apkToInstall?.tag;o(`Installing APK${x?` with channel ${x}`:""}${w?` and tag ${w}`:""}`),await ft.recordDuration({fn:async()=>{await Promise.all(C.map(k=>LF({client:b,url:k,logger:t,emulatorName:p})))},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),o("Starting ADB tunnel");let O=await ft.recordDuration({fn:async()=>await b.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),v=()=>{T?.(),O.close(),b.disconnect()},M;return h&&(o("Opening Playwright connection"),M=await ft.recordDuration({fn:async()=>await OF.connect(h),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:O.address.port,close:v,limbarToken:l,limbarUrl:u,emulatorName:p,playwrightDevice:M,client:b}}async function LF(r){let{client:e,url:t,logger:n,emulatorName:o}=r,i=async()=>{await z(e.sendAsset(t),{milliseconds:$R,message:`Timed out after ${$R}ms sending asset to emulator ${o}: ${t}`})};try{await i()}catch(a){n.warn({url:t,err:a,emulatorName:o},"Failed to send asset to Limbar client");try{await i()}catch(s){throw n.error({url:t,err:s,emulatorName:o},"Failed to send asset to Limbar client"),new E("UserConfigurationError",`Failed to send asset to emulator ${o}: ${s}`)}}}import eB from"fs";function yt(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var yn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},bn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},Fg={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},Bg={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function YR(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?bn[r.operation]:yn[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?Bg[r.condition]:Fg[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 Rme={CONTENT:"The page"};function XR(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 zg(r){return`${r.negated?bn.CONTAINS:yn.CONTAINS} '${r.value}'`}function JR(r){switch(r.type){case"CONTENT":return zg(r);default:return r.type,""}}function NF(r){return typeof r=="object"&&r!==null}function Fo(r){if(Array.isArray(r))return r.map(Fo);if(NF(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=Fo(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 bu(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function Sr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?Fg[r.condition]:Bg[r.condition]:r.negated?yn[r.operation]:bn[r.operation]}import{diff as DF}from"deep-object-diff";import{cloneDeep as Kme}from"lodash-es";function Eu(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(DF(r,e)).length>0}function Hg({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(p,m)=>{try{let g=Un.parse(m.value);if(g.type!==p.type){o.warn({parsedCacheEntry:g,command:p},"Not using step cache due to type mismatch"),s.push(m.key);return}p.cache=g.cache,a.push(m.key),c.push(m.uniqueKey)}catch(g){s.push(m.key),o.error({err:g,cacheEntry:m},"Not using step cache due to parsing error")}},d=(p,m)=>{let g=UF(p.id,m),h=g.find(f=>!!n[f]);if(h)u(p,n[h]);else{if(p.type==="AI_CHECK")return;s.push(g[0])}};for(let p of r)switch(p.type){case"MOBILE_PRESET_STEP":{if(!ec(p.command)||p.command.type==="TYPE"&&!p.command.target||"cache"in p.command&&p.command.cache)continue;l++,d(p.command,i);break}case"RESOLVED_MOBILE_MODULE":{l+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:g,uniqueKeysHit:h}=Hg({...t,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),s.push(...g),c.push(...h);break}case"MOBILE_AI_ACTION_STEP":{l++;break}default:{let m=p}}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(p=>p.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function kF(r,e){return e?`${e}:${r}`:r}function UF(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 Gg(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:kF(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function Tu({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"&&sp(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 Ws(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;Eu(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 Vg(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 ZR(r,e){return r?Eu(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:Vg(e.target),updatedAt:e.updatedAt}}function FF(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${Ei(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${Ei(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 ${Ei(r.fromTarget)} to ${Ei(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${JR(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${Ei(r.target)} ${YR(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"ROTATE_ORIENTATION":return`Rotate orientation to ${r.orientation}`;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 Wg(r){switch(r.type){case"MOBILE_PRESET_STEP":return FF(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 _w}from"lodash-es";import jg from"semver";function vu(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(!jg.valid(t.toVersion)||!jg.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!jg.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 BF from"diff-lines";import zF,{gte as HF}from"semver";function GF(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function $g({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>zF.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&&HF(l,n)){t.debug("Stopping migration early because toVersion was reached");break}let p=o[d],m={id:s,migration:p.name,toVersion:p.toVersion};try{i=await ew(i,p),l=p.toVersion}catch(g){throw t.error({err:g,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${g}`)}}let u=BF(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 ew(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)||GF(i)&&(n[o]=await ew(i,e))}return t}var tw={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 rw=[tw];vu(So,rw);async function qg({metadata:r,steps:e,logger:t,toVersion:n}){return await $g({metadata:r,steps:e,logger:t,toVersion:n,migrations:rw})}var nw={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 ow={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 VF=["target","fromTarget","toTarget"];function iw(r){for(let e of VF){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var aw={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 iw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])iw(n);return e}default:return e}})};import{v4 as WF}from"uuid";var sw={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=WF()),e;default:return e}})};import{v4 as lw}from"uuid";var cw={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??lw(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??lw()}})),delete e.commands),e;default:return e}})};var uw={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 jF}from"uuid";var dw={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=jF()),e))};import{v4 as pw}from"uuid";var mw={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=pw())}return e.id=pw(),e})};var gw={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 $F}from"uuid";var hw={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=$F()),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 fw={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 Sw={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&&yw(t),e})};function yw(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){yw(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 bw={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 Ew={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 Tw={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 vw={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 Aw={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 Rw={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 ww={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 Au=new Set(["CLICK","TYPE","SELECT_OPTION"]),Cw={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||Au.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||Au.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||Au.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||Au.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var xw={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 Mw={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 qF=[ww,xw,Mw,Cw,nw,ow,aw,sw,cw,uw,dw,mw,gw,hw,fw,Sw,bw,Ew,Tw,vw,Aw,Rw];vu(Nn,qF);async function Iw(r){let e={},{resolvedSteps:t,newSchemaVersion:n}=await Ru({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 Ru({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 YF(r,e,t){let{newVersion:n,steps:o}=await qg({metadata:r,steps:e,logger:t});try{return{steps:Wt.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 Ru({rawSteps:r,onFetchModule:e,logger:t,metadata:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await YF(n,r,t),s=[];for(let c of a)s.push(await Pw({rawStep:Wt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function Pw({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{..._w(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=Wt.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=>Pw({rawStep:u,onFetchModule:e,logger:t,resolvedModuleCache:n}))),l={...a,description:a.description||void 0,steps:c};return n[o]=_w(l),{...l,...r,type:"RESOLVED_MOBILE_MODULE"}}case"MOBILE_AI_ACTION_STEP":case"MOBILE_PRESET_STEP":return r}}import{diff as Ow}from"deep-object-diff";import{cloneDeep as Lw}from"lodash-es";import{v4 as Kg}from"uuid";async function Qr(r){let e=new Map,t=new Set,n=Lw(r.steps),o=await Dw({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function XF({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=_n.safeParse(i),s=_n.safeParse(o);if(a.success&&s.success&&a.data.memory){let p=s.data.memory,m=a.data.memory;Eu(p,m)&&(n.value.cache={...s.data,memory:m,updatedAt:a.data.updatedAt},t.push(n));continue}let c=kn.safeParse(i),l=kn.safeParse(o);if(c.success&&l.success){let p=js({originalCache:l.data,newCache:c.data,targetGetter:m=>m.target});p.changed&&(n.value.cache=p.result,t.push(n));continue}let u=Zl.safeParse(i),d=Zl.safeParse(o);if(u.success&&d.success){let p=js({originalCache:d.data,newCache:u.data,targetGetter:g=>g.fromTarget}),m=js({originalCache:{...d.data,fromTarget:p.result.fromTarget},newCache:u.data,targetGetter:g=>g.toTarget});(p.changed||m.changed)&&(n.value.cache=m.result,t.push(n));continue}}return t}async function Nw({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await Qr({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await Qr({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=XF({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 Dw({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?Kg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?Kg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(Gg({id:d.id,orgId:n.orgId,testId:n.testId,value:Un.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?Kg():u.id,p=u.moduleId;a.has(p)?p=a.get(p):s!==void 0&&(p=await s(u),a.set(u.moduleId,p));let{cachesToSave:m,stepsToSave:g,moduleUpdates:h}=await Dw({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,d],moduleIdParents:[...o,p],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(h),l.cachesToSave=l.cachesToSave.concat(m),t.has(p)||(t.add(p),l.moduleUpdates.push({...Ob.parse(u),steps:Wt.array().parse(g),moduleId:p}));let f=os.parse({...u,type:"MOBILE_MODULE_STEP",moduleId:p,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 js({originalCache:r,newCache:e,targetGetter:t}){let n=t(r),o=t(e),i=Lw(r),a=t(i),s=!1;if(o.memory){let c=n.memory,l=Object.keys(Ow(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(Ow(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function JF(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 QF(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 JF({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function Uw({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!!QF([r],t,i).result}function Fw(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 Bw({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 Qfe}from"lodash-es";import eSe from"truncate-json";import{v4 as cSe}from"uuid";import{cloneDeep as Gfe,unset as Vfe}from"lodash-es";import{cloneDeep as gSe}from"lodash-es";import{diff as ZSe}from"deep-object-diff";import{diff as OSe}from"deep-object-diff";import{cloneDeep as NSe}from"lodash-es";import{v4 as YSe}from"uuid";import{cloneDeep as iye}from"lodash-es";import{z as bye}from"zod";import{cloneDeep as Aye}from"lodash-es";import{stringify as Dye}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 Xg({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 $s({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 Xg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function wu(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 ZF from"picomatch";var Cu=(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||ZF(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},xu=(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}},Yi=r=>{try{return new URL(r),!0}catch{return!1}},zw=r=>!r.toLowerCase().startsWith("http"),Xi=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Bo(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 Hw}from"uuid";function Jg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Mu=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:Jg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(Lb(e.type)){this.creditsUsedV2+=1;return}let t=am(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=sm(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:Hw(),properties:Jg({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:Hw(),properties:Jg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as fbe}from"lodash-es";import{remote as tB}from"webdriverio";var rB=["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 nB(r,e){try{let t=await eB.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 oB(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:za(e)}}}function iB(r){let e=za(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function Gw(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 aB(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function sB(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 lB(r){return{adbSerial:r,devices:await St(["devices","-l"],{timeoutMs:2500}),state:r?await St(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await St(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function cB({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=Gw(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?aB(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 St(["start-server"],{timeoutMs:5e3}),await j(500),await St(["disconnect",s],{timeoutMs:5e3}),await j(500),await St(["connect",s],{timeoutMs:5e3}),await j(500)):(await St(["kill-server"],{timeoutMs:5e3}),await j(500),await St(["start-server"],{timeoutMs:5e3}),await j(500),await St(["reconnect","offline"],{timeoutMs:5e3}),await j(500)),e){let c=await St(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await St(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await St(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function Vw({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o,d;for(let p=1;p<=2;p++)try{return p>1&&e("Retrying Appium session creation..."),{driver:await tB(t),appiumLogFile:u,appiumServerClose:l}}catch(m){d=m instanceof E?m:new E("UserInfrastructureError",za(m),{errOptions:{cause:m}});let g=await oB(n),h=await lB(s),f=await nB(u,64*1024),b=sB(f),T=Gw(h.devices,s);if(r.error({err:m,appiumPort:n,appiumLogFile:u,appiumStatus:g,adbSnapshot:h,adbDeviceState:T,appiumLogHints:b,appiumLogTail:f},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${za(m)}`),!(p===1&&(iB(m)||T==="offline"||b.instrumentationCrashed||b.deviceOffline)))throw R.error(`Failed to create Appium WebDriver session. Troubleshooting:
41
- - ${rB.join(`
42
- - `)}`),m;try{await cB({logger:r,adbSerial:s,adbSnapshot:h,appiumLogHints:b,transportMode:c})}catch(x){r.warn({err:x},"Android transport recovery failed")}try{await l()}catch(x){r.warn({err:x},"Failed to close Appium server after session start failure")}({close:l,logFile:u}=await a())}throw d}async function _u({onStatusUpdate:r,creationOpts:e,apiClient:t,logger:n,driverLogLevel:o,appiumPort:i,socket:a,orgId:s,sessionId:c,onConnectionStateChange:l}){let u=Date.now();n.info("Starting android driver creation");let d=[],p;if("avdId"in e)p=e;else{p=await qR({apiClient:t,logger:n,creationOpts:e,onStatusUpdate:r,orgId:s,sessionId:c,onConnectionStateChange:l});let h=p.emulatorName;d.push(()=>t.deleteAndroidEmulator(h),p.close),n=n.child({emulatorName:h}),(async()=>{try{let f=await jR("limserver-1.limrun.net");n.info({diagnostics:f},"Limbar network diagnostics")}catch(f){n.warn({err:f},"Failed to run network diagnostics")}})()}let m=async()=>{for(let h=d.length-1;h>=0;h-=1)try{await d[h]()}catch(f){if(f instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(b=>f.message.includes(b)))continue;n.warn({err:f},"Error running cleanup task")}},g=async()=>{if(a&&!a.connected)throw await m(),new E("UserInfrastructureError","Client disconnected before Appium driver could be started, cleaning up...")};await g();try{let h=await hB({logger:n,driverLogLevel:o,appiumPort:i,emulatorStart:u,emulatorCreationParams:p,apiClient:t,onStatusUpdate:r,creationOpts:e,orgId:s,sessionId:c});return d.push(h.appiumClose),d.push(async()=>h.driver.deleteSession()),await g(),{...p,...h,cleanup:m,appiumPort:i}}catch(h){throw await m(),new E("UserInfrastructureError",`Failed to start Appium driver: ${h.message}`)}}async function hB({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 M=0;for(;M<10;){let k=5555+Math.floor(Math.random()*30);if(k%2!==0&&(k=Math.min(k+1,5584)),await Cc(k)&&await Cc(k+1)){u=k,c=k+1;break}M+=1}if(!c)throw new E("UserInfrastructureError",`Failed to find an available ADB port after ${M} attempts`)}l||(l=`emulator-${u}`,i("Killing existing emulators..."),await jw(r),s.push(()=>jw(r)),i("Starting new emulator..."));let p=Date.now(),{close:m,logFile:g}=await Ww({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 M=fB();h["appium:avdArgs"]=`-port ${u} -memory ${M} -no-snapshot-save -no-boot-anim -noaudio`,f.connectionRetryTimeout=12e4,f.connectionRetryCount=3}let b="avdId"in o?l:`127.0.0.1:${c}`,T=Date.now(),{driver:C,appiumLogFile:x,appiumServerClose:w}=await Vw({logger:r,onStatusUpdate:i,wdOpts:f,appiumPort:n,appiumLogFile:g,appiumServerClose:m,transportMode:d,startAppiumServer:async()=>await Ww({logger:r,logLevel:e,appiumPort:n}),adbSerial:b});if(g=x,m=w,await C.updateSettings({enableMultiWindows:!0,waitForIdleTimeout:100}),"avdId"in a){let M=a.apkFilePath?.trim();if(M){let k=gB.resolve(M);if(!dB.existsSync(k))throw new E("UserConfigurationError",`APK not found at path: ${k}`);i("Installing local APK...");let V=Date.now();try{await C.installApp(k),r.info({apkFilePath:k,installDurationMs:Date.now()-V},"Installed local APK")}catch(J){throw r.error({err:J,apkFilePath:k},"Failed to install local APK"),new E("UserConfigurationError",`Failed to install APK from ${k}: ${J.message}`)}}}let O=new Map;return C.on("command",M=>{O.set(M.command,Date.now())}),C.on("result",M=>{let k=O.get(M.command);if(!k)return;let V=Date.now()-k;M.result instanceof Error?r.warn({err:M.result,command:M.command,args:M.body,durationMs:V},"Appium cmd failed"):V>1e4&&r.warn({command:M.command,args:M.body,durationMs:V},"Appium cmd took very long"),O.delete(M.command)}),r.info({timings:{emulatorDuration:p-t,appiumDuration:T-p,wdioDuration:Date.now()-T},capabilities:h,emulatorName:l},"Started Appium driver"),{driver:C,appiumClose:async()=>{await m(),await Promise.all(s.map(M=>M()))},appiumPort:n,appiumLogFile:g,emulatorName:l,adbPort:c}}async function Ww({logger:r,logLevel:e,appiumPort:t}){let n=`${pB()}/appium-port-${Date.now()}.log`,o=await uB.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 jw(r){let n=(await St(["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 St(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function fB(){let r=Math.floor(mB()/1024/1024),e=Math.floor(r/4);return Math.max(2048,Math.min(8192,Math.floor(e/256)*256))}import $w from"crypto";import SB from"fs";async function Iu({tag:r,channel:e,filePath:t,apiClient:n,logger:o}){let i=await SB.promises.readFile(t),a=$w.createHash("md5").update(i).digest("base64"),s=$w.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 E("InternalPlatformError",`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 E("InternalPlatformError",`No upload URL was given for asset ${t}`)}import{execSync as qw}from"child_process";import{existsSync as yB}from"fs";import{platform as Kw}from"os";import{dirname as bB,join as EB,resolve as TB}from"path";import{fileURLToPath as vB}from"url";var Yw,AB=vB(import.meta.url),RB=bB(AB);Yw=TB(RB,"..");var qs=Yw;R.info(`Setting APPIUM_HOME to ${qs}`);process.env.APPIUM_HOME=qs;var wB="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.",CB="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.",xB="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",Xw="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",Jw="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function MB(){if(!process.env.JAVA_HOME)R.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)&&R.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)=>EB(t,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");yB(e)||R.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`)}try{qw("java --version",{stdio:"pipe",encoding:"utf-8"})||(R.error(`Could not find a Java installation. ${wB}`),process.exit(1))}catch(r){R.error(`Got error while checking if the Java JDK is installed: ${r}`),process.exit(1)}}function _B(){process.env.ANDROID_HOME||(R.error(`The ANDROID_HOME environment variable is not set. ${xB} ${Kw()==="darwin"?Xw:Jw}`),process.exit(1))}function IB(){let r=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{qw(`${r} version`,{stdio:"pipe",encoding:"utf-8"})||(R.error(`Could not find the Android Debug Bridge (ADB) tool locally. This tool is included with Android Studio. ${CB} Finally, ensure that the 'adb' command is available in your shell. ${Kw()==="darwin"?Xw:Jw}`),process.exit(1))}catch(e){R.error(`Got error while checking if ADB is installed: ${e}`),process.exit(1)}}function Qw(){MB(),_B(),IB()}import{create as PB,windowedFiniteBatchScheduler as OB}from"@yornaath/batshit";import LB from"fs";import NB from"ws";var DB=100,kB=2500,Zw=4e3,UB="\u2026",FB=1e3;async function Pu({driver:r,onLogs:e,logFilePath:t}){await r.execute("mobile: startLogsBroadcast");let n=t?LB.createWriteStream(t,{flags:"a"}):void 0,o=[],i=()=>{o.length===0||!n||(n.write(o.join(`
39
+ `,Lg(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 CR=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}();Ne();Ne();var xR=function(){function r(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new Mr}return r.prototype.observe=function(e,t){if(t===void 0&&(t={}),typeof e!="number"){W.warn("non-number value provided to metric "+this._instrumentName+": "+e);return}this._valueType===Yt.INT&&!Number.isInteger(e)&&(W.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 MR=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 Mr,this._buffer.set(e,o)),typeof t!="number"){W.warn("non-number value provided to metric "+e._descriptor.name+": "+t);return}e._descriptor.valueType===Yt.INT&&!Number.isInteger(t)&&(W.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 Dg=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())})},kg=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}}},_R=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},IR=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))},PR=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){W.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 Dg(this,void 0,void 0,function(){var n,o,i,a;return kg(this,function(s){switch(s.label){case 0:return n=this._observeCallbacks(e,t),o=this._observeBatchCallbacks(e,t),[4,_A(IR(IR([],_R(n),!1),_R(o),!1))];case 1:return i=s.sent(),a=i.filter(IA).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 Dg(n,void 0,void 0,function(){var s,c;return kg(this,function(l){switch(l.label){case 0:return s=new xR(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(s)),t!=null&&(c=$n(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 Dg(n,void 0,void 0,function(){var s,c;return kg(this,function(l){switch(l.label){case 0:return s=new MR,c=Promise.resolve(i(s)),t!=null&&(c=$n(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(p){p.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&&PA(n.instruments,t)})},r}();var sF=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)}}(),OR=function(r){sF(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 du(n,s._aggregationCardinalityLimit),s._temporalMetricStorage=new pu(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}(uu);var LR=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)}}(),qi=function(){function r(){}return r.Noop=function(){return cF},r}();var lF=function(r){LR(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.process=function(t,n){return t},e}(qi);var NR=function(r){LR(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}(qi);var cF=new lF;var uF=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())})},dF=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}}},pF=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},DR=function(){function r(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new wR,this.observableRegistry=new PR,this.meter=new TR(this)}return r.prototype.registerMetricStorage=function(e){var t=this._registerMetricStorage(e,OR);return t.length===1?t[0]:new CR(t)},r.prototype.registerAsyncMetricStorage=function(e){var t=this._registerMetricStorage(e,RR);return t},r.prototype.collect=function(e,t,n){return uF(this,void 0,void 0,function(){var o,i,a;return dF(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(xA),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=NA(c,e),u=n.metricStorageRegistry.findOrUpdateCompatibleStorage(l);if(u!=null)return u;var d=c.aggregation.createAggregator(l),p=new t(l,d,c.attributesProcessor,n._meterProviderSharedState.metricCollectors,c.aggregationCardinalityLimit);return n.metricStorageRegistry.register(p),p});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(e.type),s=a.map(function(c){var l=pF(c,2),u=l[0],d=l[1],p=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(u,e);if(p!=null)return p;var m=d.createAggregator(e),g=u.selectCardinalityLimit(e.type),h=new t(e,m,qi.Noop(),[u],g);return n.metricStorageRegistry.registerForCollector(u,h),h});i=i.concat(s)}return i},r}();var mF=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.")},kR=function(){function r(e){this.resource=e,this.viewRegistry=new mR,this.metricCollectors=[],this.meterSharedStates=new Map}return r.prototype.getMeterSharedState=function(e){var t=MA(e),n=this.meterSharedStates.get(t);return n==null&&(n=new DR(this,e),this.meterSharedStates.set(t,n)),n},r.prototype.selectAggregations=function(e){var t,n,o=[];try{for(var i=mF(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 mu=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())})},gu=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}}},gF=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},hF=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))},UR=function(){function r(e,t){this._sharedState=e,this._metricReader=t}return r.prototype.collect=function(e){return mu(this,void 0,void 0,function(){var t,n,o,i,a=this;return gu(this,function(s){switch(s.label){case 0:return t=Do(Date.now()),n=[],o=[],i=Array.from(this._sharedState.meterSharedStates.values()).map(function(c){return mu(a,void 0,void 0,function(){var l;return gu(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,hF([],gF(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 mu(this,void 0,void 0,function(){return gu(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 mu(this,void 0,void 0,function(){return gu(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 FR=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())})},BR=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}}},zR=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 fF(r,e){var t=e??su.empty();return r?su.default().merge(t):t}var Ug=function(){function r(e){var t,n,o,i,a;if(this._shutdown=!1,this._sharedState=new kR(fF((a=e?.mergeResourceWithDefaults)!==null&&a!==void 0?a:!0,e?.resource)),e?.views!=null&&e.views.length>0)try{for(var s=zR(e.views),c=s.next();!c.done;c=s.next()){var l=c.value;this._sharedState.viewRegistry.addView(l)}}catch(m){t={error:m}}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=zR(e.readers),d=u.next();!d.done;d=u.next()){var p=d.value;this.addMetricReader(p)}}catch(m){o={error:m}}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?(W.warn("A shutdown MeterProvider cannot provide a Meter"),Gm()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter},r.prototype.addMetricReader=function(e){var t=new UR(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)},r.prototype.shutdown=function(e){return FR(this,void 0,void 0,function(){return BR(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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 FR(this,void 0,void 0,function(){return BR(this,function(t){switch(t.label){case 0:return this._shutdown?(W.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 SF=/[\^$\\.+?()[\]{}|]/g,hu=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(SF,"\\$&").replace("*",".*")+"$"},r.hasWildcard=function(e){return e.includes("*")},r}();var Ki=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 HR=function(){function r(e){var t;this._nameFilter=new hu((t=e?.name)!==null&&t!==void 0?t:"*"),this._type=e?.type,this._unitFilter=new Ki(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 GR=function(){function r(e){this._nameFilter=new Ki(e?.name),this._versionFilter=new Ki(e?.version),this._schemaUrlFilter=new Ki(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 yF(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var fu=function(){function r(e){var t;if(yF(e))throw new Error("Cannot create view with no selector arguments supplied");if(e.name!=null&&(e?.instrumentName==null||hu.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 NR(e.attributeKeys):this.attributesProcessor=qi.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:fr.Default(),this.instrumentSelector=new HR({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new GR({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl}),this.aggregationCardinalityLimit=e.aggregationCardinalityLimit}return r}();var gpe=process.env.APP||"unknown";Ne();import{v4 as bF}from"uuid";function EF(){return new RA({url:"https://us-west.metrics.momentic.ai/v1/metrics",headers:{"x-momentic-metrics-api-key":"c60c6a0f-60da-41a7-a61b-07969a0aa303"},temporalityPreference:Lo.DELTA})}var TF=[new fu({instrumentName:"test_event_duration",instrumentType:Ee.HISTOGRAM,aggregation:new Hs([100,500,1e3,5e3,7500,1e4,15e3,2e4])}),new fu({instrumentName:"test_step_duration",instrumentType:Ee.HISTOGRAM,aggregation:new Hs([100,500,1e3,5e3,7500,1e4,15e3,2e4])})],yu=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 ag({[Dc]:e.serviceName,[Ev]:t,[vv]:typeof process<"u"&&process.env.SERVICE_INSTANCE_ID?process.env.SERVICE_INSTANCE_ID:bF()}),o=EF(),i=new Ig({exporter:o,exportIntervalMillis:e.exportIntervalMs??15e3});this.provider=new Ug({resource:n,readers:[i],views:TF}),Pc.setGlobalMeterProvider(this.provider),this.meter=Pc.getMeter("momentic-serverless")}increment(e,t,n){try{let o=Mc(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=Mc(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 ft=new xc;function VR(r){r.disabled||(ft=new yu(r))}import{exec as vF}from"child_process";import{platform as WR}from"os";var AF=1e4;async function Vs(r){return new Promise(e=>{vF(r,{timeout:AF},(t,n,o)=>{e({command:r,stdout:n,stderr:o,error:t?.message??null,timedOut:t?.killed??!1})})})}async function RF(r){if(WR()==="win32")return Vs(`tracert ${r}`);let t=await Vs(`traceroute ${r}`);return t.stderr.includes("not found")||t.error?.includes("not found")?Vs(`tracepath ${r}`):t}async function jR(r){let t=WR()==="win32",n=`https://${r}`,o=t?`ping -n 3 ${r}`:`ping -c 3 ${r}`,a=`curl -w "\\n\\ntime_namelookup: %{time_namelookup}s\\ntime_connect: %{time_connect}s\\ntime_appconnect: %{time_appconnect}s\\ntime_starttransfer: %{time_starttransfer}s\\ntime_total: %{time_total}s\\n" -o ${t?"NUL":"/dev/null"} -s ${n}`,[s,c,l]=await Promise.all([Vs(o),RF(r),Vs(a)]);return{ping:s,traceroute:c,curl:l}}import{tmpdir as qF,totalmem as KF}from"os";import YF from"path";import{execFile as wF}from"child_process";import CF from"path";function xF(){let r=process.env.ANDROID_HOME;if(!r)return"adb";let e=process.platform==="win32"?"adb.exe":"adb";return CF.join(r,"platform-tools",e)}async function St(r,{timeoutMs:e=5e3,serial:t,throwOnError:n=!1}){let o=xF(),i=t?["-s",t,...r]:r;return await new Promise((a,s)=>{wF(o,i,{encoding:"utf8",timeout:e},(c,l)=>{if(c){if(n){s(c);return}a(void 0);return}a(l)})})}import{createInstanceClient as MF}from"@limrun/api";import{execSync as _F}from"child_process";import{hostname as IF}from"os";import PF from"path";import{_android as OF}from"playwright";var $R=9e4;async function qR(r){let{apiClient:e,logger:t,creationOpts:n,onStatusUpdate:o,logLevel:i,orgId:a,sessionId:s,onConnectionStateChange:c}=r,{token:l,webRtcUrl:u,adbUrl:d,name:p,apkDownloadUrl:m,region:g,playwrightServerUrl:h}=await e.createAndroidEmulator({...n,hostname:IF(),sessionId:s}),f;try{_F("adb --version"),f="adb"}catch{if(process.env.ANDROID_HOME)f=PF.join(process.env.ANDROID_HOME,"platform-tools","adb");else throw new E("UserInfrastructureError","The ADB binary was not found in PATH and ANDROID_HOME is not set either")}t.info({emulatorName:p,apkToInstall:n.apkToInstall,region:g,apkDownloadUrl:m,sessionId:s,playwrightServerUrl:h},"Android instance creation ok");let b=await ft.recordDuration({fn:async()=>await MF({adbUrl:d,endpointUrl:u,token:l,logLevel:i,adbPath:f}),name:"test_event_duration",tags:["name:limbar-client-creation","clientOs:android",`orgId:${a}`]}),T;c&&(T=b.onConnectionStateChange(c));let C=["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&&C.push(m);let x=n.apkToInstall?.channel,w=n.apkToInstall?.tag;o(`Installing APK${x?` with channel ${x}`:""}${w?` and tag ${w}`:""}`),await ft.recordDuration({fn:async()=>{await Promise.all(C.map(k=>LF({client:b,url:k,logger:t,emulatorName:p})))},name:"test_event_duration",tags:["name:limbar-asset-upload",`orgId:${a}`]}),o("Starting ADB tunnel");let O=await ft.recordDuration({fn:async()=>await b.startAdbTunnel(),name:"test_event_duration",tags:["name:limbar-tunnel-connect",`orgId:${a}`]}),v=()=>{T?.(),O.close(),b.disconnect()},M;return h&&(o("Opening Playwright connection"),M=await ft.recordDuration({fn:async()=>await OF.connect(h),name:"test_event_duration",tags:["name:playwright-device-connect",`orgId:${a}`]})),{adbPort:O.address.port,close:v,limbarToken:l,limbarUrl:u,emulatorName:p,playwrightDevice:M,client:b}}async function LF(r){let{client:e,url:t,logger:n,emulatorName:o}=r,i=async()=>{await z(e.sendAsset(t),{milliseconds:$R,message:`Timed out after ${$R}ms sending asset to emulator ${o}: ${t}`})};try{await i()}catch(a){n.warn({url:t,err:a,emulatorName:o},"Failed to send asset to Limbar client");try{await i()}catch(s){throw n.error({url:t,err:s,emulatorName:o},"Failed to send asset to Limbar client"),new E("UserConfigurationError",`Failed to send asset to emulator ${o}: ${s}`)}}}import DF from"fs";var Yn=3.1783027;function NF(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 _r(r){return Math.ceil(Fg(r)/Yn)}function Fg(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
40
+ `,""),t=t.replaceAll(" ","");let n=NF(t);return t.length-n+Yn*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+=Fg(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*Yn:e+=85*Yn:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Yn:e+=Fg(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 bu=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 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)}})}import{remote as kF}from"webdriverio";var UF=["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 FF(r,e){try{let t=await DF.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 BF(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:za(e)}}}function zF(r){let e=za(r);return e.includes("/session")&&(e.toLowerCase().includes("timeout")||e.toLowerCase().includes("socket hang up"))}function KR(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 HF(r){return r&&(/^\d{1,3}(\.\d{1,3}){3}:\d+$/.test(r)||/^localhost:\d+$/.test(r))?r:null}function GF(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 VF(r){return{adbSerial:r,devices:await St(["devices","-l"],{timeoutMs:2500}),state:r?await St(["get-state"],{serial:r,timeoutMs:5e3}):void 0,bootCompleted:r?await St(["shell","getprop","sys.boot_completed"],{serial:r,timeoutMs:5e3}):void 0}}async function WF({logger:r,adbSerial:e,adbSnapshot:t,appiumLogHints:n,transportMode:o}){let i=KR(t.devices,e);if(!(i==="offline"||n.deviceOffline||n.instrumentationCrashed||n.uiAutomatorCrashed))return;let s=o==="tunneled"?HF(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 St(["start-server"],{timeoutMs:5e3}),await j(500),await St(["disconnect",s],{timeoutMs:5e3}),await j(500),await St(["connect",s],{timeoutMs:5e3}),await j(500)):(await St(["kill-server"],{timeoutMs:5e3}),await j(500),await St(["start-server"],{timeoutMs:5e3}),await j(500),await St(["reconnect","offline"],{timeoutMs:5e3}),await j(500)),e){let c=await St(["get-state"],{serial:e,timeoutMs:5e3});typeof c=="string"&&c.trim()==="device"&&(await St(["shell","pm","clear","io.appium.uiautomator2.server"],{serial:e,timeoutMs:5e3}),await St(["shell","pm","clear","io.appium.uiautomator2.server.test"],{serial:e,timeoutMs:5e3}))}}async function YR({logger:r,onStatusUpdate:e,wdOpts:t,appiumPort:n,appiumLogFile:o,appiumServerClose:i,startAppiumServer:a,adbSerial:s,transportMode:c}){let l=i,u=o,d;for(let p=1;p<=2;p++)try{return p>1&&e("Retrying Appium session creation..."),{driver:await kF(t),appiumLogFile:u,appiumServerClose:l}}catch(m){d=m instanceof E?m:new E("UserInfrastructureError",za(m),{errOptions:{cause:m}});let g=await BF(n),h=await VF(s),f=await FF(u,64*1024),b=GF(f),T=KR(h.devices,s);if(r.error({err:m,appiumPort:n,appiumLogFile:u,appiumStatus:g,adbSnapshot:h,adbDeviceState:T,appiumLogHints:b,appiumLogTail:f},"Failed to create Appium WebDriver session"),e(`Appium session creation failed: ${za(m)}`),!(p===1&&(zF(m)||T==="offline"||b.instrumentationCrashed||b.deviceOffline)))throw R.error(`Failed to create Appium WebDriver session. Troubleshooting:
41
+ - ${UF.join(`
42
+ - `)}`),m;try{await WF({logger:r,adbSerial:s,adbSnapshot:h,appiumLogHints:b,transportMode:c})}catch(x){r.warn({err:x},"Android transport recovery failed")}try{await l()}catch(x){r.warn({err:x},"Failed to close Appium server after session start failure")}({close:l,logFile:u}=await a())}throw d}async function Eu({onStatusUpdate:r,creationOpts:e,apiClient:t,logger:n,driverLogLevel:o,appiumPort:i,socket:a,orgId:s,sessionId:c,onConnectionStateChange:l}){let u=Date.now();n.info("Starting android driver creation");let d=[],p;if("avdId"in e)p=e;else{p=await qR({apiClient:t,logger:n,creationOpts:e,onStatusUpdate:r,orgId:s,sessionId:c,onConnectionStateChange:l});let h=p.emulatorName;d.push(()=>t.deleteAndroidEmulator(h),p.close),n=n.child({emulatorName:h}),(async()=>{try{let f=await jR("limserver-1.limrun.net");n.info({diagnostics:f},"Limbar network diagnostics")}catch(f){n.warn({err:f},"Failed to run network diagnostics")}})()}let m=async()=>{for(let h=d.length-1;h>=0;h-=1)try{await d[h]()}catch(f){if(f instanceof Error&&["ECONNREFUSED","ECONNRESET","UND_ERR_CLOSED"].some(b=>f.message.includes(b)))continue;n.warn({err:f},"Error running cleanup task")}},g=async()=>{if(a&&!a.connected)throw await m(),new E("UserInfrastructureError","Client disconnected before Appium driver could be started, cleaning up...")};await g();try{let h=await XF({logger:n,driverLogLevel:o,appiumPort:i,emulatorStart:u,emulatorCreationParams:p,apiClient:t,onStatusUpdate:r,creationOpts:e,orgId:s,sessionId:c});return d.push(h.appiumClose),d.push(async()=>h.driver.deleteSession()),await g(),{...p,...h,cleanup:m,appiumPort:i}}catch(h){throw await m(),new E("UserInfrastructureError",`Failed to start Appium driver: ${h.message}`)}}async function XF({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 M=0;for(;M<10;){let k=5555+Math.floor(Math.random()*30);if(k%2!==0&&(k=Math.min(k+1,5584)),await Cc(k)&&await Cc(k+1)){u=k,c=k+1;break}M+=1}if(!c)throw new E("UserInfrastructureError",`Failed to find an available ADB port after ${M} attempts`)}l||(l=`emulator-${u}`,i("Killing existing emulators..."),await JR(r),s.push(()=>JR(r)),i("Starting new emulator..."));let p=Date.now(),{close:m,logFile:g}=await XR({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 M=JF();h["appium:avdArgs"]=`-port ${u} -memory ${M} -no-snapshot-save -no-boot-anim -noaudio`,f.connectionRetryTimeout=12e4,f.connectionRetryCount=3}let b="avdId"in o?l:`127.0.0.1:${c}`,T=Date.now(),{driver:C,appiumLogFile:x,appiumServerClose:w}=await YR({logger:r,onStatusUpdate:i,wdOpts:f,appiumPort:n,appiumLogFile:g,appiumServerClose:m,transportMode:d,startAppiumServer:async()=>await XR({logger:r,logLevel:e,appiumPort:n}),adbSerial:b});if(g=x,m=w,await C.updateSettings({enableMultiWindows:!0,waitForIdleTimeout:100}),"avdId"in a){let M=a.apkFilePath?.trim();if(M){let k=YF.resolve(M);if(!$F.existsSync(k))throw new E("UserConfigurationError",`APK not found at path: ${k}`);i("Installing local APK...");let V=Date.now();try{await C.installApp(k),r.info({apkFilePath:k,installDurationMs:Date.now()-V},"Installed local APK")}catch(J){throw r.error({err:J,apkFilePath:k},"Failed to install local APK"),new E("UserConfigurationError",`Failed to install APK from ${k}: ${J.message}`)}}}let O=new Map;return C.on("command",M=>{O.set(M.command,Date.now())}),C.on("result",M=>{let k=O.get(M.command);if(!k)return;let V=Date.now()-k;M.result instanceof Error?r.warn({err:M.result,command:M.command,args:M.body,durationMs:V},"Appium cmd failed"):V>1e4&&r.warn({command:M.command,args:M.body,durationMs:V},"Appium cmd took very long"),O.delete(M.command)}),r.info({timings:{emulatorDuration:p-t,appiumDuration:T-p,wdioDuration:Date.now()-T},capabilities:h,emulatorName:l},"Started Appium driver"),{driver:C,appiumClose:async()=>{await m(),await Promise.all(s.map(M=>M()))},appiumPort:n,appiumLogFile:g,emulatorName:l,adbPort:c}}async function XR({logger:r,logLevel:e,appiumPort:t}){let n=`${qF()}/appium-port-${Date.now()}.log`,o=await jF.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 JR(r){let n=(await St(["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 St(["emu","kill"],{serial:o,timeoutMs:5e3});i&&r.warn({emulatorName:o,killResult:i},"Failed to kill emulator, continuing...")}))}function JF(){let r=Math.floor(KF()/1024/1024),e=Math.floor(r/4);return Math.max(2048,Math.min(8192,Math.floor(e/256)*256))}import QR from"crypto";import QF from"fs";async function Tu({tag:r,channel:e,filePath:t,apiClient:n,logger:o}){let i=await QF.promises.readFile(t),a=QR.createHash("md5").update(i).digest("base64"),s=QR.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 E("InternalPlatformError",`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 E("InternalPlatformError",`No upload URL was given for asset ${t}`)}import{execSync as ZR}from"child_process";import{existsSync as ZF}from"fs";import{platform as ew}from"os";import{dirname as eB,join as tB,resolve as rB}from"path";import{fileURLToPath as nB}from"url";var tw,oB=nB(import.meta.url),iB=eB(oB);tw=rB(iB,"..");var Ws=tw;R.info(`Setting APPIUM_HOME to ${Ws}`);process.env.APPIUM_HOME=Ws;var aB="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.",sB="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.",lB="Follow the instructions at https://developer.android.com/tools/variables to set the ANDROID_HOME environment variable.",rw="On Mac OS, the SDK is typically installed at /Users/<username>/Library/Android/sdk.",nw="On Windows, the SDK is typically installed at C:\\Users\\<username>\\AppData\\Local\\Android\\Sdk.";function cB(){if(!process.env.JAVA_HOME)R.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)&&R.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)=>tB(t,"bin",process.platform==="win32"?`${n}.exe`:n))(process.env.JAVA_HOME,"java");ZF(e)||R.warn(`JAVA_HOME does not appear to point to a valid Java installation: expected the 'java' binary to exist at ${e}`)}try{ZR("java --version",{stdio:"pipe",encoding:"utf-8"})||(R.error(`Could not find a Java installation. ${aB}`),process.exit(1))}catch(r){R.error(`Got error while checking if the Java JDK is installed: ${r}`),process.exit(1)}}function uB(){process.env.ANDROID_HOME||(R.error(`The ANDROID_HOME environment variable is not set. ${lB} ${ew()==="darwin"?rw:nw}`),process.exit(1))}function dB(){let r=process.env.ANDROID_HOME?`${process.env.ANDROID_HOME}/platform-tools/adb`:"adb";try{ZR(`${r} version`,{stdio:"pipe",encoding:"utf-8"})||(R.error(`Could not find the Android Debug Bridge (ADB) tool locally. This tool is included with Android Studio. ${sB} Finally, ensure that the 'adb' command is available in your shell. ${ew()==="darwin"?rw:nw}`),process.exit(1))}catch(e){R.error(`Got error while checking if ADB is installed: ${e}`),process.exit(1)}}function ow(){cB(),uB(),dB()}import{create as pB,windowedFiniteBatchScheduler as mB}from"@yornaath/batshit";import gB from"fs";import hB from"ws";var fB=100,SB=2500,iw=4e3,yB="\u2026",bB=1e3;async function vu({driver:r,onLogs:e,logFilePath:t}){await r.execute("mobile: startLogsBroadcast");let n=t?gB.createWriteStream(t,{flags:"a"}):void 0,o=[],i=()=>{o.length===0||!n||(n.write(o.join(`
44
44
  `)+`
45
- `),o.length=0)},a=n?setInterval(i,FB):void 0,s=PB({fetcher:async g=>{e(g)},resolver:()=>{},scheduler:OB({windowMs:kB,maxBatchSize:DB})}),{hostname:c="localhost",port:l=4723,protocol:u="http"}=r.options,p=`${u==="https"?"wss":"ws"}://${c}:${l}/ws/session/${r.sessionId}/appium/device/logcat`,m=new NB(p);return m.on("message",g=>{let h=g.toString().trim();h.length!==0&&(h.length>Zw&&(h=h.slice(0,Zw)+UB),n&&o.push(h),s.fetch(h).catch(()=>{}))}),async()=>{try{m.close()}catch{}try{await r.execute("mobile: stopLogsBroadcast")}catch{}try{s.next()}catch{}a&&clearInterval(a);try{i(),n?.end()}catch{}}}import{Server as TV}from"socket.io";import{tmpdir as LG}from"os";import _M from"path";import{randomUUID as YB}from"crypto";import{faker as BB}from"@faker-js/faker";import zB from"assert";import HB from"axios";import*as GB from"child_process";import VB from"moment";import*as WB from"otpauth";import jB from"pg";async function eC(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=sc(n,e);t.push(...o)}),t}function $B(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 qB(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 KB=Object.getPrototypeOf(async function(){}).constructor;async function tC(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,x)=>{o[C]=x,l[C]=x},d={},p=(C,x)=>{o[C]=x,d[C]=x},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new KB("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(HB,VB,c.fakerInstance??BB,zB,jB,m,g,WB,GB,eC,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,x=>c.sms.send(x),x=>c.sms.fetchLatest(x),c.email,c.sms,c.ai,$B(a,s),...Object.values(i??{}))),f=!0,b,T;try{let C=await z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});b=await qB(e.options.responseSerialization??"RAW",C)}catch(C){t.error({err:C,env:o,evalCode:n},`[${r}] Error executing code: ${C}`),f=!1,C instanceof Gn?T=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:T=C instanceof Error?C.message:`${C}`}return{result:b,variableUpdates:l,persistentVariableUpdates:d,success:f,error:T}}async function rC({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=Fn,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=YB(),p=await tC(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return R.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as XB,randomUUID as JB}from"crypto";import QB from"fetch-retry";var ZB=QB(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}}),nC=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,oC=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function iC({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=Fn,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!nC)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!oC)throw new Error("Missing lambda auth secret.");let h=XB("sha256",oC).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let b={id:JB(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await z(ZB(nC,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(T){m=T}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=Qb.parse(await p.json())}catch(b){throw new Error(`Code evaluation server returned invalid response: ${b}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Zr(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await iC(r);else if(r.localTools)e=await rC({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
45
+ `),o.length=0)},a=n?setInterval(i,bB):void 0,s=pB({fetcher:async g=>{e(g)},resolver:()=>{},scheduler:mB({windowMs:SB,maxBatchSize:fB})}),{hostname:c="localhost",port:l=4723,protocol:u="http"}=r.options,p=`${u==="https"?"wss":"ws"}://${c}:${l}/ws/session/${r.sessionId}/appium/device/logcat`,m=new hB(p);return m.on("message",g=>{let h=g.toString().trim();h.length!==0&&(h.length>iw&&(h=h.slice(0,iw)+yB),n&&o.push(h),s.fetch(h).catch(()=>{}))}),async()=>{try{m.close()}catch{}try{await r.execute("mobile: stopLogsBroadcast")}catch{}try{s.next()}catch{}a&&clearInterval(a);try{i(),n?.end()}catch{}}}import{Server as TV}from"socket.io";import{tmpdir as LG}from"os";import _M from"path";import{randomUUID as IB}from"crypto";import{faker as EB}from"@faker-js/faker";import TB from"assert";import vB from"axios";import*as AB from"child_process";import RB from"moment";import*as wB from"otpauth";import CB from"pg";async function aw(r){let e;try{e=new URL(r.url).hostname}catch{}let t=[];return r.headers.getSetCookie()?.forEach(n=>{let o=sc(n,e);t.push(...o)}),t}function xB(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 MB(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 _B=Object.getPrototypeOf(async function(){}).constructor;async function sw(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,x)=>{o[C]=x,l[C]=x},d={},p=(C,x)=>{o[C]=x,d[C]=x},m;n.includes("Octokit")&&(m=(await import("@octokit/rest")).Octokit);let g;n.includes("createAppAuth")&&(g=(await import("@octokit/auth-app")).createAppAuth);let h=async()=>await Promise.resolve(new _B("axios","moment","faker","assert","pg","Octokit","createAppAuth","OTPAuth","child_process","extractCookiesFromResponse","env","setVariable","setPersistentVariable","sendSms","waitForLatestSms","email","sms","ai","mock",...Object.keys(i??{}),n)(vB,RB,c.fakerInstance??EB,TB,CB,m,g,wB,AB,aw,o,e.options.disallowVariableUpdates?void 0:u,e.options.disallowVariableUpdates?void 0:p,x=>c.sms.send(x),x=>c.sms.fetchLatest(x),c.email,c.sms,c.ai,xB(a,s),...Object.values(i??{}))),f=!0,b,T;try{let C=await z(h(),{milliseconds:e.options.timeoutMs,message:`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`,signal:e.signal});b=await MB(e.options.responseSerialization??"RAW",C)}catch(C){t.error({err:C,env:o,evalCode:n},`[${r}] Error executing code: ${C}`),f=!1,C instanceof Gn?T=`Timeout of ${e.options.timeoutMs}ms exceeded for code execution`:T=C instanceof Error?C.message:`${C}`}return{result:b,variableUpdates:l,persistentVariableUpdates:d,success:f,error:T}}async function lw({code:r,fragment:e,context:t,localTools:n,logger:o,signal:i,timeoutMs:a=Fn,disallowVariableUpdates:s,additionalBindings:c,responseSerialization:l,mock:u}){let d=IB(),p=await sw(d,{code:r,options:{fragment:e,timeoutMs:a,disallowVariableUpdates:s,responseSerialization:l},bindings:{...t.toObjectCopy(),...u,additionalBindings:c},tools:n,signal:i},o);return R.debug(`[${d}] Got execution result: ${JSON.stringify(p)}`),p}import{createHmac as PB,randomUUID as OB}from"crypto";import LB from"fetch-retry";var NB=LB(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}}),cw=process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT,uw=process.env.MOMENTIC_LAMBDA_AUTH_SECRET;async function dw({orgId:r,code:e,fragment:t,context:n,timeoutMs:o=Fn,retries:i=2,signal:a,logger:s,additionalBindings:c,disallowVariableUpdates:l,responseSerialization:u,mock:d}){if(!cw)throw new Error("GCP_JS_EVAL_FUNCTION_ENDPOINT environment variable not set");let p,m,g=0;if(!uw)throw new Error("Missing lambda auth secret.");let h=PB("sha256",uw).update(r).digest("hex");for(;g<=i;){g++,a?.throwIfAborted();let b={id:OB(),orgId:r,momenticLambdaAuthHash:h,code:e,fragment:t,state:{...n.toObjectCopy(),...d,additionalBindings:c},timeoutMs:o,disallowVariableUpdates:l,responseSerialization:u};try{if(p=await z(NB(cw,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)}),{milliseconds:o,message:`Timeout of ${o}ms exceeded for code execution`,signal:a}),!p)throw new Error("Got empty response from code evaluation server");if(!p.ok)throw new Error(`Code evaluation server returned error code ${p.status}`);m=void 0;break}catch(T){m=T}}if(m)throw s.error({err:m},"Failed to evaluate code remotely"),m;if(!p)throw new Error(`An unexpected code evaluation error occurred${m?`: ${m}`:""}`);let f;try{f=Qb.parse(await p.json())}catch(b){throw new Error(`Code evaluation server returned invalid response: ${b}`)}if(f.error)throw new Error(`Code evaluation error: ${f.error}`);return f}async function Jr(r){let e;if(process.env.GCP_JS_EVAL_FUNCTION_ENDPOINT)e=await dw(r);else if(r.localTools)e=await lw({...r,localTools:r.localTools});else throw new Error("No code evaluation environment available");if(e.error){let t=`Failed to evaluate code:
46
46
  ${e.error}
47
47
  Code received:
48
- ${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 ez}from"lodash-es";async function Ks(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Fn,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),g;try{g=await Zr({orgId:e,code:m,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 E("UserConfigurationError",`Template fragment '${m}' 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(p[0],h)}return d}async function Ou(r){return aC(r)}async function aC({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 Ks({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 aC({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function Lu(r,e){for(let{path:t,original:n}of e)ez(r,t,n)}import tz from"fetch-retry";var UTe=process.env.MAILINATOR_API_KEY,FTe=tz(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import IG from"fetch-cookie";import PG from"path";import{CookieJar as OG}from"tough-cookie";var Qg={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
48
+ ${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 DB}from"lodash-es";async function js(r){let{orgId:e,s:t,context:n,logger:o,signal:i,retries:a=2,timeoutMs:s=Fn,allowUndefined:c=!1}=r,l=/{{(.*?)}}/g,u=t.matchAll(l),d=t;for(let p of u){if(p.length<2)continue;let m=p[1].trim(),g;try{g=await Jr({orgId:e,code:m,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 E("UserConfigurationError",`Template fragment '${m}' 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(p[0],h)}return d}async function Au(r){return pw(r)}async function pw({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 js({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 pw({obj:l,bannedKeys:e,context:n,prefixPath:u,replacements:i,allowList:c?void 0:t,...a})}return i}function Ru(r,e){for(let{path:t,original:n}of e)DB(r,t,n)}import kB from"fetch-retry";var vhe=process.env.MAILINATOR_API_KEY,Ahe=kB(global.fetch,{retryOn:function(r,e,t){return r>3?!1:!!(e!==null||t&&t.status>=400)},retryDelay:function(r){return 500}});import IG from"fetch-cookie";import PG from"path";function yt(r,e,t=!1){return r.length<e?r:r.slice(0,e-3)+(t?"...TRUNCATED...":"[...]")}var yn={EQUALS:"equals",CONTAINS:"contains",STARTS_WITH:"starts with",EXISTS:"exists"},bn={EQUALS:"does not equal",CONTAINS:"does not contain",STARTS_WITH:"does not start with",EXISTS:"does not exist"},Bg={EXISTS:"exists",VISIBLE:"is visible",ENABLED:"is enabled",EDITABLE:"is editable",FOCUSED:"is focused"},zg={EXISTS:"does not exist",VISIBLE:"is not visible",ENABLED:"is disabled",EDITABLE:"is not editable",FOCUSED:"is not focused"};function gw(r){switch(r.type){case"ELEMENT_CONTENT":return`content ${r.negated?bn[r.operation]:yn[r.operation]} '${r.value}'`;case"ELEMENT_ATTRIBUTE":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`attribute '${r.attr}' ${t}`:`attribute '${r.attr}' ${t} '${r.value}'`}case"ELEMENT_NAME":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`tag name ${t}`:`tag name ${t} '${r.value}'`}case"ELEMENT_STYLE":{let t=r.negated?bn[r.operation]:yn[r.operation];return r.operation==="EXISTS"?`style property '${r.property}' ${t}`:`style property '${r.property}' ${t} '${r.value}'`}case"ELEMENT_EXISTENCE":return r.negated?zg[r.condition]:Bg[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 Bhe={CONTENT:"The page"};function hw(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 Hg(r){return`${r.negated?bn.CONTAINS:yn.CONTAINS} '${r.value}'`}function fw(r){switch(r.type){case"CONTENT":return Hg(r);default:return r.type,""}}function UB(r){return typeof r=="object"&&r!==null}function Fo(r){if(Array.isArray(r))return r.map(Fo);if(UB(r)){let e={};return Object.entries(r).forEach(([t,n])=>{n!==void 0&&(e[t]=Fo(n))}),e}return r}function Qr(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 wu(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&(r.condition==="EXISTS"||r.condition==="VISIBLE")}function Sr(r){return r.type==="ELEMENT_EXISTENCE"?r.negated?Bg[r.condition]:zg[r.condition]:r.negated?yn[r.operation]:bn[r.operation]}import{diff as FB}from"deep-object-diff";import{cloneDeep as cfe}from"lodash-es";function Cu(r,e){return!r&&!e?!1:!r||!e?!0:Object.keys(FB(r,e)).length>0}function Gg({steps:r,topLevel:e=!0,...t}){let{stepCacheEntries:n,logger:o,keyPrefix:i}=t,a=[],s=[],c=[],l=0,u=(p,m)=>{try{let g=Un.parse(m.value);if(g.type!==p.type){o.warn({parsedCacheEntry:g,command:p},"Not using step cache due to type mismatch"),s.push(m.key);return}p.cache=g.cache,a.push(m.key),c.push(m.uniqueKey)}catch(g){s.push(m.key),o.error({err:g,cacheEntry:m},"Not using step cache due to parsing error")}},d=(p,m)=>{let g=zB(p.id,m),h=g.find(f=>!!n[f]);if(h)u(p,n[h]);else{if(p.type==="AI_CHECK")return;s.push(g[0])}};for(let p of r)switch(p.type){case"MOBILE_PRESET_STEP":{if(!ec(p.command)||p.command.type==="TYPE"&&!p.command.target||"cache"in p.command&&p.command.cache)continue;l++,d(p.command,i);break}case"RESOLVED_MOBILE_MODULE":{l+=p.steps.length;let{cacheKeysHit:m,cacheKeysMissed:g,uniqueKeysHit:h}=Gg({...t,steps:p.steps,keyPrefix:i?`${i}:${p.id}`:p.id,topLevel:!1});a.push(...m),s.push(...g),c.push(...h);break}case"MOBILE_AI_ACTION_STEP":{l++;break}default:{let m=p}}return e&&l&&s.length>0&&o.warn({totalSteps:l,cacheKeysMissed:s,cacheKeysHit:a,uniqueKeysHit:c,cacheEntriesKeys:Object.values(n).map(p=>p.uniqueKey)},"Step cache did not fully resolve"),{cacheKeysHit:a,cacheKeysMissed:s,uniqueKeysHit:c}}function BB(r,e){return e?`${e}:${r}`:r}function zB(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 Vg(r){let{moduleStepParents:e=[],moduleIdParents:t=[]}=r;if(e.length!==t.length)throw new Error(`Invalid cache entry parent length: ${JSON.stringify(e)}
49
+ ${JSON.stringify(t)}`);let n=[];return n.push({key:BB(r.id,e.join(":")),organizationId:r.orgId,value:r.value,testId:r.testId}),n}function xu({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"&&sp(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 $s(r,e,t){let n=r.cache&&"memory"in r.cache?r.cache.memory?.traces:void 0;Cu(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 Wg(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 yw(r,e){return r?Cu(r.target.memory,e.target.memory)?{target:{...r.target,memory:e.target.memory},updatedAt:e.updatedAt}:r:{target:Wg(e.target),updatedAt:e.updatedAt}}function HB(r){switch(r.type){case"AI_CHECK":return`AI check: ${r.assertion}`;case"TAP":return`Tap on element: ${Ei(r.target)}`;case"TYPE":return`Type ${r.text} ${r.target?`into ${Ei(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 ${Ei(r.fromTarget)} to ${Ei(r.toTarget)}`;case"SCREEN_CHECK":return`Check that the screen ${fw(r.assertion)}`;case"ELEMENT_CHECK":return`Check that the element ${Ei(r.target)} ${gw(r.assertion)}`;case"OPEN_APP":return`Open app: ${r.packageName}`;case"OPEN_NOTIFICATION_DRAWER":return"Open notification drawer";case"ROTATE_ORIENTATION":return`Rotate orientation to ${r.orientation}`;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 jg(r){switch(r.type){case"MOBILE_PRESET_STEP":return HB(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 $g from"semver";function Mu(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(!$g.valid(t.toVersion)||!$g.valid(t.fromVersion))throw new Error(`Migration '${t.name}' has invalid version`);if(!$g.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 GB from"diff-lines";import VB,{gte as WB}from"semver";function jB(r){return r.every(e=>e&&typeof e=="object"&&!Array.isArray(e))}async function qg({metadata:r,steps:e,logger:t,toVersion:n,migrations:o}){let i=e,{schemaVersion:a,id:s}=r,c=o.findIndex(d=>VB.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&&WB(l,n)){t.debug("Stopping migration early because toVersion was reached");break}let p=o[d],m={id:s,migration:p.name,toVersion:p.toVersion};try{i=await bw(i,p),l=p.toVersion}catch(g){throw t.error({err:g,...m},"Migration failed"),new Error(`Step migration ${p.name} failed: ${g}`)}}let u=GB(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 bw(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)||jB(i)&&(n[o]=await bw(i,e))}return t}var Ew={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 Tw=[Ew];Mu(So,Tw);async function Kg({metadata:r,steps:e,logger:t,toVersion:n}){return await qg({metadata:r,steps:e,logger:t,toVersion:n,migrations:Tw})}var vw={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 Aw={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 $B=["target","fromTarget","toTarget"];function Rw(r){for(let e of $B){if(r[e]===void 0)continue;let t=r[e];t.elementDescriptor!==void 0?t.type="description":r[e]={type:"description",elementDescriptor:""}}}var ww={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 Rw(e.command),e;case"AI_ACTION":{let t=e.commands;for(let n of t??[])Rw(n);return e}default:return e}})};import{v4 as qB}from"uuid";var Cw={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=qB()),e;default:return e}})};import{v4 as xw}from"uuid";var Mw={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??xw(),e}case"AI_ACTION":return e.commands&&(e.steps=e.commands.map(t=>({type:"PRESET_ACTION",command:{...t,id:t.id??xw()}})),delete e.commands),e;default:return e}})};var _w={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 KB}from"uuid";var Iw={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=KB()),e))};import{v4 as Pw}from"uuid";var Ow={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=Pw())}return e.id=Pw(),e})};var Lw={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 YB}from"uuid";var Nw={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=YB()),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 Dw={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 kw={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&&Uw(t),e})};function Uw(r){r&&Object.keys(r).forEach(e=>{if(typeof r[e]=="object"&&r[e]){Uw(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 Fw={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 Bw={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 zw={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 Hw={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 Gw={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 Vw={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 Ww={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 _u=new Set(["CLICK","TYPE","SELECT_OPTION"]),jw={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||_u.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||_u.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||_u.has(l))&&(s.target={elementDescriptor:c??""}),a.commands&&Array.isArray(a.commands)&&a.commands.forEach(d=>{let p=d?.elementDescriptor,m=d?.type;(p!==void 0||_u.has(m))&&(d.target={elementDescriptor:p??""})})}),e}),stopOnFailure:!0};var $w={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 qw={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 XB=[Ww,$w,qw,jw,vw,Aw,ww,Cw,Mw,_w,Iw,Ow,Lw,Nw,Dw,kw,Fw,Bw,zw,Hw,Gw,Vw];Mu(Nn,XB);async function Yw(r){let e={},{resolvedSteps:t,newSchemaVersion:n}=await Iu({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 Iu({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 QB(r,e,t){let{newVersion:n,steps:o}=await Kg({metadata:r,steps:e,logger:t});try{return{steps:Wt.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 Iu({rawSteps:r,onFetchModule:e,logger:t,metadata:n,resolvedModuleCache:o={}}){let{newVersion:i,steps:a}=await QB(n,r,t),s=[];for(let c of a)s.push(await Xw({rawStep:Wt.parse(c),onFetchModule:e,logger:t,resolvedModuleCache:o}));return{resolvedSteps:s,newSchemaVersion:i}}async function Xw({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=Wt.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=>Xw({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 Jw}from"deep-object-diff";import{cloneDeep as Qw}from"lodash-es";import{v4 as Yg}from"uuid";async function Zr(r){let e=new Map,t=new Set,n=Qw(r.steps),o=await eC({...r,steps:n,moduleStepParents:[],moduleIdParents:[],moduleIdReplacements:e,seenModules:t});return{stepsToSave:o.stepsToSave,cachesToSave:o.cachesToSave,moduleUpdates:o.moduleUpdates}}function ZB({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=_n.safeParse(i),s=_n.safeParse(o);if(a.success&&s.success&&a.data.memory){let p=s.data.memory,m=a.data.memory;Cu(p,m)&&(n.value.cache={...s.data,memory:m,updatedAt:a.data.updatedAt},t.push(n));continue}let c=kn.safeParse(i),l=kn.safeParse(o);if(c.success&&l.success){let p=qs({originalCache:l.data,newCache:c.data,targetGetter:m=>m.target});p.changed&&(n.value.cache=p.result,t.push(n));continue}let u=Zl.safeParse(i),d=Zl.safeParse(o);if(u.success&&d.success){let p=qs({originalCache:d.data,newCache:u.data,targetGetter:g=>g.fromTarget}),m=qs({originalCache:{...d.data,fromTarget:p.result.fromTarget},newCache:u.data,targetGetter:g=>g.toTarget});(p.changed||m.changed)&&(n.value.cache=m.result,t.push(n));continue}}return t}async function Zw({logger:r,cacheStorage:e,orgId:t,testId:n,originalStepsWithCaches:o,updatedStepsWithCaches:i}){let{cachesToSave:a}=await Zr({steps:o,cacheCreationParams:{testId:n,orgId:t}}),s={};for(let u of a)s[u.key]=u.value;let{cachesToSave:c}=await Zr({steps:i,cacheCreationParams:{testId:n,orgId:t}}),l=ZB({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 eC({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?Yg():u.id,u.type){case"MOBILE_PRESET_STEP":{let d=u.command;d.id=c?Yg():d.id,"cache"in d&&d.cache&&(n&&(l.cachesToSave=l.cachesToSave.concat(Vg({id:d.id,orgId:n.orgId,testId:n.testId,value:Un.parse(d),moduleIdParents:o,moduleStepParents:i}))),delete d.cache),l.stepsToSave.push({...u,command:d});break}case"RESOLVED_MOBILE_MODULE":{let d=c?Yg():u.id,p=u.moduleId;a.has(p)?p=a.get(p):s!==void 0&&(p=await s(u),a.set(u.moduleId,p));let{cachesToSave:m,stepsToSave:g,moduleUpdates:h}=await eC({...e,steps:u.steps,cacheCreationParams:n?{...n}:void 0,createNewCacheIds:!1,moduleStepParents:[...i,d],moduleIdParents:[...o,p],skipCacheIntermediateEntries:c});l.moduleUpdates=l.moduleUpdates.concat(h),l.cachesToSave=l.cachesToSave.concat(m),t.has(p)||(t.add(p),l.moduleUpdates.push({...Ob.parse(u),steps:Wt.array().parse(g),moduleId:p}));let f=os.parse({...u,type:"MOBILE_MODULE_STEP",moduleId:p,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 qs({originalCache:r,newCache:e,targetGetter:t}){let n=t(r),o=t(e),i=Qw(r),a=t(i),s=!1;if(o.memory){let c=n.memory,l=Object.keys(Jw(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(Jw(l??{},c??{}));Object.keys(u).length>0&&(a.browserCache.memory=c,i.updatedAt=new Date,s=!0)}}return{result:i,changed:s}}function ez(r){let e={parentChain:[]};return tC(r,e),e}function tC(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),tC({...r,steps:i.steps},e)&&o))return!0;e.parentChain.pop();continue}if(t(i,e)&&o)return!0}return!1}function tz(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 ez({steps:r,earlyStop:!0,onPreset:i,onModule:i}),{result:n,parentChain:o}}function rC({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!!tz([r],t,i).result}function nC(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 oC({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 mbe}from"lodash-es";import hbe from"truncate-json";import{v4 as Rbe}from"uuid";import{cloneDeep as nbe,unset as obe}from"lodash-es";import{cloneDeep as _be}from"lodash-es";import{diff as gEe}from"deep-object-diff";import{diff as qbe}from"deep-object-diff";import{cloneDeep as Ybe}from"lodash-es";import{v4 as uEe}from"uuid";import{cloneDeep as EEe}from"lodash-es";import{z as NEe}from"zod";import{cloneDeep as FEe}from"lodash-es";import{stringify as XEe}from"yaml";async function Jg({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 Ks({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 Jg({promiseGenerator:r,signal:a.signal,codePath:t,logger:n})}finally{i=!0,o?.removeEventListener("abort",s),clearTimeout(c)}}function Pu(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 rz from"picomatch";var Ou=(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||rz(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},Lu=(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}},Yi=r=>{try{return new URL(r),!0}catch{return!1}},iC=r=>!r.toLowerCase().startsWith("http"),Xi=(r,e)=>{try{return new URL(r,e),!0}catch{return!1}};function Bo(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 aC}from"uuid";function Qg(r,e){return{...r,testId:e?.testId??"",testName:e?.testName??"",suiteId:e?.suiteId??"",suiteName:e?.suiteName??""}}var Nu=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:Qg({},this.metadata)}]).catch(s=>e.error({err:s},"Failed to report billable event"))]}trackStepExecution(e){if(Lb(e.type)){this.creditsUsedV2+=1;return}let t=am(e.type);if(this.creditsUsedV1+=t??0,e.type==="PRESET_ACTION"){this.creditsUsedV2+=1;let n=sm(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:aC(),properties:Qg({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:aC(),properties:Qg({creditsUsed:this.creditsUsedV2},this.metadata)}]).catch(t=>e.error({err:t},"Failed to report credits used"))),await Promise.allSettled(this.asyncWork)}};import{cloneDeep as PTe}from"lodash-es";import{CookieJar as OG}from"tough-cookie";var Zg={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
49
50
  var momenticConstants = {
50
51
  bannedClassSubstrings: [
51
52
  "relative",
@@ -4323,13 +4324,12 @@ function registerAllMomenticListeners() {
4323
4324
 
4324
4325
  // src/html/index.ts
4325
4326
  registerAllMomenticListeners();
4326
- `};var yr={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 sC="BoundingBoxMovedError",lC="ZeroOpacityError",Nu="visual_actions",En="data-momentic-id";function cC(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(`
4327
+ `};var yr={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 sC="BoundingBoxMovedError",lC="ZeroOpacityError",Du="visual_actions",En="data-momentic-id";function cC(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(`
4327
4328
  `,o);a>0&&a<n&&(o=a);let s=i,c=0;for(;c<1e3&&s>n&&r[s]!==`
4328
4329
  `;)c++,s--;return s>n&&r[s]===`
4329
- `&&(i=s),r.slice(o,i)}function _r(r){let e=typeof r=="string"?r:r.toString();return`[${En}="${e}"]`}import{execSync as J1}from"child_process";import{randomUUID as qu}from"crypto";import{diff as kh}from"deep-object-diff";import{existsSync as Ku,readFileSync as Q1,readdirSync as Z1,statSync as Mx,writeFileSync as eH}from"fs";import{Jimp as _x}from"jimp";import tH from"js-beautify";import{cloneDeep as Qs}from"lodash-es";import rH from"mime";import{platform as nH}from"os";import{basename as Ix,extname as oH,join as iH}from"path";import{v4 as aH}from"uuid";import{rmSync as KC}from"fs";import{basename as Qz,join as Zz}from"path";import{errors as e1}from"playwright-core";import{devices as nz}from"playwright-core";var uC=2,Ji=8e3;var zo=250,pt=500;var dC=5e3,pC=250,oe=3e3,Re=2e3,ae=1e3,Zg=3e4,Du=8e3,mC=10,eh=.05;var gC=new Set(["about:blank","chrome-error://chromewebdata/"]);var th=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],rh=1e4,Ys=500,ku=nz["Desktop Chrome"].userAgent,hC=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as oz,rmSync as fC,statSync as iz}from"fs";import*as ah from"node:fs";import az from"nodejs-file-downloader";import{tmpdir as sz}from"os";import Yn,{basename as lz,dirname as cz}from"path";var sh="file://",ih=Yn.join(sz(),"momentic","downloads"),oh=1e4,uz=50*1024*1024;async function SC(r){let{uri:e}=r;if(e.startsWith(sh))return pz(r);if(e.startsWith("http"))return gz(r);if(uE)return mz(r);throw new E("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function dz(r,e){let t=Yn.join(ih,r,e.slice(sh.length)),n=Yn.join(ih,r),o=t.startsWith(n);if(!ah.existsSync(t)||!o)throw new E("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function pz({uri:r,orgId:e}){let t=dz(e,r);return{filePath:t,cleanup:()=>{fC(cz(t),{recursive:!0,force:!0})}}}async function mz({uri:r}){let e=Yn.resolve(r);if(!ah.existsSync(e))throw new E("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 gz({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=lz(n.href),i=ch(o),a=Yn.extname(i);if(iE.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=lh(t),c,l;for(let g=1;g<=3;g++){let h=new az({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:oh});try{let{downloadStatus:f,filePath:b}=await z(h.download(),{milliseconds:oh,message:`Download timed out after ${oh}ms`});if(f!=="COMPLETE"||!b)throw new Error(`Download ended in non-success status: ${f}`);c=b;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,p=iz(u).size;if(p>uz)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:p,filePath:u,fileName:i},"Downloaded file to disk");let m;return{filePath:u,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>fC(s,{recursive:!0,force:!0}),10*60*1e3)}}}function yC(r,e){return`${sh}${r}/${e}`}function lh(r){let e=Math.random().toString(36).substring(4),t=Yn.join(ih,r,e);return oz(t,{recursive:!0}),t}function ch(r){let e=Yn.extname(r),t=Yn.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function Ir(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:ae})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}var Xn=3.1783027;function hz(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 Pr(r){return Math.ceil(uh(r)/Xn)}function uh(r){let e=0;if(typeof r=="string"){let t=r;t=t.replaceAll(`
4330
- `,""),t=t.replaceAll(" ","");let n=hz(t);return t.length-n+Xn*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+=uh(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*Xn:e+=85*Xn:n==="source"&&typeof t[n]=="object"&&t[n]?.type==="base64"?e+=1600*Xn:e+=uh(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 Uu=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 bC(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:oe});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function EC(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:oe})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function TC(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:oe})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function vC(r,e,t,n,o){try{await fz(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function fz(r,e,t,n){let o=n.text();o.length>Ys&&(o=o.slice(0,Ys)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Ys?i.push(c.slice(0,Ys)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}dh(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function dh(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>rh&&(i[t]=i[t].slice(Math.floor(rh/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 br({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await Xg({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import Sz from"truncate-json";var yz="[redacted due to size]",bz=5e3,Ez=1e6,RC=1e3;function wC(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 ph(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await xC(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:MC(t).timings}}async function CC(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 xz({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await xC(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}=MC(l);r.time=d,r.timings=u}function AC(r){try{return new Date(r).toISOString()}catch{return}}function Tz(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=en(i,!1),e.value=en(a,!1);continue}i==="Domain"&&(e.domain=en(a,!1)),i==="Expires"&&(e.expires=AC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=AC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=en(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function xC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(Tz)??[];return{headers:Object.entries(e).map(([n,o])=>({name:en(n,!1),value:en(o,!1)})),cookies:t}}async function Fu(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>RC){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:en(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:en(c,n),value:l?en(l,n):void 0})}e.request.postData=a}var vz=["image","font","video","audio"],Az=["javascript"],Rz=["text"],wz=["json","xml","html"];function Cz(r){let[e,t]=r.split("/");return e&&vz.includes(e)||t&&Az.some(n=>t.includes(n))?!1:!!(e&&Rz.includes(e)||t&&wz.some(n=>t.includes(n)))}async function xz({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!Cz(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=RC?o._redactedReason="Response body redacted due to size":o.text=en(await r.text(),n),o}function en(r,e){let t=e?Ez:bz;try{let n=JSON.parse(r),{jsonString:o}=Sz(r,t);return o}catch{return r.length>t?r.slice(0,t)+yz:r}}function Ho(r){return r<0?0:r}function MC(r){return{timings:{blocked:Ho(r.domainLookupStart),dns:Ho(r.domainLookupEnd-r.domainLookupStart),connect:Ho(r.connectEnd-r.connectStart),send:Ho(r.responseStart-r.requestStart),wait:0,receive:Ho(r.responseEnd-r.responseStart),ssl:Ho(r.connectEnd-r.secureConnectionStart)},total:Ho(r.responseEnd)}}function _C(){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 Mz}from"playwright-core";async function Go({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 Mz.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await _z(c,i.locator,n,t);else throw c}throw s instanceof E?s:new E("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function _z(r,e,t,n){return r.message.includes("attempt #")?Iz(r,e,t,n):Pz(r)}async function Iz(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(`
4331
- `,";").replace(/\s+/g," ");let a="",s=await Ir(e,n,150);if(s&&(a=`Target element HTML: ${yt(s,100,!0)}`),i.includes("element is not enabled"))return new E("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(_r(l)),d=await Ir(u,n,150);d&&(c=`Covering element HTML: ${yt(d,100,!0)}`)}return new E("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}
4332
- ${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:oe});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 E("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 E("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 Pz(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 E("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 Fz}from"child_process";import NC from"dedent";import{existsSync as Js,mkdirSync as yh,readdirSync as Bz,rmSync as DC}from"fs";import{homedir as UC}from"os";import{basename as zz,join as Qn,resolve as Hz}from"path";import{chromium as kC}from"playwright-core";function IC(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 Lz}from"crypto";function PC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function OC(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await Fu(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 p=await Oz(t,u,d),m={};p.headers.forEach((h,f)=>{m[f]=h});let g={body:await p.text(),contentType:p.headers.get("content-type")||"text/plain",headers:m,status:p.status};await e.fulfill(g);try{n.response={status:g.status,statusText:p.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 Oz(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 mh(r){try{await Nz(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function Nz(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=Lz(),u=!1,d=await ph(e,n);try{o?.(l,d);for(let m of Object.values(a))m.matches(d)&&(u=!0,m.onRequestStart(l,d))}catch(m){c()||i.warn({err:m},"Failed to add request to HAR")}let p=PC(n,s);p?await OC({logger:i,route:t,mock:p,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await Dz({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function Dz({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 Fu(e,i,u,s),!l||!i)return;await CC(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 kz(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 Uz(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 Bu(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 gh(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Uz(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await kz(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Jn=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:Cu(t,this.requestMatcher.urlMatcher)}};function Xs(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 hh,platform as fh}from"os";import{join as Sh}from"path";function zu(){let r=[];if(fh()==="linux"){let e=hh();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Sh(e,".config",t,"Crash Reports"))})}else if(fh()==="darwin"){let e=hh();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Sh(e,"Library","Application Support",t,"Crashpad"))})}else if(fh()==="win32"){let e=hh();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Sh(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function LC(){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 bh=Qn(UC(),"momentic","chromium"),Gz=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],Vz=["--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"],Wz=["--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 FC({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=[...Vz];!Wr&&$z()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},p={...i??{},geolocation:i?.geolocation||Hl,locale:i?.locale||Ny,timezoneId:i?.timezoneId||Dy,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??ku,viewport:i?.viewport??Dn,serviceWorkers:"block",storageState:{cookies:[...LC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(p.storageState.origins=Object.entries(o.initialLocalStorage).map(([T,C])=>({origin:T,localStorage:Object.entries(C).map(([x,w])=>({name:x,value:w}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let m=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 T=zu();T.forEach(C=>{if(!Js(C))return;["new","pending","completed"].forEach(w=>{let O=Qn(C,w);if(!Js(O))return;let v=Bz(O);for(let M=0;M<v.length;M++){let k=Qn(O,v[M]);DC(k,{force:!0})}})}),T.forEach(C=>{Js(C)||yh(C,{recursive:!0});let x=Qn(C,`write-test-${Date.now()}`);yh(x,{recursive:!0}),DC(x,{recursive:!0,force:!0})}),u.push(...Gz)}catch(T){e.warn({err:T},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...Wz);let b=o.localChromeExtensionPaths?.map(T=>T.startsWith("~")?Qn(UC(),T.slice(1)):T);if(b?.length){if(l===void 0)throw new E("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let w of b){let O=Qn(w,"manifest.json");if(!Js(O))throw new E("UserConfigurationError",`Chrome extension path ${O} does not exist.`)}if(Wr)throw new E("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let T=Qn(bh,`momentic-session-${Date.now()}`);if(!Js(T))try{yh(T,{recursive:!0})}catch(w){throw new E("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${bh} folder: ${w}`)}let C=[...u],x=b.map(w=>Hz(w)).join(",");C.push(`--disable-extensions-except=${x}`),p?.deviceScaleFactor&&C.push(`--force-device-scale-factor=${p.deviceScaleFactor}`,`--device-scale-factor=${p.deviceScaleFactor}`),p.viewport&&C.push(`--window-size=${p.viewport.width},${p.viewport.height}`),g=await kC.launchPersistentContext(Qn(bh,`momentic-session-${Date.now()}`),{...d,...p,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:C,baseURL:r}),e.info({sharedContextOptions:p,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:C,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),h=g.pages()[0]}else{m=await kC.launch({...d,args:u});let T={...p,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};g=await m.newContext(T),e.info({contextArgs:T,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await g.newPage()}if(c){let T=await h.video()?.path();if(T){let C=zz(T);c.onVideoPageChange({videoName:C})}}Wr&&await g.route("**",Xs);try{let T=m?.version();e.info({browserVersion:T},"Got browser version")}catch(T){e.warn({err:T},"Could not get browser version string")}return{browser:m,context:g,page:h,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||Dn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function jz(){if(process.platform!=="linux")return null;try{let e=Fz("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 $z(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=jz();return t==null?!1:t<128}function Eh(r,e=!1){let t=NC`window._MOMENTIC_BROWSER = true;
4330
+ `&&(i=s),r.slice(o,i)}function Ir(r){let e=typeof r=="string"?r:r.toString();return`[${En}="${e}"]`}import{execSync as J1}from"child_process";import{randomUUID as qu}from"crypto";import{diff as kh}from"deep-object-diff";import{existsSync as Ku,readFileSync as Q1,readdirSync as Z1,statSync as Mx,writeFileSync as eH}from"fs";import{Jimp as _x}from"jimp";import tH from"js-beautify";import{cloneDeep as Qs}from"lodash-es";import rH from"mime";import{platform as nH}from"os";import{basename as Ix,extname as oH,join as iH}from"path";import{v4 as aH}from"uuid";import{rmSync as KC}from"fs";import{basename as Qz,join as Zz}from"path";import{errors as e1}from"playwright-core";import{devices as oz}from"playwright-core";var uC=2,Ji=8e3;var zo=250,pt=500;var dC=5e3,pC=250,oe=3e3,Re=2e3,ae=1e3,eh=3e4,ku=8e3,mC=10,th=.05;var gC=new Set(["about:blank","chrome-error://chromewebdata/"]);var rh=["button","image","generic","graphics-symbol","tab","link","menuitem","group"],nh=1e4,Ys=500,Uu=oz["Desktop Chrome"].userAgent,hC=process.env.TWO_CAPTCHA_KEY;import{mkdirSync as iz,rmSync as fC,statSync as az}from"fs";import*as sh from"node:fs";import sz from"nodejs-file-downloader";import{tmpdir as lz}from"os";import Xn,{basename as cz,dirname as uz}from"path";var lh="file://",ah=Xn.join(lz(),"momentic","downloads"),ih=1e4,dz=50*1024*1024;async function SC(r){let{uri:e}=r;if(e.startsWith(lh))return mz(r);if(e.startsWith("http"))return hz(r);if(uE)return gz(r);throw new E("UserConfigurationError","The source URI for the file upload step must be a valid URL or a previously downloaded file beginning with 'file://'")}function pz(r,e){let t=Xn.join(ah,r,e.slice(lh.length)),n=Xn.join(ah,r),o=t.startsWith(n);if(!sh.existsSync(t)||!o)throw new E("UserConfigurationError",`The referenced file (${e}) does not exist. Please make sure that it has been downloaded successfully.`);return t}async function mz({uri:r,orgId:e}){let t=pz(e,r);return{filePath:t,cleanup:()=>{fC(uz(t),{recursive:!0,force:!0})}}}async function gz({uri:r}){let e=Xn.resolve(r);if(!sh.existsSync(e))throw new E("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 hz({uri:r,logger:e,orgId:t}){let n=new URL(r);n.search&&(n.search="");let o=cz(n.href),i=uh(o),a=Xn.extname(i);if(iE.includes(a))throw new Error(`Downloading files with extension ${a} is not allowed.`);let s=ch(t),c,l;for(let g=1;g<=3;g++){let h=new sz({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:ih});try{let{downloadStatus:f,filePath:b}=await z(h.download(),{milliseconds:ih,message:`Download timed out after ${ih}ms`});if(f!=="COMPLETE"||!b)throw new Error(`Download ended in non-success status: ${f}`);c=b;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,p=az(u).size;if(p>dz)throw new Error("File size exceeds the maximum limit of 50MB");e.info({fileSizeInBytes:p,filePath:u,fileName:i},"Downloaded file to disk");let m;return{filePath:u,cleanup:()=>{clearTimeout(m),m=setTimeout(()=>fC(s,{recursive:!0,force:!0}),10*60*1e3)}}}function yC(r,e){return`${lh}${r}/${e}`}function ch(r){let e=Math.random().toString(36).substring(4),t=Xn.join(ah,r,e);return iz(t,{recursive:!0}),t}function uh(r){let e=Xn.extname(r),t=Xn.basename(r,e);return r=(t.length>100?t.slice(t.length-100):t)+e,r=r.trim().replaceAll(" ","_"),r}async function Pr(r,e,t){try{return await r.evaluate((o,{truncateToLength:i})=>window.serializeElementOnlyWithText?.(o,{truncateToLength:i}),{truncateToLength:t},{timeout:ae})}catch(n){e.debug({err:n},"Failed to get HTML from locator for Playwright error translation");return}}async function bC(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:oe});return o&&e.warn({err:o},"Failed to fetch indexedDB data"),n}async function EC(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:oe})}catch(n){t.warn({err:n},"Failed to import indexedDB data")}}}async function TC(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:oe})}catch(t){e.debug({err:t},"Failed clearing index db data, continuing...")}}async function vC(r,e,t,n,o){try{await fz(r,e,t,n)}catch(i){o.error({err:i,tabIndex:e},"Error handling new console log")}}async function fz(r,e,t,n){let o=n.text();o.length>Ys&&(o=o.slice(0,Ys)+"...(TRUNCATED)");let i=[];for(let a of n.args())try{let s=await a.jsonValue(),c=JSON.stringify(s);c.length>Ys?i.push(c.slice(0,Ys)+"...(TRUNCATED)"):(typeof s!="object"||Object.keys(s).length>0)&&i.push(s)}catch{}dh(r,t,e,{url:r.url(),location:n.location(),type:n.type(),text:n.text(),args:i})}function dh(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>nh&&(i[t]=i[t].slice(Math.floor(nh/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 br({fn:r,codePath:e,logObject:t,signal:n,logger:o}){n?.throwIfAborted();let i=Date.now(),a=await Jg({promiseGenerator:r,signal:n,codePath:e,logger:o}),s=Date.now();return t[e]=s-i,a}import Sz from"truncate-json";var yz="[redacted due to size]",bz=5e3,Ez=1e6,RC=1e3;function wC(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 ph(r,e){let t=e.timing(),n=new URL(e.url()),o=[...n.searchParams.entries()].map(([s,c])=>({name:s,value:c})),i={...await xC(e),url:n.toString(),method:e.method(),queryString:o};return{pageref:r,_resourceType:e.resourceType(),startedDateTime:new Date().toISOString(),request:i,timings:MC(t).timings}}async function CC(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 xz({response:t,mimeType:s,sizes:n,neverRedact:o})}catch{}let c={...await xC(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}=MC(l);r.time=d,r.timings=u}function AC(r){try{return new Date(r).toISOString()}catch{return}}function Tz(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=en(i,!1),e.value=en(a,!1);continue}i==="Domain"&&(e.domain=en(a,!1)),i==="Expires"&&(e.expires=AC(a)),i==="HttpOnly"&&(e.httpOnly=!0),i==="Max-Age"&&(e.expires=AC(Date.now()+ +a*1e3)),i==="Path"&&(e.path=en(a,!1)),i==="Secure"&&(e.secure=!0)}return e}async function xC(r){let e=await r.allHeaders(),t=e.cookie?.split(";").map(Tz)??[];return{headers:Object.entries(e).map(([n,o])=>({name:en(n,!1),value:en(o,!1)})),cookies:t}}async function Fu(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>RC){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:en(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:en(c,n),value:l?en(l,n):void 0})}e.request.postData=a}var vz=["image","font","video","audio"],Az=["javascript"],Rz=["text"],wz=["json","xml","html"];function Cz(r){let[e,t]=r.split("/");return e&&vz.includes(e)||t&&Az.some(n=>t.includes(n))?!1:!!(e&&Rz.includes(e)||t&&wz.some(n=>t.includes(n)))}async function xz({response:r,mimeType:e,sizes:t,neverRedact:n}){let o={mimeType:e,encoding:await r.headerValue("content-encoding")??void 0};return!n&&(!e||!Cz(e))?o._redactedReason="Body redacted because it's not a viewable MIME type":!n&&t.responseBodySize>=RC?o._redactedReason="Response body redacted due to size":o.text=en(await r.text(),n),o}function en(r,e){let t=e?Ez:bz;try{let n=JSON.parse(r),{jsonString:o}=Sz(r,t);return o}catch{return r.length>t?r.slice(0,t)+yz:r}}function Ho(r){return r<0?0:r}function MC(r){return{timings:{blocked:Ho(r.domainLookupStart),dns:Ho(r.domainLookupEnd-r.domainLookupStart),connect:Ho(r.connectEnd-r.connectStart),send:Ho(r.responseStart-r.requestStart),wait:0,receive:Ho(r.responseEnd-r.responseStart),ssl:Ho(r.connectEnd-r.secureConnectionStart)},total:Ho(r.responseEnd)}}function _C(){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 Mz}from"playwright-core";async function Go({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 Mz.TimeoutError)t.warn({err:c,rootUrl:(await n.state.getRoot()).url()},`Encountered Playwright error while performing ${e}`),s=await _z(c,i.locator,n,t);else throw c}throw s instanceof E?s:new E("ActionFailureError",`Failed to interact with targeted element. Error: ${s.message}`,{errOptions:{cause:s}})}async function _z(r,e,t,n){return r.message.includes("attempt #")?Iz(r,e,t,n):Pz(r)}async function Iz(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(`
4331
+ `,";").replace(/\s+/g," ");let a="",s=await Pr(e,n,150);if(s&&(a=`Target element HTML: ${yt(s,100,!0)}`),i.includes("element is not enabled"))return new E("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(Ir(l)),d=await Pr(u,n,150);d&&(c=`Covering element HTML: ${yt(d,100,!0)}`)}return new E("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}
4332
+ ${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:oe});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 E("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 E("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 Pz(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 E("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 Fz}from"child_process";import NC from"dedent";import{existsSync as Js,mkdirSync as yh,readdirSync as Bz,rmSync as DC}from"fs";import{homedir as UC}from"os";import{basename as zz,join as Qn,resolve as Hz}from"path";import{chromium as kC}from"playwright-core";function IC(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 Lz}from"crypto";function PC(r,e){for(let t of Object.values(e))if(t.matcher.matches({url:r.url(),method:r.method()}))return t}async function OC(r){let{route:e,mock:t,entry:n,onHarEntry:o,request:i,requestId:a,requestRecorders:s,logger:c,isBrowserClosed:l}=r;await Fu(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 p=await Oz(t,u,d),m={};p.headers.forEach((h,f)=>{m[f]=h});let g={body:await p.text(),contentType:p.headers.get("content-type")||"text/plain",headers:m,status:p.status};await e.fulfill(g);try{n.response={status:g.status,statusText:p.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 Oz(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 mh(r){try{await Nz(r)}catch(e){r.logger.warn({err:e},"Error handling intercepted request, continuing...")}}async function Nz(r){let{pageId:e,route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,mocks:s,isBrowserClosed:c}=r,l=Lz(),u=!1,d=await ph(e,n);try{o?.(l,d);for(let m of Object.values(a))m.matches(d)&&(u=!0,m.onRequestStart(l,d))}catch(m){c()||i.warn({err:m},"Failed to add request to HAR")}let p=PC(n,s);p?await OC({logger:i,route:t,mock:p,entry:d,onHarEntry:o,request:n,requestId:l,requestRecorders:a,isBrowserClosed:c}):await Dz({route:t,request:n,onHarEntry:o,logger:i,requestRecorders:a,entry:d,requestId:l,neverRedact:u,isBrowserClosed:c})}async function Dz({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 Fu(e,i,u,s),!l||!i)return;await CC(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 kz(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 Uz(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 Bu(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 gh(r){let e=r.request(),t=r.status(),n=r.headers(),o=await Uz(r);return{request:{url:e.url(),method:e.method(),headers:e.headers(),...await kz(e)},response:{status:t,headers:n,...o},status:t,headers:n,...o}}var Jn=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:Ou(t,this.requestMatcher.urlMatcher)}};function Xs(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 hh,platform as fh}from"os";import{join as Sh}from"path";function zu(){let r=[];if(fh()==="linux"){let e=hh();["chromium","google-chrome","chrome-canary"].forEach(t=>{r.push(Sh(e,".config",t,"Crash Reports"))})}else if(fh()==="darwin"){let e=hh();["Chromium","Google","Chrome for Testing"].forEach(t=>{r.push(Sh(e,"Library","Application Support",t,"Crashpad"))})}else if(fh()==="win32"){let e=hh();["Chromium","Google","Google Chrome Canary"].forEach(t=>{r.push(Sh(e,"AppData","Local",t,"User Data","Crashpad","reports"))})}return r}function LC(){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 bh=Qn(UC(),"momentic","chromium"),Gz=["--enable-crashpad","--crash-on-hang-threads=UI:18,IO:18"],Vz=["--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"],Wz=["--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 FC({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=[...Vz];!Wr&&$z()&&u.push("--disable-dev-shm-usage");let d={headless:process.env.MOMENTIC_HEADFUL_BROWSER!=="true",handleSIGTERM:!1,chromiumSandbox:!1,channel:l},p={...i??{},geolocation:i?.geolocation||Hl,locale:i?.locale||Ny,timezoneId:i?.timezoneId||Dy,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??Dn,serviceWorkers:"block",storageState:{cookies:[...LC()],origins:[]},proxy:o.proxy};o.initialLocalStorage&&(p.storageState.origins=Object.entries(o.initialLocalStorage).map(([T,C])=>({origin:T,localStorage:Object.entries(C).map(([x,w])=>({name:x,value:w}))}))),process.env.MOMENTIC_CHROME_EXTRA_ARGS&&u.push(...process.env.MOMENTIC_CHROME_EXTRA_ARGS.split(","));let m=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 T=zu();T.forEach(C=>{if(!Js(C))return;["new","pending","completed"].forEach(w=>{let O=Qn(C,w);if(!Js(O))return;let v=Bz(O);for(let M=0;M<v.length;M++){let k=Qn(O,v[M]);DC(k,{force:!0})}})}),T.forEach(C=>{Js(C)||yh(C,{recursive:!0});let x=Qn(C,`write-test-${Date.now()}`);yh(x,{recursive:!0}),DC(x,{recursive:!0,force:!0})}),u.push(...Gz)}catch(T){e.warn({err:T},"Could not create Chrome crash report directory, not enabling crashpad")}o.disableGpu&&u.push(...Wz);let b=o.localChromeExtensionPaths?.map(T=>T.startsWith("~")?Qn(UC(),T.slice(1)):T);if(b?.length){if(l===void 0)throw new E("UserConfigurationError","Chrome extensions are only supported on Chromium and Google Chrome.");for(let w of b){let O=Qn(w,"manifest.json");if(!Js(O))throw new E("UserConfigurationError",`Chrome extension path ${O} does not exist.`)}if(Wr)throw new E("UserConfigurationError","Cannot use persistent browser context on Momentic Cloud");let T=Qn(bh,`momentic-session-${Date.now()}`);if(!Js(T))try{yh(T,{recursive:!0})}catch(w){throw new E("UserConfigurationError",`Failed to create browser cache directory. Please make sure you have sufficient permissions to create the ${bh} folder: ${w}`)}let C=[...u],x=b.map(w=>Hz(w)).join(",");C.push(`--disable-extensions-except=${x}`),p?.deviceScaleFactor&&C.push(`--force-device-scale-factor=${p.deviceScaleFactor}`,`--device-scale-factor=${p.deviceScaleFactor}`),p.viewport&&C.push(`--window-size=${p.viewport.width},${p.viewport.height}`),g=await kC.launchPersistentContext(Qn(bh,`momentic-session-${Date.now()}`),{...d,...p,ignoreDefaultArgs:["--disable-extensions","--disable-component-extensions-with-background-pages"],args:C,baseURL:r}),e.info({sharedContextOptions:p,sharedBrowserOptions:d,userBrowserSettings:o,chromeArgs:C,properties:f,baseUrl:r},"Browser initialization context args (persistent)"),h=g.pages()[0]}else{m=await kC.launch({...d,args:u});let T={...p,baseURL:r,recordVideo:c?{dir:c.videoOutputPath}:void 0};g=await m.newContext(T),e.info({contextArgs:T,sharedBrowserOptions:d,chromeArgs:u,userBrowserSettings:o,properties:f,baseUrl:r},"Browser initialization context args (standard)"),h=await g.newPage()}if(c){let T=await h.video()?.path();if(T){let C=zz(T);c.onVideoPageChange({videoName:C})}}Wr&&await g.route("**",Xs);try{let T=m?.version();e.info({browserVersion:T},"Got browser version")}catch(T){e.warn({err:T},"Could not get browser version string")}return{browser:m,context:g,page:h,baseUrl:r,logger:e,storage:t,enricher:n,userBrowserSettings:o,viewport:p.viewport||Dn,properties:f,clientCallbacks:s,iconKnowledgeBase:a,onVideoPageChange:c?.onVideoPageChange}}function jz(){if(process.platform!=="linux")return null;try{let e=Fz("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 $z(){let e=process.env.BROWSER_ENABLE_DEV_SHM;if(e==="1")return!1;if(e==="0")return!0;let t=jz();return t==null?!1:t<128}function Eh(r,e=!1){let t=NC`window._MOMENTIC_BROWSER = true;
4333
4333
  window._MOMENTIC_FEATURE_FLAGS = ${JSON.stringify(r)};
4334
4334
  window.addEventListener('load', (event) => { console.log('[MOMENTIC] Page loaded'); });`;return e&&(t+=NC`
4335
4335
  window._fs_namespace = window._fs_namespace || 'FS';
@@ -4340,7 +4340,7 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4340
4340
  writable: false,
4341
4341
  configurable: false,
4342
4342
  });`),`${t}
4343
- //# sourceURL=momentic-injected/extra-scripts.js`}function Th(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var qz=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],Kz=["local-network-access"];function BC(r){return Wr?r.filter(e=>!Kz.includes(e)):r}function zC(r){return BC(r||qz)}var vh="__momentic_session_storage_initialized";function HC(r){return r.parentFrame!==void 0}async function GC(r,e,t){try{let n=await Yz(r);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),t.info(`Saved ${n.entries.length} session storage entries`)}catch(n){t.warn({err:n},"Failed to extract session storage, continuing...")}}async function Yz(r){return r.evaluate(e=>{let t=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&t.push({name:o,value:i})}}return{origin:window.location.origin,entries:t}},vh)}async function VC(r){try{return await Xz(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function Xz({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:ae}),o=await Ir(r,e,500),i=await r.boundingBox({timeout:ae});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:ae}),{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(),p=u.getBoundingClientRect();if(p.width===0||p.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,d.left-p.left),p.width-1),y:Math.min(Math.max(1,d.top-p.top),p.height-1)},g=l._MOMENTIC_FEATURE_FLAGS?.[Nu],h=c.getAttribute(En),f=!g&&h?_r(h):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:m,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:ae});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:ae}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var jC=["date","datetime-local","month","time","week"],WC={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 $C(r){try{await z(Jz(r),{milliseconds:oe})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function Jz({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await at({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:ae,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!WC[i])return;WC[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 qt}from"zod";var qC=qt.object({doubleClick:qt.boolean().optional(),rightClick:qt.boolean().optional(),force:qt.boolean().optional(),waitForDownload:qt.boolean().optional(),delayMs:qt.number().optional(),downloadTimeoutMs:qt.number().optional(),relativePosition:qt.object({x:qt.number(),y:qt.number()}).optional()}),lRe=qt.object({repeat:qt.number().optional(),convertMeta:qt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:qt.number().optional()});async function Hu({locator:r,callbacks:e,logger:t,timeoutMs:n=ae}){try{await Ah(e,n);let o=r.evaluate(i=>{let a=window;a.momenticIsEligible=d=>{let m=window.getComputedStyle(d,null).getPropertyValue("display");if(m==="none"||m==="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 Ah(r,e=ae){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 Rh(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Go({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>YC({...r,targetingResult:t,useVisualClick:e})})}async function t1(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await r1(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 r1(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:ae});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:ae}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),YC({...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 n1(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=qC.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await a1({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 o1(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 VC({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,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:oe,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:oe,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(l1(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..."),t1(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function YC(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??Zg;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof e1.TimeoutError?new E("ActionFailureError",`Download did not complete in ${u}ms`):new E("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Hu({locator:a.locator,callbacks:n,logger:t,timeoutMs:ae})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await n1(r):l=(await o1(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new E("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??Zg});if(u instanceof Error)throw u;return{downloadedFile:await s1(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 i1(r,e){let t=await r.locator.boundingBox({timeout:oe});if(!t){let i=await Ir(r.locator,e,500);throw new E("ActionFailureError",`${fp}${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 a1({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:oe}),d=r.relativePosition.x,p=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:oe});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await i1(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 s1(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=ch(r.suggestedFilename()),i=e();await r.saveAs(Zz(i,o)),KC(n,{force:!0}),setTimeout(()=>{KC(i,{recursive:!0,force:!0})},5*60*1e3);let a=yC(Qz(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function l1(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as c1}from"os";var u1={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 d1(){let r=c1();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function XC(r){return JSON.stringify(r.split("+").sort())}function Gu(r,e){let t=d1(),n=XC(r);for(let o of Object.values(u1))if(Object.values(o).some(i=>XC(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function wh({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,p,m,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*g),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Re,codePath:"scrolling page"});else{let d=e.viewportSize()||Dn,p=await at({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Re,codePath:"computing page height"}),[m,g,h]=await at({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let b=f.getBoundingClientRect();return[f.scrollTop,b.x,b.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Re,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<Re;){a?.throwIfAborted();let b=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:ae}),[T,C,x]=await z(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let O=w.getBoundingClientRect();return[w.scrollTop,O.x,O.y]}),{milliseconds:ae});if(b===p&&T===m&&C===g&&x===h)break;p=b,m=T,g=C,h=x,await j(pt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Ch(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(pt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function xh(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=r;if(a){await p1(r);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??zo),await e.mouse.up()}async function JC({page:r,fromTarget:e,toTarget:t,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await t.boundingBox({timeout:oe});if(!a)throw new E("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:oe});if(!s)throw new E("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await xh({page:r,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function QC(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(Math.min(n.hoverDurationMs??500,Du)),await r.mouse.up()}async function p1(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=r,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+t,p=i.y+n;await e.evaluate(async({startX:m,startY:g,endX:h,endY:f,stepCount:b,dragDurationMs:T,hoverDurationMs:C})=>{let x=document.elementFromPoint(m,g)??document.body??document.documentElement,O=window._momenticMobileUtilities.dispatchTouch;O(x,"touchstart",m,g);for(let v=1;v<=b;v+=1){let M=m+(h-m)*v/b,k=g+(f-g)*v/b;O(x,"touchmove",M,k),await new Promise(V=>setTimeout(V,Math.floor((T??500)/b)))}C&&await new Promise(v=>setTimeout(v,C)),O(x,"touchend",h,f)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as E1}from"crypto";import{cloneDeep as Ih}from"lodash-es";function Zn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as m1}from"crypto";var g1="v1";function Mh(r,e){if(r.tagName.toLowerCase()==="svg"&&!f1(r))try{let t=ZC(r,e),n=h1(JSON.stringify(t));return{version:g1,json:t,hash:n}}catch{return}}function h1(r){return m1("md5").update(r).digest("hex")}function ZC(r,e){let t=r.tagName.toLowerCase(),n=S1(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=ZC(a,e);s&&o.children.push(s)}}return o}function f1(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function S1(r){let e={},t=r.attributes;for(let n of Object.keys(t))yr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var Vo={r:147,g:196,b:125,a:.55},tx={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Vo,paddingColor:Vo,borderColor:Vo,marginColor:Vo,eventTargetColor:Vo,shapeColor:Vo,shapeMarginColor:Vo,showInfo:!0,showAccessibilityInfo:!0};function rx({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=y1({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function y1({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((v,M)=>{u[v]=M});let d=l.styles,p=l.bounds??[],m=c.nodes,g=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],f=m.attributes??[],b=m.parentIndex??[],T=m.nodeName??[],C=m.nodeType??[],x=m.pseudoType??{index:[],value:[]},w=m.inputChecked??{index:[]},O=e[c.frameId];for(let v=0;v<h.length;v++){let M=h[v],k=C[v],V=f[v]??[],J=b[v]!==void 0&&b[v]>=0?b[v]:void 0,te=J!==void 0?h[J]:void 0,Et=te!==void 0?a[te]:void 0,Y=x.index.indexOf(v),H=Y!==-1?e[x.value[Y]]:void 0,ce=u[v],ge;ce?ge=p[ce]??[]:ge=[];let Je=T[v]!==void 0?e[T[v]]?.toLowerCase():void 0;if(!Je){s.warn({backendNodeId:M,frameId:O,frameIndex:o,nodeBounds:ge},"DOM node has no tag name");continue}let xe={backendNodeId:M,psuedoType:H,nodeType:k,frameIndex:o,parentFrameId:O,ownedFrameId:void 0,bounds:{x:ge[0]??null,y:ge[1]??null,width:ge[2]??null,height:ge[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:te??null,tagName:Je,parent:Et??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};Et&&Et.childrenBackendIds.push(M);let Kt=g.index.indexOf(v);if(Kt!==-1){let Fe=g.value[Kt];i[Fe]=xe;let lt=r[Fe]?.frameId;xe.ownedFrameId=lt!==void 0?e[lt]:void 0}for(let Fe of Object.keys(xe.bounds)){let lt=Fe;xe.bounds[lt]!==null&&(xe.bounds[lt]/=n)}let Ot=ce!==void 0?d[ce]??[]:[];for(let Fe=0;Fe<Ot.length&&!(Fe>=t.length);Fe++){let lt=Ot[Fe];if(lt===void 0||isNaN(lt))continue;let Nr=e[lt];if(Nr===void 0)continue;let wn=t[Fe];xe.computedStyles[wn]=Nr}for(let Fe=0;Fe<V.length;Fe+=2){let lt=V[Fe],Nr=V[Fe+1];if(!lt||!Nr)continue;let wn=e[lt],io=e[Nr];!wn||!io||(xe.attributes[wn]=io)}w.index.includes(v)&&(xe.attributes.checked="true"),a[xe.backendNodeId]=xe}return a[h[0]]}function _h(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=`${_h(t,e)}${a}`}return r.mPathSelector=n,n}function ex(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var b1=["html","#document","#document-fragment"];function nx({node:r,domGraph:e}){let t=[],n=r,o=ex(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=ex(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++,b1.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],p=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.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 ox(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 ix(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Re});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Re}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Re})).attributes,i=Zn(o,En);if(!i)throw new Error(`Could not find attribute ${En} for object ${e}`);return i}var T1=["focusable","keyshortcuts","controls","live","relevant","orientation"],v1=["selected","readonly","modal","required","invalid"],A1=["id","name","role","content"],ax=["absolute","fixed","sticky"],R1=["i","label"],w1=["path"],C1=["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"],cx=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],ux=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],x1=["menulistpopup","statictext","inlinetextbox"],M1=80,sx=100,dx=50,Lh=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],_1=["cite"],I1={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"]},P1={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},lx={indentLevel:0},Ph=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<dx?t:""),this.role=this.role||(e.domNode.attributes.role??""),D1(this.properties,e.domNode,e.importantProperties)}U1(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&&w1.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>ux.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>fx(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>Sx(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&&R1.includes(this.domNode.tagName)||C1.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)||yr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>hx(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=lx){let t=Object.assign({},lx,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=Ih(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(w=>!w.superseded&&w.type==="contents")&&this.children.length>0&&(m="");let h=this.nameSources?.find(w=>!w.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let w=h.attributeValue?.relatedNodes??[];w.length===1&&w[0].text&&w[0].text===m&&(m="")}let f=Lh.includes(this.role)||_1.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
4343
+ //# sourceURL=momentic-injected/extra-scripts.js`}function Th(r){let e=[],t="";for(let n of r)n==="+"&&t?(e.push(t),t=""):t+=n;return e.push(t),e}var qz=["clipboard-read","clipboard-write","microphone","camera","geolocation","local-network-access"],Kz=["local-network-access"];function BC(r){return Wr?r.filter(e=>!Kz.includes(e)):r}function zC(r){return BC(r||qz)}var vh="__momentic_session_storage_initialized";function HC(r){return r.parentFrame!==void 0}async function GC(r,e,t){try{let n=await Yz(r);if(n.entries.length===0)return;let o=e.origins?.find(i=>i.origin===n.origin);o?o.sessionStorage=n.entries:(e.origins=e.origins??[],e.origins.push({origin:n.origin,localStorage:[],sessionStorage:n.entries})),t.info(`Saved ${n.entries.length} session storage entries`)}catch(n){t.warn({err:n},"Failed to extract session storage, continuing...")}}async function Yz(r){return r.evaluate(e=>{let t=[];for(let n=0;n<window.sessionStorage.length;n++){let o=window.sessionStorage.key(n);if(o&&o!==e){let i=window.sessionStorage.getItem(o);i!==null&&t.push({name:o,value:i})}}return{origin:window.location.origin,entries:t}},vh)}async function VC(r){try{return await Xz(r)}catch(e){r.logger.warn({err:e},"Failed to transform locator for Chakra click, continuing...");return}}async function Xz({locator:r,logger:e}){let[t,n]=await r.evaluate(c=>[c.id,c.tagName.toLowerCase()],{timeout:ae}),o=await Pr(r,e,500),i=await r.boundingBox({timeout:ae});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:ae}),{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(),p=u.getBoundingClientRect();if(p.width===0||p.height===0)return{type:"error",error:"Parent element has no width or height"};let m={x:Math.min(Math.max(1,d.left-p.left),p.width-1),y:Math.min(Math.max(1,d.top-p.top),p.height-1)},g=l._MOMENTIC_FEATURE_FLAGS?.[Du],h=c.getAttribute(En),f=!g&&h?Ir(h):l.getMPath?.(c)?.join(" >");return f?{type:"result",selector:f,relativePoint:m,serializedForm:u.outerHTML.slice(0,500)}:{type:"error",error:"Could not generate selector for parent element"}},{timeout:ae});if(a.type==="error")throw new Error(a.error);let s=r.page().locator(a.selector);return await s.waitFor({state:"visible",timeout:ae}),e.info({parentElementResult:a,originalElementDisplayString:o},`Redirected click to parent element with selector: ${a.selector}`),{locator:s,relativePoint:a.relativePoint}}var jC=["date","datetime-local","month","time","week"],WC={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 $C(r){try{await z(Jz(r),{milliseconds:oe})}catch(e){r.logger.warn({err:e},"Failed to transform native datetime input, continuing...")}}async function Jz({root:r,text:e,options:t,logger:n,callbacks:o}){let i=(await at({root:r,fn:()=>document.activeElement?.getAttribute("type")??"",timeout:ae,arg:void 0,waitForPageLoad:o.waitForPageLoad,codePath:"transforming native datetime input"})).toLowerCase();if(!WC[i])return;WC[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 qt}from"zod";var qC=qt.object({doubleClick:qt.boolean().optional(),rightClick:qt.boolean().optional(),force:qt.boolean().optional(),waitForDownload:qt.boolean().optional(),delayMs:qt.number().optional(),downloadTimeoutMs:qt.number().optional(),relativePosition:qt.object({x:qt.number(),y:qt.number()}).optional()}),uRe=qt.object({repeat:qt.number().optional(),convertMeta:qt.boolean().optional().describe("misleading name due to backcompat. converts keyshortcuts + meta/control to platform-specific combos. defaults to true"),delayMs:qt.number().optional()});async function Hu({locator:r,callbacks:e,logger:t,timeoutMs:n=ae}){try{await Ah(e,n);let o=r.evaluate(a=>{let s=window;s.momenticIsEligible=p=>{let g=window.getComputedStyle(p,null).getPropertyValue("display");if(g==="none"||g==="contents")return!1;let h=p.getBoundingClientRect();return!(!h.height||!h.width)},s.removeHighlightTimers=s.removeHighlightTimers||[],s.removeHighlightFunctions=s.removeHighlightFunctions||{};let c=0;for(;!s.momenticIsEligible(a)&&c<3;){if(!a.parentElement)throw new Error("No eligible non-empty parent found for highlighting");a=a.parentElement,c++}let l=a.style.getPropertyValue("outline"),u=a.style.getPropertyPriority("outline");a.style.setProperty("outline","5px dashed rgb(255, 0, 153)","important");let d=`momentic${Math.floor(Math.random()*1e7)}`;s[d]=()=>{a.style.removeProperty("outline"),a.style.setProperty("outline",l,u),a.getAttribute("style")||a.removeAttribute("style")},s.removeHighlightTimers.push(setTimeout(()=>{s[d](),s.removeHighlightFunctions?.[d]&&delete s.removeHighlightFunctions[d]},5e3)),s.removeHighlightFunctions[d]=s[d]},void 0,{timeout:n}).then(()=>!0).catch(a=>(t.debug({err:a},"Failed to add node highlight, a page navigation likely occurred. This is non-fatal for tests."),!1));return await z(o,{milliseconds:n})}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 Ah(r,e=ae){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 Rh(r){let e=!!r.browserCallbacks.state.userBrowserSettings.visualActions;return Go({action:"clicking element",targetingResult:r.targetingResult,logger:r.logger,retryTimeoutMs:r.retryTimeoutMs,callbacks:r.browserCallbacks,func:async t=>YC({...r,targetingResult:t,useVisualClick:e})})}async function t1(r,e){let{redirectionAttempts:t=0}=e;if(t>=2)throw r;try{return await r1(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 r1(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:ae});if(!i)throw r;let a=o.page().locator(`[for=${JSON.stringify(i)}]`);return await a.waitFor({state:"visible",timeout:ae}),t.warn({err:r},"Attempting locator redirection due to input being covered by label"),YC({...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 n1(r){let{logger:e,targetingResult:t,position:n,options:o}=r,i=qC.safeParse(o),a=Date.now(),{clickX:s,clickY:c,reason:l}=await a1({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 o1(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 VC({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,position:a},"Locator click");try{n?.doubleClick?await i.dblclick({button:n.rightClick?"right":"left",timeout:oe,position:a,delay:n?.delayMs??25,force:s}):await i.click({button:n?.rightClick?"right":"left",timeout:oe,position:a,delay:n?.delayMs??25,force:s})}catch(l){let u=l;if(l1(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..."),t1(u,{...r,targetingResult:{...i,locator:i}})}return{locatorSource:c}}async function YC(r){let{options:e,logger:t,browserCallbacks:n,controllerCallbacks:o,useVisualClick:i,targetingResult:a}=r,s;e?.waitForDownload&&(s=(async()=>{let u=e.downloadTimeoutMs??eh;try{return await a.locator.page().waitForEvent("download",{timeout:u})}catch(d){return d instanceof e1.TimeoutError?new E("ActionFailureError",`Download did not complete in ${u}ms`):new E("ActionFailureError",`Download failed: ${d.message}`)}})());try{await Hu({locator:a.locator,callbacks:n,logger:t,timeoutMs:ae})}catch(u){t.warn({err:u},"Error highlighting locator in click, continuing...")}let c,l;if(i?c=await n1(r):l=(await o1(r)).locatorSource,e?.waitForDownload)if(s){if(!o?.createIsolatedFolder)throw new E("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??eh});if(u instanceof Error)throw u;return{downloadedFile:await s1(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 i1(r,e){let t=await r.locator.boundingBox({timeout:oe});if(!t){let i=await Pr(r.locator,e,500);throw new E("ActionFailureError",`${fp}${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 a1({options:r,targetingResult:e,position:t,logger:n}){let o,i,a;if(r?.relativePosition){let u=await e.locator.boundingBox({timeout:oe}),d=r.relativePosition.x,p=r.relativePosition.y;u?.width&&(d=Math.max(0,Math.min(r.relativePosition.x,u.width))),u?.height&&(p=Math.max(0,Math.min(r.relativePosition.y,u.height))),o=(u?.x??0)+d,i=(u?.y??0)+p,a="relative position from user"}else if(t){let u=await e.locator.boundingBox({timeout:oe});o=(u?.x??0)+t.x,i=(u?.y??0)+t.y,a="predefined position"}else{let[u,d]=await i1(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 s1(r,e,t){t.info("Download detected, saving file to disk");let n=await r.path(),o=uh(r.suggestedFilename()),i=e();await r.saveAs(Zz(i,o)),KC(n,{force:!0}),setTimeout(()=>{KC(i,{recursive:!0,force:!0})},5*60*1e3);let a=yC(Qz(i),o);return t.info({uri:a,downloadFolder:i},"Saved download to isolated folder"),a}function l1(r){return r.message.includes("locator.click: Timeout")&&r.message.includes("click action done")}import{platform as c1}from"os";var u1={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 d1(){let r=c1();return r==="win32"?"win32":r==="darwin"?"darwin":"linux"}function XC(r){return JSON.stringify(r.split("+").sort())}function Gu(r,e){let t=d1(),n=XC(r);for(let o of Object.values(u1))if(Object.values(o).some(i=>XC(i)===n))return o[t];return process.platform==="darwin"&&!e?r=r.replaceAll("Control","Meta"):r=r.replaceAll("Meta","Control"),r}async function wh({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,p,m,g])=>window.scrollTo(window.scrollX+(d??window.innerWidth)*m,window.scrollY+(p??window.innerHeight)*g),arg:[t,o,l,u],waitForPageLoad:s.waitForPageLoad,timeout:Re,codePath:"scrolling page"});else{let d=e.viewportSize()||Dn,p=await at({root:e,fn:()=>document.body.scrollHeight,arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Re,codePath:"computing page height"}),[m,g,h]=await at({root:e,fn:()=>{let f=document.activeElement;if(!f)return[void 0,void 0,void 0];let b=f.getBoundingClientRect();return[f.scrollTop,b.x,b.y]},arg:void 0,waitForPageLoad:s.waitForPageLoad,timeout:Re,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<Re;){a?.throwIfAborted();let b=await z(e.evaluate(()=>document.body.scrollHeight),{milliseconds:ae}),[T,C,x]=await z(e.evaluate(()=>{let w=document.activeElement;if(!w)return[void 0,void 0,void 0];let O=w.getBoundingClientRect();return[w.scrollTop,O.x,O.y]}),{milliseconds:ae});if(b===p&&T===m&&C===g&&x===h)break;p=b,m=T,g=C,h=x,await j(pt)}}catch(f){c.warn({err:f},"Failed to wait for scroll to complete, continuing...")}}}async function Ch(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(pt)}throw new Error(`Failed to get tab titles after all retries: ${n?.message}`)}async function xh(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,isAndroid:a,hoverDurationMs:s}=r;if(a){await p1(r);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??zo),await e.mouse.up()}async function JC({page:r,fromTarget:e,toTarget:t,stepCount:n,dragDurationMs:o,hoverDurationMs:i}){let a=await t.boundingBox({timeout:oe});if(!a)throw new E("ActionFailureError","Could not get bounding box of 'to' target element");let s=await e.boundingBox({timeout:oe});if(!s)throw new E("ActionFailureError","Could not get bounding box of 'from' target element");let c=a.x+a.width/2,l=a.y+a.height/2,u=s.x+s.width/2,d=s.y+s.height/2;await xh({page:r,deltaX:c-u,deltaY:l-d,steps:n,dragDurationMs:o,hoverDurationMs:i,visualTarget:{x:u,y:d},isAndroid:!0})}async function QC(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(Math.min(n.hoverDurationMs??500,ku)),await r.mouse.up()}async function p1(r){let{page:e,deltaX:t,deltaY:n,steps:o,visualTarget:i,dragDurationMs:a,hoverDurationMs:s}=r,c=Math.max(1,o??1),l=i.x,u=i.y,d=i.x+t,p=i.y+n;await e.evaluate(async({startX:m,startY:g,endX:h,endY:f,stepCount:b,dragDurationMs:T,hoverDurationMs:C})=>{let x=document.elementFromPoint(m,g)??document.body??document.documentElement,O=window._momenticMobileUtilities.dispatchTouch;O(x,"touchstart",m,g);for(let v=1;v<=b;v+=1){let M=m+(h-m)*v/b,k=g+(f-g)*v/b;O(x,"touchmove",M,k),await new Promise(V=>setTimeout(V,Math.floor((T??500)/b)))}C&&await new Promise(v=>setTimeout(v,C)),O(x,"touchend",h,f)},{startX:l,startY:u,endX:d,endY:p,stepCount:c,dragDurationMs:a,hoverDurationMs:s})}import{randomUUID as E1}from"crypto";import{cloneDeep as Ih}from"lodash-es";function Zn(r,e){let t=r.findIndex(n=>n===e);if(!(t===-1||!r[t+1]))return r[t+1]}import{createHash as m1}from"crypto";var g1="v1";function Mh(r,e){if(r.tagName.toLowerCase()==="svg"&&!f1(r))try{let t=ZC(r,e),n=h1(JSON.stringify(t));return{version:g1,json:t,hash:n}}catch{return}}function h1(r){return m1("md5").update(r).digest("hex")}function ZC(r,e){let t=r.tagName.toLowerCase(),n=S1(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=ZC(a,e);s&&o.children.push(s)}}return o}function f1(r){let e=r.computedStyles.display,t=r.computedStyles.visibility,n=r.computedStyles.opacity;return e==="none"||t==="hidden"||n==="0"}function S1(r){let e={},t=r.attributes;for(let n of Object.keys(t))yr.visualAttributesForSvgSerialization.includes(n)&&(e[n]=t[n]);return t.id&&r.tagName.toLowerCase()!=="svg"&&(e.id=t.id),e}var Vo={r:147,g:196,b:125,a:.55},tx={showRulers:!1,showStyles:!1,showExtensionLines:!1,contrastAlgorithm:"aa",contentColor:Vo,paddingColor:Vo,borderColor:Vo,marginColor:Vo,eventTargetColor:Vo,shapeColor:Vo,shapeMarginColor:Vo,showInfo:!0,showAccessibilityInfo:!0};function rx({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=y1({allDocuments:i,stringConstants:o,computedStylesToFetch:t,devicePixelRatio:e,frameIndex:u,backendIdToNode:a,frameIndexToIframeNode:s,logger:n});c.roots.push(d)}),c}function y1({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((v,M)=>{u[v]=M});let d=l.styles,p=l.bounds??[],m=c.nodes,g=m.contentDocumentIndex??{index:[],value:[]},h=m.backendNodeId??[],f=m.attributes??[],b=m.parentIndex??[],T=m.nodeName??[],C=m.nodeType??[],x=m.pseudoType??{index:[],value:[]},w=m.inputChecked??{index:[]},O=e[c.frameId];for(let v=0;v<h.length;v++){let M=h[v],k=C[v],V=f[v]??[],J=b[v]!==void 0&&b[v]>=0?b[v]:void 0,te=J!==void 0?h[J]:void 0,Et=te!==void 0?a[te]:void 0,Y=x.index.indexOf(v),H=Y!==-1?e[x.value[Y]]:void 0,ce=u[v],ge;ce?ge=p[ce]??[]:ge=[];let Je=T[v]!==void 0?e[T[v]]?.toLowerCase():void 0;if(!Je){s.warn({backendNodeId:M,frameId:O,frameIndex:o,nodeBounds:ge},"DOM node has no tag name");continue}let xe={backendNodeId:M,psuedoType:H,nodeType:k,frameIndex:o,parentFrameId:O,ownedFrameId:void 0,bounds:{x:ge[0]??null,y:ge[1]??null,width:ge[2]??null,height:ge[3]??null},computedStyles:{},attributes:{},parentBackendNodeId:te??null,tagName:Je,parent:Et??void 0,childrenBackendIds:[],momenticIgnored:void 0,mPathSelector:void 0};Et&&Et.childrenBackendIds.push(M);let Kt=g.index.indexOf(v);if(Kt!==-1){let Fe=g.value[Kt];i[Fe]=xe;let lt=r[Fe]?.frameId;xe.ownedFrameId=lt!==void 0?e[lt]:void 0}for(let Fe of Object.keys(xe.bounds)){let lt=Fe;xe.bounds[lt]!==null&&(xe.bounds[lt]/=n)}let Ot=ce!==void 0?d[ce]??[]:[];for(let Fe=0;Fe<Ot.length&&!(Fe>=t.length);Fe++){let lt=Ot[Fe];if(lt===void 0||isNaN(lt))continue;let Nr=e[lt];if(Nr===void 0)continue;let wn=t[Fe];xe.computedStyles[wn]=Nr}for(let Fe=0;Fe<V.length;Fe+=2){let lt=V[Fe],Nr=V[Fe+1];if(!lt||!Nr)continue;let wn=e[lt],io=e[Nr];!wn||!io||(xe.attributes[wn]=io)}w.index.includes(v)&&(xe.attributes.checked="true"),a[xe.backendNodeId]=xe}return a[h[0]]}function _h(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=`${_h(t,e)}${a}`}return r.mPathSelector=n,n}function ex(r,e){return r.parentBackendNodeId!==null?e.backendIdToNode[r.parentBackendNodeId]:r.frameIndex===0?void 0:e.frameIndexToIframeNode[r.frameIndex]}var b1=["html","#document","#document-fragment"];function nx({node:r,domGraph:e}){let t=[],n=r,o=ex(r,e);if(!o)return[r.tagName];let i=()=>{if(n=o,o=ex(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++,b1.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],p=e.backendIdToNode[d];if(d===n.backendNodeId){t.push(`${n.tagName}:nth-child(${l})`),c=!0;break}else p?.nodeType===1&&!p.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 ox(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 ix(r,e){await r.send({method:"DOM.getDocument",params:{depth:0},timeout:Re});let t=await r.send({method:"DOM.requestNode",params:{objectId:e},timeout:Re}),o=(await r.send({method:"DOM.getAttributes",params:{nodeId:t.nodeId},timeout:Re})).attributes,i=Zn(o,En);if(!i)throw new Error(`Could not find attribute ${En} for object ${e}`);return i}var T1=["focusable","keyshortcuts","controls","live","relevant","orientation"],v1=["selected","readonly","modal","required","invalid"],A1=["id","name","role","content"],ax=["absolute","fixed","sticky"],R1=["i","label"],w1=["path"],C1=["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"],cx=["ariaHiddenElement","ariaHiddenSubtree","hiddenByChildTree","inertElement","inertSubtree","notRendered","notVisible"],ux=["activeAriaModalDialog","activeFullscreenElement","activeModalDialog"],x1=["menulistpopup","statictext","inlinetextbox"],M1=80,sx=100,dx=50,Lh=["StaticText","ListMarker","RootWebArea","LineBreak","emphasis","::before","::after"],_1=["cite"],I1={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"]},P1={name:!0,value:!0,title:!0,alt:!0,placeholder:!0,checked:!0,selected:!0,contenteditable:!0},lx={indentLevel:0},Ph=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<dx?t:""),this.role=this.role||(e.domNode.attributes.role??""),D1(this.properties,e.domNode,e.importantProperties)}U1(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&&w1.includes(this.domNode.tagName)&&!this.domNode.attributes["aria-label"]||this.ignoredReasons.some(n=>ux.includes(n)))return!1;if(e){if(Object.keys(this.domNode?.attributes??{}).some(o=>fx(o,e)))return!0;let n=this.domNode?.attributes.class?.split(" ");if(n&&n.length>0&&n.some(o=>Sx(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&&R1.includes(this.domNode.tagName)||C1.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)||yr.alwaysInterestingTruthyPropertyNames.some(n=>!!this.properties[n]))return!0;let t=this.properties.class;return typeof t=="string"&&t.split(" ").some(n=>hx(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=lx){let t=Object.assign({},lx,e),{indentLevel:n,noChildren:o,noProperties:i,noId:a,noContent:s,condensedMode:c}=t,l=Ih(this.properties),u=" ".repeat(n),d=this.role||"",p=this.tagName??"unknown",m=this.name;d==="heading"&&m==="heading"&&(m=""),this.nameSources?.find(w=>!w.superseded&&w.type==="contents")&&this.children.length>0&&(m="");let h=this.nameSources?.find(w=>!w.superseded);if(h&&!h.nativeSource&&h.type==="relatedElement"){let w=h.attributeValue?.relatedNodes??[];w.length===1&&w[0].text&&w[0].text===m&&(m="")}let f=Lh.includes(this.role)||_1.includes(this.tagName||"");if(this.role==="StaticText"||this.role==="ListMarker")return`${u}${m}
4344
4344
  `;let b=`${u}<${p}`;!a&&!f&&(b+=` id="${this.id}"`);let T=s??!1;if((l.multiline||l.contenteditable)&&this.children.length>0&&(T=!0),d&&d!=="generic"&&d!==p&&!(I1[d]??[]).includes(p)&&(b+=` role=${JSON.stringify(d)}`),m&&(b+=` name=${JSON.stringify(m)}`),this.content&&!T&&(b+=` content=${JSON.stringify(this.content)}`),this.flagNotActionableNodes&&this.tagName!=="#document"&&this.isIneligible()&&(b+=` ${yr.ineligibleElementAttribute}`),this.shouldSerializeBounds()&&this.domNode?.bounds){let w=this.domNode.bounds,O=Math.round(w.x??0),v=Math.round(w.y??0),M=Math.round((w.x??0)+(w.width??0)),k=Math.round((w.y??0)+(w.height??0));b+=` bounds=[${O} ${v} ${M} ${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 ${p} and internal ID ${this.id} took too long. Please ensure your machine has enough resources to run Momentic.`);Object.entries(l).forEach(([w,O])=>{if(!T1.includes(w)){{if(v1.includes(w)&&(!O||O==="false"))return;if(w==="value"&&T&&(l.type==="text"||this.role==="textbox"))return;if(w==="level"&&`${O}`=="1")return;if(w==="url"&&l.src&&p==="img")return;if(w==="url"&&l.href&&p==="a")return;if(w==="editable"&&O==="plaintext")return;if(w==="type"&&O===p)return;if(c&&!P1[w])return}typeof O=="string"?b+=` ${w}="${yt(O,sx,!0)}"`:typeof O=="boolean"?O?b+=` ${w}`:b+=` ${w}={false}`:typeof O<"u"&&(b+=` ${w}={${yt(JSON.stringify(O),sx,!0)}}`)}})}if(p==="::before"||p==="::after"){let w="";for(let O of this.children)w+=O.serialize({...e,indentLevel:n,neighbors:0});return w}let x=e.maxLevel!==void 0&&n/2>=e.maxLevel;if(this.children.length===0||o||x)b+=` />
4345
4345
  `;else{let w="";for(let v of this.children)w+=v.serialize({...e,indentLevel:n+2,neighbors:0});let O=w.trim();O.length<=M1&&!O.includes(`
4346
4346
  `)?b+=`>${O}</${p}>
@@ -4348,23 +4348,23 @@ ${c}`,{errOptions:{cause:r}})}if(i.includes("element is not visible")){let c="Th
4348
4348
  ${w}${u}</${p}>
4349
4349
  `}if(e.neighbors!==void 0&&e.neighbors>0&&this.parent){let w=this.parent.children.findIndex(M=>M.id===this.id),O=w>0?this.parent.children[w-1]?.serialize({...e,neighbors:0}):"",v=w<this.parent.children.length-1?this.parent.children[w+1]?.serialize({...e,neighbors:0}):"";return`${O||""}
4350
4350
  ${b}
4351
- ${v||""}`}return b}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:Ih(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=Ih(this.properties),e}},Oh=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 p=a(d);p&&(u.push(p),p.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 p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(Lh.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 p=i(c,l).length;if(u<=p)return{clone:d,used:p};if(n(c)||c.children.length===0)return{clone:d,used:p};let m=p,g=u-m;for(let h of c.children){let f=l+2,b=i(h,f).length;if(g<b)break;let{clone:T,used:C}=a(h,f,g);if(C>g)break;d.children.push(T),T.parent=d,m+=C,g-=C}return{clone:d,used:m}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function O1(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 L1(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?(fc({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?(fc({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 px({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:p,allowedA11yIgnoreReasonsOverride:m,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 b=(H,ce={})=>{},T=r.backendDOMNodeId,C=x1.includes(r.role?.value?.toLowerCase()??"");if(!C&&T===void 0)return b("Filtering out node since it doesn't exist in the DOM"),[];let x=T?i.backendIdToNode[T]:void 0;if(!C&&!x)try{let H=await z(g.send({method:"DOM.describeNode",params:{backendNodeId:T}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if(H&&H.node.nodeName.toLowerCase()==="slot"&&H.node.distributedNodes?.length)h.debug({redirectedDomNode:x,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:H},"Redirecting node to assigned slot");else return b("Filtering out node since it doesn't exist in the DOM",{cdpResult:H}),[]}catch(H){return b("Filtering out node since it doesn't exist in the DOM",{err:H}),[]}if(x&&e&&l&&u&&r.backendDOMNodeId&&!L1(x,u,h,f))return x.momenticIgnored=!0,[];if(x&&x.computedStyles.display==="none")return x.momenticIgnored=!0,[];if(x&&x.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&x.tagName.toLowerCase()!=="input")return x.momenticIgnored=!0,[];if(c===!1)return x.momenticIgnored=!0,[]}let w=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",O=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",v=new Ph({domNode:x,id:parseInt(r.nodeId),role:r.role?.value||"",name:w,nameSources:r.name?.sources,content:O,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(H=>(m??cx).includes(H.name)||ux.includes(H.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+O1(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),M=n,k=a[t],V=t;if(x?.tagName.toLowerCase()==="iframe"&&x.ownedFrameId){let H=n.childFrames.find(Je=>Je.frameId===x.ownedFrameId),ce=o[H?.frameId??""]?.root,ge=a[H?.frameId??""];if(H&&ce&&ge){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Je=ce;r.childIds=Je.childIds,M=H,k=ge,V=H.frameId}}let J=x?.childrenBackendIds?.length??0,te=(r.childIds??[]).filter(H=>!!k.get(parseInt(H))).length;if(J>te){let H=r.childIds?.map(ge=>k.get(parseInt(ge))).filter(Boolean).map(ge=>ge?.backendDOMNodeId).filter(ge=>ge!==void 0)??[],ce=0;for(let ge of x?.childrenBackendIds??[]){if(H.includes(ge)){ce=(r.childIds?.findIndex(Fe=>k.get(parseInt(Fe))?.backendDOMNodeId===ge)??0)+1;continue}let Je=i.backendIdToNode[ge];if(!Je||Je?.tagName.toLowerCase()!=="svg")continue;let xe=Math.floor(-1*Math.random()*1e7),Kt={nodeId:xe.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:ge,frameId:V,role:{type:"string",value:"graphics-symbol"}};k.set(xe,Kt),r.childIds||(r.childIds=[]),r.childIds.splice(ce,0,xe.toString()),ce++}}if(r.childIds?.length===1&&x){let H=k.get(parseInt(r.childIds[0])),ce=H?.role?.value,ge=x.childrenBackendIds;if(H&&ce==="StaticText"&&ge.length===1){let Je=i.backendIdToNode[ge[0]];if(Je?.tagName?.toLowerCase()==="span"){let xe=Math.floor(-1*Math.random()*1e7).toString(),Kt={nodeId:xe,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Je.backendNodeId,frameId:V,childIds:[H.nodeId]};H.parentId=xe,k.set(parseInt(xe),Kt),r.childIds=[xe]}}}for(let H of r.childIds??[]){if(!H)continue;let ce=k.get(parseInt(H));if(!ce)continue;let ge=await px({node:ce,parent:v,domGraph:i,axGraph:o,frameId:V,frameContext:M,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});ge.length&&(v.children=v.children.concat(ge))}if(v.role==="StaticText"&&(v.children=[]),v.children.length===1&&v.children[0].role==="StaticText"){let H=v.name,ce=v.children[0]?.name;(H===ce||!ce)&&(v.children=[])}let Et=[];for(let H=v.children.length-1;H>=0;H--){let ce=v.children[H];if(ce.role!=="StaticText"){Et.push(ce);continue}if(H===0||v.children[H-1].role!=="StaticText"){Et.push(ce);continue}v.children[H-1].name+=ce.name}if(v.children=Et.reverse(),!v.isInteresting(p)&&r.parentId)return x&&(x.momenticIgnored=!0),v.children;for(let H of v.children)H.parent=v;return k1(v),x&&d&&_h(x,i),[v]}function mx({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:Lh.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 p=Mh(d,i),m=p?c[p.hash]:void 0,g=m?m.description:void 0;m&&(r.properties["data-momentic-description"]=g)}for(let p of r.children)l=mx({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function gx({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:p,allowedA11yIgnoreReasonsOverride:m}){let g=t??"root",h=r[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=E1(),b=v=>{let M=v.allNodes.filter(V=>!V.ignoredReasons?.find(te=>(m??cx).includes(te.name))),k=new Map;return M.forEach(V=>{k.set(parseInt(V.nodeId),V)}),k},T={};Object.entries(r).forEach(([v,M])=>{T[v]=b(M)});let C=await px({node:h,domGraph:e,parent:null,inputNodeMap:T,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:m});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 x={},w={},O={};return mx({node:C[0],a11yIdNodeMap:x,dataMomenticIdMap:w,selectorToNodeMap:O,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new Oh(C[0],x,w,O)}function N1(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<dx&&!yr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(hx(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 D1(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||A1.includes(a);if((yr.relevantElementAttributes.includes(a)||fx(a,t))&&!c){let u=N1(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&ax.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of ax)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],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function k1(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(yt(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 m=u.children.filter(g=>g.tagName==="th");if(m.length){if(i=m.map(g=>yt(g.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,g)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=g+1),p&&(m.properties.col||(m.properties.col=i[g])))})}}}function U1(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function hx(r,e){if(e&&Sx(r,e))return!0;if(yr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(yr.alwaysInterestingClassNames.includes(r))return!0;for(let t of yr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function fx(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 Sx(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 Vu=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 E("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await j(pt),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 E("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 E("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 E("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 Qi="<empty>";function F1(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 Ex(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||F1(r.url)}async function B1(r,e){let t=await r.send({timeout:oe,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:oe,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:oe,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Zi({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:Ji,method:"Page.getFrameTree",params:{}}),r.send({timeout:Ji,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(Ex(d.frame))return null;try{return await Tx({cdpClient:r,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),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 Tx({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await B1(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Zn(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},m=(e.childFrames??[]).map(async(g,h)=>{if(Ex(g.frame))return null;try{return await Tx({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(m)).filter(g=>g!==null),d}async function z1(r){try{return await r.owner().count()===1}catch{return!1}}async function H1(r){try{return await r.count()===1}catch{return!1}}async function tn(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,Qi]){let p=o.frameLocator(d===Qi?"iframe":`iframe[${d}]`);if(await z1(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new E("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,Qi]){let u=o.locator(l===Qi?"iframe":`iframe[${l}]`);if(await H1(u)){a=u,i.push(l);break}}if(!a)throw new E("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:ae}),c=await s.asElement().contentFrame();if(!c)throw new E("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function yx(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 vx({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===Qi?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===Qi?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 tn(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=yx(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 tn(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=yx(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 tn(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 tn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Br("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function Wu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Nh(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function Ax(r){let e=Nh(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 Rx(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 wx({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await G1({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 G1({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox(),i=await $s({promiseGenerator:async()=>r.evaluate(async a=>{let s=a.scrollTop,c=a.getBoundingClientRect(),l=0,u=0,d=window.innerWidth,p=window.innerHeight;if(c.top>=l&&c.left>=u&&c.bottom<=p&&c.right<=d)return{didScroll:!1,reason:"already-fully-visible"};a.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(b=>setTimeout(b,250));let g=Date.now();for(;Date.now()-g<1e3;){let b=a.scrollTop;if(b===s)break;s=b,await new Promise(T=>setTimeout(T,250))}let h=a.getBoundingClientRect();return h.top!==c.top||h.left!==c.left||h.right!==c.right||h.bottom!==c.bottom?{didScroll:!0,reason:"scrolled",afterRect:h}:{didScroll:!1,reason:"no-more-scroll-possible",afterRect:h}}),timeoutMs:Re,codePath:"scrollIframeIntoView",signal:t});i.didScroll&&e.info({oldBb:n,newBb:await r.boundingBox(),evalResult:i},"Successfully scrolled iframe into view")}import{create as V1,windowedFiniteBatchScheduler as W1}from"@yornaath/batshit";import{reduce as j1}from"lodash-es";var $1=100,q1=2e3;function Cx(r){return V1({fetcher:async t=>{r(j1(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:W1({windowMs:q1,maxBatchSize:$1})})}async function xx({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 p,m;if(l)try{let g=await n.frameElement();p=await z(g?.boundingBox(),{milliseconds:oe})??void 0;let h=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)m={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"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as rn}from"crypto";import K1 from"js-beautify";var Y1=["Dead"],ju=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:rn(),type:"PRESET_ACTION",command:un(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=un(i);a={id:rn(),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=un(i);a={id:rn(),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=un(i);a={id:rn(),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:ve(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=K1.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=cC(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(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,...ve(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,g=m?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,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(Y1.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=un("TYPE");i={id:rn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=un("PRESS");i={id:rn(),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,p=i.command.value;i={id:rn(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},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:rn(),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=un(l);u.deltaY=Math.abs(i);let d={id:rn(),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=un(l);u.deltaX=Math.abs(i);let d={id:rn(),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 Dh}from"zod";var ECe=Dh.object({type:Dh.literal("url"),url:Dh.string()});var $u=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 p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let g=m[0]?.trim(),h=m[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:p},"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=Nh(e),{frame:o,mPathSelectorTokens:i}=await tn(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 Zi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await vx({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(Wu(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:Wu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await wx({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Zi({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[z(n.evaluate(e,t),{milliseconds:Re})],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(tn(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Re})).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 Zi({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 br({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new E("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await br({fn:()=>Zi({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 br({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 br({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await br({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 br({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(p=>p>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:Hn,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=nx({node:o,domGraph:this.domGraph});return ox(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:Re});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await ix(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(_r(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 Zi({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 E&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await j(pt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Wu(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=Zn(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 tn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await tn(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 E("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 gx({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 tn(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:Re,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(Zn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Zn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:oe,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:oe,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:oe,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(m){i.warn({err:m},"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 m=0;m<3;m++)try{l=await br({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),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:m,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 ${m.frameId} with url ${m.url}, allowing it to be fetched: ${h}`)}d.push(...m.childFrames);let g=async()=>{try{let h=await br({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=h}catch(h){i.warn({err:h,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(g())}return await Promise.all(p),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 br({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 br({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Re}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await br({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:oe}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await j(pt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new E("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 rx({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=Ax(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 Zs=class r{static USER_AGENT=ku;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:p,onVideoPageChange:m}){ST(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=p,this.onVideoPageChange=m}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={[Nu]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(zC(t))),a.push(this.context.addInitScript({content:`${Qg.htmlUtilsLibJs}
4352
- //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Eh(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 p=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${Qg.htmlUtilsLibJs}
4353
- //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Eh(i,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"),c=!0;else throw m}(o??{})["add-init-scripts"]=Date.now()-p};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&nH()==="darwin"&&J1("system_profiler SPDisplaysDataType").toString().includes("Retina"))R.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 p=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-p};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 Vu.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 $u({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 FC(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 p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}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 Ch(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=qu(),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()||!Bo(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=qu(),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=>{vC(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(wC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=Cx(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await mh({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("**/*",IC(this.customHeaders,this.logger))),Wr&&await e.route("**/*",Xs),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"||!Bo(t))return;let i=this.recentFrameNavigations[o];if(i&&Date.now()-i<1e3)return;this.recentFrameNavigations[o]=Date.now();let a=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(c){this.logger.warn({err:c},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>a())}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(Ah(this.getBrowserCallbacks()),{milliseconds:ae})}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<Ji;){a++,n?.throwIfAborted();try{if(await at({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:ae,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(pt),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:oe,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(zo),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??Re}),c=Buffer.from(s.data,"base64"),l=await _x.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&&eH(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:oe});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:g,width:h,height:f}=p;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let b=await _x.fromBuffer(c),T=b.bitmap.width,C=b.bitmap.height;m=Math.max(0,Math.min(m,T-1)),g=Math.max(0,Math.min(g,C-1)),h=Math.max(1,Math.min(h,T-m)),f=Math.max(1,Math.min(f,C-g)),c=await b.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(b){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${b}`)}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}){zw(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(pt),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:ae})}if(!i)throw new E("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(gC.has(s))throw new E("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:ae,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 $C({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(zo),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??aS}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Re})}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:Re})}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:ae}),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 TC(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 c of e.cookies??[]){let l=await this.setCookie(c);t=t.concat(l)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:ae});let n=0,o=[];for(let c of e.origins??[])for(let l of c.localStorage)try{await this.cdpClient.send({timeout:ae,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(c.origin).origin,isLocalStorage:!0},key:l.name,value:l.value}}),n++}catch(u){o.push({key:l.name,origin:c.origin,err:u});continue}o.length>0&&this.logger.warn({failedOrigins:o,currentPageUrl:this.page.url()},"Failed to set localStorage for entries, continuing..."),this.logger.info(`Loaded ${n} local storage entries`);let i={},a=0;for(let c of e.origins??[])if(c.sessionStorage&&c.sessionStorage.length>0){let l={};for(let u of c.sessionStorage)l[u.name]=u.value,a++;i[new URL(c.origin).origin]=l}a>0&&await this.context.addInitScript(({storageByOrigin:c,markerKey:l})=>{let u=window.location.origin,d=c[u];if(d&&!window.sessionStorage.getItem(l)){for(let[p,m]of Object.entries(d))window.sessionStorage.setItem(p,m);window.sessionStorage.setItem(l,"1")}},{storageByOrigin:i,markerKey:vh}),this.logger.info(`Loaded ${a} session storage entries`);let s=e.idb;s&&Object.keys(s).length>0&&(await EC(this.page,s,this.logger),this.logger.info(`Loaded ${Object.keys(s??{}).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 bC(this.page,this.logger),await GC(this.page,o,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 E("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Ch(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 zr)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(!th.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:oe})),!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}),u=qu(),{universalHandle:d}=await this.storage.createOnDemandScreenshot(u,l,"image/jpeg");return e.screenshotUrl=d,{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:oe});if(!s||!s.width||!s.height)throw new E("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:oe});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||yr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:oe});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 E("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new E("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,p,m;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let T=c.parentFrame,{cache:C,config:x}=await this.stateManager.getAutoFrameDetailsFromHandle(T);d=C,p=x,u=x.frame,m="auto iframe"}else c.parentFrame&&l?(p=l,u=await this.getActivePageOrFrame(),m="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),m="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:ve(i),frameCache:d},f,b=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:Rx(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),b=!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:p,frameConfigSource:m}}finally{b&&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 m,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){m=f,await j(pt,a)}if(!g)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,p;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:m,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(g){if(g instanceof Ba)break;if(g instanceof zr){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(pt,a)}a?.throwIfAborted(),m&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await j(pt,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=[],l,u=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),d;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(m){d=m,m instanceof Br&&(c.push(...m.decisions),l=m.cacheMissReason)}if(p)return{...p,pageState:void 0,decisions:[...c,...p.decisions]};n||(c.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:Qs(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw d;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:u,target:t,decisions:c,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=ve(o),p;l=l??"secondary-resolution-failed"}throw new Br("Could not find any relevant node given target",c,l)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Ba("Insufficient data to resolve target using primary methods (missing node HTML)");let a={x:0,y:0};if(HC(e)){let O=await(await e.frameElement()).boundingBox();O&&(a=O)}let s=i?n:Hn,c=this.userControlledBrowserSettings.hybridSelectorMode,l={ldistThreshold:eh,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},rootBoundingBox:a},{css:u,hybrid:d}=await at({fn:O=>window.evaluatePrimaryCaches(O),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:l},hybridParams:c&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:l}:void 0},root:e,timeout:oe,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),p,m,g=[];if(c==="prefer"&&d?.result){p=d.result;let O={type:"HYBRID_SELECTOR",matched:!0,logs:d.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};g.push(O),m="HYBRID_SELECTOR"}else if(u?.result){p=u.result;let O=`${p.workingSelectors.length} CSS selectors matched the following element: ${p.serializedElement}`,v=p.workingSelectors.slice(0,5);g.push({type:"CSS_SELECTOR",matched:!0,logs:u.logs,reason:O,selectors:v}),n.debug({reason:O,workingSelectors:v},"Resolved with CSS selectors"),m="CSS_SELECTOR"}else throw g.push({type:"CSS_SELECTOR",matched:!1,reason:u.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:u.logs}),d&&g.push({type:"HYBRID_SELECTOR",matched:!1,reason:d.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:d.logs}),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (CSS)"),d?.error&&n.error({err:new Error(d.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new Br("Cache evaluation failed",g,u.cacheMissReason);let h,f,b;if(this.userBrowserSettings.visualActions){let O=p.mPath;if(!O)throw new Error("Found element did not have an mPath despite using visual actions");let v=O.join(" > ");h=e.locator(v),f=this.stateManager.getNodeUsingMPathSelector(v)}else if(p.dataMomenticId!==void 0)b=parseInt(p.dataMomenticId),f=this.stateManager.dataMomenticIdToNodeMap[b],"workingSelectors"in p?h=e.locator(p.workingSelectors[0]):h=e.locator(_r(b));else throw new E("InternalWebAgentError","Received an element resolution result with no identifying attributes");c&&t.hybridSelector&&(d?.logs.length===1?s.warn({hybridResult:d,cssResult:u,hybridMode:c},"Hybrid selector resolution rejected, continuing..."):d?.result?u?.result&&d?.result&&d.result.serializedElement!==u.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(u.result.mPath)!==JSON.stringify(d.result.mPath)?n.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):u.result.dataMomenticId!==d.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):s.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[T,C]=await Promise.all([h.textContent({timeout:ae}),h.evaluate(O=>O.getBoundingClientRect(),{timeout:ae})]);if((T??"")!==(p.textContent??""))throw n.warn({currentTextContent:T,originalTextContent:p.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(Math.abs(C.height-p.boundingBox.height)>1||Math.abs(C.width-p.boundingBox.width)>1||Math.abs(C.x-p.boundingBox.x)>1||Math.abs(C.y-p.boundingBox.y)>1)throw n.warn({currentBoundingBox:C,originalBoundingBox:p.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 x=Qs(t);await this.updateCacheWithNewNodeDetails({node:f,target:t,locator:h,logger:n,startingBoundingBox:p.boundingBox,allowNotActionableNodesOverride:o});let w=kh(x,t);return w&&Object.keys(w).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(n),t.cacheResolutionUpdateSource=m),{a11yNode:f,displayString:p.serializedElement,locator:h,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 p=s.locator(n),m;try{return await p.waitFor({state:"attached",timeout:ae}),m=await Ir(p,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:p,displayString:m,decisions:d}}catch(g){let h=g.message;u=new E("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(pt,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:oe});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<mC){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:Re,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(eh*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,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(_r(d));else if(l.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),m=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 Ir(m,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=Qs(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=kh(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(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:m,a11yNode:p,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&&th.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshot: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}`}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshot: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}),s;if(typeof e=="string"){let T=await fetch(e);s=Buffer.from(await T.arrayBuffer())}else({data:s}=await this.storage.fetchOnDemandScreenshot(e));let c=aH(),l=await this.enricher.runTemplateMatching({id:c,searchImageBase64String:s.toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:u,locator:d}=await this.getTargetFromPositionPercentages({percentX:l.x,percentY:l.y,allowNotActionableNodesOverride:o}),p=u.boundingBox?.width,m=u.boundingBox?.height;if(!p||!m)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=u.id,h=this.stateManager.a11yIdToNodeMap[g],f=Qs(t);await this.updateCacheWithNewNodeDetails({target:t,node:h,locator:d,allowNotActionableNodesOverride:o});let b=kh(f,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:c,diffs:b,templateMatch:l},"Updated cache after template matching resolution")),{locator:d,a11yNode:h,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot"}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:ae})??"",i=jC.some(a=>a===o.toLowerCase());return await Rh({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 Rh({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(),Cu(s,t,n)){a=!0;break}await j(pt,this.abortSignal)}if(!a)throw new E("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${XR(t)} in ${o}ms.
4351
+ ${v||""}`}return b}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:Ih(this.internalProperties),importantProperties:this.importantProperties,parentFrame:this.parentFrame,flagNotActionableNodes:this.flagNotActionableNodes});return e.tagName=this.tagName,e.dataMomenticId=this.dataMomenticId,e.properties=Ih(this.properties),e}},Oh=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 p=a(d);p&&(u.push(p),p.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 p of l){let m=n(p,s||u);m&&(d.push(m),m.parent=c,u=!0)}if(c.children=d,s||u)return c;if(Lh.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 p=i(c,l).length;if(u<=p)return{clone:d,used:p};if(n(c)||c.children.length===0)return{clone:d,used:p};let m=p,g=u-m;for(let h of c.children){let f=l+2,b=i(h,f).length;if(g<b)break;let{clone:T,used:C}=a(h,f,g);if(C>g)break;d.children.push(T),T.parent=d,m+=C,g-=C}return{clone:d,used:m}},{clone:s}=a(t,0,Math.max(1e4,e));return new r(s,this.a11yIdNodeMap,this.dataMomenticIdMap,this.selectorToNodeMap)}};function O1(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 L1(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?(fc({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?(fc({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 px({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:p,allowedA11yIgnoreReasonsOverride:m,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 b=(H,ce={})=>{},T=r.backendDOMNodeId,C=x1.includes(r.role?.value?.toLowerCase()??"");if(!C&&T===void 0)return b("Filtering out node since it doesn't exist in the DOM"),[];let x=T?i.backendIdToNode[T]:void 0;if(!C&&!x)try{let H=await z(g.send({method:"DOM.describeNode",params:{backendNodeId:T}}),{milliseconds:750,fallback:()=>{h.debug("Timeout getting node from CDP while processing a11y tree")}});if(H&&H.node.nodeName.toLowerCase()==="slot"&&H.node.distributedNodes?.length)h.debug({redirectedDomNode:x,parentAXNode:e?.getNodeOnlySerializedForm(),originalAXNode:r,cdpResult:H},"Redirecting node to assigned slot");else return b("Filtering out node since it doesn't exist in the DOM",{cdpResult:H}),[]}catch(H){return b("Filtering out node since it doesn't exist in the DOM",{err:H}),[]}if(x&&e&&l&&u&&r.backendDOMNodeId&&!L1(x,u,h,f))return x.momenticIgnored=!0,[];if(x&&x.computedStyles.display==="none")return x.momenticIgnored=!0,[];if(x&&x.computedStyles.opacity==="0"&&c!==!0){if(c==="inputs-only"&&x.tagName.toLowerCase()!=="input")return x.momenticIgnored=!0,[];if(c===!1)return x.momenticIgnored=!0,[]}let w=r.name?.value?typeof r.name.value=="string"?r.name.value:`${r.name.value}`:"",O=r.value?.value?typeof r.value.value=="string"?r.value.value:`${r.value.value}`:"",v=new Ph({domNode:x,id:parseInt(r.nodeId),role:r.role?.value||"",name:w,nameSources:r.name?.sources,content:O,properties:r.properties,children:[],ignoredReasons:r.ignoredReasons?.filter(H=>(m??cx).includes(H.name)||ux.includes(H.name))??[],pathFromRoot:(e?`${e.pathFromRoot} `:"")+O1(r),backendNodeID:r.backendDOMNodeId,ignoredByCDP:r.ignored,internalProperties:{inCodeMirrorEditor:e?.internalProperties?.inCodeMirrorEditor},importantProperties:p,parentFrame:n.type==="root"?void 0:n,flagNotActionableNodes:s}),M=n,k=a[t],V=t;if(x?.tagName.toLowerCase()==="iframe"&&x.ownedFrameId){let H=n.childFrames.find(Je=>Je.frameId===x.ownedFrameId),ce=o[H?.frameId??""]?.root,ge=a[H?.frameId??""];if(H&&ce&&ge){r.childIds&&r.childIds.length>0&&h.debug("Replacing existing node's children with children from the iframe");let Je=ce;r.childIds=Je.childIds,M=H,k=ge,V=H.frameId}}let J=x?.childrenBackendIds?.length??0,te=(r.childIds??[]).filter(H=>!!k.get(parseInt(H))).length;if(J>te){let H=r.childIds?.map(ge=>k.get(parseInt(ge))).filter(Boolean).map(ge=>ge?.backendDOMNodeId).filter(ge=>ge!==void 0)??[],ce=0;for(let ge of x?.childrenBackendIds??[]){if(H.includes(ge)){ce=(r.childIds?.findIndex(Fe=>k.get(parseInt(Fe))?.backendDOMNodeId===ge)??0)+1;continue}let Je=i.backendIdToNode[ge];if(!Je||Je?.tagName.toLowerCase()!=="svg")continue;let xe=Math.floor(-1*Math.random()*1e7),Kt={nodeId:xe.toString(),parentId:r.nodeId,ignored:!1,backendDOMNodeId:ge,frameId:V,role:{type:"string",value:"graphics-symbol"}};k.set(xe,Kt),r.childIds||(r.childIds=[]),r.childIds.splice(ce,0,xe.toString()),ce++}}if(r.childIds?.length===1&&x){let H=k.get(parseInt(r.childIds[0])),ce=H?.role?.value,ge=x.childrenBackendIds;if(H&&ce==="StaticText"&&ge.length===1){let Je=i.backendIdToNode[ge[0]];if(Je?.tagName?.toLowerCase()==="span"){let xe=Math.floor(-1*Math.random()*1e7).toString(),Kt={nodeId:xe,parentId:r.nodeId,ignored:!1,backendDOMNodeId:Je.backendNodeId,frameId:V,childIds:[H.nodeId]};H.parentId=xe,k.set(parseInt(xe),Kt),r.childIds=[xe]}}}for(let H of r.childIds??[]){if(!H)continue;let ce=k.get(parseInt(H));if(!ce)continue;let ge=await px({node:ce,parent:v,domGraph:i,axGraph:o,frameId:V,frameContext:M,inputNodeMap:a,cdpClient:g,logger:h,callId:f,filterByViewport:l,showZeroOpacityElements:c,importantProperties:p,viewportDetails:u,useMPaths:d,flagNotActionableNodes:s});ge.length&&(v.children=v.children.concat(ge))}if(v.role==="StaticText"&&(v.children=[]),v.children.length===1&&v.children[0].role==="StaticText"){let H=v.name,ce=v.children[0]?.name;(H===ce||!ce)&&(v.children=[])}let Et=[];for(let H=v.children.length-1;H>=0;H--){let ce=v.children[H];if(ce.role!=="StaticText"){Et.push(ce);continue}if(H===0||v.children[H-1].role!=="StaticText"){Et.push(ce);continue}v.children[H-1].name+=ce.name}if(v.children=Et.reverse(),!v.isInteresting(p)&&r.parentId)return x&&(x.momenticIgnored=!0),v.children;for(let H of v.children)H.parent=v;return k1(v),x&&d&&_h(x,i),[v]}function mx({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:Lh.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 p=Mh(d,i),m=p?c[p.hash]:void 0,g=m?m.description:void 0;m&&(r.properties["data-momentic-description"]=g)}for(let p of r.children)l=mx({node:p,a11yIdNodeMap:e,dataMomenticIdMap:t,logger:n,callId:o,startId:l,useMPaths:a,domGraph:i,selectorToNodeMap:s,iconKnowledgeBase:c});return l}async function gx({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:p,allowedA11yIgnoreReasonsOverride:m}){let g=t??"root",h=r[g]?.root;if(!h)throw new Error("A11y tree has no root");let f=E1(),b=v=>{let M=v.allNodes.filter(V=>!V.ignoredReasons?.find(te=>(m??cx).includes(te.name))),k=new Map;return M.forEach(V=>{k.set(parseInt(V.nodeId),V)}),k},T={};Object.entries(r).forEach(([v,M])=>{T[v]=b(M)});let C=await px({node:h,domGraph:e,parent:null,inputNodeMap:T,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:m});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 x={},w={},O={};return mx({node:C[0],a11yIdNodeMap:x,dataMomenticIdMap:w,selectorToNodeMap:O,domGraph:e,logger:n,callId:f,useMPaths:u,iconKnowledgeBase:p}),new Oh(C[0],x,w,O)}function N1(r,e,t,n){if(r==="class"){if(t.tagName?.toLowerCase()==="svg")return e.split(" ").filter(a=>a.length<dx&&!yr.bannedClassSubstrings.some(s=>a.includes(s))).slice(0,3).join(" ");let o=e.split(" "),i=[];for(let a of o)if(hx(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 D1(r,e,t){if(!e)return;Object.entries(e.attributes).forEach(([a,s])=>{let c=r[a]||a.startsWith("aria")||A1.includes(a);if((yr.relevantElementAttributes.includes(a)||fx(a,t))&&!c){let u=N1(a,s,e,t);u!==null&&(r[a]=u)}});let n,o=[];if(e.computedStyles.position&&ax.includes(e.computedStyles.position))n=e.computedStyles.position;else if(e.attributes.style){for(let a of ax)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],p=`${c}: ${d}`;o.includes(p)||o.push(p)}}o.length>0&&(r.style=o.join("; "))}function k1(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(yt(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 m=u.children.filter(g=>g.tagName==="th");if(m.length){if(i=m.map(g=>yt(g.name,100,!1)),i.length===m.length)continue;i=void 0}}s+=1,u.properties["row-index"]||(u.properties["row-index"]=s);let d=u.children.filter(m=>m.tagName==="td"||m.tagName==="th"),p=d.length===i?.length;d.forEach((m,g)=>{m.tagName!=="th"&&(m.properties["col-index"]||(m.properties["col-index"]=g+1),p&&(m.properties.col||(m.properties.col=i[g])))})}}}function U1(r){let e=r.properties.class,t=typeof e=="string"&&e.includes("cm-content");r.internalProperties.inCodeMirrorEditor=r.internalProperties?.inCodeMirrorEditor||t}function hx(r,e){if(e&&Sx(r,e))return!0;if(yr.bannedClassSubstrings.some(t=>r.includes(t)))return!1;if(yr.alwaysInterestingClassNames.includes(r))return!0;for(let t of yr.alwaysInterestingClassPrefixes)if(r.startsWith(t))return!0;return!1}function fx(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 Sx(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 Vu=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 E("UserInfrastructureError",`Failed to initialize Chrome session within the page load timeout (${a.url()})`)}});break}catch(d){await j(pt),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 E("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 E("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 E("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 Qi="<empty>";function F1(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 Ex(r){let e=r.adFrameStatus?.adFrameType;return e==="child"||e==="root"||F1(r.url)}async function B1(r,e){let t=await r.send({timeout:oe,method:"DOM.getFrameOwner",params:{frameId:e}}),o=(await r.send({timeout:oe,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[t.backendNodeId]}})).nodeIds[0],a=(await r.send({timeout:oe,method:"DOM.describeNode",params:{backendNodeId:t.backendNodeId}})).node;return a.nodeId=o,a}async function Zi({cdpClient:r,page:e,logger:t}){let n={type:"root",childFrames:[],page:e},o=[],[i,a]=await Promise.all([r.send({timeout:Ji,method:"Page.getFrameTree",params:{}}),r.send({timeout:Ji,method:"DOM.getDocument",params:{depth:0}})]),l=(i.frameTree.childFrames??[]).map(async(d,p)=>{if(Ex(d.frame))return null;try{return await Tx({cdpClient:r,rawFrameTree:d,indices:[p],parent:n,warnings:o,logger:t})}catch(m){return o.push(`Failed to get child frame: ${m}`),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 Tx({cdpClient:r,rawFrameTree:e,indices:t,parent:n,warnings:o,logger:i}){let a=e.frame.id,s=await B1(r,a),c=s.attributes??[],l=null,u=[];for(let g of["src","name","id","title","srcdoc","sandbox"]){let h=Zn(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},m=(e.childFrames??[]).map(async(g,h)=>{if(Ex(g.frame))return null;try{return await Tx({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(m)).filter(g=>g!==null),d}async function z1(r){try{return await r.owner().count()===1}catch{return!1}}async function H1(r){try{return await r.count()===1}catch{return!1}}async function tn(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,Qi]){let p=o.frameLocator(d===Qi?"iframe":`iframe[${d}]`);if(await z1(p)){u=!0,o=p,i.push(d);break}}if(!u)throw new E("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,Qi]){let u=o.locator(l===Qi?"iframe":`iframe[${l}]`);if(await H1(u)){a=u,i.push(l);break}}if(!a)throw new E("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:ae}),c=await s.asElement().contentFrame();if(!c)throw new E("InternalWebAgentError",`Failed to load Playwright Frame for iframe with url '${r.url}'`);return await s.dispose(),{frame:c,mPathSelectorTokens:i}}function yx(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 vx({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===Qi?s=s.length===1?s[0].childFrames:[]:s=s.filter(p=>p.locationData.attributeSelectors.includes(d)).map(p=>p.childFrames).flat()}let c=[],l=t.mPathSelectorTokens[t.mPathSelectorTokens.length-1];if(l===Qi?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 tn(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=yx(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 tn(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=yx(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 tn(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 tn(n,r)).frame,handle:n,mPathSelectorTokens:t.mPathSelectorTokens,frameTree:e},logs:i};throw i.push(`Found ${a.length} frames with indices ${t.indices}`),new Br("Failed to find the iframe that previously contained this element",[{type:"AUTO_FRAME",matched:!1,logs:i}],"could-not-find-iframe")}function Wu(r){return r.type==="auto"?JSON.stringify({type:"auto",frameId:r.handle.frameId}):JSON.stringify(r)}function Nh(r){for(;r.parent.type==="frame";)r=r.parent;return r.parent}function Ax(r){let e=Nh(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 Rx(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 wx({frame:r,logger:e,signal:t}){let n;try{n=await r.frameElement(),await G1({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 G1({frameElementHandle:r,logger:e,signal:t}){let n=await r.boundingBox(),i=await Ks({promiseGenerator:async()=>r.evaluate(async a=>{let s=a.scrollTop,c=a.getBoundingClientRect(),l=0,u=0,d=window.innerWidth,p=window.innerHeight;if(c.top>=l&&c.left>=u&&c.bottom<=p&&c.right<=d)return{didScroll:!1,reason:"already-fully-visible"};a.scrollIntoView({behavior:"instant",block:"center",inline:"center"}),await new Promise(b=>setTimeout(b,250));let g=Date.now();for(;Date.now()-g<1e3;){let b=a.scrollTop;if(b===s)break;s=b,await new Promise(T=>setTimeout(T,250))}let h=a.getBoundingClientRect();return h.top!==c.top||h.left!==c.left||h.right!==c.right||h.bottom!==c.bottom?{didScroll:!0,reason:"scrolled",afterRect:h}:{didScroll:!1,reason:"no-more-scroll-possible",afterRect:h}}),timeoutMs:Re,codePath:"scrollIframeIntoView",signal:t});i.didScroll&&e.info({oldBb:n,newBb:await r.boundingBox(),evalResult:i},"Successfully scrolled iframe into view")}import{create as V1,windowedFiniteBatchScheduler as W1}from"@yornaath/batshit";import{reduce as j1}from"lodash-es";var $1=100,q1=2e3;function Cx(r){return V1({fetcher:async t=>{r(j1(t,(n,o)=>({...n,...o}),{}))},resolver:()=>{},scheduler:W1({windowMs:q1,maxBatchSize:$1})})}async function xx({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 p,m;if(l)try{let g=await n.frameElement();p=await z(g?.boundingBox(),{milliseconds:oe})??void 0;let h=await t.constructIframeRegex({urls:d,srcs:[],desiredUrl:l});if(h.urlRegex)m={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"),m={type:"url",url:l}}(async()=>{try{await e.recordElementAction({...r,screenshotBase64:o,frameConfig:m,frameBoundingBox:p})}catch(g){i.error({err:g},"Failed to transform passive click action")}})()}import{randomUUID as rn}from"crypto";import K1 from"js-beautify";var Y1=["Dead"],ju=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:rn(),type:"PRESET_ACTION",command:un(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=un(i);a={id:rn(),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=un(i);a={id:rn(),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=un(i);a={id:rn(),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:ve(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=K1.html(d,{indent_size:1,indent_with_tabs:!1,preserve_newlines:!1}),d=cC(d,"data-momentic-interacted",4e4)}catch{}let p;try{p=(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,...ve(this.logger)}})).phrase}catch(h){this.logger.error({err:h},"Error generating reverse mapping description"),p=s}let m=this.recordedSteps.get(u)?.step??a,g=m?.command;g&&"target"in g&&g.target?(g.target={type:"description",elementDescriptor:p},this.callbacks.onStepRecorded({...m,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(Y1.includes(t)||this.signal.aborted)return;let o="normal";t.length>1&&(o="special");let i;if(o==="normal"){let d=un("TYPE");i={id:rn(),type:"PRESET_ACTION",command:{...d,target:void 0,value:t,clearContent:!1}}}else{let d=un("PRESS");i={id:rn(),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,p=i.command.value;i={id:rn(),type:"PRESET_ACTION",command:{...u,value:i.command.type==="PRESS"?`${d}+${p}`:`${d}${p}`}},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:rn(),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=un(l);u.deltaY=Math.abs(i);let d={id:rn(),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=un(l);u.deltaX=Math.abs(i);let d={id:rn(),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 Dh}from"zod";var vCe=Dh.object({type:Dh.literal("url"),url:Dh.string()});var $u=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 p of this.userControlledBrowserSettings.importantStyles){let m=p.split(":");if(m.length!==2){this.logger.warn({style:p},"Invalid style property passed to importantStyles");continue}let g=m[0]?.trim(),h=m[1]?.trim();if(g===void 0||h===void 0){this.logger.warn({style:p},"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=Nh(e),{frame:o,mPathSelectorTokens:i}=await tn(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 Zi({cdpClient:this.cdpClient,page:t,logger:this.logger}),{resolution:o,logs:i}=await vx({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(Wu(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:Wu(this.frameConfig),cacheTime:Date.now(),frameTree:this.frameConfig.frameTree,mPathSelectorTokens:this.frameConfig.mPathSelectorTokens},await wx({frame:n.frame,logger:e,signal:t}),this.activeFrameCache=n,n}async executeFunctionInAllFrames(e,t){let n=this.pageGetter(),o=await Zi({cdpClient:this.cdpClient,page:n,logger:this.logger}),i=[z(n.evaluate(e,t),{milliseconds:Re})],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(tn(c,n).then(({frame:u})=>z(u.evaluate(e,t),{milliseconds:Re})).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 Zi({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 br({fn:()=>this.resolveActiveFrameConfig({logger:n,signal:o}),codePath:"getActiveFrameDetails",logObject:t,signal:o,logger:n})??void 0,!a)throw new E("ActionFailureError","Got null frame details despite active frame config");s=a.handle,c=s.frameId}else this.userControlledBrowserSettings.autoExpandIframes?(s=await br({fn:()=>Zi({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 br({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 br({fn:()=>this.getDOMTree({devicePixelRatio:e.devicePixelRatio??1,signal:o,logger:n}),codePath:"domFetch",logObject:t,signal:o,logger:n}),u=await br({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 br({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(p=>p>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:Hn,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=nx({node:o,domGraph:this.domGraph});return ox(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:Re});if(!n||!n.object.objectId)throw new Error(`Could not resolve backend node ${t}`);let o;try{o=await ix(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(Ir(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 Zi({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 E&&l.reason==="UserInfrastructureError")throw l;c%3===0&&this.logger.warn({attempt:c,err:l},"Failed to resolve active frame, retrying..."),await j(pt,t)}finally{c++}if(a)return{source:"url",frame:a.frame,handle:a.handle,frameIdentifierStringified:Wu(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=Zn(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 tn(s,o)});break}}else if(n.trim()===d.trim()){a.push({handle:s,matchType:"url",...await tn(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 E("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 gx({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 tn(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:Re,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(Zn(t,"aria-hidden")==="true")return{shouldUnroll:!1,reason:"aria-hidden"};let n=Zn(t,"style");if(n?.includes("display: none")||n?.includes("visibility: hidden"))return{shouldUnroll:!1,reason:"hidden CSS style"};await this.cdpClient.send({timeout:oe,method:"DOM.pushNodesByBackendIdsToFrontend",params:{backendNodeIds:[e.backendNodeId]}});let[o,i]=await Promise.all([this.cdpClient.send({timeout:oe,method:"DOM.getBoxModel",params:{backendNodeId:e.backendNodeId}}),this.cdpClient.send({timeout:oe,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(m){i.warn({err:m},"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 m=0;m<3;m++)try{l=await br({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),p=[];for(;d.length>0;){let m=d.shift();try{let{shouldUnroll:h}=await this.decideChildFrameUnrollEligibility({handle:m,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 ${m.frameId} with url ${m.url}, allowing it to be fetched: ${h}`)}d.push(...m.childFrames);let g=async()=>{try{let h=await br({fn:()=>this.getRawA11yTreeForFrame({frameId:m.frameId,timeoutMs:this.smartWaitingTimeoutMs,logTimings:o}),codePath:`a11y-tree-fetch-child-${m.frameId}`,logObject:o,logger:i});u[m.frameId]=h}catch(h){i.warn({err:h,url:m.url,src:m.src},`Error getting raw a11y tree for child frame ${m.frameId}, continuing...`)}};p.push(g())}return await Promise.all(p),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 br({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 br({fn:()=>this.cdpClient.send({method:"Accessibility.getRootAXNode",params:{frameId:e??void 0},timeout:Re}),codePath:"cdp-get-root-ax-node",logObject:n,logger:this.logger})).node.backendDOMNodeId;o=(await br({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:oe}),!o||!o.documents.length)throw new Error("Got empty DOM tree")}catch(s){await j(pt,t),i++,a=s}if(!o||!o.documents.length)throw n.error({err:a},"Fatal error fetching DOM tree"),new E("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 rx({snapshot:o,devicePixelRatio:e,computedStylesToFetch:this.computedStylesToFetch,logger:n})}constructIframeRegexAsync(e,t){if(t.frameSrcRegex||t.frameUrlRegex)return;let n=Ax(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 Zs=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:p,onVideoPageChange:m}){ST(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=p,this.onVideoPageChange=m}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={[Du]:this.userBrowserSettings.visualActions},a=[];this.userControlledBrowserSettings.extraHeaders&&a.push(this.context.setExtraHTTPHeaders(this.userControlledBrowserSettings.extraHeaders)),e&&a.push(this.context.grantPermissions(zC(t))),a.push(this.context.addInitScript({content:`${Zg.htmlUtilsLibJs}
4352
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.context.addInitScript({content:Eh(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 p=Date.now();try{await Promise.all([this.page.addScriptTag({content:`${Zg.htmlUtilsLibJs}
4353
+ //# sourceURL=momentic-injected/browser-scripts.js`}),this.page.addScriptTag({content:Eh(i,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"),c=!0;else throw m}(o??{})["add-init-scripts"]=Date.now()-p};a.push(d())}if(!this.properties.systemDevicePixelRatio)if(process.env.MOMENTIC_LOCAL_DEV==="1"&&nH()==="darwin"&&J1("system_profiler SPDisplaysDataType").toString().includes("Retina"))R.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 p=Date.now();this.properties.systemDevicePixelRatio=await this.page.evaluate(()=>window.devicePixelRatio),(o??{})["fetch-dpr"]=Date.now()-p};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 Vu.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 $u({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 FC(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 p=Date.now();l=await c.evaluate(()=>({width:window.innerWidth,height:window.innerHeight})),s["eval-viewport"]=Date.now()-p}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 Ch(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=qu(),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()||!Bo(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=qu(),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=>{vC(e,o,this.debugData,a,this.logger)});let i=async()=>{!this.userBrowserSettings.disableBrowserMonitoring&&!this.userControlledBrowserSettings.disableNetworkLogs&&(wC(this.logger,t,this.clientCallbacks?.onNetworkPage,e),!this.harBatcher&&this.clientCallbacks?.onNetworkLogs&&(this.harBatcher=Cx(this.clientCallbacks.onNetworkLogs)),await e.route("**/*",async(a,s)=>{await mh({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("**/*",IC(this.customHeaders,this.logger))),Wr&&await e.route("**/*",Xs),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"||!Bo(t))return;let i=this.recentFrameNavigations[o];if(i&&Date.now()-i<1e3)return;this.recentFrameNavigations[o]=Date.now();let a=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(c){this.logger.warn({err:c},"Failed to collect SVGs on page, continuing...")}})()},5e3),this.transformer&&await this.injectKnowledgeBaseIntoBrowser(e))}catch(s){s.name!=="AbortError"&&this.logger.warn({err:s,url:t,codePath:o},"Failed to handle frame navigation event, continuing...")}};this.addToPageLoadPromises(o,async()=>a())}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(Ah(this.getBrowserCallbacks()),{milliseconds:ae})}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<Ji;){a++,n?.throwIfAborted();try{if(await at({fn:()=>{let c=window;return!!(c.generateCssSelectors&&c.evaluateCssSelectors&&c.evaluatePrimaryCaches&&c.generateHtmlCacheAttributes&&c.ldist)},timeout:ae,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(pt),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:oe,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(zo),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??Re}),c=Buffer.from(s.data,"base64"),l=await _x.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&&eH(n,c),this.lastScreenshotForRecording=c,!e)return c;let p=await e.boundingBox({timeout:oe});if(!p)throw new Error("Attempted to screenshot an element that is not visible on the page");let{x:m,y:g,width:h,height:f}=p;if(!h||!f)throw new Error("Attempted to screenshot an element with zero width or height");m=Math.floor(m),g=Math.floor(g),h=Math.floor(h),f=Math.floor(f);try{let b=await _x.fromBuffer(c),T=b.bitmap.width,C=b.bitmap.height;m=Math.max(0,Math.min(m,T-1)),g=Math.max(0,Math.min(g,C-1)),h=Math.max(1,Math.min(h,T-m)),f=Math.max(1,Math.min(f,C-g)),c=await b.crop({x:m,y:g,w:h,h:f}).getBuffer("image/jpeg")}catch(b){throw new Error(`Failed taking element screenshot at coordinates (${m}, ${g}) with size (${h}, ${f}): ${b}`)}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}){iC(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(pt),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:ae})}if(!i)throw new E("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(gC.has(s))throw new E("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:ae,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 $C({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(zo),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??aS}),t.pressEnter&&await this.press("Enter",{})}async scrollIntoViewIfNeeded(e){try{await e.scrollIntoViewIfNeeded({timeout:Re})}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:Re})}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:ae}),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 TC(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 c of e.cookies??[]){let l=await this.setCookie(c);t=t.concat(l)}this.logger.info(`Loaded ${e.cookies?.length??0} cookies`),await this.cdpClient.send({method:"DOMStorage.enable",params:void 0,timeout:ae});let n=0,o=[];for(let c of e.origins??[])for(let l of c.localStorage)try{await this.cdpClient.send({timeout:ae,method:"DOMStorage.setDOMStorageItem",params:{storageId:{securityOrigin:new URL(c.origin).origin,isLocalStorage:!0},key:l.name,value:l.value}}),n++}catch(u){o.push({key:l.name,origin:c.origin,err:u});continue}o.length>0&&this.logger.warn({failedOrigins:o,currentPageUrl:this.page.url()},"Failed to set localStorage for entries, continuing..."),this.logger.info(`Loaded ${n} local storage entries`);let i={},a=0;for(let c of e.origins??[])if(c.sessionStorage&&c.sessionStorage.length>0){let l={};for(let u of c.sessionStorage)l[u.name]=u.value,a++;i[new URL(c.origin).origin]=l}a>0&&await this.context.addInitScript(({storageByOrigin:c,markerKey:l})=>{let u=window.location.origin,d=c[u];if(d&&!window.sessionStorage.getItem(l)){for(let[p,m]of Object.entries(d))window.sessionStorage.setItem(p,m);window.sessionStorage.setItem(l,"1")}},{storageByOrigin:i,markerKey:vh}),this.logger.info(`Loaded ${a} session storage entries`);let s=e.idb;s&&Object.keys(s).length>0&&(await EC(this.page,s,this.logger),this.logger.info(`Loaded ${Object.keys(s??{}).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 bC(this.page,this.logger),await GC(this.page,o,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 E("ActionFailureError",`Failed to save auth state: ${n?.message}`)}async getOpenPages(e){return Ch(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 zr)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(!rh.includes(e?.role??""))return{scrollPerformed:!1};if(await this.scrollIntoViewIfNeeded(t),o||(o=await t.boundingBox({timeout:oe})),!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}),u=qu(),{universalHandle:d}=await this.storage.createOnDemandScreenshot(u,l,"image/jpeg");return e.screenshotUrl=d,{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:oe});if(!s||!s.width||!s.height)throw new E("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:oe});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||yr.bannedAiRequiredCacheAttributes.includes(l)))try{let u=await t.getAttribute(l,{timeout:oe});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 E("InternalWebAgentError","Only positive IDs should be passed to resolveAllyIdToTarget");let c=this.stateManager.a11yIdToNodeMap[e];if(!c)throw new E("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,p,m;if(this.userBrowserSettings.autoExpandIframes&&!l&&c.parentFrame){let T=c.parentFrame,{cache:C,config:x}=await this.stateManager.getAutoFrameDetailsFromHandle(T);d=C,p=x,u=x.frame,m="auto iframe"}else c.parentFrame&&l?(p=l,u=await this.getActivePageOrFrame(),m="hardcoded url already on the state manager"):(u=await this.getActivePageOrFrame(),m="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:ve(i),frameCache:d},f,b=!1;o||(p&&(i.info({frameConfigSource:m,frameConfig:Rx(p)},"A11y node was resolved to a target within an iframe"),f=this.stateManager.frameConfig,this.stateManager.setActiveFrameConfig(p),b=!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:p,frameConfigSource:m}}finally{b&&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 m,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){m=f,await j(pt,a)}if(!g)throw m}let c=await this.getActivePageOrFrame();await this.ensureMomenticBrowserScriptsLoaded(c,i,a);let l=Date.now(),u=0,d=0,p;for(;Date.now()-l<this.smartWaitingTimeout;){this.abortSignal?.throwIfAborted(),u++;let m=u===2||Date.now()-l>this.smartWaitingTimeout-2e3&&u%2===0;try{p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!0,shouldLogOnFailure:m,logger:i,allowNotActionableNodesOverride:s,signal:a});break}catch(g){if(g instanceof Ba)break;if(g instanceof zr){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(pt,a)}a?.throwIfAborted(),m&&i.warn({err:g},`Could not resolve target using primary cache only (x${u})`),await j(pt,a)}}return p||(p=await this.resolveTargetHelper({root:c,target:t,primaryOnly:!1,logger:i,signal:a,allowNotActionableNodesOverride:s}),i.info({decisions:p.decisions},"Target resolution succeeded after waiting")),e?.details?.push({type:"TARGETING",name:o,elementLocationDecisions:p?.decisions??[],pageState:void 0,targetSource:t.targetSource,targetUpdateTime:t.targetUpdateTime}),p}async resolveTargetHelper({root:e,target:t,primaryOnly:n,logger:o,signal:i,allowNotActionableNodesOverride:a,shouldLogOnFailure:s}){let c=[],l,u=(await this.getBrowserState({logger:o,abortSignal:i,skipWait:!0,allowNotActionableNodesOverride:a})).serialize(),d;if(t.generatedSelectors||t.hybridSelector){let p;try{p=await this.resolveTargetWithPrimaryMethods({root:e,target:t,logger:o,allowNotActionableNodesOverride:a,shouldLogOnFailure:s})}catch(m){d=m,m instanceof Br&&(c.push(...m.decisions),l=m.cacheMissReason)}if(p)return{...p,pageState:void 0,decisions:[...c,...p.decisions]};n||(c.push({type:"CSS_SELECTOR",matched:!1,reason:d?.message,selectors:Qs(t.generatedSelectors??[])}),t.generatedSelectors=void 0,t.hybridSelector=void 0)}if(n)throw d;if(!this.userBrowserSettings.disableSecondaryCacheResolution){let p=await this.resolveTargetWithSecondaryMethods({root:e,tree:u,target:t,decisions:c,logger:o,signal:i,allowNotActionableNodesOverride:a});if(p)return t.targetSource="HEURISTIC_HEALED",t.targetUpdateTime=new Date().toISOString(),t.targetUpdateLoggerTags=ve(o),p;l=l??"secondary-resolution-failed"}throw new Br("Could not find any relevant node given target",c,l)}async resolveTargetWithPrimaryMethods({root:e,target:t,logger:n,allowNotActionableNodesOverride:o,shouldLogOnFailure:i}){if(!t.nodeOnlySerializedHtml)throw new Ba("Insufficient data to resolve target using primary methods (missing node HTML)");let a={x:0,y:0};if(HC(e)){let O=await(await e.frameElement()).boundingBox();O&&(a=O)}let s=i?n:Hn,c=this.userControlledBrowserSettings.hybridSelectorMode,l={ldistThreshold:th,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},rootBoundingBox:a},{css:u,hybrid:d}=await at({fn:O=>window.evaluatePrimaryCaches(O),arg:{cssParams:{selectors:t.generatedSelectors??[],cachedElementSerialized:t.nodeOnlySerializedHtml,opts:l},hybridParams:c&&t.hybridSelector?{nodes:t.hybridSelector,cachedElementSerialized:t.nodeOnlySerializedHtml,opts:l}:void 0},root:e,timeout:oe,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"evaluating target caches"}),p,m,g=[];if(c==="prefer"&&d?.result){p=d.result;let O={type:"HYBRID_SELECTOR",matched:!0,logs:d.logs,reason:"Discovered a match using Momentic's hybrid text and CSS selector approach"};g.push(O),m="HYBRID_SELECTOR"}else if(u?.result){p=u.result;let O=`${p.workingSelectors.length} CSS selectors matched the following element: ${p.serializedElement}`,v=p.workingSelectors.slice(0,5);g.push({type:"CSS_SELECTOR",matched:!0,logs:u.logs,reason:O,selectors:v}),n.debug({reason:O,workingSelectors:v},"Resolved with CSS selectors"),m="CSS_SELECTOR"}else throw g.push({type:"CSS_SELECTOR",matched:!1,reason:u.logs.length===1?"CSS evaluation failed":"No CSS selectors matched",selectors:[],logs:u.logs}),d&&g.push({type:"HYBRID_SELECTOR",matched:!1,reason:d.logs.length===1?"Hybrid evaluation failed":"No hybrid selectors matched",logs:d.logs}),u?.error&&n.error({err:new Error(u.error)},"Cache evaluation errored unexpectedly (CSS)"),d?.error&&n.error({err:new Error(d.error)},"Cache evaluation errored unexpectedly (Hybrid)"),new Br("Cache evaluation failed",g,u.cacheMissReason);let h,f,b;if(this.userBrowserSettings.visualActions){let O=p.mPath;if(!O)throw new Error("Found element did not have an mPath despite using visual actions");let v=O.join(" > ");h=e.locator(v),f=this.stateManager.getNodeUsingMPathSelector(v)}else if(p.dataMomenticId!==void 0)b=parseInt(p.dataMomenticId),f=this.stateManager.dataMomenticIdToNodeMap[b],"workingSelectors"in p?h=e.locator(p.workingSelectors[0]):h=e.locator(Ir(b));else throw new E("InternalWebAgentError","Received an element resolution result with no identifying attributes");c&&t.hybridSelector&&(d?.logs.length===1?s.warn({hybridResult:d,cssResult:u,hybridMode:c},"Hybrid selector resolution rejected, continuing..."):d?.result?u?.result&&d?.result&&d.result.serializedElement!==u.result.serializedElement&&(this.userBrowserSettings.visualActions&&JSON.stringify(u.result.mPath)!==JSON.stringify(d.result.mPath)?n.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c,mode:"visualActions"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing..."):u.result.dataMomenticId!==d.result.dataMomenticId&&n.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c,mode:"dataMomenticId"},"Hybrid selector resolution returned a different element than CSS selector resolution, continuing...")):s.warn({originalCache:t,hybridResult:d,cssResult:u,hybridMode:c},"Hybrid selector resolution returned no eligible elements while CSS resolution did, continuing..."));let[T,C]=await Promise.all([h.textContent({timeout:ae}),h.evaluate(O=>O.getBoundingClientRect(),{timeout:ae})]);if((T??"")!==(p.textContent??""))throw n.warn({currentTextContent:T,originalTextContent:p.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(Math.abs(C.height-p.boundingBox.height)>1||Math.abs(C.width-p.boundingBox.width)>1||Math.abs(C.x-p.boundingBox.x)>1||Math.abs(C.y-p.boundingBox.y)>1)throw n.warn({currentBoundingBox:C,originalBoundingBox:p.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 x=Qs(t);await this.updateCacheWithNewNodeDetails({node:f,target:t,locator:h,logger:n,startingBoundingBox:p.boundingBox,allowNotActionableNodesOverride:o});let w=kh(x,t);return w&&Object.keys(w).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(n),t.cacheResolutionUpdateSource=m),{a11yNode:f,displayString:p.serializedElement,locator:h,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 p=s.locator(n),m;try{return await p.waitFor({state:"attached",timeout:ae}),m=await Pr(p,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:p,displayString:m,decisions:d}}catch(g){let h=g.message;u=new E("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(pt,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:oe});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<mC){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:Re,root:e,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"finding the closest element on the page"}),u=Math.floor(th*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,p,m;if(d)p=this.stateManager.dataMomenticIdToNodeMap[d],m=e.locator(Ir(d));else if(l.mPathSelector)p=this.stateManager.getNodeUsingMPathSelector(l.mPathSelector),m=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 Pr(m,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=Qs(t);await this.updateCacheWithNewNodeDetails({node:p,target:t,locator:m,logger:o,startingBoundingBox:l.boundingBox,allowNotActionableNodesOverride:a});let f=kh(h,t);return f&&Object.keys(f).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(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:m,a11yNode:p,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&&rh.includes(c))try{let l=await this.resolveTargetWithTemplateMatching({root:e,oldTarget:t,screenshot: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}`}),o.warn({err:l},"Did not find any close element using saved screenshot")}}async resolveTargetWithTemplateMatching({screenshot: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}),s;if(typeof e=="string"){let T=await fetch(e);s=Buffer.from(await T.arrayBuffer())}else({data:s}=await this.storage.fetchOnDemandScreenshot(e));let c=aH(),l=await this.enricher.runTemplateMatching({id:c,searchImageBase64String:s.toString("base64"),pageImageBase64String:a.toString("base64")},{signal:n}),{target:u,locator:d}=await this.getTargetFromPositionPercentages({percentX:l.x,percentY:l.y,allowNotActionableNodesOverride:o}),p=u.boundingBox?.width,m=u.boundingBox?.height;if(!p||!m)throw i="Rejecting target from screenshot due to no bounding box",new Error(i);let g=u.id,h=this.stateManager.a11yIdToNodeMap[g],f=Qs(t);await this.updateCacheWithNewNodeDetails({target:t,node:h,locator:d,allowNotActionableNodesOverride:o});let b=kh(f,t);return b&&Object.keys(b).length>0&&(t.cacheResolutionUpdateTime=new Date().toISOString(),t.cacheResolutionUpdateLoggerTags=ve(this.logger),t.cacheResolutionUpdateSource="TEMPLATE_MATCHING",this.logger.info({id:c,diffs:b,templateMatch:l},"Updated cache after template matching resolution")),{locator:d,a11yNode:h,displayString:u.nodeOnlySerializedHtml??"",decisions:[{type:"TEMPLATE_MATCHING",matched:!0,reason:"Found element using screenshot"}]}}async typeIntoTarget(e,t,n={}){await this.highlight(t.locator);let o=await t.locator.getAttribute("type",{timeout:ae})??"",i=jC.some(a=>a===o.toLowerCase());return await Rh({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 Rh({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(),Ou(s,t,n)){a=!0;break}await j(pt,this.abortSignal)}if(!a)throw new E("ActionFailureError",`The active page URL ${n?.negated?"still does":"does not"} ${hw(t)} in ${o}ms.
4354
4354
  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={}){let o=n.steps??5,i=Math.min(n.hoverDurationMs??500,Re);if(await this.highlight(e),this.properties.isAndroid){await JC({page:this.page,fromTarget:e,toTarget:t,stepCount:o,dragDurationMs:n.dragDurationMs??1e3,hoverDurationMs:i}),await this.highlight(t);return}await this.hover({locator:e}),await this.page.mouse.down();let a=await t.boundingBox({timeout:oe});if(!a)throw new E("ActionFailureError","Could not get bounding box of target element");let s=a.x+a.width/2,c=a.y+a.height/2;await this.page.mouse.move(s,c,{steps:o}),await j(i),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:oe});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(zo),await this.page.mouse.up()}async hover(e){await this.highlight(e.locator),await Go({func:async t=>{await this.scrollIntoViewIfNeeded(t.locator);let n=await t.locator.boundingBox({timeout:oe});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 Go({func:t=>t.locator.focus({timeout:Re}),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:ae,codePath:"blurring the active element"});return}await this.highlight(e.locator),await Go({func:t=>t.locator.blur({timeout:Re}),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 Go({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 E("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:oe})},targetingResult:e})}async press(e,t){let n=t.repeat??1;if(t.convertMeta){let o=Gu(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=Gu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Th(e))await this.page.keyboard.down(n)}async keyUp(e,t){if(t.convertMeta){let n=Gu(e,this.properties.isAndroid);n!==e&&(this.logger.info({keyString:e,convertedKey:n},"Converted platform dependent keys"),e=n)}for(let n of Th(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:Hn;o||await this.waitForPageLoad(),e.skipWait||await this.waitForDOMStability({logger:n,signal:s});let d=0,p;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(m){if(s?.throwIfAborted(),p=m instanceof Error?m.message:`${m}`,d>=t)throw m;u.warn({err:m,url:this.url()},"Error getting a11y tree, retrying...")}}throw new E("ActionFailureError",`Getting page content failed after ${t} attempts. Error: ${p}`)}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:oe,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=p=>{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(zo,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<pC)){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 QC(this.page,e,t,n)}async mouseDragUsingVisualCoordinates(e){let{fromTarget:t,...n}=e;await xh({...n,page:this.page,visualTarget:t,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:oe}),n=await z(this.page.evaluate(()=>window.devicePixelRatio),{milliseconds:Re});process.platform==="darwin"&&n===1&&(n=uC);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 T=0;T<s.length;T++)if(c[T]===e){d=l.indexOf(T);break}if(d===-1)throw new Error(`Could not find any backend node with ID ${e}`);let[p=0,m=0,g=0,h=0]=u[d];p/=n,m/=n,g/=n,h/=n;let f=p+g/2,b=m+h/2;return{centerX:f,centerY:b}}async scrollVertical(e){return wh({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 wh({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=Ix(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(pt)}}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 E("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)}.
4355
- Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Bo(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=sc(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&&xx({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];Bo(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}}},pt);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:ae})}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 $s({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 E("UserInfrastructureError",`The page with URL ${yt(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await $s({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 tH.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:Re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new E("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=Re){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=Fn}){let i=_C(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new E("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:Re});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:ae})}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 E("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),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}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:ae,params:{highlightConfig:tx,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:ae,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:ae})}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[En],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(_r(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:oe})??{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:oe})??void 0),!n){let C=await Ir(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:p,error:m,serializedElement:g,foundElementRelativePoint:h,force:f,logs:b}=await e.evaluate(C=>{let x=window;if(!x.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return x.performTargetRedirection(C)},void 0,{timeout:ae}),T=Date.now()-o;if(m){t.warn({error:m,serializedElement:g,duration:T,force:f,logs:b},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:T,force:f,logs:b},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(_r(d)),hints:{relativeXYToLocator:h,force:f}};if(p)return t.info({newMPathSelector:p,serializedElement:g,duration:T,force:f,logs:b},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(p),hints:{relativeXYToLocator:h,force:f}};if(h)return t.info({foundElementRelativePoint:h,serializedElement:g,duration:T,force:f,logs:b},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:T,force:f,logs:b},"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:Re});if("error"in s&&s.error)throw s.error.startsWith(sC)?new Nl(s.error):s.error.startsWith(lC)?new Dl(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:ae})}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!!hC}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,dh(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Ku(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()||Ix(e),o=Q1(e),i=oH(e),a=pm[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Ku(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:rH.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 p=atob(l),m=new Array(p.length);for(let h=0;h<p.length;h++)m[h]=p.charCodeAt(h);let g=new Uint8Array(m);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??qu();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??dC}get userBrowserSettings(){return Qs(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Ji}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=zu();for(let t of e)if(!(!Ku(t)||!Mx(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=iH(t,o);return Ku(i)&&Mx(i).isDirectory()&&Z1(i).length>0})))return t}};import DH from"fetch-cookie";import{cloneDeep as Zx}from"lodash-es";import{CookieJar as kH}from"tough-cookie";async function Er({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 sH=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Px({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(sH.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(p=>p.url),d=t.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(Bo(m,o)&&m!==r&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(p)});break}}}}async function nn(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as mH}from"crypto";var Lx={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},Nx={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},Ox=/<(\S+) id="(\d+)".*?>/g,lH=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,Dx=["h1","h2","section","footer","nav","aside","form","label","dialog"],cH=[...Dx,"span","div","h3"],uH=["table","select","form","ul","ol","menu","pre","code","dialog"],dH=["table","form","dialog","nav","section","ul","select"];function Yu(r){return pH(r)}function pH({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4355
+ Available pages:${JSON.stringify(n.map(i=>i.url))}`);if(!Bo(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=sc(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&&xx({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];Bo(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}}},pt);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:ae})}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 Ks({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 E("UserInfrastructureError",`The page with URL ${yt(i,50)} did not load within the configured timeout (${o}ms): ${s}`);if(!s.message.includes("detached"))throw s}try{await Ks({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 tH.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:Re,waitForPageLoad:()=>this.waitForPageLoad(),codePath:"getting condensed HTML tree"});if(n)throw new Error(`Failed to process page HTML: ${n}`);if(!t)throw new E("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=Re){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=Fn}){let i=_C(),a={code:e,fragment:t,context:n},{result:s}=await z(this.page.evaluate(i,a),{milliseconds:o,fallback:()=>{throw this.abortSignal?.throwIfAborted(),new E("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:Re});let n;try{n=await this.cdpClient.send({method:"DOM.getNodeForLocation",params:{x:e,y:t},timeout:ae})}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 E("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),p=u+l,m=d+c;return this.getDomNodeFromPixelPosition(p,m)}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:ae,params:{highlightConfig:tx,backendNodeId:n.backendNodeId}}),async()=>{try{await this.cdpClient.send({timeout:ae,method:"Overlay.hideHighlight",params:{backendNodeId:n?.backendNodeId}})}catch{}}):async()=>{}}async clearAllCdpHighlights(){try{await this.cdpClient.send({method:"Overlay.hideHighlight",params:void 0,timeout:ae})}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[En],a=parseInt(i??"");if(!i||isNaN(a))throw new Error("No data-momentic-id was found on the DOM node");let s=e.locator(Ir(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:oe})??{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:oe})??void 0),!n){let C=await Pr(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:p,error:m,serializedElement:g,foundElementRelativePoint:h,force:f,logs:b}=await e.evaluate(C=>{let x=window;if(!x.performTargetRedirection)throw new Error("performTargetRedirection script is not defined");return x.performTargetRedirection(C)},void 0,{timeout:ae}),T=Date.now()-o;if(m){t.warn({error:m,serializedElement:g,duration:T,force:f,logs:b},"Got error from target redirection with bounding box");return}else{if(d)return t.info({newDataMomenticId:d,serializedElement:g,duration:T,force:f,logs:b},"Redirected target to new element with bounding box with data-momentic-id"),{locator:u.locator(Ir(d)),hints:{relativeXYToLocator:h,force:f}};if(p)return t.info({newMPathSelector:p,serializedElement:g,duration:T,force:f,logs:b},"Redirected target to new element with bounding box with mPath"),{locator:u.locator(p),hints:{relativeXYToLocator:h,force:f}};if(h)return t.info({foundElementRelativePoint:h,serializedElement:g,duration:T,force:f,logs:b},"Chose specific visible point on original element"),{locator:e,hints:{relativeXYToLocator:h,force:f}};if(f)return t.info({serializedElement:g,duration:T,force:f,logs:b},"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:Re});if("error"in s&&s.error)throw s.error.startsWith(sC)?new Nl(s.error):s.error.startsWith(lC)?new Dl(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:ae})}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!!hC}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,dh(e,this.debugData,i,{type:t,text:`[MOMENTIC] ${n}`,args:o})}async setFileChooserHandlerHelper({filePath:e,filename:t}){if(!Ku(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()||Ix(e),o=Q1(e),i=oH(e),a=pm[i];this.page.once("filechooser",async c=>{this.logger.info({filePath:e,fileName:n},"File chooser triggered");try{if(!Ku(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:rH.getType(e)||"application/octet-stream"},{timeout:ku})}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 p=atob(l),m=new Array(p.length);for(let h=0;h<p.length;h++)m[h]=p.charCodeAt(h);let g=new Uint8Array(m);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??qu();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??dC}get userBrowserSettings(){return Qs(this.userControlledBrowserSettings)}get pageLoadTimeout(){return this.userControlledBrowserSettings.pageLoadTimeoutMs??Ji}get isInPageLoad(){return Object.values(this.pageLoadPromises).length>0}get devicePixelRatio(){return this.properties.systemDevicePixelRatio??1}get browserCrashDumpDir(){let e=zu();for(let t of e)if(!(!Ku(t)||!Mx(t).isDirectory()||!["new","pending","completed"].some(o=>{let i=iH(t,o);return Ku(i)&&Mx(i).isDirectory()&&Z1(i).length>0})))return t}};import DH from"fetch-cookie";import{cloneDeep as Zx}from"lodash-es";import{CookieJar as kH}from"tough-cookie";async function Er({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 sH=["NAVIGATE","NEW_TAB","TAB","REFRESH","WAIT_FOR_URL"];async function Px({beforeUrl:r,beforePages:e,browser:t,command:n,logger:o}){if(sH.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(p=>p.url),d=t.url();if(u.length!==e.length)for(let p=u.length-1;p>=e.length;p--){let m=u[p];if(Bo(m,o)&&m!==r&&m!==d){o.info({beforePages:e,afterPages:u,beforeUrl:r},"Auto-following new tab after preset action"),await t.switchToPage({type:"INDEX",index:String(p)});break}}}}async function nn(r,e={}){let t=await r.getBrowserState(e);return{serializedTree:t.serialize(e.serializationOpts),tree:t}}import{randomUUID as mH}from"crypto";var Lx={minChunkTokenCount:500,acceptableChunkTokenCount:3e3,maxChunkTokenCount:8e3,maxLineLength:4e3},Nx={minChunkTokenCount:5e3,acceptableChunkTokenCount:1e4,maxChunkTokenCount:3e4,maxLineLength:500},Ox=/<(\S+) id="(\d+)".*?>/g,lH=/(<\/(\S+)>)|(<(\S+).*?\/>)/g,Dx=["h1","h2","section","footer","nav","aside","form","label","dialog"],cH=[...Dx,"span","div","h3"],uH=["table","select","form","ul","ol","menu","pre","code","dialog"],dH=["table","form","dialog","nav","section","ul","select"];function Yu(r){return pH(r)}function pH({logger:r,serializedTree:e,options:t}){let{minChunkTokenCount:n,acceptableChunkTokenCount:o,maxChunkTokenCount:i,maxLineLength:a}=t,s=[],c=e.split(`
4356
4356
  `),l=0,u=[],d=0,p=[],m=[],g=!1;for(;l<c.length;){g&&(s.push({ids:p,content:u.join(`
4357
- `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=Pr(h);d+=f,h.length>a&&(h=h.slice(0,a));let C=Array.from(h.matchAll(Ox)).map(Y=>Y&&Y.length>=3?{tagName:Y[1],id:Y[2]}:void 0).filter(Y=>!!Y),w=Array.from(h.matchAll(lH)).map(Y=>Y&&(Y[2]||Y[4])).filter(Y=>!!Y);w.reverse();let O=h.replace(/ id="[0-9]+"/g,"");u.push(O);for(let Y of C)p.push(Y.id),m.push(Y);for(let Y of w){let H=m[m.length-1];H&&H.tagName===Y&&m.pop()}let v=m.some(Y=>uH.includes(Y.tagName)),M=c[l+1]??"",k=Pr(M),J=Array.from(M.matchAll(Ox)).map(Y=>Y&&Y.length>2?Y[1]:void 0).filter(Y=>!!Y),te=J.some(Y=>Dx.includes(Y)),Et=J.some(Y=>cH.includes(Y));d+k>=i&&(g=!0),d>=n&&(te&&!v||w.some(Y=>dH.includes(Y)))&&(g=!0),d>=o&&Et&&!v&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4358
- `),tokenLength:d}),s.forEach((h,f)=>{let b=h.ids[0],T=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:b,maxId:T},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var gH=75e4,Xu=3e5;async function Wo(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=Pr(u);if(d>gH)try{let p=Yu({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await fH({...r,tokenLimit:Xu-1e4,chunks:p.chunks}),u=l.serialize();let m=Pr(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Xu*Xn),u=l.serialize();let m=Pr(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Xu)try{if(o){let p=Yu({serializedTree:u,options:Nx,logger:i}),m=mH();l=await z(hH({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=Pr(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Yu({serializedTree:u,options:Lx,logger:i});l=await z(SH({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=Pr(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Xu*Xn),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function hH({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:ve(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function fH(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:ve(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>r.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function SH(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:ve(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 Fh(r,e){if(!r.description)throw new E("UserConfigurationError","Cannot locate element with empty description");return Er({action:async()=>yH(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function yH(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:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,b=r.description,T=r.useMemory&&!t;n&&(b=await Ks({orgId:p,s:b,context:n,localTools:g,signal:f,logger:l})),a&&(b=EH(b,a));let{serializedTree:C,tree:x}=await nn(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),w,O=Date.now(),v;for(;!w&&Date.now()-O<3e3;){f.throwIfAborted();try{w=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ge){v=ge}}if(!w)throw new E("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${v?.message}`);let M=C,k=!1,J=`data:image/jpeg;base64,${w.toString("base64")}`;M=await Wo({type:"locator",description:b,screenshot:J,serializedTree:C,options:{aiPageFiltering:c},tree:x,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),M!==C&&(k=!0);let te=await h.getElementLocation({browserState:M,goal:b,screenshot:J,source:a,memory:T?s:void 0},{disableCache:t,abortSignal:f,loggerTags:ve(l),useMemory:T});if(l.debug({usedRag:k,result:te},"Got locator result"),!(te.id>0))throw new On(`Could not find any relevant element: ${te.thoughts}`,te.updatedMemory?{type:"GCS_TRACES",traces:te.updatedMemory}:void 0);let{resolution:Y,target:H,frameConfig:ce}=await m.createTargetFromA11yId({id:te.id,requirements:te.requirements,additionalElements:te.additionalElements,description:b,targetSource:"AI",logger:l});if(Y.a11yNode?.properties?.hidden&&Y.a11yNode?.properties?.hidden!=="false")throw new E("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: ${Y.displayString}`);return T&&(te.updatedMemory?H.memory={type:"GCS_TRACES",traces:te.updatedMemory}:s&&(H.memory=s)),{thoughts:te.thoughts,target:H,resolution:Y,frameConfig:ce,screenshot:J}}var bH=["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:"],kx="<select> element:",Ux="text input or contenteditable element:",Fx="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:",Bx="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:",Uh=[kx,Ux,Fx,Bx,...bH];function zx(r,e){if(r===e)return!0;for(let t of Uh){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(Uh.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!Uh.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function EH(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${kx} ${r}`;case"TYPE":return`${Ux} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${Fx}
4357
+ `),tokenLength:d}),u=[],d=0,p=m.length?[m[m.length-1].id]:[],g=!1);let h=c[l],f=_r(h);d+=f,h.length>a&&(h=h.slice(0,a));let C=Array.from(h.matchAll(Ox)).map(Y=>Y&&Y.length>=3?{tagName:Y[1],id:Y[2]}:void 0).filter(Y=>!!Y),w=Array.from(h.matchAll(lH)).map(Y=>Y&&(Y[2]||Y[4])).filter(Y=>!!Y);w.reverse();let O=h.replace(/ id="[0-9]+"/g,"");u.push(O);for(let Y of C)p.push(Y.id),m.push(Y);for(let Y of w){let H=m[m.length-1];H&&H.tagName===Y&&m.pop()}let v=m.some(Y=>uH.includes(Y.tagName)),M=c[l+1]??"",k=_r(M),J=Array.from(M.matchAll(Ox)).map(Y=>Y&&Y.length>2?Y[1]:void 0).filter(Y=>!!Y),te=J.some(Y=>Dx.includes(Y)),Et=J.some(Y=>cH.includes(Y));d+k>=i&&(g=!0),d>=n&&(te&&!v||w.some(Y=>dH.includes(Y)))&&(g=!0),d>=o&&Et&&!v&&(g=!0),l++}return u.length&&s.push({ids:p,content:u.join(`
4358
+ `),tokenLength:d}),s.forEach((h,f)=>{let b=h.ids[0],T=h.ids[h.ids.length-1];r.debug({tokenLength:h.tokenLength,minId:b,maxId:T},`Chunk for page filtering (index ${f+1}/${s.length})`)}),{chunks:s}}var gH=75e4,Xu=3e5;async function Wo(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=_r(u);if(d>gH)try{let p=Yu({serializedTree:u,options:{minChunkTokenCount:1e4,maxChunkTokenCount:1e5,acceptableChunkTokenCount:5e4,maxLineLength:4e3},logger:i});l=await fH({...r,tokenLimit:Xu-1e4,chunks:p.chunks}),u=l.serialize();let m=_r(u);i.info({oldTokens:d,newTokens:m},"Filtered page using keywords"),d=m}catch(p){i.warn({err:p},"Error filtering page using keyword matching, using naive truncation"),l=l.pruneToSerializedCharLimit(Xu*Yn),u=l.serialize();let m=_r(u);i.info({oldTokens:d,newTokens:m},"Filtered page using naive truncation"),d=m}if(d>Xu)try{if(o){let p=Yu({serializedTree:u,options:Nx,logger:i}),m=mH();l=await z(hH({...r,chunks:p.chunks,callId:m}),{milliseconds:12e3,signal:c}),u=l.serialize();let g=_r(u);i.info({oldTokens:d,newTokens:g,langfuseCallId:m},"Filtered page using AI chunk ranking"),d=g}else{let p=Yu({serializedTree:u,options:Lx,logger:i});l=await z(SH({...r,chunkResult:p,tokenLimit:4e4}),{milliseconds:12e3,signal:c}),u=l.serialize();let m=_r(u);i.info({oldTokens:d,newTokens:m},"Filtered page using RAG"),d=m}}catch(p){i.warn({err:p},"Error filtering page using RAG/AI, using naive truncation"),l=l.pruneToSerializedCharLimit(Xu*Yn),u=l.serialize(),i.info("Filtered page using naive truncation")}return u}async function hH({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:ve(c)}),u=[];return t.forEach((p,m)=>{l.indices.includes(m)&&(u=u.concat(p.ids))}),i.pruneUsingRelevantIds(new Set(u))}async function fH(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:ve(i),abortSignal:a});i.info({keywordsResult:s},"Got keywords for page filtering");for(let c of s.keywords){let l=r.chunks.filter(m=>m.content.toLowerCase().includes(c.toLowerCase()));if(!l.length||l.reduce((m,g)=>m+g.tokenLength,0)>r.tokenLimit&&l.length>1)continue;let d=l.flatMap(m=>m.ids);return n.pruneUsingRelevantIds(new Set(d))}throw new Error("No keywords were unique enough for page filtering")}async function SH(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:ve(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 Fh(r,e){if(!r.description)throw new E("UserConfigurationError","Cannot locate element with empty description");return Er({action:async()=>yH(r,e),frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,browser:e.browser,logger:r.logger})}async function yH(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:p,browser:m,localCodeEvalTools:g,generator:h,abortSignal:f}=e,b=r.description,T=r.useMemory&&!t;n&&(b=await js({orgId:p,s:b,context:n,localTools:g,signal:f,logger:l})),a&&(b=EH(b,a));let{serializedTree:C,tree:x}=await nn(m,{allowNotActionableNodesOverride:u,filterByViewport:o,abortSignal:f,skipWait:i,logger:l}),w,O=Date.now(),v;for(;!w&&Date.now()-O<3e3;){f.throwIfAborted();try{w=await m.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(ge){v=ge}}if(!w)throw new E("ActionFailureError",`Failed to take screenshot of page to locate element. The page may be unresponsive, or your machine might be severely resource constrained. Error: ${v?.message}`);let M=C,k=!1,J=`data:image/jpeg;base64,${w.toString("base64")}`;M=await Wo({type:"locator",description:b,screenshot:J,serializedTree:C,options:{aiPageFiltering:c},tree:x,fixtures:{generator:h,signal:f,logger:l,orgId:p}}),M!==C&&(k=!0);let te=await h.getElementLocation({browserState:M,goal:b,screenshot:J,source:a,memory:T?s:void 0},{disableCache:t,abortSignal:f,loggerTags:ve(l),useMemory:T});if(l.debug({usedRag:k,result:te},"Got locator result"),!(te.id>0))throw new On(`Could not find any relevant element: ${te.thoughts}`,te.updatedMemory?{type:"GCS_TRACES",traces:te.updatedMemory}:void 0);let{resolution:Y,target:H,frameConfig:ce}=await m.createTargetFromA11yId({id:te.id,requirements:te.requirements,additionalElements:te.additionalElements,description:b,targetSource:"AI",logger:l});if(Y.a11yNode?.properties?.hidden&&Y.a11yNode?.properties?.hidden!=="false")throw new E("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: ${Y.displayString}`);return T&&(te.updatedMemory?H.memory={type:"GCS_TRACES",traces:te.updatedMemory}:s&&(H.memory=s)),{thoughts:te.thoughts,target:H,resolution:Y,frameConfig:ce,screenshot:J}}var bH=["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:"],kx="<select> element:",Ux="text input or contenteditable element:",Fx="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:",Bx="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:",Uh=[kx,Ux,Fx,Bx,...bH];function zx(r,e){if(r===e)return!0;for(let t of Uh){if(!r.startsWith(t))continue;let n=r.slice(t.length).trim();if(Uh.some(o=>e.startsWith(o)&&e.slice(o.length).trim()===n)||n===e.trim())return!0}return!!Uh.some(t=>e.startsWith(t)&&e.slice(t.length).trim()===r.trim())}function EH(r,e){if(!r||!e)return r;switch(e){case"SELECT_OPTION":return`${kx} ${r}`;case"TYPE":return`${Ux} ${r}`;case"NEGATED_ELEMENT_VISIBLE_CHECK":return`${Fx}
4359
4359
  ${r}`;case"ELEMENT_CHECK":return`${Bx}
4360
- ${r}`;default:return r}}var TH=15;async function Ju({command:r,aiPageFiltering:e,logger:t,fixtures:n,useMemory:o,maxRetries:i=TH}){if(!r.assertion.trim())throw new E("ActionFailureError","Assertion command is missing the assertion content");let a=Fp.optional().catch(void 0).parse(r.source);r.source&&!a&&t.warn(`Invalid source ${r.source} for AI assertion, ignoring...`);let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=wu(c),u=0,d=Date.now(),p,m,g;try{await Er({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<i&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await j(l,n.abortSignal),h=Date.now();let f=!1;try{if(p=await Er({action:async()=>{let T=await Hx(s,t,n.abortSignal);return m&&m.serializedTree===T.serializedTree&&m.screenshotBuff.equals(T.screenshotBuff)?(f=!0,p):(m=T,Gx({command:r,state:T,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:a}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),p?.success){p?.updatedMemory&&Ws(r,p.updatedMemory,t);break}else throw p?.thoughts?new E("AssertionFailureError",p.thoughts):new E("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(b){n.abortSignal.throwIfAborted(),g=b instanceof Error?b:new Error(`${b}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:b},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await Er({action:async()=>Gx({command:r,state:await Hx(s,t,n.abortSignal),fixtures:n,useMemory:o,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(p?.updatedMemory&&Ws(r,p.updatedMemory,t),!p?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new E("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function Hx(r,e,t){let[n,o]=await Promise.all([nn(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function Gx({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:p}=t,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,b=f.toString("base64"),T=u.url(),C=r.contextChoice??"MULTIMODAL",x=g;C!=="VISION_ONLY"&&(x=await Wo({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:b,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),x!==g&&(m.ragUsed=!0),m.pageState=x);let w={goal:r.assertion,url:T,memory:o?r.cache?.memory:void 0,browserState:x,screenshot:b,contextChoice:C,source:c},v=await(C==="VISION_ONLY"?(M,k)=>d.getVisualAssertionResult(M,k):(M,k)=>d.getAssertionResult(M,k))(w,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ve(l)});return(v.result||i)&&v.relevantElements&&(m.relevantElementsSerialized=v.relevantElements.map(M=>u.getSerializedFormFromA11yId(M)).filter(M=>!!M),await vH(v.relevantElements,u,l)),{success:v.result,thoughts:v.thoughts,afterScreenshotOverride:f,updatedMemory:o?v.updatedMemory:void 0}}async function vH(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 AH=1e5,Qu=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Vx(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await RH(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Qu?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 RH(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await j(o.smartWaitingTimeout,n);return}if(!e.description)throw new E("UserConfigurationError","Cannot locate element with empty description");await z(wH(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function wH(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await Er({action:async()=>CH(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function CH(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 Ks({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await nn(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(Pr(p)>AH)throw new Qu;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(T){throw new E("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: ${T instanceof Error?T.message:T}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let b=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ve(n)});return n.debug({result:b},"Got smart waiting result"),b.isPageReady}import{cloneDeep as jx}from"lodash-es";async function $x(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>$f(e.cache)?e.cache:void 0,a=i(),s=jx(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=ZR(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,p=500,m=!1;for(;u<2||Date.now()-l<t;){u++,u>1&&await j(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await Wx({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new E("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&El(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await Wx({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=Vg(g.target),g.updatedAt=new Date),d}async function Wx({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Mn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=bu(t.assertion),l,u=!1,d=jx(r);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>xH(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ga(t),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof E)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function xH(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await MH(r,e.assertion)}async function MH(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:yt(a,500,!0)},!Jr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Sr(e);t=!1,n=new E("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:yt(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 E("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=Sr(e);t=!1,e.operation==="EXISTS"?n=new E("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new E("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},Dt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Dt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Dt*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=Sr(e);n=new E("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=Sr(e);t=!1,n=new E("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=Sr(e);t=!1,e.operation==="EXISTS"?n=new E("AssertionFailureError",`The style property ${e.property} ${s}`):n=new E("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 qx(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as _H}from"jimp";async function el(r,e){let t=await r.screenshot(e),n=await _H.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Kx}from"jimp";import Bh from"jpeg-js";import IH from"pixelmatch";async function Yx({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Mn(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 J=>el(o,{locator:J.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await el(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 V=`${l.width}x${l.height}`,J=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${V}) does not match saved screenshot dimensions (${J}) - 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 Kx.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await Kx.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,b=g.width*g.height,T=Math.abs(p.height-g.height),C=Math.abs(p.width-g.width);if(f>b){let V=d.cover({w:g.width,h:g.height});l.buffer=await V.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(b>f){let V=m.cover({w:p.width,h:p.height});u.buffer=await V.getBuffer("image/jpeg"),h="saved"}let x={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},w=t.threshold??.1,v=IH(Bh.decode(u.buffer).data,Bh.decode(l.buffer).data,x.data,l.width,l.height,{threshold:w,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,M=v>w*100,k=`Visual diff of ${v.toFixed(2)}% detected, which is ${M?"over":"under"} the threshold of ${w*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${T} pixels and wider by ${C} pixels.`),M)throw new E("ActionFailureError",k);return{fail:M,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Bh.encode(x,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var PH=3e4;function OH(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 Zu({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??PH/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(Yi(r.url)&&(c=r.url),t&&Xi(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new E("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=OH(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 E("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 E("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{m.request.json=JSON.parse(r.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var LH=5e3;async function Jx({timeout:r=Dt,...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 ed(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),LH);else return i}return i=await ed(e),i}async function ed({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(Xx,{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(Xx,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?yn.CONTAINS:bn.CONTAINS;a=new E("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new E("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 Xx({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 NH=3e4;async function Qx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??NH/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Yi(r.url)&&(s=r.url),t&&Xi(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new E("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 E("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var td=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([nn(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 Wo({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}}),p={url:this.browser.url(),browserState:d,startingScreenshot:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...ve(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([nn(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")}`,p=await Wo({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}}),m={url:c,browserState:p,startingScreenshot:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...ve(a)},langfuseSessionId:s})}catch(g){throw new E("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return nn(this.browser,e)}async locateElement(e){return await Fh({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return Er({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 p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}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 E("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 Er({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&&gp(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Sp(i)||hp(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(yp(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof zr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof E?n:new E("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 E("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:p,source:m}=s,g=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,b=!1,T=Zx(e.cache);if((!T||l)&&!ep(o))throw new E("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"),b=!0,T=void 0),T&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&T.targetSource==="HEURISTIC_HEALED"&&(b=!0,T=void 0),T?.inputDescription&&!zx(o.elementDescriptor,T.inputDescription)&&(g.warn({old:T.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),b=!0,T=void 0);let C=w=>!!w&&El(w),x=!0;if(!C(T)){x=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:b,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(b||!i)&&await Vx({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let w;try{w=await Fh({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:m,useMemory:h,memory:h?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:g},this.getControllerFixtures(t))}catch(M){if(M instanceof On&&M.updatedLocatorMemory){let k={id:-1,...i,memory:M.updatedLocatorMemory};Tu({cmd:c,key:d,newTarget:k,logger:g,updatedWithAI:!0})}throw new E("ActionFailureError",M.message)}w.frameConfig&&this.browser.setActiveFrameConfig(w.frameConfig);let O=s.disableGlobalLocatorRedirect?{locator:w.resolution.locator}:await this.attemptLocatorRedirect(w.resolution.locator,g),v=await a(O);return Tu({cmd:c,key:d,newTarget:w.target,logger:g,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),w.target.targetSource="AI_HEALED",w.target.targetUpdateTime=new Date().toUTCString(),w.target.targetUpdateLoggerTags=ve(g)),{result:v,elementInteractedDisplayString:w.resolution.displayString,thoughts:w.thoughts}}try{let w=await this.browser.resolveTarget(t,T,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(w.locator);let O=s.disableGlobalLocatorRedirect?{locator:w.locator}:await this.attemptLocatorRedirect(w.locator,g),v=await a(O);if(ft.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!T.requirements}`,`hasAdditionalElements:${!!T.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.19.0"]),Tu({cmd:c,key:d,newTarget:T,logger:g,updatedWithAI:!1}),x){let M=w.decisions.filter(k=>k.matched);if(M.length!==1)g.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=M[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:v,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let O="unknown";w instanceof Br&&w.cacheMissReason&&(O=w.cacheMissReason),ft.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!T.requirements}`,`hasAdditionalElements:${!!T.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.19.0",`missReason:${O}`]);let v=!1;if((w instanceof zr||gp(w)||Sp(w)||yp(w)||QS(w)||hp(w)||ZS(w))&&(v=!0),w instanceof E&&!v)throw g.error({err:w},"Failed to execute action with cached target (fatal)"),w;if(f>0&&o){g.info({err:w},"Failed to execute action with cached target, retrying with AI");let M;return T.memory&&Gf(T.memory)&&(M=T.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:M,retriesWithAI:f,targetHealingInProgress:!0}})}throw new E("ActionFailureError",w.message,{errOptions:{cause:w}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return el(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 E("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&&SS(n)?await this.browser.waitForDOMStability({timeout:Re}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:ae}),this.options?.autoFollowNewTabs&&await Px({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{Lu(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>lh(e)}}async resolveCommandTemplateStrings(e,t){return Ou({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()?Ju({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 E("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new E("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ju({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new E("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=fT(n.schema);if(h)throw new E("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:ve(a)});if(h.result==="NOT_FOUND")throw new E("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new E("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 E("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 E("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(!Yi(n.url)&&!Xi(n.url,this.browser.baseUrl))throw new E("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 E("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 m,g;if(n.target&&kr(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:b,thoughts:T}=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}});m=b,g=T}let h=this.browser.getViewport()?.height??Dn.height,f=this.browser.getViewport()?.width??Dn.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:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new E("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new E("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(kr(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=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:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return xu(m,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(kr(n.fromTarget)&&kr(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(kr(n.fromTarget)||kr(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,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,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new E("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&kr(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,b;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:C}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async x=>this.browser.mouseDrag(m,g,h,x.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=T,b=C}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:b}}case"SELECT_OPTION":{if(!Mn(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:b=>this.browser.selectOption(b,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ga(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);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 m;try{n.environment==="BROWSER"?(m=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:m},"Executed JavaScript in browser")):m=await Zr({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 E("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new E("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&kr(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 m=this.browser.url(),g,h,f=Zx(n.target),b=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:C,thoughts:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:w=>this.browser.typeIntoTarget(n.value,w,{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:Ga(n)}});g=C,h=x}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return xu(m,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(kr(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,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:m,thoughts:g}}case"FOCUS":{if(!Mn(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,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:m,thoughts:g}}case"BLUR":{if(n.target&&!Mn(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:m,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:m,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 xu(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 m=new kH,g=DH(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await Zu({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Pa.parse({...f,cookies:lc(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await Qx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Yx({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await SC({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new E("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await Zr({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new E("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=Xb.optional().parse(m)}catch(h){throw new E("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??Dt)*1e3,g=this.generator.getAgentConfig()?.assertion;if(qx(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,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let b=await Ju({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${b.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:b.afterScreenshotOverride}}finally{f.cache?.memory&&Ws(n,f.cache?.memory.traces,a)}}let h=await $x({command:n,tracer:t,timeoutMs:m,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 m=await Er({action:async()=>Jx({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:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new Jn(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await gh(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new E("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await z(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new Jn(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=Bu(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=Bu(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new E("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new Jn(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Jn(n.requestMatcher),async(g,h)=>{let f=await Zr({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"}),b=Jb.parse(f);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(m=>{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:ve(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 ju({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:ve(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ve(this.logger)})}};import{cloneDeep as UH}from"lodash-es";import oM from"truncate-json";var eM=1e3,tM=5e6,FH=5*1024*1024;function iM(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=oM(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":rM(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":rM(n),iM(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 rM(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function nM(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 rd(r,e){let t=UH(r);if(iM(t,e),t.length>eM)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,eM);let n=nM(t,e);if(n.length>tM)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>tM;)t.pop(),n=nM(t,e);let{jsonString:o}=oM(n,FH);try{return Gt.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 BH}from"async_hooks";var tl=new BH;function zH(r){tl.enterWith({activeTracers:[r]})}function HH(r,e){let t=tl.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function GH(r,e){let t=tl.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return tl.run({activeTracers:n},e)}var Or={globalAls:tl,initializeRootTracerContext:zH,withChildTracer:HH,withChildTracerAsync:GH};var jo=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 Or.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 Or.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 Or.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:{},subSpans:[]},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a=new r(o),s;try{i?.signal||i?.timeoutMs?s=await Or.withChildTracerAsync(a,()=>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})`:""}`})):s=await Or.withChildTracerAsync(a,()=>t(o)),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(c){throw o.error=c instanceof Error?c.message:String(c),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,c}return s}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 se(){let r=Or.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new jo}async function aM(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=VH(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 VH(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 rl(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=rl(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as pG}from"fs";import{tmpdir as mG}from"os";import hM from"path";import{diff as dG}from"deep-object-diff";import{cloneDeep as gM}from"lodash-es";import uM from"fontoxpath";import WH from"@prettier/plugin-xml";import jH from"prettier";import{DOMParser as $H,XMLSerializer as qH}from"slimdom";var KH=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 nl(r){let e=r.toLowerCase();return e.endsWith("webview")||KH.has(e)}function YH(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 XH=new Set(["index","package","a11y-important","screen-reader-focusabl"]),JH=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"]),QH=new Set(["text","hint"]),ZH=new Set(["live-region","drawing-order"]),eG=new Set(["displayed","enabled"]);function tG(r,e){let t={};for(let[n,o]of Object.entries(e))XH.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||JH.has(n)&&o==="false"||QH.has(n)&&o===""||eG.has(n)&&o==="true"||ZH.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function sM(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 p of e.attributes){let m=p.name,g=p.value;g!=null&&(l[m]=String(g))}let u=tG(e.tagName,l);for(let[p,m]of Object.entries(u))t.setAttribute(p,m);if(o.set(c,e),i.set(c,t),nl(e.tagName)){let p=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&p.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);p.trim().length>0&&t.appendChild(n.createCDATASection(`
4360
+ ${r}`;default:return r}}var TH=15;async function Ju({command:r,aiPageFiltering:e,logger:t,fixtures:n,useMemory:o,maxRetries:i=TH}){if(!r.assertion.trim())throw new E("ActionFailureError","Assertion command is missing the assertion content");let a=Fp.optional().catch(void 0).parse(r.source);r.source&&!a&&t.warn(`Invalid source ${r.source} for AI assertion, ignoring...`);let{browser:s}=n,c=r.timeout?r.timeout*1e3:s.smartWaitingTimeout,l=Pu(c),u=0,d=Date.now(),p,m,g;try{await Er({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<i&&(!h||h-d<c);){n.abortSignal.throwIfAborted(),u!==0&&await j(l,n.abortSignal),h=Date.now();let f=!1;try{if(p=await Er({action:async()=>{let T=await Hx(s,t,n.abortSignal);return m&&m.serializedTree===T.serializedTree&&m.screenshotBuff.equals(T.screenshotBuff)?(f=!0,p):(m=T,Gx({command:r,state:T,fixtures:n,useMemory:o,useConsensus:!1,highlightElementsOnFailure:!1,attemptNumber:u,aiPageFiltering:e,logger:t,source:a}))},frameConfig:r.iframeUrl?{type:"url",url:r.iframeUrl}:void 0,logger:t,browser:s}),p?.success){p?.updatedMemory&&$s(r,p.updatedMemory,t);break}else throw p?.thoughts?new E("AssertionFailureError",p.thoughts):new E("InternalPlatformError","No thoughts were provided for AI assertion failure")}catch(b){n.abortSignal.throwIfAborted(),g=b instanceof Error?b:new Error(`${b}`),f?t.info(`AI check attempt ${u} failed (re-used previous result)`):t.info({err:b},`AI check assert attempt ${u} failed, retrying...`)}finally{u++}}if(!p?.success)try{p=await Er({action:async()=>Gx({command:r,state:await Hx(s,t,n.abortSignal),fixtures:n,useMemory:o,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(p?.updatedMemory&&$s(r,p.updatedMemory,t),!p?.success){let f=`AI check still failing after ${u} attempts.`;throw g&&(f+=` Latest result: ${g.message}`),new E("AssertionFailureError",f)}return{...p,succeedImmediately:!1,urlAfterCommand:s.url()}}async function Hx(r,e,t){let[n,o]=await Promise.all([nn(r,{abortSignal:t,skipWait:!0,skipWaitForPageLoad:!0,logger:e}),r.screenshot({retries:1,respectActiveFrame:!0})]);return{...n,screenshotBuff:o}}async function Gx({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:p}=t,m={type:"ASSERTION"},{serializedTree:g,tree:h}=e,f=e.screenshotBuff,b=f.toString("base64"),T=u.url(),C=r.contextChoice??"MULTIMODAL",x=g;C!=="VISION_ONLY"&&(x=await Wo({type:"assertion",serializedTree:g,tree:h,description:r.assertion,screenshot:b,options:{aiPageFiltering:a},fixtures:{generator:d,signal:p,logger:l,orgId:t.orgId}}),x!==g&&(m.ragUsed=!0),m.pageState=x);let w={goal:r.assertion,url:T,memory:o?r.cache?.memory:void 0,browserState:x,screenshot:b,contextChoice:C,source:c},v=await(C==="VISION_ONLY"?(M,k)=>d.getVisualAssertionResult(M,k):(M,k)=>d.getAssertionResult(M,k))(w,{useConsensus:n,attemptNumber:s,useMemory:o,disableCache:!!r.disableCache,abortSignal:p,logger:l,loggerTags:ve(l)});return(v.result||i)&&v.relevantElements&&(m.relevantElementsSerialized=v.relevantElements.map(M=>u.getSerializedFormFromA11yId(M)).filter(M=>!!M),await vH(v.relevantElements,u,l)),{success:v.result,thoughts:v.thoughts,afterScreenshotOverride:f,updatedMemory:o?v.updatedMemory:void 0}}async function vH(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 AH=1e5,Qu=class extends Error{constructor(){super("The page content exceeds the maximum token limit for AI smart waiting."),this.name="ExceededMaxAISmartWaitingTokensError"}};async function Vx(r,e){let{logger:t}=r,{abortSignal:n,browser:o}=e,i=Date.now();try{await RH(i,r,e)}catch(a){if(a instanceof Error&&(a.name==="AbortError"||a.name==="TimeoutError")||n.aborted)return;a instanceof Qu?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 RH(r,e,t){let{abortSignal:n,browser:o}=t;if(o.smartWaitingTimeout<3e3){await j(o.smartWaitingTimeout,n);return}if(!e.description)throw new E("UserConfigurationError","Cannot locate element with empty description");await z(wH(r,e,t),{milliseconds:o.smartWaitingTimeout})}async function wH(r,e,t){let{logger:n,iframeUrl:o}=e,{browser:i}=t;for(;Date.now()-r<i.smartWaitingTimeout;)if(await Er({action:async()=>CH(e,t),frameConfig:o?{type:"url",url:o}:void 0,browser:i,logger:n}))return}async function CH(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 js({orgId:l,s:d,context:t,localTools:c,signal:s,logger:n}));let{serializedTree:p}=await nn(a,{allowNotActionableNodesOverride:i,filterByViewport:o,abortSignal:s,logger:n});if(_r(p)>AH)throw new Qu;s.throwIfAborted();let g;try{g=await a.screenshot({clearHighlights:!0,respectActiveFrame:!0,retries:2})}catch(T){throw new E("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: ${T instanceof Error?T.message:T}`)}let f=`data:image/jpeg;base64,${g.toString("base64")}`;s.throwIfAborted();let b=await u.getSmartWaitingDecision({browserState:p,description:d,screenshot:f},{abortSignal:s,loggerTags:ve(n)});return n.debug({result:b},"Got smart waiting result"),b.isPageReady}import{cloneDeep as jx}from"lodash-es";async function $x(r){let{command:e,timeoutMs:t,fixtures:n}=r,{abortSignal:o}=n,i=()=>$f(e.cache)?e.cache:void 0,a=i(),s=jx(a),c=(h=!1)=>{if(a=i(),!!a)if(h){let f=yw(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,p=500,m=!1;for(;u<2||Date.now()-l<t;){u++,u>1&&await j(p,o),o?.throwIfAborted(),a=i();let{result:h,elementWasFound:f}=await Wx({cacheToUse:a,params:r});if(d=h,m=f,h.success)break;c(),p=Math.min(p*2,1e4)}if(!d)throw new E("InternalPlatformError",`Failed to evaluate manual element assertion in ${t}ms.`);if(o?.throwIfAborted(),!d.success&&a?.target&&El(a.target)){let h=a?.target?.memory?{target:{id:-1,memory:a.target.memory}}:void 0,{result:f}=await Wx({cacheToUse:h,params:r});d=f,d.success||c(!0)}let g=i();return d.success&&g?.target&&!m&&(g.target=Wg(g.target),g.updatedAt=new Date),d}async function Wx({cacheToUse:r,params:e}){let{command:t,disableCache:n,fixtures:o,tracer:i,targetingWrapper:a}=e,{logger:s}=o;if(t.target&&!Mn(t.target))throw new Error("Element assertion with x/y is not supported yet");let c=wu(t.assertion),l,u=!1,d=jx(r);try{let{elementInteractedDisplayString:p,result:m,thoughts:g}=await a({ctx:o.ctx,tracer:i,command:t,target:t.target,cache:d?.target,action:async h=>xH(h.locator,e),options:{...t,allowNotActionableNodesOverride:!0,disableCache:n,memory:d?.target?.memory,disableGlobalLocatorRedirect:!0,source:Ga(t),targetName:"target"}});return l={success:m.success,data:m.data,err:m.err,elementInteractedDisplayString:p,thoughts:g},u=!0,m.success||(s.warn({aiThoughts:g,elementString:p,err:m.err},"Element check found an element but failed"),l={...m,thoughts:g}),{result:l,elementWasFound:u}}catch(p){if(c)return l={success:!0,thoughts:`The element described does not exist on the page: ${p.message}`,err:void 0,data:void 0},{result:l,elementWasFound:u};if(!(p instanceof E)||p.reason!="ActionFailureError")throw p;return l={success:!1,err:p,data:void 0,thoughts:void 0},s.warn({err:p},"Element check did not find an element and failed"),{result:l,elementWasFound:u}}}async function xH(r,{command:e,fixtures:t}){return await t.browser.highlight(r),await MH(r,e.assertion)}async function MH(r,e){let t=!0,n,o;switch(e.type){case"ELEMENT_CONTENT":{let a=await r.textContent()??"";if(o={elementTextContent:yt(a,500,!0)},!Qr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Sr(e);t=!1,n=new E("AssertionFailureError",`The content ${s} '${e.value}': ${a}`)}break}case"ELEMENT_ATTRIBUTE":{o={elementOuterHtml:yt(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 E("AssertionFailureError",`The element does not have an attribute named ${e.attr}: ${s}`),t=!1;break}if(!Qr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Sr(e);t=!1,e.operation==="EXISTS"?n=new E("AssertionFailureError",`The attribute ${e.attr} ${s}`):n=new E("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},Dt*1e3);break}case"EDITABLE":{t=await r.isEditable({timeout:Dt*1e3});break}case"EXISTS":{t=!0;break}case"ENABLED":{t=await r.isEnabled({timeout:Dt*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=Sr(e);n=new E("AssertionFailureError",`The element ${a}`)}break}case"ELEMENT_NAME":{let a=await r.evaluate(s=>s.tagName);if(!Qr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})){let s=Sr(e);t=!1,n=new E("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(!Qr(a,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let s=Sr(e);t=!1,e.operation==="EXISTS"?n=new E("AssertionFailureError",`The style property ${e.property} ${s}`):n=new E("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 qx(r){return r.type==="ELEMENT_EXISTENCE"&&r.negated&&r.condition==="EXISTS"}import{Jimp as _H}from"jimp";async function el(r,e){let t=await r.screenshot(e),n=await _H.fromBuffer(t);return{buffer:t,width:Math.ceil(n.bitmap.width??0),height:Math.ceil(n.bitmap.height??0)}}import{Jimp as Kx}from"jimp";import Bh from"jpeg-js";import IH from"pixelmatch";async function Yx({ctx:r,tracer:e,command:t,disableCache:n,browser:o,targetingWrapper:i,logger:a,screenshotStorage:s}){if(t.target&&!Mn(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 J=>el(o,{locator:J.locator,...c}),options:{...t,disableCache:n,disableGlobalLocatorRedirect:!0,memory:t.cache?.target?.memory,targetName:"target"}})).result:l=await el(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 V=`${l.width}x${l.height}`,J=`${u.width}x${u.height}`;return{fail:!0,thoughts:`Current screenshot (${V}) does not match saved screenshot dimensions (${J}) - 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 Kx.fromBuffer(l.buffer),p={width:l.width,height:l.height},m=await Kx.fromBuffer(u.buffer),g={width:u.width,height:u.height},h,f=p.width*p.height,b=g.width*g.height,T=Math.abs(p.height-g.height),C=Math.abs(p.width-g.width);if(f>b){let V=d.cover({w:g.width,h:g.height});l.buffer=await V.getBuffer("image/jpeg"),h="current",l.width=g.width,l.height=g.height}else if(b>f){let V=m.cover({w:p.width,h:p.height});u.buffer=await V.getBuffer("image/jpeg"),h="saved"}let x={data:Buffer.alloc(l.width*l.height*4),width:l.width,height:l.height},w=t.threshold??.1,v=IH(Bh.decode(u.buffer).data,Bh.decode(l.buffer).data,x.data,l.width,l.height,{threshold:w,diffColorAlt:[0,255,0]})/(l.width*l.height)*100,M=v>w*100,k=`Visual diff of ${v.toFixed(2)}% detected, which is ${M?"over":"under"} the threshold of ${w*100}%.`;if(h&&(k+=` The ${h} screenshot was cropped since it was taller by ${T} pixels and wider by ${C} pixels.`),M)throw new E("ActionFailureError",k);return{fail:M,thoughts:k,beforeScreenshotOverride:l.buffer,afterScreenshotOverride:Bh.encode(x,75).data,succeedImmediately:!1,urlAfterCommand:o.url()}}var PH=3e4;function OH(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 Zu({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??PH/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(Yi(r.url)&&(c=r.url),t&&Xi(r.url,t)&&(c=new URL(r.url,t).toString()),!c)throw new E("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=OH(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 E("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 E("ActionFailureError",`Fetch request failed with status ${d.status}: ${g}`)}let p={};d.headers.forEach((g,h)=>{p[h]=g});let m={status:d.status,headers:p,request:{url:d.url,method:r.method,headers:i}};if(r.body?.type==="json"&&r.body.content)try{m.request.json=JSON.parse(r.body.content)}catch{}if(d.headers.get("content-type")?.includes("json"))try{m.json=await d.json()}catch{}else d.headers.get("content-type")?.includes("text")&&(m.text=await d.text());return m}var LH=5e3;async function Jx({timeout:r=Dt,...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 ed(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),LH);else return i}return i=await ed(e),i}async function ed({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(Xx,{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(Xx,{value:r.value,negated:!!r.negated,returnHtml:!0},"checking page content"));if(!i){let c=r.negated?yn.CONTAINS:bn.CONTAINS;a=new E("AssertionFailureError",`The page ${c} '${r.value}'.`),o=s}}catch(s){a=new E("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 Xx({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 NH=3e4;async function Qx({command:r,logger:e,baseUrl:t,fetchImplementation:n=fetch}){let o=r.timeout??NH/1e3,i=new AbortController,a=Object.fromEntries(Object.entries(r.headers||{}).filter(([d,p])=>d&&p));a["Content-Type"]="application/json";let s;if(Yi(r.url)&&(s=r.url),t&&Xi(r.url,t)&&(s=new URL(r.url,t).toString()),!s)throw new E("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 E("ActionFailureError",`GraphQL request timed out after ${o} seconds`);if(!l.ok){let d,p=await l.text();try{d=JSON.parse(p)}catch{throw new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}throw d?.errors?.length&&d?.errors[0]?.message?new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${d.errors[0].message}`):new E("ActionFailureError",`GraphQL request failed with status ${l.status}: ${p}`)}let u={};return l.headers.forEach((d,p)=>{u[p]=d}),{status:l.status,headers:u,json:await l.json()}}var td=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([nn(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 Wo({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}}),p={url:this.browser.url(),browserState:d,startingScreenshot:t,history:n,goal:e,screenshot:u,lastError:a};return await this.generator.getMultiturnAiActionEvaluation(p,{disableCache:o,abortSignal:this.executeAbortController.signal,loggerTags:{...ve(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([nn(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")}`,p=await Wo({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}}),m={url:c,browserState:p,startingScreenshot:t,history:n,goal:e,actionHint:o,screenshot:d};try{return await this.generator.getMultiturnAiActionCommand(m,{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:{...ve(a)},langfuseSessionId:s})}catch(g){throw new E("InternalWebAgentError",`Error generating command: ${g instanceof Error?g.message:g}`,{errOptions:{cause:g}})}}async getBrowserState(e){return nn(this.browser,e)}async locateElement(e){return await Fh({...e,aiPageFiltering:!!this.options?.aiPageFiltering},this.getControllerFixtures())}async locateElementWithSelector(e,t){return Er({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 p=i[d],m=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:p,cache:a[d],action:async g=>g,options:{...c,targetName:o[d]}});u.push(m)}try{let d=await s(...u.map(g=>g.result)),p=g=>g==="fromTarget"?"From Target":g==="toTarget"?"To Target":"Target",m=u.map((g,h)=>g.thoughts?`${p(o[h])}: ${g.thoughts}`:void 0).filter(g=>!!g).join(" -------------- ")||void 0;return{result:d,elementInteractedDisplayStrings:u.map(g=>g.elementInteractedDisplayString),thoughts:m}}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 E("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 Er({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&&gp(i)){t.warn({err:i},"Invalid mpath error, retrying element targeting command");continue}if(!this.browser.userBrowserSettings.visualActions&&(Sp(i)||hp(i))){t.warn({err:i},"Invalid momentic id error, retrying element targeting command");continue}if(yp(i)){t.warn({err:i},"Invalid backend node id error, retrying element targeting command");continue}if(i instanceof zr&&i.retryableWithAI){t.warn({err:i},"Element cache disqualification error, retrying element targeting command");continue}throw i}throw n instanceof E?n:new E("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 E("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:p,source:m}=s,g=this.logger.child({commandId:c.id}),h=this.shouldUseMemory(),f=s.retriesWithAI??1,b=!1,T=Zx(e.cache);if((!T||l)&&!ep(o))throw new E("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"),b=!0,T=void 0),T&&this.browser.userBrowserSettings.disableSecondaryCacheResolution&&T.targetSource==="HEURISTIC_HEALED"&&(b=!0,T=void 0),T?.inputDescription&&!zx(o.elementDescriptor,T.inputDescription)&&(g.warn({old:T.inputDescription,new:o.elementDescriptor},"Target cache was generated with a different description, clearing it automatically"),b=!0,T=void 0);let C=w=>!!w&&El(w),x=!0;if(!C(T)){x=!1,g.info({description:o.elementDescriptor,targetHealingInProgress:p,cacheBustedBeforeAction:b,memory:s.memory,useMemory:h},"Prompting AI for an updated element location"),(b||!i)&&await Vx({description:o.elementDescriptor,iframeUrl:s.iframeUrl,source:m,logger:g,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride},this.getControllerFixtures(t)),f--;let w;try{w=await Fh({description:o.elementDescriptor,disableCache:!!s.disableCache,iframeUrl:s.iframeUrl,source:m,useMemory:h,memory:h?s.memory:void 0,aiPageFiltering:!!this.options?.aiPageFiltering,allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,logger:g},this.getControllerFixtures(t))}catch(M){if(M instanceof On&&M.updatedLocatorMemory){let k={id:-1,...i,memory:M.updatedLocatorMemory};xu({cmd:c,key:d,newTarget:k,logger:g,updatedWithAI:!0})}throw new E("ActionFailureError",M.message)}w.frameConfig&&this.browser.setActiveFrameConfig(w.frameConfig);let O=s.disableGlobalLocatorRedirect?{locator:w.resolution.locator}:await this.attemptLocatorRedirect(w.resolution.locator,g),v=await a(O);return xu({cmd:c,key:d,newTarget:w.target,logger:g,updatedWithAI:!0}),p&&(n.recordTargetAutoHeal({healType:"AI"}),w.target.targetSource="AI_HEALED",w.target.targetUpdateTime=new Date().toUTCString(),w.target.targetUpdateLoggerTags=ve(g)),{result:v,elementInteractedDisplayString:w.resolution.displayString,thoughts:w.thoughts}}try{let w=await this.browser.resolveTarget(t,T,{allowNotActionableNodesOverride:s.allowNotActionableNodesOverride,targetName:d,logger:g,signal:this.executeAbortController.signal});(this.browser.userBrowserSettings.visualActions||this.browser.userBrowserSettings.globalLocatorRedirect!==!1)&&await this.browser.scrollIntoViewIfNeeded(w.locator);let O=s.disableGlobalLocatorRedirect?{locator:w.locator}:await this.attemptLocatorRedirect(w.locator,g),v=await a(O);if(ft.increment("cache_target_resolution_v2",1,["outcome:hit","platform:web",`hasRequirements:${!!T.requirements}`,`hasAdditionalElements:${!!T.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.19.1"]),xu({cmd:c,key:d,newTarget:T,logger:g,updatedWithAI:!1}),x){let M=w.decisions.filter(k=>k.matched);if(M.length!==1)g.warn({decisions:w.decisions},"Expected exactly 1 matching method for element location, got more or less");else{let k=M[0].type;n.recordTargetAutoHeal({healType:k})}}return{result:v,elementInteractedDisplayString:w.displayString}}catch(w){this.throwIfClosed();let O="unknown";w instanceof Br&&w.cacheMissReason&&(O=w.cacheMissReason),ft.increment("cache_target_resolution_v2",1,["outcome:miss","platform:web",`hasRequirements:${!!T.requirements}`,`hasAdditionalElements:${!!T.additionalElements}`,`orgId:${this.orgId}`,"cliVersion:0.19.1",`missReason:${O}`]);let v=!1;if((w instanceof zr||gp(w)||Sp(w)||yp(w)||QS(w)||hp(w)||ZS(w))&&(v=!0),w instanceof E&&!v)throw g.error({err:w},"Failed to execute action with cached target (fatal)"),w;if(f>0&&o){g.info({err:w},"Failed to execute action with cached target, retrying with AI");let M;return T.memory&&Gf(T.memory)&&(M=T.memory),this.wrapElementTargetingCommand({ctx:t,tracer:n,command:c,target:o,cache:void 0,originalCache:i,action:a,options:{...s,memory:M,retriesWithAI:f,targetHealingInProgress:!0}})}throw new E("ActionFailureError",w.message,{errOptions:{cause:w}})}}async attemptLocatorRedirect(e,t){return this.browser.userBrowserSettings.globalLocatorRedirect!==!1?this.browser.performTargetRedirection(e,t):{locator:e}}async screenshotWithDimensions(e){return el(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 E("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&&SS(n)?await this.browser.waitForDOMStability({timeout:Re}):!this.browser.userBrowserSettings.visualActions&&["PRESS","TYPE"].includes(n.type)&&await this.browser.waitForDOMStability({timeout:ae}),this.options?.autoFollowNewTabs&&await Px({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{Ru(n,c)}}createCallbacksForBrowser(e){return{createIsolatedFolder:()=>ch(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()?Ju({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 E("ActionFailureError","Missing assertion");if(n.timeout&&n.timeout>1800)throw new E("AssertionFailureError",`AI check timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);return Ju({command:n,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory(),aiPageFiltering:!!this.options?.aiPageFiltering,logger:a})}case"AI_EXTRACT":{if(!n.goal.trim())throw new E("ActionFailureError","Cannot perform AI extraction without goal");if(n.schema){let h=fT(n.schema);if(h)throw new E("UserConfigurationError",h)}let m=await this.browser.getCondensedHtml(),g=await this.browser.screenshot({retries:2});try{let h=await this.generator.getTextExtraction({goal:n.goal,browserState:m,returnSchema:n.schema,screenshot:`data:image/jpeg;base64,${g.toString("base64")}`},{disableCache:i,abortSignal:this.executeAbortController.signal,loggerTags:ve(a)});if(h.result==="NOT_FOUND")throw new E("ActionFailureError","No relevant data found for extraction goal on this page");if(h.thoughts?.includes("MaxGenerationLengthExceededError"))throw new E("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 E("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 E("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(!Yi(n.url)&&!Xi(n.url,this.browser.baseUrl))throw new E("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 E("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 m,g;if(n.target&&kr(n.target))await this.browser.hoverUsingVisualCoordinates(n.target.pixels);else if(n.target&&n.target.elementDescriptor.trim()){let{elementInteractedDisplayString:b,thoughts:T}=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}});m=b,g=T}let h=this.browser.getViewport()?.height??Dn.height,f=this.browser.getViewport()?.width??Dn.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:m,thoughts:g}}case"WAIT_FOR_URL":{if(n.timeout&&n.timeout>1800)throw new E("UserConfigurationError",`Wait for URL timeout of ${n.timeout} exceeds the maximum allowed value of 30 minutes.`);let m=n.matcher;await this.browser.waitForUrl({beforeUrl:this.browser.url(),matcher:m},{timeout:n.timeout?n.timeout*1e3:void 0,negated:n.negated,caseInsensitive:n.caseInsensitive});break}case"WAIT":if(n.delay>1800)throw new E("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(kr(n.target)){await this.browser.clickUsingVisualCoordinates(n.target.pixels,n);break}let m=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:T=>this.browser.click(T,this.createCallbacksForBrowser(this.orgId),n),options:{disableCache:i,targetName:"target",...n}}),b={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:f,data:h.downloadedFile?{downloadedFile:h.downloadedFile}:void 0};return Lu(m,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(kr(n.fromTarget)&&kr(n.toTarget)){await this.browser.dragAndDropUsingVisualCoordinates(n.fromTarget.pixels,n.toTarget.pixels,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0});break}if(kr(n.fromTarget)||kr(n.toTarget))throw new Error("Drag and drop targets must be both coordinates or both descriptions");let{elementInteractedDisplayStrings:m,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,{hoverDurationMs:n.hoverSeconds?n.hoverSeconds*1e3:void 0,steps:n.steps}),options:{useSelector:!!n.useSelector,disableCache:i}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:m[0],thoughts:g}}case"MOUSE_DRAG":{let m=parseInt(n.deltaX),g=parseInt(n.deltaY),h=n.steps??5;if(isNaN(m)||isNaN(g))throw new E("ActionFailureError",`Invalid pixel values passed to mouse drag command: (${n.deltaX}, ${n.deltaY})`);if(n.target&&kr(n.target)){await this.browser.mouseDragUsingVisualCoordinates({deltaX:m,deltaY:g,steps:h,fromTarget:n.target.pixels});break}let f,b;if(n.target?.elementDescriptor){let{elementInteractedDisplayString:T,thoughts:C}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:n.target,cache:n.cache?.target,action:async x=>this.browser.mouseDrag(m,g,h,x.locator,{force:n.force}),options:{disableCache:i,targetName:"target",...n}});f=T,b=C}else await this.browser.mouseDrag(m,g,h,void 0,{force:n.force});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:f,thoughts:b}}case"SELECT_OPTION":{if(!Mn(n.target))throw new Error("Select with x/y is not supported yet");let m=n.target.elementDescriptor,g=n.choice,{elementInteractedDisplayString:h,thoughts:f}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:{type:"description",elementDescriptor:m},cache:n.cache?.target,action:b=>this.browser.selectOption(b,g,n.force),options:{...n,targetName:"target",disableCache:i,source:Ga(n)}});return{succeedImmediately:!1,urlAfterCommand:this.browser.url(),elementInteracted:h,thoughts:f}}case"TAB":{let m={loadTimeoutMs:n.loadTimeout?n.loadTimeout*1e3:void 0,retry:!0};await this.browser.switchToPage(n.action,m);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 m;try{n.environment==="BROWSER"?(m=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:m},"Executed JavaScript in browser")):m=await Jr({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 E("ActionFailureError",g instanceof Error?g.message:`${g}`,{errOptions:{cause:g}})}try{JSON.stringify(m)}catch(g){throw new E("ActionFailureError",`Return value is not serializable: ${g instanceof Error?g.message:`${g}`}`,{errOptions:{cause:g}})}return{urlAfterCommand:this.browser.url(),succeedImmediately:!1,data:m}}case"TYPE":{if(n.target&&kr(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 m=this.browser.url(),g,h,f=Zx(n.target),b=this.browser.userBrowserSettings.globalLocatorRedirect===void 0||this.browser.userBrowserSettings.globalLocatorRedirect==="always";if(f){let{elementInteractedDisplayString:C,thoughts:x}=await this.wrapElementTargetingCommand({ctx:e,tracer:t,command:n,target:f,cache:n.cache?.target,action:w=>this.browser.typeIntoTarget(n.value,w,{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:Ga(n)}});g=C,h=x}else await this.browser.type(n.value,{force:n.force,clearContent:n.clearContent,forceClearContent:n.forceClearContent,delay:n.delay,pressEnter:n.pressEnter},!0);let T={urlAfterCommand:this.browser.url(),succeedImmediately:!1,elementInteracted:g,thoughts:h};return Lu(m,T.urlAfterCommand)&&(T.succeedImmediately=!0,T.succeedImmediatelyReason="URL changed"),T}case"HOVER":{if(kr(n.target)){await this.browser.hoverUsingVisualCoordinates(n.target.pixels);break}let{elementInteractedDisplayString:m,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:m,thoughts:g}}case"FOCUS":{if(!Mn(n.target))throw new Error("Focus with x/y is not supported yet");let{elementInteractedDisplayString:m,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:m,thoughts:g}}case"BLUR":{if(n.target&&!Mn(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:m,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:m,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 Lu(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 m=new kH,g=DH(fetch,m),h;try{h=new URL(n.url).hostname}catch{}let f=await Zu({command:n,baseUrl:this.browser.baseUrl,logger:a,fetchImplementation:g});return{data:Pa.parse({...f,cookies:lc(m,h)}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GRAPHQL_REQUEST":return{data:await Qx({command:n,baseUrl:this.browser.baseUrl,logger:a}),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"VISUAL_DIFF":return Yx({ctx:e,tracer:t,command:n,disableCache:i,browser:this.browser,logger:a,screenshotStorage:this.visualDiffScreenshotStorage,targetingWrapper:m=>this.wrapElementTargetingCommand(m)});case"FILE_UPLOAD":{let m,g;if(n.fileSource.type==="URL"?(g=n.fileSource.url,m=await SC({uri:n.fileSource.url,logger:a,orgId:this.orgId})):n.fileSource.type==="USER_FILE"&&(g=n.fileSource.name,m=await this.uploadedFileStorage?.getFileForUpload(n.fileSource.name,this.orgId)),!m)throw new E("UserConfigurationError",`Attempted to use non-existent file for upload step: ${g}`);await this.browser.setFileChooserHandler({...m,filename:n.filename});break}case"AUTH_SAVE":return{data:await this.browser.saveAuthState(),succeedImmediately:!1,urlAfterCommand:this.browser.url()};case"AUTH_LOAD":{let m;if(!n.storageState.trim())m=void 0;else if(m=await Jr({orgId:this.orgId,code:n.storageState,fragment:!1,context:o,logger:a,localTools:this.localCodeEvalTools,signal:this.executeAbortController.signal}),typeof m!="object")throw new E("ActionFailureError",`Credentials must evaluate to an object (received ${typeof m} instead)`);let g;try{g=Xb.optional().parse(m)}catch(h){throw new E("ActionFailureError",`Credentials provided do not follow the required format: ${h}`)}await this.browser.loadAuthState(g);break}case"ELEMENT_CHECK":{let m=(n.timeout??Dt)*1e3,g=this.generator.getAgentConfig()?.assertion;if(qx(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,source:"NEGATED_CHECK",cache:n.cache&&"memory"in n.cache?{memory:n.cache?.memory}:void 0};try{let b=await Ju({command:f,logger:a,aiPageFiltering:!!this.options?.aiPageFiltering,fixtures:this.getControllerFixtures(e),useMemory:this.shouldUseMemory()});return{succeedImmediately:!1,thoughts:`The element described does not exist on the page: ${b.thoughts}`,urlAfterCommand:this.browser.url(),afterScreenshotOverride:b.afterScreenshotOverride}}finally{f.cache?.memory&&$s(n,f.cache?.memory.traces,a)}}let h=await $x({command:n,tracer:t,timeoutMs:m,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 m=await Er({action:async()=>Jx({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:!m.success,data:m.data,thoughts:m.success?"Page assertion passed.":m.err?.message??`Page assertion still failing after ${n.timeout} seconds.`,urlAfterCommand:this.browser.url(),succeedImmediately:!1}}case"REGISTER_REQUEST_LISTENER":{let m=new Jn(n.requestMatcher),g=this.browser.registerRequestListener(m);return this.registeredListeners[n.key]=g.then(async h=>await gh(h)).catch(h=>{a.error({err:h},"Failed to get request listener response")}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"AWAIT_LISTENER":{let m=this.registeredListeners[n.key];if(!m)throw new E("ActionFailureError",`No listener registered with key: ${n.key}`);let g=n.timeout??10;return{data:await z(m,{milliseconds:g*1e3,message:`Request listener timed out after ${g} seconds`}),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"RECORD_REQUESTS":{let m=new Jn(n.requestMatcher);return this.recordedRequests[n.key]={},this.browser.registerRequestRecorder(n.key,{matches:g=>m.matches({url:g.request.url,method:g.request.method}),onRequestStart:(g,h)=>{this.recordedRequests[n.key][g]=Bu(h)},onRequestComplete:(g,h)=>{this.recordedRequests[n.key]?.[g]&&(this.recordedRequests[n.key][g]=Bu(h))}}),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"GET_RECORDED_REQUESTS":{let m=this.recordedRequests[n.key];if(!m)throw new E("ActionFailureError",`No recorder registered with key: ${n.key}`);return delete this.recordedRequests[n.key],{data:Object.values(m),succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"SET_HEADER":{let m;return n.requestMatcher&&(m=new Jn(n.requestMatcher)),this.browser.setHeader(n.name,n.value,m),{succeedImmediately:!1,urlAfterCommand:this.browser.url()}}case"MOCK_ROUTE":return{data:{key:this.browser.registerMock(n.key,new Jn(n.requestMatcher),async(g,h)=>{let f=await Jr({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"}),b=Jb.parse(f);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(m=>{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:ve(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 ju({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:ve(this.logger)})}async getFailureRecoveryPlan(e){return this.generator.getFailureRecoveryPlan(e,{disableCache:!0,abortSignal:this.executeAbortController.signal,loggerTags:ve(this.logger)})}};import{cloneDeep as UH}from"lodash-es";import oM from"truncate-json";var eM=1e3,tM=5e6,FH=5*1024*1024;function iM(r,e){for(let t=0;t<r.length;t++){let n=r[t];try{if(n.data){let{jsonString:o}=oM(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":rM(n);break;case"MOBILE_AI_ACTION_STEP":case"MOBILE_MODULE_STEP":rM(n),iM(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 rM(r){if(r.type==="MOBILE_PRESET_STEP"){let e=r.command;"cache"in e&&e.cache&&(e.cache=void 0)}}function nM(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 rd(r,e){let t=UH(r);if(iM(t,e),t.length>eM)return e.error("Database content violation: results too long, truncating before insertion"),t.slice(0,eM);let n=nM(t,e);if(n.length>tM)for(e.error({serializedLength:n.length,resultsArrayLength:t.length},"Database content violation: results too large, truncating before insertion");n.length>tM;)t.pop(),n=nM(t,e);let{jsonString:o}=oM(n,FH);try{return Gt.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 BH}from"async_hooks";var tl=new BH;function zH(r){tl.enterWith({activeTracers:[r]})}function HH(r,e){let t=tl.getStore()?.activeTracers;if(!t)return e();t.push(r);try{return e()}finally{t.pop()}}async function GH(r,e){let t=tl.getStore()?.activeTracers;if(!t)return e();let n=[...t,r];return tl.run({activeTracers:n},e)}var Or={globalAls:tl,initializeRootTracerContext:zH,withChildTracer:HH,withChildTracerAsync:GH};var jo=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 Or.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 Or.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 Or.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:{},subSpans:[]},i=n[0]??void 0;Object.assign(o,i??{}),this.addSpan(o);let a=new r(o),s;try{i?.signal||i?.timeoutMs?s=await Or.withChildTracerAsync(a,()=>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})`:""}`})):s=await Or.withChildTracerAsync(a,()=>t(o)),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime}catch(c){throw o.error=c instanceof Error?c.message:String(c),o.endTime=Date.now(),o.durationMs=o.endTime-o.startTime,c}return s}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 se(){let r=Or.globalAls.getStore()?.activeTracers,e;return!r||r.length===0?e=void 0:e=r[r.length-1],e||new jo}async function aM(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=VH(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 VH(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 rl(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=rl(i);a.trim()&&e.push(a.trim())}return e.join(" ").trim()}import{mkdirSync as pG}from"fs";import{tmpdir as mG}from"os";import hM from"path";import{diff as dG}from"deep-object-diff";import{cloneDeep as gM}from"lodash-es";import uM from"fontoxpath";import WH from"@prettier/plugin-xml";import jH from"prettier";import{DOMParser as $H,XMLSerializer as qH}from"slimdom";var KH=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 nl(r){let e=r.toLowerCase();return e.endsWith("webview")||KH.has(e)}function YH(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 XH=new Set(["index","package","a11y-important","screen-reader-focusabl"]),JH=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"]),QH=new Set(["text","hint"]),ZH=new Set(["live-region","drawing-order"]),eG=new Set(["displayed","enabled"]);function tG(r,e){let t={};for(let[n,o]of Object.entries(e))XH.has(n)||n==="class"&&r===o||n==="focusable"&&o==="true"&&e.clickable==="true"||JH.has(n)&&o==="false"||QH.has(n)&&o===""||eG.has(n)&&o==="true"||ZH.has(n)&&o==="0"||n!=="id"&&(t[n]=o);return t}function sM(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 p of e.attributes){let m=p.name,g=p.value;g!=null&&(l[m]=String(g))}let u=tG(e.tagName,l);for(let[p,m]of Object.entries(u))t.setAttribute(p,m);if(o.set(c,e),i.set(c,t),nl(e.tagName)){let p=s?.injectedWebviewContent??"";if(s?.removeWebviewContent){for(;t.firstChild;)t.removeChild(t.firstChild);return}else if(!s?.disableMomenticAccessibilityTree&&p.trim().length>0){for(;t.firstChild;)t.removeChild(t.firstChild);p.trim().length>0&&t.appendChild(n.createCDATASection(`
4361
4361
  ${p}
4362
- `));return}}let d=Array.from(e.childNodes??[]);for(let p of d){let m=p.nodeType;if(m===3){let g=p.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(m===1){let g=p;if(!oG(g,s?.viewportBounds))continue;let h=n.createElement(YH(g.tagName));sM(r,g,h),t.appendChild(h)}}}function rG(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;sM(a,e,s);let c=new qH().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function lM(r,e){let t=new $H,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new E("InternalWebAgentError","No root element found in XML");if(i.tagName!=="hierarchy")throw new E("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=rG(t,i,o,e);return{xml:await jH.format(c,{parser:"xml",plugins:[WH],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function nG(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 nd(r,e){let t=r.idToElement.get(e);if(t)return nG(t)}function zh(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 $o(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 oG(r,e){if(!e)return!0;let t=$o(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 cM(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function dM({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=$o(e),!t))throw new E("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:cM(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 mM({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new E("InternalWebAgentError",`Could not find node with id: ${r.id}`);let o=$o(n);if(!o)throw new E("InternalWebAgentError",`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=nd(t.graph,r.id)??"",a=zh(t.graph,r.id)??"",s=dM({requirements:r.requirements,element:n}),c=[];r.additionalElements&&(c=r.additionalElements.map(({id:u,requirements:d})=>{let p=t.graph.idToElement.get(u);if(!p)return;let m=nd(t.graph,u);return m?{xPath:m,requirements:dM({requirements:d,element:p})}:void 0}).filter(u=>!!u));let l;if(nl(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 Hh(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var iG=.1,aG=.25;function od(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*iG;case"broad":return o<=Math.abs(e)*aG;case"irrelevant":return!0}}function sG(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!od(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 od(e.tolerance,a,s,Math.min(1,i))}function lG(r,e){return od(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?od(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var pM=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=rl(r);if(c!==o)throw new E("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 E("ActionFailureError",`Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new E("ActionFailureError",`Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!sG(t.newElementBounds,a))throw new E("ActionFailureError",`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!lG(t.newElementBounds,s))throw new E("ActionFailureError",`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function id(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=se();if(e.type==="WEBVIEW")return cG(e,r);let a=uM.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new E("ActionFailureError",`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let p=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let m of p){let g=uM.evaluateXPathToFirstNode(m.xPath,o);if(!g)throw new E("ActionFailureError",`Required related element not found for XPath: ${m.xPath}`);pM(g,m.requirements)}})}let s=$o(a);if(!s)throw new E("ActionFailureError","Resolved native element has no bounding box");pM(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[p,m]of n.idToElement.entries())if(m===a){c=p;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=zh(n,c)??l,u=nd(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function cG(r,e){let{stateManager:t,logger:n,signal:o}=e,i=se(),a=await t.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new E("InternalWebAgentError","No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw n.error({target:r},"resolveTargetCacheInWebView: No browser target available on cache"),new E("InternalWebAgentError","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 qo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;ec(e)&&(e[t]={...e[t],[n]:bi.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function ad(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 Xe=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,metadata:c}){let l=this.logger.child({...c});await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let u=await t.startAsyncSection("Get emulator state",async()=>{let f=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),b=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:f,screenshot:b}}),d;try{d=await t.startAsyncSpan("AI_LOCATOR_CALL",async f=>{let b=await this.generator.getMobileElementLocation({description:e,screenXml:u.emulatorState.graph.xml,screenshot:u.screenshot,memory:i?a:void 0},{logger:l,loggerTags:ve(l),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return f.result=b,b})}catch(f){throw this.throwIfAborted(),l.error({err:f},"Failed to locate element"),new E("InternalWebAgentError",`Failed to locate element: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}if(d.id===-1)throw new E("NoMatchingElementError",d.thoughts??"No matching element found");let{target:p,resolvedNode:m}=mM({aiResponse:d,description:e,emulatorState:u.emulatorState});if(p.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml},attributes:{},subSpans:[]}),{resolvedTarget:{...p,resolvedNode:m},thoughts:d.thoughts};let{browserLocateResult:g,browserController:h}=await t.startAsyncSpan("TARGET_RESOLUTION",async f=>{let b=await this.stateManager.getActiveWebview();if(!b||!b.browserController)throw new E("InternalWebAgentError","No browser controller is attached to the requested webview");let T=await b.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return f.result={serializedElement:T.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:T,browserController:b.browserController}});return{resolvedTarget:{...p,controller:h,resolution:g.resolution,browserCache:g.target},thoughts:g.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,p={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let b=o.cache;a==="target"&&"target"in b?d=b.target:a==="fromTarget"&&"fromTarget"in b?d=b.fromTarget:a==="toTarget"&&"toTarget"in b&&(d=b.toTarget)}let m=!1,g=gM(d),h;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 b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:Hh(d),metadata:p});h=b.thoughts;let T=await t(b.resolvedTarget);return qo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:T,thoughts:h}}let f;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),f=await this.stateManager.getDomState();let{resolvedTarget:b,updatedCache:T}=await c.startAsyncSpan("CACHE_RESOLUTION",async x=>{let{resolvedTarget:w}=await id({target:g,domState:f,stateManager:this.stateManager,logger:this.logger}),O=ad(w),v=dG(g,O);return v&&Object.keys(v).length>0&&this.logger.info({cacheDiffs:v},"Successfully resolved target with cache"),x.attributes.serializedElement=w.type==="WEBVIEW"?w.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":w.elementOnlySerializedXml,{resolvedTarget:w,updatedCache:O}}),C=await t(b);return qo({command:o,cacheKey:i,targetName:a,updatedCache:T,updatedWithAI:!1}),g.type!=="WEBVIEW"&&ft.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.19.0"]),{result:C,thoughts:"Successfully executed preset action with cache"}}catch(b){g.type!=="WEBVIEW"&&ft.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.19.0"]),this.throwIfAborted(),this.logger.warn({err:b},"Failed to resolve target cache, retrying with AI");let T=this.shouldUseMemoryForCommand(o),C=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:T,memory:g?.memory,webviewMemory:Hh(g),metadata:p});h=C.thoughts;let x=await t(C.resolvedTarget);return qo({command:o,cacheKey:i,targetName:a,updatedCache:C.resolvedTarget,updatedWithAI:!0}),{result:x,thoughts:h}}}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 E("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 gM(this.aiSettings)}};function gG(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 ea=class extends Xe{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,p=o+u;return await this.tapOnAbsoluteCoordinates({x:d,y:p,...t}),{x:d,y:p}}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=hM.join(mG(),"momentic","downloads"),s=hM.join(a,this.orgId,i);return pG(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 se().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=se(),n=gG(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 eo=class extends Xe{async doPress({keycode:e,longPress:t}){await se().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var fM=25,sd=class extends Xe{async doType(e){let t=se();if(!e.target){if(e.clearContent)throw new E("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 E("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 se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??fM};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 ea(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=se(),n=e.keyPressDelayMs??fM;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=se();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 eo(this.constructPerformerParams()).doPress({keycode:67})}};import Xt from"zod";var SM=.8,to=.2,hG=Xt.object({navigationBar:Xt.object({visible:Xt.boolean(),x:Xt.number(),y:Xt.number(),width:Xt.number(),height:Xt.number()}),statusBar:Xt.object({visible:Xt.boolean(),x:Xt.number(),y:Xt.number(),width:Xt.number(),height:Xt.number()})}),ta=class extends Xe{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=hG.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*to),n=Math.floor(e.height*to);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*to),l=Math.floor(s*to);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=se();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=>se().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*to),s=Math.floor(i*to);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*to),u=Math.floor(c.height*to),d=Math.max(1,c.width-l*2),p=Math.max(1,c.height-u*2),m={x:c.x+l+d/2,y:c.y+u+p/2},g=(s?p:d)*(t.viewportPercent??SM)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=m,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:t.durationMs,fromTarget:m})}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=SM,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 SG from"pixelmatch";import{_android as yG,chromium as bG}from"playwright";import{PNG as RM}from"pngjs";import{z as je}from"zod";var yM=je.object({"Android-Package":je.string(),Browser:je.string(),"Protocol-Version":je.string(),"User-Agent":je.string(),"V8-Version":je.string(),"WebKit-Version":je.string(),webSocketDebuggerUrl:je.string()}),bM=je.object({description:je.string(),devtoolsFrontendUrl:je.string(),id:je.string(),title:je.string(),type:je.string(),url:je.string(),webSocketDebuggerUrl:je.string()}),EM=je.object({proc:je.string(),webview:je.string(),webviewName:je.string()}),TM=je.array(EM.extend({info:yM.optional(),pages:je.array(bM).optional()})),PLe=je.array(EM.extend({info:yM,pages:je.array(bM)}));function Gh(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=RM.sync.read(n),a=RM.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 SG(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var ld=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,p;if(l)p=l;else{let g=(await yG.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 E("UserInfrastructureError",`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 E("UserInfrastructureError",`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.`);p=g[0]}return new r({driver:e,context:d,logger:t,device:p,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=se(),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 E("InternalWebAgentError",`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 se().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c,l=!1;for(;Date.now()-a<e;){c&&c<250&&await j(250-c,t),t?.throwIfAborted();let u=Date.now();if(!s){s=await this.getRawScreenshotBase64(),c=u-a;continue}let d=await this.getRawScreenshotBase64();if(c=u-a,Gh(s,d)<=o){l=!0;break}s=d}l||(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");(nl(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:$o(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await se().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 se().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 lM(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await se().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 se().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"),this.logger.info({currentPkg:e,allWebviews:Array.from(this.webviews.values()).map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active}))},"getActiveWebview: filtering webviews");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(this.logger.info(`getActiveWebview: found ${t.length} matching webviews`),t.length!==0){if(t.length>1)throw new E("UserInfrastructureError","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 St(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 se().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=TM.parse(t)}catch(o){throw new E("InternalWebAgentError",`Failed to parse contexts. Original error:
4362
+ `));return}}let d=Array.from(e.childNodes??[]);for(let p of d){let m=p.nodeType;if(m===3){let g=p.nodeValue;g&&g.trim().length>0&&t.appendChild(n.createTextNode(g));continue}if(m===1){let g=p;if(!oG(g,s?.viewportBounds))continue;let h=n.createElement(YH(g.tagName));sM(r,g,h),t.appendChild(h)}}}function rG(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;sM(a,e,s);let c=new qH().serializeToString(o);return{prunedDocument:o,prunedIdToElement:i,xml:c}}async function lM(r,e){let t=new $H,n=t.parseFromString(r,"text/xml"),o=new Map,i=n.documentElement;if(!i)throw new E("InternalWebAgentError","No root element found in XML");if(i.tagName!=="hierarchy")throw new E("InternalWebAgentError","No hierarchy element found in XML");let{prunedDocument:a,prunedIdToElement:s,xml:c}=rG(t,i,o,e);return{xml:await jH.format(c,{parser:"xml",plugins:[WH],printWidth:120,tabWidth:1,singleAttributePerLine:!1}),originalXml:r,document:n,idToElement:o,prunedDocument:a,prunedIdToElement:s}}function nG(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 nd(r,e){let t=r.idToElement.get(e);if(t)return nG(t)}function zh(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 $o(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 oG(r,e){if(!e)return!0;let t=$o(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 cM(r,e){if(r&&!(!e||e.length===0))return Object.fromEntries(e.map(t=>[t,r.getAttribute(t)]).filter(([,t])=>t!==null))}function dM({requirements:r,element:e}){let t;if((r?.positionSpecificity||r?.shapeSpecificity)&&(t=$o(e),!t))throw new E("ActionFailureError","Element to cache has no bounds or unexpected bounds format");return{requiredText:r?.textRequired?e.getAttribute("text")??void 0:void 0,requiredAttributes:cM(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 mM({aiResponse:r,description:e,emulatorState:t}){let n=t.graph.idToElement.get(r.id);if(!n)throw new E("InternalWebAgentError",`Could not find node with id: ${r.id}`);let o=$o(n);if(!o)throw new E("InternalWebAgentError",`Node ${r.id} has no bounding box: ${n.outerHTML}`);let i=nd(t.graph,r.id)??"",a=zh(t.graph,r.id)??"",s=dM({requirements:r.requirements,element:n}),c=[];r.additionalElements&&(c=r.additionalElements.map(({id:u,requirements:d})=>{let p=t.graph.idToElement.get(u);if(!p)return;let m=nd(t.graph,u);return m?{xPath:m,requirements:dM({requirements:d,element:p})}:void 0}).filter(u=>!!u));let l;if(nl(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 Hh(r){return r?.type==="WEBVIEW"?r.browserCache?.memory:void 0}var iG=.1,aG=.25;function od(r,e,t,n){let o=Math.abs(e-t);switch(r){case"precise":return o<=n;case"narrow":return o<=Math.abs(e)*iG;case"broad":return o<=Math.abs(e)*aG;case"irrelevant":return!0}}function sG(r,e){let t=e.x2-e.x1,n=(e.x1+e.x2)/2,o=(r[0]+r[2])/2;if(!od(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 od(e.tolerance,a,s,Math.min(1,i))}function lG(r,e){return od(e.tolerance,e.width,r[2]-r[0],Math.min(1,e.width))?od(e.tolerance,e.height,r[3]-r[1],Math.min(1,e.height)):!1}var pM=(r,e,t)=>{if(!e)return;let{requiredAttributes:n,requiredText:o,requiredBounds:i,position:a,shape:s}=e;if(o!==void 0){let c=rl(r);if(c!==o)throw new E("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 E("ActionFailureError",`Attribute ${c} mismatch: expected ${l}, got ${u}`)}if(i&&t&&!t.targetBounds.every((l,u)=>l===t.newElementBounds[u]))throw new E("ActionFailureError",`Bounds changed from [${t.targetBounds.join(",")} ] to [${t.newElementBounds.join(",")} ]`);if(a&&t&&!sG(t.newElementBounds,a))throw new E("ActionFailureError",`Position mismatch: expected ${JSON.stringify(a)}, got ${JSON.stringify(t.newElementBounds)}`);if(s&&t&&!lG(t.newElementBounds,s))throw new E("ActionFailureError",`Shape mismatch: expected ${JSON.stringify(s)}, got ${JSON.stringify(t.newElementBounds)}`)};async function id(r){let{target:e,domState:t}=r,{graph:n}=t,{document:o}=n,i=se();if(e.type==="WEBVIEW")return cG(e,r);let a=uM.evaluateXPathToFirstNode(e.xPath,o,null,null);if(!a)throw new E("ActionFailureError",`Could not resolve cached target via XPath: ${e.xPath}`);if(e.requiredRelatedElements){let p=e.requiredRelatedElements;i.startSection("Validate related elements are similar enough to past runs",()=>{for(let m of p){let g=uM.evaluateXPathToFirstNode(m.xPath,o);if(!g)throw new E("ActionFailureError",`Required related element not found for XPath: ${m.xPath}`);pM(g,m.requirements)}})}let s=$o(a);if(!s)throw new E("ActionFailureError","Resolved native element has no bounding box");pM(a,e.requirements,{targetBounds:e.bounds,newElementBounds:s});let c;for(let[p,m]of n.idToElement.entries())if(m===a){c=p;break}let l=e.elementOnlySerializedXml,u=e.xPath;return c!==void 0&&(l=zh(n,c)??l,u=nd(n,c)??u),{resolvedTarget:{...e,resolvedNode:a,bounds:s,elementOnlySerializedXml:l,xPath:u}}}async function cG(r,e){let{stateManager:t,logger:n,signal:o}=e,i=se(),a=await t.getActiveWebview();if(!a||!a.browserController)throw n.error({webview:a?{...a,browserController:!!a.browserController}:void 0},"resolveTargetCacheInWebView: No browser controller attached"),new E("InternalWebAgentError","No browser controller is attached to the requested webview");let s=a.browserController.browser;if(!r.browserCache)throw n.error({target:r},"resolveTargetCacheInWebView: No browser target available on cache"),new E("InternalWebAgentError","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 qo(r){let{command:e,cacheKey:t="cache",targetName:n="target",updatedCache:o}=r;ec(e)&&(e[t]={...e[t],[n]:bi.parse(o)},r.updatedWithAI&&(e[t].updatedAt=new Date))}function ad(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 Xe=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,metadata:c}){let l=this.logger.child({...c});await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before locating an element with AI"});let u=await t.startAsyncSection("Get emulator state",async()=>{let f=await this.stateManager.getDomState({skipFetchingFullWebviewContent:n,removeWebviewContent:o}),b=await this.stateManager.getCurrentScreenshotPngString();return{emulatorState:f,screenshot:b}}),d;try{d=await t.startAsyncSpan("AI_LOCATOR_CALL",async f=>{let b=await this.generator.getMobileElementLocation({description:e,screenXml:u.emulatorState.graph.xml,screenshot:u.screenshot,memory:i?a:void 0},{logger:l,loggerTags:ve(l),abortSignal:this.aborter.controller?.signal,useMemory:i,agentConfigVersion:this.aiSettings.agentConfig?.["mobile-locator"]});return f.result=b,b})}catch(f){throw this.throwIfAborted(),l.error({err:f},"Failed to locate element"),new E("InternalWebAgentError",`Failed to locate element: ${f instanceof Error?f.message:f}`,{errOptions:{cause:f}})}if(d.id===-1)throw new E("NoMatchingElementError",d.thoughts??"No matching element found");let{target:p,resolvedNode:m}=mM({aiResponse:d,description:e,emulatorState:u.emulatorState});if(p.type==="NATIVE")return t.addSpan({type:"TARGET_RESOLUTION",startTime:Date.now(),endTime:Date.now(),result:{serializedElement:p.elementOnlySerializedXml},attributes:{},subSpans:[]}),{resolvedTarget:{...p,resolvedNode:m},thoughts:d.thoughts};let{browserLocateResult:g,browserController:h}=await t.startAsyncSpan("TARGET_RESOLUTION",async f=>{let b=await this.stateManager.getActiveWebview();if(!b||!b.browserController)throw new E("InternalWebAgentError","No browser controller is attached to the requested webview");let T=await b.browserController.locateElement({description:e,disableCache:!1,useMemory:i,memory:i?s:void 0,logger:this.logger});return f.result={serializedElement:T.target.nodeOnlySerializedHtml??"Unknown HTML element in webview"},{browserLocateResult:T,browserController:b.browserController}});return{resolvedTarget:{...p,controller:h,resolution:g.resolution,browserCache:g.target},thoughts:g.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,p={commandId:o.id};if(i==="cache"&&"cache"in o&&o.cache){let b=o.cache;a==="target"&&"target"in b?d=b.target:a==="fromTarget"&&"fromTarget"in b?d=b.fromTarget:a==="toTarget"&&"toTarget"in b&&(d=b.toTarget)}let m=!1,g=gM(d),h;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 b=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:this.shouldUseMemoryForCommand(o),memory:d?.memory,webviewMemory:Hh(d),metadata:p});h=b.thoughts;let T=await t(b.resolvedTarget);return qo({command:o,cacheKey:i,targetName:a,updatedCache:b.resolvedTarget,updatedWithAI:!0}),{result:T,thoughts:h}}let f;try{await this.stateManager.waitForScreenshotStability({timeoutMs:5e3,signal:this.aborter.controller?.signal,reason:"Waiting for stability before cache resolution"}),f=await this.stateManager.getDomState();let{resolvedTarget:b,updatedCache:T}=await c.startAsyncSpan("CACHE_RESOLUTION",async x=>{let{resolvedTarget:w}=await id({target:g,domState:f,stateManager:this.stateManager,logger:this.logger}),O=ad(w),v=dG(g,O);return v&&Object.keys(v).length>0&&this.logger.info({cacheDiffs:v},"Successfully resolved target with cache"),x.attributes.serializedElement=w.type==="WEBVIEW"?w.browserCache?.nodeOnlySerializedHtml??"Unknown HTML element in webview":w.elementOnlySerializedXml,{resolvedTarget:w,updatedCache:O}}),C=await t(b);return qo({command:o,cacheKey:i,targetName:a,updatedCache:T,updatedWithAI:!1}),g.type!=="WEBVIEW"&&ft.increment("cache_target_resolution_v2",1,["outcome:hit","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.19.1"]),{result:C,thoughts:"Successfully executed preset action with cache"}}catch(b){g.type!=="WEBVIEW"&&ft.increment("cache_target_resolution_v2",1,["outcome:miss","platform:native",`hasRequirements:${!!g.requirements}`,`hasAdditionalElements:${!!g.requiredRelatedElements?.length}`,`orgId:${this.orgId}`,"cliVersion:0.19.1"]),this.throwIfAborted(),this.logger.warn({err:b},"Failed to resolve target cache, retrying with AI");let T=this.shouldUseMemoryForCommand(o),C=await this.findElement({description:n,tracer:c,skipFetchingFullWebviewContent:l,removeWebviewContent:u,useMemory:T,memory:g?.memory,webviewMemory:Hh(g),metadata:p});h=C.thoughts;let x=await t(C.resolvedTarget);return qo({command:o,cacheKey:i,targetName:a,updatedCache:C.resolvedTarget,updatedWithAI:!0}),{result:x,thoughts:h}}}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 E("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 gM(this.aiSettings)}};function gG(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 ea=class extends Xe{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,p=o+u;return await this.tapOnAbsoluteCoordinates({x:d,y:p,...t}),{x:d,y:p}}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=hM.join(mG(),"momentic","downloads"),s=hM.join(a,this.orgId,i);return pG(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 se().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=se(),n=gG(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 eo=class extends Xe{async doPress({keycode:e,longPress:t}){await se().startAsyncSpan("EMULATOR_INTERACTION",async()=>this.driver.executeScript("mobile: pressKey",[{keycode:e,isLongPress:t}]),{name:"Send key events to emulator"})}};var fM=25,sd=class extends Xe{async doType(e){let t=se();if(!e.target){if(e.clearContent)throw new E("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 E("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 se().startAsyncSpan("EMULATOR_INTERACTION",async o=>{o.withinWebview=!0;let i={clearContent:e.clearContent,forceClearContent:e.forceClearContent,delay:e.keyPressDelayMs??fM};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 ea(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=se(),n=e.keyPressDelayMs??fM;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=se();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 eo(this.constructPerformerParams()).doPress({keycode:67})}};import Xt from"zod";var SM=.8,to=.2,hG=Xt.object({navigationBar:Xt.object({visible:Xt.boolean(),x:Xt.number(),y:Xt.number(),width:Xt.number(),height:Xt.number()}),statusBar:Xt.object({visible:Xt.boolean(),x:Xt.number(),y:Xt.number(),width:Xt.number(),height:Xt.number()})}),ta=class extends Xe{async getHardcodedScrollableElementBounds(e,t){let n;switch(e.type){case"SCREEN":n=this.getInsetBoundsFromViewport(t);break;case"OPEN_APP":try{let o=hG.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*to),n=Math.floor(e.height*to);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*to),l=Math.floor(s*to);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=se();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=>se().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*to),s=Math.floor(i*to);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*to),u=Math.floor(c.height*to),d=Math.max(1,c.width-l*2),p=Math.max(1,c.height-u*2),m={x:c.x+l+d/2,y:c.y+u+p/2},g=(s?p:d)*(t.viewportPercent??SM)*(s?t.direction==="down"?1:-1:t.direction==="right"?1:-1);e.attributes.startPoint=m,e.attributes.scrollPixelAmount=g,await o.browser.mouseDragUsingVisualCoordinates({deltaX:s?0:g,deltaY:s?g:0,steps:10,dragDurationMs:t.durationMs,fromTarget:m})}async swipeByAbsoluteCoordinates({span:e,direction:t,percent:n=SM,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 SG from"pixelmatch";import{_android as yG,chromium as bG}from"playwright";import{PNG as RM}from"pngjs";import{z as je}from"zod";var yM=je.object({"Android-Package":je.string(),Browser:je.string(),"Protocol-Version":je.string(),"User-Agent":je.string(),"V8-Version":je.string(),"WebKit-Version":je.string(),webSocketDebuggerUrl:je.string()}),bM=je.object({description:je.string(),devtoolsFrontendUrl:je.string(),id:je.string(),title:je.string(),type:je.string(),url:je.string(),webSocketDebuggerUrl:je.string()}),EM=je.object({proc:je.string(),webview:je.string(),webviewName:je.string()}),TM=je.array(EM.extend({info:yM.optional(),pages:je.array(bM).optional()})),ULe=je.array(EM.extend({info:yM,pages:je.array(bM)}));function Gh(r,e,t=.01){let n=Buffer.from(r,"base64"),o=Buffer.from(e,"base64"),i=RM.sync.read(n),a=RM.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 SG(i.data,a.data,l,s,c,{threshold:t})/(s*c)*100}var ld=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,p;if(l)p=l;else{let g=(await yG.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 E("UserInfrastructureError",`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 E("UserInfrastructureError",`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.`);p=g[0]}return new r({driver:e,context:d,logger:t,device:p,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=se(),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 E("InternalWebAgentError",`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 se().startAsyncSpan("WAIT_FOR_SCREENSHOT_STABILITY",async i=>{i.attributes.reason=n;let a=Date.now(),s,c,l=!1;for(;Date.now()-a<e;){c&&c<250&&await j(250-c,t),t?.throwIfAborted();let u=Date.now();if(!s){s=await this.getRawScreenshotBase64(),c=u-a;continue}let d=await this.getRawScreenshotBase64();if(c=u-a,Gh(s,d)<=o){l=!0;break}s=d}l||(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");(nl(a.tagName)||n==="com.android.chrome"&&s==="Web View"&&a.tagName.toLowerCase().startsWith("frame"))&&o.push({id:i,originalElement:a,bounds:$o(a)})}return o}async getActiveWebviewContent(){let e=await this.getActiveWebview();if(!e||!e.browserController)return;this.throwIfAborted();let t=e.browserController;return(await se().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 se().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 lM(a,{injectedWebviewContent:n,disableMomenticAccessibilityTree:this.options.disableMomenticAccessibilityTree,removeWebviewContent:e?.removeWebviewContent,viewportBounds:i}),context:this.currentContext}},{timeoutMs:15e3})}async getPageSource(){return await se().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 se().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"),this.logger.info({currentPkg:e,allWebviews:Array.from(this.webviews.values()).map(n=>({contextId:n.contextId,packageName:n.packageName,active:n.active}))},"getActiveWebview: filtering webviews");let t=[];for(let n of this.webviews.values())n.packageName===e&&n.active&&t.push(n);if(this.logger.info(`getActiveWebview: found ${t.length} matching webviews`),t.length!==0){if(t.length>1)throw new E("UserInfrastructureError","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 St(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 se().startAsyncSpan("EMULATOR_READ_STATE",async()=>{let t=await this.driver.execute("mobile: getContexts");this.aborter.controller?.signal.throwIfAborted();let n;try{n=TM.parse(t)}catch(o){throw new E("InternalWebAgentError",`Failed to parse contexts. Original error:
4363
4363
  ${o}
4364
4364
  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 se().startSection("Run remote Chrome initialization",async(n,o)=>{let i={};o.attributes.timings=i;let a=await Zs.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 td({browser:a,generator:this.fixtures.browserGenerator,logger:this.logger,orgId:this.orgId,storage:this.fixtures.storage,localCodeEvalTools:this.fixtures.localCodeEvalTools,visualDiffScreenshotStorage:new bc})})}async connectPlaywrightToWebview(e,t){return se().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 E("InternalWebAgentError",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 se().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 bG.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 wM=5,CM=.8,EG=1,cd=class extends ta{async executeScrollTo(e){let t=e.target.description,n=e.scrollStepPercent??CM,o=await this.tryUseCachedScrollPosition(e,t);return o||this.searchForElement(e,t,n)}async resolveContainer({scrollableElement:e,containerCache:t,aiMetadata:n}){let o=await this.driver.getWindowRect();if(e.type==="CUSTOM_COORDINATES")return{bounds:{left:0,top:0,width:o.width,height:o.height}};if(e.type!=="CUSTOM")return{bounds:await this.getHardcodedScrollableElementBounds(e,o)};let i=se(),a=e.target.description;if(t){let l=this.getBoundsFromNativeCache(t);return this.logger.info({bounds:l},"Got container bounds from native cache"),{bounds:l,cache:t}}let{resolvedTarget:s}=await this.findElement({description:a,tracer:i,metadata:n});if(s.type!=="NATIVE")throw new Error(`ActionFailureError: Custom scroll container "${a}" resolved to a webview element. Custom containers must be native elements.`);let c=this.getBoundsFromNativeCache(s);return this.logger.info({bounds:c},"Got container bounds from AI"),{bounds:c,cache:s}}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=se();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=se(),a=e.scrollStepPercent??CM,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,aiMetadata:{commandId:e.id}});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,aiMetadata:{commandId:e.id}}),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 id({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,metadata:{commandId:e.id}});a=u.resolvedTarget,s=u.thoughts}catch(u){if(this.logger.warn({err:u},"Failed to find scroll-to target with AI"),u instanceof E&&u.reason==="NoMatchingElementError")return null;throw u}return a.type==="WEBVIEW"?(await this.scrollWebviewTargetIntoView(a),qo({command:e,updatedCache:ad(a),updatedWithAI:!0}),{success:!0,message:s}):(qo({command:e,updatedCache:{...a,scrollDetails:o},updatedWithAI:!0}),{success:!0,message:s})}async searchForElement(e,t,n){let o=se(),i=await this.resolveContainer({scrollableElement:e.scrollableElement,aiMetadata:{commandId:e.id}});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<wM;u++){this.throwIfAborted();let d=this.buildScrollDetails(e,a,i.cache),p=await this.tryFindElement({cmd:e,description:t,tracer:n,scrollDetails:d});if(p)return p;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 m=TG(e.scrollableElement);l=await this.scrollByPage({direction:e.direction,containerBounds:s,scrollStepPercent:o,rawCoordinates:m}),a+=e.direction==="down"?c:-c}throw new Error(`ActionFailureError: Could not find element "${t}" after ${wM} 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 se().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,aiMetadata:a}){if(e===0)return;let s=se(),c,l,u;if(t.type==="CUSTOM_COORDINATES")c=t.startX,l=t.startY,u=t.deltaPixels;else{let m=(await this.resolveContainer({scrollableElement:t,containerCache:n,aiMetadata:a})).bounds,g=m.height*i,h=this.calculateSwipeCoordinates({containerBounds:m,direction:o,desiredDelta:g});c=h.startX,l=h.startY,u=h.actualDelta}let d=Math.ceil(Math.abs(e)/u);this.logger.debug({pixelDelta:e,direction:o,scrollableElementType:t.type,startX:c,startY:l,maxScrollPerStep:u,numScrolls:d},"scrollByPixelDelta calculated parameters"),await s.startAsyncSpan("EMULATOR_INTERACTION",async p=>{p.attributes.pixelDelta=e,p.attributes.numScrolls=d,p.attributes.maxScrollPerStep=u,p.attributes.startX=c,p.attributes.startY=l;let m=0;for(let g=0;g<d;g++){this.throwIfAborted();let h=Math.abs(e)-m,f=Math.min(u,h);await this.performRawSwipe({startX:c,startY:l,deltaPixels:f,direction:this.invertDirection(o)}),m+=f}},{name:`Scroll ${o} by ${e}px`})}async executeScrollGesture({direction:e,containerBounds:t,scrollStepPercent:n,diffThresholdPercent:o=EG,rawCoordinates:i}){let a=await this.stateManager.getRawScreenshotBase64(),s,c,l;if(i)s=i.startX,c=i.startY,l=i.deltaPixels;else{let m=t.height*n,g=this.calculateSwipeCoordinates({containerBounds:t,direction:e,desiredDelta:m});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=Gh(a,u),p=d>o;return this.logger.debug({diffPercent:d,diffThresholdPercent:o,canScrollMore:p,direction:e,actualDelta:l,rawCoordinates:i},"Scroll gesture visual diff result"),p}};function TG(r){if(r.type==="CUSTOM_COORDINATES")return r}import{randomUUID as vG}from"crypto";import il from"fs";import{tmpdir as AG}from"os";import ra from"path";var ud=class extends Xe{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 ${ra.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(il.existsSync(n))o=n;else if(il.existsSync(ra.join("/",n)))o=ra.join("/",n);else throw new E("UserConfigurationError",`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 E("UserInfrastructureError",`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{il.unlinkSync(a)}catch(s){this.logger.warn({err:s,path:a},"Failed to remove temporary APK file")}}}}throw new E("UserConfigurationError",`Unsupported URI scheme for APK installation: ${t.protocol}`)}catch(t){if(t instanceof TypeError){let n=ra.resolve(e);return this.assertFileExists(n),{localPath:n,cleanup:()=>{}}}throw t}}assertFileExists(e){try{il.accessSync(e)}catch{throw new E("UserConfigurationError",`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=ra.extname(t)||".apk",o=ra.join(AG(),`momentic-apk-${vG()}${n}`);return il.writeFileSync(o,e),o}};import{existsSync as RG,readFileSync as wG}from"fs";import CG from"zod";var xG=CG.string().url();async function xM(r){if(xG.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 E("UserInfrastructureError",`Fetch failed or timed out for URL: ${r}`,{errOptions:{cause:i}})}finally{clearTimeout(t)}if(!n.ok)throw new E("UserInfrastructureError",`Failed to fetch file from URL: ${r}, status: ${n.status}`);let o=await n.arrayBuffer();return Buffer.from(o).toString("base64")}if(!RG(r))throw new E("UserInfrastructureError",`File does not exist at path: ${r}`);return wG(r).toString("base64")}var dd=class extends Xe{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),p=o+a/2,m=i+s/2,g=c+u/2,h=l+d/2,f=n?.hoverDuration??500,b=n?.dragDuration??1e3;await this.driver.performActions([{type:"pointer",id:"finger1",parameters:{pointerType:"touch"},actions:[{type:"pointerMove",duration:0,x:p,y:m},{type:"pointerDown",button:0},{type:"pause",duration:f},{type:"pointerMove",duration:b,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 E("UserConfigurationError","Cannot drag and drop between different webviews");let i=n?.dragDuration??1e3,a=n?.hoverDuration??1e3,s;n?.dragDuration&&(s=Math.max(1,Math.floor(i/200))),await o.browser.dragAndDrop(e.resolution.locator,t.resolution.locator,{hoverDurationMs:a,steps:s,dragDurationMs:i})}async executeDragAndDrop({command:e}){let t=se();if(e.fromTarget.type!=="description"||e.toTarget.type!=="description")throw new E("UserConfigurationError","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 E("UserConfigurationError",`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}
4365
- ${c}`}}};import{cloneDeep as MM}from"lodash-es";var pd=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:Dt*1e3})}async isEnabled(e){return await e.isEnabled({timeout:Dt*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)}},md=class{async getTextContent(e){return rl(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 MG=5e3,gd=class extends Xe{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??Dt)*1e3,o=n+1e4,i,a=0,s=500,c=MM(e.cache);if(e.target.type!=="description")throw new E("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=MM(c),await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),MG);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});return l.success||c&&e.cache&&(e.cache=js({originalCache:c,newCache:e.cache,targetGetter:u=>u.target}).result),l}async executeElementCheckHelper(e,t){let n=se();if(e.target.type!=="description")throw new E("UserConfigurationError","x/y targets are not supported for the Element Check step");let o=bu(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 E&&i.reason==="NoMatchingElementError"||i instanceof On)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=se(),{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 md,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=se(),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 pd,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=yt(i,500,!0),Jr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${Sr(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=yt(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=Sr(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 ${Sr(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 ${Sr(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=Sr(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 _G=5e3,hd=class extends Xe{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??Dt)*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),_G);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await se().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 ${zg(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 ed({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var fd=class extends Xe{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 E("UserConfigurationError",`Package ${t} not found`);if(n.split(`
4366
- `).filter(i=>!!i).length>1)throw new E("UserConfigurationError",`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new E("UserInfrastructureError",`Failed to uninstall package ${t}: ${i}`)}}};var na=class r extends Xe{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 p={controller:s},m=await ld.init({driver:e,logger:n,fixtures:o,orgId:i,limbarClient:l,options:a?.emulator??{},aborter:p,adbPort:c,playwrightDevice:u}),g=new r({driver:e,generator:t,stateManager:m,logger:n,fixtures:o,options:a,aborter:p,orgId:i,aiSettings:d,adbPort:c});return await g.initializeSettings(),g}async installApp(e){await this.stateManager.executeRawADBCommand(`install ${PG.resolve(e)}`)}async executeCommand(e){let t=["type","a11yData","thoughts","cache","code"],n;try{n=await Ou({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 E("UserConfigurationError",`Failed to substitute template strings in command: ${o.message}`,{errOptions:{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{Lu(e.command,n)}}async executeCommandHelper({command:e}){let t=se();switch(e.type){case"TAP":return new ea(this.constructPerformerParams()).executeTap({command:e});case"TYPE":return await new sd(this.constructPerformerParams()).doType(e);case"AI_CHECK":{let n=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=wu(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 p="",m="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{p=(await this.stateManager.getDomState({})).graph.xml,m=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:p,screenshot:m,memory:n?e.cache?.memory:void 0},{logger:this.logger,loggerTags:ve(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(p){this.throwIfAborted(),this.logger.info({err:p},`AI check assert attempt ${c} failed, retrying...`),d=p instanceof Error?p:new Error(`${p}`)}finally{c++}}return{success:!1,message:d?.message}}case"SWIPE":return new ta(this.constructPerformerParams()).executeSwipe(e);case"SCREEN_CHECK":return new hd(this.constructPerformerParams()).executeScreenCheck(e);case"ELEMENT_CHECK":return await new gd(this.constructPerformerParams()).executeElementCheck(e);case"DRAG_AND_DROP":return await new dd(this.constructPerformerParams()).executeDragAndDrop({command:e});case"SCROLL_TO":return new cd(this.constructPerformerParams()).executeScrollTo(e);case"JAVASCRIPT":{let n;try{n=await Zr({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})}catch(o){throw new E("ActionFailureError",o instanceof E?o.message:`${o}`,{errOptions:{cause:o}})}try{JSON.stringify(n)}catch(o){throw new E("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 E("UserConfigurationError",`Invalid URL: ${l instanceof Error?l.message:`${l}`}`)}let o=new OG,i=IG(fetch,o),a=Date.now(),s=await Zu({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),c=lc(o,n);return{output:Pa.parse({...s,cookies:c}),success:!0,message:`Successfully executed request in ${Date.now()-a}ms`}}case"OPEN_NOTIFICATION_DRAWER":return await new eo(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 E("UserConfigurationError",`Could not find main activity name for package ${e.packageName}. Unexpected output: ${a}`);if(a.includes("No activity found"))throw new E("UserConfigurationError",`No activity found for package ${e.packageName}.`);if(n=a.trim().split(`
4367
- `).pop()?.replace(/^.*\//,""),!n)throw new E("UserConfigurationError",`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 E("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 eo(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 eo(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 ud(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new fd(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await xM(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 E("UserConfigurationError",`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ROTATE_ORIENTATION":return await this.driver.execute("mobile: shell",{command:"settings",args:["put","system","accelerometer_rotation","0"]}),await this.driver.execute("mobile: shell",{command:"settings",args:["put","system","user_rotation",e.orientation==="LANDSCAPE"?"1":"0"]}),{success:!0,output:{newViewportBounds:await this.getViewportBounds()}};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 E("UserConfigurationError","No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await aM({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??Hl;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 IM({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,p=r.handshake.query?.testMetadata,m=r.handshake.query?.fileName,g=m?_M.basename(m,".test.yaml"):"",h=xr.parse(JSON.parse(p??"")),f=h.id,b=h.settings?.defaultChannel,T=h.settings?.defaultTag,C=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:C});let x=await s(C),w=h.settings?.defaultEnv,O={};w&&(O=(await x.fetchEnvironment(w,e))?.variables??{});let v=Ci.parse(O[vo]),M=Ci.parse(O[Wa]),k=await u(C,e),V={...k.emulator,...h.settings?.emulator},J=h.settings?.defaultApkFilePath?.trim()||M,te=l.getSession(d);if(te){if(e.info("Reconnecting to existing Android session"),te.local)return r.emit("session",te.metadata),te.softDeleted=!1,te.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let Et;if(V.region==="local"){if(await l.clearSoftDeletedLocalSessions(e),l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let ln=h.settings?.emulator?.localEmulatorSettings?.avdId?.trim()||v;if(!ln)throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options \u2192 Emulator \u2192 Local AVD ID) or on the environment via ${vo}.`);Et={avdId:ln,apkToInstall:b?{channel:b,tag:T}:void 0,apkFilePath:J}}else Et={region:V.region,apkToInstall:b?{channel:b,tag:T}:void 0,osVersion:V.remoteEmulatorSettings?.androidVersion};let Y=Date.now(),{driver:H,cleanup:ce,emulatorName:ge,adbPort:Je,limbarClient:xe,limbarToken:Kt,limbarUrl:Ot,playwrightDevice:Fe}=await t({socket:r,logger:e,creationOpts:Et}),lt=_M.join(LG(),`logcat-logs-${C}-${f}-${d}.txt`),Nr=await Pu({driver:H,onLogs:ln=>{r.emit("logcatLogs",ln)},logFilePath:lt});e.info({adbPort:Je,apkChannel:b,apkTag:T,duration:Date.now()-Y,emulatorName:ge},"Android emulator session initiated"),e=e.child({emulator:ge});let wn=await o(C,e),io=await i(C,e),Qo=await a(C,e),ba=c?await c(C):void 0,ao=new vi({variablesFromEnvironment:O,envName:w,testName:g}),so=await na.init({driver:H,generator:wn,logger:e,limbarClient:xe,playwrightDevice:Fe,aiSettings:{...k.ai,useMemory:k.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:V},fixtures:{storage:x,browserEnricher:Qo,browserGenerator:io,localCodeEvalTools:ba,testContext:ao},orgId:C,adbPort:Je,abortController:new AbortController}),lo=await so.getViewportBounds();if(!r.connected)throw await Nr(),await ce(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Dr=NG({socket:r,testContext:ao}),$=async()=>{clearInterval(Dr);try{await Nr(),await ce(),await so.cleanup()}catch(ln){e.warn({err:ln},"Failed to clean up emulator in socket server")}},Ea={sessionId:d,testId:f,orgId:C,emulatorName:ge,testName:g,limbarUrl:Ot,limbarToken:Kt,viewportBounds:lo};return l.registerSession(d,{controller:so,cleanup:$,emulatorName:ge,local:V.region==="local",metadata:Ea,logFilePath:lt}),r.emit("session",Ea),Ea}function NG({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}import Td from"fs/promises";import{z as GG}from"zod";var U="v1",Vh="mobile-cli",Ko="0.19.0";var DG=9e4,kG=3,UG=1500,FG=15e3,Lr=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function BG(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Wh=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Ko&&(e[yc]=Ko),Vh&&(e[AE]=Vh),e}async sendRequest(e,t){let{retries:n=kG,requestTimeoutMs:o=DG,initialRetryDelayMs:i=UG,maxRetryDelayMs:a=FG,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(p){u=p;try{s?.(u)}catch{}if(p instanceof Lr&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Gn),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-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 BG(u);throw new Lr(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(t.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=t.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},an=class extends Wh{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vE]:this.mode??""}}};import{createAnthropic as zG}from"@ai-sdk/anthropic";function HG(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[yc]:Ko??"",...t&&{[wE]:t},...n||{}};return o&&(i[RE]=JSON.stringify(o)),i}var Sd=r=>e=>{let t=HG(r);return zG({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var Yo=class extends an{agentConfig;constructor(e,t){let n={...pb,...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 Jy.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 Xy.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return GG.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 PE.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 IE.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 xE.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 ME.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 _E.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 CE.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 _p.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 OE.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 xp.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 _y.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 Iy.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 mp.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return db.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 Ry.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 xy.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 Cy.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Bf.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return Sd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as jh}from"zod";var Jt=class extends an{constructor(e){super({...e,mode:void 0})}getAppUrl(){return hs(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{R.warn(`API key check failed: ${t.message}`)}});return jE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return HE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return NE.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 kE.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 UE.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return LE.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return WE.parse(t)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${U}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${U}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let t={};return{data:await this.sendRequest(`/${U}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:t}),contentType:t["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return $E.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 lT.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 qE.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 $y.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 KE.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 YE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return XE.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 JE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return dT.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 gs.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 gs.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 Am.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 gs.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 gs.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 Am.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return jh.record(jh.string(),jh.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return QE.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 ZE.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 tT.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 rT.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let t=await this.sendRequest(`/${U}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return eT.parse(t)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${U}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${U}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let t=await this.sendRequest(`/${U}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Db.parse(t)}};async function $h(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(R.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),R.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return R.debug("Got auth info from API"),n}var yd=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var oa=class extends an{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 zf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var ia=class{constructor(e,t){this.client=e;this.orgId=t}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return hs(e)}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async createOnDemandScreenshot(e,t,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:t.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}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 VG,en as WG}from"@faker-js/faker";var aa="v1",sa=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 VG({locale:WG}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${aa}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Lr?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${aa}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${aa}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${aa}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${aa}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${aa}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function PM(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var bd=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await PM(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 la=class extends an{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 Fb.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 Hb.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 Wb.parse(n)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return Sd({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function Ed({logger:r,orgId:e,client:t,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a}){return a?new Ec:new qh(r,e,t,n,{alwaysSaveCache:i,regenerateCache:o})}var qh=class{constructor(e,t,n,o,i){this.orgId=t;this.client=n;let{regenerateCache:a,alwaysSaveCache:s}=i,{gitBranchName:c,gitProtectedBranches:l}=o;this.cacheHeaders=Em(o),this.readCaches=!a,e.info({options:i,gitBranchName:c,gitProtectedBranches:l},"Cache storage initialization options");let u=c&&l.includes(c);s||!u?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);for(let i of[t])i&&Hg({steps:i,stepCacheEntries:n,logger:e.logger});if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}let{cachesToSave:o}=await Qr({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};async function OM({socket:r,logger:e,globalStateManager:t,authorization:n}){let o=r.id,i=t.getSession(o);i&&n&&i.logFilePath&&jG({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:n,logger:e}),await t.removeSession(o,e)}async function jG({testId:r,sessionId:e,logFilePath:t,authorization:n,logger:o}){try{let i;try{i=await Td.stat(t)}catch{o.debug({logFilePath:t},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:t},"Logcat file is empty, skipping upload"),await Td.unlink(t);return}let a=new Jt(n),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:r,sessionId:e}),c=await Td.readFile(t),l=await fetch(s,{headers:{"Content-Length":c.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:c});if(l.status!==200)throw new Error(`Failed to upload logcat: ${l.status} ${await l.text()}`);o.info({testId:r,sessionId:e},"Logcat file uploaded successfully")}catch(i){o.warn({err:i,testId:r,sessionId:e},"Failed to upload logcat file")}finally{try{await Td.unlink(t)}catch(i){o.warn({err:i,logFilePath:t},"Failed to delete temp logcat file")}}}var $G=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},LM={event:"cancel",createHandler:$G};var qG=({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})}},NM={event:"fetchA11yTree",createHandler:qG};import{diff as hV}from"deep-object-diff";import{cloneDeep as fV}from"lodash-es";var KG=1e4,YG=5e3;function DM(r,e,t,n){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:YG});if(typeof s=="string"&&s.trim()==="ping")o>0&&(e.info("Driver heartbeat restored"),n?.()),o=0;else throw new Error(`Unexpected heartbeat output: ${s}`)}catch(s){o++;let c=s instanceof Error?s.message:`${s}`;if(e.warn({attempt:o,error:c},"Driver heartbeat failed"),o>=3){let l="The Android driver appears unresponsive, indicating a possible ADB tunnel/emulator failure";e.error({err:s},l),R.error(l),t?.()}}}let a=setInterval(()=>{i()},KG);return i(),a}async function kM(r){let e=Date.now(),t=r.fixtures.controller;try{return await XG(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 XG({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await JG({step:n,params:e}),s={};Object.entries(a).forEach(([p,m])=>{s[p]=JSON.stringify(m)});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(),Bw({result:c,...Fw(d)}),c}async function JG({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 Zr({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as UM}from"crypto";import{diff as QG}from"deep-object-diff";import{cloneDeep as ZG}from"lodash-es";async function FM({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?ZG(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 p=UM(),m=await a.getScreenshotBase64();l.afterSnapshot=p,n.attachAfterScreenshot({logger:i,snapshotId:p,screenshot:Buffer.from(m,"base64")})}catch(p){i.warn({err:p},"Failed to take after screenshot")}if(s){let p=UM();l.beforeSnapshot=p,n.attachBeforeScreenshot({logger:i,snapshotId:p,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=QG(c,u);d&&Object.keys(d).length>0&&i.info({diffs:Ri(d)},"Updated cache")}return l}import{streamText as uV}from"ai";import{randomUUID as dV}from"crypto";var vd=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 lV,stepCountIs as cV}from"ai";var Kh="get_emulator_state",Ad="finish";import BM from"dedent";var tV=BM`
4365
+ ${c}`}}};import{cloneDeep as MM}from"lodash-es";var pd=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:Dt*1e3})}async isEnabled(e){return await e.isEnabled({timeout:Dt*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)}},md=class{async getTextContent(e){return rl(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 MG=5e3,gd=class extends Xe{async executeElementCheck(e){let t=Date.now(),n=(e.timeout??Dt)*1e3,o=n+1e4,i,a=0,s=500,c=MM(e.cache);if(e.target.type!=="description")throw new E("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=MM(c),await j(s,this.abortSignal),s=Math.min(Math.floor(s*1.5),MG);else return i}let l=await this.executeElementCheckHelper(e,{cacheIsInvalidAfterResolution:!0});return l.success||c&&e.cache&&(e.cache=qs({originalCache:c,newCache:e.cache,targetGetter:u=>u.target}).result),l}async executeElementCheckHelper(e,t){let n=se();if(e.target.type!=="description")throw new E("UserConfigurationError","x/y targets are not supported for the Element Check step");let o=wu(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 E&&i.reason==="NoMatchingElementError"||i instanceof On)?{success:!0}:{success:!1,message:`Failed to evaluate element content assertion: ${i instanceof Error?i.message:`${i}`}`}}}async executeNativeElementCheck(e,t){let n=se(),{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 md,span:a});return a.result=s,s},{name:"Native element check"})}async executeWebviewElementCheck(e,t){let n=se(),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 pd,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=yt(i,500,!0),Qr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})?{success:!0}:{success:!1,message:`The content ${Sr(e)} '${e.value}': ${i}`}}case"ELEMENT_ATTRIBUTE":{"evaluate"in t&&(o.attributes.elementOuterHtml=yt(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(!Qr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=Sr(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 ${Sr(e)}`}}case"ELEMENT_NAME":{let i=await n.getTagName(t);return Qr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!0})?{success:!0}:{success:!1,message:`The element tag name ${Sr(e)} '${e.value}': ${i}`}}case"ELEMENT_STYLE":{let i=await n.getStyleProperty(t,e.property);if(!Qr(i,e.value,e.operation,{negated:!!e.negated,ignoreCase:!1})){let a=Sr(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 _G=5e3,hd=class extends Xe{async executeScreenCheck(e){let{timeout:t}=e,n=Date.now(),o=(t??Dt)*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),_G);else return c}return await this.executeScreenCheckHelper(e)}async executeScreenCheckHelper(e){return await se().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 ${Hg(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 ed({assertion:e.assertion,logger:this.logger,browser:n,autoExpandIframes:!!n.userBrowserSettings.autoExpandIframes})}};var fd=class extends Xe{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 E("UserConfigurationError",`Package ${t} not found`);if(n.split(`
4366
+ `).filter(i=>!!i).length>1)throw new E("UserConfigurationError",`Multiple packages found for ${t}`);try{await this.stateManager.executeRawADBCommand(`uninstall ${t}`)}catch(i){throw new E("UserInfrastructureError",`Failed to uninstall package ${t}: ${i}`)}}};var na=class r extends Xe{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 p={controller:s},m=await ld.init({driver:e,logger:n,fixtures:o,orgId:i,limbarClient:l,options:a?.emulator??{},aborter:p,adbPort:c,playwrightDevice:u}),g=new r({driver:e,generator:t,stateManager:m,logger:n,fixtures:o,options:a,aborter:p,orgId:i,aiSettings:d,adbPort:c});return await g.initializeSettings(),g}async installApp(e){await this.stateManager.executeRawADBCommand(`install ${PG.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 E("UserConfigurationError",`Failed to substitute template strings in command: ${o.message}`,{errOptions:{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{Ru(e.command,n)}}async executeCommandHelper({command:e}){let t=se();switch(e.type){case"TAP":return new ea(this.constructPerformerParams()).executeTap({command:e});case"TYPE":return await new sd(this.constructPerformerParams()).doType(e);case"AI_CHECK":{let n=this.shouldUseMemoryForCommand(e),o=15,i=e.timeoutSecs?e.timeoutSecs*1e3:5e3,a=Pu(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 p="",m="";await t.startAsyncSpan("EMULATOR_READ_STATE",async()=>{p=(await this.stateManager.getDomState({})).graph.xml,m=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:p,screenshot:m,memory:n?e.cache?.memory:void 0},{logger:this.logger,loggerTags:ve(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(p){this.throwIfAborted(),this.logger.info({err:p},`AI check assert attempt ${c} failed, retrying...`),d=p instanceof Error?p:new Error(`${p}`)}finally{c++}}return{success:!1,message:d?.message}}case"SWIPE":return new ta(this.constructPerformerParams()).executeSwipe(e);case"SCREEN_CHECK":return new hd(this.constructPerformerParams()).executeScreenCheck(e);case"ELEMENT_CHECK":return await new gd(this.constructPerformerParams()).executeElementCheck(e);case"DRAG_AND_DROP":return await new dd(this.constructPerformerParams()).executeDragAndDrop({command:e});case"SCROLL_TO":return new cd(this.constructPerformerParams()).executeScrollTo(e);case"JAVASCRIPT":{let n;try{n=await Jr({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})}catch(o){throw new E("ActionFailureError",o instanceof E?o.message:`${o}`,{errOptions:{cause:o}})}try{JSON.stringify(n)}catch(o){throw new E("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 E("UserConfigurationError",`Invalid URL: ${l instanceof Error?l.message:`${l}`}`)}let o=new OG,i=IG(fetch,o),a=Date.now(),s=await Zu({command:e,baseUrl:void 0,logger:this.logger,fetchImplementation:i}),c=lc(o,n);return{output:Pa.parse({...s,cookies:c}),success:!0,message:`Successfully executed request in ${Date.now()-a}ms`}}case"OPEN_NOTIFICATION_DRAWER":return await new eo(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 E("UserConfigurationError",`Could not find main activity name for package ${e.packageName}. Unexpected output: ${a}`);if(a.includes("No activity found"))throw new E("UserConfigurationError",`No activity found for package ${e.packageName}.`);if(n=a.trim().split(`
4367
+ `).pop()?.replace(/^.*\//,""),!n)throw new E("UserConfigurationError",`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 E("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 eo(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 eo(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 ud(this.constructPerformerParams()).doInstallApk(e);case"UNINSTALL_APP":return new fd(this.constructPerformerParams()).doUninstallApk(e);case"ADD_FILE":{let n=await xM(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 E("UserConfigurationError",`Unknown settings type: ${e.settingsType}`)}return{success:!0}}case"ROTATE_ORIENTATION":return await this.driver.execute("mobile: shell",{command:"settings",args:["put","system","accelerometer_rotation","0"]}),await this.driver.execute("mobile: shell",{command:"settings",args:["put","system","user_rotation",e.orientation==="LANDSCAPE"?"1":"0"]}),{success:!0,output:{newViewportBounds:await this.getViewportBounds()}};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 E("UserConfigurationError","No package is currently active");await this.driver.execute("mobile: shell",{command:"input",args:["keyevent","KEYCODE_HOME"]}),await this.driver.terminateApp(n);try{await aM({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??Hl;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 IM({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,p=r.handshake.query?.testMetadata,m=r.handshake.query?.fileName,g=m?_M.basename(m,".test.yaml"):"",h=xr.parse(JSON.parse(p??"")),f=h.id,b=h.settings?.defaultChannel,T=h.settings?.defaultTag,C=await n({testId:f});e=e.child({sessionId:d,testId:f,orgId:C});let x=await s(C),w=h.settings?.defaultEnv,O={};w&&(O=(await x.fetchEnvironment(w,e))?.variables??{});let v=Ci.parse(O[vo]),M=Ci.parse(O[Wa]),k=await u(C,e),V={...k.emulator,...h.settings?.emulator},J=h.settings?.defaultApkFilePath?.trim()||M,te=l.getSession(d);if(te){if(e.info("Reconnecting to existing Android session"),te.local)return r.emit("session",te.metadata),te.softDeleted=!1,te.metadata;throw new Error("Restoring existing remote emulator sessions is not supported. Please reconnect to a new emulator.")}let Et;if(V.region==="local"){if(await l.clearSoftDeletedLocalSessions(e),l.hasActiveLocalSession())throw new Error("Another local emulator session is already active. Please close the existing session before creating a new one.");let ln=h.settings?.emulator?.localEmulatorSettings?.avdId?.trim()||v;if(!ln)throw new Error(`AVD ID is required when using a local emulator. Set it on the test (Options \u2192 Emulator \u2192 Local AVD ID) or on the environment via ${vo}.`);Et={avdId:ln,apkToInstall:b?{channel:b,tag:T}:void 0,apkFilePath:J}}else Et={region:V.region,apkToInstall:b?{channel:b,tag:T}:void 0,osVersion:V.remoteEmulatorSettings?.androidVersion};let Y=Date.now(),{driver:H,cleanup:ce,emulatorName:ge,adbPort:Je,limbarClient:xe,limbarToken:Kt,limbarUrl:Ot,playwrightDevice:Fe}=await t({socket:r,logger:e,creationOpts:Et}),lt=_M.join(LG(),`logcat-logs-${C}-${f}-${d}.txt`),Nr=await vu({driver:H,onLogs:ln=>{r.emit("logcatLogs",ln)},logFilePath:lt});e.info({adbPort:Je,apkChannel:b,apkTag:T,duration:Date.now()-Y,emulatorName:ge},"Android emulator session initiated"),e=e.child({emulator:ge});let wn=await o(C,e),io=await i(C,e),Qo=await a(C,e),ba=c?await c(C):void 0,ao=new vi({variablesFromEnvironment:O,envName:w,testName:g}),so=await na.init({driver:H,generator:wn,logger:e,limbarClient:xe,playwrightDevice:Fe,aiSettings:{...k.ai,useMemory:k.ai?.useMemory!==!1,...h.settings?.ai},options:{emulator:V},fixtures:{storage:x,browserEnricher:Qo,browserGenerator:io,localCodeEvalTools:ba,testContext:ao},orgId:C,adbPort:Je,abortController:new AbortController}),lo=await so.getViewportBounds();if(!r.connected)throw await Nr(),await ce(),new Error("Socket not connected anymore, not proceeding with Android session setup");let Dr=NG({socket:r,testContext:ao}),$=async()=>{clearInterval(Dr);try{await Nr(),await ce(),await so.cleanup()}catch(ln){e.warn({err:ln},"Failed to clean up emulator in socket server")}},Ea={sessionId:d,testId:f,orgId:C,emulatorName:ge,testName:g,limbarUrl:Ot,limbarToken:Kt,viewportBounds:lo};return l.registerSession(d,{controller:so,cleanup:$,emulatorName:ge,local:V.region==="local",metadata:Ea,logFilePath:lt}),r.emit("session",Ea),Ea}function NG({socket:r,testContext:e}){return setInterval(()=>{let t=e.toEditorDisplayCopy();r.emit("emulatorState",{context:t})},3e3)}import Td from"fs/promises";import{z as GG}from"zod";var U="v1",Vh="mobile-cli",Ko="0.19.1";var DG=9e4,kG=3,UG=1500,FG=15e3,Lr=class extends Error{status;rawError;constructor(e,t,n,o={}){super(n,o),this.status=e,this.rawError=t}};async function BG(r){return r.text().then(e=>{try{return JSON.parse(e).error}catch{return e}})}var Wh=class{baseUrl;logger;constructor(e){this.baseUrl=e.baseUrl,this.logger=e.logger}getHeaders(){let e={"Content-Type":"application/json"};return Ko&&(e[yc]=Ko),Vh&&(e[AE]=Vh),e}async sendRequest(e,t){let{retries:n=kG,requestTimeoutMs:o=DG,initialRetryDelayMs:i=UG,maxRetryDelayMs:a=FG,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(p){u=p;try{s?.(u)}catch{}if(p instanceof Lr&&p.status>=400&&p.status<500)throw p;if(p instanceof Error&&p.name==="AbortError"&&(u=new Gn),c===0)throw u;let m=l-c,g=Math.min(i*Math.pow(2,m-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 BG(u);throw new Lr(u.status,m,`Request to ${t.method} ${e} failed with status ${u.status}: ${m}`)}let d;if(u.status===204)d={};else if(t.responseType==="buffer"){let m=await u.arrayBuffer();d=Buffer.from(m)}else{let m=await u.text();try{d=JSON.parse(m)}catch{d=m}}this.logger&&t.logResponse===!0&&d&&this.logger.debug({result:d,status:u.status,durationMs:Date.now()-c,...o},"Got response from Momentic server");let p=t.responseHeadersObject;return p&&u.headers.forEach((m,g)=>{p[g.toLowerCase()]=m}),d}finally{clearTimeout(a),t.signal&&t.signal.removeEventListener("abort",s)}}},an=class extends Wh{apiKey;mode;constructor(e){super(e),this.apiKey=e.apiKey,this.mode=e.mode}getHeaders(){return{...super.getHeaders(),Authorization:`Bearer ${this.apiKey}`,[vE]:this.mode??""}}};import{createAnthropic as zG}from"@ai-sdk/anthropic";function HG(r){let{apiKey:e,sessionId:t,extraHeaders:n,loggerTags:o}=r,i={Authorization:`Bearer ${e}`,[yc]:Ko??"",...t&&{[wE]:t},...n||{}};return o&&(i[RE]=JSON.stringify(o)),i}var Sd=r=>e=>{let t=HG(r);return zG({baseURL:`${r.baseUrl}/v1/llm/anthropic/${e}`,headers:t,apiKey:r.apiKey})(e)};var Yo=class extends an{agentConfig;constructor(e,t){let n={...pb,...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 Jy.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 Xy.parse(n)}async getScreenshotFromS3(e){let t=await this.sendRequest(`/${U}/s3/visual-diff-screenshot`,{method:"POST",body:{url:e}});return GG.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 PE.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 IE.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 xE.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 ME.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 _E.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 CE.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 _p.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 OE.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 xp.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 _y.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 Iy.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 mp.parse(n)}async getExtractedKeywords(e,t){let n=await this.sendRequest(`/${U}/web-agent/extract-keywords`,{method:"POST",body:e,signal:t.abortSignal});return db.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 Ry.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 xy.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 Cy.parse(n)}async getIframeRegex(e,t){let n=await this.sendRequest(`/${U}/web-agent/iframe-regex`,{method:"POST",body:e,signal:t.abortSignal});return Bf.parse(n)}getVercelAnthropicModelFactory({loggerTags:e}){return Sd({baseUrl:this.baseUrl,apiKey:this.apiKey,loggerTags:e})}};import{z as jh}from"zod";var Jt=class extends an{constructor(e){super({...e,mode:void 0})}getAppUrl(){return hs(this.baseUrl)}async getAuthInfo(){let e=await this.sendRequest(`/${U}/auth/check`,{method:"GET",retries:10,requestTimeoutMs:5e3,onFailedRequest:t=>{R.warn(`API key check failed: ${t.message}`)}});return jE.parse(e)}async bulkGetRunStatus(e){let t=await this.sendRequest(`/${U}/runs/status`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return HE.parse(t)}async getTestYAMLExport(e){let t=await this.sendRequest(`/${U}/tests/export`,{method:"POST",body:e,retries:3,requestTimeoutMs:3e4});return NE.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 kE.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 UE.parse(n)}async queueTests(e){let t=await this.sendRequest(`/${U}/tests/queue`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return LE.parse(t)}async uploadScreenshot(e){let t=await this.sendRequest(`/${U}/screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3});return WE.parse(t)}async uploadOnDemandScreenshot(e){return await this.sendRequest(`/${U}/on-demand-screenshots`,{method:"POST",body:e,retries:3,requestTimeoutMs:5e3}),{apiServerUrl:`${this.baseUrl}/${U}/on-demand-screenshots/${e.id}`}}async fetchOnDemandScreenshot(e){let t={};return{data:await this.sendRequest(`/${U}/on-demand-screenshots/${encodeURIComponent(e)}`,{method:"GET",retries:3,requestTimeoutMs:5e3,responseType:"buffer",responseHeadersObject:t}),contentType:t["content-type"]??"image/jpeg"}}async getAllEnvironments(){let e=await this.sendRequest(`/${U}/environments`,{method:"GET",retries:3,requestTimeoutMs:5e3});return $E.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 lT.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 qE.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 $y.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 KE.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 YE.parse(n)}async generateTestResultsUploadUrl(){let e=await this.sendRequest(`/${U}/results/uploads`,{method:"POST",retries:3,requestTimeoutMs:1e4});return XE.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 JE.parse(n)}async fetchIconKnowledgeBase(e){try{let t=await this.sendRequest(`/${U}/knowledge-base/icons`,{method:"GET",retries:3,requestTimeoutMs:5e3});return dT.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 gs.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 gs.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 Am.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 gs.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 gs.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 Am.parse(a)}async getAgentConfig(){let e=await this.sendRequest(`/${U}/web-agent/agent-config`,{method:"GET",retries:3,requestTimeoutMs:5e3});return jh.record(jh.string(),jh.string()).parse(e)}async getQuarantinedTests(){let e=await this.sendRequest(`/${U}/quarantine`,{method:"GET"});return QE.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 ZE.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 tT.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 rT.parse(e)}async deleteAndroidAsset(e,t){await this.sendRequest(`/${U}/limbar/assets/${e}/${t}`,{method:"DELETE",retries:3,requestTimeoutMs:1e4})}async createIosEmulator(e){let t=await this.sendRequest(`/${U}/limbar/ios`,{method:"POST",retries:3,body:e,requestTimeoutMs:9e4,initialRetryDelayMs:5e3,maxRetryDelayMs:15e3});return eT.parse(t)}async extendIosEmulatorTtl(e){try{await this.sendRequest(`/${U}/limbar/ios/${e}/keepalive`,{method:"POST",retries:3,requestTimeoutMs:15e3})}catch{}}async deleteIosEmulator(e){await this.sendRequest(`/${U}/limbar/ios/${e}`,{method:"DELETE",retries:3,requestTimeoutMs:3e4})}async generateMobileLogcatUploadUrl(e){let t=await this.sendRequest(`/${U}/logcat/mobile/upload`,{method:"POST",body:e,retries:3,requestTimeoutMs:1e4});return Db.parse(t)}};async function $h(r){let e=process.versions.node,t=parseInt(e.split(".")[0]);(isNaN(t)||t<18)&&(R.error(`Node.js version 20 or higher is required to run the CLI. Detected: ${process.versions.node}.`),process.exit(1)),R.debug(`Identified node version ${e}`);let n=await r.client.getAuthInfo();return R.debug("Got auth info from API"),n}var yd=class{apiClient;constructor(e){this.apiClient=e}async reportBillableEvents(e,t){await this.apiClient.reportBillableEvents(e,t)}};var oa=class extends an{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 zf.parse(n)}async constructIframeRegex(e,t={}){return this.generator.getIframeRegex(e,{abortSignal:t.signal})}};var ia=class{constructor(e,t){this.client=e;this.orgId=t}getApiServerUrl(){return this.client.baseUrl}getAppServerUrl(){let e=this.getApiServerUrl();return hs(e)}async acquireCacheLock(e,t){return this.client.acquireCacheLock(e,t)}async createOnDemandScreenshot(e,t,n){let{apiServerUrl:o}=await this.client.uploadOnDemandScreenshot({id:e,screenshot:t.toString("base64"),contentType:n});return{apiServerUrl:o,appServerUrl:`${this.getAppServerUrl()}/api/on-demand-screenshots/${e}`,universalHandle:{id:e,contentType:n}}}async fetchOnDemandScreenshot(e){return this.client.fetchOnDemandScreenshot(e.id)}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 VG,en as WG}from"@faker-js/faker";var aa="v1",sa=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 VG({locale:WG}),this.fakerInstance.seed(e.fakerSeed))}async sendAiGenerate(e){let t=typeof e=="string"?{input:e}:e;return this.httpClient.sendRequest(`/${aa}/tools/ai/generate`,{method:"POST",body:t}).catch(n=>{throw n instanceof Lr?new Error(n.rawError):new Error(`Failed to send AI generation: ${n.message}`)})}async sendSms(e){return this.httpClient.sendRequest(`/${aa}/tools/sms/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send sms: ${t.message}`)})}async fetchLatestSms(e){return this.httpClient.sendRequest(`/${aa}/tools/sms/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):t})}async sendEmail(e){return this.httpClient.sendRequest(`/${aa}/tools/email/send`,{method:"POST",body:e}).then(()=>{}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to send email: ${t.message}`)})}async fetchAllEmails(e){return this.httpClient.sendRequest(`/${aa}/tools/email/fetchAll`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch all emails: ${t.message}`)})}async fetchLatestEmail(e){return this.httpClient.sendRequest(`/${aa}/tools/email/fetchLatest`,{method:"POST",body:e}).catch(t=>{throw t instanceof Lr?new Error(t.rawError):new Error(`Failed to fetch latest emails: ${t.message}`)})}};function PM(r,e,t){return fetch(r,{method:"PUT",body:t,headers:{"Content-Type":e}})}var bd=class{constructor(e){this.client=e}async uploadResultsArchive(e,t){let{uploadUrl:n,id:o}=await this.client.generateTestResultsUploadUrl(),i=await PM(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 la=class extends an{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 Fb.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 Hb.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 Wb.parse(n)}getVercelAnthropicModelFactory({loggerTags:e,sessionId:t}){return Sd({baseUrl:this.baseUrl,apiKey:this.apiKey,sessionId:t,loggerTags:e})}};function Ed({logger:r,orgId:e,client:t,gitMetadata:n,regenerateCache:o,alwaysSaveCache:i,noCache:a}){return a?new Ec:new qh(r,e,t,n,{alwaysSaveCache:i,regenerateCache:o})}var qh=class{constructor(e,t,n,o,i){this.orgId=t;this.client=n;let{regenerateCache:a,alwaysSaveCache:s}=i,{gitBranchName:c,gitProtectedBranches:l}=o;this.cacheHeaders=Em(o),this.readCaches=!a,e.info({options:i,gitBranchName:c,gitProtectedBranches:l},"Cache storage initialization options");let u=c&&l.includes(c);s||!u?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);for(let i of[t])i&&Gg({steps:i,stepCacheEntries:n,logger:e.logger});if(!this.writeCaches){e.logger.info("Skipping mobile cache last used at update because branch is protected");return}let{cachesToSave:o}=await Zr({steps:t,cacheCreationParams:{testId:e.testId,orgId:this.orgId}});this.client.updateMobileStepCaches({entries:o,testId:e.testId},this.cacheHeaders)}};async function OM({socket:r,logger:e,globalStateManager:t,authorization:n}){let o=r.id,i=t.getSession(o);i&&n&&i.logFilePath&&jG({testId:i.metadata.testId,sessionId:o,logFilePath:i.logFilePath,authorization:n,logger:e}),await t.removeSession(o,e)}async function jG({testId:r,sessionId:e,logFilePath:t,authorization:n,logger:o}){try{let i;try{i=await Td.stat(t)}catch{o.debug({logFilePath:t},"No logcat file found to upload");return}if(i.size===0){o.debug({logFilePath:t},"Logcat file is empty, skipping upload"),await Td.unlink(t);return}let a=new Jt(n),{uploadUrl:s}=await a.generateMobileLogcatUploadUrl({testId:r,sessionId:e}),c=await Td.readFile(t),l=await fetch(s,{headers:{"Content-Length":c.length.toString(),"Content-Type":"text/plain"},method:"PUT",body:c});if(l.status!==200)throw new Error(`Failed to upload logcat: ${l.status} ${await l.text()}`);o.info({testId:r,sessionId:e},"Logcat file uploaded successfully")}catch(i){o.warn({err:i,testId:r,sessionId:e},"Failed to upload logcat file")}finally{try{await Td.unlink(t)}catch(i){o.warn({err:i,logFilePath:t},"Failed to delete temp logcat file")}}}var $G=({socket:r,globalStateManager:e})=>async()=>{let t=e.getSession(r.id);if(!t)throw new Error("No active Android session found");t.controller.abort()},LM={event:"cancel",createHandler:$G};var qG=({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})}},NM={event:"fetchA11yTree",createHandler:qG};import{diff as hV}from"deep-object-diff";import{cloneDeep as fV}from"lodash-es";var KG=1e4,YG=5e3;function DM(r,e,t,n){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:YG});if(typeof s=="string"&&s.trim()==="ping")o>0&&(e.info("Driver heartbeat restored"),n?.()),o=0;else throw new Error(`Unexpected heartbeat output: ${s}`)}catch(s){o++;let c=s instanceof Error?s.message:`${s}`;if(e.warn({attempt:o,error:c},"Driver heartbeat failed"),o>=3){let l="The Android driver appears unresponsive, indicating a possible ADB tunnel/emulator failure";e.error({err:s},l),R.error(l),t?.()}}}let a=setInterval(()=>{i()},KG);return i(),a}async function kM(r){let e=Date.now(),t=r.fixtures.controller;try{return await XG(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 XG({moduleParams:r,...e}){let t=Date.now(),{step:n,stepTracer:o,executeMobileStepList:i}=r,a=await JG({step:n,params:e}),s={};Object.entries(a).forEach(([p,m])=>{s[p]=JSON.stringify(m)});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(),oC({result:c,...nC(d)}),c}async function JG({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 Jr({orgId:e.inputs.orgId,code:a,fragment:!0,logger:n,context:o.context,localTools:o.localCodeEvalTools})}return t}import{randomUUID as UM}from"crypto";import{diff as QG}from"deep-object-diff";import{cloneDeep as ZG}from"lodash-es";async function FM({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?ZG(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 p=UM(),m=await a.getScreenshotBase64();l.afterSnapshot=p,n.attachAfterScreenshot({logger:i,snapshotId:p,screenshot:Buffer.from(m,"base64")})}catch(p){i.warn({err:p},"Failed to take after screenshot")}if(s){let p=UM();l.beforeSnapshot=p,n.attachBeforeScreenshot({logger:i,snapshotId:p,screenshot:Buffer.from(s,"base64")})}}let u="cache"in e.command?e.command.cache??{}:{},d=QG(c,u);d&&Object.keys(d).length>0&&i.info({diffs:Ri(d)},"Updated cache")}return l}import{streamText as uV}from"ai";import{randomUUID as dV}from"crypto";var vd=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 lV,stepCountIs as cV}from"ai";var Kh="get_emulator_state",Ad="finish";import BM from"dedent";var tV=BM`
4368
4368
  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.
4369
4369
  `,zM=r=>BM`
4370
4370
  <background>
@@ -4397,14 +4397,14 @@ Momentic users value the following:
4397
4397
  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.
4398
4398
  If the max. allowed retries is exceeded, fail the generation cycle by calling "finish".
4399
4399
  </rules>
4400
- `;import{tool as oV}from"ai";import{randomUUID as iV}from"crypto";import aV from"zod";import{tool as rV}from"ai";import nV from"zod";var HM=r=>{let e=rV({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:nV.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(Kh),n.info("AI action tool called (get_emulator_state)"),Yh(t)}});return{name:Kh,tool:e}};async function Yh(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 GM=r=>({name:"create_execute_step",tool:oV({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:aV.object({step:Qp}),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=Tb(t),s={id:iV(),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 Yh(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 sV}from"ai";import Xh from"zod";var VM=r=>{let e=sV({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:Xh.object({message:Xh.string(),success:Xh.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:Ad,tool:e}};var WM=[GM,HM,VM];function jM(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of WM){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:ve(e),sessionId:o}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let p=l[d];for(let m of p.content)if(!(typeof m!="object"||!("type"in m))&&!(m.type!=="tool-result"||m.output.type!=="content")&&!(m.output.value.length<3))for(let g=0;g<m.output.value.length;g++){let h=m.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=m.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:[cV(15),lV(Ad)],system:zM(!1)}}async function $M(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await pV(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 pV(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=dV(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,b)=>{let T=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${b}`}});if(T.results.length!==1)throw new E("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return T.results[0]},p={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},m=new vd({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:p}),g=jM({controller:o,logger:l,contextManager:m,aiActionSessionId:c}),h=uV({...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:p})}if(await h.response,o.throwIfAborted(),!m.finalState)throw new E("InternalWebAgentError","The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...e,status:m.finalState.status,startTime:u,endTime:Date.now(),message:m.finalState.message,steps:m.results}}var mV=60*60*1e3;async function Rd(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(),p=[],m,g="SUCCESS",{fromStep:h,toStep:f}=t;for(let b=0;b<a.length;b++){let T=a[b];if(T.skipped)continue;if(o.fastForwardingToStep&&h){let v=JSON.stringify(d);if(T.id===h.fromStepId&&v===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!Uw({currentStep:T,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let C=0,x=1,w=Date.now();T.retries&&T.retries>0&&(x+=T.retries);let O=[];for(;C<x&&Date.now()-w<mV;){C++;let v=`Executing step index ${b} in ${i} - ${Wg(T)}`;C!==1&&(v+=` (attempt ${C})`),c.info({step:T},v);let M=Date.now(),k=await s.startStep({logger:c,step:T,attempt:C,parentStepIdChain:d});u.trackStepExecution(T);let V=await gV({step:T,stepTracer:k,params:r}),{trace:J}=await k.finish({parentStepIdChain:d,result:V});if(V.trace=J,v=`Finished step index ${b} in ${i} - ${Wg(T)}`,C!==1&&(v+=` (attempt ${C})`),c.info({step:{id:T.id},trace:V.trace,status:V.status},v),V.status!=="SUCCESS"&&C<x){O.push(V),Date.now()-M<1e3&&await j(1e3-(Date.now()-M));continue}if(O.length>0&&(V.previousAttempts=O),p.push(V),V.status!=="SUCCESS")return g=V.status,m=V,{results:p,status:g,terminalResult:m};if(T.envKey&&l.context.setVariable(T.envKey,V.data),f){let te=JSON.stringify(d);if(T.id===f.toStepId&&te===JSON.stringify(f.parentStepIdChain))return o.shouldStopExecuting=!0,{results:p,status:g,terminalResult:m}}if(o.shouldStopExecuting)return{results:p,status:g,terminalResult:m};break}}return{results:p,status:g,terminalResult:m}}async function gV({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 FM({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await kM({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:Rd}});break}case"MOBILE_AI_ACTION_STEP":{s=await $M({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:Rd}});break}}return s}async function wd(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=fV(n);c.info({testMetadata:xr.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=HT(c),p=DM(s,c,r.callbacks.driver?.onHeartbeatFailure,r.callbacks.driver?.onHeartbeatRestored);c.info({cpu:d?.cpuMetadata,platform:d?.platform},`Starting execution of ${t}`);let{status:m,results:g,terminalResult:h}=await Rd({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(p),m==="SUCCESS"){let f=hV(n,l);if(f&&Object.keys(f).length>0){c.info({diffs:Ri(f)},"Saving mobile step cache entries post-success");let{cachesToSave:b}=await Qr({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:b})}else c.info("No cache entries to update");return{status:"PASSED",results:g}}return m==="FAILED"&&await Nw({logger:c,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,originalStepsWithCaches:n,updatedStepsWithCaches:l}),m==="CANCELLED"?{status:"CANCELLED",results:g}:{status:"FAILED",results:g,terminalResult:h}}var Jh=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 jo,Or.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...yT.parse(e),trace:ur.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 ca({parentStep:this.step,socket:this.socket,parentTracer:this})}},ca=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 Jh({step:e.step,parentTracer:this,socket:this.socket})}},Cd=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}};var yV=({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),p=c.controller;p.resetAbortController();let m=new Cd(n),g=await wd({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:p,logger:u,cacheStorage:d,usageTracker:new ac},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:m,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}},driver:{onHeartbeatFailure:()=>{n.emit("connectionStatusUpdate",{message:"Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure",type:"disconnected"})},onHeartbeatRestored:()=>{n.emit("connectionStatusUpdate",{message:"Appium heartbeat connection restored",type:"connected"})}}}});await m.finish();let h={results:Gt.array().parse(g.results),status:g.status};s?.(h)},qM={event:"execute",createHandler:yV};import{debounce as bV}from"ts-debounce";var EV=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=bV(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))}},KM={event:"keepalive",createHandler:EV};var YM=[qM,LM,KM,NM];var xd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let t of this.sessions.values())t.softDeleted===!0&&t.local===!0&&await this.removeSession(t.metadata.sessionId,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 by removeSession")}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)))}};function XM(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new TV(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:!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 d=>{if(e.info({reason:d},"Disconnect received"),d.includes("namespace disconnect")){await OM({socket:s,globalStateManager:n,logger:l,authorization:r.authorization});return}let p=n.getSession(c);p&&(p.softDeleted=!0)});let u;try{u=await IM({...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}YM.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 p=m=>{c.logger.error({event:s.event,err:m instanceof Error?m:new Error(`${m}`)},"Unhandled exception in socket handler"),c.socket.emit("error",{message:m instanceof Error?m.message:typeof m=="string"?m:JSON.stringify(m)})};try{let m=l.apply(this,d);m&&typeof m.catch=="function"&&m.catch(p)}catch(m){p(m)}};c.socket.on(s.event,u)};return{server:o,dispose:i}}import{randomUUID as Mj}from"crypto";import{diff as mHe}from"deep-object-diff";import RHe from"yaml";import{z as CHe}from"zod";import{execSync as vV}from"child_process";function sn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,R.debug({postSaveCommand:n},"Executing post-save hook command");try{vV(n,{encoding:"utf-8"})}catch(o){R.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as W1e}from"deep-object-diff";import{cloneDeep as $1e}from"lodash-es";import{v4 as oHe}from"uuid";import aHe from"yaml";import AV from"@dotenvx/dotenvx";import RV from"fs";import JM from"path";function QM(r,e){let t=[];for(let n of r.config.environments??[]){if(n.baseUrl)continue;let o=Xo(n.name,r,e);o.variables[Vl]||t.push(o)}return t}function wV(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let n=t.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[t]||"";let o=n[1];if(!o)return"";let i=n[2],a=n[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):r}function CV(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=wV(i);s&&(n[o]=s);continue}let a;try{a=RV.readFileSync(JM.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&&R.debug(n,"Set environment variables with interpolation from project configuration"),n}function xV(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=AV.config({path:JM.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("Set environment variables from .env file"),o}function Xo(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=CV({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=xV({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 _V,readFileSync as IV,readdirSync as PV,writeFileSync as OV}from"fs";import{glob as LV}from"glob";import Jo,{dirname as ZM}from"path";import{cwd as Zh}from"process";import e_ from"yaml";import{z as Pe}from"zod";import MV from"zod";var Md=["**/*.test.yaml","**/*.module.yaml"],Qh=MV.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),_d=15;var ua="momentic.config.yaml",ef="momentic.workspace.yaml",NV=Pe.object({projects:Pe.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),DV=Pe.union([Pe.string(),Pe.object({fromFile:Pe.string(),json:Pe.boolean().optional()})]),kV=Pe.object({name:Qh,baseUrl:Pe.string().optional().describe("Optional for mobile tests"),envFile:Pe.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Pe.record(Pe.string(),DV).optional(),inheritFromShell:Pe.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Eo.optional().describe("NB: most things should use project-level configuration only")}),UV=Pe.object({postSave:Pe.string().optional()}),FV=Pe.object({name:Qh,include:Pe.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Pe.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Pe.string().optional(),reporterDir:Pe.string().optional(),outputDir:Pe.string().optional(),recordVideo:Pe.boolean().optional(),retries:Pe.number().optional().describe("number of retries per test"),parallel:Pe.number().optional().describe("degree of parallelism"),environments:Pe.array(kV).optional(),gitMainBranch:Pe.string().optional().readonly(),gitProtectedBranches:Pe.string().array().optional().readonly(),ai:fm.optional(),browser:Eo.optional(),emulator:rm.optional(),advanced:Sm.optional(),displayRoot:Pe.string().optional().describe("relative path from project root to use as the Repository root"),hooks:UV.optional()});function t_(r,e){let t;try{t=IV(r,"utf-8")}catch(o){R.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=e_.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){R.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function tf(r){let e=t_(r,"project configuration");if(e!==void 0)try{return FV.parse(e)}catch(t){R.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function BV(r){let e=t_(r,"workspace configuration");if(e!==void 0)try{return NV.parse(e)}catch(t){R.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function zV(){let r=[],e=Zh(),t=Jo.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Jo.basename(e);if(pc.includes(i))return R.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of PV(e))if(a.endsWith(ua)){let s=Jo.join(e,a),c=tf(s);c&&r.push({configFilePath:s,config:c,rootDir:ZM(s)})}if(r.length)return r;if(e=Jo.dirname(e),e===t)break}return r}async function da(r={}){let{configFilePath:e,nameFilter:t}=r,n=await GV(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:
4401
- ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return R.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function HV(r){let e=BV(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ua}`)),n=AbortSignal.timeout(2e3),o;try{o=await LV(t,{absolute:!1,cwd:Zh(),dotRelative:!1,maxDepth:_d,nodir:!0,signal:n})}catch(a){throw R.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${ef} is misconfigured.`),a}let i=[];for(let a of o){let s=Jo.join(Zh(),a),c=tf(s);c&&i.push({configFilePath:s,config:c,rootDir:ZM(s)})}return i}async function GV(r){if(r){r=Jo.resolve(r);let t=tf(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:Jo.dirname(r)}]}if(_V(ef)){let t=await HV(ef);if(t)return t}return zV()}function Id(r,e){let t=e_.stringify(r);OV(e,t)}import n_ from"fs";import{glob as VV}from"glob";import al from"path";import WV from"yaml";import{z as r_}from"zod";var o_=!1,jV=r_.object({fileType:r_.nativeEnum(Le)});async function Qt(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??Md,o=Array.from(r.config.exclude??[]).concat(mc),i=AbortSignal.timeout(5e3),a;try{a=await VV(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:_d,nodir:!0,signal:i})}catch(s){throw R.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=$V(r.rootDir,s,t,e?Hn:R);c&&(t.duplicateEntities[c.id]=c.paths)}return o_=!0,t}function $V(r,e,t,n){let o=al.join(r,e),i=qV(o,n);if(!i)return;let a=KV(i,o,n);if(!a)return;let s=jV.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=YV(o,n);if(!l)return;let u=XV(e,o,l);switch(c){case Le.TEST:try{return JV(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case Le.MODULE:try{return QV(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case Le.MOBILE_TEST:try{return eW(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case Le.MOBILE_MODULE:try{return ZV(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 qV(r,e){try{return n_.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function KV(r,e,t){try{let n=WV.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 YV(r,e){try{return n_.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function XV(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:al.sep,fullPathSegments:e.split(al.sep),relativePathSegments:r.split(al.sep),fileName:al.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function JV(r,e,t,n,o){let i=Ai.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:Le.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function QV(r,e,t,n,o){let i=ir.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:Le.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!o_&&Rr(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 ZV(r,e,t,n,o){let i=as.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:Le.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function eW(r,e,t,n,o){let i=xr.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:Le.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}import{z as rf}from"zod";var i_="test-results";var hGe=rf.object({width:rf.number(),height:rf.number()});import{execFile as tW}from"node:child_process";import{promisify as rW}from"node:util";import nW from"simple-git";var De=nW(),a_=rW(tW);async function oW(r){let e=await ke(r,De.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
4402
- `)){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 iW(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 a_("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 a_("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function aW(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return iW(r,e,t);if(o)return}catch{}}function Pd(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 ke(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 sW(){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 lW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.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 cW(r){let[e,t,n]=await Promise.all([ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.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 uW(r){let[e,t,n,o]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Pd(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 dW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Pd(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 pW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Pd(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 mW(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([ke(r,De.revparse(["HEAD"])),ke(r,De.revparse(["--short","HEAD"])),ke(r,De.revparse(["--abbrev-ref","HEAD"])),ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"])),e?ke(r,De.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),oW(r)]),d=l?await ke(r,De.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Pd(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,b=u["user.username"]||void 0,T=await aW(r,i,u)??b??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:T,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function gW(){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 hW(r){let e=[...r.config.gitProtectedBranches??[]];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function sl(r,e){let t=sW();if(!t)return mW(r,e);switch(t){case"GithubActions":return lW(r);case"GitlabCI":return cW(r);case"CircleCI":return uW(r);case"Buildkite":return dW(r);case"AzureDevOps":return pW(r);case"GCPCloudBuild":return gW()}}async function fW(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 SW(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 yW(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await SW(r,e,n,o,t)}else if(t.gitlabProjectPath)return await fW(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function pa(r,e,t){let n=await hW(t),o=await sl(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 yW(r,e,i);return{...n,...o,...a}}import{diff as s_}from"deep-object-diff";import ro from"fs";import{cloneDeep as bW}from"lodash-es";import Od from"path";import{v4 as EW}from"uuid";import ll from"yaml";function l_(r,e){let t=`${Rr(e)}.module.yaml`,n=Od.join(Od.dirname(r),t);if(ro.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return ro.renameSync(r,n),n}function c_({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||!ro.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=ro.readFileSync(i,"utf-8"),c=ll.parse(s),l={...c,...r,schemaVersion:e},u=Fo({fileType:Le.MOBILE_MODULE,...as.parse(l),steps:Wt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,p=s_(u,c);if(p&&Object.keys(p).length===0&&!o&&!d)return;let m=ll.stringify(u);ro.writeFileSync(i,m,"utf-8");let g;d&&(g=l_(i,r.name)),sn(g||i,n.config)}function u_({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=cl(i,o),s={...a,...e},c=Fo({fileType:Le.MOBILE_MODULE,...oc.parse(s)}),l=s_(c,a);if(l&&Object.keys(l).length===0)return;let u=ll.stringify(c);ro.writeFileSync(i,u,"utf-8");let d;e.name&&(d=l_(i,e.name)),sn(d||i,n.config)}async function d_({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Rr(r),s=Od.join(o,`${a}.module.yaml`),c=EW(),{stepsToSave:l}=await Qr({steps:n}),u={schemaVersion:Nn,moduleId:c,description:e,enabled:t},d={fileType:Le.MOBILE_MODULE,...u,steps:l},p=ll.stringify(Pb.parse(d));return ro.writeFileSync(s,p,"utf-8"),sn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function cl(r,e){let t=ro.readFileSync(r,"utf-8"),n=ll.parse(t);try{return{...oc.parse(n),name:Od.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 nf(r,e,t,n){let o=cl(r.fullFilePath,t),{resolvedSteps:i}=await Ru({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 cl(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]=bW(a)),a}async function p_(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await nf(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as TW}from"crypto";import Tr from"fs";import no from"path";import ga from"yaml";import ma from"zod";function m_({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${Rr(r)}.test.yaml`,s=no.join(o,a);if(Tr.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:Le.MOBILE_TEST,id:TW(),description:e,schemaVersion:So,settings:n,steps:t},l=ga.stringify(c);return Tr.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function vW(r){if(!Tr.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Tr.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
4403
- `),t=ga.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function Ld(r,e,t){let n=vW(r),o;try{o=xr.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await Iw({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 cl(c,e)}});return{...o,steps:i.steps}}async function g_({filePath:r,steps:e,settings:t,labels:n,folder:o,project:i,momenticFiles:a,schemaVersion:s}){let c=no.isAbsolute(r)?r:no.join(o,r);if(!Tr.existsSync(c))throw new Error(`Test file not found: ${c}`);let l=Tr.readFileSync(c,"utf-8").replace(/\r\n|\r/g,`
4404
- `),u=ga.parse(l),d=ic.extend({steps:ma.record(ma.string(),ma.unknown()).array()}).parse({...u,schemaVersion:s});if(d.fileType!==Le.MOBILE_TEST)throw new Error(`File at '${c}' is not a mobile test (fileType=${d.fileType}).`);let p;e&&(p=await Qr({steps:e}));let m={...d,...p?.stepsToSave!==void 0?{steps:p.stepsToSave}:{steps:d.steps},...n!==void 0?{labels:n}:{}};t&&(m.settings=t);let g=ga.stringify(m);for(let h of p?.moduleUpdates??[])c_({content:h,schemaVersion:So,momenticFiles:a,project:i});Tr.writeFileSync(c,g,"utf-8"),sn(c,i.config)}function h_(r,e,t){let n=no.join(t.rootDir,r);if(!Tr.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=Tr.readFileSync(n,"utf-8").replace(/\r\n|\r/g,`
4400
+ `;import{tool as oV}from"ai";import{randomUUID as iV}from"crypto";import aV from"zod";import{tool as rV}from"ai";import nV from"zod";var HM=r=>{let e=rV({description:"Get the current state of the emulator (XML + screenshot)",inputSchema:nV.object({}),toModelOutput:t=>t,execute:async()=>{let{controller:t,logger:n,contextManager:o}=r;return o.recordGenericToolCall(Kh),n.info("AI action tool called (get_emulator_state)"),Yh(t)}});return{name:Kh,tool:e}};async function Yh(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 GM=r=>({name:"create_execute_step",tool:oV({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:aV.object({step:Qp}),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=Tb(t),s={id:iV(),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 Yh(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 sV}from"ai";import Xh from"zod";var VM=r=>{let e=sV({description:"Signal that the AI action has reached a terminal state (either success or failure).",inputSchema:Xh.object({message:Xh.string(),success:Xh.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:Ad,tool:e}};var WM=[GM,HM,VM];function jM(r){let{logger:e,controller:t,contextManager:n,aiActionSessionId:o}=r,i={};for(let c of WM){let l=c({contextManager:n,logger:e,controller:t});i[l.name]=l.tool}let a=t.generator.getVercelAnthropicModelFactory({loggerTags:ve(e),sessionId:o}),s=c=>{let{messages:l}=c,u=!1;for(let d=l.length-1;d>=0;d--){let p=l[d];for(let m of p.content)if(!(typeof m!="object"||!("type"in m))&&!(m.type!=="tool-result"||m.output.type!=="content")&&!(m.output.value.length<3))for(let g=0;g<m.output.value.length;g++){let h=m.output.value[g];if(h.type==="text"&&h.text.includes("<emulatorXml>"))if(u){let f=m.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:[cV(15),lV(Ad)],system:zM(!1)}}async function $M(r){let e=Date.now(),{controller:t,logger:n}=r.fixtures;try{return await pV(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 pV(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=dV(),l=i.child({stepId:e.id,aiActionSessionId:c}),u=Date.now(),d=async(f,b)=>{let T=await n({...r,listParams:{steps:[f],tracer:s,containerName:`AI action sub-step ${b}`}});if(T.results.length!==1)throw new E("InternalWebAgentError","Expected exactly one result from executeMobileStepList");return T.results[0]},p={stepId:e.id,parentStepIdChain:t.getParentStepIdChain()},m=new vd({controller:o,callbacks:{onAiActionEvent:a?.onAiActionEvent,executeStep:d},logger:l,rootStep:p}),g=jM({controller:o,logger:l,contextManager:m,aiActionSessionId:c}),h=uV({...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:p})}if(await h.response,o.throwIfAborted(),!m.finalState)throw new E("InternalWebAgentError","The AI agent never reached a final state. This could be because the maximum number of steps was reached.");return{...e,status:m.finalState.status,startTime:u,endTime:Date.now(),message:m.finalState.message,steps:m.results}}var mV=60*60*1e3;async function Rd(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(),p=[],m,g="SUCCESS",{fromStep:h,toStep:f}=t;for(let b=0;b<a.length;b++){let T=a[b];if(T.skipped)continue;if(o.fastForwardingToStep&&h){let v=JSON.stringify(d);if(T.id===h.fromStepId&&v===JSON.stringify(h.parentStepIdChain))o.fastForwardingToStep=!1;else if(!rC({currentStep:T,currentParentChain:d,desiredStepId:h.fromStepId,desiredStepParentChain:h.parentStepIdChain}))continue}let C=0,x=1,w=Date.now();T.retries&&T.retries>0&&(x+=T.retries);let O=[];for(;C<x&&Date.now()-w<mV;){C++;let v=`Executing step index ${b} in ${i} - ${jg(T)}`;C!==1&&(v+=` (attempt ${C})`),c.info({step:T},v);let M=Date.now(),k=await s.startStep({logger:c,step:T,attempt:C,parentStepIdChain:d});u.trackStepExecution(T);let V=await gV({step:T,stepTracer:k,params:r}),{trace:J}=await k.finish({parentStepIdChain:d,result:V});if(V.trace=J,v=`Finished step index ${b} in ${i} - ${jg(T)}`,C!==1&&(v+=` (attempt ${C})`),c.info({step:{id:T.id},trace:V.trace,status:V.status},v),V.status!=="SUCCESS"&&C<x){O.push(V),Date.now()-M<1e3&&await j(1e3-(Date.now()-M));continue}if(O.length>0&&(V.previousAttempts=O),p.push(V),V.status!=="SUCCESS")return g=V.status,m=V,{results:p,status:g,terminalResult:m};if(T.envKey&&l.context.setVariable(T.envKey,V.data),f){let te=JSON.stringify(d);if(T.id===f.toStepId&&te===JSON.stringify(f.parentStepIdChain))return o.shouldStopExecuting=!0,{results:p,status:g,terminalResult:m}}if(o.shouldStopExecuting)return{results:p,status:g,terminalResult:m};break}}return{results:p,status:g,terminalResult:m}}async function gV({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 FM({fixtures:n,inputs:o,step:r,stepTracer:e,callbacks:i,work:a});break}case"RESOLVED_MOBILE_MODULE":{s=await kM({...t,moduleParams:{step:r,stepTracer:e,executeMobileStepList:Rd}});break}case"MOBILE_AI_ACTION_STEP":{s=await $M({...t,aiActionParams:{step:r,stepTracer:e,executeMobileStepList:Rd}});break}}return s}async function wd(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=fV(n);c.info({testMetadata:xr.parse(o)},"Starting mobile test");let u=await e.startMainStepList(),d=HT(c),p=DM(s,c,r.callbacks.driver?.onHeartbeatFailure,r.callbacks.driver?.onHeartbeatRestored);c.info({cpu:d?.cpuMetadata,platform:d?.platform},`Starting execution of ${t}`);let{status:m,results:g,terminalResult:h}=await Rd({...r,listParams:{containerName:t,tracer:u,steps:l}});if(clearInterval(d?.interval),clearInterval(p),m==="SUCCESS"){let f=hV(n,l);if(f&&Object.keys(f).length>0){c.info({diffs:Ri(f)},"Saving mobile step cache entries post-success");let{cachesToSave:b}=await Zr({steps:l,cacheCreationParams:{orgId:r.inputs.orgId,testId:o.id}});await i.saveEntries({logger:c,testId:o.id,entries:b})}else c.info("No cache entries to update");return{status:"PASSED",results:g}}return m==="FAILED"&&await Zw({logger:c,cacheStorage:i,orgId:r.inputs.orgId,testId:o.id,originalStepsWithCaches:n,updatedStepsWithCaches:l}),m==="CANCELLED"?{status:"CANCELLED",results:g}:{status:"FAILED",results:g,terminalResult:h}}var Jh=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 jo,Or.initializeRootTracerContext(this.interactionTracer)}attachBeforeScreenshot(){}attachAfterScreenshot(){}attachBeforeHtmlSnapshot(){}attachAfterHtmlSnapshot(){}async finish(e){this.interactionTracer.finish();let t=this.interactionTracer.getRootSpan(),n={...yT.parse(e),trace:ur.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 ca({parentStep:this.step,socket:this.socket,parentTracer:this})}},ca=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 Jh({step:e.step,parentTracer:this,socket:this.socket})}},Cd=class{constructor(e){this.socket=e}appendLogs(){}async finish(){this.socket.emit("finished")}async startBeforeStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}async startMainStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}async startAfterStepList(){return new ca({parentStep:null,parentTracer:null,socket:this.socket})}};var yV=({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),p=c.controller;p.resetAbortController();let m=new Cd(n),g=await wd({work:{fastForwardingToStep:!!a.fromStep},fixtures:{controller:p,logger:u,cacheStorage:d,usageTracker:new ac},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:m,callbacks:{step:{onAiActionEvent:f=>{n.emit("aiActionEvent",f)}},driver:{onHeartbeatFailure:()=>{n.emit("connectionStatusUpdate",{message:"Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure",type:"disconnected"})},onHeartbeatRestored:()=>{n.emit("connectionStatusUpdate",{message:"Appium heartbeat connection restored",type:"connected"})}}}});await m.finish();let h={results:Gt.array().parse(g.results),status:g.status};s?.(h)},qM={event:"execute",createHandler:yV};import{debounce as bV}from"ts-debounce";var EV=({socket:r,globalStateManager:e,keepSessionAlive:t})=>{let n=bV(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))}},KM={event:"keepalive",createHandler:EV};var YM=[qM,LM,KM,NM];var xd=class{sessions=new Map;registerSession(e,t){this.sessions.set(e,t)}getSession(e){return this.sessions.get(e)}async clearSoftDeletedLocalSessions(e){for(let t of this.sessions.values())t.softDeleted===!0&&t.local===!0&&await this.removeSession(t.metadata.sessionId,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 by removeSession")}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)))}};function XM(r){let{logger:e,baseServer:t,globalStateManager:n}=r,o=new TV(t,{cors:{origin:"*",methods:["GET","POST"]},pingTimeout:15*60*1e3,pingInterval:15*60*1e3,maxHttpBufferSize:1e7,perMessageDeflate:!0,connectionStateRecovery:{maxDisconnectionDuration:60*60*1e3,skipMiddlewares:!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 d=>{if(e.info({reason:d},"Disconnect received"),d.includes("namespace disconnect")){await OM({socket:s,globalStateManager:n,logger:l,authorization:r.authorization});return}let p=n.getSession(c);p&&(p.softDeleted=!0)});let u;try{u=await IM({...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}YM.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 p=m=>{c.logger.error({event:s.event,err:m instanceof Error?m:new Error(`${m}`)},"Unhandled exception in socket handler"),c.socket.emit("error",{message:m instanceof Error?m.message:typeof m=="string"?m:JSON.stringify(m)})};try{let m=l.apply(this,d);m&&typeof m.catch=="function"&&m.catch(p)}catch(m){p(m)}};c.socket.on(s.event,u)};return{server:o,dispose:i}}import{randomUUID as Mj}from"crypto";import{diff as AHe}from"deep-object-diff";import NHe from"yaml";import{z as kHe}from"zod";import{execSync as vV}from"child_process";function sn(r,e){let t=e.hooks?.postSave;if(!t)return;let n;t.includes("$1")?n=t.replaceAll("$1",r):n=`${t} ${r}`,R.debug({postSaveCommand:n},"Executing post-save hook command");try{vV(n,{encoding:"utf-8"})}catch(o){R.warn({err:o,postSaveCommand:n},"Failed to execute post-save hook command, continuing...")}}import{diff as eHe}from"deep-object-diff";import{cloneDeep as rHe}from"lodash-es";import{v4 as gHe}from"uuid";import fHe from"yaml";import AV from"@dotenvx/dotenvx";import RV from"fs";import JM from"path";function QM(r,e){let t=[];for(let n of r.config.environments??[]){if(n.baseUrl)continue;let o=Xo(n.name,r,e);o.variables[Vl]||t.push(o)}return t}function wV(r){return r.includes("${")?r.replace(/\$\{([^}]+)\}/g,(e,t)=>{let n=t.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:(:-|-)([\s\S]*))?$/);if(!n)return process.env[t]||"";let o=n[1];if(!o)return"";let i=n[2],a=n[3],s=process.env[o];return i===":-"?s&&s!==""?s:a||"":i==="-"?s!==void 0?s:a||"":s||""}):r}function CV(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=wV(i);s&&(n[o]=s);continue}let a;try{a=RV.readFileSync(JM.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&&R.debug(n,"Set environment variables with interpolation from project configuration"),n}function xV(r){let{project:e,envFile:t,logger:n}=r,o={};if(!t)return o;let i=AV.config({path:JM.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("Set environment variables from .env file"),o}function Xo(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=CV({envVariables:n.envVariables,project:e});Object.assign(o,i);let a=xV({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 _V,readFileSync as IV,readdirSync as PV,writeFileSync as OV}from"fs";import{glob as LV}from"glob";import Jo,{dirname as ZM}from"path";import{cwd as Zh}from"process";import e_ from"yaml";import{z as Pe}from"zod";import MV from"zod";var Md=["**/*.test.yaml","**/*.module.yaml"],Qh=MV.string().refine(r=>/^[a-zA-Z0-9-]+$/.test(r)),_d=15;var ua="momentic.config.yaml",ef="momentic.workspace.yaml",NV=Pe.object({projects:Pe.string().array().describe("list of glob patterns to find project (momentic.config.yaml) files")}),DV=Pe.union([Pe.string(),Pe.object({fromFile:Pe.string(),json:Pe.boolean().optional()})]),kV=Pe.object({name:Qh,baseUrl:Pe.string().optional().describe("Optional for mobile tests"),envFile:Pe.string().optional().describe("path to a file on disk to read environment variables from. can be relative to project root or absolute."),envVariables:Pe.record(Pe.string(),DV).optional(),inheritFromShell:Pe.boolean().optional().describe("inherit all environment variables from the shell - might be noisy"),browser:Eo.optional().describe("NB: most things should use project-level configuration only")}),UV=Pe.object({postSave:Pe.string().optional()}),FV=Pe.object({name:Qh,include:Pe.string().array().optional().describe("list of glob patterns that match momentic files (optional)"),exclude:Pe.string().array().optional().describe("opposite of include, takes precedence over include"),goldenFileDir:Pe.string().optional(),reporterDir:Pe.string().optional(),outputDir:Pe.string().optional(),recordVideo:Pe.boolean().optional(),retries:Pe.number().optional().describe("number of retries per test"),parallel:Pe.number().optional().describe("degree of parallelism"),environments:Pe.array(kV).optional(),gitMainBranch:Pe.string().optional().readonly(),gitProtectedBranches:Pe.string().array().optional().readonly(),ai:fm.optional(),browser:Eo.optional(),emulator:rm.optional(),advanced:Sm.optional(),displayRoot:Pe.string().optional().describe("relative path from project root to use as the Repository root"),hooks:UV.optional()});function t_(r,e){let t;try{t=IV(r,"utf-8")}catch(o){R.warn(`Could not read possible Momentic ${e} file at ${r}: ${o}`);return}let n;try{if(n=e_.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){R.warn(`Possible Momentic ${e} file at ${r} does not parse as valid YAML: ${o}`);return}return n}function tf(r){let e=t_(r,"project configuration");if(e!==void 0)try{return FV.parse(e)}catch(t){R.warn(`Possible Momentic project configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function BV(r){let e=t_(r,"workspace configuration");if(e!==void 0)try{return NV.parse(e)}catch(t){R.warn(`Possible Momentic workspace configuration file at ${r} does not adhere to the required schema: ${t}`);return}}function zV(){let r=[],e=Zh(),t=Jo.parse(e).root,n=15,o=0;for(;o<n;){o++;let i=Jo.basename(e);if(pc.includes(i))return R.warn(`Stopping search for Momentic projects since the current directory name (${i}) is likely a system artifact folder.`),r;for(let a of PV(e))if(a.endsWith(ua)){let s=Jo.join(e,a),c=tf(s);c&&r.push({configFilePath:s,config:c,rootDir:ZM(s)})}if(r.length)return r;if(e=Jo.dirname(e),e===t)break}return r}async function da(r={}){let{configFilePath:e,nameFilter:t}=r,n=await GV(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:
4401
+ ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Momentic project file available.");return R.debug(`Found valid project configuration at ${n[0].configFilePath}`),n[0]}async function HV(r){let e=BV(r);if(!e||!e.projects||!e.projects.length)return;let t=e.projects.map(a=>(a.endsWith("/")||(a+="/"),`${a}*${ua}`)),n=AbortSignal.timeout(2e3),o;try{o=await LV(t,{absolute:!1,cwd:Zh(),dotRelative:!1,maxDepth:_d,nodir:!0,signal:n})}catch(a){throw R.error({err:a},`Failed to list the available Momentic projects in the current directory. This usually indicates the 'include' or 'exclude' option in your ${ef} is misconfigured.`),a}let i=[];for(let a of o){let s=Jo.join(Zh(),a),c=tf(s);c&&i.push({configFilePath:s,config:c,rootDir:ZM(s)})}return i}async function GV(r){if(r){r=Jo.resolve(r);let t=tf(r);return t||(console.error(`No valid Momentic project file found at ${r}.`),process.exit(1)),[{config:t,configFilePath:r,rootDir:Jo.dirname(r)}]}if(_V(ef)){let t=await HV(ef);if(t)return t}return zV()}function Id(r,e){let t=e_.stringify(r);OV(e,t)}import n_ from"fs";import{glob as VV}from"glob";import al from"path";import WV from"yaml";import{z as r_}from"zod";var o_=!1,jV=r_.object({fileType:r_.nativeEnum(Le)});async function Qt(r,e=!1){let t={project:r,tests:{},modules:{},mobileTests:{},mobileModules:{},duplicateEntities:{}},n=r.config.include??Md,o=Array.from(r.config.exclude??[]).concat(mc),i=AbortSignal.timeout(5e3),a;try{a=await VV(n,{absolute:!1,cwd:r.rootDir,ignore:o,dotRelative:!1,maxDepth:_d,nodir:!0,signal:i})}catch(s){throw R.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=$V(r.rootDir,s,t,e?Hn:R);c&&(t.duplicateEntities[c.id]=c.paths)}return o_=!0,t}function $V(r,e,t,n){let o=al.join(r,e),i=qV(o,n);if(!i)return;let a=KV(i,o,n);if(!a)return;let s=jV.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=YV(o,n);if(!l)return;let u=XV(e,o,l);switch(c){case Le.TEST:try{return JV(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic test metadata: ${d}`);return}case Le.MODULE:try{return QV(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic module metadata: ${d}`);return}case Le.MOBILE_TEST:try{return eW(a,t,u,o,n)}catch(d){n.warn(`Skipping file '${o}' because it is missing Momentic mobile test metadata: ${d}`);return}case Le.MOBILE_MODULE:try{return ZV(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 qV(r,e){try{return n_.readFileSync(r,"utf-8")}catch(t){e.warn(`Could not read possible Momentic file at ${r}, skipping: ${t}`);return}}function KV(r,e,t){try{let n=WV.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 YV(r,e){try{return n_.statSync(r)}catch(t){e.warn(`Skipping path '${r}' because it could not be stat, skipping: ${t}`);return}}function XV(r,e,t){return{relativePath:r,fullFilePath:e,platformSep:al.sep,fullPathSegments:e.split(al.sep),relativePathSegments:r.split(al.sep),fileName:al.basename(e),lastModified:t.mtime,createdAt:t.birthtime}}function JV(r,e,t,n,o){let i=Ai.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:Le.TEST,name:i.name,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}function QV(r,e,t,n,o){let i=ir.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:Le.MODULE,name:i.name,id:i.moduleId,description:i.description??void 0,...t};let s=t.fileName.replace(".module.yaml","");return!o_&&Rr(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 ZV(r,e,t,n,o){let i=as.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:Le.MOBILE_MODULE,name:s,id:i.moduleId,description:i.description??void 0,...t},a}function eW(r,e,t,n,o){let i=xr.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:Le.MOBILE_TEST,name:s,id:i.id,description:i.description??void 0,labels:i.labels,...t},a}import{z as rf}from"zod";var i_="test-results";var wGe=rf.object({width:rf.number(),height:rf.number()});import{execFile as tW}from"node:child_process";import{promisify as rW}from"node:util";import nW from"simple-git";var De=nW(),a_=rW(tW);async function oW(r){let e=await ke(r,De.raw(["config","--list"])),t={};if(!e)return t;for(let n of e.split(`
4402
+ `)){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 iW(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 a_("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 a_("gh",o,{timeout:5e3}),a=i?.toString().trim();if(a)return a}catch{}}}async function aW(r,e,t){let n=e?.includes("github.com"),o=e?.includes("gitlab.com");try{if(n)return iW(r,e,t);if(o)return}catch{}}function Pd(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 ke(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 sW(){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 lW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.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 cW(r){let[e,t,n]=await Promise.all([ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.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 uW(r){let[e,t,n,o]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),i=process.env.CIRCLE_REPOSITORY_URL??t,a=i?.includes("github.com"),s=i?.includes("gitlab.com"),c=i?Pd(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 dW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),o=process.env.BUILDKITE_REPO,i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Pd(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 pW(r){let[e,t,n]=await Promise.all([ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"]))]),o=process.env["Build.Repository.Uri"],i=o?.includes("github.com"),a=o?.includes("gitlab.com"),s=o?Pd(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 mW(r,e){let[t,n,o,i,a,s,c,l,u]=await Promise.all([ke(r,De.revparse(["HEAD"])),ke(r,De.revparse(["--short","HEAD"])),ke(r,De.revparse(["--abbrev-ref","HEAD"])),ke(r,De.listRemote(["--get-url","origin"])),ke(r,De.show(["--no-patch","--format=%ci"])),ke(r,De.show(["-s","--pretty=%B"])),ke(r,De.show(["-s","--pretty=%an"])),e?ke(r,De.raw(["merge-base","--fork-point",e])):Promise.resolve(void 0),oW(r)]),d=l?await ke(r,De.show(["--no-patch","--format=%ci",l])):void 0,p=i?.includes("github.com"),m=i?.includes("gitlab.com"),g=i?Pd(i):void 0,h=u["user.email"]||void 0,f=u["user.name"]||void 0,b=u["user.username"]||void 0,T=await aW(r,i,u)??b??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:T,gitLocalEmail:h,gitLocalName:f,lastCommitOnMainSha:l,lastCommitOnMainTimestamp:d?new Date(d):void 0,githubRepository:p?g:void 0,gitlabProjectPath:m?g:void 0,pipelineId:void 0}}async function gW(){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 hW(r){let e=[...r.config.gitProtectedBranches??[]];return r.config.gitMainBranch&&e.push(r.config.gitMainBranch),{gitMainBranch:r.config.gitMainBranch,gitProtectedBranches:e}}async function sl(r,e){let t=sW();if(!t)return mW(r,e);switch(t){case"GithubActions":return lW(r);case"GitlabCI":return cW(r);case"CircleCI":return uW(r);case"Buildkite":return dW(r);case"AzureDevOps":return pW(r);case"GCPCloudBuild":return gW()}}async function fW(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 SW(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 yW(r,e,t){try{if(t.githubRepository){let[n,o]=t.githubRepository.split("/");return await SW(r,e,n,o,t)}else if(t.gitlabProjectPath)return await fW(r,e,t.gitlabProjectPath,t)}catch(n){r.warn({err:n},"Failed to get remote git metadata")}return t}async function pa(r,e,t){let n=await hW(t),o=await sl(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 yW(r,e,i);return{...n,...o,...a}}import{diff as s_}from"deep-object-diff";import ro from"fs";import{cloneDeep as bW}from"lodash-es";import Od from"path";import{v4 as EW}from"uuid";import ll from"yaml";function l_(r,e){let t=`${Rr(e)}.module.yaml`,n=Od.join(Od.dirname(r),t);if(ro.existsSync(n))throw new Error(`A conflicting file already exists at the following path: ${n}`);return ro.renameSync(r,n),n}function c_({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||!ro.existsSync(i))throw new Error(`Tried to update mobile module ${r.moduleId} that could not be found on disk`);let s=ro.readFileSync(i,"utf-8"),c=ll.parse(s),l={...c,...r,schemaVersion:e},u=Fo({fileType:Le.MOBILE_MODULE,...as.parse(l),steps:Wt.array().parse(r.steps)}),d=!!r.name&&r.name!==a,p=s_(u,c);if(p&&Object.keys(p).length===0&&!o&&!d)return;let m=ll.stringify(u);ro.writeFileSync(i,m,"utf-8");let g;d&&(g=l_(i,r.name)),sn(g||i,n.config)}function u_({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=cl(i,o),s={...a,...e},c=Fo({fileType:Le.MOBILE_MODULE,...oc.parse(s)}),l=s_(c,a);if(l&&Object.keys(l).length===0)return;let u=ll.stringify(c);ro.writeFileSync(i,u,"utf-8");let d;e.name&&(d=l_(i,e.name)),sn(d||i,n.config)}async function d_({name:r,description:e,enabled:t,steps:n,folder:o,project:i}){let a=Rr(r),s=Od.join(o,`${a}.module.yaml`),c=EW(),{stepsToSave:l}=await Zr({steps:n}),u={schemaVersion:Nn,moduleId:c,description:e,enabled:t},d={fileType:Le.MOBILE_MODULE,...u,steps:l},p=ll.stringify(Pb.parse(d));return ro.writeFileSync(s,p,"utf-8"),sn(s,i.config),{moduleId:c,name:r,description:e||void 0,steps:n}}function cl(r,e){let t=ro.readFileSync(r,"utf-8"),n=ll.parse(t);try{return{...oc.parse(n),name:Od.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 nf(r,e,t,n){let o=cl(r.fullFilePath,t),{resolvedSteps:i}=await Iu({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 cl(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]=bW(a)),a}async function p_(r,e){let t={};return await Promise.all(Object.values(r.mobileModules).map(async n=>{await nf(n,r,e,t)})),Array.from(Object.values(t))}import{randomUUID as TW}from"crypto";import Tr from"fs";import no from"path";import ga from"yaml";import ma from"zod";function m_({name:r,description:e="",steps:t=[],settings:n={},folder:o}){let a=`${Rr(r)}.test.yaml`,s=no.join(o,a);if(Tr.existsSync(s))throw new Error(`A test named '${r}' already exists at path '${s}'. Choose a different name.`);let c={fileType:Le.MOBILE_TEST,id:TW(),description:e,schemaVersion:So,settings:n,steps:t},l=ga.stringify(c);return Tr.writeFileSync(s,l,"utf-8"),{fullPath:s,testId:c.id}}function vW(r){if(!Tr.existsSync(r))throw new Error(`Test file not found: ${r}`);let e=Tr.readFileSync(r,"utf-8").replace(/\r\n|\r/g,`
4403
+ `),t=ga.parse(e);if(!t.steps||!Array.isArray(t.steps))throw new Error(`Test ${r} is missing steps`);return t}async function Ld(r,e,t){let n=vW(r),o;try{o=xr.parse(n)}catch(s){throw new Error(`Mobile test ${r} is missing metadata or has invalid metadata: ${s}`)}let{resolvedStepLists:i}=await Yw({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 cl(c,e)}});return{...o,steps:i.steps}}async function g_({filePath:r,steps:e,settings:t,labels:n,folder:o,project:i,momenticFiles:a,schemaVersion:s}){let c=no.isAbsolute(r)?r:no.join(o,r);if(!Tr.existsSync(c))throw new Error(`Test file not found: ${c}`);let l=Tr.readFileSync(c,"utf-8").replace(/\r\n|\r/g,`
4404
+ `),u=ga.parse(l),d=ic.extend({steps:ma.record(ma.string(),ma.unknown()).array()}).parse({...u,schemaVersion:s});if(d.fileType!==Le.MOBILE_TEST)throw new Error(`File at '${c}' is not a mobile test (fileType=${d.fileType}).`);let p;e&&(p=await Zr({steps:e}));let m={...d,...p?.stepsToSave!==void 0?{steps:p.stepsToSave}:{steps:d.steps},...n!==void 0?{labels:n}:{}};t&&(m.settings=t);let g=ga.stringify(m);for(let h of p?.moduleUpdates??[])c_({content:h,schemaVersion:So,momenticFiles:a,project:i});Tr.writeFileSync(c,g,"utf-8"),sn(c,i.config)}function h_(r,e,t){let n=no.join(t.rootDir,r);if(!Tr.existsSync(n))throw new Error(`Test not found at path '${r}' in project '${t.rootDir}'`);let o=Tr.readFileSync(n,"utf-8").replace(/\r\n|\r/g,`
4405
4405
  `),i=ga.parse(o),a=ic.extend({steps:ma.record(ma.string(),ma.unknown()).array()}).parse(i),s=no.basename(r,".test.yaml"),c,l;if(e.name&&e.name!==s){let p=`${Rr(e.name)}.test.yaml`;if(c=no.join(no.dirname(r),p),l=no.join(t.rootDir,c),Tr.existsSync(l))throw new Error(`Test with name '${e.name}' already exists at path '${l}'`)}let u={...a,...e};if(delete u.name,u.fileType!==Le.MOBILE_TEST)throw new Error(`File at '${n}' is not a mobile test (fileType=${u.fileType}).`);let d=ga.stringify(u);return Tr.writeFileSync(n,d,"utf-8"),l&&l!==n?(Tr.renameSync(n,l),sn(l,t.config)):sn(n,t.config),{newRelativeTestPath:c}}import{randomUUID as AW}from"crypto";import oo from"fs";import ha from"path";var f_=new Set([".DS_Store","__MACOSX"]),S_={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 RW(r,e,t){if(S_[t]){let i=S_[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 of=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 y_(r,e){try{let t=ha.join(e,"metadata.json");return Tc.parse(JSON.parse(oo.readFileSync(t,"utf-8")))}catch{throw new of(r,e)}}function b_(r,e,t){let n=AW(),o=r.child({runGroupId:n});oo.rmSync(e,{recursive:!0,force:!0});let i=oo.readdirSync(t).filter(c=>!f_.has(c)).map(c=>ha.join(t,c));if(i.length===0)throw new Error(`No run groups found in results path: ${t}`);oo.mkdirSync(e,{recursive:!0});let a={...y_(t,i[0]),id:n};for(let c of i){let l=ha.join(c,"runs");if(!oo.existsSync(l))continue;let u=y_(t,c);o.info({oldRunGroupId:u.id},"Merging run groups");for(let p in u){if(p==="id")continue;let m=p;a[m]=RW(a,u,m)}let d=oo.readdirSync(l);for(let p of d){if(f_.has(p))continue;let m=ha.join(l,p),g=ha.join(e,"runs",p);oo.cpSync(m,g,{recursive:!0})}}let s=ha.join(e,"metadata.json");oo.writeFileSync(s,JSON.stringify(a,null,2))}import E_ from"adm-zip";import af from"fs";import Nd from"path";function wW(r){let e=new E_,t=Nd.join(r,"metadata.json"),n=Tc.parse(JSON.parse(af.readFileSync(t,"utf-8")));e.addLocalFile(t);for(let o of af.readdirSync(Nd.join(r,"runs"))){if(!o.endsWith(".zip"))continue;let i=o.replace(/\.zip$/,""),a=new E_(Nd.join(r,"runs",o));for(let s of a.getEntries())s.isDirectory||e.addFile(Nd.join("runs",i,s.entryName),s.getData())}return{runGroupId:n.id,buffer:e.toBuffer()}}async function Dd(r){let{client:e,consoleLogger:t,resultsPath:n}=r;if(!af.existsSync(n)){t.warn("Results path does not exist, skipping upload.");return}let o=new bd(e);try{let{runGroupId:i,buffer:a}=wW(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 CW from"adm-zip";import Rt from"fs";import Zt from"path";var ul=class r{constructor(e){this.filePath=e;Rt.rmSync(this.filePath,{recursive:!0,force:!0}),Rt.mkdirSync(this.filePath,{recursive:!0})}cd(e){return new r(Zt.join(this.filePath,e))}cwd(){return this.filePath}mkdir(e){Rt.mkdirSync(Zt.join(this.filePath,e),{recursive:!0})}readFile(e){let t=Zt.join(this.filePath,e);if(Rt.existsSync(t))return Rt.readFileSync(t)}storeFile(e){let{name:t,contents:n}=e,o=Zt.join(this.filePath,t);try{Rt.writeFileSync(o,n)}catch{}}createFileStream(e){let t=Zt.join(this.filePath,e);return Rt.createWriteStream(t)}createRunArchive(e){return new sf(Zt.join(this.filePath,"runs"),e)}},sf=class{constructor(e,t){this.filePath=e;this.tempPath=Zt.join(e,`temp-storage-${t}`),this.finalPath=Zt.join(e,`${t}.zip`),Rt.rmSync(this.tempPath,{recursive:!0,force:!0}),Rt.rmSync(this.finalPath,{recursive:!0,force:!0}),Rt.mkdirSync(this.tempPath,{recursive:!0})}tempPath;finalPath;readFile(e){let t=Zt.join(this.tempPath,e);if(Rt.existsSync(t))return Rt.readFileSync(t)}mkdir(e){Rt.mkdirSync(Zt.join(this.tempPath,e),{recursive:!0})}cd(e){return new ul(Zt.join(this.tempPath,e))}cwd(){return this.tempPath}storeFile(e){let{name:t,contents:n}=e,o=Zt.join(this.tempPath,t);Rt.writeFileSync(o,n)}createFileStream(e){let t=Zt.join(this.tempPath,e);return Rt.createWriteStream(t)}close(){let e=new CW;e.addLocalFolder(this.tempPath,void 0,n=>n!==".DS_Store");let t=e.toBuffer();Rt.writeFileSync(this.finalPath,t),Rt.rmSync(this.tempPath,{recursive:!0,force:!0})}};import xW from"adm-zip";import{randomUUID as MW}from"crypto";import mt from"fs";import wt from"path";function R_(r){try{return mt.existsSync(r)?JSON.parse(mt.readFileSync(r,"utf-8")):void 0}catch{return}}function T_(r){return mt.existsSync(r)?mt.readFileSync(r,"utf-8").split(`
4406
- `).map(t=>t.trim()).filter(t=>t.length>0):[]}function _W(r,e){let t=r.attemptIdToAttemptNumber.get(e);if(t)return wt.join(r.inflatedPath,"attempts",t);let n=wt.join(r.inflatedPath,"attempts");if(!mt.existsSync(n))return;let o=mt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=wt.join(n,i,"metadata.json"),s=R_(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return r.attemptIdToAttemptNumber.set(e,i),wt.join(n,i)}}function v_(r,e,t){let n=wt.join(r,"attempts");if(!mt.existsSync(n))return;let o=mt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=wt.join(n,i,"assets",`${e}.${t}`);if(mt.existsSync(a))return a}}var kd=class{constructor(e,t,n){this.outputDir=e;this.runId=t;this.runAttemptId=n;this.runsDir=wt.join(e,"runs"),this.zipPath=wt.join(this.runsDir,`${t}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let t=this.inflatedByRunId.get(e);if(t)return t;if(e!==this.runId||!mt.existsSync(this.zipPath))return;let n=wt.join(this.runsDir,`temp-unzipped-${e}-${MW()}`);mt.mkdirSync(n,{recursive:!0}),new xW(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())mt.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return _W(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let t=wt.join(e,"assets");return mt.existsSync(t)?mt.readdirSync(t,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>wt.join(t,o.name)).filter(o=>{let i=wt.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,t){let n=this.getAttemptDir();if(!n)return;let o=wt.join(n,"assets",`${e}.${t}`);if(mt.existsSync(o))try{return mt.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=R_(wt.join(o,"console.json")),a=cm.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=wt.join(o,"assets","har-pages.log"),a=wt.join(o,"assets","har-entries.log"),s={};for(let u of T_(i)){let d=ds.safeParse(A_(u));d.success&&(s[d.data.id]=d.data)}let c={},l=T_(a);for(let u=0;u<l.length;u++){let d=l[u],p=ps.safeParse(A_(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return dm(s,c)}async getHtmlSnapshot(e,t){let n=this.readAttemptAssetText(t,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=v_(o.inflatedPath,t,"html");if(i)try{return mt.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,t){let n=this.readAttemptAssetText(t,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=v_(o.inflatedPath,t,"xml");if(i)try{return mt.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,t){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?wt.join(o,"assets",`${t}.jpeg`):void 0;if(i)try{return mt.readFileSync(i)}catch{return}}};function A_(r){try{return JSON.parse(r)}catch{return}}import Yd from"fs";import V_ from"body-parser";import QW from"cors";import ZW from"dedent";import{Router as LW}from"express";import Vt from"fs";import{globSync as NW}from"glob";import bt from"path";import Ud from"fs";import IW from"path";var PW=new Uu(30,60*1e3),df="https://api.momentic.ai",cf,C_=r=>{df=r},pf=()=>df;var dl=()=>cf;var fa,uf,w_,x_=async r=>{if(cf&&fa&&w_)return fa;let e=new Jt({baseUrl:df,apiKey:r,logger:R});cf=e;try{let t=await e.getAuthInfo();return fa=t.orgId,uf=t.userId,w_=r,fa}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Sa=()=>{if(!fa)throw new Error("Your organization ID is invalid.");return fa},Fd=()=>{if(!uf)throw new Error("Your user ID is invalid.");return uf};var mf,lf,M_=(r,e)=>{mf=r,lf?.abort(),lf=new AbortController;let t=lf.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=IW.resolve(r.rootDir,o.envFile);try{if(Ud.lstatSync(i).isSymbolicLink())return;Ud.existsSync(i)&&n.push(i)}catch(a){R.warn({err:a},`Failed to check if env file ${i} exists`)}});try{OW({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){R.error({err:o},"Failed to start config file watchers")}},Oe=()=>mf;function OW({filesToWatch:r,revalidator:e,signal:t,project:n}){R.debug("Starting watch on the following files:"),r.forEach(o=>{R.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(PW.increment("setLocalProject")&&R.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.`),mf=await Promise.resolve(e(n.configFilePath)))};Ud.watchFile(o,{persistent:!1},i);let a=()=>{Ud.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Me(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var ml=LW();function pl(r){let e=Oe(),t=bt.dirname(e.configFilePath);return bt.join(t,...r)}function DW(r){let e=Oe(),t=bt.dirname(e.configFilePath),n=bt.relative(t,r);return n?n.split(bt.sep):[]}function kW(r,e){let t=Vt.statSync(r),n=DW(r);return mm.parse({name:e,absolutePath:r,relativePath:n.join(bt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}ml.post("/",Me(async(r,e,t)=>{let n;try{n=aE.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=pl(n);if(!Vt.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(bt.sep)}`});return}if(!Vt.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(bt.sep)}`});return}let a=Oe(),s=Array.from(a.config.exclude??[]).concat(mc),l=NW("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=bt.join(o,d);return kW(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));ml.put("/",Me(async(r,e,t)=>{let n;try{n=sE.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=pl(n);if(Vt.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(bt.sep)}`,pathSegments:n});return}Vt.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(bt.sep)}`,pathSegments:n};e.status(201).json(i)}));ml.patch("/",Me(async(r,e,t)=>{let n,o;try{let l=lE.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=pl(n),a=pl(o);if(!Vt.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(bt.sep)}`});return}if(Vt.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(bt.sep)}`});return}let s=bt.dirname(a);Vt.existsSync(s)||Vt.mkdirSync(s,{recursive:!0}),Vt.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(bt.sep)} to ${o.join(bt.sep)}`,pathSegments:o};e.status(200).json(c)}));ml.delete("/",Me(async(r,e,t)=>{let n,o=!0;try{let c=cE.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=pl(n);if(!Vt.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(bt.sep)}`,pathSegments:n});return}if(!Vt.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(bt.sep)}`});return}if(o)Vt.rmSync(i,{recursive:!0,force:!0});else{if(Vt.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Vt.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var gf=ml;import{Router as BW}from"express";import{hostname as UW}from"os";var FW="0.19.0",gl=Oi({app:"desktop-server",hostname:UW(),disableConsoleLogs:!0}).child({cliVersion:FW});(async()=>{try{let r=await sl(gl);r.gitBranchName&&gl.addBinding("branch",r.gitBranchName)}catch{}})();var __=BW();__.get("/",async(r,e)=>{let t=Oe(),n=dl();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await pa(gl,n,t);e.status(200).json(o)});var hf=__;import ej from"events";import W_,{Router as tj}from"express";import rj from"http";import nj from"path";var Bd=new xd;import{Router as HW}from"express";import{existsSync as GW}from"fs";import VW from"path";import{hostname as zW}from"os";var ff="0.19.0",st=Oi({app:"mobile-desktop-server",hostname:zW(),disableConsoleLogs:!0}).child({cliVersion:ff});(async()=>{try{let r=await sl(st);r.gitBranchName&&st.addBinding("branch",r.gitBranchName)}catch{}})();var Sf=HW();Sf.get("/",Me(async(r,e)=>{let t=dl();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));Sf.post("/upload-url",Me(async(r,e)=>{let t;try{t=fE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=dl();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=VW.resolve(t.filePath);if(!GW(o)){e.status(400).json({error:`File not found: ${o}`});return}await Iu({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:st}),e.sendStatus(204)}));var I_=Sf;import{Router as $W}from"express";import{Router as WW}from"express";import P_ from"fs";import jW from"path";var hl=WW();async function yf(r){return(await p_(r,st)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){R.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)}hl.get("/",Me(async(r,e)=>{let t=Oe(),n=await Qt(t),o=await yf(n);e.status(200).json(o)}));hl.get("/:moduleId",Me(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Qt(Oe()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await nf(n,t,R);e.json(o)}catch(o){e.status(400).json({err:o})}}));hl.patch("/:moduleId/metadata",Me(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=yE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Oe(),o=await Qt(n);u_({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:R,project:n}),e.status(201).json({message:"ok"})}));hl.post("/",Me(async(r,e)=>{let t;try{t=bE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{bo(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=Oe(),i=(await Qt(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=jW.join(n.rootDir,t.folderPath??"");if(!P_.existsSync(a)||!P_.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await d_({...t,folder:a,project:n});e.status(201).json(s)}));var O_=hl;var L_=$W();L_.get("/",Me(async(r,e)=>{let t=Oe(),n=await Qt(t),o=await yf(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).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 N_=L_;import{Router as qW}from"express";var zd=qW();zd.get("/",Me((r,e)=>{let t=QM(Oe(),st);e.status(200).json(t)}));zd.get("/names",Me((r,e)=>{let n=Oe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));zd.post("/",Me((r,e)=>{let t;try{t=SE.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{bo(t.name)}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=Oe();if(n.config.environments?.find(s=>s.name===t.name)){e.status(400).json({error:`An environment with the name "${t.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:t.name}]};n.config=i,Id(i,n.configFilePath);let a=Xo(t.name,n,st);e.status(201).json(a)}));var D_=zd;import{Router as KW}from"express";var k_=KW();k_.get("/",(r,e)=>{e.status(200).json({userId:Fd(),orgId:Sa(),cliVersion:ff??"0.0.0"})});var U_=k_;import{Router as YW}from"express";var F_=YW();F_.get("/",Me(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=Bd.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4407
- `).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){st.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var B_=F_;import{Router as XW}from"express";import Hd from"path";var fl=XW();fl.patch("/:testPath",Me(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=gE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0&&n.labels===void 0){e.status(400).json({error:"At least one of steps, settings, or labels is required"});return}let o=Oe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await Qt(o);await g_({filePath:i,steps:n.steps,settings:n.settings,labels:n.labels,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:So});let s={message:"ok"};e.status(200).json(s)}));fl.post("/",Me((r,e)=>{let t;try{t=mE.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{bo(n)}catch(g){e.status(400).json({error:g.message});return}let s=Oe(),c=Hd.join(s.rootDir,...a),{fullPath:l,testId:u}=m_({name:n,description:o,steps:[],settings:i,folder:c}),d=Hd.basename(l),p=Hd.relative(s.rootDir,l),m={id:u,fileName:d,fullPath:l,relativeFilePath:p};e.status(201).json(m)}));fl.get("/:fileName",Me(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=Hd.basename(n).replace(".test.yaml",""),i=Oe(),a=await Qt(i),c={...await Ld(n,st,a),name:o};e.status(200).json(c)}));fl.patch("/:testPath/metadata",Me(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=hE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}let o=Oe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,s={message:"ok",newRelativeTestPath:h_(i,n,o).newRelativeTestPath};e.status(200).json(s)}));var z_=fl;import{Router as JW}from"express";var H_=JW();H_.get("/",Me((r,e)=>{let t=Oe(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var G_=H_;var Gd=class extends ia{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=Oe();return Xo(t,o,R)}};var j_="10mb";async function $_(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&C_(n),await x_(t);let u=Sa(),d=Fd(),p=r.logger.child({orgId:u,userId:d});M_(i,v=>da({configFilePath:v}));let m=W_();m.use(QW()),m.use(V_.json({limit:j_})),m.use(V_.urlencoded({extended:!1,limit:j_}));let g=tj();if(g.use("/folders",gf),g.use("/entities",N_),g.use("/identify",U_),g.use("/mobile-tests",z_),g.use("/mobile-modules",O_),g.use("/assets",I_),g.use("/git",hf),g.use("/environments",D_),g.use("/installed-packages",B_),g.use("/settings",G_),m.use("/api",g),m.use((v,M,k)=>{R.debug({url:v.url,path:v.path,query:v.query,method:v.method,body:v.body,headers:v.rawHeaders,client:v.ip},"Incoming request on mobile-desktop-server"),M.on("close",()=>{M.statusCode>=400&&(R.error({url:v.url,method:v.method,statusCode:M.statusCode},"Request completed in error on mobile-desktop-server"),st.error({url:v.url,method:v.method,statusCode:M.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),m.use((v,M,k,V)=>{if(v instanceof Error&&v.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}R.error({stack:v.stack,msg:v.message,err:v,url:M.url,method:M.method},"Unhandled exception leading to 500 on mobile-desktop-server"),st.error({stack:v.stack,msg:v.message,err:v,url:M.url,method:M.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${v.message}`)}),o){let v=W_.static(o,{setHeaders:M=>{M.setHeader("Cache-Control","no-cache")},redirect:!1});m.use(v),m.use("*",(M,k)=>{k.sendFile(nj.join(o,"index.html"))})}let h=rj.createServer(m),f=`http://localhost:${e}`;await new Promise(v=>{try{h.listen(e,()=>{p.info(`Mobile desktop server is running at ${f}`),v()})}catch(M){M.message.includes("EADDRINUSE")?oj(e):R.error(`An unexpected error occurred while starting the server: ${M.message}`),process.exit(1)}});let T={type:"API_KEY",baseUrl:pf(),apiKey:t,logger:p},C=new Jt(T),x=Oe(),w={...T,mode:"interactive"},{dispose:O}=XM({baseServer:h,logger:p,authorization:T,globalStateManager:Bd,getOrgId:()=>Sa(),getGitMetadata:async()=>await pa(p,C,x),androidDriverFactory:async({socket:v,logger:M,creationOpts:k})=>{let V=Math.floor(Math.random()*1e4)+4e4,J=await wc(V,"appium");return _u({logger:M,driverLogLevel:a,apiClient:C,creationOpts:k,socket:v,appiumPort:J,sessionId:v.id,orgId:Sa(),onStatusUpdate:te=>{v.emit("connectionStatusUpdate",{message:te,type:"info"})},onConnectionStateChange:te=>{te==="disconnected"?v.emit("connectionStatusUpdate",{message:"Emulator websocket connection lost.",type:"disconnected"}):te==="reconnecting"||te==="connecting"?v.emit("connectionStatusUpdate",{message:"Emulator websocket is reconnecting...",type:te==="reconnecting"?"reconnecting":"connecting"}):te==="connected"&&v.emit("connectionStatusUpdate",{message:"Emulator websocket connection restored",type:"connected"})}})},mobileGeneratorFactory:async v=>new la({baseUrl:pf(),apiKey:t,logger:p,mode:"interactive"}),browserGeneratorFactory:async v=>new Yo(x.config.ai?.agentConfig,w),browserEnricherFactory:async v=>new oa(w,new Yo(x.config.ai?.agentConfig,w)),storageFactory:async v=>new Gd(C,v),cacheStorageFactory:async(v,M)=>Ed({logger:p,orgId:v,client:C,gitMetadata:M,regenerateCache:s,noCache:l,alwaysSaveCache:c}),localToolsFactory:async()=>new sa({httpClient:C,fakerSeed:void 0}),keepSessionAlive:v=>C.extendAndroidEmulatorTtl(v),settingsFactory:async()=>({emulator:{},ai:{},...x.config})});process.once("SIGUSR2",async()=>{return;try{await O(),await ft.flush()}catch(v){R.error({err:v},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{let v="SIGTERM in Momentic mobile app received";R.info(v),p.info(v);try{await O(),await ft.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{R.info("SIGINT in Momentic mobile app received");try{await O(),await ft.flush()}finally{h.close(()=>process.exit(0))}})}ej.setMaxListeners(25);process.on("warning",r=>{st.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{st.error({err:r},"Uncaught exception on mobile-desktop-server"),R.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{st.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),R.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function oj(r){R.error(ZW`Port ${r} is already in use by another process. Please close the other process and try again.
4406
+ `).map(t=>t.trim()).filter(t=>t.length>0):[]}function _W(r,e){let t=r.attemptIdToAttemptNumber.get(e);if(t)return wt.join(r.inflatedPath,"attempts",t);let n=wt.join(r.inflatedPath,"attempts");if(!mt.existsSync(n))return;let o=mt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=wt.join(n,i,"metadata.json"),s=R_(a);if(typeof s!="object"||s===null)continue;let c=s.id;if(typeof c=="string"&&c===e)return r.attemptIdToAttemptNumber.set(e,i),wt.join(n,i)}}function v_(r,e,t){let n=wt.join(r,"attempts");if(!mt.existsSync(n))return;let o=mt.readdirSync(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name);for(let i of o){let a=wt.join(n,i,"assets",`${e}.${t}`);if(mt.existsSync(a))return a}}var kd=class{constructor(e,t,n){this.outputDir=e;this.runId=t;this.runAttemptId=n;this.runsDir=wt.join(e,"runs"),this.zipPath=wt.join(this.runsDir,`${t}.zip`)}inflatedByRunId=new Map;zipPath;runsDir;ensureInflatedRun(e){let t=this.inflatedByRunId.get(e);if(t)return t;if(e!==this.runId||!mt.existsSync(this.zipPath))return;let n=wt.join(this.runsDir,`temp-unzipped-${e}-${MW()}`);mt.mkdirSync(n,{recursive:!0}),new xW(this.zipPath).extractAllTo(n,!0);let i={runId:e,zipPath:this.zipPath,inflatedPath:n,attemptIdToAttemptNumber:new Map};return this.inflatedByRunId.set(e,i),i}close(){for(let e of this.inflatedByRunId.values())mt.rmSync(e.inflatedPath,{recursive:!0,force:!0});this.inflatedByRunId.clear()}getAttemptDir(){let e=this.ensureInflatedRun(this.runId);if(e)return _W(e,this.runAttemptId)}listVideoAssetPaths(){let e=this.getAttemptDir();if(!e)return[];let t=wt.join(e,"assets");return mt.existsSync(t)?mt.readdirSync(t,{withFileTypes:!0}).filter(o=>o.isFile()).map(o=>wt.join(t,o.name)).filter(o=>{let i=wt.extname(o).toLowerCase();return i===".webm"||i===".mp4"}):[]}readAttemptAssetText(e,t){let n=this.getAttemptDir();if(!n)return;let o=wt.join(n,"assets",`${e}.${t}`);if(mt.existsSync(o))try{return mt.readFileSync(o,"utf-8")}catch{return}}async getConsoleLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=R_(wt.join(o,"console.json")),a=cm.safeParse(i);return a.success?a.data:void 0}async getNetworkLogsForRunAttempt(e,t,n){if(t!==this.runId||n!==this.runAttemptId)return;let o=this.getAttemptDir();if(!o)return;let i=wt.join(o,"assets","har-pages.log"),a=wt.join(o,"assets","har-entries.log"),s={};for(let u of T_(i)){let d=ds.safeParse(A_(u));d.success&&(s[d.data.id]=d.data)}let c={},l=T_(a);for(let u=0;u<l.length;u++){let d=l[u],p=ps.safeParse(A_(d));if(!p.success)continue;let m=`${p.data.startedDateTime}-${u}`;c[m]=p.data}if(Object.keys(c).length!==0)return dm(s,c)}async getHtmlSnapshot(e,t){let n=this.readAttemptAssetText(t,"html");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=v_(o.inflatedPath,t,"html");if(i)try{return mt.readFileSync(i,"utf-8")}catch{return}}async getA11yTreeSnapshot(e,t){let n=this.readAttemptAssetText(t,"xml");if(n)return n;let o=this.ensureInflatedRun(this.runId);if(!o)return;let i=v_(o.inflatedPath,t,"xml");if(i)try{return mt.readFileSync(i,"utf-8")}catch{return}}async getScreenshot(e,t){if(!this.ensureInflatedRun(this.runId))return;let o=this.getAttemptDir(),i=o?wt.join(o,"assets",`${t}.jpeg`):void 0;if(i)try{return mt.readFileSync(i)}catch{return}}};function A_(r){try{return JSON.parse(r)}catch{return}}import Yd from"fs";import V_ from"body-parser";import QW from"cors";import ZW from"dedent";import{Router as LW}from"express";import Vt from"fs";import{globSync as NW}from"glob";import bt from"path";import Ud from"fs";import IW from"path";var PW=new bu(30,60*1e3),df="https://api.momentic.ai",cf,C_=r=>{df=r},pf=()=>df;var dl=()=>cf;var fa,uf,w_,x_=async r=>{if(cf&&fa&&w_)return fa;let e=new Jt({baseUrl:df,apiKey:r,logger:R});cf=e;try{let t=await e.getAuthInfo();return fa=t.orgId,uf=t.userId,w_=r,fa}catch(t){throw new Error(`Error checking API key against server: ${t}`)}},Sa=()=>{if(!fa)throw new Error("Your organization ID is invalid.");return fa},Fd=()=>{if(!uf)throw new Error("Your user ID is invalid.");return uf};var mf,lf,M_=(r,e)=>{mf=r,lf?.abort(),lf=new AbortController;let t=lf.signal,n=[r.configFilePath];r.config.environments?.forEach(o=>{if(!o.envFile)return;let i=IW.resolve(r.rootDir,o.envFile);try{if(Ud.lstatSync(i).isSymbolicLink())return;Ud.existsSync(i)&&n.push(i)}catch(a){R.warn({err:a},`Failed to check if env file ${i} exists`)}});try{OW({filesToWatch:n,revalidator:e,signal:t,project:r})}catch(o){R.error({err:o},"Failed to start config file watchers")}},Oe=()=>mf;function OW({filesToWatch:r,revalidator:e,signal:t,project:n}){R.debug("Starting watch on the following files:"),r.forEach(o=>{R.debug(`- ${o}`)}),r.forEach(o=>{let i=async(s,c)=>{s.mtime.getTime()!==c.mtime.getTime()&&(PW.increment("setLocalProject")&&R.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.`),mf=await Promise.resolve(e(n.configFilePath)))};Ud.watchFile(o,{persistent:!1},i);let a=()=>{Ud.unwatchFile(o,i),t.removeEventListener("abort",a)};t.addEventListener("abort",a),process.once("SIGUSR2",()=>{a(),process.kill(process.pid,"SIGUSR2")})})}function Me(r){return function(...e){let t=e[e.length-1],n=r(...e);Promise.resolve(n).catch(t)}}var ml=LW();function pl(r){let e=Oe(),t=bt.dirname(e.configFilePath);return bt.join(t,...r)}function DW(r){let e=Oe(),t=bt.dirname(e.configFilePath),n=bt.relative(t,r);return n?n.split(bt.sep):[]}function kW(r,e){let t=Vt.statSync(r),n=DW(r);return mm.parse({name:e,absolutePath:r,relativePath:n.join(bt.sep),pathSegments:n,isDirectory:t.isDirectory(),size:t.size,createdAt:t.birthtime,modifiedAt:t.mtime,accessedAt:t.atime})}ml.post("/",Me(async(r,e,t)=>{let n;try{n=aE.parse(r.body).pathSegments}catch(d){e.status(400).json({error:`Failed to parse folder read body: ${d}`});return}let o=pl(n);if(!Vt.existsSync(o)){e.status(404).json({error:`Path not found: ${n.join(bt.sep)}`});return}if(!Vt.statSync(o).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(bt.sep)}`});return}let a=Oe(),s=Array.from(a.config.exclude??[]).concat(mc),l=NW("*",{absolute:!1,cwd:o,ignore:s,dotRelative:!1,maxDepth:1,nodir:!1}).map(d=>{let p=bt.join(o,d);return kW(p,d)}),u={absolutePath:o,pathSegments:n,contents:l};e.status(200).json(u)}));ml.put("/",Me(async(r,e,t)=>{let n;try{n=sE.parse(r.body).pathSegments}catch(a){e.status(400).json({error:`Failed to parse folder create body: ${a}`});return}let o=pl(n);if(Vt.existsSync(o)){e.status(200).json({success:!0,message:`Folder already exists: ${n.join(bt.sep)}`,pathSegments:n});return}Vt.mkdirSync(o,{recursive:!0});let i={success:!0,message:`Folder created: ${n.join(bt.sep)}`,pathSegments:n};e.status(201).json(i)}));ml.patch("/",Me(async(r,e,t)=>{let n,o;try{let l=lE.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=pl(n),a=pl(o);if(!Vt.existsSync(i)){e.status(400).json({error:`Folder not found: ${n.join(bt.sep)}`});return}if(Vt.existsSync(a)){e.status(400).json({error:`Destination already exists: ${o.join(bt.sep)}`});return}let s=bt.dirname(a);Vt.existsSync(s)||Vt.mkdirSync(s,{recursive:!0}),Vt.renameSync(i,a);let c={success:!0,message:`Folder moved from ${n.join(bt.sep)} to ${o.join(bt.sep)}`,pathSegments:o};e.status(200).json(c)}));ml.delete("/",Me(async(r,e,t)=>{let n,o=!0;try{let c=cE.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=pl(n);if(!Vt.existsSync(i)){e.status(200).json({success:!0,message:`Folder not found: ${n.join(bt.sep)}`,pathSegments:n});return}if(!Vt.statSync(i).isDirectory()){e.status(400).json({error:`Path is not a directory: ${n.join(bt.sep)}`});return}if(o)Vt.rmSync(i,{recursive:!0,force:!0});else{if(Vt.readdirSync(i).length>0){e.status(409).json({error:`Cannot delete non-empty directory without recursive flag: ${n.join("/")}`});return}Vt.rmdirSync(i)}let s={success:!0,message:`Folder deleted: ${n.join("/")}`,pathSegments:n};e.status(200).json(s)}));var gf=ml;import{Router as BW}from"express";import{hostname as UW}from"os";var FW="0.19.1",gl=Oi({app:"desktop-server",hostname:UW(),disableConsoleLogs:!0}).child({cliVersion:FW});(async()=>{try{let r=await sl(gl);r.gitBranchName&&gl.addBinding("branch",r.gitBranchName)}catch{}})();var __=BW();__.get("/",async(r,e)=>{let t=Oe(),n=dl();if(!n){e.status(500).json({message:"API client not initialized"});return}let o=await pa(gl,n,t);e.status(200).json(o)});var hf=__;import ej from"events";import W_,{Router as tj}from"express";import rj from"http";import nj from"path";var Bd=new xd;import{Router as HW}from"express";import{existsSync as GW}from"fs";import VW from"path";import{hostname as zW}from"os";var ff="0.19.1",st=Oi({app:"mobile-desktop-server",hostname:zW(),disableConsoleLogs:!0}).child({cliVersion:ff});(async()=>{try{let r=await sl(st);r.gitBranchName&&st.addBinding("branch",r.gitBranchName)}catch{}})();var Sf=HW();Sf.get("/",Me(async(r,e)=>{let t=dl();if(!t){e.status(500).json({message:"API client not initialized"});return}let n=await t.getAndroidAssets();e.status(200).json(n)}));Sf.post("/upload-url",Me(async(r,e)=>{let t;try{t=fE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=dl();if(!n){e.status(500).json({error:"API client not initialized"});return}let o=VW.resolve(t.filePath);if(!GW(o)){e.status(400).json({error:`File not found: ${o}`});return}await Tu({tag:t.tag,channel:t.channel,filePath:o,apiClient:n,logger:st}),e.sendStatus(204)}));var I_=Sf;import{Router as $W}from"express";import{Router as WW}from"express";import P_ from"fs";import jW from"path";var hl=WW();async function yf(r){return(await p_(r,st)).map(n=>{let o=r.mobileModules[n.moduleId];if(!o){R.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)}hl.get("/",Me(async(r,e)=>{let t=Oe(),n=await Qt(t),o=await yf(n);e.status(200).json(o)}));hl.get("/:moduleId",Me(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t=await Qt(Oe()),n=t.mobileModules[r.params.moduleId];if(!n){e.status(404).json({error:"Mobile module not found."});return}try{let o=await nf(n,t,R);e.json(o)}catch(o){e.status(400).json({err:o})}}));hl.patch("/:moduleId/metadata",Me(async(r,e)=>{if(!r.params.moduleId){e.status(400).json({error:"Missing moduleId in url path."});return}let t;try{t=yE.parse(r.body)}catch(i){e.status(400).json({error:`Invalid request body: ${i}`});return}let n=Oe(),o=await Qt(n);u_({moduleId:r.params.moduleId,patch:t,momenticFiles:o,logger:R,project:n}),e.status(201).json({message:"ok"})}));hl.post("/",Me(async(r,e)=>{let t;try{t=bE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}try{bo(t.name)}catch(c){e.status(400).json({error:`Invalid module name: ${c}`});return}let n=Oe(),i=(await Qt(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=jW.join(n.rootDir,t.folderPath??"");if(!P_.existsSync(a)||!P_.statSync(a).isDirectory()){e.status(400).json({error:`The folder configured for mobile module creation does not exist: ${a}`});return}let s=await d_({...t,folder:a,project:n});e.status(201).json(s)}));var O_=hl;var L_=$W();L_.get("/",Me(async(r,e)=>{let t=Oe(),n=await Qt(t),o=await yf(n),i=new Set;n?.mobileTests&&Object.values(n.mobileTests).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 N_=L_;import{Router as qW}from"express";var zd=qW();zd.get("/",Me((r,e)=>{let t=QM(Oe(),st);e.status(200).json(t)}));zd.get("/names",Me((r,e)=>{let n=Oe().config.environments?.map(o=>o.name)??[];e.status(200).json(n)}));zd.post("/",Me((r,e)=>{let t;try{t=SE.parse(r.body)}catch(s){e.status(400).json({error:`Invalid request body: ${s}`});return}try{bo(t.name)}catch(s){e.status(400).json({error:`Invalid environment name: ${s}`});return}let n=Oe();if(n.config.environments?.find(s=>s.name===t.name)){e.status(400).json({error:`An environment with the name "${t.name}" already exists. Please choose a different name.`});return}let i={...n.config,environments:[...n.config.environments??[],{name:t.name}]};n.config=i,Id(i,n.configFilePath);let a=Xo(t.name,n,st);e.status(201).json(a)}));var D_=zd;import{Router as KW}from"express";var k_=KW();k_.get("/",(r,e)=>{e.status(200).json({userId:Fd(),orgId:Sa(),cliVersion:ff??"0.0.0"})});var U_=k_;import{Router as YW}from"express";var F_=YW();F_.get("/",Me(async(r,e)=>{let t=r.query.sessionId;if(!t){e.status(400).json({packages:[]});return}let n=Bd.getSession(t);if(!n?.controller){e.status(200).json({packages:[]});return}try{let a=(await n.controller.executeRawADBCommand("shell pm list packages -3"))?.split(`
4407
+ `).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){st.error({err:o},"Error fetching installed packages from the session controller"),e.status(200).json({packages:[]})}}));var B_=F_;import{Router as XW}from"express";import Hd from"path";var fl=XW();fl.patch("/:testPath",Me(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=gE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}if(n.steps===void 0&&n.settings===void 0&&n.labels===void 0){e.status(400).json({error:"At least one of steps, settings, or labels is required"});return}let o=Oe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,a=await Qt(o);await g_({filePath:i,steps:n.steps,settings:n.settings,labels:n.labels,folder:o.rootDir,project:o,momenticFiles:a,schemaVersion:So});let s={message:"ok"};e.status(200).json(s)}));fl.post("/",Me((r,e)=>{let t;try{t=mE.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{bo(n)}catch(g){e.status(400).json({error:g.message});return}let s=Oe(),c=Hd.join(s.rootDir,...a),{fullPath:l,testId:u}=m_({name:n,description:o,steps:[],settings:i,folder:c}),d=Hd.basename(l),p=Hd.relative(s.rootDir,l),m={id:u,fileName:d,fullPath:l,relativeFilePath:p};e.status(201).json(m)}));fl.get("/:fileName",Me(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=Hd.basename(n).replace(".test.yaml",""),i=Oe(),a=await Qt(i),c={...await Ld(n,st,a),name:o};e.status(200).json(c)}));fl.patch("/:testPath/metadata",Me(async(r,e)=>{let t=r.params.testPath;if(!t){e.status(400).json({error:"Missing testPath in path"});return}let n;try{n=hE.parse(r.body)}catch(c){e.status(400).json({error:`Invalid request body: ${c}`});return}let o=Oe(),i=t.endsWith(".test.yaml")?t:`${t}.test.yaml`,s={message:"ok",newRelativeTestPath:h_(i,n,o).newRelativeTestPath};e.status(200).json(s)}));var z_=fl;import{Router as JW}from"express";var H_=JW();H_.get("/",Me((r,e)=>{let t=Oe(),n={ai:t.config.ai,displayRoot:t.config.displayRoot};e.status(200).json(n)}));var G_=H_;var Gd=class extends ia{constructor(t,n){super(t,n);this.client=t;this.orgId=n}async fetchEnvironment(t,n){let o=Oe();return Xo(t,o,R)}};var j_="10mb";async function $_(r){let{serverPort:e,apiKey:t,momenticServerUrl:n,staticDir:o,initialProject:i,driverLogLevel:a,regenerateCache:s,alwaysSaveCache:c,noCache:l}=r;n&&C_(n),await x_(t);let u=Sa(),d=Fd(),p=r.logger.child({orgId:u,userId:d});M_(i,v=>da({configFilePath:v}));let m=W_();m.use(QW()),m.use(V_.json({limit:j_})),m.use(V_.urlencoded({extended:!1,limit:j_}));let g=tj();if(g.use("/folders",gf),g.use("/entities",N_),g.use("/identify",U_),g.use("/mobile-tests",z_),g.use("/mobile-modules",O_),g.use("/assets",I_),g.use("/git",hf),g.use("/environments",D_),g.use("/installed-packages",B_),g.use("/settings",G_),m.use("/api",g),m.use((v,M,k)=>{R.debug({url:v.url,path:v.path,query:v.query,method:v.method,body:v.body,headers:v.rawHeaders,client:v.ip},"Incoming request on mobile-desktop-server"),M.on("close",()=>{M.statusCode>=400&&(R.error({url:v.url,method:v.method,statusCode:M.statusCode},"Request completed in error on mobile-desktop-server"),st.error({url:v.url,method:v.method,statusCode:M.statusCode},"Request completed in error on mobile-desktop-server"))}),k()}),m.use((v,M,k,V)=>{if(v instanceof Error&&v.message.includes("BadRequestError: request aborted")){k.status(400).send("Client disconnected");return}R.error({stack:v.stack,msg:v.message,err:v,url:M.url,method:M.method},"Unhandled exception leading to 500 on mobile-desktop-server"),st.error({stack:v.stack,msg:v.message,err:v,url:M.url,method:M.method},"Unhandled exception leading to 500 on mobile-desktop-server"),k.status(500).send(`Internal Server Error: ${v.message}`)}),o){let v=W_.static(o,{setHeaders:M=>{M.setHeader("Cache-Control","no-cache")},redirect:!1});m.use(v),m.use("*",(M,k)=>{k.sendFile(nj.join(o,"index.html"))})}let h=rj.createServer(m),f=`http://localhost:${e}`;await new Promise(v=>{try{h.listen(e,()=>{p.info(`Mobile desktop server is running at ${f}`),v()})}catch(M){M.message.includes("EADDRINUSE")?oj(e):R.error(`An unexpected error occurred while starting the server: ${M.message}`),process.exit(1)}});let T={type:"API_KEY",baseUrl:pf(),apiKey:t,logger:p},C=new Jt(T),x=Oe(),w={...T,mode:"interactive"},{dispose:O}=XM({baseServer:h,logger:p,authorization:T,globalStateManager:Bd,getOrgId:()=>Sa(),getGitMetadata:async()=>await pa(p,C,x),androidDriverFactory:async({socket:v,logger:M,creationOpts:k})=>{let V=Math.floor(Math.random()*1e4)+4e4,J=await wc(V,"appium");return Eu({logger:M,driverLogLevel:a,apiClient:C,creationOpts:k,socket:v,appiumPort:J,sessionId:v.id,orgId:Sa(),onStatusUpdate:te=>{v.emit("connectionStatusUpdate",{message:te,type:"info"})},onConnectionStateChange:te=>{te==="disconnected"?v.emit("connectionStatusUpdate",{message:"Emulator websocket connection lost.",type:"disconnected"}):te==="reconnecting"||te==="connecting"?v.emit("connectionStatusUpdate",{message:"Emulator websocket is reconnecting...",type:te==="reconnecting"?"reconnecting":"connecting"}):te==="connected"&&v.emit("connectionStatusUpdate",{message:"Emulator websocket connection restored",type:"connected"})}})},mobileGeneratorFactory:async v=>new la({baseUrl:pf(),apiKey:t,logger:p,mode:"interactive"}),browserGeneratorFactory:async v=>new Yo(x.config.ai?.agentConfig,w),browserEnricherFactory:async v=>new oa(w,new Yo(x.config.ai?.agentConfig,w)),storageFactory:async v=>new Gd(C,v),cacheStorageFactory:async(v,M)=>Ed({logger:p,orgId:v,client:C,gitMetadata:M,regenerateCache:s,noCache:l,alwaysSaveCache:c}),localToolsFactory:async()=>new sa({httpClient:C,fakerSeed:void 0}),keepSessionAlive:v=>C.extendAndroidEmulatorTtl(v),settingsFactory:async()=>({emulator:{},ai:{},...x.config})});process.once("SIGUSR2",async()=>{return;try{await O(),await ft.flush()}catch(v){R.error({err:v},"Error during session dispose on SIGUSR2")}try{h.close(()=>{process.kill(process.pid,"SIGUSR2")})}catch{process.kill(process.pid,"SIGUSR2")}}),process.once("SIGTERM",async()=>{let v="SIGTERM in Momentic mobile app received";R.info(v),p.info(v);try{await O(),await ft.flush()}finally{h.close(()=>process.exit(0))}}),process.once("SIGINT",async()=>{R.info("SIGINT in Momentic mobile app received");try{await O(),await ft.flush()}finally{h.close(()=>process.exit(0))}})}ej.setMaxListeners(25);process.on("warning",r=>{st.warn({err:r},`Node warning received on mobile-desktop-server: ${r.message}`)});process.on("uncaughtException",r=>{st.error({err:r},"Uncaught exception on mobile-desktop-server"),R.error(`Oh no! The Momentic mobile desktop app encountered a fatal error \u{1F61E}. Error logs: ${r.message}`)});process.on("unhandledRejection",r=>{st.error({reason:`${r}`,stack:r?.stack},"Uncaught exception on mobile-desktop-server (promise rejection)"),R.error(`Oh no! The Momentic mobile desktop app encountered an asynchronous error \u{1F61E}. Error logs: ${r}`)});function oj(r){R.error(ZW`Port ${r} is already in use by another process. Please close the other process and try again.
4408
4408
  Using Bash on MacOS or Linux:
4409
4409
  lsof -t -i :58888 | xargs kill -9
4410
4410
 
@@ -4413,10 +4413,10 @@ ${n.map(o=>o.configFilePath)}`);if(n.length===0)throw new Error("No valid Moment
4413
4413
  `)}import _j from"open";import Xd from"path";import{fileURLToPath as Ij}from"url";import bf from"fs";import Vd from"path";import{cwd as ij}from"process";async function Ef({tests:r,momenticFiles:e,project:t,yes:n,include:o,exclude:i,labels:a,logger:s,quarantinedTestReasons:c}){let l=new Set;if(r&&r.length>0){let d=r.some(m=>bf.existsSync(m)),p=ij();d?(p!==t.rootDir&&s.warn(`The current working directory ('${p}') 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.`),s.info(`Reading tests from the following local file paths:
4414
4414
  - ${r.join(`
4415
4415
  - `)}
4416
- `),r.forEach(m=>{if(!bf.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let g,h;try{g=bf.statSync(m),h=g.isDirectory()}catch(b){s.warn({err:b},`Skipping path ${m} because it cannot be read`);return}let f=Vd.resolve(m);Object.values(e.mobileTests).filter(b=>h?b.fullFilePath.startsWith(f):b.fullFilePath===f).forEach(b=>{l.add(b.fullFilePath)})})):(s.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))&&l.add(m.fullFilePath)}))}else{!n&&!await vc("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let d=Object.values(e.mobileTests);s.info(`Reading all ${d.length} mobile tests in the project from local disk.`),d.forEach(p=>{l.add(p.fullFilePath)})}for(let d of Array.from(l)){let p=Vd.relative(t.rootDir,d);o&&!o.some(m=>new RegExp(m).test(p))&&l.delete(d),i&&i.some(m=>new RegExp(m).test(p))&&l.delete(d)}return(await Promise.all(Array.from(l).map(async d=>{try{let p=Vd.relative(t.rootDir,d),m=await Ld(d,s,e),g=Vd.basename(d,".test.yaml");if(m.disabled)return null;if(a&&a.length>0){let h=m.labels||[];if(!a.some(b=>h.includes(b)))return null}return{id:m.id,name:g,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,steps:m.steps,fullFilePath:d,relativeFilePath:p,quarantined:!!c[m.id],quarantinedReason:c[m.id],labels:m.labels}}catch(p){s.error(`Failed to read and resolve mobile test at '${d}': ${p}`),process.exit(1)}}))).filter(d=>!!d)}import{InvalidArgumentError as Wd,Option as Ue}from"@commander-js/extra-typings";import{z as aj}from"zod";var q_=58890;function jd(r){let e=parseInt(r,10);if(isNaN(e))throw new Wd("Not a number.");return e}var Sl=new Ue("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new Wd("API key is required.");return r}).makeOptionMandatory(),$d=new Ue("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Tf=new Ue("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),yl=new Ue("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return aj.string().url().parse(r),r}catch{throw new Wd("Not a valid URL.")}}),vf=new Ue("-y, --yes","Skip all confirmation prompts.").env("CI"),Af=new Ue("--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."),Rf=new Ue("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),wf=new Ue("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1}),Cf=new Ue("--tag <tag>","Tag identifier for the asset."),K_=new Ue("--channel <channel>","Channel name for the asset."),Y_=new Ue("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),X_=new Ue("--env <env>","Environment to run all tests in (overrides test-level configuration)."),J_=new Ue("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),Q_=new Ue("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),Z_=new Ue("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(jd),eI=new Ue("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=jd(r);if(e<1)throw new Wd("Shard index must be greater than 0.");return e}),tI=new Ue("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(jd),xf=new Ue("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Mf=new Ue("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),_f=new Ue("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),rI=new Ue("--upload-results","Upload test results to Momentic Cloud.").default(!1),If=new Ue("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),nI=new Ue("--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}),oI=new Ue("--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(jd),iI=new Ue("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Xa)),aI=new Ue("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports");import{randomUUID as Rj}from"crypto";import{existsSync as wj}from"fs";import{randomUUID as lj}from"crypto";import{existsSync as cj,statSync as uj}from"fs";import{cloneDeep as dj}from"lodash-es";import sI from"path";async function lI(r){let{inputs:e,fixtures:t,metadata:n,options:o}=r,{tracer:i,logger:a}=t,{runId:s}=n,{testDefinition:c,project:l}=e,u=new Date,d=await i.startRun({logger:a,testId:c.id,testName:c.name,runId:s,testDescription:c.description,testLabels:c.labels,schemaVersion:c.schemaVersion,originalSteps:{steps:dj(c.steps),beforeSteps:void 0,afterSteps:void 0},quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}),p=a.child(d.loggerBindings||{}),m=1+(c.settings?.retries??l.config.retries??1);for(let g=0;g<m;g++){let h=new Date,f=await pj({runTracer:d,testDefinition:c,metadata:n,constants:{attemptNumber:g,totalAttempts:m},fixtures:{...t,logger:p},inputs:e,options:o}),b=new Date;if(f.status!=="FAILED")return await d.finish({logger:a,status:f.status,finishedAt:b}),{...f,startedAt:u,lastAttemptStartedAt:h,finishedAt:b,runId:s,attempts:g+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason,status:f.status};if(g!==m-1){a.warn("Retrying failed mobile run");continue}a.error("Mobile test failed after all exhausting attempts");let T={failureReason:f.error?.reason,failureDetails:f.error?{errorMessage:f.error.message,errorStack:f.error.stack}:void 0};return await d.finish({logger:a,status:f.status,...T,finishedAt:b}),{...f,startedAt:u,lastAttemptStartedAt:h,finishedAt:b,runId:s,...T,attempts:g+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason,status:f.status}}throw new Error("This code should not be reachable")}async function pj(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:p,logger:m,usageTracker:g}=i,{logUpdate:h,channel:f,tag:b,project:T,envOverride:C}=a,{regenerateCache:x,alwaysSaveCache:w,noCache:O,logLevel:v,localAvdId:M,localApkPath:k}=s;c!==0&&h("RETRY",`attempt ${c}/${l}`);let V={...a.project.config.emulator,...t.settings?.emulator},J=k?sI.resolve(k):void 0;if(J&&(!cj(J)||!uj(J).isFile()))throw new Error(`Local APK path "${J}" does not exist. Provide a valid file path via --local-apk-path.`);let te=C||t.settings?.defaultEnv,Y=(te?Xo(te,T,m):void 0)?.variables??{},H=typeof Y[vo]=="string"?Y[vo].trim():void 0,ce=typeof Y[Wa]=="string"?Y[Wa].trim():void 0,ge=Ed({logger:m,orgId:u,client:p,gitMetadata:d,regenerateCache:x,alwaysSaveCache:w,noCache:O}),Je=new ia(p,u),xe={type:"API_KEY",baseUrl:p.baseUrl,apiKey:p.apiKey,logger:m,mode:"runner"},Kt=new la(xe),Ot=new Yo(T.config.ai?.agentConfig,xe),Fe=new oa(xe,Ot),lt=new sa({httpClient:p,fakerSeed:void 0}),Nr=Math.floor(Math.random()*1e4)+4e4,wn=await wc(Nr,"appium"),io=V.region==="local"?J??t.settings?.defaultApkFilePath?.trim()??(ce?sI.resolve(ce):void 0):void 0,Qo=f&&!io?{channel:f,tag:b}:void 0,ba,ao;if(M||V.region==="local"){if(ao=M??V.localEmulatorSettings?.avdId??H,!ao)throw new Error(`An AVD ID is required when using a local region. Provide --local-avd-id, configure a default local AVD ID on the test's settings, or set the ${vo} key on the environment.`);ba={avdId:ao,apkToInstall:Qo,apkFilePath:io}}else ba={region:V.region,apkToInstall:Qo,osVersion:V.remoteEmulatorSettings?.androidVersion??Cb};let so=lj(),lo=m.child({runAttemptId:so}),Dr;try{Dr=await _u({apiClient:p,logger:m,driverLogLevel:v,creationOpts:ba,onStatusUpdate:ct=>{m.debug({status:ct},"Emulator status update")},appiumPort:wn,orgId:u,sessionId:so,onConnectionStateChange:ct=>{ct==="disconnected"?R.warn("Emulator websocket connection lost. Emulator may be unavailable."):(ct==="reconnecting"||ct==="connecting")&&R.info("Emulator websocket is reconnecting...")}})}catch(ct){let Ff=`Fatal error creating Android driver, failing test run attempt (runId: ${n.runId})`;return m.error({err:ct},Ff),R.error({err:ct},Ff),{status:"FAILED",results:[],error:new E("UserConfigurationError",`Fatal error creating Android driver: ${ct.message}`)}}let $=await e.startAttempt({emulatorName:Dr.emulatorName,runAttemptId:so});lo=lo.child($.loggerBindings||{});let Ea=await Pu({driver:Dr.driver,onLogs:ct=>{$.appendLogs(ct)}}),ln=new vi({variablesFromEnvironment:Y,envName:te,testName:t.name}),Uf=await na.init({driver:Dr.driver,generator:Kt,logger:lo,limbarClient:Dr.limbarClient,playwrightDevice:Dr.playwrightDevice,orgId:u,adbPort:Dr.adbPort,options:{emulator:V},aiSettings:{...T.config.ai,useMemory:T.config.ai?.useMemory!==!1,...t.settings?.ai},fixtures:{storage:Je,browserEnricher:Fe,browserGenerator:Ot,localCodeEvalTools:lt,testContext:ln}}),co;try{co=await wd({containerName:`mobile test ${t.name}`,fixtures:{controller:Uf,logger:lo,cacheStorage:ge,usageTracker:g},work:{},inputs:{testName:t.name,steps:t.steps,orgId:u,testMetadata:t},tracer:$,callbacks:{driver:{onHeartbeatFailure:()=>{let ct="Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure";R.warn(ct)},onHeartbeatRestored:()=>{let ct="Appium heartbeat connection restored";R.info(ct)}}}})}finally{await Ea(),await Dr.cleanup(),await Uf.cleanup()}await $.finish({logger:lo,results:co.results,status:co.status,assetDetails:{avdId:ao,tag:Qo?.tag,channel:Qo?.channel}});let Qd;if(co.status==="FAILED"&&co.terminalResult){let ct=co.terminalResult.message;ct?Qd=E.fromMessage(ct):Qd=new E("UnknownError",ct||"Unknown failure")}return{...co,error:Qd}}import{existsSync as fj,mkdirSync as Sj,statSync as yj}from"fs";import bj from"path";import{z as Oqe}from"zod";import mj from"junit-report-builder";import qd from"path";function gj(r,e){if(e.name(r.testName).className(r.testName).file(qd.relative(".",r.filePath)).property("id",r.testId).property("dd_tags[id]",r.testId),r.labels&&(e.property("labels",r.labels.join(",")),r.labels.forEach(t=>{e.property("dd_tags[label]",t)})),r.baseUrl&&(e.property("base_url",r.baseUrl),e.property("dd_tags[base_url]",r.baseUrl)),r.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${r.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${r.runId}`)),r.quarantined&&(e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),r.quarantinedReason&&(e.property("quarantined_reason",r.quarantinedReason),e.property("dd_tags[quarantined_reason]",r.quarantinedReason))),r.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),r.status==="FAILED"){if(r.failureReason){let t=pp[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Pl[r.failureReason];r.runId&&(n+=` Visit https://app.momentic.ai/runs/${r.runId} for more details.`),e.failure(n,t)}r.failureDetails?.errorStack&&e.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&e.skipped();return e.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("started_at",r.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",r.lastAttemptStartedAt.toISOString()).property("finished_at",r.finishedAt.toISOString()).property("dd_tags[finished_at]",r.finishedAt.toISOString()),e.property("attempts",r.attempts.toString()).property("dd_tags[attempts]",r.attempts.toString()),r.parameters?.envName&&(e.property("environment",r.parameters.envName),e.property("dd_tags[environment]",r.parameters.envName)),r.parameters?.urlOverride&&e.property("url_override",r.parameters.urlOverride),e}function hj(r,e,t){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestReasons:l}=e,u=r.testSuite().name(o);n&&u.property("id",n),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of t){let p=u.testCase();gj(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(qd.relative(".",d.relativeFilePath)).property("id",d.id),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(m=>{p.property("dd_tags[label]",m)})),p.skipped()}for(let d of c){let p=u.testCase();p.name(d.name).className(d.name).file(qd.relative(".",d.relativeFilePath)).property("id",d.id).property("quarantined","true");let m=l[d.id];m&&p.property("quarantinedReason",m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(g=>{p.property("dd_tags[label]",g)})),p.skipped()}return u}function Pf(r,e,t){let n=mj.newBuilder();hj(n,e,t),n.writeTo(qd.join(r,`${e.suiteName}.xml`))}function Ej(r){return{testName:bj.basename(r.filePath,".test.yaml")||r.filePath.split("/").pop()?.replace(".yaml","")||r.filePath,testId:r.testMetadata.id,filePath:r.filePath,labels:r.testMetadata.labels,baseUrl:void 0,runId:r.runId,quarantined:r.quarantined,quarantinedReason:r.quarantinedReason,status:r.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:r.failureDetails,failureReason:r.failureReason,finishedAt:r.finishedAt,lastAttemptStartedAt:r.lastAttemptStartedAt,attempts:r.attempts,parameters:r.parameters}}async function cI({logger:r,callbacks:e,format:t,params:n,runs:o,folder:i}){switch(fj(i)?yj(i).isDirectory()||(R.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(R.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),Sj(i,{recursive:!0})),t){case"junit":{let a=o.map(Ej);Pf(i,n,a);return}case"allure":case"allure-json":R.error(`The specified reporter format '${t}' is not supported for mobile tests.`);return;case"playwright-json":R.error(`The specified reporter format '${t}' is not supported for mobile tests.`);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import{debounce as Tj}from"ts-debounce";var bl="0.19.0";function vj(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 Aj(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Of=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.interactionTracer=new jo,Or.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${fs}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${fs}/${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:Aj(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 ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},ya=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(`${fs}/${t}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new Of(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:vj(e.status),finishedAt:e.finishedAt}))))}},Lf=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(`
4416
+ `),r.forEach(m=>{if(!bf.existsSync(m))throw new Error(`Path '${m}' does not exist.`);let g,h;try{g=bf.statSync(m),h=g.isDirectory()}catch(b){s.warn({err:b},`Skipping path ${m} because it cannot be read`);return}let f=Vd.resolve(m);Object.values(e.mobileTests).filter(b=>h?b.fullFilePath.startsWith(f):b.fullFilePath===f).forEach(b=>{l.add(b.fullFilePath)})})):(s.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))&&l.add(m.fullFilePath)}))}else{!n&&!await vc("No test paths or substrings were provided. Do you want to run all tests?")&&(s.error("Cancelled by user."),process.exit(1));let d=Object.values(e.mobileTests);s.info(`Reading all ${d.length} mobile tests in the project from local disk.`),d.forEach(p=>{l.add(p.fullFilePath)})}for(let d of Array.from(l)){let p=Vd.relative(t.rootDir,d);o&&!o.some(m=>new RegExp(m).test(p))&&l.delete(d),i&&i.some(m=>new RegExp(m).test(p))&&l.delete(d)}return(await Promise.all(Array.from(l).map(async d=>{try{let p=Vd.relative(t.rootDir,d),m=await Ld(d,s,e),g=Vd.basename(d,".test.yaml");if(m.disabled)return null;if(a&&a.length>0){let h=m.labels||[];if(!a.some(b=>h.includes(b)))return null}return{id:m.id,name:g,description:m.description,schemaVersion:m.schemaVersion,settings:m.settings,steps:m.steps,fullFilePath:d,relativeFilePath:p,quarantined:!!c[m.id],quarantinedReason:c[m.id],labels:m.labels}}catch(p){s.error(`Failed to read and resolve mobile test at '${d}': ${p}`),process.exit(1)}}))).filter(d=>!!d)}import{InvalidArgumentError as Wd,Option as Ue}from"@commander-js/extra-typings";import{z as aj}from"zod";var q_=58890;function jd(r){let e=parseInt(r,10);if(isNaN(e))throw new Wd("Not a number.");return e}var Sl=new Ue("--api-key <key>","Momentic API key").env("MOMENTIC_API_KEY").argParser(r=>{if(!r)throw new Wd("API key is required.");return r}).makeOptionMandatory(),$d=new Ue("-c, --config <configPath>","Absolute or relative path to a Momentic configuration file."),Tf=new Ue("-f, --filter <filter>","Run tests within the project that has a name equal to the filter provided. This option cannot be used together with file path or directory arguments, but substring matches are allowed."),yl=new Ue("--server <server>","Momentic server to use.").env("MOMENTIC_SERVER").default("https://api.momentic.ai").argParser(r=>{try{return aj.string().url().parse(r),r}catch{throw new Wd("Not a valid URL.")}}),vf=new Ue("-y, --yes","Skip all confirmation prompts.").env("CI"),Af=new Ue("--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."),Rf=new Ue("--save-cache","Always save updated step caches after successful test runs. By default, caches are not saved when running on protected branches.").env("CI"),wf=new Ue("--disable-cache","Disable using step caches completely. Using this option may lead to non-deterministic behavior and significantly longer runtimes.").implies({saveCache:!1}),Cf=new Ue("--tag <tag>","Tag identifier for the asset."),K_=new Ue("--channel <channel>","Channel name for the asset."),Y_=new Ue("--channel <channel>","Channel name for the asset.").makeOptionMandatory(),X_=new Ue("--env <env>","Environment to run all tests in (overrides test-level configuration)."),J_=new Ue("--local-avd-id <localAvdId>","Force tests to use a specific local Android Virtual Device (AVD) instead of remote emulators."),Q_=new Ue("--local-apk-path <localApkPath>","Path to a local APK file to install when running tests with a local emulator. Overrides remote asset configuration."),Z_=new Ue("-p, --parallel <parallel>","The number of tests to run in parallel. Defaults to 1.").argParser(jd),eI=new Ue("--shard-index <shardIndex>","The index of the shard to run tests for. Defaults to 1.").default(1).argParser(r=>{let e=jd(r);if(e<1)throw new Wd("Shard index must be greater than 0.");return e}),tI=new Ue("--shard-count <shardCount>","The number of shards that tests are being run on. Defaults to 1.").default(1).argParser(jd),xf=new Ue("--output-dir <outputDir>","Output directory to store run artifacts such as screenshots, results, and logs."),Mf=new Ue("--include <includePatterns...>","Only include tests that match the provided regex patterns. Multiple patterns can be provided. The patterns will be matched against the test file paths and the pattern only needs to match a part of the path for the test to be included."),_f=new Ue("--exclude <excludePatterns...>","The inverted version of --include: a test that matches any of the provided exclusion patterns will be excluded from running."),rI=new Ue("--upload-results","Upload test results to Momentic Cloud.").default(!1),If=new Ue("--log-level <logLevel>","Log level for Momentic and dependent services.").choices(["error","warn","info","debug"]),nI=new Ue("--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}),oI=new Ue("--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(jd),iI=new Ue("--reporter <reporter>","Output report files in a standardized format to a local directory.").choices(Object.values(Xa)),aI=new Ue("--reporter-dir <reporterDir>","Output directory to store report files. Relative paths are resolved relative to the project root, which is defined by the detected momentic.config.yaml.").default("reports");import{randomUUID as Rj}from"crypto";import{existsSync as wj}from"fs";import{randomUUID as lj}from"crypto";import{existsSync as cj,statSync as uj}from"fs";import{cloneDeep as dj}from"lodash-es";import sI from"path";async function lI(r){let{inputs:e,fixtures:t,metadata:n,options:o}=r,{tracer:i,logger:a}=t,{runId:s}=n,{testDefinition:c,project:l}=e,u=new Date,d=await i.startRun({logger:a,testId:c.id,testName:c.name,runId:s,testDescription:c.description,testLabels:c.labels,schemaVersion:c.schemaVersion,originalSteps:{steps:dj(c.steps),beforeSteps:void 0,afterSteps:void 0},quarantined:c.quarantined,quarantinedReason:c.quarantinedReason}),p=a.child(d.loggerBindings||{}),m=1+(c.settings?.retries??l.config.retries??1);for(let g=0;g<m;g++){let h=new Date,f=await pj({runTracer:d,testDefinition:c,metadata:n,constants:{attemptNumber:g,totalAttempts:m},fixtures:{...t,logger:p},inputs:e,options:o}),b=new Date;if(f.status!=="FAILED")return await d.finish({logger:a,status:f.status,finishedAt:b}),{...f,startedAt:u,lastAttemptStartedAt:h,finishedAt:b,runId:s,attempts:g+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason,status:f.status};if(g!==m-1){a.warn("Retrying failed mobile run");continue}a.error("Mobile test failed after all exhausting attempts");let T={failureReason:f.error?.reason,failureDetails:f.error?{errorMessage:f.error.message,errorStack:f.error.stack}:void 0};return await d.finish({logger:a,status:f.status,...T,finishedAt:b}),{...f,startedAt:u,lastAttemptStartedAt:h,finishedAt:b,runId:s,...T,attempts:g+1,testMetadata:c,steps:c.steps,filePath:c.relativeFilePath,quarantined:c.quarantined,quarantinedReason:c.quarantinedReason,status:f.status}}throw new Error("This code should not be reachable")}async function pj(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:p,logger:m,usageTracker:g}=i,{logUpdate:h,channel:f,tag:b,project:T,envOverride:C}=a,{regenerateCache:x,alwaysSaveCache:w,noCache:O,logLevel:v,localAvdId:M,localApkPath:k}=s;c!==0&&h("RETRY",`attempt ${c}/${l}`);let V={...a.project.config.emulator,...t.settings?.emulator},J=k?sI.resolve(k):void 0;if(J&&(!cj(J)||!uj(J).isFile()))throw new Error(`Local APK path "${J}" does not exist. Provide a valid file path via --local-apk-path.`);let te=C||t.settings?.defaultEnv,Y=(te?Xo(te,T,m):void 0)?.variables??{},H=typeof Y[vo]=="string"?Y[vo].trim():void 0,ce=typeof Y[Wa]=="string"?Y[Wa].trim():void 0,ge=Ed({logger:m,orgId:u,client:p,gitMetadata:d,regenerateCache:x,alwaysSaveCache:w,noCache:O}),Je=new ia(p,u),xe={type:"API_KEY",baseUrl:p.baseUrl,apiKey:p.apiKey,logger:m,mode:"runner"},Kt=new la(xe),Ot=new Yo(T.config.ai?.agentConfig,xe),Fe=new oa(xe,Ot),lt=new sa({httpClient:p,fakerSeed:void 0}),Nr=Math.floor(Math.random()*1e4)+4e4,wn=await wc(Nr,"appium"),io=V.region==="local"?J??t.settings?.defaultApkFilePath?.trim()??(ce?sI.resolve(ce):void 0):void 0,Qo=f&&!io?{channel:f,tag:b}:void 0,ba,ao;if(M||V.region==="local"){if(ao=M??V.localEmulatorSettings?.avdId??H,!ao)throw new Error(`An AVD ID is required when using a local region. Provide --local-avd-id, configure a default local AVD ID on the test's settings, or set the ${vo} key on the environment.`);ba={avdId:ao,apkToInstall:Qo,apkFilePath:io}}else ba={region:V.region,apkToInstall:Qo,osVersion:V.remoteEmulatorSettings?.androidVersion??Cb};let so=lj(),lo=m.child({runAttemptId:so}),Dr;try{Dr=await Eu({apiClient:p,logger:m,driverLogLevel:v,creationOpts:ba,onStatusUpdate:ct=>{m.debug({status:ct},"Emulator status update")},appiumPort:wn,orgId:u,sessionId:so,onConnectionStateChange:ct=>{ct==="disconnected"?R.warn("Emulator websocket connection lost. Emulator may be unavailable."):(ct==="reconnecting"||ct==="connecting")&&R.info("Emulator websocket is reconnecting...")}})}catch(ct){let Ff=`Fatal error creating Android driver, failing test run attempt (runId: ${n.runId})`;return m.error({err:ct},Ff),R.error({err:ct},Ff),{status:"FAILED",results:[],error:new E("UserConfigurationError",`Fatal error creating Android driver: ${ct.message}`)}}let $=await e.startAttempt({emulatorName:Dr.emulatorName,runAttemptId:so});lo=lo.child($.loggerBindings||{});let Ea=await vu({driver:Dr.driver,onLogs:ct=>{$.appendLogs(ct)}}),ln=new vi({variablesFromEnvironment:Y,envName:te,testName:t.name}),Uf=await na.init({driver:Dr.driver,generator:Kt,logger:lo,limbarClient:Dr.limbarClient,playwrightDevice:Dr.playwrightDevice,orgId:u,adbPort:Dr.adbPort,options:{emulator:V},aiSettings:{...T.config.ai,useMemory:T.config.ai?.useMemory!==!1,...t.settings?.ai},fixtures:{storage:Je,browserEnricher:Fe,browserGenerator:Ot,localCodeEvalTools:lt,testContext:ln}}),co;try{co=await wd({containerName:`mobile test ${t.name}`,fixtures:{controller:Uf,logger:lo,cacheStorage:ge,usageTracker:g},work:{},inputs:{testName:t.name,steps:t.steps,orgId:u,testMetadata:t},tracer:$,callbacks:{driver:{onHeartbeatFailure:()=>{let ct="Appium heartbeat connection lost \u2014 possible ADB tunnel/emulator failure";R.warn(ct)},onHeartbeatRestored:()=>{let ct="Appium heartbeat connection restored";R.info(ct)}}}})}finally{await Ea(),await Dr.cleanup(),await Uf.cleanup()}await $.finish({logger:lo,results:co.results,status:co.status,assetDetails:{avdId:ao,tag:Qo?.tag,channel:Qo?.channel}});let Qd;if(co.status==="FAILED"&&co.terminalResult){let ct=co.terminalResult.message;ct?Qd=E.fromMessage(ct):Qd=new E("UnknownError",ct||"Unknown failure")}return{...co,error:Qd}}import{existsSync as fj,mkdirSync as Sj,statSync as yj}from"fs";import bj from"path";import{z as Gqe}from"zod";import mj from"junit-report-builder";import qd from"path";function gj(r,e){if(e.name(r.testName).className(r.testName).file(qd.relative(".",r.filePath)).property("id",r.testId).property("dd_tags[id]",r.testId),r.labels&&(e.property("labels",r.labels.join(",")),r.labels.forEach(t=>{e.property("dd_tags[label]",t)})),r.baseUrl&&(e.property("base_url",r.baseUrl),e.property("dd_tags[base_url]",r.baseUrl)),r.runId&&(e.property("run_url",`https://app.momentic.ai/runs/${r.runId}`),e.property("dd_tags[run_url]",`https://app.momentic.ai/runs/${r.runId}`)),r.quarantined&&(e.property("quarantined","true"),e.property("dd_tags[quarantined]","true"),r.quarantinedReason&&(e.property("quarantined_reason",r.quarantinedReason),e.property("dd_tags[quarantined_reason]",r.quarantinedReason))),r.setupFailed&&(e.property("setup_failed","true"),e.property("dd_tags[setup_failed]","true")),r.mainFailed&&(e.property("main_failed","true"),e.property("dd_tags[main_failed]","true")),r.teardownFailed&&(e.property("teardown_failed","true"),e.property("dd_tags[teardown_failed]","true")),r.status==="FAILED"){if(r.failureReason){let t=pp[r.failureDetails?.classification?.reason||r.failureReason],n=r.failureDetails?.classification?.summary||Pl[r.failureReason];r.runId&&(n+=` Visit https://app.momentic.ai/runs/${r.runId} for more details.`),e.failure(n,t)}r.failureDetails?.errorStack&&e.stacktrace(r.failureDetails.errorStack)}else r.status==="CANCELLED"&&e.skipped();return e.time((r.finishedAt.getTime()-r.lastAttemptStartedAt.getTime())/1e3).property("started_at",r.lastAttemptStartedAt.toISOString()).property("dd_tags[started_at]",r.lastAttemptStartedAt.toISOString()).property("finished_at",r.finishedAt.toISOString()).property("dd_tags[finished_at]",r.finishedAt.toISOString()),e.property("attempts",r.attempts.toString()).property("dd_tags[attempts]",r.attempts.toString()),r.parameters?.envName&&(e.property("environment",r.parameters.envName),e.property("dd_tags[environment]",r.parameters.envName)),r.parameters?.urlOverride&&e.property("url_override",r.parameters.urlOverride),e}function hj(r,e,t){let{suiteId:n,suiteName:o,startedAt:i,finishedAt:a,testsToSkip:s,quarantinedTestsToSkip:c,quarantinedTestReasons:l}=e,u=r.testSuite().name(o);n&&u.property("id",n),u.timestamp(i).property("startedAt",i.toISOString()).property("finishedAt",a.toISOString()).time((a.getTime()-i.getTime())/1e3);for(let d of t){let p=u.testCase();gj(d,p)}for(let d of s){let p=u.testCase();p.name(d.name).className(d.name).file(qd.relative(".",d.relativeFilePath)).property("id",d.id),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(m=>{p.property("dd_tags[label]",m)})),p.skipped()}for(let d of c){let p=u.testCase();p.name(d.name).className(d.name).file(qd.relative(".",d.relativeFilePath)).property("id",d.id).property("quarantined","true");let m=l[d.id];m&&p.property("quarantinedReason",m),d.baseUrl&&p.property("baseUrl",d.baseUrl),d.labels&&(p.property("labels",d.labels.join(",")),d.labels.forEach(g=>{p.property("dd_tags[label]",g)})),p.skipped()}return u}function Pf(r,e,t){let n=mj.newBuilder();hj(n,e,t),n.writeTo(qd.join(r,`${e.suiteName}.xml`))}function Ej(r){return{testName:bj.basename(r.filePath,".test.yaml")||r.filePath.split("/").pop()?.replace(".yaml","")||r.filePath,testId:r.testMetadata.id,filePath:r.filePath,labels:r.testMetadata.labels,baseUrl:void 0,runId:r.runId,quarantined:r.quarantined,quarantinedReason:r.quarantinedReason,status:r.status,setupFailed:void 0,mainFailed:void 0,teardownFailed:void 0,failureDetails:r.failureDetails,failureReason:r.failureReason,finishedAt:r.finishedAt,lastAttemptStartedAt:r.lastAttemptStartedAt,attempts:r.attempts,parameters:r.parameters}}async function cI({logger:r,callbacks:e,format:t,params:n,runs:o,folder:i}){switch(fj(i)?yj(i).isDirectory()||(R.error(`The specified reporter output directory '${i}' exists on disk but is not a folder. Please move or delete the existing object or specify a different reporter path.`),process.exit(1)):(R.info(`Reporter output directory '${i}' does not exist on disk, creating it now...`),Sj(i,{recursive:!0})),t){case"junit":{let a=o.map(Ej);Pf(i,n,a);return}case"allure":case"allure-json":R.error(`The specified reporter format '${t}' is not supported for mobile tests.`);return;case"playwright-json":R.error(`The specified reporter format '${t}' is not supported for mobile tests.`);return;default:throw new Error(`Unknown reporter format requested: '${t}'`)}}import{debounce as Tj}from"ts-debounce";var bl="0.19.1";function vj(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 Aj(r){switch(r){case"SUCCESS":return"PASSED";case"FAILED":return"FAILED";case"CANCELLED":return"CANCELLED";case"RUNNING":return"RUNNING";case"IDLE":return"PENDING"}}var Of=class{constructor(e,t,n,o){this.keepalive=e;this.testId=t;this.testName=n;this.diskStorage=o;this.interactionTracer=new jo,Or.initializeRootTracerContext(this.interactionTracer)}children=[];finished=!1;interactionTracer;getParentStepIdChain(){return[]}attachBeforeScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${fs}/${t}.jpeg`,contents:n})}attachAfterScreenshot(e){let{snapshotId:t,screenshot:n}=e;this.diskStorage.storeFile({name:`${fs}/${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:Aj(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 ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}},ya=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(`${fs}/${t}.jpeg`)}getParentStepIdChain(){return[]}async startStep(e){this.keepalive();let t=new Of(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:vj(e.status),finishedAt:e.finishedAt}))))}},Lf=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(`
4417
4417
  `);this.logStream.write(t+`
4418
- `)}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:rd(o,t),beforeResults:i?rd(i,t):void 0,afterResults:a?rd(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 ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${fs}/${t}.jpeg`)}},Nf=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:Nn,runAttemptSchemaVersion:bT,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=Tj(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new Lf(()=>void i(),this.testId,this.testName,t,o,n);return this.children.push(a),a}},Kd=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:lr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:bl,labels:a??[]},c=new ul(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:bl,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 Nf(this.client,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function uI(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 An(){try{await z(Promise.all([_T(),ft.flush()]),{milliseconds:5e3})}catch{}}async function dI(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:p}=e;wj(d)&&R.warn(`Output directory ${d} already exists, removing before test execution...`);let m=kT({items:n.testDefinitions,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:J=>J.relativeFilePath}),g=new Set;n.testDefinitions.forEach(J=>{J.labels?.forEach(te=>g.add(te))});let h=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),f=await Kd.start({logger:h,orgId:c,runGroupId:l,outputDir:d,client:a,gitMetadata:u,labels:Array.from(g)}),b=[],T=new Date,C=new Set,x=async()=>Cj({runResults:b,startTime:T,ranTests:C,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:d}),w=async J=>{R.warn(`${J} Stopping tests and printing latest results.`),await f.finish({logger:h,status:"CANCELLED"}),await x(),await An(),process.exit(1)},O=async()=>{await w("SIGINT received.")};process.once("SIGINT",O);let v;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let J=e.timeoutMinutes*60*1e3;v=setTimeout(()=>{w(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},J)}let M={};for(let J=0;J<m.length;J++){let te=Object.values(M);te.length===p&&await Promise.race(te.map(H=>H.promise));let Et=m[J],Y=`test-${J}`;M[Y]={done:!1,promise:(async({testDefinition:H})=>{C.add(Y);let ce=H.relativeFilePath.includes("..")?H.fullFilePath:H.relativeFilePath;ys({status:"START",testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length});let ge=setInterval(()=>ys({status:"RUN",testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length}),5*60*1e3),Je=Rj(),xe=h.child({testId:H.id,runId:Je}),Kt=new Mu({logger:xe,reporter:new yd(a),runType:"mobile-test-run",runId:Je,testMetadata:H,suiteMetadata:void 0});try{let Ot=await lI({metadata:{...o,runId:Je},fixtures:{...t,tracer:f,logger:xe,usageTracker:Kt},inputs:{...n,project:i,testDefinition:H,channel:n.channel??H.settings?.defaultChannel,tag:n.tag??H.settings?.defaultTag,logUpdate:(Fe,lt)=>ys({status:Fe,testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length,additionalText:lt})},options:e});ys({status:Ot.status,testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length}),b.push(Ot)}catch(Ot){let Fe=`Encountered unexpected fatal error when running test '${H.name}': ${Ot.message}
4419
- ${Ot.stack}`;R.error(Fe),xe.error({err:Ot},`Encountered unexpected fatal error when running test ${H.name}`),await w("Fatal error occurred.")}finally{clearInterval(ge),M[Y].done=!0,delete M[Y]}await Kt.flush(s)})({testDefinition:Et})}}await Promise.allSettled(Object.values(M).map(J=>J.promise)),v&&clearTimeout(v);let V=b.some(J=>J.status==="FAILED"&&!J.quarantined)?"FAILED":"PASSED";return await f.finish({logger:h,status:V}),process.off("SIGINT",O),e.reporter&&e.reporterDir&&await cI({logger:h,callbacks:{createDebugDataReaderForRunAttempt:(J,te)=>new kd(d,J,te)},format:e.reporter,params:{projectConfigPath:i.configFilePath,suiteName:i.config.name,startedAt:T,finishedAt:new Date,testsToSkip:[],quarantinedTestsToSkip:[],quarantinedTestReasons:{}},runs:b,folder:e.reporterDir}),x()}async function Cj({runResults:r,startTime:e,apiClient:t,uploadResults:n,outputDir:o}){let i=t.getAppUrl(),a=IT({results:r,startTime:e.getTime(),onFailed:s=>{},getDisplayLine:s=>{let c=`${_m}- ${s.filePath}`;return s.runId&&(c+=` ( link when uploaded: ${i}/runs/${s.runId} )`),c},entity:"mobile test"});return R.log(""),n?(R.success(`Test results have been saved to the folder ${o}. Uploading to Momentic Cloud...`),await Dd({client:t,consoleLogger:R,resultsPath:o})):R.success(`Test results have been saved to the folder ${o}. Upload them to Momentic Cloud by running 'npx momentic-mobile results upload ${o}'.`),a}async function Df(){Qw(),NT("Chromium")||(_o?(await vc("The Chromium browser is not installed but is required for automating webviews. Install it now?")||process.exit(1),await Rc({rawBrowsers:["chromium"],force:!1,all:!1})):(R.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)))}VR({serviceName:"mobile-cli"});pr.setApp("mobile-cli");var Rn=new xj;Rn.name("momentic-mobile").description("Momentic Mobile CLI").version(bl);var Pj=Rn.command("assets").description("Manage mobile testing assets");Pj.command("upload").description("Upload an asset for mobile tests").argument("<file>","Path to the asset file to upload").addOption(Sl).addOption(yl).addOption(Cf).addOption(Y_).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i}=e,a=Xd.resolve(r);Yd.existsSync(a)||(R.error(`File not found: ${a}`),process.exit(1));let s=new Jt({baseUrl:n,apiKey:t,logger:R});/\.apk$/i.test(a)||(R.error(`File is not an APK file: ${a}`),process.exit(1)),await Iu({tag:o?.toLowerCase(),channel:i.toLowerCase(),filePath:a,apiClient:s,logger:R})});Rn.command("app").addOption(Sl).addOption(yl).addOption(vf).addOption($d).addOption(If).addOption(Af).addOption(Rf).addOption(wf).action(async r=>{let{apiKey:e,server:t,yes:n,disableCache:o,saveCache:i,regenerateCache:a}=r;Nm({disableCache:o,saveCache:i,regenerateCache:a});let s=Pm(r.logLevel);pr.setApp("mobile-desktop-server");let c=new Jt({baseUrl:t,apiKey:e,logger:pr});await $h({client:c,skipPrompts:n}),R.debug("API key check complete");let l=Ij(import.meta.url),u=Xd.dirname(l),d=Xd.resolve(u,"..","static");await Df(),R.debug({appiumHome:qs},"Resolved resource paths");let p=await da({configFilePath:r.config}),m=q_;await $_({momenticServerUrl:t,serverPort:m,apiKey:e,staticDir:d,initialProject:p,driverLogLevel:s,logger:pr,regenerateCache:a??!1,noCache:o??!1,alwaysSaveCache:i??!1});let g=`http://localhost:${m}`;R.info(`Local app started on: ${g}`),await _j(g)});var pI=Rn.command("results").description("Merge and upload test results.");pI.command("merge").description("Merge test results files.").addOption(xf).addArgument(new Jd("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired()).action(async(r,e)=>{let{outputDir:t}=e;t||(R.error("Output directory is required."),process.exit(1)),Yd.existsSync(r)||(R.warn("Results path does not exist, skipping merge."),process.exit(0)),Yd.existsSync(t)&&R.warn(`Output directory ${t} already exists, removing before merging...`),b_(pr,t,r),await An(),process.exit(0)});var Oj=new Jd("<results>","Path to the results archive.").argRequired();pI.command("upload").description("Upload test results to Momentic cloud.").addOption(Sl).addOption(yl).addArgument(Oj).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=pr,i=new Jt({baseUrl:n,apiKey:t,logger:o});await Dd({consoleLogger:R,resultsPath:r,client:i}),await An(),process.exit(0)});var Lj=Rn.command("list").description("List mobile test paths");Lj.addOption($d).addOption(Tf).addOption(Mf).addOption(_f).addOption(new kf("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(new Jd("[tests...]","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let t=await da({configFilePath:e.config,nameFilter:e.filter}),n=await Qt(t),o=await Ef({tests:r,momenticFiles:n,yes:!0,include:e.include,exclude:e.exclude,project:t,labels:e.labels,logger:R,quarantinedTestReasons:{}});R.info(o.map(i=>i.relativeFilePath).join(`
4420
- `)),process.exit(0)});var Nj=Rn.command("run").alias("test").description("Run tests on the local machine");Nj.addOption(Sl).addOption(yl).addOption($d).addOption(Tf).addOption(Mf).addOption(_f).addOption(vf).addOption(Z_).addOption(If).addOption(tI).addOption(eI).addOption(Af).addOption(Rf).addOption(wf).addOption(xf).addOption(rI).addOption(iI).addOption(aI).addOption(nI).addOption(oI).addOption(new kf("--labels <labels...>","Only run tests with the specified label(s).")).addOption(Cf).addOption(K_).addOption(X_).addOption(J_).addOption(Q_).addArgument(new Jd("<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,reporter:s,reporterDir:c,disableCache:l,saveCache:u,regenerateCache:d}=e,p=Pm(e.logLevel);await Df(),R.debug({appiumHome:qs},"Resolved resource paths"),Nm({disableCache:l,saveCache:u,regenerateCache:d}),DT({shardIndex:e.shardIndex,shardCount:e.shardCount});let m=await da({configFilePath:e.config,nameFilter:e.filter}),g=a??m.config.outputDir??i_,h=e.parallel??m.config.parallel??1;R.debug("Checking API key and dependencies");let f=new Jt({baseUrl:n,apiKey:t,logger:R}),{orgId:b,userId:T}=await $h({client:f,skipPrompts:e.yes});R.debug("API key check and browser installation complete");let C=Mj(),x=pr.child({runGroupId:C,orgId:b,userId:T}),w=await pa(pr,f,m);x.debug(w,"Got local git metadata");let O=await uI(x,f,e.ignoreQuarantine),v=await Qt(m),M=await Ef({tests:r,yes:e.yes,project:m,momenticFiles:v,include:e.include,exclude:e.exclude,labels:e.labels,logger:R,quarantinedTestReasons:O});try{let k=await dI({options:{...e,parallel:h,outputDir:g,alwaysSaveCache:u??!1,regenerateCache:d??!1,noCache:l??!1,logLevel:p,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount,reporter:s,reporterDir:c,labels:e.labels},fixtures:{logger:x,project:m,apiClient:f},inputs:{envOverride:e.env,tag:o,channel:i,testDefinitions:M},metadata:{gitMetadata:w,runGroupId:C,orgId:b}});await An(),k.failed>0?process.exit(1):process.exit(0)}catch(k){R.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),R.error(k),pr.error({err:k},"Failed to run tests locally"),await An(),process.exit(1)}});Rn.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new kf("--name <name>","Name of the project")).action(async r=>{R.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
4418
+ `)}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:rd(o,t),beforeResults:i?rd(i,t):void 0,afterResults:a?rd(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 ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startMainStepList(){let e=new ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async startAfterStepList(){let e=new ya(this.keepalive,this.testId,this.testName,this.diskStorage);return this.children.push(e),e}async getScreenshot(e,t){return this.diskStorage.readFile(`${fs}/${t}.jpeg`)}},Nf=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:Nn,runAttemptSchemaVersion:bT,startedAt:new Date,status:"RUNNING"};n.storeFile({name:"metadata.json",contents:JSON.stringify(o,null,2)});let i=Tj(async()=>{await this.client.extendAndroidEmulatorTtl(e.emulatorName)},3e4,{maxWait:6e4}),a=new Lf(()=>void i(),this.testId,this.testName,t,o,n);return this.children.push(a),a}},Kd=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:lr.CLI,startedAt:new Date,status:"RUNNING",cliVersion:bl,labels:a??[]},c=new ul(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:bl,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 Nf(this.client,e.testId,e.testName,e.runId,n,t);return this.children.push(o),o}};async function uI(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 An(){try{await z(Promise.all([_T(),ft.flush()]),{milliseconds:5e3})}catch{}}async function dI(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:p}=e;wj(d)&&R.warn(`Output directory ${d} already exists, removing before test execution...`);let m=kT({items:n.testDefinitions,shardIndex:e.shardIndex??1,shardCount:e.shardCount??1,sortKey:J=>J.relativeFilePath}),g=new Set;n.testDefinitions.forEach(J=>{J.labels?.forEach(te=>g.add(te))});let h=s.child({orgId:c,runGroupId:l,branch:u.gitBranchName}),f=await Kd.start({logger:h,orgId:c,runGroupId:l,outputDir:d,client:a,gitMetadata:u,labels:Array.from(g)}),b=[],T=new Date,C=new Set,x=async()=>Cj({runResults:b,startTime:T,ranTests:C,apiClient:a,uploadResults:e.uploadResults??!1,outputDir:d}),w=async J=>{R.warn(`${J} Stopping tests and printing latest results.`),await f.finish({logger:h,status:"CANCELLED"}),await x(),await An(),process.exit(1)},O=async()=>{await w("SIGINT received.")};process.once("SIGINT",O);let v;if(e.timeoutMinutes!==void 0&&e.timeoutMinutes>0){let J=e.timeoutMinutes*60*1e3;v=setTimeout(()=>{w(`Timeout of ${e.timeoutMinutes} minute(s) reached.`)},J)}let M={};for(let J=0;J<m.length;J++){let te=Object.values(M);te.length===p&&await Promise.race(te.map(H=>H.promise));let Et=m[J],Y=`test-${J}`;M[Y]={done:!1,promise:(async({testDefinition:H})=>{C.add(Y);let ce=H.relativeFilePath.includes("..")?H.fullFilePath:H.relativeFilePath;ys({status:"START",testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length});let ge=setInterval(()=>ys({status:"RUN",testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length}),5*60*1e3),Je=Rj(),xe=h.child({testId:H.id,runId:Je}),Kt=new Nu({logger:xe,reporter:new yd(a),runType:"mobile-test-run",runId:Je,testMetadata:H,suiteMetadata:void 0});try{let Ot=await lI({metadata:{...o,runId:Je},fixtures:{...t,tracer:f,logger:xe,usageTracker:Kt},inputs:{...n,project:i,testDefinition:H,channel:n.channel??H.settings?.defaultChannel,tag:n.tag??H.settings?.defaultTag,logUpdate:(Fe,lt)=>ys({status:Fe,testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length,additionalText:lt})},options:e});ys({status:Ot.status,testLogRef:ce,getRunningTestsCount:()=>C.size,getTotalTestsCount:()=>m.length}),b.push(Ot)}catch(Ot){let Fe=`Encountered unexpected fatal error when running test '${H.name}': ${Ot.message}
4419
+ ${Ot.stack}`;R.error(Fe),xe.error({err:Ot},`Encountered unexpected fatal error when running test ${H.name}`),await w("Fatal error occurred.")}finally{clearInterval(ge),M[Y].done=!0,delete M[Y]}await Kt.flush(s)})({testDefinition:Et})}}await Promise.allSettled(Object.values(M).map(J=>J.promise)),v&&clearTimeout(v);let V=b.some(J=>J.status==="FAILED"&&!J.quarantined)?"FAILED":"PASSED";return await f.finish({logger:h,status:V}),process.off("SIGINT",O),e.reporter&&e.reporterDir&&await cI({logger:h,callbacks:{createDebugDataReaderForRunAttempt:(J,te)=>new kd(d,J,te)},format:e.reporter,params:{projectConfigPath:i.configFilePath,suiteName:i.config.name,startedAt:T,finishedAt:new Date,testsToSkip:[],quarantinedTestsToSkip:[],quarantinedTestReasons:{}},runs:b,folder:e.reporterDir}),x()}async function Cj({runResults:r,startTime:e,apiClient:t,uploadResults:n,outputDir:o}){let i=t.getAppUrl(),a=IT({results:r,startTime:e.getTime(),onFailed:s=>{},getDisplayLine:s=>{let c=`${_m}- ${s.filePath}`;return s.runId&&(c+=` ( link when uploaded: ${i}/runs/${s.runId} )`),c},entity:"mobile test"});return R.log(""),n?(R.success(`Test results have been saved to the folder ${o}. Uploading to Momentic Cloud...`),await Dd({client:t,consoleLogger:R,resultsPath:o})):R.success(`Test results have been saved to the folder ${o}. Upload them to Momentic Cloud by running 'npx momentic-mobile results upload ${o}'.`),a}async function Df(){ow(),NT("Chromium")||(_o?(await vc("The Chromium browser is not installed but is required for automating webviews. Install it now?")||process.exit(1),await Rc({rawBrowsers:["chromium"],force:!1,all:!1})):(R.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)))}VR({serviceName:"mobile-cli"});pr.setApp("mobile-cli");var Rn=new xj;Rn.name("momentic-mobile").description("Momentic Mobile CLI").version(bl);var Pj=Rn.command("assets").description("Manage mobile testing assets");Pj.command("upload").description("Upload an asset for mobile tests").argument("<file>","Path to the asset file to upload").addOption(Sl).addOption(yl).addOption(Cf).addOption(Y_).action(async(r,e)=>{let{apiKey:t,server:n,tag:o,channel:i}=e,a=Xd.resolve(r);Yd.existsSync(a)||(R.error(`File not found: ${a}`),process.exit(1));let s=new Jt({baseUrl:n,apiKey:t,logger:R});/\.apk$/i.test(a)||(R.error(`File is not an APK file: ${a}`),process.exit(1)),await Tu({tag:o?.toLowerCase(),channel:i.toLowerCase(),filePath:a,apiClient:s,logger:R})});Rn.command("app").addOption(Sl).addOption(yl).addOption(vf).addOption($d).addOption(If).addOption(Af).addOption(Rf).addOption(wf).action(async r=>{let{apiKey:e,server:t,yes:n,disableCache:o,saveCache:i,regenerateCache:a}=r;Nm({disableCache:o,saveCache:i,regenerateCache:a});let s=Pm(r.logLevel);pr.setApp("mobile-desktop-server");let c=new Jt({baseUrl:t,apiKey:e,logger:pr});await $h({client:c,skipPrompts:n}),R.debug("API key check complete");let l=Ij(import.meta.url),u=Xd.dirname(l),d=Xd.resolve(u,"..","static");await Df(),R.debug({appiumHome:Ws},"Resolved resource paths");let p=await da({configFilePath:r.config}),m=q_;await $_({momenticServerUrl:t,serverPort:m,apiKey:e,staticDir:d,initialProject:p,driverLogLevel:s,logger:pr,regenerateCache:a??!1,noCache:o??!1,alwaysSaveCache:i??!1});let g=`http://localhost:${m}`;R.info(`Local app started on: ${g}`),await _j(g)});var pI=Rn.command("results").description("Merge and upload test results.");pI.command("merge").description("Merge test results files.").addOption(xf).addArgument(new Jd("<resultsPath>","Path to a directory that contains on or more test results archives.").argRequired()).action(async(r,e)=>{let{outputDir:t}=e;t||(R.error("Output directory is required."),process.exit(1)),Yd.existsSync(r)||(R.warn("Results path does not exist, skipping merge."),process.exit(0)),Yd.existsSync(t)&&R.warn(`Output directory ${t} already exists, removing before merging...`),b_(pr,t,r),await An(),process.exit(0)});var Oj=new Jd("<results>","Path to the results archive.").argRequired();pI.command("upload").description("Upload test results to Momentic cloud.").addOption(Sl).addOption(yl).addArgument(Oj).action(async(r,e)=>{let{apiKey:t,server:n}=e,o=pr,i=new Jt({baseUrl:n,apiKey:t,logger:o});await Dd({consoleLogger:R,resultsPath:r,client:i}),await An(),process.exit(0)});var Lj=Rn.command("list").description("List mobile test paths");Lj.addOption($d).addOption(Tf).addOption(Mf).addOption(_f).addOption(new kf("--labels <labels...>","Only run tests with the specified label(s).")).addArgument(new Jd("[tests...]","One or more test file path or folders that exist on the local machine.").argOptional()).action(async(r,e)=>{let t=await da({configFilePath:e.config,nameFilter:e.filter}),n=await Qt(t),o=await Ef({tests:r,momenticFiles:n,yes:!0,include:e.include,exclude:e.exclude,project:t,labels:e.labels,logger:R,quarantinedTestReasons:{}});R.info(o.map(i=>i.relativeFilePath).join(`
4420
+ `)),process.exit(0)});var Nj=Rn.command("run").alias("test").description("Run tests on the local machine");Nj.addOption(Sl).addOption(yl).addOption($d).addOption(Tf).addOption(Mf).addOption(_f).addOption(vf).addOption(Z_).addOption(If).addOption(tI).addOption(eI).addOption(Af).addOption(Rf).addOption(wf).addOption(xf).addOption(rI).addOption(iI).addOption(aI).addOption(nI).addOption(oI).addOption(new kf("--labels <labels...>","Only run tests with the specified label(s).")).addOption(Cf).addOption(K_).addOption(X_).addOption(J_).addOption(Q_).addArgument(new Jd("<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,reporter:s,reporterDir:c,disableCache:l,saveCache:u,regenerateCache:d}=e,p=Pm(e.logLevel);await Df(),R.debug({appiumHome:Ws},"Resolved resource paths"),Nm({disableCache:l,saveCache:u,regenerateCache:d}),DT({shardIndex:e.shardIndex,shardCount:e.shardCount});let m=await da({configFilePath:e.config,nameFilter:e.filter}),g=a??m.config.outputDir??i_,h=e.parallel??m.config.parallel??1;R.debug("Checking API key and dependencies");let f=new Jt({baseUrl:n,apiKey:t,logger:R}),{orgId:b,userId:T}=await $h({client:f,skipPrompts:e.yes});R.debug("API key check and browser installation complete");let C=Mj(),x=pr.child({runGroupId:C,orgId:b,userId:T}),w=await pa(pr,f,m);x.debug(w,"Got local git metadata");let O=await uI(x,f,e.ignoreQuarantine),v=await Qt(m),M=await Ef({tests:r,yes:e.yes,project:m,momenticFiles:v,include:e.include,exclude:e.exclude,labels:e.labels,logger:R,quarantinedTestReasons:O});try{let k=await dI({options:{...e,parallel:h,outputDir:g,alwaysSaveCache:u??!1,regenerateCache:d??!1,noCache:l??!1,logLevel:p,timeoutMinutes:e.timeoutMinutes,shardIndex:e.shardIndex,shardCount:e.shardCount,reporter:s,reporterDir:c,labels:e.labels},fixtures:{logger:x,project:m,apiClient:f},inputs:{envOverride:e.env,tag:o,channel:i,testDefinitions:M},metadata:{gitMetadata:w,runGroupId:C,orgId:b}});await An(),k.failed>0?process.exit(1):process.exit(0)}catch(k){R.error("Failed to run tests locally. Please check the error message below or run with the --verbose flag."),R.error(k),pr.error({err:k},"Failed to run tests locally"),await An(),process.exit(1)}});Rn.command("init").description("Initialize an empty Momentic project in the current working directory").addOption(new kf("--name <name>","Name of the project")).action(async r=>{R.info(`Welcome to the Momentic Mobile project setup wizard! \u{1F680}
4421
4421
  `),R.info("This wizard will help you bootstrap a new Momentic project."),Yd.existsSync(ua)&&(R.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 RT("Choose an identifier for your project, such as a service, product, or team name (default: 'app'):","app"),include:Md};Id(t,ua),R.success(`Initialized Momentic project file at ${Xd.resolve(ua)}`)});Rn.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: ${Om.join(", ")}.`).action(async(r,e)=>{!e.all&&r.length===0&&(R.error("No browsers specified"),process.exit(1)),await Rc({rawBrowsers:r,force:e.force,all:e.all})});async function Dj(){try{await Rn.parseAsync(process.argv),await An()}catch(r){pr.error({err:r},"Uncaught error in CLI"),R.error(r),await An(),process.exit(1)}}Dj();
4422
4422
  //# sourceMappingURL=cli.js.map